{"record":{"id":"d484a4ae6745e926","repo":"openclaw/openclaw","slug":"codex-session-is-active-on-the-paired-node-wait-f","errorCode":null,"errorMessage":"Codex session is active on the paired node; wait for it to finish before continuing","messagePattern":"Codex session is active on the paired node; wait for it to finish before continuing","errorType":"validation","errorClass":"CatalogParamsError","httpStatus":null,"severity":"error","filePath":"extensions/codex/src/session-catalog-node-continue.ts","lineNumber":226,"sourceCode":"    cursor = nextCursor;\n  }\n  throw new CatalogParamsError(\"Codex session is unavailable on the paired node\");\n}\n\nfunction requireContinuableNodeRecord(record: CodexSessionCatalogSession): void {\n  if (record.archived) {\n    throw new CatalogParamsError(\"Codex session is archived on the paired node\");\n  }\n  if (!isInteractiveThreadSource(record.source)) {\n    throw new CatalogParamsError(\"Codex session is not a non-archived interactive Codex session\");\n  }\n  if (record.status === \"idle\" || record.status === \"notLoaded\") {\n    // The node App Server is a passive catalog reader, so stored native Codex\n    // sessions normally report notLoaded. Node resume serializes OpenClaw turns.\n    return;\n  }\n  if (record.status === \"active\") {\n    throw new CatalogParamsError(\n      \"Codex session is active on the paired node; wait for it to finish before continuing\",\n    );\n  }\n  throw new CatalogParamsError(\"Codex session cannot be continued in its current state\");\n}\n\nasync function readNodeCodexHistory(params: {\n  runtime: PluginRuntime;\n  nodeId: string;\n  record: CodexSessionCatalogSession;\n}): Promise<CodexNodeHistory> {\n  const raw = await params.runtime.nodes.invoke({\n    nodeId: params.nodeId,\n    command: CODEX_APP_SERVER_THREAD_TURNS_LIST_COMMAND,\n    params: {\n      threadId: params.record.threadId,\n      limit: MAX_TRANSCRIPT_PAGE_LIMIT,\n    },","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/openclaw/openclaw/blob/01804a75319da4b69c9ab98ceaa30477e22b8c0b/extensions/codex/src/session-catalog-node-continue.ts#L208-L244","documentation":"Thrown as CatalogParamsError by requireContinuableNodeRecord in session-catalog-node-continue.ts:226 when record.status === 'active', meaning the Codex session on the node is currently running a turn. Continuing would collide with the in-flight execution, so the guard rejects it.","triggerScenarios":"The target thread is mid-turn on the node (a Codex turn is actively streaming/executing). Triggered when two clients or a UI race tries to continue the same active session, or the previous turn has not reached a terminal state.","commonSituations":"Another tab/client is running the session on the node; a long-running turn is still executing; the node's status refresh lags and reports active after completion.","solutions":["Wait for the in-flight turn on the node to finish (status returns to idle) and retry.","Confirm no other client is driving the session on the node; close duplicate continuations.","If the status is stale, refresh the catalog so the node reports the current status.","As a last resort, interrupt the active turn on the node (via the node's own controls) before continuing."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Check status before continuing; only idle/notLoaded are continuable immediately.\nif (record.status === 'active') {\n  throw new Error('Session is active on the node; wait for the current turn to finish.');\n}","typeGuard":"function isActivelyRunning(status: unknown): boolean {\n  return status === 'active';\n}","tryCatchPattern":null,"preventionTips":["Refresh the catalog before continuing so status is current.","Ensure no other client is driving the same session on the node.","Wait for the in-flight turn to reach a terminal state, then retry.","Only interrupt the active turn via the node's own controls as a last resort."],"tags":["codex","session-catalog","active-session","concurrency","validation"],"backgroundTag":null,"analyzedSha":"01804a75319da4b69c9ab98ceaa30477e22b8c0b","analyzedAt":"2026-08-12T04:37:58.197Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}