{"record":{"id":"8eba1e9eef60a1ef","repo":"openclaw/openclaw","slug":"node-formatnodelabel-listing-node-does-not-exp","errorCode":null,"errorMessage":"Node ${formatNodeLabel(listing.node)} does not expose ${CODEX_CLI_SESSION_RESUME_COMMAND}.","messagePattern":"Node (.+?) does not expose (.+?)\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"extensions/codex/src/node-cli-sessions.ts","lineNumber":140,"sourceCode":"    timeoutMs: 15_000,\n    scopes: [\"operator.write\"],\n  });\n  return { node, result: parseCodexCliSessionsListResult(raw) };\n}\n\nexport async function resolveCodexCliSessionForBindingOnNode(params: {\n  runtime: PluginRuntime;\n  requestedNode: string;\n  sessionId: string;\n}): Promise<{ node: CodexCliSessionNodeInfo; session?: CodexCliSessionSummary }> {\n  const listing = await listCodexCliSessionsOnNode({\n    runtime: params.runtime,\n    requestedNode: params.requestedNode,\n    filter: params.sessionId,\n    limit: MAX_SESSION_LIMIT,\n  });\n  if (!listing.node.commands?.includes(CODEX_CLI_SESSION_RESUME_COMMAND)) {\n    throw new Error(\n      `Node ${formatNodeLabel(listing.node)} does not expose ${CODEX_CLI_SESSION_RESUME_COMMAND}.`,\n    );\n  }\n  return {\n    node: listing.node,\n    session: listing.result.sessions.find((session) => session.sessionId === params.sessionId),\n  };\n}\n\nexport async function resumeCodexCliSessionOnNode(params: {\n  runtime: PluginRuntime;\n  nodeId: string;\n  sessionId: string;\n  prompt: string;\n  cwd?: string;\n  timeoutMs?: number;\n}): Promise<CodexCliSessionResumeResult> {\n  const raw = await params.runtime.nodes.invoke({","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/openclaw/openclaw/blob/01804a75319da4b69c9ab98ceaa30477e22b8c0b/extensions/codex/src/node-cli-sessions.ts#L122-L158","documentation":"resolveCodexCliSessionForBindingOnNode resolved a node for the session query, but that node's commands array does not include CODEX_CLI_SESSION_RESUME_COMMAND ('codex.cli.session.resume'). The node was selected/connected but does not advertise the resume capability, so resume cannot be dispatched to it.","triggerScenarios":"Calling resolveCodexCliSessionForBindingOnNode with a requestedNode that connects but does not register codex.cli.session.resume in its host commands; or the auto-selected node lacks the command. The check at node-cli-sessions.ts:140 reads listing.node.commands?.includes(...).","commonSituations":"A node runs an older plugin/build that did not expose the resume command; the Codex CLI plugin is partially installed on that node; the node was selected for a different capability and happens to lack resume.","solutions":["Verify the target node runs a plugin build that registers codex.cli.session.resume in its node commands.","Reinstall/refresh the Codex plugin on that node so its host-command advertisement includes the resume command.","Target a different node that advertises the resume command (pass --host <node-id> that exposes it).","Check node.commands via nodes.list() before calling resume to pick a capable node."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const node = await resolveCodexCliSessionNode({ runtime, requestedNode, command: CODEX_CLI_SESSION_RESUME_COMMAND });\nif (!node.commands?.includes(CODEX_CLI_SESSION_RESUME_COMMAND)) {\n  // pick a different node or install the resume command on this one\n}","typeGuard":"function nodeSupportsResume(node: { commands?: string[] }): boolean {\n  return Array.isArray(node.commands) && node.commands.includes('codex.cli.session.resume');\n}","tryCatchPattern":null,"preventionTips":["Pre-filter nodes.list() to those whose commands include the resume command before resolving a binding.","Keep the Codex plugin version aligned across nodes so they all advertise resume.","Run doctor/install on nodes missing the command."],"tags":["codex","cli-sessions","node-capability","resume"],"backgroundTag":null,"analyzedSha":"01804a75319da4b69c9ab98ceaa30477e22b8c0b","analyzedAt":"2026-08-12T04:37:58.197Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}