What problem does this solve?
Claude Code sessions living on paired nodes appear in the native sidebar (session catalog) but are view-only: continueClaudeSession rejects non-gateway:local hosts. Investigation confirmed nothing today can run an agent turn on a node — execHost/execNode only routes individual bash-tool calls through node.invoke system.run (request/response, captured output); the agent-run pipeline has no node placement branch, nodes advertise no agent-run command, and node.invoke has no streaming.
Proposed change (v1)
Make claude-cli catalog rows on opted-in paired nodes continuable, keeping inference and session files on the node (vendor CLI, node's own auth):
- Streaming node invoke — additive
node.invoke.progress events (seq-ordered chunks) with idle+hard timeouts; non-streaming invokes unchanged.
- Node command
agent.cli.claude.run.v1 (TS node host) — spawns the node-resolved claude binary with allowlist-validated args, streams stdout, opt-in via node-local config plus the existing exec approval policy. Mac-app (Swift) nodes simply don't advertise it until the app ships support.
- cli-runner placement branch — sessions with
execHost=node + claude-cli backend run each turn through the streaming invoke, feeding the existing JSONL parser (session-id capture, fork markers unchanged). One-shot -p runs only; warm stdio, gateway-loopback MCP, reseed, and attachments disabled for node runs in v1.
- Catalog wiring — node rows advertise
canContinue when the node exposes the command; adoption binds execNode/execCwd; history import via the existing node read commands.
Out of scope (follow-ups)
macOS-app (Swift) node support; warm stdio on nodes; MCP loopback over the node transport; codex app-server on nodes.
What problem does this solve?
Claude Code sessions living on paired nodes appear in the native sidebar (session catalog) but are view-only:
continueClaudeSessionrejects non-gateway:localhosts. Investigation confirmed nothing today can run an agent turn on a node —execHost/execNodeonly routes individual bash-tool calls throughnode.invoke system.run(request/response, captured output); the agent-run pipeline has no node placement branch, nodes advertise no agent-run command, andnode.invokehas no streaming.Proposed change (v1)
Make
claude-clicatalog rows on opted-in paired nodes continuable, keeping inference and session files on the node (vendor CLI, node's own auth):node.invoke.progressevents (seq-ordered chunks) with idle+hard timeouts; non-streaming invokes unchanged.agent.cli.claude.run.v1(TS node host) — spawns the node-resolvedclaudebinary with allowlist-validated args, streams stdout, opt-in via node-local config plus the existing exec approval policy. Mac-app (Swift) nodes simply don't advertise it until the app ships support.execHost=node+ claude-cli backend run each turn through the streaming invoke, feeding the existing JSONL parser (session-id capture, fork markers unchanged). One-shot-pruns only; warm stdio, gateway-loopback MCP, reseed, and attachments disabled for node runs in v1.canContinuewhen the node exposes the command; adoption bindsexecNode/execCwd; history import via the existing node read commands.Out of scope (follow-ups)
macOS-app (Swift) node support; warm stdio on nodes; MCP loopback over the node transport; codex app-server on nodes.