Devolutions/UniGetUI · error · InvalidOperationException

No tracked operation with id "{operationId}" was found.

Error message

No tracked operation with id "{operationId}" was found.

What it means

Thrown inside IpcClient.WaitForOperationAsync when GetOperationAsync(operationId) returns null. A null return means the server reported no operation with that id (HTTP 404 or empty body deserialized to null), so the id was never tracked or has already been evicted from the operation registry.

Source

Thrown at src/UniGetUI.Interface.IpcApi/IpcClient.cs:173

            {
                OperationId = operationId,
            };
    }

    public async Task<IpcOperationDetails> WaitForOperationAsync(
        string operationId,
        int timeoutSeconds = 300,
        int delayMilliseconds = 1000
    )
    {
        timeoutSeconds = Math.Clamp(timeoutSeconds, 1, 3600);
        delayMilliseconds = Math.Clamp(delayMilliseconds, 100, 10000);

        DateTime deadline = DateTime.UtcNow.AddSeconds(timeoutSeconds);
        while (true)
        {
            var operation = await GetOperationAsync(operationId)
                ?? throw new InvalidOperationException(
                    $"No tracked operation with id \"{operationId}\" was found."
                );

            if (
                operation.Status is "succeeded" or "failed" or "canceled"
            )
            {
                return operation;
            }

            if (DateTime.UtcNow >= deadline)
            {
                throw new InvalidOperationException(
                    $"Timed out while waiting for operation {operationId}."
                );
            }

            await Task.Delay(delayMilliseconds);

View on GitHub (pinned to 9b1d7d0eab)

Solutions

  1. Verify the operation id character-for-character against what the submit endpoint returned.
  2. Re-submit the operation to get a fresh id if UniGetUI was restarted (the in-memory registry does not persist).
  3. Use GetOperationAsync once first to confirm existence before entering the wait loop.
  4. Catch InvalidOperationException around WaitForOperationAsync and treat 'No tracked operation' as a not-found condition.
Defensive patterns

Strategy: try-catch

Validate before calling

// Probe before waiting:
var existing = await client.GetOperationAsync(operationId);
if (existing is null) { /* id unknown: do not call WaitForOperationAsync */ }

Try / catch

IpcOperationDetails result;
try { result = await client.WaitForOperationAsync(operationId); }
catch (InvalidOperationException ex) when (ex.Message.Contains("No tracked operation"))
{ /* operation id is stale/unknown: resubmit or report not-found */ return; }

Prevention

When it happens

Trigger: Calling WaitForOperationAsync with an id the server does not know: a typo, an id from a previous (restarted) UniGetUI session whose in-memory operation store was cleared, or an id for an operation that completed and was garbage-collected past the retention window.

Common situations: Storing an operation id across a UniGetUI restart. Copying an id by hand and mistyping it. Polling an old id long after it finished and the registry evicted it. Race: requesting output before the server registered the operation.

Related errors


AI-assisted analysis of Devolutions/UniGetUI@9b1d7d0eab (2026-08-13). Data as JSON: /api/errors/86371c527bc1532f. Report an issue: GitHub.