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
- Verify the operation id character-for-character against what the submit endpoint returned.
- Re-submit the operation to get a fresh id if UniGetUI was restarted (the in-memory registry does not persist).
- Use GetOperationAsync once first to confirm existence before entering the wait loop.
- 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
- Do not persist operation ids across UniGetUI restarts; the registry is in-memory.
- Probe with GetOperationAsync first when the id may be stale.
- Distinguish 'not found' from 'timed out' by message when catching.
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
- Timed out while waiting for operation {operationId}.
- string.IsNullOrWhiteSpace(content) ? response.ReasonPhrase :
- The Unix socket path is not available for the named-pipe tra
- The IPC API token is not available. Start UniGetUI and try a
- tailLines must be greater than or equal to zero.
AI-assisted analysis of Devolutions/UniGetUI@9b1d7d0eab (2026-08-13).
Data as JSON: /api/errors/86371c527bc1532f.
Report an issue: GitHub.