openclaw/openclaw · error
Node ${formatNodeLabel(listing.node)} does not expose ${CODE
Error message
Node ${formatNodeLabel(listing.node)} does not expose ${CODEX_CLI_SESSION_RESUME_COMMAND}. What it means
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.
Source
Thrown at extensions/codex/src/node-cli-sessions.ts:140
timeoutMs: 15_000,
scopes: ["operator.write"],
});
return { node, result: parseCodexCliSessionsListResult(raw) };
}
export async function resolveCodexCliSessionForBindingOnNode(params: {
runtime: PluginRuntime;
requestedNode: string;
sessionId: string;
}): Promise<{ node: CodexCliSessionNodeInfo; session?: CodexCliSessionSummary }> {
const listing = await listCodexCliSessionsOnNode({
runtime: params.runtime,
requestedNode: params.requestedNode,
filter: params.sessionId,
limit: MAX_SESSION_LIMIT,
});
if (!listing.node.commands?.includes(CODEX_CLI_SESSION_RESUME_COMMAND)) {
throw new Error(
`Node ${formatNodeLabel(listing.node)} does not expose ${CODEX_CLI_SESSION_RESUME_COMMAND}.`,
);
}
return {
node: listing.node,
session: listing.result.sessions.find((session) => session.sessionId === params.sessionId),
};
}
export async function resumeCodexCliSessionOnNode(params: {
runtime: PluginRuntime;
nodeId: string;
sessionId: string;
prompt: string;
cwd?: string;
timeoutMs?: number;
}): Promise<CodexCliSessionResumeResult> {
const raw = await params.runtime.nodes.invoke({View on GitHub (pinned to 01804a7531)
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.
Defensive patterns
Strategy: validation
Validate before calling
const node = await resolveCodexCliSessionNode({ runtime, requestedNode, command: CODEX_CLI_SESSION_RESUME_COMMAND });
if (!node.commands?.includes(CODEX_CLI_SESSION_RESUME_COMMAND)) {
// pick a different node or install the resume command on this one
} Type guard
function nodeSupportsResume(node: { commands?: string[] }): boolean {
return Array.isArray(node.commands) && node.commands.includes('codex.cli.session.resume');
} Prevention
- 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.
When it happens
Trigger: 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(...).
Common situations: 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.
Related errors
- Codex CLI resume returned an invalid payload.
- Missing or invalid Codex CLI session id.
- Missing Codex CLI prompt.
- Codex CLI session ${sessionId} already has an active resume
- codex exec resume timed out after ${String(params.timeoutMs)
AI-assisted analysis of openclaw/openclaw@01804a7531 (2026-08-12).
Data as JSON: /api/errors/8eba1e9eef60a1ef.
Report an issue: GitHub.