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

  1. Verify the target node runs a plugin build that registers codex.cli.session.resume in its node commands.
  2. Reinstall/refresh the Codex plugin on that node so its host-command advertisement includes the resume command.
  3. Target a different node that advertises the resume command (pass --host <node-id> that exposes it).
  4. 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

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


AI-assisted analysis of openclaw/openclaw@01804a7531 (2026-08-12). Data as JSON: /api/errors/8eba1e9eef60a1ef. Report an issue: GitHub.