export declare const RUNPANE_CONTRACT: { readonly $schema: "./schema.json"; readonly schemaVersion: 1; readonly name: "runpane"; readonly description: "Thin installer and local control CLI for Pane"; readonly packageInstallPolicy: readonly ["The packages must not download, install, or configure Pane during package installation.", "Work starts only when a user runs `runpane ...`."]; readonly compatibility: { readonly node: "^22.23.4 || ^24.22.1 || ^26.12.1"; readonly python: ">=3.8"; }; readonly terminology: { readonly repo: "Saved Pane repository/project record"; readonly pane: "User-visible Pane session"; readonly tool: "Terminal-backed tab"; readonly agent: "Built-in agent command template"; }; readonly defaults: { readonly target: "client"; readonly paneVersion: "latest"; readonly channel: "stable"; readonly format: "auto"; readonly dryRun: false; readonly yes: false; readonly verbose: false; readonly watch: { readonly follow: { readonly summary: "What `runpane watch --follow` does with no other flags: quiet, batched updates and expiry after 3 hours with nothing happening. Individual duration flags override the defaults."; readonly kinds: readonly ["agent.report", "agent.ready", "agent.blocked", "agent.idle", "panel.exited", "panel.stopped", "pane.gone", "pane.associated", "pane.detached", "pr.conflicted", "pr.checks", "pr.merged", "pr.closed", "pr.head", "pr.base_changed", "pr.base_deleted", "pr.review", "pr.comment", "pr.stopped", "github.unavailable", "github.recovered"]; readonly readySettle: "3m"; readonly blockedSettle: "30s"; readonly minInterval: "10m"; readonly idleAfter: "10m"; readonly idleBackoff: true; readonly expireAfter: "3h"; readonly heartbeat: "off"; readonly includeShells: false; readonly heldInputDetection: true; }; readonly untilEvent: { readonly summary: "What `runpane watch --until-event` does with no other flags: waits for the first event worth waking an agent for, prints it immediately without follow settling or batching, and exits 0."; readonly kinds: readonly ["agent.report", "agent.blocked", "panel.exited", "pane.gone"]; }; }; }; readonly enums: { readonly installTargets: readonly ["client", "daemon"]; readonly artifactFormats: readonly ["auto", "appimage", "deb", "dmg", "zip", "exe"]; readonly channels: readonly ["stable", "nightly"]; readonly agents: readonly ["codex", "claude", "cursor", "opencode"]; }; readonly agentTemplates: { readonly codex: { readonly title: "Codex"; readonly command: "codex --yolo"; readonly description: "Open a Codex terminal tab and allow the initial input to drive the agent."; }; readonly claude: { readonly title: "Claude Code"; readonly command: "claude --dangerously-skip-permissions"; readonly description: "Open a Claude Code terminal tab and allow the initial input to drive the agent."; }; readonly cursor: { readonly title: "Cursor"; readonly command: "cursor-agent --force --trust"; readonly description: "Open a Cursor Agent terminal tab and allow the initial input to drive the agent."; }; readonly opencode: { readonly title: "OpenCode"; readonly command: "opencode --auto"; readonly description: "Open an OpenCode terminal tab and allow the initial input to drive the agent."; }; }; readonly terminalKeys: { readonly enter: "\r"; readonly escape: "\u001B"; readonly tab: "\t"; readonly backspace: ""; readonly space: " "; readonly up: "\u001B[A"; readonly down: "\u001B[B"; readonly right: "\u001B[C"; readonly left: "\u001B[D"; readonly "ctrl-c": "\u0003"; readonly "ctrl-d": "\u0004"; }; readonly commands: readonly [{ readonly name: "help"; readonly summary: "Show help for runpane or a specific command."; readonly usage: readonly ["runpane help [command]"]; readonly localControl: false; }, { readonly name: "setup"; readonly summary: "Open the guided setup wizard for install, remote host setup, update, and diagnostics."; readonly usage: readonly ["runpane setup"]; readonly interactiveEntrypoint: true; readonly localControl: false; }, { readonly name: "install"; readonly summary: "Install Pane on this machine or configure this machine as a remote daemon host."; readonly usage: readonly ["runpane install [client|daemon] [options]"]; readonly defaultTarget: "client"; readonly targets: readonly ["client", "daemon"]; readonly unknownDaemonFlagsForwarded: true; readonly localControl: false; }, { readonly name: "update"; readonly summary: "Update both Pane and the invoked supported CLI through an independent helper."; readonly usage: readonly [" runpane update [--pane-only | --cli-only] [--version ] [--pane-dir ] [--dry-run] [--wait] [--json]", " runpane update --status [--wait] [--pane-dir ] [--json]"]; readonly target: "client"; readonly localControl: false; }, { readonly name: "version"; readonly summary: "Print the runpane wrapper version without contacting, launching, or focusing Pane."; readonly usage: readonly ["runpane version [--pane-dir ]", "runpane --version"]; readonly localControl: false; }, { readonly name: "doctor"; readonly summary: "Run platform, release, installed Pane, daemon reachability, and remote setup diagnostics."; readonly openWorld: true; readonly usage: readonly ["runpane doctor [--json] [--pane-dir ] [--pane-path ] [--format ] [--verbose]", "runpane doctor --report [--title ] --body-file [--yes] [--json]"]; readonly toolsets: readonly ["core", "admin"]; readonly jsonSchemas: readonly ["doctorResult"]; readonly localControl: true; }, { readonly name: "daemon repair"; readonly summary: "Repair and restart the managed remote-daemon launcher without changing pairing or tunnel configuration."; readonly usage: readonly ["runpane daemon repair [--pane-dir ] [--pane-path ] [--yes] [--json]"]; readonly mutates: true; readonly toolsets: readonly ["admin"]; readonly jsonSchemas: readonly ["daemonRepairResult"]; readonly localControl: true; }, { readonly name: "agents doctor"; readonly summary: "Diagnose whether a built-in agent command is available in a Pane repository environment."; readonly usage: readonly ["runpane agents doctor --agent [--repo ] [--json] [--pane-dir ]"]; readonly toolsets: readonly ["admin"]; readonly jsonSchemas: readonly ["agentDoctorResult"]; readonly localControl: true; }, { readonly name: "agent-context"; readonly summary: "Print token-efficient Pane command context for coding agents."; readonly usage: readonly ["runpane agent-context [--json]", "runpane agent-context --command [--json]"]; readonly toolsets: readonly ["admin", "docs"]; readonly jsonSchemas: readonly ["agentContextBriefResult", "agentContextCommandResult"]; readonly localControl: false; }, { readonly name: "mcp"; readonly summary: "Run the Pane MCP server over stdio so coding agents can call runpane commands as tools."; readonly usage: readonly ["runpane mcp [--toolsets ] [--read-only]"]; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "repos list"; readonly summary: "List repositories saved in the running Pane app."; readonly usage: readonly ["runpane repos list [--json] [--pane-dir ]"]; readonly toolsets: readonly ["core", "repos"]; readonly jsonSchemas: readonly ["repoListResult"]; readonly localControl: true; }, { readonly name: "repos add"; readonly summary: "Register an existing git repository with the running Pane app."; readonly usage: readonly ["runpane repos add --path [--name ] [--json] [--yes] [--pane-dir ]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["core", "repos"]; readonly jsonSchemas: readonly ["repoAddRequest", "repoAddResult"]; readonly localControl: true; }, { readonly name: "panes list"; readonly summary: "List Pane sessions in a saved repository."; readonly usage: readonly ["runpane panes list [--repo ] [--json] [--pane-dir ]"]; readonly toolsets: readonly ["core", "panes"]; readonly jsonSchemas: readonly ["paneListResult"]; readonly localControl: true; }, { readonly name: "panes cost"; readonly summary: "Report estimated token cost per Pane, with per-model breakdown and cache efficiency."; readonly usage: readonly ["runpane panes cost [--repo ] [--pane ] [--json] [--pane-dir ]"]; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["paneCostRequest", "paneCostResult"]; readonly localControl: true; }, { readonly name: "workspace state"; readonly summary: "Read one workspace snapshot of every Pane and CLI panel."; readonly usage: readonly ["runpane workspace state [--repo ] [--json] [--pane-dir ]"]; readonly toolsets: readonly ["core", "agents"]; readonly jsonSchemas: readonly ["workspaceStateResult"]; readonly localControl: true; }, { readonly name: "workspace list"; readonly summary: "List the machines on your tailnet, each with its owner, and whether each answers workspaces."; readonly usage: readonly ["runpane workspace list [--json] [--pane-dir ]"]; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "workspace enable"; readonly summary: "Put this machine's Pane on your tailnet for runpane workspace (the default when Tailscale is signed in)."; readonly usage: readonly ["runpane workspace enable [--json] [--pane-dir ]"]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "workspace disable"; readonly summary: "Take this machine off runpane workspace and remove its tailscale serve handler on port 8443."; readonly usage: readonly ["runpane workspace disable [--json] [--pane-dir ]"]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "workspace read"; readonly summary: "Print a file from a machine on your tailnet; any path form works (C:\\..., /mnt/c/..., /home/..., ~/...)."; readonly usage: readonly ["runpane workspace [] read [--json]"]; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "workspace write"; readonly summary: "Write stdin to a file on a machine on your tailnet, creating parent folders."; readonly usage: readonly ["runpane workspace [] write [--json]"]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "workspace exec"; readonly summary: "Run a command in another machine's shell and return stdout, stderr, the exit code, OS, and shell."; readonly usage: readonly ["runpane workspace exec [--cwd ] [--timeout-ms ] [--json] -- "]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "handoff"; readonly summary: "Hand your task to another agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. A same-agent handoff from a Pane tab carries and resumes your own session (a fork on this machine) and checks it continued; otherwise a fresh agent starts with the note. From a Session's terminal, create the Session on another machine instead."; readonly usage: readonly ["runpane handoff --template", "runpane handoff \"\" --note-file [--machine ] [--agent ] [--model ] [--effort ] [--repo ] [--push] [--note-only] [--dry-run] [--json]"]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly localControl: true; }, { readonly name: "watch"; readonly summary: "Wait for workspace agent and Pane transitions using a daemon-held cursor."; readonly usage: readonly ["runpane watch [--follow|--until-event] [--session |--pane ] [--json] [overrides]"]; readonly toolsets: readonly ["agents"]; readonly jsonSchemas: readonly ["workspaceWaitRequest", "workspaceWaitResult"]; readonly localControl: true; }, { readonly name: "panes create"; readonly summary: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create a Pane (a new worktree) only when the work's branch has no Pane yet; for review, audit, fix or QA on existing work use `panels create --pane `."; readonly usage: readonly ["runpane panes create --repo --name --agent [--source user|agent] [--focus|--no-focus] [--base ] [--branch ] [--prompt-file ] [--expect-report|--no-expect-report] [--wait [--timeout ]] [options] [--pane-dir ]", "runpane panes create --repo --name --tool-command [--agent ] [--source user|agent] [--focus|--no-focus] [--base ] [--branch ] [--prompt-file ] [--expect-report|--no-expect-report] [--wait [--timeout ]] [options] [--pane-dir ]", "runpane panes create --from-json [--yes] [--json] [--pane-dir ]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["paneCreateRequest", "paneCreateResult", "dispatchWaitResult"]; readonly localControl: true; }, { readonly name: "panes adopt"; readonly summary: "Adopt an existing externally managed git worktree as a Pane without changing the worktree."; readonly usage: readonly ["runpane panes adopt --repo --path --name --agent [--resume ] [--folder ] [--launch [--prompt |--prompt-file ] [--wait-ready] [--ready-timeout-ms ]] [--no-pinned] [--no-associate] [--dry-run] [--yes] [--json] [--pane-dir ]", "runpane panes adopt --repo --path --name --tool-command [--agent ] [--folder ] [--launch [--prompt |--prompt-file ] [--wait-ready] [--ready-timeout-ms ]] [--no-pinned] [--no-associate] [--dry-run] [--yes] [--json] [--pane-dir ]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["paneCreateResult"]; readonly localControl: true; }, { readonly name: "panes archive"; readonly summary: "Archive a Pane (session) exactly like the UI Archive action, including safe removal of its Pane-managed git worktree, or archive every merged Pane in a Session."; readonly usage: readonly ["runpane panes archive --pane [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes [--json] [--pane-dir ]", "runpane panes archive --session --merged [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json] [--pane-dir ]"]; readonly mutates: true; readonly toolsets: readonly ["core", "panes"]; readonly jsonSchemas: readonly ["paneArchiveRequest", "paneArchiveBulkRequest", "paneArchiveResult", "paneArchiveBulkResult"]; readonly localControl: true; }, { readonly name: "panes pin"; readonly summary: "Declaratively pin a Pane; pinned is the Pane UI's favorite/pin star and repeated requests are idempotent."; readonly usage: readonly ["runpane panes pin --pane --yes [--dry-run] [--json] [--pane-dir ]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["panePinRequest", "panePinResult"]; readonly localControl: true; }, { readonly name: "panes unpin"; readonly summary: "Declaratively unpin a Pane; pinned is the Pane UI's favorite/pin star and repeated requests are idempotent."; readonly usage: readonly ["runpane panes unpin --pane --yes [--dry-run] [--json] [--pane-dir ]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["panePinRequest", "panePinResult"]; readonly localControl: true; }, { readonly name: "panes rename"; readonly summary: "Rename a Pane without changing its worktree, branch, panels, or focus."; readonly usage: readonly ["runpane panes rename --pane --name --yes [--dry-run] [--json] [--pane-dir ]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["paneRenameRequest", "paneRenameResult"]; readonly localControl: true; }, { readonly name: "panes focus"; readonly summary: "Raise the Pane window and select a Pane (and optionally one of its panels) on explicit user request."; readonly usage: readonly ["runpane panes focus --pane [--panel ] --source user|agent --yes [--json] [--pane-dir ]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["paneFocusRequest", "paneFocusResult"]; readonly localControl: true; }, { readonly name: "panels create"; readonly summary: "Open a new agent or terminal tab inside an existing Pane, sharing its worktree. The default for review, QA, fixes and any other agent on work that already has a Pane."; readonly usage: readonly ["runpane panels create --pane --agent [--source user|agent] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout ]] --yes [--json] [--pane-dir ]", "runpane panels create --pane --tool-command [--agent ] [--title ] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["core", "panels"]; readonly jsonSchemas: readonly ["panelCreateRequest", "panelCreateResult", "dispatchWaitResult"]; readonly localControl: true; }, { readonly name: "panels open"; readonly summary: "Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default."; readonly usage: readonly ["runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]"]; readonly mutates: true; readonly jsonSchemas: readonly ["panelOpenRequest", "panelOpenResult"]; readonly localControl: true; }, { readonly name: "panels list"; readonly summary: "List tool panels inside a Pane session."; readonly usage: readonly ["runpane panels list --pane <pane-id> [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelListResult"]; readonly localControl: true; }, { readonly name: "panels output"; readonly summary: "Read recent terminal output from a panel."; readonly usage: readonly ["runpane panels output --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelOutputResult"]; readonly localControl: true; }, { readonly name: "panels screen"; readonly summary: "Read a compact current-screen view from a terminal panel."; readonly usage: readonly ["runpane panels screen --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelScreenResult"]; readonly localControl: true; }, { readonly name: "panels input"; readonly summary: "Send input bytes to a terminal panel."; readonly usage: readonly ["runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) [--source user|agent] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly toolsets: readonly ["core", "panels"]; readonly jsonSchemas: readonly ["panelInputRequest", "panelInputResult"]; readonly localControl: true; }, { readonly name: "panels submit"; readonly summary: "Send and submit text to a terminal panel, including idle agent composers."; readonly usage: readonly ["runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--source user|agent] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelSubmitRequest", "panelSubmitResult", "dispatchWaitResult"]; readonly localControl: true; }, { readonly name: "panels submit-composer"; readonly summary: "Submit an agent composer using the panel-appropriate key sequence."; readonly usage: readonly ["runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelSubmitComposerRequest", "panelSubmitComposerResult"]; readonly localControl: true; }, { readonly name: "panels wait"; readonly summary: "Wait for a terminal panel to initialize, become ready/idle, or contain text."; readonly usage: readonly ["runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--contains <text>] [--timeout-ms <ms>] [--interval-ms <ms>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelWaitResult"]; readonly localControl: true; }, { readonly name: "panels resume"; readonly summary: "Restart a stopped terminal panel in place, resuming its agent's conversation."; readonly usage: readonly ["runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]", "runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["panels"]; readonly jsonSchemas: readonly ["panelResumeResult", "panelResumeManyResult"]; readonly localControl: true; }, { readonly name: "panels last-message"; readonly summary: "Read an agent's last reply from its transcript, without scraping the screen."; readonly usage: readonly ["runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["panels", "agents"]; readonly jsonSchemas: readonly ["panelLastMessageResult"]; readonly localControl: true; }, { readonly name: "panes git-status"; readonly summary: "Read the git status of a Pane worktree: uncommitted, unpushed, and behind-main counts."; readonly usage: readonly ["runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]"]; readonly daemonAction: { readonly channel: "sessions:get-git-status"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["core", "git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes commit"; readonly summary: "Stage all changes in a Pane worktree and commit them."; readonly usage: readonly ["runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly daemonAction: { readonly channel: "sessions:git-stage-and-commit"; readonly args: readonly ["--pane", "--message"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes push"; readonly summary: "Push a Pane branch to its remote."; readonly usage: readonly ["runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly openWorld: true; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "sessions:git-push"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes pull"; readonly summary: "Pull the remote branch into a Pane worktree."; readonly usage: readonly ["runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly openWorld: true; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:git-pull"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes rebase-main"; readonly summary: "Rebase a Pane branch onto the latest main branch."; readonly usage: readonly ["runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:rebase-main-into-worktree"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes restore"; readonly summary: "Restore an archived Pane, recreating its worktree."; readonly usage: readonly ["runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "sessions:restore"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["core", "panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes squash-rebase"; readonly summary: "Squash a Pane branch into one commit and rebase it onto main."; readonly usage: readonly ["runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:squash-and-rebase-to-main"; readonly args: readonly ["--pane", "--message"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes stash"; readonly summary: "Stash uncommitted changes in a Pane worktree."; readonly usage: readonly ["runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:git-stash"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes stash-pop"; readonly summary: "Apply and drop the latest stash in a Pane worktree."; readonly usage: readonly ["runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:git-stash-pop"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes soft-reset"; readonly summary: "Undo the last commit in a Pane, keeping its changes staged."; readonly usage: readonly ["runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly daemonAction: { readonly channel: "sessions:git-soft-reset"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes fetch"; readonly summary: "Fetch the remote for a Pane worktree."; readonly usage: readonly ["runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly openWorld: true; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "sessions:git-fetch"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["git"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes run-script"; readonly summary: "Run the repository's run script in a Pane."; readonly usage: readonly ["runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly daemonAction: { readonly channel: "sessions:run-script"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes stop-script"; readonly summary: "Stop the run script running in a Pane."; readonly usage: readonly ["runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "sessions:stop-script"; readonly args: readonly ["--pane"]; }; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "panes move"; readonly summary: "Move a Pane into a sidebar folder."; readonly usage: readonly ["runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "folders:move-session"; readonly args: readonly ["--pane", "--folder"]; }; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "folders list"; readonly summary: "List the sidebar folders of a repository."; readonly usage: readonly ["runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]"]; readonly daemonAction: { readonly channel: "folders:get-by-project"; readonly args: readonly ["--repo"]; }; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "folders create"; readonly summary: "Create a sidebar folder in a repository."; readonly usage: readonly ["runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly daemonAction: { readonly channel: "folders:create"; readonly args: readonly ["--name", "--repo"]; }; readonly toolsets: readonly ["panes"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "links create"; readonly summary: "Build a pane:// link that opens a Pane, panel, repository, or Session in the Pane app."; readonly usage: readonly ["runpane links create --pane <pane-id> [--panel <panel-id>] [--json]", "runpane links create --repo <repo-id> [--json]", "runpane links create --session <session-id> [--json]"]; readonly toolsets: readonly ["core", "links"]; readonly jsonSchemas: readonly ["linkCreateResult"]; readonly localControl: true; }, { readonly name: "links open"; readonly summary: "Open a pane:// link in the running Pane app."; readonly usage: readonly ["runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly daemonAction: { readonly channel: "runpane:links:open"; readonly args: readonly ["--url"]; }; readonly toolsets: readonly ["links"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly localControl: true; }, { readonly name: "docs search"; readonly summary: "Search Pane's docs, runpane help, and the Pane Chat skills."; readonly usage: readonly ["runpane docs search --query <text> [--limit <count>] [--json]"]; readonly wrappers: readonly ["npm"]; readonly toolsets: readonly ["core", "docs"]; readonly jsonSchemas: readonly ["docsSearchResult"]; readonly localControl: true; }, { readonly name: "docs read"; readonly summary: "Read one Pane doc, help topic, or skill in full."; readonly usage: readonly ["runpane docs read --doc <path> [--json]"]; readonly wrappers: readonly ["npm"]; readonly toolsets: readonly ["core", "docs"]; readonly jsonSchemas: readonly ["docsReadResult"]; readonly localControl: true; }, { readonly name: "agents start"; readonly summary: "Start an agent on a task and wait until it is ready: as a new tab in an existing Pane with --pane <id> (review, audit, fix, QA), or in a new Pane with --repo and --name for new work."; readonly usage: readonly ["runpane agents start (--pane <pane-id> | --repo <selector> --name <name> [--base-branch <branch>]) (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly wrappers: readonly ["npm"]; readonly toolsets: readonly ["core", "agents"]; readonly jsonSchemas: readonly ["agentTaskResult"]; readonly localControl: true; }, { readonly name: "agents status"; readonly summary: "Check on an agent: whether it is working, ready, blocked, or idle, plus its current screen."; readonly usage: readonly ["runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]"]; readonly wrappers: readonly ["npm"]; readonly toolsets: readonly ["core", "agents"]; readonly jsonSchemas: readonly ["agentStatusResult"]; readonly localControl: true; }, { readonly name: "agents send"; readonly summary: "Send a follow-up message to an agent and confirm it was submitted."; readonly usage: readonly ["runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> [--as-file-pointer] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly wrappers: readonly ["npm"]; readonly toolsets: readonly ["core", "agents"]; readonly jsonSchemas: readonly ["agentSendResult"]; readonly localControl: true; }, { readonly name: "report"; readonly summary: "Hand back a worker's structured report: state, PR, head commit, summary, and the question when blocked."; readonly usage: readonly ["runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary <text>|--summary-file <path|->] [--question <text>] [--pane <pane-id> --panel <panel-id>] [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["agents"]; readonly jsonSchemas: readonly ["reportResult"]; readonly localControl: true; }, { readonly name: "notify"; readonly summary: "Ask the person a question, or tell them something, wherever they are, and get their answer back."; readonly usage: readonly ["runpane notify --ui <options|approve|ask|info> --title <text> [--context <text>] [--choices <json>] [--detail <text>] [--detail-label <text>] [--suggestions <json>] [--action <json>] [--json] [--pane-dir <path>]", "runpane notify --resume <id> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["core"]; readonly jsonSchemas: readonly ["notifyRequest", "notifyResult"]; readonly localControl: true; }, { readonly name: "inbox"; readonly summary: "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged."; readonly usage: readonly ["runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["inboxListResult"]; readonly localControl: true; }, { readonly name: "inbox ack"; readonly summary: "Clear Session inbox items once they are handled."; readonly usage: readonly ["runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]", "runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly jsonSchemas: readonly ["inboxAckResult"]; readonly localControl: true; }, { readonly name: "sessions list"; readonly summary: "List durable named orchestration Sessions."; readonly usage: readonly ["runpane sessions list [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionListResult"]; readonly localControl: true; }, { readonly name: "sessions create"; readonly summary: "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false)."; readonly usage: readonly ["runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions get"; readonly summary: "Read one durable named orchestration Session."; readonly usage: readonly ["runpane sessions get --session <id|name> [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions update"; readonly summary: "Update a Session overview from structured JSON; isPinned sets the UI pin star."; readonly usage: readonly ["runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions set-agent"; readonly summary: "Switch the durable terminal agent for a named Session."; readonly usage: readonly ["runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions associate"; readonly summary: "Associate a user-visible Pane with a named Session."; readonly usage: readonly ["runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions detach"; readonly summary: "Detach a Pane from a named Session."; readonly usage: readonly ["runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions overview"; readonly summary: "Read a live status, activity, git, and pull request overview for a named Session."; readonly usage: readonly ["runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionOverviewResult"]; readonly localControl: true; }, { readonly name: "lock acquire"; readonly summary: "Acquire a named lock on a resource shared between agents, such as one test account, optionally waiting for it."; readonly usage: readonly ["runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["lockAcquireRequest", "lockAcquireResult"]; readonly localControl: true; }, { readonly name: "lock release"; readonly summary: "Release a named lock you hold, or force-release another owner's lock."; readonly usage: readonly ["runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["lockReleaseResult"]; readonly localControl: true; }, { readonly name: "lock list"; readonly summary: "List held named locks, optionally only one Session's."; readonly usage: readonly ["runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["lockListResult"]; readonly localControl: true; }, { readonly name: "sessions unpin"; readonly summary: "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state."; readonly usage: readonly ["runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "sessions pin"; readonly summary: "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state."; readonly usage: readonly ["runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["sessions"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly localControl: true; }, { readonly name: "pr watch"; readonly summary: "Register durable GitHub PR monitoring for a Pane."; readonly usage: readonly ["runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["agents"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly localControl: true; }, { readonly name: "pr unwatch"; readonly summary: "Remove a Pane’s explicit PR registration."; readonly usage: readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["agents"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly localControl: true; }, { readonly name: "pr list"; readonly summary: "List PR registrations and stopped watches."; readonly usage: readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["agents"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly localControl: true; }, { readonly name: "loops list"; readonly summary: "List loops (scheduled tasks) with their schedule, next run, and recent runs."; readonly usage: readonly ["runpane loops list [--json] [--pane-dir <path>]"]; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopListResult"]; readonly localControl: true; }, { readonly name: "loops create"; readonly summary: "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."; readonly usage: readonly ["runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopInput", "loopResult", "loopDryRunResult"]; readonly localControl: true; }, { readonly name: "loops update"; readonly summary: "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."; readonly usage: readonly ["runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopInput", "loopResult", "loopDryRunResult"]; readonly localControl: true; }, { readonly name: "loops run"; readonly summary: "Start a run of a loop now. The schedule stays the same."; readonly usage: readonly ["runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly additive: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopResult"]; readonly localControl: true; }, { readonly name: "loops pause"; readonly summary: "Pause a loop: it starts no scheduled runs until resumed."; readonly usage: readonly ["runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopResult"]; readonly localControl: true; }, { readonly name: "loops resume"; readonly summary: "Resume a paused loop from its next scheduled time."; readonly usage: readonly ["runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopResult"]; readonly localControl: true; }, { readonly name: "loops delete"; readonly summary: "Delete a loop. It starts no more runs."; readonly usage: readonly ["runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly mutates: true; readonly idempotent: true; readonly toolsets: readonly ["core", "loops"]; readonly jsonSchemas: readonly ["loopDeleteResult"]; readonly localControl: true; }]; readonly flags: { readonly wrapper: readonly [{ readonly name: "--version"; readonly value: "<latest|vX.Y.Z>"; readonly description: "Pane release to install or inspect."; }, { readonly name: "--download-dir"; readonly value: "<path>"; readonly description: "Directory for downloaded Pane release artifacts."; }, { readonly name: "--pane-path"; readonly value: "<path>"; readonly description: "Use or inspect an existing Pane executable."; }, { readonly name: "--format"; readonly value: "<auto|appimage|deb|dmg|zip|exe>"; readonly description: "Pane release artifact format."; }, { readonly name: "--dry-run"; readonly description: "Print the plan without downloading or installing."; }, { readonly name: "--yes"; readonly aliases: readonly ["-y"]; readonly description: "Skip interactive prompts where possible."; }, { readonly name: "--verbose"; readonly description: "Print extra diagnostics."; }]; readonly remoteValue: readonly [{ readonly name: "--label"; readonly value: "<name>"; }, { readonly name: "--prefer-tunnel"; readonly value: "<tailscale|ssh|manual|auto>"; }, { readonly name: "--channel"; readonly value: "<stable|nightly>"; }, { readonly name: "--base-url"; readonly value: "<url>"; }, { readonly name: "--pane-dir"; readonly value: "<path>"; }, { readonly name: "--listen-port"; readonly value: "<port>"; }, { readonly name: "--port"; readonly value: "<port>"; }, { readonly name: "--repo-ref"; readonly value: "<ref>"; }]; readonly remoteBoolean: readonly [{ readonly name: "--auto-listen-port"; }, { readonly name: "--interactive-tailscale-setup"; }, { readonly name: "--no-install-service"; }, { readonly name: "--no-tailscale-serve"; }, { readonly name: "--print-only"; }]; readonly localValue: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly description: "Connect to a Pane daemon using this Pane data directory."; }, { readonly name: "--repo"; readonly value: "<selector>"; readonly description: "Repository selector: active, id, exact path, or saved repository name."; }, { readonly name: "--pane"; readonly value: "<pane-id>"; readonly description: "Pane/session id to inspect."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly description: "Tool panel id to inspect or control."; }, { readonly name: "--path"; readonly value: "<path>"; readonly description: "Existing git repository path to register with Pane."; }, { readonly name: "--name"; readonly value: "<name>"; readonly description: "Name for the registered repository, created/renamed pane session, named lock, or loop."; }, { readonly name: "--worktree-name"; readonly value: "<name>"; readonly description: "Worktree name to request. Defaults to --name. For a loop, the worktree and branch name template; defaults to loop-<name>."; }, { readonly name: "--branch"; readonly value: "<name>"; readonly description: "Exact new branch name for the created worktree, slashes included. Must not exist yet; defaults to the worktree name."; }, { readonly name: "--base-branch"; readonly value: "<ref>"; readonly aliases: readonly ["--base"]; readonly description: "Ref the created worktree branches from. --base is an alias."; }, { readonly name: "--folder"; readonly value: "<name>"; readonly description: "Top-level sidebar folder for an adopted pane."; }, { readonly name: "--resume"; readonly value: "<agent-session-id>"; readonly description: "Agent session id to persist and resume in an adopted pane."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly description: "Built-in agent terminal template to open. With --tool-command, the agent that command runs."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly description: "Custom terminal command to run instead of a built-in agent."; }, { readonly name: "--title"; readonly value: "<title>"; readonly description: "Terminal tab title. Defaults to the selected agent title or Terminal."; }, { readonly name: "--url"; readonly value: "<url>"; readonly description: "http(s) or file URL for panels open; pane:// link for links open."; }, { readonly name: "--file"; readonly value: "<path>"; readonly description: "File inside the Pane worktree to open; supported formats have read-only previews, and HTML opens as editable source."; }, { readonly name: "--initial-input"; readonly value: "<text>"; readonly aliases: readonly ["--prompt"]; readonly description: "Text to send to the terminal after the command is ready. --prompt is an alias."; }, { readonly name: "--initial-input-file"; readonly value: "<path|->"; readonly aliases: readonly ["--prompt-file"]; readonly description: "Read initial input from a file or stdin. --prompt-file is an alias."; }, { readonly name: "--attach"; readonly value: "<file>"; readonly description: "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable."; }, { readonly name: "--from-json"; readonly value: "<path|->"; readonly description: "Read a structured JSON request payload from a file or stdin."; }, { readonly name: "--timeout-ms"; readonly value: "<milliseconds>"; readonly description: "Maximum time to wait for each pane creation job."; }, { readonly name: "--ready-timeout-ms"; readonly value: "<milliseconds>"; readonly description: "Readiness wait timeout for panes create/adopt --wait-ready."; }, { readonly name: "--concurrency"; readonly value: "<count>"; readonly description: "Accepted for forward compatibility. Pane currently serializes multi-pane session creation so queued jobs do not time out before starting."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly description: "Maximum recent output lines or records to read."; }, { readonly name: "--for"; readonly value: "<initialized|ready|idle|text>"; readonly description: "Panel wait condition."; }, { readonly name: "--contains"; readonly value: "<text>"; readonly description: "Text to wait for with panels wait --for text."; }, { readonly name: "--interval-ms"; readonly value: "<milliseconds>"; readonly description: "Polling interval for panels wait."; }, { readonly name: "--text"; readonly value: "<text>"; readonly description: "Text bytes to send to a terminal panel."; }, { readonly name: "--input-file"; readonly value: "<path|->"; readonly description: "Read panel input from a file or stdin."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly description: "Identify whether a local-control mutation is user-initiated or agent/orchestrator-initiated."; }, { readonly name: "--strategy"; readonly value: "<auto|codex-ctrl-enter|enter|tab>"; readonly description: "Composer submit key sequence strategy for panels submit-composer."; }, { readonly name: "--as"; readonly value: "<consumer-name>"; readonly description: "Use a persisted daemon-held workspace cursor."; }, { readonly name: "--since"; readonly value: "<generation>"; readonly description: "Read workspace events after this generation."; }, { readonly name: "--from"; readonly value: "<now|earliest>"; readonly description: "Choose where a new named cursor starts."; }, { readonly name: "--kinds"; readonly value: "<kind,...>"; readonly description: "Limit workspace events to comma-separated kinds."; }, { readonly name: "--name-contains"; readonly value: "<text>"; readonly description: "Limit workspace events to Pane names containing text."; }, { readonly name: "--exclude-pane"; readonly value: "<pane-id>"; readonly description: "Exclude a Pane from workspace watch results; repeatable."; }, { readonly name: "--heartbeat"; readonly value: "<duration>"; readonly description: "Print a HEARTBEAT line this often under --follow (a duration; default off)."; }, { readonly name: "--idle-after"; readonly value: "<duration>"; readonly description: "First IDLE reminder after a READY panel stays idle (a duration; default 10m under --follow; 0 turns IDLE off)."; }, { readonly name: "--expire-after"; readonly value: "<duration>"; readonly description: "End a --follow watch after this long with nothing but IDLE, printing WATCH EXPIRED and exiting 0 (a duration; default 3h; 0 never expires)."; }, { readonly name: "--ready-settle"; readonly value: "<duration>"; readonly description: "Quiet time before READY under --follow (a duration; default 3m)."; }, { readonly name: "--blocked-settle"; readonly value: "<duration>"; readonly description: "Time before BLOCKED under --follow (a duration; default 30s)."; }, { readonly name: "--min-interval"; readonly value: "<duration>"; readonly description: "Batch window for non-urgent lines under --follow (a duration; default 10m)."; }, { readonly name: "--body-file"; readonly value: "<path|->"; readonly description: "Read diagnostic report evidence from a file or stdin."; }, { readonly name: "--session"; readonly value: "<id|name>"; readonly description: "Named orchestration Session id or exact name."; }, { readonly name: "--ttl"; readonly value: "<duration>"; readonly description: "How long a named lock is held before it expires: a number with ms, s, m, or h (such as 30m); a bare number is milliseconds. At least 1s, at most 24h."; }, { readonly name: "--wait"; readonly value: "<milliseconds>"; readonly description: "lock acquire: how long to wait for a held lock to come free; 0 (the default) returns at once. On panels submit, panels create and panes create, --wait takes no value: block until that panel reports, misses its report, waits on a prompt, or exits, then print one JSON result."; }, { readonly name: "--timeout"; readonly value: "<duration>"; readonly description: "With --wait: give up after this long (30m, 2h; 0 waits without limit) and exit 124."; }, { readonly name: "--note"; readonly value: "<text>"; readonly description: "What a named lock is for. Outside a Pane terminal it also names the owner, so pass the same note to release it."; }, { readonly name: "--loop"; readonly value: "<id>"; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--cron"; readonly value: "<expr>"; readonly description: "Five-field cron schedule in this machine's local time zone, such as \"0 3 * * *\". Runs must be at least 60 minutes apart."; }, { readonly name: "--message"; readonly value: "<message>"; readonly description: "Commit message for panes commit."; }, { readonly name: "--query"; readonly value: "<text>"; readonly description: "Search words for docs search."; }, { readonly name: "--doc"; readonly value: "<path>"; readonly description: "Doc path for docs read."; }, { readonly name: "--toolsets"; readonly value: "<name,...>"; readonly description: "MCP toolsets for runpane mcp."; }, { readonly name: "--keys"; readonly value: "<name,...>"; readonly description: "Named keys for panels input, such as down,enter."; }, { readonly name: "--state"; readonly value: "<ready|blocked|failed|done>"; readonly description: "Report state for runpane report."; }, { readonly name: "--pr"; readonly value: "<number>"; readonly description: "Pull request number for runpane report."; }, { readonly name: "--head"; readonly value: "<sha>"; readonly description: "Head commit (7-40 hex characters) for runpane report."; }, { readonly name: "--summary"; readonly value: "<text>"; readonly description: "Report summary text; up to 16,000 characters are kept."; }, { readonly name: "--summary-file"; readonly value: "<path|->"; readonly description: "Read the report summary from a file or stdin."; }, { readonly name: "--question"; readonly value: "<text>"; readonly description: "What a blocked worker needs answered; required with --state blocked."; }, { readonly name: "--cwd"; readonly value: "<path>"; readonly description: "Working directory on the target machine for workspace exec."; }, { readonly name: "--note-file"; readonly value: "<path|->"; readonly description: "Handoff note to check and send; - reads stdin."; }, { readonly name: "--machine"; readonly value: "<name>"; readonly description: "Handoff destination machine; overrides the machine in the destination text."; }, { readonly name: "--model"; readonly value: "<model>"; readonly description: "Model for the receiving agent; overrides the destination text."; }, { readonly name: "--effort"; readonly value: "<level>"; readonly description: "Reasoning effort for the receiving agent (minimal, low, medium, high, xhigh, max); overrides the destination text."; }, { readonly name: "--epoch"; readonly value: "<epoch>"; readonly description: "Journal epoch paired with --since; a mismatch emits _reset instead of silently skipping events."; }, { readonly name: "--ui"; readonly value: "<options|approve|ask|info>"; readonly description: "notify: what to show: pick one of choices, approve or deny, type an answer, or an update."; }, { readonly name: "--context"; readonly value: "<text>"; readonly description: "notify: background shown under Details."; }, { readonly name: "--choices"; readonly value: "<json>"; readonly description: "notify --ui options: 1 to 9 choices as a JSON array of {label, detail?, recommended?}."; }, { readonly name: "--detail"; readonly value: "<text>"; readonly description: "notify --ui approve: a preformatted block, such as the command or SQL to approve."; }, { readonly name: "--detail-label"; readonly value: "<text>"; readonly description: "notify --ui approve: label of the disclosure that reveals --detail, such as Show the SQL; up to 40 characters."; }, { readonly name: "--suggestions"; readonly value: "<json>"; readonly description: "notify --ui ask: suggested answers as a JSON array of strings."; }, { readonly name: "--action"; readonly value: "<json>"; readonly description: "notify --ui info: one button as a JSON object {label, url}."; }]; readonly localBoolean: readonly [{ readonly name: "--json"; readonly description: "Print machine-readable JSON output."; }, { readonly name: "--wait-ready"; readonly description: "Wait until each created panel's agent is at its input box, then deliver and verify any starting message, before returning."; }, { readonly name: "--no-focus"; readonly description: "Create the pane or panel in the background without changing focus."; }, { readonly name: "--focus"; readonly description: "Explicitly focus the created pane or panel."; }, { readonly name: "--split"; readonly description: "Open the tab in split view beside the primary tab group (default for panels open)."; }, { readonly name: "--tab"; readonly description: "Open the tab in the current tab group instead of split view."; }, { readonly name: "--pinned"; readonly description: "Request pinning at creation; Session association still clears the first pin. Outside a Session, creation pins by default."; }, { readonly name: "--no-pinned"; readonly description: "Create the pane unpinned instead of the default pinned (the UI's favorite/pin star)."; }, { readonly name: "--no-associate"; readonly description: "Inside a Session orchestrator, do not associate the created pane with that Session."; }, { readonly name: "--force"; readonly description: "Archive even if the pane's branch has uncommitted, untracked, or unpushed changes; for lock release, release another owner's lock."; }, { readonly name: "--remove-worktree"; readonly description: "Also check and remove an adopted Pane's worktree when archiving it. The local branch is kept."; }, { readonly name: "--merged"; readonly description: "With panes archive --session, archive only Panes whose PR is confirmed merged and whose worktree has no uncommitted, untracked or unpushed work. Other Panes are skipped with a reason (pr-open, pr-not-merged, pr-status-unknown, or a local safety code)."; }, { readonly name: "--launch"; readonly description: "Run an adopted pane's agent resume command immediately instead of staging it."; }, { readonly name: "--as-file-pointer"; readonly description: "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."; }, { readonly name: "--follow"; readonly description: "Continue waiting for workspace events until interrupted."; }, { readonly name: "--until-event"; readonly description: "Watch only: wait across daemon calls for the first matching event, print it, and exit 0. --timeout-ms becomes the total deadline (exit 124). For harnesses that wake an agent when a process exits."; }, { readonly name: "--ack-now"; readonly description: "Advance a named cursor immediately for at-most-once delivery."; }, { readonly name: "--include-held-input"; readonly description: "Include up to 120 characters of unsubmitted composer text in ready events."; }, { readonly name: "--all-stopped"; readonly description: "Resume every stopped agent panel in every non-archived Pane."; }, { readonly name: "--include-shells"; readonly description: "Include ordinary shell panels in follow mode."; }, { readonly name: "--no-held-input"; readonly description: "Disable redacted held-input detection under --follow (STUCK lines, and heldInputPresent in JSON)."; }, { readonly name: "--self-test"; readonly description: "Probe the current daemon watch path without advancing a named cursor."; }, { readonly name: "--report"; readonly description: "Prepare a redacted doctor report; external filing still requires --yes."; }, { readonly name: "--read-only"; readonly description: "Serve only read-only MCP tools."; }, { readonly name: "--template"; readonly description: "Print the handoff note template, with this checkout's (or Session's) origin and git state filled in."; }, { readonly name: "--push"; readonly description: "Before a handoff, commit uncommitted work as WIP and push the branch (never forces)."; }, { readonly name: "--note-only"; readonly description: "Hand off to a fresh agent with the note, instead of carrying and resuming your own session."; }, { readonly name: "--interrupt"; readonly description: "Stop the current agent turn, wait for an empty idle composer, then submit and verify the replacement."; }, { readonly name: "--expect-report"; readonly description: "Pane expects a `runpane report` and emits agent.report.missing if the agent goes ready or exits without one. The default for work an agent sends; use it to ask for one on work marked --source user."; }, { readonly name: "--no-expect-report"; readonly description: "Send work without waiting for a `runpane report` (fire-and-forget input); no agent.report.missing follows."; }, { readonly name: "--all"; readonly description: "inbox ack only: clear every item of the --session."; }, { readonly name: "--paused"; readonly description: "loops create only: create the loop paused."; }]; }; readonly help: { readonly npm: { readonly default: readonly ["Usage:", " runpane", " runpane setup", " runpane install [client|daemon] [options]", " runpane update [options]", " runpane version", " runpane doctor", " runpane doctor --report --body-file <path|->", " runpane daemon repair [--pane-dir <path>] [--yes] [--json]", " runpane agent-context [--json]", " runpane mcp [--toolsets <name,...>] [--read-only]", " runpane agents doctor --agent <codex|claude|cursor> [--repo <selector>] [--json]", " runpane repos list [--json]", " runpane repos add --path <path> [--name <name>]", " runpane sessions list [--json] [--pane-dir <path>]", " runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]", " runpane sessions get --session <id|name> [--json] [--pane-dir <path>]", " runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]", " runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]", " runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]", " runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]", " runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]", " runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]", " runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]", " runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", " runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", " runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]", " runpane loops list [--json]", " runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>] --yes", " runpane loops update|run|pause|resume|delete --loop <id> --yes", " runpane panes list [--repo <selector>] [--json]", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", " runpane workspace state [--repo <selector>] [--json]", " runpane workspace list [--json]", " runpane workspace <machine> read|write|exec|<command>", " runpane watch --follow", " runpane watch --until-event", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes", " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] --yes", " runpane panels list --pane <pane-id> [--json]", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", " runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) --yes [--json]", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]", " runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json]", " runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]", " runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", " runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane links create --pane <pane-id> [--panel <panel-id>] [--json]", " runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]", " runpane docs search --query <text> [--limit <count>] [--json]", " runpane docs read --doc <path> [--json]", " runpane agents start (--pane <pane-id> | --repo <selector> --name <name> [--base-branch <branch>]) (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> --yes [--json] [--pane-dir <path>]", " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]", " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]", " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]", " runpane notify --ui <options|approve|ask|info> --title <text> [--choices <json>] [--resume <id>] [--json]", " runpane inbox [--session <id|name>] [--json]", " runpane inbox ack <item-id>... [--session <id|name>] [--json]", " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]", " runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]", " runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]", " runpane help [command]", "", "Quick start:", " npx --yes runpane@latest", " npm i -g runpane && runpane setup", "", "Advanced examples:", " npx --yes runpane@latest install client", " npx --yes runpane@latest install daemon --label \"My Server\"", " pnpm dlx runpane@latest", "", "Common commands:", " runpane help", " runpane setup", " runpane install", " runpane doctor", "", "Agent discovery:", " runpane doctor --json", " runpane agent-context --json", " runpane agent-context --command \"<command>\" --json", "", "Run \"runpane help panes create\" for pane orchestration options."]; readonly install: readonly ["Usage:", " runpane install [client|daemon] [options]", "", "Examples:", " npx --yes runpane@latest install client", " npx --yes runpane@latest install daemon --label \"My Server\"", " pnpm dlx runpane@latest install daemon --prefer-tunnel ssh --label \"VM\"", "", "Wrapper options:", " --version <latest|vX.Y.Z> Pane release to install", " --format <auto|appimage|deb|dmg|zip|exe>", " --download-dir <path>", " --pane-path <path> Use an existing Pane executable", " --dry-run Print the plan without downloading", " --yes Skip interactive prompts where possible", " --verbose", "", "Daemon passthrough options:", " --label <name>", " --prefer-tunnel <tailscale|ssh|manual|auto>", " --channel <stable|nightly>", " --base-url <url>", " --pane-dir <path>", " --listen-port <port> / --port <port>", " --auto-listen-port", " --interactive-tailscale-setup", " --no-install-service", " --no-tailscale-serve", " --print-only", " --repo-ref <ref>"]; readonly setup: readonly ["Usage:", " runpane setup", "", "Opens the guided setup for desktop install, remote host setup, update, and diagnostics.", "", "Quick start:", " npx --yes runpane@latest", " npm i -g runpane && runpane setup"]; readonly update: readonly ["Usage:", " runpane update [--pane-only | --cli-only] [--version <latest|vX.Y.Z>] [--pane-dir <path>] [--dry-run] [--wait] [--json]", " runpane update --status <operation-id> [--wait] [--pane-dir <path>] [--json]", "", "Updates both Pane and the invoked supported CLI by default, on this machine.", "Preflight identifies the host and installation owner before downtime. The independent helper stages an app, CLI, and standalone Node runtime before stopping Pane.", "Status distinguishes acceptance, installed components, host health, and per-panel restoration. No prompts or uncertain actions are replayed.", "CLI-only updates do not restart Pane; a managed CLI pin survives later Pane startup.", "Use workspace <machine> exec -- runpane update for an explicit remote machine."]; readonly version: readonly ["Usage:", " runpane version [--pane-dir <path>]", " runpane --version"]; readonly doctor: readonly ["Usage:", " runpane doctor [--json] [--pane-dir <path>] [--pane-path <path>] [--format <format>] [--verbose]", " runpane doctor --report [--title <text>] --body-file <path|-> [--yes] [--json]", "", "Checks wrapper/runtime details, release metadata, installed Pane detection, and Pane daemon reachability.", "", "Options:", " --json Print a machine-readable environment report", " --pane-dir <path> Connect to a specific Pane data directory", " --pane-path <path> Inspect a specific Pane executable", " --format <format> Release artifact format to inspect", " --verbose Print extra diagnostics", " --report Prepare a redacted, inspectable report", " --body-file <path|-> Read report evidence from a file or stdin", " --title <text> Report title", " --yes Confirm creating one greenfield-inc/Pane issue", "", "Agent discovery:", " runpane doctor --json", " runpane agent-context --json"]; readonly "daemon repair": readonly ["Usage:", " runpane daemon repair [--pane-dir <path>] [--pane-path <path>] [--yes] [--json]", "", "Repairs and restarts only the managed remote-daemon launcher and service definition.", "", "Options:", " --pane-dir <path> Remote daemon data directory (default: ~/.pane_remote)", " --pane-path <path> Existing Pane executable used to perform repair", " --yes Skip the restart confirmation", " --json Print one machine-readable repair result"]; readonly "repos list": readonly ["Usage:", " runpane repos list [--json] [--pane-dir <path>]", "", "Lists repositories saved in the running Pane app.", "", "Options:", " --json Print machine-readable output", " --pane-dir <path> Connect to a specific Pane data directory"]; readonly "repos add": readonly ["Usage:", " runpane repos add --path <path> [--name <name>] [--json] [--yes]", "", "Registers an existing git repository with the running Pane app.", "", "Options:", " --path <path> Existing git repository path", " --name <name> Saved repository name; defaults to the directory name", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without adding the repo", " --yes Skip confirmation for mutating commands"]; readonly panes: readonly ["Pane session commands.", "", "Usage:", " runpane panes <command> [options]", "", "Commands:", " runpane panes list [--repo <selector>] [--json]", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes archive --pane <pane-id> [--force] [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json]", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes [--json]", " runpane panes pin --pane <pane-id> --yes [--dry-run] [--json]", " runpane panes unpin --pane <pane-id> --yes [--dry-run] [--json]", " runpane panes rename --pane <pane-id> --name <new-name> --yes [--dry-run] [--json]", "", "Run \"runpane help panes <command>\" for command-specific options."]; readonly "panes list": readonly ["Usage:", " runpane panes list [--repo <selector>] [--json]", "", "Lists Pane sessions. Pass --repo to limit results to one saved repository.", "", "status is running while a tool or agent terminal is live; the dock shell does not count. agentState is the most urgent state of the live agent panels: blocked, working, ready, or none.", "", "Options:", " --repo <selector> active, id, exact path, or saved repository name", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panes cost": readonly ["Usage:", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", "", "Reports estimated token costs per Pane for the last 30 days, including per-model and cache-efficiency details.", "", "Options:", " --repo <selector> Limit results to one saved repository", " --pane <pane-id> Return one Pane, including an idle Pane with zero usage", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly workspace: readonly ["Workspace commands: this machine's Panes, and your other machines over Tailscale.", "", "Usage:", " runpane workspace state [--repo <selector>] [--json]", " runpane watch --follow", " runpane workspace list [--json]", " runpane workspace <machine> read <path>", " runpane workspace <machine> write <path> (content from stdin)", " runpane workspace <machine> exec -- <command>", " runpane workspace <machine> <runpane command> (any command that talks to Pane, e.g. sessions list --json)", " runpane workspace enable|disable", "", "<machine> is a Tailscale name, unique prefix, or IP. Your own machines are reachable, and a teammate's machine when its owner set Who can connect to Everyone on tailnet.", "Without <machine>, read, write, and exec route a path that cannot exist here (C:\\... on a Mac) to the one joined machine it fits.", "Commands that only run here (doctor, agent-context, mcp, docs) run there with: runpane workspace <machine> exec -- 'runpane doctor'"]; readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."]; readonly watch: readonly ["Usage:", " runpane watch Print what changed since your cursor, then exit", " runpane watch --follow Keep watching, tuned for an agent watching unattended", " runpane watch --until-event Wait for one event worth waking for, print it, exit 0", "", "Waits for agent, Pane, panel, and PR events from the daemon without polling.", "", "What --follow does by default (see defaults.watch.follow in the contract):", " prints WATCH OK once when armed, then one line per event, with no heartbeats", " kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,", " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,", " pr.base_changed, pr.base_deleted", " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m", " (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)", " IDLE reminders at 10m, 30m, 1h, 3h, then daily", " ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE", "", "What --until-event does by default: waits for agent.report, agent.blocked, panel.exited,", "or pane.gone, prints that one line, and exits 0. Run it as a background task, act on", "its line, then run it again; its named cursor means nothing is missed between runs.", "Single-event waits deliver immediately without follow settling or batching.", "--follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since.", "agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:", "add it to --kinds to wake on MISSING REPORT too.", "", "Options:", " --session <id|name> Watch every Pane in a Session; associate/detach apply live", " --pane <id> Watch one Pane; repeatable (default: every managed Pane)", " --exclude-pane <id> Leave out a Pane; repeatable", " --repo <selector> Limit to a saved repository", " --name-contains <text> Limit by Pane name substring", " --include-shells Include plain shell panels (default: agent panels only)", " --kinds <kind,...> Replace the default event kinds", " --json One JSON object per line", " --as <name> Name the cursor (default: from --session or this panel)", " --since <generation> Use an explicit cursor instead of a name", " --epoch <epoch> Pair with --since to detect journal resets", " --from <now|earliest> Where a new named cursor starts (default: now)", " --self-test Check the daemon watch path and exit", "", "Overrides (durations such as 30s, 10m, 3h; a bare number is milliseconds; 0 turns it off):", " --ready-settle <duration> Quiet time before READY (default 3m)", " --blocked-settle <duration> Time before BLOCKED (default 30s)", " --min-interval <duration> Batch window for non-urgent lines (default 10m)", " --idle-after <duration> First IDLE reminder (default 10m)", " --expire-after <duration> End after this long with nothing but IDLE (default 3h)", " --heartbeat <duration> Print a HEARTBEAT line this often (default off)", " --timeout-ms <duration> Per-request wait; with --until-event, the total deadline (exit 124)", " --limit <count> Maximum entries per response", " --ack-now At-most-once cursor delivery", " --include-held-input Include unsubmitted composer text in JSON", " --no-held-input Turn off STUCK detection", " --pane-dir <path> Connect to a specific Pane data directory", "", "How a watch ends: WATCH EXPIRED (exit 0) means nothing happened; arm a new one with the next", "dispatch. A non-zero exit or a WATCH ERROR line means it failed: say so and re-arm once. Judge", "a watch by WATCH OK and these endings, never by silence. Never pipe --follow into grep -m1 or head.", "STUCK means real unsubmitted composer text; a prompt suggestion never counts."]; readonly "panes create": readonly ["Usage:", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options]", " runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options]", " runpane panes create --from-json <path|-> [--yes] [--json]", "", "Creates a Pane in a saved repository and opens a terminal-backed tool tab. 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create one only when the work's branch has no Pane yet; for existing work use `runpane panels create --pane <id>`.", "", "A long or multi-line prompt is never typed into the shell: on bash, zsh or sh the agent launches with `\"$(cat '<prompt file>')\"` reading a private copy under `<pane-dir>/prompts/<pane-id>/`; on PowerShell, cmd, fish or WSL the prompt is pasted into the agent's composer once it is ready.", "", "Options:", " --repo <selector> active, id, exact path, or saved repository name", " --name <name> Pane/session name", " --worktree-name <name> Worktree directory name; defaults to --name", " --branch <name> Exact new branch name (slashes kept); must not exist; defaults to the worktree name", " --base-branch <ref> Ref to branch from; --base is an alias", " --agent <codex|claude|cursor> Built-in terminal template; with --tool-command, the agent it runs", " --tool-command <command> Custom terminal command", " --title <title> Terminal tab title", " --initial-input <text> Text sent after the command is ready", " --prompt <text> Alias for --initial-input", " --initial-input-file <path|-> Read initial input from a file or stdin", " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt", " --attach <file> Copy a file beside the prompt file and list it; repeatable", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --prompt-file <path|-> Alias for --initial-input-file", " --from-json <path|-> Read a full request payload", " --timeout-ms <milliseconds> Pane creation timeout", " --wait-ready Wait for the agent's input box, then deliver and verify the prompt", " --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000", " --concurrency <count> Accepted; creation is currently serialized", " --source <user|agent> Mark mutation source; agent implies background creation", " --no-focus Create in the background without stealing focus", " --focus Explicitly focus the created pane", " --pinned Request pinning at creation; first Session association clears it", " --no-pinned Create unpinned (the UI's favorite/pin star)", " --no-associate Inside a Session orchestrator, do not associate the new pane with that Session", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without creating panes", " --yes Skip confirmation for mutating commands", "", "Outside a Session, creation pins by default, including --source agent. Inside a Session (PANE_ORCHESTRATION_SESSION_ID), children default to unpinned to avoid duplicating them in the global pinned list. First Session association clears the creation pin, including --pinned; use panes pin afterward to pin an associated child."]; readonly "panes adopt": readonly ["Usage:", " runpane panes adopt --repo <selector> --path <dir> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes adopt --repo <selector> --path <dir> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [options]", "", "Adopts an existing externally managed git worktree without creating, syncing, or deleting it. Archiving only removes its worktree with `panes archive --remove-worktree`. To start new work on a named branch, use `panes create --base <ref> --branch <name>` instead of `git worktree add` plus adopt.", "", "Options: --resume <id> stages the agent resume command (built-in agents only); --launch runs the command immediately; --prompt <text> or --prompt-file <path|-> and --wait-ready require --launch; --folder <name> groups the pane; --no-pinned opts out of pinning; --no-associate skips automatic Session association; --dry-run previews.", "", "With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."]; readonly "panes archive": readonly ["Usage:", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes [--json]", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json]", "", "Archives a Pane (session) exactly like the UI Archive action, including removal of its Pane-managed git worktree. Refreshes the configured upstream before checking for unpushed commits and reports exact commit evidence. When the branch has no upstream or its upstream is gone, a merged GitHub pull request whose head is HEAD (found with `gh`) counts as pushed. Refuses unsafe archives unless --force is passed. An adopted worktree is kept unless --remove-worktree is passed, which applies the same safety check and removal. The local branch is always kept. With --session and --merged, archives every Pane associated with the Session whose work is clean and pushed or merged, and reports a reason for each Pane it skips. Use --dry-run to print the evidence without mutating Pane state.", "", "Options:", " --pane <pane-id> Pane/session id to archive", " --source <user|agent> Mark mutation source", " --force Archive even if the pane has uncommitted, untracked, or unpushed changes", " --remove-worktree Also check and remove an adopted Pane's worktree (the branch is kept)", " --session <id|name> Archive the Panes associated with this Session (requires --merged)", " --merged Only archive Panes that are clean and pushed, or merged via a PR", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Refresh and print archive safety evidence without archiving", " --yes Skip confirmation for mutating commands"]; readonly "panes pin": readonly ["Usage:", " runpane panes pin --pane <pane-id> --yes [--dry-run] [--json]", "", "Declaratively pins a Pane using the Pane UI's favorite/pin star. Repeating the command is idempotent and never changes focus. Use --dry-run to validate and preview without mutating.", "", "Options:", " --pane <pane-id> Pane/session id to pin", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without pinning the pane", " --yes Skip confirmation for mutating commands"]; readonly "panes unpin": readonly ["Usage:", " runpane panes unpin --pane <pane-id> --yes [--dry-run] [--json]", "", "Declaratively unpins a Pane using the Pane UI's favorite/pin star. Repeating the command is idempotent and never changes focus. Use --dry-run to validate and preview without mutating.", "", "Options:", " --pane <pane-id> Pane/session id to unpin", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without unpinning the pane", " --yes Skip confirmation for mutating commands"]; readonly "panes rename": readonly ["Usage:", " runpane panes rename --pane <pane-id> --name <new-name> --yes [--dry-run] [--json]", "", "Renames a Pane without changing its worktree, branch, panels, or focus. The name is trimmed like the Pane UI. Use --dry-run to validate and preview the updated pane without mutating.", "", "Options:", " --pane <pane-id> Pane/session id to rename", " --name <new-name> New non-empty Pane/session name", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without renaming the pane", " --yes Skip confirmation for mutating commands"]; readonly "panes focus": readonly ["Usage:", " runpane panes focus --pane <pane-id> [--panel <panel-id>] --source user|agent --yes [--json]", "", "Raises the Pane window and selects a Pane (and optionally one of its panels) exactly like clicking it in the UI. Steals window focus, so run it only on an explicit user request to open, focus, or show a Pane, never proactively.", "", "Options:", " --pane <pane-id> Pane/session id to focus", " --panel <panel-id> Optional panel/tab id inside the Pane to select", " --source <user|agent> Mutation source; does not change focus behavior", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --yes Skip confirmation for mutating commands"]; readonly panels: readonly ["Terminal-backed panel commands.", "", "Usage:", " runpane panels <command> [options]", "", "Commands:", " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [options]", " runpane panels open (--url <url>|--file <path>) [--split|--tab] --yes [--json]", " runpane panels list --pane <pane-id> [--json]", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", " runpane panels input --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]", " runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json]", "", "Run \"runpane help panels create\" or another command-specific topic for options."]; readonly "panels list": readonly ["Usage:", " runpane panels list --pane <pane-id> [--json]", "", "Lists tool panels in a Pane session.", "", "agentDetection says how Pane knows agentType: declared, command, process, or screen. launchCommand is the command the panel was launched with.", "resumeId is the saved agent session ID that reopens the panel; resumeSource says which rule uses it: agent-farm, configured, or agent.", "", "Options:", " --pane <pane-id> Pane/session id", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels output": readonly ["Usage:", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", "", "Reads bounded recent terminal output from a panel.", "", "Options:", " --panel <panel-id> Tool panel id", " --limit <count> Maximum recent output lines or records to read", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels input": readonly ["Usage:", " runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) --yes [--json]", "", "Sends exact input bytes to a terminal panel. Include a newline in the input when you mean Enter.", "", "Options:", " --panel <panel-id> Terminal panel id", " --text <text> Text bytes to send", " --keys <name,...> Keys to press: enter, escape, tab, up, down, ctrl-c, ...", " --input-file <path|-> Read input from a file or stdin", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --yes Skip confirmation for mutating commands"]; readonly "agent-context": readonly ["Usage:", " runpane agent-context [--json]", " runpane agent-context --command <command> [--json]", "", "Prints Pane command context for coding agents without requiring a running Pane app.", "", "Options:", " --command <command> Print the full definition for one runpane command", " --json Print machine-readable output", " --pane-dir <path> Accepted and ignored; agent-context never contacts Pane", "", "Examples:", " runpane agent-context", " runpane agent-context --json", " runpane agent-context --command \"panes create\"", " runpane agent-context --command \"panes create\" --json"]; readonly mcp: readonly ["Usage:", " runpane mcp [--toolsets <name,...>] [--read-only]", "", "Runs the Pane MCP server over stdio. Each runpane command with a JSON result becomes a tool that returns the same JSON as `runpane <command> --json`. Commands that need --yes take `yes: true` instead.", "Pane registers this server with Claude Code, Codex, and Cursor automatically (Settings > AI & Agents). To register it by hand:", " claude mcp add --scope user pane -- npx --yes runpane@latest mcp", " codex mcp add pane -- npx --yes runpane@latest mcp", "", "The MCP server ships in the npm package and inside the Pane app. The Python package does not include it.", "", "Options:", " --toolsets <name,...> core (default), all, read, repos, panes, panels, agents, sessions, git, docs, links, admin", " --read-only Serve only read-only tools"]; readonly "agents doctor": readonly ["Usage:", " runpane agents doctor --agent <codex|claude|cursor> [--repo <selector>] [--json]", "", "Diagnoses whether Codex or Claude is available in the same repository environment Pane will use.", "", "Options:", " --agent <codex|claude|cursor> Built-in agent command to diagnose", " --repo <selector> active, id, exact path, or saved repository name; defaults to active", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels screen": readonly ["Usage:", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", "", "Reads a compact current-screen view from a terminal panel. Prefers alternate-screen/TUI output and falls back to recent scrollback.", "", "Options:", " --panel <panel-id> Terminal panel id", " --limit <count> Maximum lines to return; defaults to 80", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels submit": readonly ["Usage:", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]", "", "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.", "", "For a Claude or Codex panel with no composer on screen, nothing is sent: the result is ok: false with blocked.kind composer-unknown.", "", "Multi-line or long (over 512 characters) text reaches a Claude or Codex composer as one bracketed paste: CRLF becomes LF, and the submit key goes as its own write once the paste has settled, even while the agent is working.", "", "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.", "", "Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.", "It returns once, with a compact result: outcome, ids, the report (state, summary,", "summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing", "report. Answer a blocked panel with `panels submit --no-expect-report`,", "then watch for the original result.", "", "Options:", " --panel <panel-id> Terminal panel id", " --text <text> Text to submit before Enter", " --input-file <path|-> Read text from a file or stdin before Enter", " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`", " --attach <file> Copy a file beside the prompt file and list it; repeatable", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --yes Skip confirmation for this mutating command", " --interrupt Stop the current turn, wait for idle, then submit the replacement"]; readonly "panels wait": readonly ["Usage:", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--contains <text>] [--timeout-ms <ms>] [--interval-ms <ms>] [--json]", "", "Polls a terminal panel until it is initialized, ready, idle, or contains text. Output is intentionally small and includes next-step guidance.", "", "Options:", " --panel <panel-id> Terminal panel id", " --for <condition> initialized, ready, idle, or text; defaults to ready for CLI panels and idle otherwise", " --contains <text> Text required for --for text; implies --for text when omitted", " --timeout-ms <milliseconds> Wait timeout; defaults to 30000", " --interval-ms <milliseconds> Poll interval; defaults to 500", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels create": readonly ["Create a terminal-backed tool panel inside an existing Pane session.", "", "Usage:", " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--title <title>] [--initial-input <text>] [--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]", " runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]", "", "Options:", " --pane <pane-id> Existing Pane session to add the panel to.", " --agent <codex|claude|cursor> Built-in agent command template, or with --tool-command the agent it runs.", " --tool-command <command> Custom terminal command to launch.", " --title <title> Panel title override.", " --initial-input, --prompt Initial input to send after the tool starts.", " --initial-input-file <path|-> Read initial input from a file or stdin.", " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.", " --attach <file> Copy a file beside the prompt file and list it; repeatable.", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --no-focus Create the panel in the background.", " --focus Explicitly focus the created panel.", " --source <user|agent> Mark the mutation source; agent implies background creation.", " --wait-ready Wait for the agent's input box, then deliver and verify the prompt.", " --ready-timeout-ms <ms> Readiness wait timeout.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "panels open": readonly ["Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default.", "", "Usage:", " runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]", "", "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.", "", "Options:", " --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.", " --url <url> http(s) or file URL to open in a browser tab.", " --file <path> File inside the Pane worktree (relative, Linux, Windows, or WSL UNC path).", " --title <title> Tab title override.", " --split Open in split view beside the agent (default).", " --tab Open in the current tab group instead.", " --no-focus Open without selecting the tab.", " --focus Select the tab (default); never raises the window.", " --source <user|agent> Mutation source.", " --pane-dir <path> Connect to a specific Pane data directory.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "panels submit-composer": readonly ["Submit an agent composer using the panel-appropriate key sequence.", "", "Usage:", " runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", "", "Options:", " --panel <panel-id> Terminal panel id.", " --strategy <strategy> Defaults to auto; Codex queues with Tab while working and submits with Enter when ready. auto retries once if the text is still in the composer.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "sessions list": readonly ["Usage:", "runpane sessions list [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions create": readonly ["Usage:", "runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output.", "", "JSON isPinned: true pins the Session; omitted or false leaves it unpinned.", "Create-time isPinned requires an updated Pane app; on older apps, use sessions pin after creation and read back the result."]; readonly "sessions get": readonly ["Usage:", "runpane sessions get --session <id|name> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions update": readonly ["Usage:", "runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output.", "", "JSON isPinned: true/false sets the Session pin star. Select the Session with --session, not a session field in JSON."]; readonly "sessions set-agent": readonly ["Usage:", "runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions associate": readonly ["Usage:", "runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions detach": readonly ["Usage:", "runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions overview": readonly ["Usage:", "runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "panes git-status": readonly ["Usage:", " runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]", "", "Read the git status of a Pane worktree: uncommitted, unpushed, and behind-main counts.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes commit": readonly ["Usage:", " runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", "", "Stage all changes in a Pane worktree and commit them.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --message <message> Commit message; the first line is the title.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes push": readonly ["Usage:", " runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Push a Pane branch to its remote.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes pull": readonly ["Usage:", " runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Pull the remote branch into a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes rebase-main": readonly ["Usage:", " runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Rebase a Pane branch onto the latest main branch.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes restore": readonly ["Usage:", " runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Restore an archived Pane, recreating its worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes squash-rebase": readonly ["Usage:", " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", "", "Squash a Pane branch into one commit and rebase it onto main.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --message <message> Commit message; the first line is the title.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stash": readonly ["Usage:", " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Stash uncommitted changes in a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stash-pop": readonly ["Usage:", " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Apply and drop the latest stash in a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes soft-reset": readonly ["Usage:", " runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Undo the last commit in a Pane, keeping its changes staged.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes fetch": readonly ["Usage:", " runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Fetch the remote for a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes run-script": readonly ["Usage:", " runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Run the repository's run script in a Pane.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stop-script": readonly ["Usage:", " runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Stop the run script running in a Pane.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes move": readonly ["Usage:", " runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]", "", "Move a Pane into a sidebar folder.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --folder <folder-id> Folder id from folders list.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "folders list": readonly ["Usage:", " runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]", "", "List the sidebar folders of a repository.", "", "Options:", " --repo <repo-id> Numeric repository id from repos list.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "folders create": readonly ["Usage:", " runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]", "", "Create a sidebar folder in a repository.", "", "Options:", " --repo <repo-id> Numeric repository id from repos list.", " --name <name> Folder name.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "links create": readonly ["Usage:", " runpane links create --pane <pane-id> [--panel <panel-id>] [--json]", " runpane links create --repo <repo-id> [--json]", " runpane links create --session <session-id> [--json]", "", "Build a pane:// link that opens a Pane, panel, repository, or Session in the Pane app.", "", "Options:", " --pane <pane-id> Pane to open.", " --panel <panel-id> Panel inside the Pane to select.", " --repo <repo-id> Repository id from repos list.", " --session <session-id> Session id or name from sessions list.", " --json Print machine-readable output."]; readonly "links open": readonly ["Usage:", " runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]", "", "Open a pane:// link in the running Pane app.", "", "Options:", " --url <pane-url> A pane://open link from links create.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "docs search": readonly ["Usage:", " runpane docs search --query <text> [--limit <count>] [--json]", "", "Search Pane's docs, runpane help, and the Pane Chat skills.", "", "Options:", " --query <text> Words to search for.", " --limit <count> Maximum results; defaults to 5.", " --json Print machine-readable output."]; readonly "docs read": readonly ["Usage:", " runpane docs read --doc <path> [--json]", "", "Read one Pane doc, help topic, or skill in full.", "", "Options:", " --doc <path> Path from docs search, such as docs/PANE_MCP.md.", " --json Print machine-readable output."]; readonly "agents start": readonly ["Usage:", " runpane agents start (--pane <pane-id> | --repo <selector> --name <name> [--base-branch <branch>]) (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> --yes [--json] [--pane-dir <path>]", "", "Start an agent on a task and wait until it is ready: as a new tab in an existing Pane with --pane <id> (review, audit, fix, QA), or in a new Pane with --repo and --name for new work.", "", "Options:", " --repo <selector> Repository: active, id, exact path, or saved name.", " --name <name> Name for the new Pane.", " --agent <codex|claude|cursor> Built-in agent to launch.", " --tool-command <command> Custom terminal command instead of a built-in agent.", " --prompt <task> The task to send once the agent is ready.", " --base-branch <branch> Branch to start the worktree from.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "agents status": readonly ["Usage:", " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]", "", "Check on an agent: whether it is working, ready, blocked, or idle, plus its current screen.", "", "Options:", " --pane <pane-id> Pane id; its agent panel is used.", " --panel <panel-id> Panel id.", " --limit <count> Screen lines to return; defaults to 40.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "agents send": readonly ["Usage:", " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> [--as-file-pointer] --yes [--json] [--pane-dir <path>]", "", "Send a follow-up message to an agent and confirm it was submitted.", "", "Options:", " --pane <pane-id> Pane id; its agent panel is used.", " --panel <panel-id> Panel id.", " --text <message> The message to submit.", " --as-file-pointer Write the message to a prompt file and send `Read and follow <path>`.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly sessions: readonly ["Usage:", " runpane sessions <list|create|get|update|set-agent|associate|detach|overview> [options]", "", "Use a named Session to keep context, activity, and evidence attached to one orchestration thread."]; readonly report: readonly ["Usage:", " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary <text>|--summary-file <path|->] [--question <text>] [--pane <pane-id> --panel <panel-id>] [--json] [--pane-dir <path>]", "", "Hands back a worker's structured report for its panel: the orchestrator receives it as an", "agent.report watch event and reads it in `agents status` and `sessions overview`.", "Inside a Pane terminal the panel comes from PANE_SESSION_ID and PANE_PANEL_ID.", "It prints how many watches were waiting and received it (\"Delivered to 1 waiting watcher.\"). With no Session and", "nobody waiting, the report is still stored: a named-cursor watch receives it when it next waits.", "", "Options:", " --state <state> ready, blocked, failed, or done", " --pr <number> Pull request number", " --head <sha> Head commit, 7-40 hex characters", " --summary <text> Summary text; up to 16,000 characters are kept", " --summary-file <path|-> Read the summary from a file or stdin", " --question <text> What you need answered; required with --state blocked", " --pane <pane-id> Pane id when not running inside a Pane terminal", " --panel <panel-id> Panel id when not running inside a Pane terminal", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Example:", " runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md"]; readonly notify: readonly ["Usage:", " runpane notify --ui <options|approve|ask|info> --title <text> [--context <text>] [--choices <json>] [--detail <text>] [--detail-label <text>] [--suggestions <json>] [--action <json>] [--json] [--pane-dir <path>]", " runpane notify --resume <id> [--json] [--pane-dir <path>]", "", "Asks the person a question, or tells them something, on screen wherever they are, and", "prints their answer. The call waits until they answer; --ui info returns at once.", "Inside a Pane terminal the question names its Pane from PANE_SESSION_ID and PANE_PANEL_ID.", "When Pane is not running it prints an unavailable result: ask in the terminal instead.", "", "Options:", " --ui <ui> options, approve, ask, or info", " --title <text> The question or update in one line", " --context <text> Background shown under Details", " --choices <json> options: 1 to 9 of [{\"label\":\"...\",\"detail\":\"...\",\"recommended\":true}]", " --detail <text> approve: the command or SQL to approve", " --detail-label <text> approve: label of the disclosure for --detail (default Show details)", " --suggestions <json> ask: suggested answers, such as [\"main\",\"release\"]", " --action <json> info: one button, such as {\"label\":\"Open PR\",\"url\":\"https://...\"}", " --resume <id> Keep waiting on a question an earlier call returned waiting for", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Example:", " runpane notify --ui options --title \"Which database?\" --choices '[{\"label\":\"Redis\",\"recommended\":true},{\"label\":\"SQLite\"}]'"]; readonly "panels resume": readonly ["Usage:", " runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]", " runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]", "", "Restarts a stopped terminal panel in the same panel, keeping its panel id. An agent panel", "relaunches with its resume command (Claude --resume <session>, codex resume <session>, Cursor", "--resume), the same restart the app runs when it shows the panel. Nothing takes focus. A panel", "whose agent exited back to its shell counts as stopped: its saved command runs again in that", "shell. A panel that is already running is left alone and reported as already-running.", "", "With --session or --all-stopped it resumes every stopped agent panel in that scope (a", "Session's associated Panes, or every Pane), --concurrency at a time, skips running ones,", "and returns one result per panel. With --wait-ready the resumed panels then wait together,", "and each result carries its own readiness and blocker. One panel failing does not stop the others.", "", "Options:", " --panel <panel-id> Terminal panel id", " --session <id|name> Resume the stopped agent panels of this Session's associated Panes", " --all-stopped Resume the stopped agent panels of every Pane", " --concurrency <count> Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10", " --wait-ready Wait until the resumed agent is ready; startup prompts come back as readiness.blocked", " --ready-timeout-ms <ms> Readiness wait timeout; resumed panels wait together; defaults to 30000", " --yes Skip the confirmation prompt", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Examples:", " runpane panels resume --panel <panel-id> --wait-ready --yes --json", " runpane panels resume --session <id|name> --wait-ready --yes --json"]; readonly "panels last-message": readonly ["Usage:", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]", "", "Reads a Claude or Codex agent's last reply from its transcript. It never scrapes the screen:", "without a transcript it reports transcript-unavailable and exits non-zero.", "", "Options:", " --panel <panel-id> Agent panel id", " --limit <count> Maximum characters to return; defaults to 20000 (the end is kept)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly lock: readonly ["Usage:", " runpane lock <acquire|release|list> [options]", "", "Named locks coordinate a resource shared between agents, such as one test account.", "The caller is the owner: the Pane and panel from $PANE_SESSION_ID and $PANE_PANEL_ID.", "A lock is scoped to the owner's Session when its Pane belongs to one; otherwise it is global.", "It is released on --ttl expiry, when the owner panel exits, or when the owner Pane is archived."]; readonly "lock acquire": readonly ["Usage:", "runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly "lock release": readonly ["Usage:", "runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly "lock list": readonly ["Usage:", "runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly loops: readonly ["Usage:", " runpane loops <list|create|update|run|pause|resume|delete> [options]", "", "Loops (scheduled tasks) start a new Pane in a fresh worktree on a cron schedule.", "A Session loop instead sends its prompt to a Session's agent each run.", "Loops are for large recurring jobs and run at most once an hour.", "For short waits, use your agent harness's own sleep and wake.", "Runs start only while Pane is running, in this machine's local time zone.", "", "Commands:", " runpane loops list [--json] [--pane-dir <path>]", " runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]", " runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]", " runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]", " runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]", " runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]", " runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly "loops list": readonly ["Usage:", "runpane loops list [--json] [--pane-dir <path>]", "", "List loops (scheduled tasks) with their schedule, next run, and recent runs.", "", "Options:", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops create": readonly ["Usage:", "runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]", "", "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.", "With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.", "A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.", "", "Options:", " --repo <selector> Repository: active, id, exact path, or saved name.", " --session <id|name|new> Session whose agent gets the prompt each run, instead of", " a new Pane; `new` creates a Session named after the loop.", " That agent then skips permission prompts for every message", " it gets, not only loop runs.", " --name <name> Loop name.", " --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.", " --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.", " Runs skip permission prompts.", " --tool-command <command> Command each run starts instead of an agent, such as", " ./scripts/nightly-report.sh. Project loops only. On Windows it runs", " in Pane's terminal shell, Git Bash by default, so write bash or", " `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.", " --prompt <text> Text typed into the agent or command after it starts; for a", " Session loop, the message sent to the Session's agent each run.", " --prompt-file <path|-> Read the prompt from a file or stdin.", " --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.", " --paused Create the loop paused.", " --dry-run Check the schedule and print what would be saved.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops update": readonly ["Usage:", "runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]", "", "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.", "With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.", "A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.", "", "Options:", " --loop <id> Loop to change; other flags replace its values.", " --repo <selector> Repository: active, id, exact path, or saved name.", " --session <id|name|new> Session whose agent gets the prompt each run, instead of", " a new Pane; `new` creates a Session named after the loop.", " That agent then skips permission prompts for every message", " it gets, not only loop runs.", " --name <name> Loop name.", " --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.", " --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.", " Runs skip permission prompts.", " --tool-command <command> Command each run starts instead of an agent, such as", " ./scripts/nightly-report.sh. Project loops only. On Windows it runs", " in Pane's terminal shell, Git Bash by default, so write bash or", " `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.", " --prompt <text> Text typed into the agent or command after it starts; for a", " Session loop, the message sent to the Session's agent each run.", " --prompt-file <path|-> Read the prompt from a file or stdin.", " --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.", " --dry-run Check the schedule and print what would be saved.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops run": readonly ["Usage:", "runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]", "", "Start a run of a loop now. The schedule stays the same.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops pause": readonly ["Usage:", "runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]", "", "Pause a loop: it starts no scheduled runs until resumed.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops resume": readonly ["Usage:", "runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]", "", "Resume a paused loop from its next scheduled time.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops delete": readonly ["Usage:", "runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]", "", "Delete a loop. It starts no more runs.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "workspace list": readonly ["Usage:", " runpane workspace list [--json] [--pane-dir <path>]", "", "List the machines on your tailnet, each with its owner, and whether each answers workspaces.", "", "Options:", " --json Print machine-readable output."]; readonly "workspace enable": readonly ["Usage:", " runpane workspace enable [--json] [--pane-dir <path>]", "", "Put this machine's Pane on your tailnet for runpane workspace (the default when Tailscale is signed in).", "", "Options:", " --json Print machine-readable output."]; readonly "workspace disable": readonly ["Usage:", " runpane workspace disable [--json] [--pane-dir <path>]", "", "Take this machine off runpane workspace and remove its tailscale serve handler on port 8443.", "", "Options:", " --json Print machine-readable output."]; readonly "workspace read": readonly ["Usage:", " runpane workspace [<machine>] read <path> [--json]", "", "Print a file from a machine on your tailnet; any path form works (C:\\..., /mnt/c/..., /home/..., ~/...).", "", "Options:", " <machine> Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.", " <path> Absolute path in any form; ~ is that machine's home.", " --json Print machine-readable output."]; readonly "workspace write": readonly ["Usage:", " runpane workspace [<machine>] write <path> [--json]", "", "Write stdin to a file on a machine on your tailnet, creating parent folders.", "", "Options:", " <machine> Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.", " <path> Absolute path in any form.", " --json Print machine-readable output."]; readonly "workspace exec": readonly ["Usage:", " runpane workspace <machine> exec [--cwd <path>] [--timeout-ms <ms>] [--json] -- <command>", "", "Run a command in another machine's shell and return stdout, stderr, the exit code, OS, and shell.", "", "Options:", " <machine> Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.", " --cwd <path> Working directory on that machine, in any path form; defaults to its home.", " --timeout-ms <milliseconds> Stop the command after this long (default 120000, at most 540000).", " --json Print machine-readable output.", " -- <command> The command line, run by that machine's shell."]; readonly handoff: readonly ["Usage:", " runpane handoff --template", " runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor|opencode>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--note-only] [--dry-run] [--json]", "", "Hand your task to another agent. You write the note (runpane handoff --template); the CLI checks it,", "makes sure your branch is pushed, sends the note to the destination, and starts the agent there.", "From a Pane tab, a handoff to the same agent (Claude, Codex, Cursor or OpenCode) carries your own session:", "another machine resumes a copy of it, this machine resumes a fork. The CLI then checks the receiver", "continued it (continued, inconclusive, or not-continued, which exits 1 and keeps the receiver).", "--note-only, another agent, or no session to carry starts a fresh agent with the note instead.", "From a Session's terminal it skips git and creates the Session on the other machine; a same-agent", "Session resumes your conversation when first opened, otherwise it reads the note. The sender Session stays.", "", "Options:", " <destination> Freeform: agent, model, effort, and machine, such as \"codex gpt-5 high on parsas-macbook-pro\".", " --template Print the note template, with this checkout's (or Session's) origin and git state filled in.", " --note-file <path|-> The note to check and send; every template section must be filled in.", " --machine <name> Destination machine (Tailscale name or unique prefix); overrides the text.", " --agent <codex|claude|cursor> Receiving agent; overrides the text.", " --model <model> Model for the receiving agent; overrides the text.", " --effort <level> minimal, low, medium, high, xhigh, or max; supported for Claude and Codex only; overrides the text. Cursor effort is rejected.", " --repo <selector> Saved repository on the destination; defaults to the one with the same remote.", " --push Commit uncommitted work (not the note) as WIP and push the branch first (never forces).", " --note-only Start a fresh agent with the note instead of carrying your own session.", " --dry-run Check destination reachability, saved repo and OS; print note and git state; send nothing. From a Session: the name it would get.", " --json Print machine-readable output.", "", "Examples:", " runpane handoff --template > ~/handoff.md", " runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md --push", " runpane handoff \"codex gpt-5 high on parsa-devbox\" --note-file ~/handoff.md --dry-run"]; readonly "sessions pin": readonly ["Usage:", "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]", "", "Set the named Session pin star on. Repeated requests keep that state. Uses the same Session update path as the UI."]; readonly "sessions unpin": readonly ["Usage:", "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]", "", "Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."]; readonly "pr watch": readonly ["runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]", "", "Register durable GitHub PR monitoring for a Pane."]; readonly "pr unwatch": readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]", "", "Remove a Pane’s explicit PR registration."]; readonly "pr list": readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]", "", "List PR registrations and stopped watches."]; readonly inbox: readonly ["Usage:", " runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]", "", "Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),", "missing reports (agent.report.missing), and questions waiting on a worker's screen", "(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across", "restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.", "", "Options:", " --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Clear handled items with `runpane inbox ack <item-id>...`."]; readonly "inbox ack": readonly ["Usage:", " runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]", " runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]", "", "Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.", "", "Options:", " --session <id|name> Only clear items of this Session; required with --all", " --all Clear every item of the Session", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; }; readonly pip: { readonly default: readonly ["Usage:", " runpane", " runpane setup", " runpane install [client|daemon] [options]", " runpane update [options]", " runpane version", " runpane doctor", " runpane doctor --report --body-file <path|->", " runpane daemon repair [--pane-dir <path>] [--yes] [--json]", " runpane agent-context [--json]", " runpane mcp [--toolsets <name,...>] [--read-only]", " runpane agents doctor --agent <codex|claude|cursor> [--repo <selector>] [--json]", " runpane repos list [--json]", " runpane repos add --path <path> [--name <name>]", " runpane panes list [--repo <selector>] [--json]", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", " runpane workspace state [--repo <selector>] [--json]", " runpane watch --follow", " runpane watch --until-event", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes", " python -m runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] --yes", " runpane panels list --pane <pane-id> [--json]", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", " runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) --yes [--json]", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]", " runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json]", " runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]", " runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", " runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane links create --pane <pane-id> [--panel <panel-id>] [--json]", " runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]", " runpane docs search --query <text> [--limit <count>] [--json]", " runpane docs read --doc <path> [--json]", " runpane agents start (--pane <pane-id> | --repo <selector> --name <name> [--base-branch <branch>]) (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> --yes [--json] [--pane-dir <path>]", " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]", " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]", " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]", " runpane notify --ui <options|approve|ask|info> --title <text> [--choices <json>] [--resume <id>] [--json]", " runpane inbox [--session <id|name>] [--json]", " runpane inbox ack <item-id>... [--session <id|name>] [--json]", " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", " runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]", " runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]", " runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]", " runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", " runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", " runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]", " python -m runpane loops list [--json]", " python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>] --yes", " python -m runpane loops update|run|pause|resume|delete --loop <id> --yes", " runpane help [command]", "", "Quick start:", " pipx run runpane", " python -m pip install runpane && python -m runpane setup", "", "Advanced examples:", " pipx run runpane install client", " pipx run runpane install daemon --label \"My Server\"", " uvx runpane@latest", "", "Common commands:", " runpane help", " runpane setup", " runpane install", " runpane doctor", "", "Agent discovery:", " runpane doctor --json", " runpane agent-context --json", " runpane agent-context --command \"<command>\" --json", "", "Run \"runpane help panes create\" for pane orchestration options."]; readonly install: readonly ["Usage:", " runpane install [client|daemon] [options]", "", "Examples:", " npx --yes runpane@latest install daemon --label \"My Server\"", " pnpm dlx runpane@latest install daemon --prefer-tunnel ssh --label \"VM\"", " pipx run runpane install daemon --label \"My Server\"", "", "Wrapper options:", " --version <latest|vX.Y.Z>", " --format <auto|appimage|deb|dmg|zip|exe>", " --download-dir <path>", " --pane-path <path>", " --dry-run", " --yes", " --verbose", "", "Daemon passthrough options:", " --label <name>", " --prefer-tunnel <tailscale|ssh|manual|auto>", " --channel <stable|nightly>", " --base-url <url>", " --pane-dir <path>", " --listen-port <port> / --port <port>", " --auto-listen-port", " --interactive-tailscale-setup", " --no-install-service", " --no-tailscale-serve", " --print-only", " --repo-ref <ref>"]; readonly setup: readonly ["Usage:", " runpane setup", "", "Opens the guided setup for desktop install, remote host setup, update, and diagnostics.", "", "Quick start:", " pipx run runpane", " python -m pip install runpane && python -m runpane setup"]; readonly update: readonly ["Usage:", " runpane update [--pane-only | --cli-only] [--version <latest|vX.Y.Z>] [--pane-dir <path>] [--dry-run] [--wait] [--json]", " runpane update --status <operation-id> [--wait] [--pane-dir <path>] [--json]", "", "Updates both Pane and the invoked supported CLI by default, on this machine.", "Preflight identifies the host and installation owner before downtime. The independent helper stages an app, CLI, and standalone Node runtime before stopping Pane.", "Status distinguishes acceptance, installed components, host health, and per-panel restoration. No prompts or uncertain actions are replayed.", "CLI-only updates do not restart Pane; a managed CLI pin survives later Pane startup.", "Use workspace <machine> exec -- runpane update for an explicit remote machine."]; readonly version: readonly ["Usage:", " runpane version [--pane-dir <path>]", " runpane --version"]; readonly doctor: readonly ["Usage:", " runpane doctor [--json] [--pane-dir <path>] [--pane-path <path>] [--format <format>] [--verbose]", " runpane doctor --report [--title <text>] --body-file <path|-> [--yes] [--json]", "", "Checks wrapper/runtime details, release metadata, installed Pane detection, and Pane daemon reachability.", "", "Options:", " --json", " --pane-dir <path>", " --pane-path <path>", " --format <format>", " --verbose", " --report", " --body-file <path|->", " --title <text>", " --yes", "", "Agent discovery:", " runpane doctor --json", " runpane agent-context --json"]; readonly "daemon repair": readonly ["Usage:", " runpane daemon repair [--pane-dir <path>] [--pane-path <path>] [--yes] [--json]", "", "Repairs and restarts only the managed remote-daemon launcher and service definition.", "", "Options:", " --pane-dir <path>", " --pane-path <path>", " --yes", " --json"]; readonly "repos list": readonly ["Usage:", " runpane repos list [--json] [--pane-dir <path>]", "", "Lists repositories saved in the running Pane app.", "", "Options:", " --json", " --pane-dir <path>"]; readonly "repos add": readonly ["Usage:", " runpane repos add --path <path> [--name <name>] [--json] [--yes]", "", "Registers an existing git repository with the running Pane app.", "", "Options:", " --path <path>", " --name <name>", " --pane-dir <path>", " --json", " --dry-run", " --yes"]; readonly panes: readonly ["Pane session commands.", "", "Usage:", " runpane panes <command> [options]", "", "Commands:", " runpane panes list [--repo <selector>] [--json]", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes archive --pane <pane-id> [--force] [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json]", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes [--json]", " runpane panes pin --pane <pane-id> --yes [--dry-run] [--json]", " runpane panes unpin --pane <pane-id> --yes [--dry-run] [--json]", " runpane panes rename --pane <pane-id> --name <new-name> --yes [--dry-run] [--json]", "", "Run \"runpane help panes <command>\" for command-specific options."]; readonly "panes list": readonly ["Usage:", " runpane panes list [--repo <selector>] [--json]", "", "Lists Pane sessions. Pass --repo to limit results to one saved repository.", "", "status is running while a tool or agent terminal is live; the dock shell does not count. agentState is the most urgent state of the live agent panels: blocked, working, ready, or none.", "", "Options:", " --repo <selector>", " --pane-dir <path>", " --json"]; readonly "panes cost": readonly ["Usage:", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", "", "Reports estimated token costs per Pane for the last 30 days, including per-model and cache-efficiency details.", "", "Options:", " --repo <selector>", " --pane <pane-id>", " --pane-dir <path>", " --json"]; readonly workspace: readonly ["Workspace commands: this machine's Panes, and your other machines over Tailscale.", "", "Usage:", " runpane workspace state [--repo <selector>] [--json]", " runpane watch --follow", "", "runpane workspace list|read|write|exec|enable|disable ship in the npm package: npx --yes runpane@latest workspace list"]; readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."]; readonly watch: readonly ["Usage:", " runpane watch Print what changed since your cursor, then exit", " runpane watch --follow Keep watching, tuned for an agent watching unattended", " runpane watch --until-event Wait for one event worth waking for, print it, exit 0", "", "Waits for agent, Pane, panel, and PR events from the daemon without polling.", "", "What --follow does by default (see defaults.watch.follow in the contract):", " prints WATCH OK once when armed, then one line per event, with no heartbeats", " kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,", " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,", " pr.base_changed, pr.base_deleted", " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m", " (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)", " IDLE reminders at 10m, 30m, 1h, 3h, then daily", " ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE", "", "What --until-event does by default: waits for agent.report, agent.blocked, panel.exited,", "or pane.gone, prints that one line, and exits 0. Run it as a background task, act on", "its line, then run it again; its named cursor means nothing is missed between runs.", "Single-event waits deliver immediately without follow settling or batching.", "--follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since.", "agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:", "add it to --kinds to wake on MISSING REPORT too.", "", "Options:", " --session <id|name> Watch every Pane in a Session; associate/detach apply live", " --pane <id> Watch one Pane; repeatable (default: every managed Pane)", " --exclude-pane <id> Leave out a Pane; repeatable", " --repo <selector> Limit to a saved repository", " --name-contains <text> Limit by Pane name substring", " --include-shells Include plain shell panels (default: agent panels only)", " --kinds <kind,...> Replace the default event kinds", " --json One JSON object per line", " --as <name> Name the cursor (default: from --session or this panel)", " --since <generation> Use an explicit cursor instead of a name", " --epoch <epoch> Pair with --since to detect journal resets", " --from <now|earliest> Where a new named cursor starts (default: now)", " --self-test Check the daemon watch path and exit", "", "Overrides (durations such as 30s, 10m, 3h; a bare number is milliseconds; 0 turns it off):", " --ready-settle <duration> Quiet time before READY (default 3m)", " --blocked-settle <duration> Time before BLOCKED (default 30s)", " --min-interval <duration> Batch window for non-urgent lines (default 10m)", " --idle-after <duration> First IDLE reminder (default 10m)", " --expire-after <duration> End after this long with nothing but IDLE (default 3h)", " --heartbeat <duration> Print a HEARTBEAT line this often (default off)", " --timeout-ms <duration> Per-request wait; with --until-event, the total deadline (exit 124)", " --limit <count> Maximum entries per response", " --ack-now At-most-once cursor delivery", " --include-held-input Include unsubmitted composer text in JSON", " --no-held-input Turn off STUCK detection", " --pane-dir <path> Connect to a specific Pane data directory", "", "How a watch ends: WATCH EXPIRED (exit 0) means nothing happened; arm a new one with the next", "dispatch. A non-zero exit or a WATCH ERROR line means it failed: say so and re-arm once. Judge", "a watch by WATCH OK and these endings, never by silence. Never pipe --follow into grep -m1 or head.", "STUCK means real unsubmitted composer text; a prompt suggestion never counts."]; readonly "panes create": readonly ["Usage:", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options]", " python -m runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options]", " runpane panes create --from-json <path|-> [--yes] [--json]", "", "Creates a Pane in a saved repository and opens a terminal-backed tool tab. 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create one only when the work's branch has no Pane yet; for existing work use `runpane panels create --pane <id>`.", "", "A long or multi-line prompt is never typed into the shell: on bash, zsh or sh the agent launches with `\"$(cat '<prompt file>')\"` reading a private copy under `<pane-dir>/prompts/<pane-id>/`; on PowerShell, cmd, fish or WSL the prompt is pasted into the agent's composer once it is ready.", "", "Options:", " --repo <selector> active, id, exact path, or saved repository name", " --name <name> Pane/session name", " --worktree-name <name> Worktree directory name; defaults to --name", " --branch <name> Exact new branch name (slashes kept); must not exist; defaults to the worktree name", " --base-branch <ref> Ref to branch from; --base is an alias", " --agent <codex|claude|cursor> Built-in terminal template; with --tool-command, the agent it runs", " --tool-command <command> Custom terminal command", " --title <title> Terminal tab title", " --initial-input <text> Text sent after the command is ready", " --prompt <text> Alias for --initial-input", " --initial-input-file <path|-> Read initial input from a file or stdin", " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt", " --attach <file> Copy a file beside the prompt file and list it; repeatable", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --prompt-file <path|-> Alias for --initial-input-file", " --from-json <path|-> Read a full request payload", " --timeout-ms <milliseconds> Pane creation timeout", " --wait-ready Wait for the agent's input box, then deliver and verify the prompt", " --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000", " --concurrency <count> Accepted; creation is currently serialized", " --source <user|agent> Mark mutation source; agent implies background creation", " --no-focus Create in the background without stealing focus", " --focus Explicitly focus the created pane", " --pinned Request pinning at creation; first Session association clears it", " --no-pinned Create unpinned (the UI's favorite/pin star)", " --no-associate Inside a Session orchestrator, do not associate the new pane with that Session", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without creating panes", " --yes Skip confirmation for mutating commands", "", "Outside a Session, creation pins by default, including --source agent. Inside a Session (PANE_ORCHESTRATION_SESSION_ID), children default to unpinned to avoid duplicating them in the global pinned list. First Session association clears the creation pin, including --pinned; use panes pin afterward to pin an associated child."]; readonly "panes adopt": readonly ["Usage:", " runpane panes adopt --repo <selector> --path <dir> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes adopt --repo <selector> --path <dir> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [options]", "", "Adopts an existing externally managed git worktree without creating, syncing, or deleting it. Archiving only removes its worktree with `panes archive --remove-worktree`. To start new work on a named branch, use `panes create --base <ref> --branch <name>` instead of `git worktree add` plus adopt.", "", "Options: --resume <id> stages the agent resume command (built-in agents only); --launch runs the command immediately; --prompt <text> or --prompt-file <path|-> and --wait-ready require --launch; --folder <name> groups the pane; --no-pinned opts out of pinning; --no-associate skips automatic Session association; --dry-run previews.", "", "With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."]; readonly "panes archive": readonly ["Usage:", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes [--json]", " runpane panes archive --session <id|name> --merged [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json]", "", "Archives a Pane (session) exactly like the UI Archive action, including removal of its Pane-managed git worktree. Refreshes the configured upstream before checking for unpushed commits and reports exact commit evidence. When the branch has no upstream or its upstream is gone, a merged GitHub pull request whose head is HEAD (found with `gh`) counts as pushed. Refuses unsafe archives unless --force is passed. An adopted worktree is kept unless --remove-worktree is passed, which applies the same safety check and removal. The local branch is always kept. With --session and --merged, archives every Pane associated with the Session whose work is clean and pushed or merged, and reports a reason for each Pane it skips. Use --dry-run to print the evidence without mutating Pane state.", "", "Options:", " --pane <pane-id>", " --source <user|agent>", " --force", " --remove-worktree", " --session <id|name>", " --merged", " --pane-dir <path>", " --json", " --dry-run", " --yes"]; readonly "panes pin": readonly ["Usage:", " runpane panes pin --pane <pane-id> --yes [--dry-run] [--json]", "", "Declaratively pins a Pane using the Pane UI's favorite/pin star. Repeating the command is idempotent and never changes focus. Use --dry-run to validate and preview without mutating.", "", "Options:", " --pane <pane-id>", " --pane-dir <path>", " --json", " --dry-run", " --yes"]; readonly "panes unpin": readonly ["Usage:", " runpane panes unpin --pane <pane-id> --yes [--dry-run] [--json]", "", "Declaratively unpins a Pane using the Pane UI's favorite/pin star. Repeating the command is idempotent and never changes focus. Use --dry-run to validate and preview without mutating.", "", "Options:", " --pane <pane-id>", " --pane-dir <path>", " --json", " --dry-run", " --yes"]; readonly "panes rename": readonly ["Usage:", " runpane panes rename --pane <pane-id> --name <new-name> --yes [--dry-run] [--json]", "", "Renames a Pane without changing its worktree, branch, panels, or focus. The name is trimmed like the Pane UI. Use --dry-run to validate and preview the updated pane without mutating.", "", "Options:", " --pane <pane-id>", " --name <new-name>", " --pane-dir <path>", " --json", " --dry-run", " --yes"]; readonly "panes focus": readonly ["Usage:", " runpane panes focus --pane <pane-id> [--panel <panel-id>] --source user|agent --yes [--json]", "", "Raises the Pane window and selects a Pane (and optionally one of its panels) exactly like clicking it in the UI. Steals window focus, so run it only on an explicit user request to open, focus, or show a Pane, never proactively.", "", "Options:", " --pane <pane-id>", " --panel <panel-id>", " --source <user|agent>", " --pane-dir <path>", " --json", " --yes"]; readonly panels: readonly ["Terminal-backed panel commands.", "", "Usage:", " runpane panels <command> [options]", "", "Commands:", " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [options]", " runpane panels open (--url <url>|--file <path>) [--split|--tab] --yes [--json]", " runpane panels list --pane <pane-id> [--json]", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", " runpane panels input --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]", " runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]", " runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json]", "", "Run \"runpane help panels create\" or another command-specific topic for options."]; readonly "panels list": readonly ["Usage:", " runpane panels list --pane <pane-id> [--json]", "", "Lists tool panels in a Pane session.", "", "agentDetection says how Pane knows agentType: declared, command, process, or screen. launchCommand is the command the panel was launched with.", "resumeId is the saved agent session ID that reopens the panel; resumeSource says which rule uses it: agent-farm, configured, or agent.", "", "Options:", " --pane <pane-id>", " --pane-dir <path>", " --json"]; readonly "panels output": readonly ["Usage:", " runpane panels output --panel <panel-id> [--limit <count>] [--json]", "", "Reads recent terminal output records from a panel.", "", "Options:", " --panel <panel-id>", " --limit <count>", " --pane-dir <path>", " --json"]; readonly "panels input": readonly ["Usage:", " runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) --yes [--json]", "", "Sends exact input bytes to a terminal panel. Include a newline in the input when you mean Enter.", "", "Options:", " --panel <panel-id>", " --text <text>", " --keys <name,...> Keys to press: enter, escape, tab, up, down, ctrl-c, ...", " --input-file <path|->", " --pane-dir <path>", " --json", " --yes"]; readonly "agent-context": readonly ["Usage:", " runpane agent-context [--json]", " runpane agent-context --command <command> [--json]", "", "Prints Pane command context for coding agents without requiring a running Pane app.", "", "Options:", " --command <command>", " --json", " --pane-dir <path> Accepted and ignored", "", "Examples:", " runpane agent-context", " runpane agent-context --json", " runpane agent-context --command \"panes create\"", " runpane agent-context --command \"panes create\" --json"]; readonly mcp: readonly ["Usage:", " runpane mcp", "", "The Pane MCP server ships in the npm package and inside the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest mcp"]; readonly "agents doctor": readonly ["Usage:", " runpane agents doctor --agent <codex|claude|cursor> [--repo <selector>] [--json]", "", "Diagnoses whether Codex or Claude is available in the same repository environment Pane will use.", "", "Options:", " --agent <codex|claude|cursor> Built-in agent command to diagnose", " --repo <selector> active, id, exact path, or saved repository name; defaults to active", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels screen": readonly ["Usage:", " runpane panels screen --panel <panel-id> [--limit <count>] [--json]", "", "Reads a compact current-screen view from a terminal panel. Prefers alternate-screen/TUI output and falls back to recent scrollback.", "", "Options:", " --panel <panel-id> Terminal panel id", " --limit <count> Maximum lines to return; defaults to 80", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels submit": readonly ["Usage:", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]", "", "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.", "", "For a Claude or Codex panel with no composer on screen, nothing is sent: the result is ok: false with blocked.kind composer-unknown.", "", "Multi-line or long (over 512 characters) text reaches a Claude or Codex composer as one bracketed paste: CRLF becomes LF, and the submit key goes as its own write once the paste has settled, even while the agent is working.", "", "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.", "", "Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.", "It returns once, with a compact result: outcome, ids, the report (state, summary,", "summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing", "report. Answer a blocked panel with `panels submit --no-expect-report`,", "then watch for the original result.", "", "Options:", " --panel <panel-id> Terminal panel id", " --text <text> Text to submit before Enter", " --input-file <path|-> Read text from a file or stdin before Enter", " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`", " --attach <file> Copy a file beside the prompt file and list it; repeatable", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --yes Skip confirmation for this mutating command", " --interrupt Stop the current turn, wait for idle, then submit the replacement"]; readonly "panels wait": readonly ["Usage:", " runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--contains <text>] [--timeout-ms <ms>] [--interval-ms <ms>] [--json]", "", "Polls a terminal panel until it is initialized, ready, idle, or contains text. Output is intentionally small and includes next-step guidance.", "", "Options:", " --panel <panel-id> Terminal panel id", " --for <condition> initialized, ready, idle, or text; defaults to ready for CLI panels and idle otherwise", " --contains <text> Text required for --for text; implies --for text when omitted", " --timeout-ms <milliseconds> Wait timeout; defaults to 30000", " --interval-ms <milliseconds> Poll interval; defaults to 500", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly "panels create": readonly ["Create a terminal-backed tool panel inside an existing Pane session.", "", "Usage:", " python -m runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--title <title>] [--initial-input <text>] [--no-focus] [--wait-ready] --yes [--json]", " python -m runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--no-focus] [--wait-ready] --yes [--json]", "", "Options:", " --pane <pane-id> Existing Pane session to add the panel to.", " --agent <codex|claude|cursor> Built-in agent command template, or with --tool-command the agent it runs.", " --tool-command <command> Custom terminal command to launch.", " --title <title> Panel title override.", " --initial-input, --prompt Initial input to send after the tool starts.", " --initial-input-file <path|-> Read initial input from a file or stdin.", " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.", " --attach <file> Copy a file beside the prompt file and list it; repeatable.", " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)", " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting", " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;", " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)", " --timeout <duration> With --wait: give up after this long (30m, 2h)", " --no-focus Create the panel in the background.", " --focus Explicitly focus the created panel.", " --source <user|agent> Mark the mutation source; agent implies background creation.", " --wait-ready Wait for the agent's input box, then deliver and verify the prompt.", " --ready-timeout-ms <ms> Readiness wait timeout.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "panels open": readonly ["Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default.", "", "Usage:", " python -m runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]", "", "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.", "", "Options:", " --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.", " --url <url> http(s) or file URL to open in a browser tab.", " --file <path> File inside the Pane worktree (relative, Linux, Windows, or WSL UNC path).", " --title <title> Tab title override.", " --split Open in split view beside the agent (default).", " --tab Open in the current tab group instead.", " --no-focus Open without selecting the tab.", " --focus Select the tab (default); never raises the window.", " --source <user|agent> Mutation source.", " --pane-dir <path> Connect to a specific Pane data directory.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "panels submit-composer": readonly ["Submit an agent composer using the panel-appropriate key sequence.", "", "Usage:", " python -m runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]", "", "Options:", " --panel <panel-id> Terminal panel id.", " --strategy <strategy> Defaults to auto; Codex queues with Tab while working and submits with Enter when ready. auto retries once if the text is still in the composer.", " --yes Skip confirmation prompts.", " --json Print JSON output."]; readonly "sessions list": readonly ["Usage:", "python -m runpane sessions list [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions create": readonly ["Usage:", "python -m runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output.", "", "JSON isPinned: true pins the Session; omitted or false leaves it unpinned.", "Create-time isPinned requires an updated Pane app; on older apps, use sessions pin after creation and read back the result."]; readonly "sessions get": readonly ["Usage:", "python -m runpane sessions get --session <id|name> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions update": readonly ["Usage:", "python -m runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output.", "", "JSON isPinned: true/false sets the Session pin star. Select the Session with --session, not a session field in JSON."]; readonly "sessions set-agent": readonly ["Usage:", "python -m runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions associate": readonly ["Usage:", "python -m runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions detach": readonly ["Usage:", "python -m runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "sessions overview": readonly ["Usage:", "python -m runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]", "", "Options:", " --session <id|name> Named Session id or exact name.", " --from-json <path|-> Read structured JSON from a file or stdin.", " --pane <pane-id> User-visible Pane to associate or detach.", " --agent <codex|claude|cursor> Agent terminal to use.", " --json Print JSON output."]; readonly "panes git-status": readonly ["Usage:", " runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]", "", "Read the git status of a Pane worktree: uncommitted, unpushed, and behind-main counts.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes commit": readonly ["Usage:", " runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", "", "Stage all changes in a Pane worktree and commit them.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --message <message> Commit message; the first line is the title.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes push": readonly ["Usage:", " runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Push a Pane branch to its remote.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes pull": readonly ["Usage:", " runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Pull the remote branch into a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes rebase-main": readonly ["Usage:", " runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Rebase a Pane branch onto the latest main branch.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes restore": readonly ["Usage:", " runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Restore an archived Pane, recreating its worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes squash-rebase": readonly ["Usage:", " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]", "", "Squash a Pane branch into one commit and rebase it onto main.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --message <message> Commit message; the first line is the title.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stash": readonly ["Usage:", " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Stash uncommitted changes in a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stash-pop": readonly ["Usage:", " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Apply and drop the latest stash in a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes soft-reset": readonly ["Usage:", " runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Undo the last commit in a Pane, keeping its changes staged.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes fetch": readonly ["Usage:", " runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Fetch the remote for a Pane worktree.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes run-script": readonly ["Usage:", " runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Run the repository's run script in a Pane.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes stop-script": readonly ["Usage:", " runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]", "", "Stop the run script running in a Pane.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "panes move": readonly ["Usage:", " runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]", "", "Move a Pane into a sidebar folder.", "", "Options:", " --pane <pane-id> Pane id from panes list or agents start.", " --folder <folder-id> Folder id from folders list.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "folders list": readonly ["Usage:", " runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]", "", "List the sidebar folders of a repository.", "", "Options:", " --repo <repo-id> Numeric repository id from repos list.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "folders create": readonly ["Usage:", " runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]", "", "Create a sidebar folder in a repository.", "", "Options:", " --repo <repo-id> Numeric repository id from repos list.", " --name <name> Folder name.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "links create": readonly ["Usage:", " runpane links create --pane <pane-id> [--panel <panel-id>] [--json]", " runpane links create --repo <repo-id> [--json]", " runpane links create --session <session-id> [--json]", "", "Build a pane:// link that opens a Pane, panel, repository, or Session in the Pane app.", "", "Options:", " --pane <pane-id> Pane to open.", " --panel <panel-id> Panel inside the Pane to select.", " --repo <repo-id> Repository id from repos list.", " --session <session-id> Session id or name from sessions list.", " --json Print machine-readable output."]; readonly "links open": readonly ["Usage:", " runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]", "", "Open a pane:// link in the running Pane app.", "", "Options:", " --url <pane-url> A pane://open link from links create.", " --yes Confirm this change; required in non-interactive shells.", " --json Print machine-readable output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "docs search": readonly ["Usage:", " runpane docs search --query <text> [--limit <count>] [--json]", "", "`runpane docs search` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest docs search"]; readonly "docs read": readonly ["Usage:", " runpane docs read --doc <path> [--json]", "", "`runpane docs read` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest docs read"]; readonly "agents start": readonly ["Usage:", " runpane agents start (--pane <pane-id> | --repo <selector> --name <name> [--base-branch <branch>]) (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> --yes [--json] [--pane-dir <path>]", "", "`runpane agents start` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest agents start"]; readonly "agents status": readonly ["Usage:", " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]", "", "`runpane agents status` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest agents status"]; readonly "agents send": readonly ["Usage:", " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> [--as-file-pointer] --yes [--json] [--pane-dir <path>]", "", "`runpane agents send` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest agents send"]; readonly sessions: readonly ["Usage:", " runpane sessions <list|create|get|update|set-agent|associate|detach|overview> [options]", "", "Use a named Session to keep context, activity, and evidence attached to one orchestration thread."]; readonly report: readonly ["Usage:", " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary <text>|--summary-file <path|->] [--question <text>] [--pane <pane-id> --panel <panel-id>] [--json] [--pane-dir <path>]", "", "Hands back a worker's structured report for its panel: the orchestrator receives it as an", "agent.report watch event and reads it in `agents status` and `sessions overview`.", "Inside a Pane terminal the panel comes from PANE_SESSION_ID and PANE_PANEL_ID.", "It prints how many watches were waiting and received it (\"Delivered to 1 waiting watcher.\"). With no Session and", "nobody waiting, the report is still stored: a named-cursor watch receives it when it next waits.", "", "Options:", " --state <state> ready, blocked, failed, or done", " --pr <number> Pull request number", " --head <sha> Head commit, 7-40 hex characters", " --summary <text> Summary text; up to 16,000 characters are kept", " --summary-file <path|-> Read the summary from a file or stdin", " --question <text> What you need answered; required with --state blocked", " --pane <pane-id> Pane id when not running inside a Pane terminal", " --panel <panel-id> Panel id when not running inside a Pane terminal", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Example:", " runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md"]; readonly notify: readonly ["Usage:", " runpane notify --ui <options|approve|ask|info> --title <text> [--context <text>] [--choices <json>] [--detail <text>] [--detail-label <text>] [--suggestions <json>] [--action <json>] [--json] [--pane-dir <path>]", " runpane notify --resume <id> [--json] [--pane-dir <path>]", "", "Asks the person a question, or tells them something, on screen wherever they are, and", "prints their answer. The call waits until they answer; --ui info returns at once.", "Inside a Pane terminal the question names its Pane from PANE_SESSION_ID and PANE_PANEL_ID.", "When Pane is not running it prints an unavailable result: ask in the terminal instead.", "", "Options:", " --ui <ui> options, approve, ask, or info", " --title <text> The question or update in one line", " --context <text> Background shown under Details", " --choices <json> options: 1 to 9 of [{\"label\":\"...\",\"detail\":\"...\",\"recommended\":true}]", " --detail <text> approve: the command or SQL to approve", " --detail-label <text> approve: label of the disclosure for --detail (default Show details)", " --suggestions <json> ask: suggested answers, such as [\"main\",\"release\"]", " --action <json> info: one button, such as {\"label\":\"Open PR\",\"url\":\"https://...\"}", " --resume <id> Keep waiting on a question an earlier call returned waiting for", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Example:", " runpane notify --ui options --title \"Which database?\" --choices '[{\"label\":\"Redis\",\"recommended\":true},{\"label\":\"SQLite\"}]'"]; readonly "panels resume": readonly ["Usage:", " runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]", " runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]", "", "Restarts a stopped terminal panel in the same panel, keeping its panel id. An agent panel", "relaunches with its resume command (Claude --resume <session>, codex resume <session>, Cursor", "--resume), the same restart the app runs when it shows the panel. Nothing takes focus. A panel", "whose agent exited back to its shell counts as stopped: its saved command runs again in that", "shell. A panel that is already running is left alone and reported as already-running.", "", "With --session or --all-stopped it resumes every stopped agent panel in that scope (a", "Session's associated Panes, or every Pane), --concurrency at a time, skips running ones,", "and returns one result per panel. With --wait-ready the resumed panels then wait together,", "and each result carries its own readiness and blocker. One panel failing does not stop the others.", "", "Options:", " --panel <panel-id> Terminal panel id", " --session <id|name> Resume the stopped agent panels of this Session's associated Panes", " --all-stopped Resume the stopped agent panels of every Pane", " --concurrency <count> Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10", " --wait-ready Wait until the resumed agent is ready; startup prompts come back as readiness.blocked", " --ready-timeout-ms <ms> Readiness wait timeout; resumed panels wait together; defaults to 30000", " --yes Skip the confirmation prompt", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Examples:", " runpane panels resume --panel <panel-id> --wait-ready --yes --json", " runpane panels resume --session <id|name> --wait-ready --yes --json"]; readonly "panels last-message": readonly ["Usage:", " runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]", "", "Reads a Claude or Codex agent's last reply from its transcript. It never scrapes the screen:", "without a transcript it reports transcript-unavailable and exits non-zero.", "", "Options:", " --panel <panel-id> Agent panel id", " --limit <count> Maximum characters to return; defaults to 20000 (the end is kept)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; readonly lock: readonly ["Usage:", " python -m runpane lock <acquire|release|list> [options]", "", "Named locks coordinate a resource shared between agents, such as one test account.", "The caller is the owner: the Pane and panel from $PANE_SESSION_ID and $PANE_PANEL_ID.", "A lock is scoped to the owner's Session when its Pane belongs to one; otherwise it is global.", "It is released on --ttl expiry, when the owner panel exits, or when the owner Pane is archived."]; readonly "lock acquire": readonly ["Usage:", "python -m runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly "lock release": readonly ["Usage:", "python -m runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly "lock list": readonly ["Usage:", "python -m runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]", "", "Options:", " --name <name> Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\".", " --ttl <duration> Time to live, such as 90s, 30m, or 2h; a bare number is milliseconds.", " --wait <milliseconds> Wait this long for a held lock to come free (acquire).", " --note <text> What the lock is for; outside a Pane it also names the owner.", " --pane <pane-id> Act for this Pane instead of $PANE_SESSION_ID.", " --panel <panel-id> Act for this panel instead of $PANE_PANEL_ID.", " --force Release a lock another owner holds (release).", " --session <id|name> Named Session whose locks to list or release.", " --json Print JSON output."]; readonly loops: readonly ["Usage:", " python -m runpane loops <list|create|update|run|pause|resume|delete> [options]", "", "Loops (scheduled tasks) start a new Pane in a fresh worktree on a cron schedule.", "A Session loop instead sends its prompt to a Session's agent each run.", "Loops are for large recurring jobs and run at most once an hour.", "For short waits, use your agent harness's own sleep and wake.", "Runs start only while Pane is running, in this machine's local time zone.", "", "Commands:", " python -m runpane loops list [--json] [--pane-dir <path>]", " python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]", " python -m runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]", " python -m runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]", " python -m runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]", " python -m runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]", " python -m runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]"]; readonly "loops list": readonly ["Usage:", "python -m runpane loops list [--json] [--pane-dir <path>]", "", "List loops (scheduled tasks) with their schedule, next run, and recent runs.", "", "Options:", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops create": readonly ["Usage:", "python -m runpane loops create (--repo <selector>|--session <id|name|new>) --name <name> --cron <expr> (--agent <claude|codex|cursor>|--tool-command <command>) [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--paused] [--dry-run] --yes [--json] [--pane-dir <path>]", "", "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.", "With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.", "A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.", "", "Options:", " --repo <selector> Repository: active, id, exact path, or saved name.", " --session <id|name|new> Session whose agent gets the prompt each run, instead of", " a new Pane; `new` creates a Session named after the loop.", " That agent then skips permission prompts for every message", " it gets, not only loop runs.", " --name <name> Loop name.", " --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.", " --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.", " Runs skip permission prompts.", " --tool-command <command> Command each run starts instead of an agent, such as", " ./scripts/nightly-report.sh. Project loops only. On Windows it runs", " in Pane's terminal shell, Git Bash by default, so write bash or", " `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.", " --prompt <text> Text typed into the agent or command after it starts; for a", " Session loop, the message sent to the Session's agent each run.", " --prompt-file <path|-> Read the prompt from a file or stdin.", " --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.", " --paused Create the loop paused.", " --dry-run Check the schedule and print what would be saved.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops update": readonly ["Usage:", "python -m runpane loops update --loop <id> [--repo <selector>|--session <id|name|new>] [--name <name>] [--cron <expr>] [--agent <claude|codex|cursor>|--tool-command <command>] [--prompt <text>|--prompt-file <path|->] [--worktree-name <template>] [--dry-run] --yes [--json] [--pane-dir <path>]", "", "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake.", "With --repo, each run is a new Pane in a fresh worktree from the repo's default base branch.", "A Session loop sends its prompt to that Session's agent each run instead of creating a new Pane.", "", "Options:", " --loop <id> Loop to change; other flags replace its values.", " --repo <selector> Repository: active, id, exact path, or saved name.", " --session <id|name|new> Session whose agent gets the prompt each run, instead of", " a new Pane; `new` creates a Session named after the loop.", " That agent then skips permission prompts for every message", " it gets, not only loop runs.", " --name <name> Loop name.", " --cron <expr> Five-field cron in local time, such as \"0 3 * * *\"; at least 1 hour apart.", " --agent <claude|codex|cursor> Agent each run starts; for a Session loop, the Session's agent.", " Runs skip permission prompts.", " --tool-command <command> Command each run starts instead of an agent, such as", " ./scripts/nightly-report.sh. Project loops only. On Windows it runs", " in Pane's terminal shell, Git Bash by default, so write bash or", " `cmd //c`: \"cmd //c echo hi > loop.txt\" works, \"cmd /c ...\" hangs.", " --prompt <text> Text typed into the agent or command after it starts; for a", " Session loop, the message sent to the Session's agent each run.", " --prompt-file <path|-> Read the prompt from a file or stdin.", " --worktree-name <template> Worktree and branch name; defaults to loop-<name>. Project loops only.", " --dry-run Check the schedule and print what would be saved.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops run": readonly ["Usage:", "python -m runpane loops run --loop <id> --yes [--json] [--pane-dir <path>]", "", "Start a run of a loop now. The schedule stays the same.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops pause": readonly ["Usage:", "python -m runpane loops pause --loop <id> --yes [--json] [--pane-dir <path>]", "", "Pause a loop: it starts no scheduled runs until resumed.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops resume": readonly ["Usage:", "python -m runpane loops resume --loop <id> --yes [--json] [--pane-dir <path>]", "", "Resume a paused loop from its next scheduled time.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "loops delete": readonly ["Usage:", "python -m runpane loops delete --loop <id> --yes [--json] [--pane-dir <path>]", "", "Delete a loop. It starts no more runs.", "", "Options:", " --loop <id> Loop id, from runpane loops list.", " --yes Confirm the change.", " --json Print JSON output.", " --pane-dir <path> Connect to a specific Pane data directory."]; readonly "workspace list": readonly ["Usage:", " runpane workspace list [--json] [--pane-dir <path>]", "", "`runpane workspace list` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace list"]; readonly "workspace enable": readonly ["Usage:", " runpane workspace enable [--json] [--pane-dir <path>]", "", "`runpane workspace enable` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace enable"]; readonly "workspace disable": readonly ["Usage:", " runpane workspace disable [--json] [--pane-dir <path>]", "", "`runpane workspace disable` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace disable"]; readonly "workspace read": readonly ["Usage:", " runpane workspace [<machine>] read <path> [--json]", "", "`runpane workspace read` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace read"]; readonly "workspace write": readonly ["Usage:", " runpane workspace [<machine>] write <path> [--json]", "", "`runpane workspace write` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace write"]; readonly "workspace exec": readonly ["Usage:", " runpane workspace <machine> exec [--cwd <path>] [--timeout-ms <ms>] [--json] -- <command>", "", "`runpane workspace exec` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest workspace exec"]; readonly handoff: readonly ["Usage:", " runpane handoff --template", " runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor|opencode>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--note-only] [--dry-run] [--json]", "", "`runpane handoff` ships in the npm package and the Pane app, not in the Python package.", "Run it with Node instead: npx --yes runpane@latest handoff"]; readonly "sessions pin": readonly ["Usage:", "python -m runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]", "", "Set the named Session pin star on. Repeated requests keep that state. Uses the same Session update path as the UI."]; readonly "sessions unpin": readonly ["Usage:", "python -m runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]", "", "Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."]; readonly "pr watch": readonly ["runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]", "", "Register durable GitHub PR monitoring for a Pane."]; readonly "pr unwatch": readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]", "", "Remove a Pane’s explicit PR registration."]; readonly "pr list": readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]", "", "List PR registrations and stopped watches."]; readonly inbox: readonly ["Usage:", " runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]", "", "Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),", "missing reports (agent.report.missing), and questions waiting on a worker's screen", "(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across", "restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.", "", "Options:", " --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", "", "Clear handled items with `runpane inbox ack <item-id>...`."]; readonly "inbox ack": readonly ["Usage:", " runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]", " runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]", "", "Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.", "", "Options:", " --session <id|name> Only clear items of this Session; required with --all", " --all Clear every item of the Session", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"]; }; }; readonly docs: { readonly maintainerRules: readonly ["Treat `contracts/runpane/contract.json` as the source of truth for both wrapper packages and generated docs.", "Every command, flag, platform default, artifact-selection rule, and attribution rule change must be reflected in the contract.", "The npm and PyPI wrappers must expose the same command behavior unless the contract explicitly documents a package-manager-specific difference.", "Root `README.md` and package READMEs should lead with one guided quick-start command. Explicit commands, package-manager variants, and flags belong in an Advanced section.", "Release version bumps must keep root `package.json`, `packages/runpane`, and `packages/runpane-py` versions in sync. Run `pnpm run check:runpane-package-versions` before release.", "`pnpm run test:runpane-contract` must pass before changing wrapper command parsing, help output, platform defaults, release asset selection, or generated contract artifacts.", "Token-based npm or PyPI publishing is a temporary fallback. Prefer trusted publishing once the package names are reserved and trusted publishers are configured."]; readonly recommendedQuickStarts: readonly ["npx --yes runpane@latest", "npm i -g runpane && runpane setup", "pipx run runpane", "python -m pip install runpane && python -m runpane setup"]; readonly npmCommands: readonly ["npx --yes runpane@latest", "npx --yes runpane@latest setup", "npx --yes runpane@latest install client", "npx --yes runpane@latest install daemon --label \"My Server\"", "pnpm dlx runpane@latest", "pnpm dlx runpane@latest install daemon --label \"My Server\"", "npm i -g runpane && runpane", "npm i -g runpane && runpane setup", "npm i -g runpane && runpane install daemon --label \"My Server\"", "pnpm add -g runpane && runpane", "pnpm add -g runpane && runpane setup", "pnpm add -g runpane && runpane install daemon --label \"My Server\"", "yarn dlx runpane@latest install daemon --label \"My Server\"", "bunx runpane@latest install daemon --label \"My Server\""]; readonly pythonCommands: readonly ["pipx run runpane", "pipx run runpane setup", "python -m pip install runpane", "runpane", "runpane setup", "python -m runpane setup", "runpane install daemon --label \"My Server\"", "pipx install runpane", "runpane", "runpane setup", "pipx run runpane install daemon --label \"My Server\"", "uvx runpane@latest", "uvx runpane@latest setup", "uvx runpane@latest install daemon --label \"My Server\"", "python -m runpane install daemon --label \"My Server\""]; readonly packageManagerNotes: readonly ["Use `pnpm dlx` for one-shot pnpm execution and `pnpm add -g` for persistent CLI installation.", "Do not document `pnpm install runpane` as the public CLI install path."]; readonly commandUsages: readonly ["runpane", "runpane setup", "runpane install", "runpane install client", "runpane install daemon", "runpane update", "runpane version", "runpane doctor", "runpane doctor --json", "runpane daemon repair --pane-dir ~/.pane_remote --yes --json", "runpane agent-context", "runpane agent-context --command \"panes create\" --json", "runpane mcp", "runpane repos list --json", "runpane repos add --path /path/to/repo --name Pane --yes --json", "runpane panes list --repo active --json", "runpane panes cost --pane <pane-id> --json", "runpane panes create --repo active --name issue-252 --agent <agent> --prompt \"Kick off the discussion skill for issue 252\" --source agent --no-focus --wait-ready --yes --json", "runpane panes create --from-json panes.json --yes --json", "runpane panes archive --pane <pane-id> --source agent --yes --json", "runpane panes rename --pane <pane-id> --name issue-393 --yes --json", "runpane panels list --pane <pane-id> --json", "runpane panels output --panel <panel-id> --limit 200 --json", "printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes --json", "runpane sessions list [--json] [--pane-dir <path>]", "runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]", "runpane sessions get --session <id|name> [--json] [--pane-dir <path>]", "runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]", "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]", "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]", "runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]", "runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]", "runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]", "runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]", "runpane lock acquire --name testing-account --ttl 30m --wait 1800000 --note \"call QA\" --json", "runpane lock release --name testing-account --json", "runpane lock list --json", "runpane loops create --repo active --name nightly-bug-sweep --cron \"0 3 * * *\" --agent claude --prompt \"Fix one bug from yesterday's issues\" --yes --json", "runpane loops list --json", "runpane loops run --loop <loop-id> --yes --json", "runpane agents start --repo active --name fix-login --agent claude --prompt \"Fix the login redirect\" --yes --json", "runpane agents start --pane <pane-id> --agent codex --prompt \"Review the PR from this branch and report findings\" --yes --json", "runpane agents status --pane <pane-id> --json", "runpane agents send --pane <pane-id> --text \"Also add a test\" --yes --json", "runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md --json", "runpane panels last-message --panel <panel-id> --json", "runpane panels resume --panel <panel-id> --wait-ready --yes --json", "runpane panels resume --session <id|name> --wait-ready --yes --json", "runpane docs search --query \"archive a pane\" --json", "runpane links create --pane <pane-id> --json", "runpane panes git-status --pane <pane-id> --json", "runpane help", "runpane <command> --help", "runpane watch --until-event", "runpane watch --follow", "runpane watch --session <id|name> --follow", "runpane watch --session <id|name> --follow --ready-settle 1m --blocked-settle 15s --min-interval 2m", "runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]", "runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]", "runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"]; readonly commandDescriptions: readonly ["`runpane` with no arguments and `runpane setup` open an interactive wizard when stdin and stdout are TTYs. The remote-host wizard asks only for a name, then runs interactive Tailscale setup with automatic port selection; explicit install daemon flags remain available for SSH and manual URLs. In non-interactive shells or CI, both forms must print help, common commands, and agent discovery hints, then exit successfully instead of waiting for input.", "`runpane install` is an alias for `runpane install client`.", "`runpane install client` downloads the selected Pane desktop artifact and installs, opens, or launches it for the current platform.", "`runpane install daemon` downloads or installs Pane, resolves a stable Pane executable path, and spawns `<pane executable> --remote-setup <forwarded remote setup args>`.", "The wrapper must stream Pane stdout/stderr without reformatting because `pane --remote-setup` prints the one-time `pane-remote://...` connection code.", "`runpane update` defaults to both app and active supported CLI, with independent supervision, staging, durable status, and explicit restoration outcomes. Prerequisites, status fields/exit codes, draft handling and manual recovery are documented in [Update recovery](UPDATE_RECOVERY.md).", "`runpane version` prints only wrapper package metadata and does not contact, launch, or focus the Pane app or daemon.", "`runpane doctor` checks platform support, release metadata reachability, download URL selection, installed Pane detection, daemon reachability, and remote-daemon hints. Add `--json` for a machine-readable report that agents should run before mutating Pane state. Installed app version detection must be best-effort and must not launch, focus, or configure Pane; macOS wrappers read app bundle metadata instead of executing `Pane --version`.", "`runpane daemon repair` rewrites and restarts only the managed remote-daemon launcher/service. It never creates pairing credentials, changes tunnels, or downloads Pane; doctor only recommends it and never runs it automatically.", "`runpane agent-context` prints a brief, token-efficient command schema for coding agents without connecting to the Pane daemon.", "`runpane agent-context --command \"panes create\"` prints the detailed definition for one command. Add `--json` for machine-readable output. An unknown command exits 2 and lists the closest command names; with `--json` it prints `{ ok: false, code: \"unknown_command\", message, candidates }` on stdout.", "`runpane mcp` runs a stdio MCP server whose tools are generated from this contract: every command with result `jsonSchemas` becomes a tool that runs `runpane <command> --json` and returns its output. Only the npm package and the Pane app include it; the Python wrapper prints how to run it with Node and exits non-zero.", "`runpane repos list` connects to the running local Pane daemon and prints saved repository records.", "`runpane repos add` registers an existing git repository with the running local Pane daemon. It does not create directories or initialize git repositories by default.", "`runpane panes list` lists Pane sessions, optionally scoped to one saved repository.", "`runpane panes cost` reports estimated token costs per Pane for the last 30 days, including per-model breakdowns and cache efficiency; unscoped output includes an Unattributed bucket that reconciles against workspace totals.", "`runpane panes create` connects to the running local Pane daemon, resolves the requested saved base repository, creates user-visible Pane sessions backed by Pane-managed worktrees/branches, opens terminal-backed tool tabs, and optionally sends initial input to the started tool. Built-in agent panes and `--source agent` default to background/no-focus unless `--focus` is passed. New Panes are pinned into the UI's favorite/pin set by default, except when the CLI runs inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID`), where child worktrees default to unpinned. Explicit `--pinned` / `--no-pinned` override creation defaults. First Session association clears an existing pin, including an explicit creation pin; use `panes pin` after association to pin a child. This avoids duplicating Session children in the global pinned list. Manual pins applied afterward are preserved. Panes created interactively in the Pane UI are unaffected. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.", "For `panes create --wait-ready` (and `panels create`, `panes adopt --launch`), ready means an identified agent at its own input box: declared with `--agent`, or detected from the command, its foreground process or its screen. A `--tool-command` that never shows a supported agent is not ready: `readiness.ok` is false with `readiness.reason.code` `no-agent-detected` after the timeout, or `command-exited` as soon as the command exits back to the shell, and nothing is typed into it. `agent-not-ready` means the agent was detected but its input box was not ready in time. CLI readiness is confirmed on consecutive polls. Codex also requires a recognized configured model or context footer below its live composer; its provisional startup composer is not ready. Hidden or unrecognized Codex status lines conservatively time out rather than prove readiness. Startup prompts return blocked with the prompt's own text in blocked.message and a suggestedCommand, and Pane never answers them: first-run trust and daemon dialogs and Agent Farm's `Trust this repository workspace? [y/N]` as blocked.kind=first-run-dialog; Codex's security setup banner and any other prompt, including a wrapper's or shell's `[y/N]` before the agent appears, as agent-prompt. A starting message blocked this way is held and sent once the prompt is answered and the agent's input box is ready. Every create with a starting message returns `initialInput`. Pane stages the text in the composer, presses the agent's submit key separately (Ctrl+Enter for Codex, declared or detected), and checks where it went: `initialInput.delivery` is `taken` or `queued` (from the agent's transcript or its screen), `in-composer`, or `unknown` (`argv` means a prompt was routed at launch; Pane gives the transcript up to 10 seconds before settling on unknown). `initialInput.verifiedSubmitted` is true exactly when it is `taken` or `queued`, and the create's `ok` is false unless a Claude or Codex starting message is verified. Cursor and OpenCode have no acceptance probe: their delivery stays `unknown` with a delivery.message saying so, `verification: unverifiable`, and `ok` follows readiness. Without `--wait-ready` the create returns at once with `initialInput.verifiedSubmitted: false`, a delivery.message saying the call did not wait, and a `panels wait` nextCommand; Pane still sends the message once the agent is identified and at its input box, and gives up without typing it if no supported agent appears within 30 seconds.", "`runpane panes archive` refreshes the configured upstream, reports exact unpushed commit evidence, and refuses unsafe archive operations unless `--force` is used. A branch whose upstream is gone counts as pushed when a merged GitHub pull request has HEAD as its head (`safetyCheck.mergedViaPr`). Add `--dry-run` to inspect the same evidence without archiving. `--remove-worktree` applies the same check and removal to an adopted worktree; local branches are always kept. Successful archives report `worktreeCleanup: completed` once the worktree is gone from its path and from git; `trashDeletion: pending` means its files are still being deleted in the background. `runpane panes archive --session <id|name> --merged` archives every Session Pane that is clean and pushed or merged, and reports a reason for each skipped Pane.", "`runpane panes rename` trims and updates a Pane's display name without changing its worktree, branch, panels, or focus, and returns the updated pane summary.", "`runpane panes focus` raises the Pane window and selects a Pane (and optionally one of its panels) exactly like clicking it in the UI. Because it steals the user's window focus, run it only on an explicit user request to open, focus, show, or switch to a Pane; never focus a Pane proactively, the same doctrine that keeps `panes create` background/no-focus for `--source agent`.", "`runpane panels open` opens a URL or a file from the Pane worktree as a tab in an existing Pane (default: the calling panel's Pane from `PANE_SESSION_ID`), in split view beside the agent unless `--tab` is passed. Files open in an editor tab with read-only previews for supported formats, and HTML opens as editable source; an existing tab showing the same target is reused. It brings the tab forward for clients already showing that Pane, and never raises or focuses the Pane window or switches anyone's Pane.", "`runpane panels list` lists tool panels inside one Pane session. Each panel with a saved agent session ID reports it as `resumeId`, with `resumeSource` (`agent-farm`, `configured`, or `agent`) naming the rule that reopens the conversation.", "`runpane panels output` reads bounded recent terminal output from one panel and strips common terminal control noise for agent use.", "`runpane panels input` sends exact input bytes to one terminal panel. Prefer `--input-file` for newlines, Ctrl-C, quotes, or shell-sensitive text.", "`runpane panes create --prompt` is an alias for `--initial-input`; request JSON and daemon payloads should use the canonical `initialInput` field.", "`runpane panes create --branch <name>` creates the Pane's worktree on exactly that new branch, slashes included (for example `agents/w5a`). The name is checked with `git check-ref-format --branch`, creation fails if the branch already exists, and Pane never renames it to make it unique. `--worktree-name` still names the directory and defaults to `--name`. `--base` is an alias for `--base-branch`, and `--prompt-file` for `--initial-input-file`. `panes create --base <ref> --branch <name> --prompt-file <file>` replaces `git worktree add` plus `panes adopt`. When the base is a remote-tracking branch (the default `origin/main`, or one named with `--base`), Pane fetches it first, waiting at most about 10 seconds, so the Pane starts at the remote's current tip. Each created item reports `base` (`ref`, `commit`, `refresh`); if the fetch fails the Pane still starts, from the local ref, and `base.notice` says so and how to catch up.", "`runpane panes adopt --launch` accepts `--prompt`, `--prompt-file`, `--wait-ready`, and `--ready-timeout-ms`, and reports `readiness`, `initialInput`, and `nextCommand` like `panes create`. A prompt without `--launch` is an error rather than being dropped.", "If composer submission cannot be verified without risking a duplicate, the create item is unsuccessful with `initialInput.staged`, `initialInput.attempts`, `initialInput.blocked.kind: submission_unverified`, and an actionable `nextCommand`. The CLI-facing `--prompt` alias maps to this canonical `initialInput` result.", "When running from WSL while Pane is installed on Windows, a Linux-installed runpane cannot reach Pane: it looks for a missing `/tmp/pane-daemon.../daemon.sock`. Pane's own `runpane` (on PATH in Pane's WSL terminals, or `/mnt/c/Users/<you>/.pane/bin/runpane` from any WSL shell) runs the Windows CLI through WSL interop and converts path arguments. With a Pane build older than that shim, invoke the Windows wrapper through PowerShell from a Windows cwd, for example `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane repos list --json'`.", "`runpane watch` waits for agent, Pane, panel, and PR events from the daemon journal without polling. `--follow` keeps watching with defaults tuned for an agent watching unattended (quiet, batched, and it ends itself after 3 hours with nothing happening); individual duration flags override these defaults. Cadence requires a named follow consumer; `--follow --since <generation>` has no consumer name and bypasses settling and batching. `--until-event` waits for one event worth waking for, prints it immediately without follow settling or batching, and exits 0. The defaults are listed in the contract under defaults.watch.", "A watch releases its pending slot when its client socket or named pipe disconnects. Re-arming the same named cursor takes over the previous request; the superseded watcher exits with a WATCH ERROR instead of competing for the cursor. Anonymous concurrent watchers retain the eight-wait limit. Each request also has a 125-second lease (slightly longer than the maximum 120-second long poll), so an abandoned request is reclaimed even if no disconnect arrives.", "The desktop app treats one consumer name specially: while a `runpane watch --as dictate` request is in flight, and for 30 seconds after the last one ends, Pane skips its own \"needs your input\" and \"finished\" desktop notifications, because [Dictate](https://github.com/parsakhaz/open-dictate) shows those events on its pill. When that watcher stops, Pane's notifications come back. The CLI's flags and output are unchanged.", "`sessions list` list durable named orchestration Sessions.", "`sessions create` create a durable named orchestration Session and its hidden terminal owner.", "`sessions get` read one durable named orchestration Session.", "`sessions update` update a Session overview from structured JSON.", "`sessions pin` and `sessions unpin` set the Session pin star through the existing UI update path. Create JSON accepts `isPinned` (default false); update JSON preserves the pin when the field is omitted.", "`sessions set-agent` switch the durable terminal agent for a named Session.", "`sessions associate` associate a user-visible Pane with a named Session.", "`sessions detach` detach a Pane from a named Session.", "`sessions overview` read a live status, activity, git, and pull request overview for a named Session. Each panel in `panes[].panels[]` carries its own latest `runpane report` as `report`, so one call shows what every worker last reported and when (`reportedAt`, next to the panel's `state` and `lastActivityAt`). When a report's summary is a complete JSON object, such as a status file sent with `--summary-file`, `report.data` holds it exactly as the worker gave it; Pane never reads, renames or validates its fields. A summary that is not a JSON object (plain text, an array, a scalar or invalid JSON), is nested more than 64 levels deep, or was truncated (`summaryTruncated`), has no `data`. A panel that never reported has no `report`. `panes[].report` is still the newest report among the Pane's panels.", "`runpane lock acquire|release|list` coordinate a resource shared between agents, such as one test account. The caller's Pane and panel own the lock; it is scoped to the owner's Session (or global outside one), renews for the same owner, and is released on TTL expiry, owner panel exit, or owner Pane archive. `--wait` blocks in the daemon until the lock comes free.", "`runpane loops list|create|update|run|pause|resume|delete` manage loops (scheduled tasks): a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, agents use their harness's own sleep and wake. See [LOOPS.md](LOOPS.md).", "`runpane agents start|status|send` finish the three common agent jobs in one call each: start an agent on a task (a new tab in the work's Pane with `--pane <id>`, or a new Pane for new work), check on it, and send it a follow-up.", "`runpane report --state ready|blocked|failed|done` is how a worker hands back its result. It stores the latest report on the worker's panel (state, `--pr`, `--head`, up to 16,000 characters of `--summary` or `--summary-file`, and the `--question` a blocked worker needs answered), journals an opt-in `agent.report` watch event (`REPORT <pane-name> pane <pane-id> panel <panel-id> ready pr#747 fc5dce9`; it skips the `--min-interval` batch), records it as Session activity, and shows it in `agents status`, `panels list`, and `sessions overview` (each panel's own report as `panes[].panels[].report`, with a JSON object summary as `data`, and the Pane's newest as `panes[].report`). Inside a Pane terminal the panel comes from `PANE_SESSION_ID` and `PANE_PANEL_ID`; elsewhere pass `--pane` and `--panel`. It prints how many watches were waiting for the report and received it (`Delivered to 1 waiting watcher.`, `liveWatchers` in JSON). Zero means nobody was waiting right now, not that the report is lost: it stays on the panel, and a named-cursor watch receives it when it next waits.", "`runpane notify` asks the person a question, or tells them something, on screen wherever they are, and prints their answer: `--ui options` with 1 to 9 `--choices` returns `{answer, note?}` (the chosen label), `--ui approve` returns `{approved, note?}`, `--ui ask` returns `{answer}`, and `--ui info` returns `{delivered: \"screen\"|\"inbox\"}` at once. The call waits with no time limit. A `{waiting: true, id, next}` result means the wait should continue with `runpane notify --resume <id>`; `runpane mcp` asks for it only for clients whose tool calls time out. When Pane is not running or Notify is off it prints `{unavailable, next}` and exits 0, so the agent asks in its terminal. Invalid input fails before anything is shown, with a message naming the field. It needs no `--yes`: asking the person is the point.", "Work sent to an agent through `runpane panels create`, `panes create` (with a prompt), or `panels submit` records that the sender waits for a `runpane report`, unless the request says `--source user` (Pane's own UI does) or `--no-expect-report`; `--expect-report` asks for one anyway. Typing into a tab never does. If the agent then goes ready or its panel exits without a report, Pane journals one opt-in `agent.report.missing` entry (`MISSING REPORT <pane-name> pane <pane-id> panel <panel-id> ready|exited`) whose `lastOutput` is the agent's last transcript reply or last screen lines; it skips the `--min-interval` batch and reaches only watchers that list it in `--kinds`. While the agent's screen shows background work (Claude's `· 1 shell` footer or a running background subagent row, Codex's `background terminal running` line), Pane waits and looks again every 10 seconds instead. `agent.blocked` entries carry `screenLines`, the prompt the agent waits on, and are journalled once a panel has stayed blocked for 2 seconds.", "The orchestrator guide prescribes submit without `--wait`, followed by its named watch; use one completion consumer. As an optional CLI route, `--wait` on `runpane panels submit`, `panels create`, and `panes create` turns the expected report on and blocks on that panel until the first `agent.report`, `agent.report.missing`, `agent.blocked`, `panel.exited`, or `pane.gone`, then prints one line of JSON (`dispatchWaitResult`): the outcome, ids, the report's state, summary, `summaryPath`, PR and head, `screenLines` for a prompt, or `lastOutput` for a missing report, never the transcript. It exits 0 for a report, 3 missing, 4 blocked, 5 exited or gone, and 124 when `--timeout <duration>` passes. It follows the journal from the position the daemon took before delivering the work, so nothing that happens right after delivery is missed. It reuses watch --until-event and returns indeterminate (exit 6) if the journal epoch changes or retained history is lost; inspect the panel and inbox before retrying. Report-expected dispatches are serialized per panel and refused before writing while a result or missing-output collection is outstanding. Answer a blocked panel with panels submit --no-expect-report, then watch for the original result.", "`runpane inbox [--session <id|name>] [--json]` lists what a Session's orchestrator has not acknowledged: reports, missing reports, and on-screen questions (a question clears itself once its panel moves on). `runpane inbox ack <item-id>...` or `--all --session <id|name>` clears items. An orchestrator runs it when it starts or resumes, to catch anything that finished while it was down; Pane never injects the inbox into its turns.", "`runpane panels resume --panel <panel-id>` restarts a stopped terminal panel in place, keeping its panel id: an agent panel relaunches with its resume command (Claude `--resume <session>`, `codex resume <session>`, Agent Farm `agent-farm run <profile> --resume <id>` with the ID Agent Farm printed; the result's `agentSessionId` names it), the same restart the app runs when it shows the panel, without taking focus. A running panel is left alone (`action: \"already-running\"`); one whose agent exited back to its shell is stopped, and resume runs its saved command again in that shell (`action: \"resumed\"`). If that command exits at once, `--wait-ready` returns `ok: false` with `reason.code: \"command-exited\"` and the error line it printed. `--session <id|name>` or `--all-stopped` resumes every stopped agent panel in that scope, `--concurrency` at a time (default 3), then, with `--wait-ready`, waits on the resumed panels together, and returns `{ resumed, alreadyRunning, failed, notReady, items[] }` with each panel's own result, readiness, and blocker or error. After a Pane restart, or once an agent exits back to its shell, stopped panels report `running: false` (`initialized` stays true while the shell lives) in `panels list`, `panels screen`, and `panels wait` (which returns `stopped: true` instead of timing out), and `nextCommand` points at `panels resume`. `runpane watch` reports them as `panel.stopped` (`STOPPED ...`) when `--kinds` lists that kind; other consumers and `workspace state` see `agent.unknown` with `running: false`, never `agent.ready`.", "`runpane panels last-message --panel <panel-id>` reads a Claude or Codex agent's last reply from its transcript (up to `--limit` characters, default 20,000, keeping the end and reporting `truncated`). It never scrapes the screen: without a transcript it prints `{ ok: false, reason: \"transcript-unavailable\" }` and exits 1.", "Commands with a contract `daemonAction` (the `panes` git, script, restore, and move commands, `folders list|create`, and `links open`) call the same Pane daemon channel as the matching button in the app and print `{ ok, data, error }`. Destructive ones add a pane:// `link` to review the Pane.", "`runpane links create` builds `pane://open?...` links; opening one in Pane selects what it names and never changes Pane state.", "`runpane docs search|read` search and read Pane docs, help, and installed Pane Chat skills offline. They ship in the npm package and the Pane app only.", "`runpane handoff` hands a task to another agent on this or another of your machines. The sending agent writes the note from `runpane handoff --template` (goal, current state, done and verified, in progress, next steps, decisions and constraints, open questions, how to verify, git state); `runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md` checks every section is filled in, requires the branch to be pushed (or pushes it with `--push`, never forcing), writes the note to that machine's `~/.pane/handoffs/` and starts the agent in a new Pane branched from the sender's branch. When the sender is a Pane tab running a Claude, Codex, Cursor or OpenCode session and the receiver is the same agent, the handoff carries that session: on another machine its files are copied into that machine's agent store and the receiver resumes the same id; on this machine the receiver resumes a fork, because two agents never resume one session on one machine. The receiver starts with no prompt, and the CLI runs the continuity check and reports JSON `continuity.result` `continued`, `inconclusive` (exit 0; `next` gives a probe question) or `not-continued` (exit 1; the receiver is kept and `next` gives the `--note-only` command). `--note-only`, a different agent, or a tab with no carried session starts a fresh agent with the note (`fresh-agent`). JSON `continuity` is `{ carried, result, agent, sessionId, resumedId, fork, files, bytes, checks: { resumedById, restartResumes, historyLoaded, originalUntouched?, originalAppended? }, reason, next }`: `sessionId` is the sender's session, `resumedId` the id the receiver resumes (the fork's on this machine), `checks` are the continuity checks (`historyLoaded` is null when there was nothing to compare; `originalUntouched` is set for forks), and a dry run sets `carried`, `sessionId`, `fork`, `files` and `bytes` with no `result`. After `continued` or `inconclusive` the sending agent ends its turn and makes no more changes on the branch. An OpenCode session travels as its export: `opencode export` on this machine, then `opencode import` inside the receiving repository there, and an OpenCode receiver is accepted only to continue an OpenCode session. A Cursor session is carried only to another machine, best effort since Cursor's store is undocumented: Cursor has no fork, and a copied chat still writes to the original, so on this machine the result is `not-continued` and nothing is started. A destination's agent store is assumed at its default location (`~/.claude`, `~/.codex`, `~/.cursor`); a copy already there is replaced only when the sender's holds all of it and no agent there runs it, otherwise nothing is copied and the result is `not-continued`. A destination Pane too old to resume a carried session is refused before anything is sent (`ERR_HANDOFF_RESUME_UNSUPPORTED`). From a Session's terminal it skips git and creates a Session with the same name, goal and agent on the other machine instead; a same-agent Session resumes the sender's conversation when first opened. The receiver reports back to the sender's panel.", "`runpane pr watch`: Register durable GitHub PR monitoring for a Pane.", "`runpane pr unwatch`: Remove a Pane’s explicit PR registration.", "`runpane pr list`: List PR registrations and stopped watches."]; readonly wrapperFlagNote: "The top-level `runpane --version` form prints the wrapper version. The install subcommand form `runpane install --version vX.Y.Z` selects a Pane release."; readonly localControlFlagNote: "`runpane doctor --json`, `runpane repos list`, `runpane panes ...`, and `runpane panels ...` commands use or describe the local framed daemon socket/pipe for a running Pane app. `--pane-dir` points the wrapper at a non-default Pane data directory, such as `PANE_DIR=~/.pane_test` in development. `runpane agent-context` is local/offline and can be used before Pane is running. `agent-context` and `version` accept and ignore `--pane-dir`, so one `--pane-dir` can be passed to every runpane command. In a Pane repository checkout, if `runpane` is not on PATH, build the local wrapper with `pnpm --filter runpane build` and run it with patched Node 22.23.4+ (22.x), 24.22.1+ (24.x), or 26.12.1+ (26.x), for example `node packages/runpane/dist/cli.js doctor --json`. From WSL, if the user runs Windows Pane, use Pane's own `runpane` (on PATH in Pane's WSL terminals, or `/mnt/c/Users/<you>/.pane/bin/runpane`), which reaches the Windows named-pipe daemon through WSL interop; older Pane builds need `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane ...'`."; readonly daemonFlagNote: "Unknown daemon flags should be forwarded rather than dropped so newer Pane versions can extend `--remote-setup` without requiring an immediate wrapper release. Unknown flags for non-daemon commands should fail clearly."; readonly downloadAttribution: readonly ["The npm package uses `source=npm` for all npm-registry consumers, including `npx`, `pnpm dlx`, `yarn dlx`, `bunx`, and global npm/pnpm installs.", "The PyPI package uses `source=pip` for all Python consumers, including pip, pipx, uvx, and `python -m runpane`.", "Wrappers should prefer `https://runpane.com/api/download?platform=<platform>&arch=<arch>&format=<format>&version=<version>&channel=<channel>&source=<npm|pip>`.", "If the website route cannot satisfy the download, wrappers may fall back to the matching GitHub release asset and print a warning that website attribution may be incomplete for that run.", "Wrappers emit best-effort telemetry to `https://runpane.com/api/runpane/telemetry` for command failures, download request/success/failure, and GitHub fallback usage. Routine command starts and successes emit nothing. A command failure is a thrown error, or a non-zero exit from `install` or `update` (also when setup runs them); other exit codes are documented results (such as `panels wait` not ready or `doctor` findings) and emit nothing. A failure event carries the command, `failure_stage`, `failure_category`, `exit_code` when known, and `error_code` (the code printed in the `--json` error). Both wrappers share a per-install limit in `<PANE_DIR>/runpane-wrapper-telemetry.json`: one failure event per cause per hour and at most 10 per hour.", "Wrapper telemetry uses a persisted anonymous `install_id` in the form `install_<uuid>` and PostHog `distinct_id = install:<install_id>` so installs reporting failures or downloads can be counted with `count(DISTINCT properties.install_id)`; this is not a count of all CLI users.", "Wrapper telemetry must be disabled in CI (`CI`, `GITHUB_ACTIONS`, `GITLAB_CI`, `BUILDKITE`, `CIRCLECI`, `TF_BUILD`, `JENKINS_URL`, `TEAMCITY_VERSION` or `CODEBUILD_BUILD_ID` set), when `DO_NOT_TRACK=1` or `RUNPANE_TELEMETRY_DISABLED` is set, and when the local config explicitly disables analytics. It must not include raw paths, labels, prompts, raw error text, or environment values.", "Desktop local control reports useful failures as `runpane_local_control_failed`; normal polling, wait deadlines, and optional agent unavailability emit nothing. Reports contain coarse operation and failure classification only, with a five-minute deduplication interval and a maximum of 20 per hour per app process. Handled CLI failures are ordinary events, not exceptions."]; readonly publishingCredentials: readonly ["Local implementation, build, and dry-run validation do not need npm or PyPI API tokens.", "Release publishing should prefer npm Trusted Publishing and PyPI Trusted Publishing from GitHub Actions.", "Fallback `NPM_TOKEN` or `PYPI_API_TOKEN` credentials may be used for first package reservation or manual publication only. They must be supplied through local environment variables or GitHub Actions secrets, never committed, and revoked or rotated after use."]; }; readonly testFixtures: { readonly parserSamples: readonly [readonly ["setup"], readonly ["install"], readonly ["install", "client", "--version", "v2.2.8", "--format", "dmg", "--download-dir", "/tmp/pane-downloads", "--dry-run", "--yes"], readonly ["install", "daemon", "--label", "VM", "--prefer-tunnel", "ssh", "--channel", "nightly", "--base-url", "https://example.test", "--pane-dir", "/tmp/pane", "--listen-port", "4555", "--auto-listen-port", "--print-only", "--repo-ref", "main", "--unknown-future-flag", "future-value", "--dry-run", "--verbose"], readonly ["update", "--version", "latest", "--format", "appimage", "--pane-path", "/usr/bin/pane", "--dry-run"], readonly ["doctor", "--pane-path", "/usr/bin/pane", "--format", "zip", "--verbose"], readonly ["doctor", "--json", "--pane-dir", "/tmp/pane"], readonly ["doctor", "--report", "--title", "watch failed", "--body-file", "/tmp/watch-evidence.txt", "--json"], readonly ["watch", "--as", "monitor", "--from", "earliest", "--follow", "--heartbeat", "60s", "--idle-after", "600000", "--ready-settle", "180000", "--blocked-settle", "30000", "--min-interval", "600000", "--expire-after", "10800000", "--exclude-pane", "pane-old", "--kinds", "agent.ready,agent.idle", "--include-held-input", "--self-test"], readonly ["daemon", "repair", "--pane-dir", "/tmp/pane-remote", "--yes", "--json"], readonly ["agent-context"], readonly ["agent-context", "--command", "panes create", "--json"], readonly ["repos", "list", "--json", "--pane-dir", "/tmp/pane"], readonly ["repos", "add", "--path", "/tmp/repo", "--name", "Repo", "--dry-run", "--yes", "--json", "--pane-dir", "/tmp/pane"], readonly ["panes", "list", "--repo", "active", "--json"], readonly ["panes", "cost", "--pane", "session-1", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--pinned", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--no-pinned", "--no-associate", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--from-json", "-", "--yes", "--json"], readonly ["panes", "archive", "--pane", "session-1", "--force", "--source", "agent", "--yes", "--json"], readonly ["panes", "pin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "unpin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "rename", "--pane", "session-1", "--name", "issue-393", "--yes", "--json"], readonly ["panes", "focus", "--pane", "session-1", "--panel", "panel-1", "--source", "user", "--yes", "--json"], readonly ["panels", "list", "--pane", "session-1", "--json"], readonly ["panels", "output", "--panel", "panel-1", "--limit", "200", "--json"], readonly ["panels", "input", "--panel", "panel-1", "--text", "Continue\\n", "--yes", "--json"], readonly ["--version"], readonly ["agents", "doctor", "--agent", "codex", "--repo", "active", "--json"], readonly ["panes", "create", "--from-json", "-", "--source", "agent", "--focus", "--wait-ready", "--ready-timeout-ms", "45000", "--concurrency", "2", "--yes", "--json"], readonly ["panels", "screen", "--panel", "panel-1", "--limit", "80", "--json"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "2", "--yes", "--json"], readonly ["panels", "wait", "--panel", "panel-1", "--for", "text", "--contains", "ready", "--timeout-ms", "30000", "--interval-ms", "500", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--source", "agent", "--no-focus", "--wait-ready", "--ready-timeout-ms", "15000", "--yes", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--focus", "--yes", "--json"], readonly ["panels", "submit-composer", "--panel", "panel-1", "--strategy", "auto", "--yes", "--json"], readonly ["sessions", "list", "--json"], readonly ["sessions", "get", "--session", "demo", "--json"], readonly ["sessions", "update", "--session", "demo", "--from-json", "-"], readonly ["panels", "submit", "--panel=panel-1", "--text=- [ ] item", "--yes", "--json"], readonly ["panes", "commit", "--pane", "pane-1", "--message", "fix: title\n\nbody", "--yes", "--json"], readonly ["links", "create", "--pane", "pane-1", "--panel", "panel-1", "--json"], readonly ["links", "open", "--url=pane://open?pane=pane-1", "--yes"], readonly ["mcp", "--toolsets", "core,git", "--read-only"], readonly ["docs", "search", "--query", "archive a pane", "--limit", "3"], readonly ["docs", "read", "--doc", "docs/PANE_MCP.md"], readonly ["agents", "start", "--repo", "active", "--name", "fix-login", "--agent", "claude", "--prompt", "Fix the login redirect", "--yes", "--json"], readonly ["agents", "send", "--pane", "pane-1", "--text=- [ ] item", "--yes"], readonly ["panels", "input", "--panel", "panel-1", "--keys", "down,enter", "--yes", "--json"], readonly ["panes", "squash-rebase", "--pane", "pane-1", "--message", "feat: land it", "--yes", "--json"], readonly ["folders", "create", "--repo", "3", "--name", "Reviews", "--yes"], readonly ["panes", "move", "--pane", "pane-1", "--folder", "folder-9", "--yes", "--json"], readonly ["watch", "--follow", "--json", "--pane-dir", "/tmp/pane"], readonly ["watch", "--follow"], readonly ["watch", "--session", "__orchestration_session_1b4e28ba-2fa1-11d2-883f-0016d3cca427__", "--follow", "--json", "--kinds", "agent.ready,agent.blocked,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged", "--ready-settle", "180000"], readonly ["watch", "--session=Release train", "--as", "release-watch", "--exclude-pane", "pane-old"], readonly ["agent-context", "--command", "panes create", "--json", "--pane-dir", "/tmp/pane"], readonly ["agent-context", "--pane-dir=/tmp/pane"], readonly ["version", "--pane-dir", "/tmp/pane"], readonly ["panes", "create", "--repo", "active", "--name", "w5a", "--agent", "claude", "--base-branch", "origin/release", "--source", "agent", "--no-focus", "--yes", "--json", "--pane-dir", "/tmp/pane"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--tool-command", "wrapper codex-run", "--wait-ready", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "farm", "--tool-command", "agent-farm run free-range", "--agent", "claude", "--prompt", "Plan", "--yes", "--json"], readonly ["panels", "submit", "--panel", "panel-1", "--input-file", "brief.md", "--as-file-pointer", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "long", "--agent", "claude", "--initial-input-file", "brief.md", "--as-file-pointer", "--dry-run", "--yes", "--json"], readonly ["report", "--state", "ready", "--pr", "747", "--head", "FC5DCE9", "--summary", "Done: tests pass", "--json"], readonly ["report", "--state", "blocked", "--question", "Which API version?", "--pane", "session-1", "--panel", "panel-1", "--summary-file", "-"], readonly ["report", "--state=done", "--summary-file=/tmp/report.md", "--pane-dir", "/tmp/pane"], readonly ["panels", "resume", "--all-stopped", "--wait-ready", "--concurrency", "2", "--yes", "--json"], readonly ["panels", "resume", "--panel", "panel-1", "--wait-ready", "--ready-timeout-ms", "45000", "--yes", "--json"], readonly ["panels", "last-message", "--panel", "panel-1", "--limit", "5000", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "w5a", "--base", "release/foo", "--branch", "agents/w5a", "--agent", "claude", "--prompt-file", "prompt.md", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "w5b", "--base-branch", "origin/main", "--branch", "agents/w5b", "--worktree-name", "w5b-dir", "--tool-command", "bash", "--initial-input-file", "-", "--dry-run", "--yes", "--json"], readonly ["panes", "archive", "--pane", "session-1", "--remove-worktree", "--yes", "--json"], readonly ["panes", "archive", "--session", "refactor", "--merged", "--dry-run", "--json"], readonly ["panes", "archive", "--session", "refactor", "--merged", "--remove-worktree", "--yes"], readonly ["lock", "acquire", "--name", "testing-account", "--ttl", "30m", "--wait", "1800000", "--note", "call QA", "--json"], readonly ["lock", "acquire", "--name", "staging-db", "--ttl", "1500", "--pane", "session-1", "--panel", "panel-1", "--pane-dir", "/tmp/pane"], readonly ["lock", "acquire", "--name=db", "--ttl=2h"], readonly ["lock", "release", "--name", "testing-account", "--force", "--session", "Release QA", "--json"], readonly ["lock", "list", "--session", "Release QA", "--json"], readonly ["lock", "--help"], readonly ["panels", "open", "--pane", "session-1", "--file", "plan.html", "--title", "Plan", "--split", "--no-focus", "--source", "agent", "--yes", "--json"], readonly ["panels", "open", "--url", "http://localhost:3000", "--tab", "--yes", "--json"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "correction", "--interrupt", "--yes", "--json"], readonly ["watch", "--as", "orch", "--until-event", "--json", "--kinds", "agent.report,agent.blocked,panel.exited,pane.gone", "--timeout-ms", "600000"], readonly ["pr", "watch", "--pane", "worker", "--url", "https://github.com/acme/app/pull/7"], readonly ["pr", "unwatch", "--pane", "worker", "--url", "https://github.com/acme/app/pull/7"], readonly ["pr", "list", "--pane", "worker"], readonly ["watch", "--follow", "--ready-settle", "5s", "--expire-after", "0"], readonly ["watch", "--until-event", "--timeout-ms", "30s"], readonly ["watch", "--timeout-ms", "off"], readonly ["watch", "--since", "42", "--epoch", "test-epoch", "--until-event", "--json"], readonly ["watch", "--follow", "--ready-settle", "5s", "--expire-after", "off"], readonly ["watch", "--follow", "--ready-settle", "5s", "--blocked-settle", "2s", "--min-interval", "1m", "--idle-after", "20m", "--expire-after", "off", "--heartbeat", "30s"], readonly ["watch", "--follow", "--since", "42", "--epoch", "test-epoch"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "go", "--expect-report", "--yes", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "claude", "--expect-report", "--yes"], readonly ["panes", "create", "--repo", "active", "--name", "feat", "--agent", "codex", "--expect-report", "--yes"], readonly ["inbox", "--session", "Release", "--json"], readonly ["inbox", "ack", "in-1a2b3c4d", "in-5e6f7a8b", "--session", "Release", "--json"], readonly ["inbox", "ack", "--all", "--session", "Release"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "fyi", "--no-expect-report", "--yes"], readonly ["panels", "submit", "--panel", "panel-1", "--input-file", "prompt.md", "--as-file-pointer", "--wait", "--yes"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "Red", "--wait", "--timeout", "30m", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "feat", "--agent", "claude", "--prompt-file", "task.md", "--wait", "--yes"], readonly ["lock", "acquire", "--name", "deploy", "--wait", "5000"], readonly ["loops", "create", "--repo", "active", "--name", "nightly", "--cron", "0 3 * * *", "--agent", "claude", "--prompt", "Sweep bugs", "--worktree-name", "nightly-sweep", "--paused", "--dry-run", "--yes", "--json"], readonly ["loops", "create", "--repo=2", "--name=deps", "--cron=0 9 * * 1", "--tool-command", "./scripts/nightly-report.sh", "--prompt-file", "-"], readonly ["loops", "create", "--session", "new", "--name", "triage", "--cron", "0 9 * * 1-5", "--agent", "claude", "--prompt", "Triage", "--yes"], readonly ["loops", "update", "--loop", "loop-1", "--cron", "0 4 * * *", "--yes"], readonly ["loops", "update", "--loop", "loop-1", "--session", "Nightly", "--yes"], readonly ["loops", "run", "--loop=loop-1", "--yes", "--json"], readonly ["loops", "pause", "--loop", "loop-1", "--pane-dir", "/tmp/pane"], readonly ["loops", "list", "--json"], readonly ["loops", "--help"], readonly ["notify", "--ui", "options", "--title", "Ship it?", "--context", "Tests pass.", "--choices=[{\"label\":\"Yes\",\"recommended\":true},{\"label\":\"No\"}]", "--json"], readonly ["notify", "--ui=approve", "--title=Drop the table?", "--detail=DROP TABLE t;", "--detail-label=Show the SQL", "--pane-dir", "/tmp/pane"], readonly ["notify", "--ui", "ask", "--title", "Which branch?", "--suggestions=[\"main\"]"], readonly ["notify", "--ui", "info", "--title", "Done", "--action={\"label\":\"Open\",\"url\":\"https://example.com\"}"], readonly ["notify", "--resume", "n-1", "--json"]]; readonly topLevelHelpIncludes: readonly ["runpane setup", "runpane install", "runpane update", "runpane version", "runpane doctor", "runpane agent-context", "runpane repos list", "runpane repos add", "runpane panes list", "runpane panes create", "runpane panes archive", "runpane panels create", "runpane panels list", "runpane panels output", "runpane panels input", "runpane agents doctor", "runpane panels screen", "runpane panels submit", "runpane panels submit-composer", "runpane panels wait", "runpane doctor --json", "runpane agent-context --json", "Agent discovery:", "Common commands:"]; readonly npmHelpIncludes: readonly ["pnpm dlx runpane@latest", "npx --yes runpane@latest", "runpane loops list"]; readonly pipHelpIncludes: readonly ["pipx run runpane", "python -m pip install runpane && python -m runpane setup", "python -m runpane loops list"]; readonly installHelpIncludes: readonly ["--version <latest|vX.Y.Z>", "--format <auto|appimage|deb|dmg|zip|exe>", "--download-dir <path>", "--pane-path <path>", "--label <name>", "--prefer-tunnel <tailscale|ssh|manual|auto>", "--repo-ref <ref>"]; }; readonly jsonSchemas: { readonly error: { readonly type: "object"; readonly description: "A failed command under --json, printed on stdout with a non-zero exit. The same message, plus a Next line, goes to stderr."; readonly required: readonly ["ok", "error"]; readonly properties: { readonly ok: { readonly const: false; }; readonly error: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly message: { readonly type: "string"; readonly description: "What happened, why, and what was or was not changed."; }; readonly code: { readonly type: "string"; readonly description: "Stable identifier to branch on, such as ENOENT or ERR_UNKNOWN_CHANNEL. ERR_RUNPANE_FAILED when the failure has no specific code."; }; readonly next: { readonly type: "string"; readonly description: "The step to take next, when one is known."; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly doctorResult: { readonly type: "object"; readonly required: readonly ["ok", "source", "wrapper", "release", "installedPane", "daemon", "remoteDaemonService", "remoteSetup", "watchDefaults", "nextCommands"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly source: { readonly enum: readonly ["npm", "pip"]; }; readonly wrapper: { readonly type: "object"; readonly required: readonly ["runtime", "version", "paneDir", "endpoint"]; readonly properties: { readonly runtime: { readonly enum: readonly ["node", "python"]; }; readonly version: { readonly type: "string"; }; readonly paneDir: { readonly type: "string"; }; readonly endpoint: { readonly type: "object"; readonly required: readonly ["transport", "path"]; readonly properties: { readonly transport: { readonly enum: readonly ["pipe", "unix"]; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly platform: { readonly type: "object"; readonly properties: { readonly os: { readonly type: "string"; }; readonly arch: { readonly type: "string"; }; readonly error: { readonly type: "string"; }; }; readonly additionalProperties: true; }; readonly release: { readonly type: "object"; readonly required: readonly ["ok"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly error: { readonly type: "string"; }; }; readonly additionalProperties: true; }; readonly installedPane: { readonly type: "object"; readonly required: readonly ["found"]; readonly properties: { readonly found: { readonly type: "boolean"; }; readonly path: { readonly type: "string"; }; readonly version: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly daemon: { readonly type: "object"; readonly required: readonly ["reachable", "endpoint"]; readonly properties: { readonly reachable: { readonly type: "boolean"; }; readonly endpoint: { readonly type: "object"; readonly required: readonly ["transport", "path"]; readonly properties: { readonly transport: { readonly enum: readonly ["pipe", "unix"]; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly result: { readonly type: "object"; }; readonly error: { readonly type: "string"; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly remoteDaemonService: { readonly type: "object"; readonly required: readonly ["paneDir", "managed", "reachable", "endpoint"]; readonly properties: { readonly paneDir: { readonly type: "string"; }; readonly managed: { readonly type: "boolean"; }; readonly reachable: { readonly type: "boolean"; }; readonly endpoint: { readonly type: "object"; readonly required: readonly ["transport", "path"]; readonly properties: { readonly transport: { readonly enum: readonly ["pipe", "unix"]; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly executableHealth: { readonly type: "object"; readonly required: readonly ["processImage", "restart", "checkedAt"]; readonly properties: { readonly processImage: { readonly type: "object"; readonly required: readonly ["status", "runtimePath", "installedPath", "evidence"]; readonly properties: { readonly status: { readonly enum: readonly ["current", "replaced", "deleted", "unknown"]; }; readonly runtimePath: { readonly type: readonly ["string", "null"]; }; readonly installedPath: { readonly type: readonly ["string", "null"]; }; readonly evidence: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly restart: { readonly type: "object"; readonly required: readonly ["status", "evidence"]; readonly properties: { readonly status: { readonly enum: readonly ["ready", "broken", "unknown"]; }; readonly launcherPath: { readonly type: "string"; }; readonly resolvedPath: { readonly type: "string"; }; readonly evidence: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly diagnosticCode: { readonly enum: readonly ["PANE_REMOTE_DAEMON_EXECUTABLE_DELETED", "PANE_REMOTE_DAEMON_UPDATE_PENDING", "PANE_REMOTE_DAEMON_LAUNCHER_STALE"]; }; readonly recoveryCommand: { readonly type: "string"; }; readonly checkedAt: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly remoteSetup: { readonly type: "object"; readonly required: readonly ["ready", "displayAvailable", "headlessEnvironmentApplied", "diagnostics"]; readonly properties: { readonly ready: { readonly type: "boolean"; }; readonly displayAvailable: { readonly type: "boolean"; }; readonly headlessEnvironmentApplied: { readonly type: "boolean"; }; readonly diagnostics: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["code", "severity", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["PANE_APPIMAGE_FUSE_MISSING", "PANE_ELECTRON_SANDBOX_ROOT", "PANE_ELECTRON_SANDBOX_UNAVAILABLE", "PANE_USER_SERVICE_UNAVAILABLE", "PANE_REMOTE_DAEMON_EXECUTABLE_DELETED", "PANE_REMOTE_DAEMON_UPDATE_PENDING", "PANE_REMOTE_DAEMON_LAUNCHER_STALE"]; }; readonly severity: { readonly enum: readonly ["warning", "error"]; }; readonly message: { readonly type: "string"; }; readonly recoveryCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly watchDefaults: { readonly type: "object"; readonly required: readonly ["follow", "untilEvent"]; readonly additionalProperties: false; readonly properties: { readonly follow: { readonly type: "object"; readonly additionalProperties: false; readonly required: readonly ["summary", "kinds", "readySettle", "blockedSettle", "minInterval", "idleAfter", "idleBackoff", "expireAfter", "heartbeat", "includeShells", "heldInputDetection"]; readonly properties: { readonly summary: { readonly type: "string"; }; readonly kinds: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly readySettle: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly blockedSettle: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly minInterval: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly idleAfter: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly idleBackoff: { readonly type: "boolean"; }; readonly expireAfter: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly heartbeat: { readonly type: "string"; readonly pattern: "^(off|[0-9]+(ms|s|m|h))$"; }; readonly includeShells: { readonly type: "boolean"; }; readonly heldInputDetection: { readonly type: "boolean"; }; }; }; readonly untilEvent: { readonly type: "object"; readonly required: readonly ["summary", "kinds"]; readonly properties: { readonly summary: { readonly type: "string"; }; readonly kinds: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; }; }; readonly nextCommands: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly workspaces: { readonly $ref: "#/jsonSchemas/workspacesSummary"; }; }; readonly additionalProperties: false; }; readonly workspacesSummary: { readonly type: "object"; readonly required: readonly ["state", "machine", "otherMachines", "lines"]; readonly additionalProperties: false; readonly properties: { readonly state: { readonly enum: readonly ["on", "off"]; }; readonly machine: { readonly type: readonly ["string", "null"]; readonly description: "This machine's Tailscale name."; }; readonly reason: { readonly type: "string"; readonly description: "Why workspaces are off."; }; readonly fix: { readonly type: "string"; readonly description: "The one step that turns them on."; }; readonly otherMachines: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["name", "os", "online", "owner", "mine"]; readonly additionalProperties: false; readonly properties: { readonly name: { readonly type: "string"; }; readonly os: { readonly enum: readonly ["macOS", "Windows", "Linux"]; }; readonly online: { readonly type: "boolean"; }; readonly owner: { readonly type: "string"; readonly description: "Tailscale login of the machine's owner."; }; readonly mine: { readonly type: "boolean"; readonly description: "Signed in to this machine's own Tailscale login."; }; }; }; }; readonly lines: { readonly type: "array"; readonly items: { readonly type: "string"; }; readonly description: "The block printed by help, doctor, and agent-context."; }; }; }; readonly daemonRepairResult: { readonly type: "object"; readonly required: readonly ["ok", "changed", "paneDir", "strategy", "launcherPath", "before", "after", "message"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly changed: { readonly type: "boolean"; }; readonly paneDir: { readonly type: "string"; }; readonly strategy: { readonly enum: readonly ["systemd-user", "launch-agent", "scheduled-task", "manual", "skipped"]; }; readonly launcherPath: { readonly type: "string"; }; readonly before: { readonly type: "object"; readonly additionalProperties: true; }; readonly after: { readonly type: "object"; readonly additionalProperties: true; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly repoListResult: { readonly type: "object"; readonly required: readonly ["ok", "repos"]; readonly properties: { readonly ok: { readonly const: true; }; readonly repos: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["id", "name", "path", "active", "sessionCount"]; readonly properties: { readonly id: { readonly type: "number"; }; readonly name: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; readonly active: { readonly type: "boolean"; }; readonly environment: { readonly type: "string"; }; readonly sessionCount: { readonly type: "number"; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly repoAddRequest: { readonly type: "object"; readonly required: readonly ["path"]; readonly properties: { readonly path: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly dryRun: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly repoAddResult: { readonly type: "object"; readonly required: readonly ["ok", "created"]; readonly properties: { readonly ok: { readonly const: true; }; readonly created: { readonly type: "boolean"; }; readonly dryRun: { readonly type: "boolean"; }; readonly repo: { readonly $ref: "#/jsonSchemas/repoListResult/properties/repos/items"; }; readonly preview: { readonly type: "object"; readonly required: readonly ["name", "path", "alreadyExists", "wouldCreate"]; readonly properties: { readonly name: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; readonly alreadyExists: { readonly type: "boolean"; }; readonly wouldCreate: { readonly type: "boolean"; }; readonly environment: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly paneCreateRequest: { readonly type: "object"; readonly required: readonly ["repo", "panes"]; readonly properties: { readonly repo: { readonly oneOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly id: { readonly type: "number"; }; readonly path: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly active: { readonly const: true; }; }; readonly additionalProperties: false; }]; }; readonly panes: { readonly type: "array"; readonly minItems: 1; readonly items: { readonly type: "object"; readonly required: readonly ["name", "tool"]; readonly properties: { readonly name: { readonly type: "string"; }; readonly worktreeName: { readonly type: "string"; }; readonly branch: { readonly type: "string"; }; readonly baseBranch: { readonly type: "string"; }; readonly sessionPrompt: { readonly type: "string"; }; readonly pinned: { readonly type: "boolean"; }; readonly tool: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["agent"]; readonly properties: { readonly agent: { readonly enum: readonly ["codex", "claude"]; }; readonly title: { readonly type: "string"; }; readonly initialInput: { readonly type: "string"; }; readonly initialInputAsFilePointer: { readonly type: "boolean"; }; readonly initialInputAttachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["command"]; readonly properties: { readonly command: { readonly type: "string"; }; readonly agentType: { readonly enum: readonly ["codex", "claude", "cursor"]; }; readonly title: { readonly type: "string"; }; readonly initialInput: { readonly type: "string"; }; readonly initialInputAsFilePointer: { readonly type: "boolean"; }; readonly initialInputAttachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }]; }; }; readonly additionalProperties: false; }; }; readonly dryRun: { readonly type: "boolean"; }; readonly timeoutMs: { readonly type: "number"; }; readonly waitReady: { readonly type: "boolean"; }; readonly readyTimeoutMs: { readonly type: "number"; }; readonly concurrency: { readonly type: "number"; }; readonly noFocus: { readonly type: "boolean"; }; readonly focus: { readonly type: "boolean"; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; readonly associateSession: { readonly type: "string"; readonly description: "Session id to associate each created Pane with; the CLI sets it from PANE_ORCHESTRATION_SESSION_ID unless --no-associate."; }; readonly expectReport: { readonly type: "boolean"; readonly description: "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."; }; }; readonly additionalProperties: false; }; readonly paneCreateResult: { readonly type: "object"; readonly required: readonly ["ok", "repo", "items"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly generation: { readonly type: "number"; }; readonly repo: { readonly $ref: "#/jsonSchemas/repoListResult/properties/repos/items"; }; readonly items: { readonly type: "array"; readonly items: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["ok", "index", "name", "pinned"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly index: { readonly type: "number"; }; readonly name: { readonly type: "string"; }; readonly pinned: { readonly type: "boolean"; }; readonly sessionId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; readonly nextCommand: { readonly type: "string"; }; readonly tool: { readonly type: "object"; readonly required: readonly ["title", "command"]; readonly properties: { readonly title: { readonly type: "string"; }; readonly command: { readonly type: "string"; }; readonly agent: { readonly enum: readonly ["codex", "claude"]; }; }; readonly additionalProperties: false; }; readonly active: { readonly type: "boolean"; }; readonly focused: { readonly type: "boolean"; }; readonly readiness: { readonly type: "object"; readonly required: readonly ["ok", "condition", "matched", "timedOut", "elapsedMs", "state"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly condition: { readonly enum: readonly ["initialized", "ready", "idle", "text"]; }; readonly matched: { readonly type: "boolean"; }; readonly timedOut: { readonly type: "boolean"; }; readonly elapsedMs: { readonly type: "number"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["first-run-dialog", "codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly reason: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["no-agent-detected", "agent-not-ready", "command-exited"]; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly initialInput: { readonly type: "object"; readonly required: readonly ["delivered", "submitted", "inputBytes"]; readonly properties: { readonly delivered: { readonly type: "boolean"; }; readonly submitted: { readonly type: "boolean"; }; readonly inputBytes: { readonly type: "number"; }; readonly strategy: { readonly enum: readonly ["codex-ctrl-enter", "enter", "tab", "argument"]; }; readonly sequenceName: { readonly enum: readonly ["codex-ctrl-enter-cr", "enter-cr", "tab", "argument"]; }; readonly verifiedSubmitted: { readonly type: "boolean"; }; readonly delivery: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/delivery"; }; readonly staged: { readonly type: "boolean"; }; readonly attempts: { readonly type: "number"; }; readonly sentAt: { readonly type: "string"; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["first-run-dialog", "codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly error: { readonly type: "object"; readonly required: readonly ["message"]; readonly properties: { readonly message: { readonly type: "string"; }; readonly code: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; readonly verification: { readonly enum: readonly ["observed", "unverifiable"]; }; }; readonly additionalProperties: false; }; readonly association: { readonly type: "object"; readonly required: readonly ["sessionId", "ok"]; readonly properties: { readonly sessionId: { readonly type: "string"; }; readonly ok: { readonly type: "boolean"; }; readonly error: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly promptFile: { readonly type: "string"; }; readonly attachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly warnings: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/warnings"; }; readonly setupQueue: { readonly type: "object"; readonly required: readonly ["position", "message"]; readonly properties: { readonly position: { readonly type: "number"; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly base: { readonly type: "object"; readonly required: readonly ["ref", "refresh"]; readonly properties: { readonly ref: { readonly type: "string"; }; readonly commit: { readonly type: "string"; }; readonly refresh: { readonly type: "string"; readonly enum: readonly ["fetched", "recent", "skipped", "failed"]; }; readonly notice: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "index", "error"]; readonly properties: { readonly ok: { readonly const: false; }; readonly index: { readonly type: "number"; }; readonly name: { readonly type: "string"; }; readonly error: { readonly type: "object"; readonly required: readonly ["message"]; readonly properties: { readonly message: { readonly type: "string"; }; readonly code: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly sessionId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; }; readonly additionalProperties: false; }]; }; }; readonly epoch: { readonly type: "string"; readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting."; }; }; readonly additionalProperties: false; }; readonly paneListResult: { readonly type: "object"; readonly required: readonly ["ok", "panes"]; readonly properties: { readonly ok: { readonly const: true; }; readonly repo: { readonly $ref: "#/jsonSchemas/repoListResult/properties/repos/items"; }; readonly panes: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["id", "paneId", "name", "status", "worktreePath", "repoId", "panelCount", "pinned", "agentStatus", "ownership"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly status: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; readonly repoId: { readonly type: "number"; }; readonly repoName: { readonly type: "string"; }; readonly panelCount: { readonly type: "number"; }; readonly pinned: { readonly type: "boolean"; }; readonly createdAt: { readonly type: "string"; }; readonly lastActivity: { readonly type: "string"; }; readonly archived: { readonly type: "boolean"; }; readonly agentStatus: { readonly enum: readonly ["active", "idle"]; }; readonly agentState: { readonly enum: readonly ["ready", "working", "blocked", "none"]; }; readonly ownership: { readonly enum: readonly ["pane", "external"]; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly paneCostRequest: { readonly type: "object"; readonly properties: { readonly repo: { readonly oneOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly id: { readonly type: "number"; }; readonly path: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly active: { readonly const: true; }; }; readonly additionalProperties: false; }]; }; readonly paneId: { readonly type: "string"; readonly minLength: 1; }; }; readonly additionalProperties: false; }; readonly paneCostResult: { readonly $defs: { readonly usageTotals: { readonly type: "object"; readonly required: readonly ["inputTokens", "outputTokens", "cacheReadTokens", "cacheCreationTokens", "totalTokens", "messageCount", "estimatedCostUsd", "costIncomplete", "cacheSavingsUsd"]; readonly properties: { readonly inputTokens: { readonly type: "number"; }; readonly outputTokens: { readonly type: "number"; }; readonly cacheReadTokens: { readonly type: "number"; }; readonly cacheCreationTokens: { readonly type: "number"; }; readonly totalTokens: { readonly type: "number"; }; readonly messageCount: { readonly type: "number"; }; readonly estimatedCostUsd: { readonly type: "number"; }; readonly costIncomplete: { readonly type: "boolean"; }; readonly cacheSavingsUsd: { readonly type: "number"; }; }; readonly additionalProperties: false; }; readonly usageByModel: { readonly type: "object"; readonly required: readonly ["model", "provider", "inputTokens", "outputTokens", "cacheReadTokens", "cacheCreationTokens", "totalTokens", "messageCount", "estimatedCostUsd", "costIncomplete", "cacheSavingsUsd"]; readonly properties: { readonly model: { readonly type: "string"; }; readonly provider: { readonly enum: readonly ["claude", "codex"]; }; readonly inputTokens: { readonly type: "number"; }; readonly outputTokens: { readonly type: "number"; }; readonly cacheReadTokens: { readonly type: "number"; }; readonly cacheCreationTokens: { readonly type: "number"; }; readonly totalTokens: { readonly type: "number"; }; readonly messageCount: { readonly type: "number"; }; readonly estimatedCostUsd: { readonly type: "number"; }; readonly costIncomplete: { readonly type: "boolean"; }; readonly cacheSavingsUsd: { readonly type: "number"; }; }; readonly additionalProperties: false; }; readonly paneCostSlice: { readonly type: "object"; readonly required: readonly ["inputTokens", "outputTokens", "cacheReadTokens", "cacheCreationTokens", "totalTokens", "messageCount", "estimatedCostUsd", "costIncomplete", "cacheSavingsUsd", "uncachedCostUsd", "uncachedInputTokens", "cacheHitRate", "byModel"]; readonly properties: { readonly inputTokens: { readonly type: "number"; }; readonly outputTokens: { readonly type: "number"; }; readonly cacheReadTokens: { readonly type: "number"; }; readonly cacheCreationTokens: { readonly type: "number"; }; readonly totalTokens: { readonly type: "number"; }; readonly messageCount: { readonly type: "number"; }; readonly estimatedCostUsd: { readonly type: "number"; }; readonly costIncomplete: { readonly type: "boolean"; }; readonly cacheSavingsUsd: { readonly type: "number"; }; readonly uncachedCostUsd: { readonly type: "number"; }; readonly uncachedInputTokens: { readonly type: "number"; }; readonly cacheHitRate: { readonly type: "number"; }; readonly byModel: { readonly type: "array"; readonly items: { readonly $ref: "#/$defs/usageByModel"; }; }; }; readonly additionalProperties: false; }; readonly pane: { readonly type: "object"; readonly required: readonly ["paneId", "paneName", "worktreePath", "repoId", "archived", "createdAtMs", "inputTokens", "outputTokens", "cacheReadTokens", "cacheCreationTokens", "totalTokens", "messageCount", "estimatedCostUsd", "costIncomplete", "cacheSavingsUsd", "uncachedCostUsd", "uncachedInputTokens", "cacheHitRate", "byModel"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; readonly repoId: { readonly type: readonly ["number", "null"]; }; readonly archived: { readonly type: "boolean"; }; readonly createdAtMs: { readonly type: "number"; }; readonly inputTokens: { readonly type: "number"; }; readonly outputTokens: { readonly type: "number"; }; readonly cacheReadTokens: { readonly type: "number"; }; readonly cacheCreationTokens: { readonly type: "number"; }; readonly totalTokens: { readonly type: "number"; }; readonly messageCount: { readonly type: "number"; }; readonly estimatedCostUsd: { readonly type: "number"; }; readonly costIncomplete: { readonly type: "boolean"; }; readonly cacheSavingsUsd: { readonly type: "number"; }; readonly uncachedCostUsd: { readonly type: "number"; }; readonly uncachedInputTokens: { readonly type: "number"; }; readonly cacheHitRate: { readonly type: "number"; }; readonly byModel: { readonly type: "array"; readonly items: { readonly $ref: "#/$defs/usageByModel"; }; }; }; readonly additionalProperties: false; }; }; readonly type: "object"; readonly required: readonly ["ok", "fromMs", "toMs", "pricingAsOf", "panes"]; readonly properties: { readonly ok: { readonly const: true; }; readonly fromMs: { readonly type: "number"; }; readonly toMs: { readonly type: "number"; }; readonly pricingAsOf: { readonly type: "string"; }; readonly panes: { readonly type: "array"; readonly items: { readonly $ref: "#/$defs/pane"; }; }; readonly unattributed: { readonly $ref: "#/$defs/paneCostSlice"; }; readonly totals: { readonly $ref: "#/$defs/usageTotals"; }; }; readonly additionalProperties: false; }; readonly workspaceEntry: { readonly type: "object"; readonly required: readonly ["gen", "at", "kind", "paneId", "paneName", "source"]; readonly properties: { readonly gen: { readonly type: "number"; }; readonly at: { readonly type: "string"; }; readonly kind: { readonly enum: readonly ["agent.ready", "agent.busy", "agent.blocked", "agent.unknown", "agent.idle", "pane.created", "pane.gone", "panel.exited", "panel.stopped", "agent.report", "agent.report.missing", "pane.associated", "pane.detached", "pr.conflicted", "pr.checks", "pr.merged", "pr.closed", "pr.head", "pr.base_changed", "pr.base_deleted", "pr.review", "pr.comment", "pr.stopped", "github.unavailable", "github.recovered"]; }; readonly paneId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly repoId: { readonly type: "number"; }; readonly repoName: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly agentType: { readonly type: "string"; }; readonly from: { readonly enum: readonly ["blocked", "working", "idle", "unknown"]; }; readonly to: { readonly enum: readonly ["blocked", "working", "idle", "unknown"]; }; readonly source: { readonly enum: readonly ["agent", "exit", "session", "github"]; }; readonly reason: { readonly oneOf: readonly [{ readonly type: "string"; }, { readonly type: "null"; }]; }; readonly settledMs: { readonly type: "number"; }; readonly idleMs: { readonly type: "number"; }; readonly idleCount: { readonly type: "number"; }; readonly heldInput: { readonly type: "string"; }; readonly heldInputPresent: { readonly type: "boolean"; }; readonly exitCode: { readonly type: "number"; }; readonly running: { readonly type: "boolean"; readonly description: "Baseline agent entries: whether the panel's terminal process is live. A stopped panel is never agent.ready."; }; readonly baseline: { readonly const: true; }; readonly replay: { readonly const: true; readonly description: "Set on baseline entries delivered after a reset. A replayed entry restates current state and is never a new transition: a replayed agent.ready is not READY."; }; readonly changedWhileAway: { readonly type: "boolean"; }; readonly sessionId: { readonly type: "string"; readonly description: "Named Session of a pane.associated or pane.detached entry."; }; readonly sessionName: { readonly type: "string"; }; readonly pr: { readonly type: "object"; readonly description: "PR of a pr.conflicted, pr.checks, or pr.merged entry."; readonly required: readonly ["number", "url", "headOid"]; readonly properties: { readonly number: { readonly type: "number"; }; readonly url: { readonly type: "string"; }; readonly headOid: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly base: { readonly type: "object"; readonly description: "Base branch of a pr.base_changed (old to new) or pr.base_deleted (to is the PR's current base name) entry."; readonly required: readonly ["from", "to"]; readonly properties: { readonly from: { readonly type: "string"; }; readonly to: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly checks: { readonly enum: readonly ["passed", "failed"]; readonly description: "Failures are immediate; success requires complete nonempty required checks on the pinned head."; }; readonly failingChecks: { readonly type: "array"; readonly items: { readonly type: "string"; }; readonly description: "Newly failing check names on this head."; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; readonly description: "Report of an agent.report entry; its summary is cut to 2,000 characters (the panel keeps up to 16,000)."; }; readonly epoch: { readonly type: "string"; readonly description: "Added to watch --json NDJSON events. Persist with gen after processing for numeric rearm."; }; readonly lastOutput: { readonly type: "string"; readonly description: "What an agent.report.missing entry's agent said last, up to 2,000 characters (the end is kept)."; }; readonly lastOutputSource: { readonly enum: readonly ["transcript", "screen"]; readonly description: "transcript: the agent's last reply; screen: the last lines on its screen."; }; readonly expectedSince: { readonly type: "string"; readonly description: "When the work an agent.report.missing entry is about was sent."; }; readonly screenLines: { readonly type: "array"; readonly items: { readonly type: "string"; }; readonly description: "The screen lines of the prompt an agent.blocked entry's agent waits on (at most 20)."; }; }; readonly additionalProperties: false; }; readonly agentReport: { readonly type: "object"; readonly description: "The latest runpane report from an agent panel."; readonly required: readonly ["state", "reportedAt"]; readonly properties: { readonly state: { readonly enum: readonly ["ready", "blocked", "failed", "done"]; }; readonly pr: { readonly type: "number"; }; readonly head: { readonly type: "string"; }; readonly summary: { readonly type: "string"; }; readonly summaryTruncated: { readonly const: true; }; readonly summaryPath: { readonly type: "string"; }; readonly question: { readonly type: "string"; }; readonly reportedAt: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelReport: { readonly type: "object"; readonly description: "A panel's latest runpane report in sessions overview. data is the summary when it is a complete JSON object, returned as the worker gave it; a plain-text, array, scalar, invalid, more than 64 levels deep, or truncated summary has no data."; readonly required: readonly ["state", "reportedAt"]; readonly properties: { readonly state: { readonly enum: readonly ["ready", "blocked", "failed", "done"]; }; readonly pr: { readonly type: "number"; }; readonly head: { readonly type: "string"; }; readonly summary: { readonly type: "string"; }; readonly summaryTruncated: { readonly const: true; }; readonly summaryPath: { readonly type: "string"; }; readonly question: { readonly type: "string"; }; readonly reportedAt: { readonly type: "string"; }; readonly data: { readonly type: "object"; readonly description: "The worker's JSON object summary, returned as given. Pane never reads, renames or validates its fields."; }; }; readonly additionalProperties: false; }; readonly workspaceWaitRequest: { readonly type: "object"; readonly properties: { readonly since: { readonly type: "number"; }; readonly as: { readonly type: "string"; }; readonly from: { readonly enum: readonly ["now", "earliest"]; }; readonly timeoutMs: { readonly type: "number"; }; readonly limit: { readonly type: "number"; }; readonly kinds: { readonly type: "array"; readonly items: { readonly $ref: "#/jsonSchemas/workspaceEntry/properties/kind"; }; }; readonly paneIds: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly session: { readonly type: "string"; readonly description: "Named Session id or exact name. Limits the wait to the Session's associated Panes, resolved on every read, and implies the opt-in pane.associated, pane.detached, and pr.* entries. Cannot be combined with paneIds."; }; readonly excludePaneIds: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly repo: { readonly oneOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly id: { readonly type: "number"; }; readonly path: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly active: { readonly const: true; }; }; readonly additionalProperties: false; }]; }; readonly nameContains: { readonly type: "string"; }; readonly agentsOnly: { readonly type: "boolean"; }; readonly ackNow: { readonly type: "boolean"; }; readonly includeHeldInput: { readonly type: "boolean"; }; readonly includeHeldInputPresence: { readonly type: "boolean"; }; readonly idleAfterMs: { readonly type: "number"; }; readonly idleWindowStartMs: { readonly type: "number"; }; readonly settleMs: { readonly type: "number"; }; readonly blockedSettleMs: { readonly type: "number"; }; readonly minIntervalMs: { readonly type: "number"; }; readonly idleBackoff: { readonly type: "boolean"; }; readonly epoch: { readonly type: "string"; readonly description: "Expected epoch for since. Requires since and cannot be combined with as. Mismatch returns epoch-changed reset."; }; }; readonly additionalProperties: false; }; readonly workspaceStateResult: { readonly type: "object"; readonly required: readonly ["ok", "epoch", "generation", "entries"]; readonly properties: { readonly ok: { readonly const: true; }; readonly epoch: { readonly type: "string"; }; readonly generation: { readonly type: "number"; }; readonly entries: { readonly type: "array"; readonly items: { readonly $ref: "#/jsonSchemas/workspaceEntry"; }; }; }; readonly additionalProperties: false; }; readonly workspaceWaitResult: { readonly type: "object"; readonly required: readonly ["ok", "epoch", "generation", "entries", "timedOut", "nextCommand"]; readonly properties: { readonly ok: { readonly const: true; }; readonly epoch: { readonly type: "string"; }; readonly generation: { readonly type: "number"; }; readonly entries: { readonly type: "array"; readonly items: { readonly $ref: "#/jsonSchemas/workspaceEntry"; }; }; readonly timedOut: { readonly type: "boolean"; }; readonly dropped: { readonly type: "number"; }; readonly reset: { readonly type: "object"; readonly required: readonly ["reason"]; readonly properties: { readonly reason: { readonly enum: readonly ["first-use", "epoch-changed", "cursor-truncated", "unknown-consumer"]; }; }; readonly additionalProperties: false; }; readonly session: { readonly type: "object"; readonly description: "The Session a session request resolved to. A client that sent session and gets no session back is talking to a daemon that ignored it."; readonly required: readonly ["id", "name"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; readonly activityGeneration: { readonly type: "number"; readonly description: "Latest meaningful activity in scope, including events hidden by output kinds or cadence. Natural expiry resets when it advances."; }; }; readonly additionalProperties: false; }; readonly paneArchiveRequest: { readonly type: "object"; readonly required: readonly ["paneId"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly force: { readonly type: "boolean"; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; readonly dryRun: { readonly type: "boolean"; }; readonly removeWorktree: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly panePinRequest: { readonly type: "object"; readonly required: readonly ["paneId", "pinned"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly pinned: { readonly type: "boolean"; }; readonly dryRun: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly panePinResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "pinned"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly pinned: { readonly type: "boolean"; }; readonly dryRun: { readonly const: true; }; readonly favoritePinnedAt: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly paneRenameRequest: { readonly type: "object"; readonly required: readonly ["paneId", "name"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly name: { readonly type: "string"; readonly minLength: 1; }; readonly dryRun: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly paneRenameResult: { readonly type: "object"; readonly required: readonly ["ok", "pane"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly dryRun: { readonly const: true; }; readonly pane: { readonly $ref: "#/jsonSchemas/paneListResult/properties/panes/items"; }; }; readonly additionalProperties: false; }; readonly paneFocusRequest: { readonly type: "object"; readonly required: readonly ["paneId"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; }; readonly additionalProperties: false; }; readonly paneFocusResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "focused"]; readonly properties: { readonly ok: { readonly const: true; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly focused: { readonly const: true; }; }; readonly additionalProperties: false; }; readonly paneArchiveResult: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["ok", "paneId", "archived", "forced", "worktreeCleanup", "safetyCheck"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly archived: { readonly const: true; }; readonly forced: { readonly type: "boolean"; }; readonly worktreeCleanup: { readonly enum: readonly ["completed", "failed", "timeout", "not-applicable"]; readonly description: "`completed`: the worktree is gone from its path and from git (see trashDeletion). `failed`: removal failed and the worktree may remain; ok is false. `timeout`: the archive script or git removal is still running in the background; ok stays true. `not-applicable`: nothing was removed (main-repo Pane, or an adopted worktree without --remove-worktree). Released CLIs decode exactly these values."; }; readonly trashDeletion: { readonly enum: readonly ["pending", "done"]; readonly description: "Present with worktreeCleanup `completed`. `pending`: the removed worktree was moved into the repository's .git/pane-trash and its files are still being deleted in the background. `done`: the files are gone."; }; readonly worktreePath: { readonly type: "string"; }; readonly safetyCheck: { readonly type: "object"; readonly required: readonly ["performed"]; readonly properties: { readonly performed: { readonly type: "boolean"; }; readonly hasUncommittedChanges: { readonly type: "boolean"; }; readonly hasUntrackedFiles: { readonly type: "boolean"; }; readonly hasUpstream: { readonly type: "boolean"; }; readonly upstream: { readonly type: "string"; }; readonly upstreamRefreshed: { readonly type: "boolean"; }; readonly unpushedCommits: { readonly type: "number"; }; readonly unpushedCommitDetails: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["sha", "subject"]; readonly properties: { readonly sha: { readonly type: "string"; }; readonly subject: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly reason: { readonly enum: readonly ["external-worktree", "main-repo", "missing-project-context", "git-error"]; }; readonly worktreeWillRemain: { readonly const: true; }; readonly upstreamGone: { readonly type: "boolean"; readonly description: "The branch had an upstream that no longer exists on the remote, so commits were compared with the base branch."; }; readonly mergedViaPr: { readonly type: "object"; readonly description: "A merged pull request whose head commit is HEAD. Its commits are not counted as unpushed."; readonly required: readonly ["number", "headOid"]; readonly properties: { readonly number: { readonly type: "number"; }; readonly headOid: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "paneId", "dryRun", "wouldArchive", "forced", "safetyCheck"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly dryRun: { readonly const: true; }; readonly wouldArchive: { readonly type: "boolean"; }; readonly forced: { readonly type: "boolean"; }; readonly safetyCheck: { readonly $ref: "#/jsonSchemas/paneArchiveResult/oneOf/0/properties/safetyCheck"; }; readonly blocked: { readonly $ref: "#/jsonSchemas/paneArchiveResult/oneOf/2/properties/blocked"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "paneId", "blocked", "nextCommand"]; readonly properties: { readonly ok: { readonly const: false; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["code", "message", "safetyCheck"]; readonly properties: { readonly code: { readonly enum: readonly ["uncommitted-changes", "unpushed-commits", "uncommitted-and-unpushed", "status-unknown"]; }; readonly message: { readonly type: "string"; }; readonly safetyCheck: { readonly type: "object"; readonly required: readonly ["performed"]; readonly properties: { readonly performed: { readonly type: "boolean"; }; readonly hasUncommittedChanges: { readonly type: "boolean"; }; readonly hasUntrackedFiles: { readonly type: "boolean"; }; readonly hasUpstream: { readonly type: "boolean"; }; readonly upstream: { readonly type: "string"; }; readonly upstreamRefreshed: { readonly type: "boolean"; }; readonly unpushedCommits: { readonly type: "number"; }; readonly unpushedCommitDetails: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["sha", "subject"]; readonly properties: { readonly sha: { readonly type: "string"; }; readonly subject: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly reason: { readonly enum: readonly ["external-worktree", "main-repo", "missing-project-context", "git-error"]; }; readonly worktreeWillRemain: { readonly const: true; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }]; }; readonly panelListResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panels"]; readonly properties: { readonly ok: { readonly const: true; }; readonly paneId: { readonly type: "string"; }; readonly panels: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["id", "panelId", "paneId", "type", "title", "active"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly type: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly active: { readonly type: "boolean"; }; readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly agentType: { readonly type: "string"; }; readonly agentDetection: { readonly enum: readonly ["declared", "command", "process", "screen"]; }; readonly launchCommand: { readonly type: "string"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly dock: { readonly type: "boolean"; readonly description: "True on the Pane's terminal dock (its plain shell); omitted on every other panel."; }; readonly position: { readonly type: "number"; }; readonly createdAt: { readonly type: "string"; }; readonly lastActiveAt: { readonly type: "string"; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; }; readonly resumeId: { readonly type: "string"; }; readonly resumeSource: { readonly enum: readonly ["agent-farm", "configured", "agent"]; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly panelOutputResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "limit", "returnedCount", "hasMore", "outputs", "text"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly limit: { readonly type: "number"; }; readonly returnedCount: { readonly type: "number"; }; readonly hasMore: { readonly type: "boolean"; }; readonly outputs: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["type", "data", "timestamp"]; readonly properties: { readonly type: { readonly type: "string"; }; readonly data: {}; readonly timestamp: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly text: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelInputRequest: { readonly type: "object"; readonly required: readonly ["panelId", "input"]; readonly properties: { readonly panelId: { readonly type: "string"; }; readonly input: { readonly type: "string"; }; readonly source: { readonly type: "string"; readonly enum: readonly ["user", "agent"]; }; }; readonly additionalProperties: false; }; readonly panelInputResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "inputBytes", "sentAt"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly inputBytes: { readonly type: "number"; }; readonly sentAt: { readonly type: "string"; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly agentContextBriefResult: { readonly type: "object"; readonly required: readonly ["ok", "mode", "source", "summary", "rules", "tools", "detailCommand"]; readonly properties: { readonly ok: { readonly const: true; }; readonly mode: { readonly const: "brief"; }; readonly source: { readonly const: "runpane-contract"; }; readonly summary: { readonly type: "string"; }; readonly rules: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly tools: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["name", "summary", "arguments"]; readonly properties: { readonly name: { readonly type: "string"; }; readonly summary: { readonly type: "string"; }; readonly arguments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; }; readonly detailCommand: { readonly type: "string"; }; readonly workspaces: { readonly $ref: "#/jsonSchemas/workspacesSummary"; }; }; readonly additionalProperties: false; }; readonly agentContextCommandResult: { readonly type: "object"; readonly required: readonly ["ok", "mode", "source", "command"]; readonly properties: { readonly ok: { readonly const: true; }; readonly mode: { readonly const: "command"; }; readonly source: { readonly const: "runpane-contract"; }; readonly command: { readonly type: "object"; readonly required: readonly ["name", "summary", "details", "arguments", "examples"]; readonly properties: { readonly name: { readonly type: "string"; }; readonly summary: { readonly type: "string"; }; readonly details: { readonly type: "string"; }; readonly requiresPaneDaemon: { readonly type: "boolean"; }; readonly mutates: { readonly type: "boolean"; }; readonly arguments: { readonly type: "array"; readonly items: { readonly type: "object"; }; }; readonly examples: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly jsonSchemas: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly notes: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly panelScreenResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "source", "limit", "returnedLineCount", "hasMore", "text", "state", "composer"]; readonly properties: { readonly ok: { readonly const: true; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly source: { readonly enum: readonly ["alternateScreen", "scrollback", "persistedOutput", "empty"]; }; readonly limit: { readonly type: "number"; }; readonly returnedLineCount: { readonly type: "number"; }; readonly hasMore: { readonly type: "boolean"; }; readonly text: { readonly type: "string"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly composer: { readonly type: "object"; readonly required: readonly ["isPresent", "hasUndeliveredText"]; readonly properties: { readonly isPresent: { readonly type: "boolean"; }; readonly hasUndeliveredText: { readonly type: "boolean"; }; readonly ghostText: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly initialInput: { readonly $ref: "#/jsonSchemas/paneCreateResult/properties/items/items/oneOf/0/properties/initialInput"; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelSubmitRequest: { readonly type: "object"; readonly required: readonly ["panelId", "input"]; readonly properties: { readonly panelId: { readonly type: "string"; }; readonly input: { readonly type: "string"; }; readonly asFilePointer: { readonly type: "boolean"; }; readonly attachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly source: { readonly type: "string"; readonly enum: readonly ["user", "agent"]; }; readonly interrupt: { readonly type: "boolean"; }; readonly expectReport: { readonly type: "boolean"; readonly description: "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."; }; readonly operationId: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelSubmitResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "inputBytes", "enter", "sequenceName", "verifiedSubmitted", "sentAt"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly generation: { readonly type: "number"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly inputBytes: { readonly type: "number"; }; readonly enter: { readonly enum: readonly ["cr", "tab", "none"]; }; readonly sequenceName: { readonly enum: readonly ["codex-ctrl-enter-cr", "enter-cr", "tab", "acp"]; }; readonly verifiedSubmitted: { readonly type: "boolean"; }; readonly delivery: { readonly type: "object"; readonly required: readonly ["state", "evidence"]; readonly properties: { readonly state: { readonly enum: readonly ["taken", "queued", "in-composer", "unknown"]; }; readonly evidence: { readonly enum: readonly ["transcript", "screen", "argv", "acp-receipt"]; }; readonly message: { readonly type: "string"; readonly description: "Human explanation of delivery; queued means the agent has not read the message yet."; }; }; readonly additionalProperties: false; }; readonly sentAt: { readonly type: "string"; }; readonly blocked: { readonly $ref: "#/jsonSchemas/panelSubmitComposerResult/properties/blocked"; }; readonly promptFile: { readonly type: "string"; }; readonly attachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly warnings: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["leading-bang-runs-shell", "leading-hash-memory", "leading-slash-command", "leading-at-mention"]; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly nextCommand: { readonly type: "string"; }; readonly verification: { readonly enum: readonly ["observed", "unverifiable"]; }; readonly expectedReport: { readonly type: "object"; readonly required: readonly ["since"]; readonly properties: { readonly since: { readonly type: "string"; }; }; readonly additionalProperties: false; readonly description: "The report Pane now waits for: set for work an agent sent, or with --expect-report."; }; readonly epoch: { readonly type: "string"; readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting."; }; readonly operationId: { readonly type: "string"; readonly description: "Durable host operation ID for Chat delivery reconciliation."; }; }; readonly additionalProperties: false; }; readonly panelWaitResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "condition", "matched", "timedOut", "elapsedMs", "state", "screen"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly condition: { readonly enum: readonly ["initialized", "ready", "idle", "text"]; }; readonly matched: { readonly type: "boolean"; }; readonly timedOut: { readonly type: "boolean"; }; readonly elapsedMs: { readonly type: "number"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["first-run-dialog", "codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly reason: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["no-agent-detected", "agent-not-ready", "command-exited"]; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly stopped: { readonly const: true; readonly description: "The wait did not match and the panel's terminal is not running (ready and idle waits return this after a 2-second grace instead of timing out); nextCommand is `runpane panels resume`."; }; readonly screen: { readonly type: "object"; readonly required: readonly ["source", "text", "hasMore"]; readonly properties: { readonly source: { readonly enum: readonly ["alternateScreen", "scrollback", "persistedOutput", "empty", "acpTranscript"]; }; readonly text: { readonly type: "string"; }; readonly hasMore: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelResumeResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "paneId", "action", "message", "panel", "nextCommand"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly action: { readonly enum: readonly ["resumed", "already-running"]; readonly description: "resumed: the panel's terminal was restarted in place. already-running: nothing was restarted."; }; readonly message: { readonly type: "string"; }; readonly agentType: { readonly type: "string"; }; readonly agentSessionId: { readonly type: "string"; readonly description: "The agent conversation the panel resumes, when Pane knows it."; }; readonly panel: { readonly type: "object"; readonly required: readonly ["id", "panelId", "paneId", "type", "title", "active"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly type: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly active: { readonly type: "boolean"; }; readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly agentType: { readonly type: "string"; }; readonly agentDetection: { readonly enum: readonly ["declared", "command", "process", "screen"]; }; readonly launchCommand: { readonly type: "string"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly position: { readonly type: "number"; }; readonly createdAt: { readonly type: "string"; }; readonly lastActiveAt: { readonly type: "string"; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; }; }; readonly additionalProperties: false; }; readonly readiness: { readonly type: "object"; readonly required: readonly ["ok", "condition", "matched", "timedOut", "elapsedMs", "state"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly condition: { readonly enum: readonly ["initialized", "ready", "idle", "text"]; }; readonly matched: { readonly type: "boolean"; }; readonly timedOut: { readonly type: "boolean"; }; readonly elapsedMs: { readonly type: "number"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelResumeManyResult: { readonly type: "object"; readonly required: readonly ["ok", "scope", "resumed", "alreadyRunning", "failed", "notReady", "concurrency", "items"]; readonly properties: { readonly ok: { readonly type: "boolean"; readonly description: "Every stopped panel in scope resumed and, with --wait-ready, became ready."; }; readonly scope: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["kind", "sessionId", "sessionName"]; readonly properties: { readonly kind: { readonly const: "session"; }; readonly sessionId: { readonly type: "string"; }; readonly sessionName: { readonly type: "string"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["kind"]; readonly properties: { readonly kind: { readonly const: "all-stopped"; }; }; readonly additionalProperties: false; }]; }; readonly resumed: { readonly type: "number"; }; readonly alreadyRunning: { readonly type: "number"; readonly description: "Agent panels in scope that were already running and were left alone."; }; readonly failed: { readonly type: "number"; readonly description: "Panels that could not be restarted; their item carries error."; }; readonly notReady: { readonly type: "number"; readonly description: "With --wait-ready: resumed panels that were blocked or not ready within --ready-timeout-ms."; }; readonly concurrency: { readonly type: "number"; readonly description: "Panels restarted at once."; }; readonly items: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "paneId", "paneName"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly panelTitle: { readonly type: "string"; }; readonly agentType: { readonly type: "string"; }; readonly action: { readonly enum: readonly ["resumed", "already-running"]; }; readonly message: { readonly type: "string"; }; readonly agentSessionId: { readonly type: "string"; }; readonly readiness: { readonly type: "object"; readonly required: readonly ["ok", "condition", "matched", "timedOut", "elapsedMs", "state"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly condition: { readonly enum: readonly ["initialized", "ready", "idle", "text"]; }; readonly matched: { readonly type: "boolean"; }; readonly timedOut: { readonly type: "boolean"; }; readonly elapsedMs: { readonly type: "number"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly error: { readonly type: "string"; readonly description: "Why this panel could not be resumed; the others still were."; }; }; readonly additionalProperties: false; }; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly panelLastMessageResult: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["ok", "panelId", "paneId", "agentType", "text", "length", "limit", "truncated"]; readonly properties: { readonly ok: { readonly const: true; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly agentType: { readonly enum: readonly ["claude", "codex"]; }; readonly text: { readonly type: "string"; }; readonly length: { readonly type: "number"; }; readonly limit: { readonly type: "number"; }; readonly truncated: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "panelId", "paneId", "reason", "message"]; readonly properties: { readonly ok: { readonly const: false; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly reason: { readonly const: "transcript-unavailable"; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }]; }; readonly agentDoctorResult: { readonly type: "object"; readonly required: readonly ["ok", "agent", "command", "available", "checks"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly agent: { readonly enum: readonly ["codex", "claude"]; }; readonly command: { readonly type: "string"; }; readonly repo: { readonly $ref: "#/jsonSchemas/repoListResult/properties/repos/items"; }; readonly environment: { readonly enum: readonly ["wsl", "windows", "linux", "macos"]; }; readonly available: { readonly type: "boolean"; }; readonly executablePath: { readonly type: "string"; }; readonly version: { readonly type: "string"; }; readonly checks: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["name", "ok", "message"]; readonly properties: { readonly name: { readonly type: "string"; }; readonly ok: { readonly type: "boolean"; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly warnings: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; readonly panelCreateRequest: { readonly type: "object"; readonly required: readonly ["paneId", "tool"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly type: { readonly const: "terminal"; }; readonly tool: { readonly type: "object"; readonly additionalProperties: true; }; readonly noFocus: { readonly type: "boolean"; }; readonly focus: { readonly type: "boolean"; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; readonly waitReady: { readonly type: "boolean"; }; readonly readyTimeoutMs: { readonly type: "number"; }; readonly expectReport: { readonly type: "boolean"; readonly description: "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."; }; }; readonly additionalProperties: false; }; readonly panelCreateResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "title", "active", "focused", "tool"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly active: { readonly type: "boolean"; }; readonly focused: { readonly type: "boolean"; }; readonly tool: { readonly type: "object"; readonly required: readonly ["title", "command"]; readonly properties: { readonly title: { readonly type: "string"; }; readonly command: { readonly type: "string"; }; readonly agent: { readonly enum: readonly ["codex", "claude"]; }; }; readonly additionalProperties: false; }; readonly readiness: { readonly type: "object"; readonly required: readonly ["ok", "condition", "matched", "timedOut", "elapsedMs", "state"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly condition: { readonly enum: readonly ["initialized", "ready", "idle", "text"]; }; readonly matched: { readonly type: "boolean"; }; readonly timedOut: { readonly type: "boolean"; }; readonly elapsedMs: { readonly type: "number"; }; readonly state: { readonly type: "object"; readonly required: readonly ["initialized"]; readonly properties: { readonly initialized: { readonly type: "boolean"; }; readonly running: { readonly type: "boolean"; readonly description: "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."; }; readonly isAlternateScreen: { readonly type: "boolean"; }; readonly activityStatus: { readonly enum: readonly ["active", "idle"]; }; readonly isCliReady: { readonly type: "boolean"; }; readonly isCliPanel: { readonly type: "boolean"; }; readonly agentType: { readonly enum: readonly ["codex", "claude"]; }; readonly lastActivity: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["first-run-dialog", "codex-update", "agent-prompt", "submission_unverified", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly reason: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["no-agent-detected", "agent-not-ready", "command-exited"]; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly promptFile: { readonly type: "string"; }; readonly attachments: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly warnings: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/warnings"; }; readonly nextCommand: { readonly type: "string"; }; readonly expectedReport: { readonly type: "object"; readonly required: readonly ["since"]; readonly properties: { readonly since: { readonly type: "string"; }; }; readonly additionalProperties: false; readonly description: "The report Pane now waits for: set for work an agent sent, or with --expect-report."; }; readonly epoch: { readonly type: "string"; readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting."; }; }; readonly additionalProperties: false; }; readonly panelOpenRequest: { readonly type: "object"; readonly required: readonly ["paneId"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly url: { readonly type: "string"; }; readonly filePath: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly placement: { readonly enum: readonly ["split", "tab"]; }; readonly noFocus: { readonly type: "boolean"; }; readonly focus: { readonly type: "boolean"; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; }; readonly additionalProperties: false; }; readonly panelOpenResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "type", "title", "placement", "active", "reused"]; readonly properties: { readonly ok: { readonly const: true; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly type: { readonly enum: readonly ["browser", "editor"]; }; readonly title: { readonly type: "string"; }; readonly url: { readonly type: "string"; }; readonly filePath: { readonly type: "string"; }; readonly placement: { readonly enum: readonly ["split", "tab"]; }; readonly active: { readonly type: "boolean"; }; readonly reused: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly panelSubmitComposerRequest: { readonly type: "object"; readonly required: readonly ["panelId"]; readonly properties: { readonly panelId: { readonly type: "string"; }; readonly strategy: { readonly enum: readonly ["auto", "codex-ctrl-enter", "enter", "tab"]; }; }; readonly additionalProperties: false; }; readonly panelSubmitComposerResult: { readonly type: "object"; readonly required: readonly ["ok", "panelId", "inputBytes", "strategy", "sequenceName", "verifiedSubmitted", "sentAt"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly generation: { readonly type: "number"; }; readonly panelId: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly inputBytes: { readonly type: "number"; }; readonly strategy: { readonly enum: readonly ["codex-ctrl-enter", "enter", "tab"]; }; readonly sequenceName: { readonly enum: readonly ["codex-ctrl-enter-cr", "enter-cr", "tab"]; }; readonly verifiedSubmitted: { readonly type: "boolean"; }; readonly delivery: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/delivery"; }; readonly sentAt: { readonly type: "string"; }; readonly blocked: { readonly type: "object"; readonly required: readonly ["kind", "message"]; readonly properties: { readonly kind: { readonly enum: readonly ["first-run-dialog", "codex-update", "agent-prompt", "submission_unverified", "composer-unknown", "unknown"]; }; readonly message: { readonly type: "string"; }; readonly suggestedCommand: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly nextCommand: { readonly type: "string"; }; readonly verification: { readonly enum: readonly ["observed", "unverifiable"]; }; }; readonly additionalProperties: false; }; readonly sessionListResult: { readonly type: "object"; readonly required: readonly ["ok", "sessions"]; readonly properties: { readonly ok: { readonly const: true; }; readonly sessions: { readonly type: "array"; readonly items: { readonly type: "object"; }; }; readonly selectedSessionId: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly sessionResult: { readonly type: "object"; readonly required: readonly ["ok", "session"]; readonly properties: { readonly ok: { readonly const: true; }; readonly session: { readonly type: "object"; }; readonly panelId: { readonly type: "string"; }; readonly internalSessionId: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly sessionOverviewResult: { readonly type: "object"; readonly required: readonly ["ok", "session", "status", "panes", "activity", "refreshedAt"]; readonly properties: { readonly ok: { readonly const: true; }; readonly session: { readonly type: "object"; }; readonly status: { readonly type: "string"; }; readonly panes: { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly panels: { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly report: { readonly $ref: "#/jsonSchemas/panelReport"; }; }; }; }; }; }; }; readonly activity: { readonly type: "array"; }; readonly refreshedAt: { readonly type: "string"; }; readonly locks: { readonly type: "array"; readonly items: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items"; }; }; }; readonly additionalProperties: false; }; readonly lockListResult: { readonly type: "object"; readonly required: readonly ["ok", "locks"]; readonly properties: { readonly ok: { readonly const: true; }; readonly locks: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["name", "scope", "owner", "acquiredAt", "expiresAt", "ttlMs"]; readonly properties: { readonly name: { readonly type: "string"; readonly minLength: 1; }; readonly scope: { readonly enum: readonly ["session", "global"]; }; readonly sessionId: { readonly type: "string"; }; readonly owner: { readonly type: "object"; readonly required: readonly ["kind"]; readonly properties: { readonly kind: { readonly enum: readonly ["pane", "external"]; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly label: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly note: { readonly type: "string"; }; readonly acquiredAt: { readonly type: "string"; }; readonly expiresAt: { readonly type: "string"; }; readonly ttlMs: { readonly type: "number"; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly lockAcquireRequest: { readonly type: "object"; readonly required: readonly ["name", "ttlMs", "owner"]; readonly properties: { readonly name: { readonly type: "string"; readonly minLength: 1; }; readonly ttlMs: { readonly type: "number"; }; readonly waitMs: { readonly type: "number"; }; readonly note: { readonly type: "string"; }; readonly owner: { readonly type: "object"; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly label: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly lockAcquireResult: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["ok", "acquired", "renewed", "waitedMs", "lock"]; readonly properties: { readonly ok: { readonly const: true; }; readonly acquired: { readonly const: true; }; readonly renewed: { readonly type: "boolean"; }; readonly waitedMs: { readonly type: "number"; }; readonly lock: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "acquired", "timedOut", "waitedMs", "heldBy", "expiresAt", "lock"]; readonly properties: { readonly ok: { readonly const: false; }; readonly acquired: { readonly const: false; }; readonly timedOut: { readonly type: "boolean"; }; readonly waitedMs: { readonly type: "number"; }; readonly heldBy: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items/properties/owner"; }; readonly expiresAt: { readonly type: "string"; }; readonly lock: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items"; }; }; readonly additionalProperties: false; }]; }; readonly lockReleaseResult: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["ok", "released", "forced"]; readonly properties: { readonly ok: { readonly const: true; }; readonly released: { readonly type: "boolean"; }; readonly forced: { readonly type: "boolean"; }; readonly lock: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["ok", "released", "reason", "heldBy", "expiresAt", "lock"]; readonly properties: { readonly ok: { readonly const: false; }; readonly released: { readonly const: false; }; readonly reason: { readonly const: "not-owner"; }; readonly heldBy: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items/properties/owner"; }; readonly expiresAt: { readonly type: "string"; }; readonly lock: { readonly $ref: "#/jsonSchemas/lockListResult/properties/locks/items"; }; }; readonly additionalProperties: false; }]; }; readonly daemonActionResult: { readonly type: "object"; readonly required: readonly ["ok"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly data: {}; readonly error: { readonly type: "object"; readonly required: readonly ["message"]; readonly properties: { readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly link: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly linkCreateResult: { readonly type: "object"; readonly required: readonly ["ok", "url", "target"]; readonly properties: { readonly ok: { readonly const: true; }; readonly url: { readonly type: "string"; }; readonly target: { readonly type: "object"; readonly required: readonly ["kind", "id"]; readonly properties: { readonly kind: { readonly enum: readonly ["pane", "repo", "session"]; }; readonly id: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly docsSearchResult: { readonly type: "object"; readonly required: readonly ["ok", "query", "results"]; readonly properties: { readonly ok: { readonly const: true; }; readonly query: { readonly type: "string"; }; readonly results: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["path", "title", "kind", "excerpt"]; readonly properties: { readonly path: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly kind: { readonly enum: readonly ["doc", "skill", "help", "command"]; }; readonly excerpt: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly docsReadResult: { readonly type: "object"; readonly required: readonly ["ok", "path", "title", "kind", "text"]; readonly properties: { readonly ok: { readonly const: true; }; readonly path: { readonly type: "string"; }; readonly title: { readonly type: "string"; }; readonly kind: { readonly enum: readonly ["doc", "skill", "help", "command"]; }; readonly text: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly agentTaskResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "link", "ready"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly worktreePath: { readonly type: "string"; }; readonly link: { readonly type: "string"; }; readonly ready: { readonly type: "boolean"; }; readonly promptDelivered: { readonly type: "boolean"; }; readonly next: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly agentStatusResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "status", "screen"]; readonly properties: { readonly ok: { readonly const: true; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly status: { readonly enum: readonly ["working", "ready", "blocked", "idle", "exited", "unknown"]; }; readonly screen: { readonly type: "string"; }; readonly hasUndeliveredText: { readonly type: "boolean"; }; readonly link: { readonly type: "string"; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; }; }; readonly additionalProperties: false; }; readonly agentSendResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "delivered"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly delivered: { readonly type: "boolean"; }; readonly delivery: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/delivery"; }; readonly blocked: { readonly type: "string"; }; readonly promptFile: { readonly type: "string"; }; readonly warnings: { readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/warnings"; }; readonly next: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly agentContextUnknownCommandError: { readonly type: "object"; readonly required: readonly ["ok", "code", "message", "candidates"]; readonly properties: { readonly ok: { readonly const: false; }; readonly code: { readonly const: "unknown_command"; }; readonly message: { readonly type: "string"; }; readonly candidates: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; readonly reportResult: { readonly type: "object"; readonly required: readonly ["ok", "paneId", "panelId", "report", "sessionIds"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; }; readonly sessionIds: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly liveWatchers: { readonly type: "number"; readonly description: "Watches that were waiting for this report when it was journaled and received it. A snapshot: a named-cursor watch that waits later still receives it. Absent from older daemons."; }; }; readonly additionalProperties: false; }; readonly paneArchiveBulkRequest: { readonly type: "object"; readonly required: readonly ["sessionId", "merged"]; readonly properties: { readonly sessionId: { readonly type: "string"; }; readonly merged: { readonly const: true; }; readonly source: { readonly enum: readonly ["user", "agent"]; }; readonly dryRun: { readonly type: "boolean"; }; readonly removeWorktree: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly paneArchiveBulkResult: { readonly type: "object"; readonly required: readonly ["ok", "sessionId", "merged", "removeWorktree", "archived", "skipped", "failed", "items"]; readonly properties: { readonly ok: { readonly type: "boolean"; }; readonly sessionId: { readonly type: "string"; }; readonly merged: { readonly const: true; }; readonly dryRun: { readonly const: true; }; readonly removeWorktree: { readonly type: "boolean"; }; readonly archived: { readonly type: "number"; readonly description: "Panes archived, or that would be archived with --dry-run."; }; readonly skipped: { readonly type: "number"; }; readonly failed: { readonly type: "number"; }; readonly items: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["paneId", "outcome"]; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; readonly outcome: { readonly enum: readonly ["archived", "would-archive", "skipped", "failed"]; }; readonly skipped: { readonly type: "object"; readonly required: readonly ["code", "message"]; readonly properties: { readonly code: { readonly enum: readonly ["uncommitted-changes", "unpushed-commits", "uncommitted-and-unpushed", "status-unknown", "missing-pane", "already-archived", "main-repo", "pr-open", "pr-not-merged", "pr-status-unknown"]; }; readonly message: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly error: { readonly type: "string"; }; readonly pr: { readonly type: "object"; readonly required: readonly ["state"]; readonly properties: { readonly state: { readonly enum: readonly ["open", "merged", "closed", "none", "unknown"]; }; readonly number: { readonly type: "number"; }; readonly reason: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly safetyCheck: { readonly $ref: "#/jsonSchemas/paneArchiveResult/oneOf/0/properties/safetyCheck"; }; readonly worktreeCleanup: { readonly $ref: "#/jsonSchemas/paneArchiveResult/oneOf/0/properties/worktreeCleanup"; }; readonly trashDeletion: { readonly $ref: "#/jsonSchemas/paneArchiveResult/oneOf/0/properties/trashDeletion"; }; readonly worktreePath: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly prWatchResult: { readonly type: "object"; readonly required: readonly ["ok"]; readonly properties: { readonly ok: { readonly const: true; }; readonly generation: { readonly type: "number"; }; readonly watch: { readonly type: "object"; }; readonly watches: { readonly type: "array"; readonly items: { readonly type: "object"; }; }; readonly removed: { readonly type: "boolean"; }; readonly epoch: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly inboxListResult: { readonly type: "object"; readonly required: readonly ["ok", "session", "items"]; readonly properties: { readonly ok: { readonly const: true; }; readonly session: { readonly type: "object"; readonly required: readonly ["id", "name"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly items: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["id", "sessionId", "kind", "at", "paneId", "paneName", "panelId"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly sessionId: { readonly type: "string"; }; readonly kind: { readonly enum: readonly ["report", "report.missing", "blocked"]; }; readonly at: { readonly type: "string"; }; readonly paneId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly panelTitle: { readonly type: "string"; }; readonly agentType: { readonly type: "string"; }; readonly report: { readonly $ref: "#/jsonSchemas/agentReport"; }; readonly lastOutput: { readonly type: "string"; }; readonly lastOutputSource: { readonly enum: readonly ["transcript", "screen"]; }; readonly reason: { readonly type: "string"; }; readonly screenLines: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly inboxAckResult: { readonly type: "object"; readonly required: readonly ["ok", "acknowledged", "unknown"]; readonly properties: { readonly ok: { readonly const: true; }; readonly acknowledged: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly unknown: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; }; readonly additionalProperties: false; }; readonly dispatchWaitResult: { readonly type: "object"; readonly description: "What `--wait` prints, as one line: how the dispatched work ended. Exit codes: 0 report, 3 missing, 4 blocked, 5 exited or gone, 124 timeout. Exit 6 is indeterminate after journal replacement or history loss; inspect the panel and inbox before retrying."; readonly required: readonly ["ok", "outcome"]; readonly properties: { readonly ok: { readonly type: "boolean"; readonly description: "true only for outcome report."; }; readonly outcome: { readonly enum: readonly ["report", "missing", "blocked", "exited", "gone", "timeout", "indeterminate"]; }; readonly paneId: { readonly type: "string"; }; readonly paneName: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly generation: { readonly type: "number"; readonly description: "The journal entry that ended the wait (on timeout, the position reached)."; }; readonly at: { readonly type: "string"; }; readonly report: { readonly type: "object"; readonly required: readonly ["state"]; readonly properties: { readonly state: { readonly enum: readonly ["ready", "blocked", "failed", "done"]; }; readonly pr: { readonly type: "number"; }; readonly head: { readonly type: "string"; }; readonly summary: { readonly type: "string"; }; readonly summaryTruncated: { readonly const: true; }; readonly summaryPath: { readonly type: "string"; }; readonly question: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly screenLines: { readonly type: "array"; readonly items: { readonly type: "string"; }; }; readonly lastOutput: { readonly type: "string"; }; readonly lastOutputSource: { readonly enum: readonly ["transcript", "screen"]; }; readonly reason: { readonly type: "string"; }; readonly exitCode: { readonly type: "number"; }; readonly nextCommand: { readonly type: "string"; readonly description: "Recovery command when the outcome is indeterminate."; }; }; readonly additionalProperties: false; }; readonly loopInput: { readonly type: "object"; readonly required: readonly ["name", "cron", "enabled"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly name: { readonly type: "string"; readonly minLength: 1; }; readonly projectId: { readonly type: "number"; }; readonly orchestrationSessionId: { readonly type: "string"; }; readonly cron: { readonly type: "string"; }; readonly agent: { readonly enum: readonly ["claude", "codex", "cursor"]; }; readonly toolCommand: { readonly type: "string"; }; readonly initialInput: { readonly type: "string"; }; readonly worktreeTemplate: { readonly type: "string"; }; readonly enabled: { readonly type: "boolean"; }; }; readonly additionalProperties: false; }; readonly loop: { readonly type: "object"; readonly required: readonly ["id", "name", "cron", "enabled", "createdAtMs", "nextRunAtMs", "scheduleText", "runs"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly name: { readonly type: "string"; readonly minLength: 1; }; readonly projectId: { readonly type: "number"; }; readonly orchestrationSessionId: { readonly type: "string"; }; readonly cron: { readonly type: "string"; }; readonly agent: { readonly enum: readonly ["claude", "codex", "cursor"]; }; readonly toolCommand: { readonly type: "string"; }; readonly initialInput: { readonly type: "string"; }; readonly worktreeTemplate: { readonly type: "string"; }; readonly enabled: { readonly type: "boolean"; }; readonly createdAtMs: { readonly type: "number"; }; readonly nextRunAtMs: { readonly type: readonly ["number", "null"]; }; readonly scheduleText: { readonly type: "string"; }; readonly runs: { readonly type: "array"; readonly items: { readonly type: "object"; readonly required: readonly ["id", "loopId", "slotAtMs", "trigger", "status", "error", "sessionId"]; readonly properties: { readonly id: { readonly type: "string"; }; readonly loopId: { readonly type: "string"; }; readonly slotAtMs: { readonly type: "number"; }; readonly trigger: { readonly enum: readonly ["schedule", "manual"]; }; readonly status: { readonly enum: readonly ["started", "failed", "skipped"]; }; readonly error: { readonly type: readonly ["string", "null"]; }; readonly sessionId: { readonly type: readonly ["string", "null"]; }; }; readonly additionalProperties: false; }; }; }; readonly additionalProperties: false; }; readonly loopListResult: { readonly type: "object"; readonly required: readonly ["ok", "loops"]; readonly properties: { readonly ok: { readonly const: true; }; readonly loops: { readonly type: "array"; readonly items: { readonly $ref: "#/jsonSchemas/loop"; }; }; }; readonly additionalProperties: false; }; readonly loopResult: { readonly type: "object"; readonly required: readonly ["ok", "loop"]; readonly properties: { readonly ok: { readonly const: true; }; readonly loop: { readonly $ref: "#/jsonSchemas/loop"; }; }; readonly additionalProperties: false; }; readonly loopDryRunResult: { readonly type: "object"; readonly required: readonly ["ok", "dryRun", "input", "scheduleText", "nextRunAtMs"]; readonly properties: { readonly ok: { readonly const: true; }; readonly dryRun: { readonly const: true; }; readonly input: { readonly $ref: "#/jsonSchemas/loopInput"; }; readonly scheduleText: { readonly type: "string"; }; readonly nextRunAtMs: { readonly type: "number"; }; }; readonly additionalProperties: false; }; readonly loopDeleteResult: { readonly type: "object"; readonly required: readonly ["ok", "deleted"]; readonly properties: { readonly ok: { readonly const: true; }; readonly deleted: { readonly type: "string"; }; }; readonly additionalProperties: false; }; readonly notifyChoice: { readonly type: "object"; readonly required: readonly ["label"]; readonly properties: { readonly label: { readonly type: "string"; readonly minLength: 1; readonly description: "The answer notify returns when the person picks this choice."; }; readonly detail: { readonly type: "string"; readonly description: "One more line about this choice."; }; readonly recommended: { readonly type: "boolean"; readonly description: "Shade this choice as the one you recommend."; }; }; readonly additionalProperties: false; }; readonly notifyAction: { readonly type: "object"; readonly required: readonly ["label", "url"]; readonly properties: { readonly label: { readonly type: "string"; readonly minLength: 1; }; readonly url: { readonly type: "string"; readonly minLength: 1; }; }; readonly additionalProperties: false; }; readonly notifyRequest: { readonly description: "What `runpane notify` sends on the runpane:notify daemon channel: the question fields, or resume alone."; readonly type: "object"; readonly required: readonly ["caller"]; readonly properties: { readonly ui: { readonly enum: readonly ["options", "approve", "ask", "info"]; }; readonly title: { readonly type: "string"; readonly minLength: 1; }; readonly context: { readonly type: "string"; }; readonly choices: { readonly type: "array"; readonly minItems: 1; readonly maxItems: 9; readonly items: { readonly $ref: "#/jsonSchemas/notifyChoice"; }; }; readonly detail: { readonly type: "string"; }; readonly detailLabel: { readonly type: "string"; readonly maxLength: 40; }; readonly suggestions: { readonly type: "array"; readonly items: { readonly type: "string"; readonly minLength: 1; }; }; readonly action: { readonly $ref: "#/jsonSchemas/notifyAction"; }; readonly resume: { readonly type: "string"; readonly minLength: 1; }; readonly returnAfterMs: { readonly type: "number"; readonly description: "Return waiting after this long; set for MCP clients whose tool calls time out."; }; readonly caller: { readonly type: "object"; readonly properties: { readonly paneId: { readonly type: "string"; }; readonly panelId: { readonly type: "string"; }; readonly cwd: { readonly type: "string"; }; readonly agent: { readonly type: "string"; }; }; readonly additionalProperties: false; }; }; readonly additionalProperties: false; }; readonly notifyResult: { readonly oneOf: readonly [{ readonly type: "object"; readonly required: readonly ["answer"]; readonly properties: { readonly answer: { readonly type: "string"; readonly description: "options: the chosen label. ask: the typed answer."; }; readonly note: { readonly type: "string"; readonly description: "What the person typed with their answer."; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["approved"]; readonly properties: { readonly approved: { readonly type: "boolean"; }; readonly note: { readonly type: "string"; readonly description: "What the person typed with their answer."; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["delivered"]; readonly properties: { readonly delivered: { readonly enum: readonly ["screen", "inbox"]; readonly description: "screen: shown on the strip. inbox: listed in the Notify inbox because a question was on screen."; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["waiting", "id", "next"]; readonly properties: { readonly waiting: { readonly const: true; }; readonly id: { readonly type: "string"; readonly minLength: 1; }; readonly next: { readonly type: "string"; }; }; readonly additionalProperties: false; }, { readonly type: "object"; readonly required: readonly ["unavailable", "next"]; readonly properties: { readonly unavailable: { readonly type: "string"; readonly description: "Why nobody can answer through Pane."; }; readonly next: { readonly type: "string"; }; }; readonly additionalProperties: false; }]; }; }; readonly agentContext: { readonly brief: { readonly title: "Pane agent context"; readonly summary: "Pane lets a developer manage saved base repositories, user-visible Panes (Pane sessions) for feature/PR work, and terminal-backed panel tabs. A Pane is a visible workspace that normally maps to one Pane-managed git worktree and branch; a panel is a terminal tab inside one Pane and shares that Pane's worktree; an agent is a CLI process running inside a panel."; readonly rules: readonly ["Start with `runpane doctor --json` to understand wrapper, platform, daemon reachability, and the next safe commands before mutating Pane state.", "In a Pane repository checkout, if `runpane` is not on PATH, build the local wrapper with `pnpm --filter runpane build` and run it with patched Node 22.23.4+ (22.x), 24.22.1+ (24.x), or 26.12.1+ (26.x), for example `node packages/runpane/dist/cli.js doctor --json`.", "Happy path for any user request to use Pane/RunPane: run `runpane doctor --json`, read `runpane agent-context --json`, resolve or add the saved base repo, then route by the rule 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane: if the work's branch already has a Pane (find it with `runpane panes list --repo <repo> --json` by matching the PR's head branch against `git -C <worktreePath> branch --show-current`), open a new agent tab in it with `runpane panels create --pane <id> --agent <agent> --initial-input \"<task>\" --source agent --no-focus --wait-ready --yes --json`; only when the branch has no Pane yet, create one with a complete command such as `runpane panes create --repo <repo> --name <name> --agent <agent> --prompt \"<task>\" --source agent --no-focus --wait-ready --yes --json` (the new Pane is pinned by default; add `--no-pinned` for a throwaway Pane, add `--base-branch <ref>` to branch from something other than the repository default, or use `--tool-command <command>` instead of `--agent <agent>`), then validate with `panels wait` or `panels screen`. For long-lived supervision, use `runpane watch --follow` instead of polling wait or screen.", "Treat Pane as the user's visible cockpit for watching/co-driving work. Do not create Panes or panels for private delegation unless the user asked for visible Pane orchestration or the result should appear in the Pane app.", "Register the saved base repository once with `repos add`; do not register a pre-created worktree as a separate repo unless the user explicitly asks.", "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Use `panes create` only when the work's branch has no Pane yet (new work, or an existing PR with no Pane), since each new Pane creates a worktree. Every later agent for that branch opens as a new tab in its Pane with `panels create --pane <id>`, never a new Pane. Tabs share one checkout: only the implementer changes the branch or HEAD, one writer at a time; review, audit and QA tabs never run `git checkout`, `reset` or `stash`.", "For private background decomposition, use your normal subagent/worktree mechanism instead of Pane.", "Skill routing: Pane's skills live in `<PANE_DIR>/skills/pane-chat/skills/`, and the Pane Chat entry point is `<PANE_DIR>/skills/pane-chat/pane-orchestrator/SKILL.md`; read the skill that matches the request, such as `discussion`, `create-ticket`, `tdd`, `prepare-pr`, or `review`.", "When an agent creates Panes or panels, pass `--source agent --no-focus --wait-ready --yes --json` unless the user explicitly wants focus moved; `panes create` pins the new Pane into the UI's favorite/pin set by default, so no follow-up `panes pin` call is needed and `--no-pinned` is the opt-out for throwaway Panes.", "Use `runpane agent-context --json` for the full agent-facing CLI context, or `runpane agent-context --command <command> --json` for one detailed command definition.", "For `agent-context --command`, use canonical spaced names like `panes create`; copied forms like `panes.create` or `runpane panes create` are accepted too.", "Use `runpane repos list --json` to find the saved repository when unsure after doctor shows the daemon is reachable.", "If WSL cannot reach Pane, the user may be running Windows Pane; try `/mnt/c/Users/<you>/.pane/bin/runpane doctor --json`, or with an older Pane build `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane doctor --json'`.", "If the repository exists on disk but is not saved in Pane, use `runpane repos add --path <repo> --yes --json` before creating panes.", "Use `runpane agents doctor --agent <codex|claude|cursor> --repo <selector> --json` when agent availability differs across host, Windows, WSL, or repo environments.", "Use `runpane panes create --wait-ready` to create Panes, wait for each agent's input box, and verify its starting message in one call.", "Use `runpane panels screen` for compact current state, including Claude and Codex composer state. Use `panels wait` for create-time readiness or text checks. Use `runpane watch --follow` to block on workspace transitions (READY, BLOCKED, IDLE, STUCK, EXIT) without polling, or `runpane watch --until-event` to exit on the first one. Use `panels submit` to send and submit a new turn. Use `panels submit-composer --strategy auto` only for a composer that was filled separately.", "Use `runpane panels input` only when exact bytes are required, such as Ctrl-C or handcrafted terminal input.", "Pane terminals draw inline images: sixel, iTerm2 inline images, and the kitty graphics protocol. Tools that need kitty graphics, such as terminal-browser and terminal-doom, run inside a Pane panel; `runpane doctor --json` reports the exact list under `terminal.graphicsProtocols`.", "After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen`. For a harness that consumes streaming output, use `runpane watch --follow` (with `--session <id>` for a Session); its named consumer applies settling and batching. Adding numeric --since leaves it unnamed and bypasses cadence; --as cannot be combined with --since. A harness that wakes only when a process exits uses `runpane watch --as <name> --until-event --json` and runs it again after each event. Single-event waits deliver immediately without follow cadence. Never pipe `--follow` into `grep -m1` or `head`.", "When several agents share one resource, such as a test account, name a lock in their prompts: each worker runs `runpane lock acquire --name <name> --ttl 30m --wait 1800000 --json` before using it and `runpane lock release --name <name>` after.", "Loops (`runpane loops create`) run a task on a cron schedule, each run in a new Pane or, with `--session`, as a message to a Session's agent. They are for large recurring jobs, such as a nightly bug sweep, and run at most once an hour. For a short wait, use your agent harness's own sleep and wake instead."]; readonly detailCommand: "runpane agent-context --command <command> [--json]"; readonly tools: readonly [{ readonly name: "doctor"; readonly summary: "Report wrapper, platform, installed Pane, and daemon reachability before an agent mutates Pane state."; readonly arguments: readonly ["--json", "--pane-dir <path>", "--pane-path <path>"]; }, { readonly name: "agent-context"; readonly summary: "Print token-efficient Pane command context for coding agents."; readonly arguments: readonly ["--command <command>", "--json"]; }, { readonly name: "agents doctor"; readonly summary: "Check whether Codex or Claude is available in the repo environment Pane will use."; readonly arguments: readonly ["--agent <codex|claude|cursor>", "--repo <selector>", "--json"]; }, { readonly name: "repos list"; readonly summary: "List repositories saved in the running Pane app."; readonly arguments: readonly ["--json", "--pane-dir <path>"]; }, { readonly name: "repos add"; readonly summary: "Register an existing git repository with the running Pane app."; readonly arguments: readonly ["--path <path>", "--name <name>", "--yes", "--json", "--dry-run", "--pane-dir <path>"]; }, { readonly name: "panes list"; readonly summary: "List Pane sessions, optionally scoped to a saved repository."; readonly arguments: readonly ["--repo <selector>", "--json", "--pane-dir <path>"]; }, { readonly name: "panes cost"; readonly summary: "Report estimated token cost per Pane, with per-model breakdown and cache efficiency."; readonly arguments: readonly ["--repo <selector>", "--pane <pane-id>", "--json", "--pane-dir <path>"]; }, { readonly name: "panes create"; readonly summary: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create a Pane (a new worktree) only when the work's branch has no Pane yet; for review, audit, fix or QA on existing work use `panels create --pane <id>`."; readonly arguments: readonly ["--repo <selector>", "--name <name>", "--agent <codex|claude|cursor>", "--tool-command <command>", "--prompt <text>", "--initial-input-file <path|->", "--from-json <path|->", "--source <user|agent>", "--pinned", "--no-pinned", "--no-associate", "--no-focus", "--focus", "--wait-ready", "--ready-timeout-ms <ms>", "--concurrency <count>", "--yes", "--json"]; }, { readonly name: "panes archive"; readonly summary: "Archive a Pane exactly like the UI Archive action, including safe removal of its Pane-managed git worktree, or archive every merged Pane in a Session."; readonly arguments: readonly ["--pane <pane-id>", "--session <id|name>", "--merged", "--source <user|agent>", "--force", "--remove-worktree", "--dry-run", "--yes", "--json"]; }, { readonly name: "panes pin"; readonly summary: "Declaratively pin a Pane (the Pane UI's favorite/pin star) without changing focus."; readonly arguments: readonly ["--pane <pane-id>", "--yes", "--dry-run", "--json"]; }, { readonly name: "panes unpin"; readonly summary: "Declaratively unpin a Pane (the Pane UI's favorite/pin star) without changing focus."; readonly arguments: readonly ["--pane <pane-id>", "--yes", "--dry-run", "--json"]; }, { readonly name: "panes rename"; readonly summary: "Rename a Pane without changing its worktree, branch, panels, or focus."; readonly arguments: readonly ["--pane <pane-id>", "--name <new-name>", "--yes", "--dry-run", "--json"]; }, { readonly name: "panes focus"; readonly summary: "Raise the Pane window and select a Pane (and optionally a panel) on explicit user request."; readonly arguments: readonly ["--pane <pane-id>", "--panel <panel-id>", "--source <user|agent>", "--yes", "--json"]; }, { readonly name: "panels create"; readonly summary: "Open reviewer, QA, fix or helper agent tabs inside an existing Pane; they share that Pane's worktree. The default for any later agent on existing work."; readonly arguments: readonly ["--pane <pane-id>", "--agent <codex|claude|cursor>", "--tool-command <command>", "--source <user|agent>", "--no-focus", "--focus", "--wait-ready", "--yes", "--json"]; }, { readonly name: "panels open"; readonly summary: "Show the user an HTML page, plan, report, dev server URL, or file as a tab in split view beside the agent."; readonly arguments: readonly ["--pane <pane-id>", "--url <url>", "--file <path>", "--title <title>", "--split", "--tab", "--no-focus", "--source <user|agent>", "--yes", "--json"]; }, { readonly name: "panels list"; readonly summary: "List tool panels inside a Pane session."; readonly arguments: readonly ["--pane <pane-id>", "--json", "--pane-dir <path>"]; }, { readonly name: "panels output"; readonly summary: "Read recent terminal output from a panel."; readonly arguments: readonly ["--panel <panel-id>", "--limit <count>", "--json", "--pane-dir <path>"]; }, { readonly name: "panels screen"; readonly summary: "Read a compact current-screen view from a terminal panel."; readonly arguments: readonly ["--panel <panel-id>", "--limit <count>", "--json", "--pane-dir <path>"]; }, { readonly name: "panels input"; readonly summary: "Send input bytes to a terminal panel."; readonly arguments: readonly ["--panel <panel-id>", "--text <text>", "--input-file <path|->", "--yes", "--json", "--pane-dir <path>"]; }, { readonly name: "panels submit"; readonly summary: "Send text plus terminal Enter to a terminal panel."; readonly arguments: readonly ["--panel <panel-id>", "--text <text>", "--input-file <path|->", "--yes", "--json", "--pane-dir <path>"]; }, { readonly name: "panels submit-composer"; readonly summary: "Submit an agent composer with the key for its current state."; readonly arguments: readonly ["--panel <panel-id>", "--strategy <auto|codex-ctrl-enter|enter|tab>", "--yes", "--json"]; }, { readonly name: "panels wait"; readonly summary: "Wait for terminal initialized, ready, idle, or text state with compact output."; readonly arguments: readonly ["--panel <panel-id>", "--for <condition>", "--contains <text>", "--timeout-ms <ms>", "--interval-ms <ms>", "--json", "--pane-dir <path>"]; }, { readonly name: "panels resume"; readonly summary: "Restart a stopped terminal panel in place (same panel id), resuming its agent's conversation."; readonly arguments: readonly ["--panel <panel-id>", "--session <id|name>", "--all-stopped", "--concurrency <count>", "--wait-ready", "--ready-timeout-ms <ms>", "--yes", "--json", "--pane-dir <path>"]; }, { readonly name: "watch"; readonly summary: "Wait for workspace events from the durable daemon journal; follow uses conservative cadence and quiet expiry by default."; readonly arguments: readonly ["--follow", "--until-event", "--session <id|name>", "--self-test", "--kinds <kind,...>", "--json"]; }, { readonly name: "notify"; readonly summary: "Ask the person a question wherever they are and wait for the answer; prefer it to asking in the terminal."; readonly arguments: readonly ["--ui <options|approve|ask|info>", "--title <text>", "--choices <json>", "--resume <id>", "--json"]; }]; }; readonly commands: { readonly help: { readonly name: "help"; readonly summary: "Show help for runpane or a specific command."; readonly details: "Use this when you need human-readable usage text for a command."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "command"; readonly value: "<command>"; readonly required: false; readonly description: "Optional command topic such as \"panes create\"."; }]; readonly examples: readonly ["runpane help", "runpane help panes create"]; readonly notes: readonly ["Help text is generated from the runpane contract."]; }; readonly setup: { readonly name: "setup"; readonly summary: "Open the guided setup wizard for install, remote host setup, update, and diagnostics."; readonly details: "Use this for a human-driven Pane setup flow, not for unattended agent orchestration."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly []; readonly examples: readonly ["runpane setup"]; readonly notes: readonly ["In non-interactive shells, setup prints help and exits successfully."]; }; readonly install: { readonly name: "install"; readonly summary: "Install Pane on this machine or configure this machine as a remote daemon host."; readonly details: "Installs or launches Pane release artifacts at command runtime. `install daemon` forwards remote setup flags to Pane."; readonly requiresPaneDaemon: false; readonly mutates: true; readonly arguments: readonly [{ readonly name: "target"; readonly value: "<client|daemon>"; readonly required: false; readonly description: "Install the desktop client or configure a remote daemon host."; }, { readonly name: "--version"; readonly value: "<latest|vX.Y.Z>"; readonly required: false; readonly description: "Pane release to install."; }, { readonly name: "--format"; readonly value: "<auto|appimage|deb|dmg|zip|exe>"; readonly required: false; readonly description: "Release artifact format."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip interactive prompts where possible."; }]; readonly examples: readonly ["runpane install client", "runpane install daemon --label \"My Server\""]; readonly notes: readonly ["Package install itself is inert; work begins only when runpane is executed."]; }; readonly update: { readonly name: "update"; readonly summary: "Update Pane and the active supported CLI with durable status."; readonly details: "Defaults to both components. Use --pane-only or --cli-only to select one. Preflight checks installation ownership and supervisor capability before downtime."; readonly requiresPaneDaemon: false; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--version"; readonly value: "<latest|vX.Y.Z>"; readonly required: false; readonly description: "Requested app and CLI release version."; }, { readonly name: "--pane-only"; readonly required: false; readonly description: "Update only the installed Pane app."; }, { readonly name: "--cli-only"; readonly required: false; readonly description: "Update only the invoked supported CLI installation."; }, { readonly name: "--status"; readonly value: "<operation-id>"; readonly required: false; readonly description: "Read durable status without a running Pane."; }, { readonly name: "--wait"; readonly required: false; readonly description: "Wait until the operation completes or requires attention."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Inspect preflight without staging or stopping Pane."; }]; readonly examples: readonly ["runpane update", "runpane update --version latest"]; readonly notes: readonly ["Requires standalone Node and a current-user OS supervisor. npm, managed CLI, and supported pip environments retain their actual ownership. System-package Linux and installations requiring elevation are refused before downtime.", "The operation preserves a pre-migration data snapshot; it never blindly rolls an old app or database over migrated state.", "The initial result can be accepted or staging; it is not a claim that the update or restoration completed."]; }; readonly version: { readonly name: "version"; readonly summary: "Print the runpane wrapper version without contacting, launching, or focusing Pane."; readonly details: "Use this to confirm which wrapper is available. App, daemon, and release diagnostics belong in doctor."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane-path"; readonly value: "<path>"; readonly required: false; readonly description: "Ignored for version; retained only for parser compatibility."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Accepted and ignored, so one --pane-dir can be passed to every runpane command."; }]; readonly examples: readonly ["runpane version", "runpane --version"]; readonly notes: readonly []; }; readonly doctor: { readonly name: "doctor"; readonly summary: "Run platform, release, installed Pane, daemon reachability, and remote setup diagnostics."; readonly details: "Use this first when an agent needs to understand whether Pane is installed, which wrapper/runtime is running, what daemon endpoint is expected, and whether the running Pane app is reachable. JSON mode should return a report even when the daemon is unreachable."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print a machine-readable environment report."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }, { readonly name: "--pane-path"; readonly value: "<path>"; readonly required: false; readonly description: "Inspect a specific Pane executable."; }, { readonly name: "--format"; readonly value: "<format>"; readonly required: false; readonly description: "Release artifact format to inspect."; }, { readonly name: "--verbose"; readonly required: false; readonly description: "Print extra diagnostics."; }, { readonly name: "--report"; readonly required: false; readonly description: "Prepare a redacted, inspectable diagnostic report."; }, { readonly name: "--body-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read report evidence from a file or stdin."; }, { readonly name: "--title"; readonly value: "<text>"; readonly required: false; readonly description: "Report title."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm creating exactly one greenfield-inc/Pane issue."; }]; readonly examples: readonly ["runpane doctor --json", "runpane doctor", "runpane doctor --report --title \"runpane watch failed\" --body-file ./watch.txt --json"]; readonly jsonSchemas: readonly ["doctorResult"]; readonly notes: readonly ["Agents should run `runpane doctor --json` before mutating Pane state.", "The JSON report includes daemon reachability as data; an unreachable daemon is not a reason to skip the rest of the report.", "Use `runpane agent-context --json` after doctor when full CLI context is needed."]; }; readonly "daemon repair": { readonly name: "daemon repair"; readonly summary: "Repair and restart the managed remote-daemon launcher without changing pairing or tunnel configuration."; readonly details: "Use this only after doctor reports a stale or broken remote-daemon launcher. The command invokes the installed Pane executable in service-repair mode and does not rerun remote setup."; readonly requiresPaneDaemon: false; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Remote daemon data directory; defaults to ~/.pane_remote."; }, { readonly name: "--pane-path"; readonly value: "<path>"; readonly required: false; readonly description: "Existing Pane executable used to perform repair."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip the service restart confirmation."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print one machine-readable repair result."; }]; readonly examples: readonly ["runpane daemon repair --pane-dir ~/.pane_remote --yes --json"]; readonly jsonSchemas: readonly ["daemonRepairResult"]; readonly notes: readonly ["Repair does not create pairing credentials, change tunnel configuration, or download Pane."]; }; readonly "agent-context": { readonly name: "agent-context"; readonly summary: "Print token-efficient Pane command context for coding agents."; readonly details: "Use this first when an agent needs to discover Pane primitives. It is local/offline and does not require a running Pane app."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--command"; readonly value: "<command>"; readonly required: false; readonly description: "Print the detailed definition for one command, for example \"panes create\"."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane agent-context", "runpane agent-context --command \"panes create\" --json"]; readonly jsonSchemas: readonly ["agentContextBriefResult", "agentContextCommandResult", "agentContextUnknownCommandError"]; readonly notes: readonly ["Default output is brief so AGENTS.md can point here without bloating context.", "`--command` accepts canonical spaced names and common copied forms, including `panes.create` and `runpane panes create`.", "An unknown `--command` exits 2. With `--json` it prints `{ ok: false, code: \"unknown_command\", message, candidates }` on stdout, where `candidates` lists the closest command names first; without `--json` the same candidates go to stderr.", "`--pane-dir <path>` is accepted and ignored, so one `--pane-dir` can be passed to every runpane command."]; }; readonly mcp: { readonly name: "mcp"; readonly summary: "Run the Pane MCP server over stdio so coding agents can call runpane commands as tools."; readonly details: "Use this to register Pane with an MCP client. Pane registers it with Claude Code, Codex, and Cursor automatically; each tool mirrors one runpane command and returns its --json result."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--toolsets"; readonly value: "<name,...>"; readonly required: false; readonly description: "Comma-separated toolsets to serve: core (default), all, read, repos, panes, panels, agents, sessions, loops, git, docs, links, admin."; }, { readonly name: "--read-only"; readonly required: false; readonly description: "Serve only read-only tools."; }]; readonly examples: readonly ["claude mcp add --scope user pane -- npx --yes runpane@latest mcp", "codex mcp add pane -- npx --yes runpane@latest mcp"]; readonly notes: readonly ["Only the npm package and the Pane app include the MCP server; the Python package prints how to run it with Node.", "Commands that need --yes in the CLI take `yes: true` as a tool input."]; }; readonly "repos list": { readonly name: "repos list"; readonly summary: "List repositories saved in the running Pane app."; readonly details: "Use this to find the right Pane-managed repository before creating panes. If the repo is missing, use `repos add` first."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable repository records."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane repos list --json"]; readonly jsonSchemas: readonly ["repoListResult"]; readonly notes: readonly ["Requires a running Pane app or daemon for the selected Pane data directory.", "If this fails from WSL with a missing `/tmp/pane-daemon.../daemon.sock`, `volta: command not found`, or a Windows shim error, the user may be running Windows Pane. Retry with `/mnt/c/Users/<you>/.pane/bin/runpane repos list --json`, or with an older Pane build `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane repos list --json'`.", "When using PowerShell from WSL, set a Windows cwd such as `$env:TEMP` or `$env:USERPROFILE` before running runpane to avoid UNC cwd issues."]; }; readonly "repos add": { readonly name: "repos add"; readonly summary: "Register an existing git repository with the running Pane app."; readonly details: "Use this when the repository exists on disk but is not saved in Pane yet. It validates the path as a git repository."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--path"; readonly value: "<path>"; readonly required: true; readonly description: "Existing git repository path to register with Pane."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: false; readonly description: "Saved repository name; defaults to the directory name."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and preview without adding the repo."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane repos add --path /path/to/repo --yes --json"]; readonly jsonSchemas: readonly ["repoAddRequest", "repoAddResult"]; readonly notes: readonly ["It does not create directories or initialize git repositories by default.", "For a Windows Pane app managing WSL repositories, prefer a saved WSL repo from `repos list` when possible. Adding a brand-new WSL repo from Windows may require WSL-aware path handling."]; }; readonly "panes list": { readonly name: "panes list"; readonly summary: "List Pane sessions, optionally scoped to a saved repository."; readonly details: "Use this after selecting a repository to find existing Pane sessions and their ids before inspecting panels."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Optional repository selector: active, id, exact path, or saved repository name."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes list --repo active --json"]; readonly jsonSchemas: readonly ["paneListResult"]; readonly notes: readonly ["Without --repo, this lists sessions across saved Pane repositories.", "`status` is `running` while a tool or agent terminal is live, otherwise the stored lifecycle value (`error` and `initializing` always show as stored). The Pane's dock shell (`dock: true` in `panels list`) does not count, so a Pane whose only live terminal is the dock reads its stored value, usually `stopped`. `agentState` is the most urgent state of the live agent panels: `blocked`, `working`, `ready`, or `none`. `agentStatus` (`active`/`idle`) is kept for older clients."]; }; readonly "panes cost": { readonly name: "panes cost"; readonly summary: "Report estimated token cost per Pane, with per-model breakdown and cache efficiency."; readonly details: "Use this to attribute estimated workspace token costs to Pane lifetimes and inspect the models and cache efficiency behind each Pane's spend."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Optional repository selector: active, id, exact path, or saved repository name."; }, { readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Return only the selected Pane."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes cost --pane <pane-id> --json"]; readonly jsonSchemas: readonly ["paneCostRequest", "paneCostResult"]; readonly notes: readonly ["The report range is the last 30 days.", "Costs are estimates based on API token prices.", "The unattributed bucket reconciles the Pane rows against totals in the unscoped result."]; }; readonly "panes create": { readonly name: "panes create"; readonly summary: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create a Pane (a new worktree) only when the work's branch has no Pane yet; for review, audit, fix or QA on existing work use `panels create --pane <id>`."; readonly details: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Use this only when the work's branch has no Pane yet: new work, or an existing PR with no Pane. Each new Pane creates a worktree that checks out, installs and often builds, so creating several at once can freeze the machine. First find the feature's Pane with `runpane panes list --repo <repo> --json` by matching the PR's head branch (`gh pr view <n> --json headRefName`) against `git -C <worktreePath> branch --show-current`. For review, follow-up review, fixes, QA or any other agent on work that already has a Pane, use `runpane panels create --pane <id>` to open a new agent tab in that Pane instead. Select the saved base repository, choose a built-in agent or custom terminal command, and optionally send initial input after the tool starts. Pane creates and owns a git worktree/branch for each new Pane; do not pre-create a git worktree and register it as a separate repo unless the user explicitly asks. For private background decomposition, use your normal subagent/worktree mechanism instead of Pane."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: true; readonly description: "Repository selector: active, id, exact path, or saved repository name."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Pane/session name."; }, { readonly name: "--base-branch"; readonly value: "<branch>"; readonly required: false; readonly description: "Branch the new worktree from this ref (for example origin/main or release/2.4) instead of the repository default."; }, { readonly name: "--worktree-name"; readonly value: "<name>"; readonly required: false; readonly description: "Worktree and branch name; defaults to --name. Characters outside [a-z0-9-] are removed."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: false; readonly description: "Built-in agent terminal template to open. With --tool-command, the agent that command runs."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Custom terminal command to run instead of a built-in agent."; }, { readonly name: "--base-branch"; readonly value: "<ref>"; readonly required: false; readonly description: "Ref to branch from, such as origin/main or release/foo. --base is an alias."; }, { readonly name: "--branch"; readonly value: "<name>"; readonly required: false; readonly description: "Exact new branch name, slashes included (for example agents/w5a). Fails if the branch exists; never renamed to be unique. Defaults to the worktree name."; }, { readonly name: "--worktree-name"; readonly value: "<name>"; readonly required: false; readonly description: "Worktree directory name; defaults to --name."; }, { readonly name: "--prompt"; readonly value: "<text>"; readonly required: false; readonly description: "Alias for --initial-input; sends text after the command is ready."; }, { readonly name: "--initial-input-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read initial input from a file or stdin. --prompt-file is an alias."; }, { readonly name: "--as-file-pointer"; readonly required: false; readonly description: "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."; }, { readonly name: "--attach"; readonly required: false; readonly value: "<file>"; readonly description: "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."; }, { readonly name: "--from-json"; readonly value: "<path|->"; readonly required: false; readonly description: "Read a full panes.create request JSON payload."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly required: false; readonly description: "Mutation source; agent implies background/no-focus creation."; }, { readonly name: "--no-focus"; readonly required: false; readonly description: "Create the pane in the background without stealing focus."; }, { readonly name: "--focus"; readonly required: false; readonly description: "Explicitly focus the created pane."; }, { readonly name: "--pinned"; readonly required: false; readonly description: "Accepted for backward compatibility and now a no-op; `panes create` already pins by default."; }, { readonly name: "--no-pinned"; readonly required: false; readonly description: "Create the pane unpinned instead of the default pinned (the Pane UI's favorite/pin star). Pinning never implies focus."; }, { readonly name: "--no-associate"; readonly required: false; readonly description: "Inside a Session orchestrator, do not associate the created pane with that Session (associated automatically by default)."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and preview without mutating."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--wait-ready"; readonly required: false; readonly description: "Wait until each created panel's agent is at its input box, then deliver and verify any starting message, before returning."; }, { readonly name: "--ready-timeout-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Readiness timeout per pane; defaults to 30000."; }, { readonly name: "--concurrency"; readonly value: "<count>"; readonly required: false; readonly description: "Accepted for compatibility. Pane currently serializes multi-pane session creation so queued jobs do not time out before starting."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }, { readonly name: "--expect-report"; readonly required: false; readonly description: "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."; }, { readonly name: "--no-expect-report"; readonly required: false; readonly description: "Fire-and-forget input: don't wait for a report."; }, { readonly name: "--wait"; readonly required: false; readonly description: "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."; }, { readonly name: "--timeout"; readonly value: "<duration>"; readonly required: false; readonly description: "With --wait: give up after this long and exit 124 (outcome timeout)."; }]; readonly examples: readonly ["runpane panes create --repo active --name issue-257 --agent <agent> --prompt \"Plan this issue\" --source agent --no-focus --wait-ready --yes --json", "runpane panes create --repo active --name w5a --base origin/main --branch agents/w5a --agent <agent> --prompt-file prompt.md --source agent --no-focus --wait-ready --yes --json", "runpane panes create --from-json panes.json --yes --json", "runpane panes create --repo active --name issue-123 --agent <agent> --prompt \"Plan this issue\" --source agent --no-focus --wait-ready --yes --json", "runpane panes create --repo active --name issue-123 --agent claude --initial-input-file brief.md --as-file-pointer --source agent --no-focus --wait-ready --yes --json"]; readonly jsonSchemas: readonly ["paneCreateRequest", "paneCreateResult"]; readonly notes: readonly ["At least one of --agent or --tool-command is required unless --from-json is used.", "`panes create` is for user-visible Pane orchestration, not the agent's default private delegation mechanism. 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane: before creating one, find the feature's Pane with `runpane panes list --repo <repo> --json` by matching the PR's head branch (`gh pr view <n> --json headRefName`) against `git -C <worktreePath> branch --show-current`, and add a tab with `panels create --pane <id>` when it exists.", "Register the saved base repository once. Pane creates and owns the worktree/branch for each new Pane.", "`panes create --base <ref> --branch <name> --prompt-file <file>` replaces `git worktree add` plus `panes adopt`: Pane creates the worktree on exactly that branch name. `--branch` is checked with `git check-ref-format --branch` and fails if the branch already exists; `--worktree-name` still names the directory.", "Agent-created Panes should pass `--source agent --no-focus --wait-ready --yes --json` unless the user explicitly wants focus moved. `panes create` pins the new Pane by default, so a follow-up `panes pin` call is unnecessary; pass `--no-pinned` for throwaway shells or bulk imports. `--pinned` is still accepted and is now a no-op. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.", "The built-in agent templates come from the runpane contract; custom terminal commands can pass agent-specific flags when requested by the user.", "Use --initial-input-file for multi-line prompts or shell-sensitive initial input. A long or multi-line prompt is never typed into the shell: on bash, zsh or sh the agent launches with `\"$(cat '<prompt file>')\"` reading a private copy under `<pane-dir>/prompts/<pane-id>/`; on PowerShell, cmd, fish or WSL the prompt is pasted into the agent's composer once it is ready.", "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts.", "`--attach <file>` (repeatable, with `--as-file-pointer`) copies each file into a folder beside the prompt file and sends `Read and follow <path> (attached: <copy>, ...)`; the result lists the copies in `attachments`.", "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.", "With --wait-ready, `initialInput.delivery` reports `taken`, `queued`, `in-composer` or `unknown` with its evidence (`transcript`, `screen`, or `argv` for a prompt passed at launch); verifiedSubmitted is true for `taken` or `queued`. Routing initial input alone does not imply verified submission, and the create's `ok` is false unless a Claude or Codex starting message is verified.", "If initialInput.blocked.kind is submission_unverified, do not submit again automatically. Inspect initialInput.staged and attempts, then run nextCommand to resolve the ambiguous composer state.", "When the JSON result includes nextCommand, run it to validate that the terminal produced output before reporting success.", "Multi-pane requests are created sequentially today. The --concurrency flag is accepted for compatibility, but agents should not rely on parallel creation.", "For POSIX or WSL command chaining, use a custom terminal command like `bash -lc 'cmd1 && cmd2 && cmd3'`.", "For Windows PowerShell command chaining, use a custom terminal command like `powershell -NoProfile -Command \"cmd1; if ($LASTEXITCODE) { exit $LASTEXITCODE }; cmd2\"`.", "From WSL with Windows Pane, use Pane's own `runpane` (see doctor) and select the saved WSL repo by name or id, for example `runpane panes create --repo \"WSL Pane\" --name issue-123 --agent <agent> --prompt \"Plan this issue\" --source agent --no-focus --wait-ready --yes --json`.", "Use --wait-ready when an agent needs the started agent at its input box, and its starting message verified, instead of only creating a pane.", "If readiness returns blocked, inspect blocked.suggestedCommand rather than guessing which prompt to answer.", "With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it.", "At most 2 Panes run setup at once (worktree file sync, dependency install, build script); more wait in line. A queued `panes create` returns the Pane id right away with `setupQueue` ({ position, message }) and no `panelId`; the agent starts when setup finishes. Find its panel later with `runpane panels list --pane <id> --json`.", "A Pane with its own worktree starts at the remote's current tip of a remote-tracking base (the default `origin/main`, or one named with `--base`): Pane fetches that branch first, waiting at most about 10 seconds, and creates started together share the fetch. Each item's `base` reports `{ ref, commit, refresh }`, where `refresh` is `fetched`, `recent` (reused a fetch from the last 30 seconds), `skipped` (a local branch or commit base) or `failed`. A failed refresh never fails the create; the Pane starts from the local ref and `base.notice` says what happened and how to catch up.", "`panes create --branch <name>` fails with code `ERR_RUNPANE_BRANCH_HAS_PANE` when another Pane already has that branch checked out. The message names the Pane and gives the next step: `runpane panels create --pane <id> --tool-command \"<cmd>\" --source agent --no-focus`."]; }; readonly "panes adopt": { readonly name: "panes adopt"; readonly summary: "Adopt an existing externally managed git worktree as a Pane."; readonly details: "Validates that the canonical path is a registered worktree of the selected saved repository, then creates a Pane record without creating, syncing, building, removing, or recreating the directory."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: true; readonly description: "Saved repository selector."; }, { readonly name: "--path"; readonly value: "<dir>"; readonly required: true; readonly description: "Existing git worktree path."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Pane name."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: false; readonly description: "Agent whose terminal to create; with --tool-command, the agent that command runs."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Custom command to stage or launch instead of a built-in agent, such as a wrapper that runs one."; }, { readonly name: "--resume"; readonly value: "<id>"; readonly required: false; readonly description: "Persist this agent session id and stage its resume command."; }, { readonly name: "--folder"; readonly value: "<name>"; readonly required: false; readonly description: "Top-level sidebar folder."; }, { readonly name: "--launch"; readonly required: false; readonly description: "Run the agent (or its resume command) immediately."; }, { readonly name: "--prompt"; readonly value: "<text>"; readonly required: false; readonly description: "Alias for --initial-input; sent once the launched agent is ready. Requires --launch."; }, { readonly name: "--prompt-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Alias for --initial-input-file; read the prompt from a file or stdin. Requires --launch."; }, { readonly name: "--wait-ready"; readonly required: false; readonly description: "Wait for the launched agent to be ready and the prompt submitted before returning. Requires --launch."; }, { readonly name: "--ready-timeout-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Readiness timeout; defaults to 30000."; }, { readonly name: "--no-pinned"; readonly required: false; readonly description: "Do not pin the adopted pane."; }, { readonly name: "--no-associate"; readonly required: false; readonly description: "Inside a Session orchestrator, do not associate the adopted pane with that Session (associated automatically by default)."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and preview only."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes adopt --repo active --path /path/to/worktree --name imported --agent codex --resume <id> --yes --json", "runpane panes adopt --repo active --path /path/to/worktree --name imported --tool-command \"agent-farm run free-range\" --agent claude --launch --yes --json", "runpane panes adopt --repo active --path /path/to/worktree --name imported --agent claude --launch --prompt-file prompt.md --wait-ready --yes --json"]; readonly jsonSchemas: readonly ["paneCreateResult"]; readonly notes: readonly ["The resume command is staged without Enter unless --launch is passed.", "Archiving never deletes an adopted worktree unless `runpane panes archive --remove-worktree` is used.", "One of --agent or --tool-command is required.", "With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it.", "--resume needs a built-in agent command; a wrapper command resumes its own way.", "The adopted Pane reports `status: running` in `panes list` while its tool terminal is live.", "A prompt (--prompt, --initial-input, --prompt-file, --initial-input-file) or --wait-ready needs --launch; without it adopt fails instead of dropping the prompt.", "With --launch the result carries the same readiness, initialInput, and nextCommand fields as panes create. With --resume the prompt goes to the resumed conversation's composer once the agent is ready.", "To start new work on a named branch, prefer `panes create --base <ref> --branch <name>` over `git worktree add` plus adopt."]; }; readonly "panes archive": { readonly name: "panes archive"; readonly summary: "Archive a Pane (session) exactly like the UI Archive action, including safe removal of its Pane-managed git worktree, or archive every merged Pane in a Session."; readonly details: "Use this to close out a Pane once its PR has merged. The safety check refreshes the configured upstream before comparing it to HEAD and includes exact unpushed commit IDs and subjects. When the branch has no upstream or its upstream is gone (GitHub deletes merged branches), a merged pull request whose head is HEAD counts as pushed, so squash-merged branches archive without --force. Refuses unsafe archive operations unless --force is used. Use --dry-run to inspect the same evidence without mutating Pane state. Use --session <id|name> --merged to close out every finished Pane of a Session at once."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane/session id to archive. Required unless --session is used."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly required: false; readonly description: "Mutation source; does not change archive safety behavior."; }, { readonly name: "--force"; readonly required: false; readonly description: "Archive even if the pane's branch has uncommitted, untracked, or unpushed changes."; }, { readonly name: "--remove-worktree"; readonly required: false; readonly description: "Also check and remove an adopted Pane's worktree. Pane-managed worktrees are always removed; the local branch is always kept."; }, { readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Archive the Panes associated with this named Session instead of one Pane. Requires --merged."; }, { readonly name: "--merged"; readonly required: false; readonly description: "With --session, archive only Panes whose PR is confirmed merged and whose worktree has no uncommitted, untracked or unpushed work; skip the rest with a reason and next step. An open PR is skipped as pr-open, no PR or a closed unmerged PR as pr-not-merged, and a PR state GitHub cannot confirm as pr-status-unknown."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Refresh and print archive safety evidence without archiving."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes archive --pane <pane-id> --source agent --yes --json", "runpane panes archive --pane <pane-id> --dry-run --json", "runpane panes archive --pane <pane-id> --remove-worktree --yes --json", "runpane panes archive --session <id|name> --merged --dry-run --json", "runpane panes archive --session <id|name> --merged --remove-worktree --yes --json", "runpane panes archive --pane <pane-id> --force --yes --json"]; readonly jsonSchemas: readonly ["paneArchiveRequest", "paneArchiveBulkRequest", "paneArchiveResult", "paneArchiveBulkResult"]; readonly notes: readonly ["If the result has ok:false with a blocked field, the pane was NOT archived; inspect blocked.code and rerun with --force if discarding the flagged work is intentional.", "Inspect safetyCheck.unpushedCommitDetails for exact commit IDs and subjects; upstreamRefreshed confirms the tracking ref was refreshed first.", "A --dry-run result sets dryRun:true and wouldArchive without deleting the Pane or its worktree.", "A successful archive reports worktreeCleanup `completed` once the worktree is gone from its path and from git. trashDeletion `pending` means a large worktree (for example one with node_modules) is still being deleted from .git/pane-trash in the background; that is still ok:true. `timeout` (also ok:true) means removal is still running; only `failed` sets ok:false.", "safetyCheck.mergedViaPr names the merged PR whose head is HEAD; it needs an authenticated `gh`. Without it, a squash-merged branch whose remote branch was deleted reports unpushed-commits.", "An adopted Pane (panes adopt) keeps its worktree unless --remove-worktree is passed. `panes restore` does not recreate a removed adopted worktree; the local branch is kept, so `git worktree add <path> <branch>` brings it back.", "With --session --merged, each item has outcome archived, would-archive (dry run), skipped (with skipped.code and skipped.message), or failed.", "Archiving a main-repo Pane (no Pane-managed worktree) always succeeds immediately since nothing is deleted from disk.", "Undo an archive with `runpane panes restore --pane <pane-id> --yes`, which recreates the worktree. `runpane links create --pane <pane-id>` gives the user a link to review the Pane first.", "When the safety check is skipped, `safetyCheck.reason` says why: `external-worktree` (an adopted Pane whose worktree Pane does not own), `main-repo`, `missing-project-context`, or `git-error`. `worktreeWillRemain: true` means archiving leaves the worktree on disk."]; }; readonly "panes pin": { readonly name: "panes pin"; readonly summary: "Declaratively pin a Pane; pinned is the Pane UI's favorite/pin star."; readonly details: "Sets the requested pinned state to true without reading and toggling it. Repeating the command is idempotent and pinning never changes focus."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane/session id to pin."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and preview without mutating."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes pin --pane <pane-id> --yes --json", "runpane panes pin --pane <pane-id> --dry-run --json"]; readonly jsonSchemas: readonly ["panePinRequest", "panePinResult"]; readonly notes: readonly ["This is a declarative set, not a toggle: retries leave an already-pinned Pane pinned.", "Pinning does not focus the Pane."]; }; readonly "panes unpin": { readonly name: "panes unpin"; readonly summary: "Declaratively unpin a Pane; pinned is the Pane UI's favorite/pin star."; readonly details: "Sets the requested pinned state to false without reading and toggling it. Repeating the command is idempotent and unpinning never changes focus."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane/session id to unpin."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and preview without mutating."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes unpin --pane <pane-id> --yes --json", "runpane panes unpin --pane <pane-id> --dry-run --json"]; readonly jsonSchemas: readonly ["panePinRequest", "panePinResult"]; readonly notes: readonly ["This is a declarative set, not a toggle: retries leave an already-unpinned Pane unpinned.", "Unpinning does not focus the Pane."]; }; readonly "panes rename": { readonly name: "panes rename"; readonly summary: "Rename a Pane without changing its worktree, branch, panels, or focus."; readonly details: "Trims and sets the Pane display name through the same persistence and session-updated event path used by the UI. Dry-run returns the projected updated pane without mutating."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane/session id to rename."; }, { readonly name: "--name"; readonly value: "<new-name>"; readonly required: true; readonly description: "New non-empty Pane/session name; surrounding whitespace is trimmed."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Validate and return the projected updated pane without mutating."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output including the updated pane."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes rename --pane <pane-id> --name issue-393 --yes --json", "runpane panes rename --pane <pane-id> --name issue-393 --dry-run --json"]; readonly jsonSchemas: readonly ["paneRenameRequest", "paneRenameResult"]; readonly notes: readonly ["Empty and whitespace-only names are rejected; no additional maximum length is imposed beyond the existing UI and database behavior.", "The JSON result includes the updated pane summary so callers do not need a second panes list request."]; }; readonly "panes focus": { readonly name: "panes focus"; readonly summary: "Raise the Pane window and select a Pane (and optionally one of its panels)."; readonly details: "Brings the Pane desktop window to the foreground and selects the requested Pane exactly like clicking it in the sidebar; when --panel is given it also selects that panel/tab inside the Pane. This steals window focus, so it must only be run on an explicit user request to open, focus, or show a Pane, never proactively. Focusing does not change the Pane's worktree, branch, panels, or pinned state."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane/session id to focus. Must be an active (non-archived) Pane."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Optional panel/tab id inside the Pane to select; must belong to the focused Pane."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly required: false; readonly description: "Mutation source; does not change focus behavior."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for mutating commands; required in non-interactive contexts because focusing steals window focus."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes focus --pane <pane-id> --source user --yes --json", "runpane panes focus --pane <pane-id> --panel <panel-id> --source user --yes --json"]; readonly jsonSchemas: readonly ["paneFocusRequest", "paneFocusResult"]; readonly notes: readonly ["Run this only when the user explicitly asks to open, focus, show, or switch to a Pane; never focus a Pane proactively because it steals the user's window focus.", "Archived Panes cannot be focused; the command fails clearly instead of falling back to focusing another Pane.", "If --panel does not belong to the focused Pane, the command fails clearly rather than selecting a different panel."]; }; readonly "panels list": { readonly name: "panels list"; readonly summary: "List tool panels inside a Pane session."; readonly details: "Use this to find the terminal panel id to inspect or control after creating or selecting a Pane session."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane/session id."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels list --pane <pane-id> --json"]; readonly jsonSchemas: readonly ["panelListResult"]; readonly notes: readonly ["The ids returned here are stable inputs for `panels output` and `panels input`.", "`agentType` is the agent Pane treats the panel as; `agentDetection` says how it knows (`declared`, `command`, `process`, or `screen`), and `launchCommand` is the command the panel was launched with.", "`resumeId` is the agent session ID Pane saved for reopening the panel, and `resumeSource` says which rule resumes with it: `agent-farm` (an `agent-farm run` or `agent-farm agent` command), `configured` (the panel's own resume command), or `agent` (a built-in agent's captured session). Both are omitted when no ID is saved.", "Every Pane has one plain shell titled `Terminal`, its terminal dock: `dock: true` marks it, and the field is omitted on every other panel. Setup progress notices appear there; it is not a tool or agent tab and does not count toward the Pane's `status`. A `--tool-command` tab without `--title` or `--agent` is titled from its command (whole words up to 40 characters)."]; }; readonly "panels output": { readonly name: "panels output"; readonly summary: "Read recent terminal output from a panel."; readonly details: "Use this to inspect recent terminal output from a terminal-backed panel without loading the full history by default. Live terminal scrollback is returned as bounded recent lines; persisted output fallback is returned as bounded records. Terminal control noise is stripped before returning text."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Tool panel id."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly required: false; readonly description: "Maximum recent output lines or records to read. Defaults to 200."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels output --panel <panel-id> --limit 200 --json"]; readonly jsonSchemas: readonly ["panelOutputResult"]; readonly notes: readonly ["Default output is bounded to the latest 200 lines or records. Use a larger --limit only when hasMore is true and more history is needed.", "Use --json when an agent needs timestamps, record types, returnedCount, or hasMore.", "The output is intended to be agent-readable, but terminal prompts and shell echoes may still appear; use the newest relevant lines before concluding success.", "Prefer `panels screen` for a smaller current-state read before increasing output limits.", "In Chat, returns ACP transcript output records instead of stale PTY scrollback."]; }; readonly "panels input": { readonly name: "panels input"; readonly summary: "Send input bytes to a terminal panel."; readonly details: "Use this to answer prompts or continue an agent inside an existing Pane terminal panel. Input is byte-oriented; choose --input-file for exact control over newlines and control characters."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Terminal panel id."; }, { readonly name: "--text"; readonly value: "<text>"; readonly required: false; readonly description: "Text bytes to send."; }, { readonly name: "--keys"; readonly value: "<name,...>"; readonly required: false; readonly description: "Comma-separated key names to press in order: enter, escape, tab, backspace, space, up, down, left, right, ctrl-c, ctrl-d, or any single character."; }, { readonly name: "--input-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read input from a file or stdin."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes", "printf '\\003' | runpane panels input --panel <panel-id> --input-file - --yes", "runpane panels input --panel <panel-id> --text \"simple text\" --yes --json", "runpane panels input --panel <panel-id> --keys down,enter --yes --json"]; readonly jsonSchemas: readonly ["panelInputRequest", "panelInputResult"]; readonly notes: readonly ["To answer a menu or prompt, prefer `--keys` (for example `--keys down,enter`) over escape sequences in `--text`.", "Input is sent exactly as provided. Include a real newline byte when the terminal should receive Enter; across shells, `--input-file` is safer than `--text \"...\\n\"`.", "Use `--input-file -` or a temp file for multi-line input, quotes, Ctrl-C, or shell-sensitive text.", "If interrupting a running process, send Ctrl-C first, validate/read output, then send the next command in a separate `panels input` call so bytes are not dropped.", "After sending input, validate with `runpane panels output --panel <panel-id> --json` before reporting success.", "Runpane records action metadata and errors for observability, but should not log full input text by default.", "For ordinary text plus Enter, prefer `panels submit` so the terminal receives a CR Enter byte.", "Chat-owned tabs reject raw keystrokes. Use panels submit, or switch to Terminal."]; }; readonly "agents doctor": { readonly name: "agents doctor"; readonly summary: "Diagnose whether a built-in agent command is available in a Pane repository environment."; readonly details: "Use this before creating Codex or Claude panes when PATH may differ between macOS/Linux/Windows/WSL or between the wrapper shell and Pane. The check runs through Pane project context, not the wrapper process."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: true; readonly description: "Built-in agent command to diagnose."; }, { readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Repository selector; defaults to the active Pane repo."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane agents doctor --agent <agent> --repo active --json"]; readonly jsonSchemas: readonly ["agentDoctorResult"]; readonly notes: readonly ["For WSL repos, install the agent inside the WSL distro Pane uses, not only on Windows.", "This diagnoses built-in agent templates only; custom commands should be validated by creating a pane and reading its screen."]; }; readonly "panels screen": { readonly name: "panels screen"; readonly summary: "Read a compact current-screen view from a terminal panel."; readonly details: "Use this for token-safe current terminal state. It prefers active alternate-screen/TUI output, then live scrollback, then persisted output. Default output is bounded to 80 lines."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Terminal panel id."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly required: false; readonly description: "Maximum lines to return; defaults to 80."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels screen --panel <panel-id> --limit 80 --json"]; readonly jsonSchemas: readonly ["panelScreenResult"]; readonly notes: readonly ["Use this before `panels output` when an agent only needs the latest visible/current state.", "The composer object reports whether a Claude or Codex composer is present and whether it holds undelivered text. Placeholder and suggestion text (drawn dim or grey, such as Claude's suggested next prompt) does not count as undelivered text; `composer.ghostText` carries it, and text output marks its line with `⟨suggestion⟩`.", "If hasMore is true and context is missing, rerun with a larger --limit or use `panels output`.", "Chat-owned tabs return CHAT_RAW_TERMINAL_UNSUPPORTED. Use panels last-message/output, or switch to Terminal."]; }; readonly "panels submit": { readonly name: "panels submit"; readonly summary: "Send and submit text to a terminal panel, including idle agent composers."; readonly details: "Use this for ordinary interactive submissions. For Claude, Pane waits for the composer to appear and show the staged text, then sends Enter on its own and verifies that the composer cleared; Claude keeps an Enter that arrives together with the text as a newline. For a Codex composer, Pane stages the text, waits for paste handling, then queues with Tab while working or submits with Enter when ready, and verifies delivery when visible evidence is available. Wrapper-launched agents are handled the same way once Pane knows the agent (declared, from the foreground process, or from the screen). A Claude or Codex panel with no composer on screen gets nothing: the result is `ok: false` with `blocked.kind: composer-unknown`. Multi-line or long (over 512 characters) text reaches a Claude or Codex composer as one bracketed paste: CRLF becomes LF, and the submit key goes as its own write once the paste has settled, even while the agent is working. Other terminals receive a normalized CR Enter. Exact byte workflows remain on `panels input`."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Terminal panel id."; }, { readonly name: "--text"; readonly value: "<text>"; readonly required: false; readonly description: "Text to submit before Enter."; }, { readonly name: "--input-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read text from a file or stdin before Enter."; }, { readonly name: "--as-file-pointer"; readonly required: false; readonly description: "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."; }, { readonly name: "--attach"; readonly required: false; readonly value: "<file>"; readonly description: "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."; }, { readonly name: "--interrupt"; readonly required: false; readonly description: "Interrupt the current turn and wait up to 30 seconds for an empty idle composer before delivering. Escape for Codex/Claude; Ctrl+C for Cursor."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }, { readonly name: "--expect-report"; readonly required: false; readonly description: "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."; }, { readonly name: "--no-expect-report"; readonly required: false; readonly description: "Fire-and-forget input: don't wait for a report."; }, { readonly name: "--wait"; readonly required: false; readonly description: "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."; }, { readonly name: "--timeout"; readonly value: "<duration>"; readonly required: false; readonly description: "With --wait: give up after this long and exit 124 (outcome timeout)."; }]; readonly examples: readonly ["runpane panels submit --panel <panel-id> --input-file prompt.md --as-file-pointer --wait --yes", "runpane panels submit --panel <panel-id> --text \"2\" --yes --json", "printf \"echo hello\" | runpane panels submit --panel <panel-id> --input-file - --yes --json", "runpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --json", "runpane panels submit --panel <panel-id> --text \"Stop that approach and follow this correction\" --interrupt --yes --json"]; readonly jsonSchemas: readonly ["panelSubmitRequest", "panelSubmitResult"]; readonly notes: readonly ["The response includes sequenceName, verifiedSubmitted, delivery and nextCommand. For Claude and Codex, `delivery.state` is `taken` (the agent started a turn with the text), `queued` (it holds the text until its current turn ends), `in-composer` (the text is still in the composer) or `unknown`, and `delivery.evidence` is `transcript` (the agent's own transcript) or `screen`. verifiedSubmitted is true for `taken` or `queued`; never resend those. If ok is false, inspect blocked and do not assume the turn started.", "Do not follow `panels submit` with `panels submit-composer`; Claude and Codex composer submission is handled atomically.", "Use `panels input` for Ctrl-C, escape sequences, or any workflow requiring exact bytes.", "On `blocked.kind: composer-unknown`, nothing was typed. Check `panels screen`; if the agent is at a prompt Pane does not recognise, use `panels input`.", "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.", "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts.", "`--attach <file>` (repeatable, with `--as-file-pointer`) copies each file into a folder beside the prompt file and sends `Read and follow <path> (attached: <copy>, ...)`; the result lists the copies in `attachments`.", "With --interrupt, Pane sends the stop key only while the agent is active, waits for an empty idle composer, then submits. If readiness times out, replacement text is not sent. A queued result is not read yet: delivery.message explains the delay; never resend queued text. Interrupt success requires delivery.state: taken. Unknown agents and occupied composers are rejected without typing.", "In Chat, submit routes to the host ACP session and returns sequenceName=acp, enter=none, operationId and acp-receipt delivery evidence. Do not blindly resend after a lost response."]; }; readonly "panels resume": { readonly name: "panels resume"; readonly summary: "Restart stopped terminal panels in place, resuming their agents' conversations: one panel, a Session's panels, or every stopped agent panel."; readonly details: "Use this when `panels list`, `panels screen`, or `panels wait` report `running: false`, or `watch` reports `panel.stopped`, typically after a Pane restart or once its agent exited back to the shell. The panel keeps its id. Pane re-runs the panel's saved launch command resolved to the agent's resume command (Claude `--resume <session>`, `codex resume <session>`, Cursor `--resume`), the same restart the app runs when it shows the panel. It never takes focus. A panel whose agent exited back to its shell has its saved command run again in that shell. On a running panel it does nothing and returns `action: \"already-running\"`. `--session <id|name>` or `--all-stopped` resumes every stopped agent panel in that scope (plain shells are left alone), `--concurrency` at a time, skips running panels, and returns one result per panel; one failure does not stop the others."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Terminal panel id. Give exactly one of --panel, --session, or --all-stopped."; }, { readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Resume the stopped agent panels of this Session's associated Panes."; }, { readonly name: "--all-stopped"; readonly required: false; readonly description: "Resume the stopped agent panels of every non-archived Pane."; }, { readonly name: "--concurrency"; readonly value: "<count>"; readonly required: false; readonly description: "Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10. With --wait-ready the resumed panels then wait together, so the call takes the restarts plus one --ready-timeout-ms."; }, { readonly name: "--wait-ready"; readonly required: false; readonly description: "Wait until the resumed agent is ready, with the same startup-screen checks as `panels create --wait-ready`."; }, { readonly name: "--ready-timeout-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Readiness wait timeout; defaults to 30000."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels resume --panel <panel-id> --wait-ready --yes --json", "runpane panels resume --session <id|name> --wait-ready --yes --json"]; readonly jsonSchemas: readonly ["panelResumeResult", "panelResumeManyResult"]; readonly notes: readonly ["If readiness.blocked is present, the agent is at a startup prompt (trust, update, [y/n]); inspect `panels screen` or follow blocked.suggestedCommand. Ask the user before answering trust or permission prompts.", "A Claude panel resumes the conversation whose session id Pane launched it with; a Codex panel resumes the session id Pane captured from its output. Without one, the panel relaunches its original command.", "A bulk resume is ok only when every panel resumed and, with --wait-ready, became ready. Check items[].readiness.blocked and items[].error per panel.", "Stopped Chat-capable tabs recover their exact saved conversation explicitly. After host restart, recover in Terminal first to restore the workspace launch environment."]; }; readonly "panels wait": { readonly name: "panels wait"; readonly summary: "Wait for a terminal panel to initialize, become ready/idle, or contain text."; readonly details: "Use this to validate asynchronous terminal behavior without pulling large scrollback. It returns brief readiness state, blocker hints, a compact screen, and a next command."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Terminal panel id."; }, { readonly name: "--for"; readonly value: "<initialized|ready|idle|text>"; readonly required: false; readonly description: "Condition to wait for. Defaults to ready for CLI panels and idle otherwise."; }, { readonly name: "--contains"; readonly value: "<text>"; readonly required: false; readonly description: "Text required for --for text; implies --for text when --for is omitted."; }, { readonly name: "--timeout-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Wait timeout; defaults to 30000."; }, { readonly name: "--interval-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Polling interval; defaults to 500."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels wait --panel <panel-id> --for ready --timeout-ms 30000 --json", "runpane panels wait --panel <panel-id> --contains \"Ready\" --json"]; readonly jsonSchemas: readonly ["panelWaitResult"]; readonly notes: readonly ["If blocked is present, do not assume success. Use blocked.suggestedCommand or inspect `panels screen`.", "If stopped is true, the panel's terminal is not running (for example after a Pane restart); run nextCommand (`panels resume`) instead of waiting again.", "The default timeout and screen are intentionally small for agent context safety.", "For Chat, status comes from the host session; the legacy screen field has source=acpTranscript and contains transcript text, not a terminal screen."]; }; readonly "panels last-message": { readonly name: "panels last-message"; readonly summary: "Read an agent's last reply from its transcript, without scraping the screen."; readonly details: "Use this when a worker is READY and you need what it said, such as its PR number or result. It reads the Claude or Codex transcript Pane found for the panel and never falls back to the screen."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Agent panel id."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly required: false; readonly description: "Maximum characters to return; defaults to 20000. The end of the reply is kept."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels last-message --panel <panel-id> --json"]; readonly jsonSchemas: readonly ["panelLastMessageResult"]; readonly notes: readonly ["Without a transcript (a shell panel, another agent, or no reply yet) the result is `{ ok: false, reason: \"transcript-unavailable\" }` and the command exits 1. Use `panels screen` then.", "A worker that ran `runpane report` already handed back its state, PR, head, and summary; read those with `agents status` before reading the whole reply.", "In Chat, read the active host transcript projection."]; }; readonly "panels create": { readonly name: "panels create"; readonly summary: "Open a new agent tab (reviewer, auditor, QA, fix or helper) inside an existing Pane, sharing its worktree. 1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane: use this, not panes create, for any later agent on existing work."; readonly details: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. This is the default way to start any later agent on work that already has a Pane, including reviewers, follow-up reviewers, auditors, fix implementers, QA and clean-context helpers. The new tab is a fresh agent that shares the Pane's worktree and branch; it does not create a new worktree. Review, audit and QA tabs never run `git checkout`, `reset` or `stash`, and a fix tab starts only after the previous writer has stopped. Use `panes create` only when the work's branch has no Pane yet. Agent/orchestrator-created panels should pass --source agent or --no-focus so the user stays in the implementation tab. The daemon initializes the terminal immediately and can wait for CLI readiness."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Existing Pane session id to add the panel to."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: false; readonly description: "Built-in agent command template to launch. With --tool-command, the agent that command runs."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Custom terminal command to launch instead of a built-in agent."; }, { readonly name: "--title"; readonly value: "<title>"; readonly required: false; readonly description: "Panel title override."; }, { readonly name: "--initial-input"; readonly value: "<text>"; readonly required: false; readonly description: "Initial input to send after the tool starts."; }, { readonly name: "--initial-input-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read initial input from a file or stdin."; }, { readonly name: "--as-file-pointer"; readonly required: false; readonly description: "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."; }, { readonly name: "--attach"; readonly required: false; readonly value: "<file>"; readonly description: "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly required: false; readonly description: "Mutation source; agent implies background creation."; }, { readonly name: "--no-focus"; readonly required: false; readonly description: "Create the panel in the background without changing active panel."; }, { readonly name: "--focus"; readonly required: false; readonly description: "Explicitly focus the created panel."; }, { readonly name: "--wait-ready"; readonly required: false; readonly description: "Wait until the terminal tool is ready."; }, { readonly name: "--ready-timeout-ms"; readonly value: "<ms>"; readonly required: false; readonly description: "Readiness wait timeout."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }, { readonly name: "--expect-report"; readonly required: false; readonly description: "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."; }, { readonly name: "--no-expect-report"; readonly required: false; readonly description: "Fire-and-forget input: don't wait for a report."; }, { readonly name: "--wait"; readonly required: false; readonly description: "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."; }, { readonly name: "--timeout"; readonly value: "<duration>"; readonly required: false; readonly description: "With --wait: give up after this long and exit 124 (outcome timeout)."; }]; readonly examples: readonly ["runpane panels create --pane <pane-id> --agent <agent> --source agent --no-focus --wait-ready --yes --json", "runpane panels create --pane <pane-id> --tool-command <command> --title <title> --source agent --no-focus --wait-ready --yes --json", "runpane panels create --pane <pane-id> --tool-command \"agent-farm run free-range\" --agent claude --source agent --no-focus --wait-ready --yes --json"]; readonly jsonSchemas: readonly ["panelCreateRequest", "panelCreateResult"]; readonly notes: readonly ["Use this for same-pane reviewer loops after PR creation/testing.", "Panels share the existing Pane's worktree and branch.", "`panels create` is for visible helper/reviewer tabs, not the agent's default private delegation mechanism.", "For agent-created panels, prefer --source agent or --no-focus to avoid stealing focus from the user or implementation tab.", "With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."]; }; readonly "panels open": { readonly name: "panels open"; readonly summary: "Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default."; readonly details: "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane to open the tab in; defaults to PANE_SESSION_ID (the calling panel's Pane, including a Session orchestrator's)."; }, { readonly name: "--url"; readonly value: "<url>"; readonly required: false; readonly description: "http(s) or file URL to open in a browser tab. WSL file URLs use the same automatic path conversion as --file. Pass exactly one of --url or --file."; }, { readonly name: "--file"; readonly value: "<path>"; readonly required: false; readonly description: "File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. Files open in an editor tab; supported formats have read-only previews, and HTML opens as editable source."; }, { readonly name: "--title"; readonly value: "<title>"; readonly required: false; readonly description: "Tab title override."; }, { readonly name: "--split"; readonly required: false; readonly description: "Open in split view beside the primary tab group (default)."; }, { readonly name: "--tab"; readonly required: false; readonly description: "Open in the current tab group instead of split view."; }, { readonly name: "--no-focus"; readonly required: false; readonly description: "Open the tab without selecting it."; }, { readonly name: "--focus"; readonly required: false; readonly description: "Select the tab (default). Never raises or focuses the Pane window."; }, { readonly name: "--source"; readonly value: "<user|agent>"; readonly required: false; readonly description: "Mutation source."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane panels open --file plan.html --source agent --yes --json", "runpane panels open --url http://localhost:3000 --source agent --yes --json", "runpane panels open --pane <pane-id> --file src/app.ts --tab --source agent --yes --json"]; readonly jsonSchemas: readonly ["panelOpenRequest", "panelOpenResult"]; readonly notes: readonly ["Prefer this over opening the system browser when showing the user a page, plan, report, or dev server.", "Write plans and reports as self-contained HTML files. Use --url with a file URL to render a page in a live browser, or --file to open its editable source; reopening the same target reuses its tab.", "When the user views Pane from another computer, a file page loads only files in its own folder and the folders inside it. Keep the page's CSS, scripts and images there, put them inline, or serve the folder over HTTP and open its localhost URL. Give file URLs as the host sees them, not as the other computer would.", "Opening a tab does not steal window focus; use `panes focus` only on explicit user request."]; }; readonly "panels submit-composer": { readonly name: "panels submit-composer"; readonly summary: "Submit an agent composer using the panel-appropriate key sequence."; readonly details: "Use this after sending text into an agent composer. Auto uses Tab to queue while Codex is working and Enter when ready; Pane verifies that the text left the composer."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: true; readonly description: "Terminal panel id."; }, { readonly name: "--strategy"; readonly value: "<auto|codex-ctrl-enter|enter|tab>"; readonly required: false; readonly description: "Composer submit key sequence strategy."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Skip confirmation for this mutating command."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panels submit-composer --panel <codex-panel-id> --strategy auto --yes --json", "runpane panels submit-composer --panel <panel-id> --strategy enter --yes --json"]; readonly jsonSchemas: readonly ["panelSubmitComposerRequest", "panelSubmitComposerResult"]; readonly notes: readonly ["Use `panels input` or `panels submit` to write prompt text first; this command only submits the current composer.", "Use --strategy auto for agent workflows; explicit strategies are diagnostic escape hatches.", "The JSON result includes sequenceName, verifiedSubmitted and, for Claude and Codex, delivery (`taken`, `queued`, `in-composer` or `unknown`, with `transcript` or `screen` evidence). If ok is false, follow blocked.suggestedCommand instead of assuming submission happened.", "With `--strategy auto`, if the staged text is still visible in the composer after the first attempt, Pane retries once and checks again: Tab for working Codex, Enter otherwise. It never retries an empty composer.", "Chat-owned tabs have no native composer to submit. Use panels submit instead."]; }; readonly "workspace state": { readonly name: "workspace state"; readonly summary: "Read one snapshot of every Pane and CLI panel."; readonly details: "Use this instead of spawning one command per pane or panel."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Optionally limit the snapshot to one saved repository."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane workspace state --json"]; readonly notes: readonly ["The response carries the daemon epoch and current journal generation."]; }; readonly watch: { readonly name: "watch"; readonly summary: "Wait for workspace transitions using the daemon journal."; readonly details: "`runpane watch --follow` is the monitor for an agent: with no other flags it prints WATCH OK once, then one line per event (reports, ready, blocked, idle, exits, Session membership, and PR conflicts, checks, and merges), batches non-urgent lines, and ends itself with WATCH EXPIRED after 3 hours with nothing happening. Set individual duration flags to override these defaults. `--until-event` is for harnesses that wake an agent when a process exits (Claude Code background Bash, Codex): it prints the first event worth waking for immediately, without follow settling or batching, and exits 0, and its named cursor means nothing is missed between runs. Every default is listed in the contract under defaults.watch; each override flag replaces one value."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--follow"; readonly required: false; readonly description: "Keep watching, with the defaults in defaults.watch.follow: WATCH OK once, then one line per event; READY after 3m of quiet, BLOCKED after 30s, other lines batched at most every 10m (REPORT, BLOCKED, PR conflicts, and failed checks arrive at once); IDLE reminders at 10m, 30m, 1h, 3h, then daily; WATCH EXPIRED and exit 0 after 3h with nothing but IDLE."; }, { readonly name: "--until-event"; readonly required: false; readonly description: "Wait for the first event in defaults.watch.untilEvent.kinds (agent.report, agent.blocked, panel.exited, pane.gone), print that one line, and exit 0. Inside a Pane terminal the cursor defaults to until-<panel id>, so a re-run resumes where the last stopped. A RESET and the caller's own panel never end the wait. With --timeout-ms, exit 124 with WATCH TIMEOUT when the deadline passes. Cannot be combined with --follow or --self-test."; }, { readonly name: "--session"; readonly required: false; readonly value: "<id|name>"; readonly description: "Follow every Pane associated with a named Session (id or exact name). The daemon re-reads membership on every read, so a Pane associated after arming is included and a detached or archived Pane drops out without a re-arm. The Session's own orchestrator panels are never reported. Cannot be combined with --pane or --all-managed; an unknown Session fails."; }, { readonly name: "--pane"; readonly required: false; readonly value: "<pane-id>"; readonly description: "Limit to a Pane; repeatable. Default all managed panes. Cannot be combined with --session."; }, { readonly name: "--exclude-pane"; readonly required: false; readonly value: "<pane-id>"; readonly description: "Exclude a Pane; repeatable."; }, { readonly name: "--repo"; readonly required: false; readonly value: "<selector>"; readonly description: "Limit to a saved repository (active, id, path, or name). Default all repositories."; }, { readonly name: "--name-contains"; readonly required: false; readonly value: "<text>"; readonly description: "Limit by Pane name substring."; }, { readonly name: "--include-shells"; readonly required: false; readonly description: "Include plain shell panels. Default: agent panels only. A report (agent.report) arrives from any panel either way."; }, { readonly name: "--kinds"; readonly required: false; readonly value: "<kind,...>"; readonly description: "Replace the default event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited, panel.stopped, agent.report, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged. Defaults: defaults.watch.follow.kinds under --follow, defaults.watch.untilEvent.kinds under --until-event, every kind for a one-shot read."; }, { readonly name: "--json"; readonly required: false; readonly description: "One JSON object per line. Control lines use kinds _ok, _heartbeat, _reconnected, _error, _reset, _dropped, _timeout, and _expired."; }, { readonly name: "--as"; readonly value: "<consumer-name>"; readonly required: false; readonly description: "Name the cursor (at-least-once delivery): 1-128 letters, numbers, dots, underscores, or hyphens. Default under --follow: session-<uuid> with --session, else this panel (PANE_PANEL_ID, shortened to panel-<sha256 prefix> when longer than 64 characters); under --until-event: until-<panel id>; otherwise anonymous."; }, { readonly name: "--since"; readonly value: "<generation>"; readonly required: false; readonly description: "Use an explicit generation cursor instead of a name. Cannot be combined with --as or --follow."; }, { readonly name: "--from"; readonly required: false; readonly value: "<now|earliest>"; readonly description: "Starting point for a new named cursor. Default now (silent baseline); earliest replays the journal."; }, { readonly name: "--self-test"; readonly required: false; readonly description: "Check the daemon watch path without moving any cursor, print WATCH OK, and exit 0."; }, { readonly name: "--ready-settle"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: how long a panel must stay quiet before READY. Default 3m. A BUSY, BLOCKED, UNKNOWN, EXIT, or GONE inside the window cancels it. 0 turns it off."; }, { readonly name: "--blocked-settle"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: how long before BLOCKED is printed; an in-pane answer inside it cancels the line. Default 30s. 0 turns it off."; }, { readonly name: "--min-interval"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: batch READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines at most once per interval; REPORT, BLOCKED, pr.conflicted, pr.base_changed, pr.base_deleted, and failed pr.checks arrive at once and carry the held lines. Default 10m. 0 turns batching off."; }, { readonly name: "--idle-after"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: the first IDLE reminder after a READY panel stays idle. Default 10m. Later reminders back off to 30m, 1h, 3h, then daily. 0 turns IDLE off."; }, { readonly name: "--expire-after"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: end the watch with WATCH EXPIRED and exit 0 after this long with no events but IDLE; any other event restarts the clock. Default 3h. 0 never expires."; }, { readonly name: "--heartbeat"; readonly value: "<duration>"; readonly required: false; readonly description: "Override: print a HEARTBEAT line this often as proof of life. Default off; a monitor that wakes an agent should leave it off."; }, { readonly name: "--timeout-ms"; readonly required: false; readonly value: "<duration>"; readonly description: "Per-request wait in milliseconds; 0 reads once without waiting. Default 60000, capped at 120000 (the follow loop re-issues requests). With --until-event it is the deadline for the whole wait (exit 124 with WATCH TIMEOUT). Accepts ms/s/m/h units; bare values are milliseconds. 0/off is a nonblocking read only, and is rejected with --follow or --until-event."; }, { readonly name: "--limit"; readonly required: false; readonly value: "<count>"; readonly description: "Maximum entries per response. Default 256."; }, { readonly name: "--ack-now"; readonly required: false; readonly description: "At-most-once named-cursor delivery (advance before you act). Default at-least-once."; }, { readonly name: "--include-held-input"; readonly required: false; readonly description: "Include up to 120 characters of unsubmitted composer text (typed text only; prompt suggestions and placeholders excluded) in JSON entries. Default off: under --follow, JSON entries carry only heldInputPresent: true."; }, { readonly name: "--no-held-input"; readonly required: false; readonly description: "Disable redacted held-input detection under --follow: no STUCK lines, and no heldInputPresent in JSON."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }, { readonly name: "--epoch"; readonly value: "<epoch>"; readonly description: "Journal epoch paired with --since; a mismatch emits _reset instead of silently skipping events."; readonly required: false; }]; readonly examples: readonly ["runpane watch --self-test", "runpane watch --until-event", "runpane watch --follow", "runpane watch --session <id|name> --follow", "runpane watch --session <id|name> --follow --ready-settle 1m --blocked-settle 15s --min-interval 2m", "runpane watch --follow --json --kinds agent.report,agent.blocked"]; readonly notes: readonly ["Every default is in the contract under defaults.watch: follow (what --follow does) and untilEvent (what --until-event waits for). An override flag replaces one value; nothing else needs remembering.", "Arming: wait for WATCH OK before relying on a --follow monitor. It prints once when the watch is armed. Run the monitor under your harness's background monitor (one line = one notification).", "Ending: WATCH EXPIRED (exit 0) means nothing happened for --expire-after: say so, and arm a new watch with the next dispatch. A non-zero exit or a WATCH ERROR line means it failed: tell the user and re-arm once; if it dies again, file runpane doctor --report. If the message says the cursor was superseded, keep the replacement monitor and leave the old one stopped. Judge a watch by these lines, never by silence.", "--until-event prints exactly one line: the event (exit 0), WATCH TIMEOUT (exit 124, only with --timeout-ms), or WATCH ERROR (exit 2).", "STUCK means real unsubmitted composer text. An agent prompt suggestion (for example a grey Try \"...\" hint) never counts.", "Cadence state is held per named consumer. Without numeric --since, follow uses an explicit --as or assigns a Session, panel, or follow-<pid> name. With numeric --since it has no name and bypasses cadence; --as cannot be combined with --since. Held lines survive a reconnect of the same consumer; a changed filter re-delivers them under the new filter.", "Journal loss is surfaced through reset and dropped metadata.", "The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly.", "Control lines are not journal entries. Lines text and JSON kind: WATCH OK (_ok, once when armed), HEARTBEAT (_heartbeat, only with --heartbeat), WATCH RECONNECTED (_reconnected, after a retried daemon error), WATCH ERROR (_error; exit 2 unless --follow or --until-event retries it), RESET (_reset, the journal restarted or the cursor fell behind; a fresh baseline follows), DROPPED (_dropped, entries lost to journal truncation), WATCH TIMEOUT (_timeout, --until-event deadline; exit 124), and WATCH EXPIRED (_expired, --expire-after passed; exit 0). Under --until-event, only _timeout and _error print.", "Under --follow, JSON entries for panels holding unsubmitted composer text carry heldInputPresent: true, the JSON equivalent of the STUCK line. Only typed composer text counts, the same reading as panels screen composer.hasUndeliveredText; an agent's dim or grey prompt suggestion or placeholder does not. --no-held-input turns this off.", "--session <id|name> scopes the watch to a named Session. The daemon resolves the Session once per request and its associated Panes on every read, so sessions associate and sessions detach take effect without a re-arm; archived and detached Panes drop out, and the Session's own orchestrator panels are excluded. Cadence state is keyed by the Session, not its current Panes, so membership changes keep held lines. A detached Pane's held lines are dropped.", "Under --session, pane.associated (JOINED <pane-name> pane <pane-id> session <session-id>) and pane.detached (LEFT ...) report membership changes; list them in --kinds next to the agent kinds. Other consumers receive them only when --kinds lists them, so older clients never see an unknown kind.", "PR watching: the daemon batches up to 25 direct GraphQL fingerprints per host every ~2 minutes. Full details are read on change or a 30-minute backstop. Existing Session branch discovery remains; standalone Panes register with pr watch --url <PR URL> [--head <full-sha>]. Immediate failures, required-check-aware success, head/review/comment/closed/merged events and GitHub outage/recovery events share durable baselines and the journal. A head pin prevents stale success, empty/partial checks never pass, and merge status BLOCKED/UNKNOWN conservatively withholds success. Rate limits honor server waits and reserve 10% for interactive use. Eight other errors or ten comment-only updates stop the watch with pr.stopped. See pr watch/unwatch/list.", "A daemon that predates --session returns no session field; runpane then fails with WATCH ERROR instead of watching every Pane.", "Replay: after a reset (RESET/_reset), the baseline restates current state. In JSON, those entries carry replay: true (and changedWhileAway: true after an epoch change). A replayed agent.ready is never READY: re-read runpane sessions overview instead of acting on it. Lines mode prints only CHANGED for them.", "agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's `runpane report`. It is in the default kinds of --follow and --until-event, and arrives from any panel: a shell tab or a wrapper launch whose agent is not yet detected included. It bypasses --min-interval, and orchestrators treat it as the completion signal; a READY without a report means look, and maybe nudge.", "Never pipe --follow into grep -m1, head, or any other exit-on-match reader: it does not exit when its reader does until its next write. To wait for one event, use --until-event.", "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.", "--follow has one default cadence: READY 3m, BLOCKED 30s, non-urgent batches 10m, IDLE after 10m with backoff, expiry 3h, heartbeats off. Individual duration flags override it. --present and --profile were removed; use --ready-settle, --blocked-settle, and --min-interval for timing overrides.", "--until-event delivers matching events immediately without follow settling or batching. A harness that consumes a named follow stream gets its cadence; a process-exit waiter keeps immediate single-event semantics. --follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since."]; }; readonly "panes git-status": { readonly name: "panes git-status"; readonly summary: "Read the git status of a Pane worktree: uncommitted, unpushed, and behind-main counts."; readonly details: "Use this to check whether a Pane has work to commit, push, or rebase before archiving it or opening a PR."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes git-status --pane <pane-id> --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes commit": { readonly name: "panes commit"; readonly summary: "Stage all changes in a Pane worktree and commit them."; readonly details: "Use this to commit a Pane's work the way the app's commit action does. The message needs a title line."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--message"; readonly value: "<message>"; readonly required: true; readonly description: "Commit message; the first line is the title."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes commit --pane <pane-id> --message <message> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes push": { readonly name: "panes push"; readonly summary: "Push a Pane branch to its remote."; readonly details: "Use this to publish a Pane's commits, the way the app's push action does."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes push --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes pull": { readonly name: "panes pull"; readonly summary: "Pull the remote branch into a Pane worktree."; readonly details: "Use this to bring remote commits into a Pane, the way the app's pull action does."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes pull --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes rebase-main": { readonly name: "panes rebase-main"; readonly summary: "Rebase a Pane branch onto the latest main branch."; readonly details: "Use this to bring main's changes into a Pane. It rewrites the Pane branch history; conflicts are reported, not resolved."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes rebase-main --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes restore": { readonly name: "panes restore"; readonly summary: "Restore an archived Pane, recreating its worktree."; readonly details: "Use this to undo `panes archive`."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes restore --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes squash-rebase": { readonly name: "panes squash-rebase"; readonly summary: "Squash a Pane branch into one commit and rebase it onto main."; readonly details: "Use this to land a Pane's work on the repository's main branch the way the app's squash-and-rebase action does. It rewrites the Pane branch and updates main."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--message"; readonly value: "<message>"; readonly required: true; readonly description: "Commit message; the first line is the title."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes squash-rebase --pane <pane-id> --message <message> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "panes stash": { readonly name: "panes stash"; readonly summary: "Stash uncommitted changes in a Pane worktree."; readonly details: "Use this to set aside work in progress, the way the app's stash action does. `panes stash-pop` brings it back."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes stash --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "panes stash-pop": { readonly name: "panes stash-pop"; readonly summary: "Apply and drop the latest stash in a Pane worktree."; readonly details: "Use this to bring back work set aside with `panes stash`."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes stash-pop --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "panes soft-reset": { readonly name: "panes soft-reset"; readonly summary: "Undo the last commit in a Pane, keeping its changes staged."; readonly details: "Use this to reword or regroup the latest commit, the way the app's soft reset action does."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes soft-reset --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "panes fetch": { readonly name: "panes fetch"; readonly summary: "Fetch the remote for a Pane worktree."; readonly details: "Use this to refresh remote branches before checking git status or rebasing."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes fetch --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes run-script": { readonly name: "panes run-script"; readonly summary: "Run the repository's run script in a Pane."; readonly details: "Use this to start the dev server or app for a Pane, the way the app's Run button does."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes run-script --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "panes stop-script": { readonly name: "panes stop-script"; readonly summary: "Stop the run script running in a Pane."; readonly details: "Use this to stop what `panes run-script` started."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes stop-script --pane <pane-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "panes move": { readonly name: "panes move"; readonly summary: "Move a Pane into a sidebar folder."; readonly details: "Use this to organize Panes. Folder ids come from `runpane folders list`."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: true; readonly description: "Pane id from panes list or agents start."; }, { readonly name: "--folder"; readonly value: "<folder-id>"; readonly required: true; readonly description: "Folder id from folders list."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane panes move --pane <pane-id> --folder <folder-id> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message.", "The result includes `link`, a pane:// link the user can open to review the Pane."]; }; readonly "folders list": { readonly name: "folders list"; readonly summary: "List the sidebar folders of a repository."; readonly details: "Use this to find folder ids for `panes move`."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<repo-id>"; readonly required: true; readonly description: "Numeric repository id from repos list."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane folders list --repo <repo-id> --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "folders create": { readonly name: "folders create"; readonly summary: "Create a sidebar folder in a repository."; readonly details: "Use this to add a folder for grouping Panes."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<repo-id>"; readonly required: true; readonly description: "Numeric repository id from repos list."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Folder name."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane folders create --repo <repo-id> --name <name> --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Runs the same Pane action as the button in the app, through the running Pane daemon.", "Output is `{ ok, data, error }`; `ok: false` exits non-zero with the error message."]; }; readonly "links create": { readonly name: "links create"; readonly summary: "Build a pane:// link that opens a Pane, panel, repository, or Session in the Pane app."; readonly details: "Use this to hand the user a clickable link. It only builds the URL; opening it navigates and never changes Pane state."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane to open."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Panel inside the Pane to select."; }, { readonly name: "--repo"; readonly value: "<repo-id>"; readonly required: false; readonly description: "Repository id from repos list."; }, { readonly name: "--session"; readonly value: "<session-id>"; readonly required: false; readonly description: "Session id or name from sessions list."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane links create --pane <pane-id> --json"]; readonly jsonSchemas: readonly ["linkCreateResult"]; readonly notes: readonly ["Links look like `pane://open?pane=<pane-id>&panel=<panel-id>`. Give exactly one of --pane, --repo, or --session."]; }; readonly "links open": { readonly name: "links open"; readonly summary: "Open a pane:// link in the running Pane app."; readonly details: "Use this to navigate the app to a Pane, panel, repository, or Session. It raises the Pane window, so run it only when the user asked."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--url"; readonly value: "<pane-url>"; readonly required: true; readonly description: "A pane://open link from links create."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane links open --url \"pane://open?pane=<pane-id>\" --yes --json"]; readonly jsonSchemas: readonly ["daemonActionResult"]; readonly notes: readonly ["Opening a link never changes Pane state; it selects what the link names."]; }; readonly "docs search": { readonly name: "docs search"; readonly summary: "Search Pane's docs, runpane help, and the Pane Chat skills."; readonly details: "Use this before guessing how Pane works. Results are short excerpts with a path; read the full text with `runpane docs read`."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--query"; readonly value: "<text>"; readonly required: true; readonly description: "Words to search for."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly required: false; readonly description: "Maximum results; defaults to 5."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane docs search --query \"archive a pane\" --json"]; readonly jsonSchemas: readonly ["docsSearchResult"]; readonly notes: readonly ["Works offline. Skills are found in the Pane data directory when the Pane app has installed them."]; }; readonly "docs read": { readonly name: "docs read"; readonly summary: "Read one Pane doc, help topic, or skill in full."; readonly details: "Use this with a path from `runpane docs search`."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--doc"; readonly value: "<path>"; readonly required: true; readonly description: "Path from docs search, such as docs/PANE_MCP.md."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane docs read --doc docs/PANE_MCP.md --json"]; readonly jsonSchemas: readonly ["docsReadResult"]; readonly notes: readonly ["Paths come from docs search: `docs/<file>.md`, `skills/<name>/SKILL.md`, `help/<topic>`, or `command/<name>`."]; }; readonly "agents start": { readonly name: "agents start"; readonly summary: "Start an agent on a task and wait until it is ready: as a new tab in an existing Pane with --pane <id> (review, audit, fix, QA), or in a new Pane with --repo and --name for new work."; readonly details: "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. For work that already has a Pane, pass --pane <id>: the agent opens as a new tab sharing that Pane's worktree and branch. Only when the work's branch has no Pane yet, pass --repo and --name to create one. It returns the pane and panel ids and a pane:// link to hand the user."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Existing Pane to add the agent to as a new tab. Use this for any work that already has a Pane."; }, { readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Repository: active, id, exact path, or saved name."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: false; readonly description: "Name for the new Pane. With --repo, only for work whose branch has no Pane yet."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: false; readonly description: "Built-in agent to launch."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Custom terminal command instead of a built-in agent."; }, { readonly name: "--prompt"; readonly value: "<task>"; readonly required: true; readonly description: "The task to send once the agent is ready."; }, { readonly name: "--base-branch"; readonly value: "<branch>"; readonly required: false; readonly description: "Branch to start the worktree from."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane agents start --repo active --name fix-login --agent claude --prompt \"Fix the login redirect\" --yes --json", "runpane agents start --pane <pane-id> --agent codex --prompt \"Review the PR from this branch and report findings\" --yes --json"]; readonly jsonSchemas: readonly ["agentTaskResult"]; readonly notes: readonly ["Creates the Pane in the background (no focus change), pinned, and waits for the agent to be ready before sending the prompt.", "Check on it with `runpane agents status`; send follow-ups with `runpane agents send`."]; }; readonly "agents status": { readonly name: "agents status"; readonly summary: "Check on an agent: whether it is working, ready, blocked, or idle, plus its current screen."; readonly details: "Use this to see how an agent started with `agents start` is doing, or whether it needs input."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane id; its agent panel is used."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Panel id."; }, { readonly name: "--limit"; readonly value: "<count>"; readonly required: false; readonly description: "Screen lines to return; defaults to 40."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane agents status --pane <pane-id> --json"]; readonly jsonSchemas: readonly ["agentStatusResult"]; readonly notes: readonly ["`status` is `working`, `ready`, `blocked`, `idle`, `exited`, or `unknown`. `blocked` means the agent is waiting on a person."]; }; readonly "agents send": { readonly name: "agents send"; readonly summary: "Send a follow-up message to an agent and confirm it was submitted."; readonly details: "Use this to answer an agent or give it the next instruction."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane id; its agent panel is used."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Panel id."; }, { readonly name: "--text"; readonly value: "<message>"; readonly required: true; readonly description: "The message to submit."; }, { readonly name: "--as-file-pointer"; readonly required: false; readonly description: "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."; }, { readonly name: "--yes"; readonly required: false; readonly description: "Confirm this change; required in non-interactive shells."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane agents send --pane <pane-id> --text \"Also add a test\" --yes --json", "runpane agents send --pane <pane-id> --text \"$(cat review-notes.md)\" --as-file-pointer --yes --json"]; readonly jsonSchemas: readonly ["agentSendResult"]; readonly notes: readonly ["`delivered` is true when the agent took the message or queued it for after its current turn; `delivery` says which (`taken` or `queued`) and how Pane knows (`transcript` or `screen`). Never resend a delivered message.", "It types the text, then queues with Tab when Codex is working or submits with Enter when ready. It is for messages, not keys. To answer a menu, use `runpane panels input --panel <panel-id> --keys down,enter --yes`, then check the screen with `runpane agents status`.", "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts."]; }; readonly report: { readonly name: "report"; readonly summary: "Hand back a worker's structured report: state, PR, head commit, summary, and the question when blocked."; readonly details: "Run this as a delegated worker when you finish, fail, or get blocked, as the last step of your task. The orchestrator receives it as an agent.report watch event and treats it as the completion signal. It prints whether anyone was waiting for it."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--state"; readonly value: "<ready|blocked|failed|done>"; readonly required: true; readonly description: "ready: work is ready for review; done: finished with nothing to review; blocked: needs an answer; failed: could not finish."; }, { readonly name: "--pr"; readonly value: "<number>"; readonly required: false; readonly description: "Pull request number."; }, { readonly name: "--head"; readonly value: "<sha>"; readonly required: false; readonly description: "Head commit the report is about, 7-40 hex characters."; }, { readonly name: "--summary"; readonly value: "<text>"; readonly required: false; readonly description: "Summary text; up to 16,000 characters are kept."; }, { readonly name: "--summary-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read the summary from a file or stdin; the absolute path is kept as summaryPath."; }, { readonly name: "--question"; readonly value: "<text>"; readonly required: false; readonly description: "What you need answered; required with --state blocked."; }, { readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Pane id when not running inside a Pane terminal (PANE_SESSION_ID)."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Panel id when not running inside a Pane terminal (PANE_PANEL_ID)."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md --json", "runpane report --state blocked --question \"Should the migration drop the old column?\""]; readonly jsonSchemas: readonly ["reportResult"]; readonly notes: readonly ["Inside a Pane terminal the report is for the current panel (PANE_SESSION_ID and PANE_PANEL_ID). Explicit --panel (with an optional --pane) wins; with neither, the command fails with a clear error.", "Each report replaces the panel's previous one and survives a Pane restart.", "agent.report is in the default kinds of `runpane watch --follow` and `--until-event`, and arrives from any panel, a shell tab included. REPORT lines skip the --min-interval batch.", "The output says who received it: \"Delivered to N waiting watcher(s).\" counts watches waiting at that moment (liveWatchers in JSON). With no Session and nobody waiting it adds that the report is stored on the panel (runpane agents status --panel <id>) and that a named-cursor watch (runpane watch --as <name> --kinds agent.report) still receives it when it next waits. Zero is not a failure; the exit code is 0 either way."]; }; readonly "sessions list": { readonly name: "sessions list"; readonly summary: "List durable named orchestration Sessions."; readonly details: "List durable named orchestration Sessions."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions list [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionListResult"]; readonly notes: readonly []; }; readonly "sessions create": { readonly name: "sessions create"; readonly summary: "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false)."; readonly details: "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false)."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly ["Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.", "JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted.", "Create-time isPinned requires an updated Pane app. Older apps may ignore the field; use sessions pin after creation and read back the result.", "runtime appears only on WSL Sessions (\"wsl\", with wslDistribution, Windows only). A Session on the native host has no runtime field on any OS; \"windows\" is accepted on input as a legacy name for the native host and is not stored.", "Payload fields (all optional on update; name required on create): name, goal, context, nextAction, launchCommand, profile (strings); isPinned and, on update, archived (booleans); agent (codex|claude|cursor); decisions and blockers (arrays of strings); evidence and outputs (arrays of links); create also takes runtime (windows|wsl) and wslDistribution; update also takes report, expectedRevision (the revision you read; the update is refused if the Session has moved on) and source (user|agent).", "A link is {\"label\": non-empty string, \"url\": an https://, http://, file:// or grain:// URL, \"addedAt\": ISO 8601 date such as 2026-10-14T09:30:00Z, \"kind\"?: evidence|output|ticket|pull-request|other, \"provenance\"?: string}.", "Arrays replace the stored value: send the whole list, not only new items.", "Every problem in the payload is reported at once in one ERR_SESSION_PAYLOAD_INVALID error (paths such as outputs[0].addedAt, \"missing\" for an absent required field), and nothing is changed.", "Example: {\"name\": \"Release QA\", \"goal\": \"Ship 2.5\", \"decisions\": [\"Cut from main\"], \"blockers\": [], \"outputs\": [{\"label\": \"Release PR\", \"url\": \"https://github.com/greenfield-inc/Pane/pull/1\", \"addedAt\": \"2026-10-14T09:30:00Z\", \"kind\": \"pull-request\"}]}"]; }; readonly "sessions get": { readonly name: "sessions get"; readonly summary: "Read one durable named orchestration Session."; readonly details: "Read one durable named orchestration Session."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions get --session <id|name> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly []; }; readonly "sessions update": { readonly name: "sessions update"; readonly summary: "Update a Session overview from structured JSON; isPinned sets the UI pin star."; readonly details: "Update a Session overview from structured JSON; isPinned sets the UI pin star."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly ["Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.", "JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted.", "Payload fields (all optional on update; name required on create): name, goal, context, nextAction, launchCommand, profile (strings); isPinned and, on update, archived (booleans); agent (codex|claude|cursor); decisions and blockers (arrays of strings); evidence and outputs (arrays of links); create also takes runtime (windows|wsl) and wslDistribution; update also takes report, expectedRevision (the revision you read; the update is refused if the Session has moved on) and source (user|agent).", "A link is {\"label\": non-empty string, \"url\": an https://, http://, file:// or grain:// URL, \"addedAt\": ISO 8601 date such as 2026-10-14T09:30:00Z, \"kind\"?: evidence|output|ticket|pull-request|other, \"provenance\"?: string}.", "Arrays replace the stored value: send the whole list, not only new items.", "Every problem in the payload is reported at once in one ERR_SESSION_PAYLOAD_INVALID error (paths such as outputs[0].addedAt, \"missing\" for an absent required field), and nothing is changed.", "update only: report is {\"summary\": non-empty string, \"status\": reported|verified, \"evidence\": [at least one link], \"reportedAt\": ISO 8601 date, \"provenance\": non-empty string}; report null clears it.", "Example: {\"expectedRevision\": 4, \"nextAction\": \"Merge after CI\", \"decisions\": [\"Cut from main\", \"Skip beta\"], \"evidence\": [{\"label\": \"QA log\", \"url\": \"file:///tmp/qa.log\", \"addedAt\": \"2026-10-14T09:30:00Z\", \"kind\": \"evidence\", \"provenance\": \"qa agent\"}], \"report\": {\"summary\": \"QA passed\", \"status\": \"verified\", \"evidence\": [{\"label\": \"QA log\", \"url\": \"file:///tmp/qa.log\", \"addedAt\": \"2026-10-14T09:30:00Z\"}], \"reportedAt\": \"2026-10-14T09:31:00Z\", \"provenance\": \"qa agent\"}}"]; }; readonly "sessions set-agent": { readonly name: "sessions set-agent"; readonly summary: "Switch the durable terminal agent for a named Session."; readonly details: "Switch the durable terminal agent for a named Session."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly []; }; readonly "sessions associate": { readonly name: "sessions associate"; readonly summary: "Associate a user-visible Pane with a named Session."; readonly details: "Associate a user-visible Pane with a named Session. `panes create` and `panes adopt` already do this automatically when run inside a Session orchestrator; use this for existing Panes or after `--no-associate`."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly []; }; readonly "sessions detach": { readonly name: "sessions detach"; readonly summary: "Detach a Pane from a named Session."; readonly details: "Detach a Pane from a named Session."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly []; }; readonly "sessions overview": { readonly name: "sessions overview"; readonly summary: "Read a live status, activity, git, and pull request overview for a named Session."; readonly details: "Read a live status, activity, git, and pull request overview for a named Session."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionOverviewResult"]; readonly notes: readonly ["The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`).", "Each `panes[].panels[]` entry has `report`, that panel's latest `runpane report` (state, `pr`, `head`, `question`, `summary`, `summaryTruncated`, `summaryPath`, `reportedAt`). When the summary is a complete JSON object, `report.data` holds it exactly as the worker gave it; Pane never reads or renames its fields. A plain-text, array or scalar summary, invalid JSON, JSON nested more than 64 levels deep, or a truncated summary (`summaryTruncated`) has no `data`. A panel that never reported has no `report` but keeps `state` and `lastActivityAt`. `panes[].report` is still the newest report among the Pane's panels, with its `panelId`; daemons that predate per-panel reports omit `panels[].report`."]; }; readonly "lock acquire": { readonly name: "lock acquire"; readonly summary: "Acquire a named lock on a resource shared between agents, such as one test account, optionally waiting for it."; readonly details: "Run this before using a resource that only one agent may use at a time, such as a shared test account, and release it when done. The owner is the calling Pane and panel ($PANE_SESSION_ID and $PANE_PANEL_ID, or --pane/--panel). The lock is scoped to the owner's Session when its Pane belongs to one, so two Sessions can each hold `testing-account`; otherwise it is global. It succeeds when the lock is free, expired, or already yours (which renews the TTL). Otherwise it returns ok:false with heldBy and expiresAt at once, or with --wait blocks in the daemon until the lock is released, expires, or its owner's panel exits or Pane is archived."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Lock name: 1-128 letters, digits, \".\", \"_\", or \"-\"."; }, { readonly name: "--ttl"; readonly value: "<duration>"; readonly required: true; readonly description: "How long the lock is held before it expires, such as 90s, 30m, or 2h; at most 24h. Acquire again before it runs out to renew."; }, { readonly name: "--wait"; readonly value: "<milliseconds>"; readonly required: false; readonly description: "Wait this long for the lock to come free. The CLI waits in daemon calls of up to 120 seconds each."; }, { readonly name: "--note"; readonly value: "<text>"; readonly required: false; readonly description: "What the lock is for, shown to other agents. Required outside a Pane terminal, where it also names the owner."; }, { readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Act for this Pane instead of $PANE_SESSION_ID."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Act for this panel instead of $PANE_PANEL_ID."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane lock acquire --name testing-account --ttl 30m --wait 1800000 --note \"call QA\" --json", "runpane lock acquire --name staging-db --ttl 10m --json"]; readonly jsonSchemas: readonly ["lockAcquireRequest", "lockAcquireResult"]; readonly notes: readonly ["Exit status is 0 only when the lock is yours; ok:false (exit 1) means another owner holds it, named by heldBy until expiresAt.", "Release the lock as soon as you are done with the resource: `runpane lock release --name <name>`. If you interrupt a waiting acquire, the lock can still be granted to you for up to two minutes; release it or let the TTL expire.", "Pane releases the lock when its TTL runs out, when the owner panel exits, or when the owner Pane is archived. Quitting Pane does not release it; locks survive a restart."]; }; readonly "lock release": { readonly name: "lock release"; readonly summary: "Release a named lock you hold, or force-release another owner's lock."; readonly details: "Only the owner can release a lock. --force releases another owner's lock, for example a stuck worker's; use --session to name a Session-scoped lock from outside that Session."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Lock name."; }, { readonly name: "--force"; readonly required: false; readonly description: "Release the lock even though another owner holds it."; }, { readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Session whose lock to release; defaults to the caller's Session, or global."; }, { readonly name: "--note"; readonly value: "<text>"; readonly required: false; readonly description: "Outside a Pane terminal, the note the lock was acquired with."; }, { readonly name: "--pane"; readonly value: "<pane-id>"; readonly required: false; readonly description: "Act for this Pane instead of $PANE_SESSION_ID."; }, { readonly name: "--panel"; readonly value: "<panel-id>"; readonly required: false; readonly description: "Act for this panel instead of $PANE_PANEL_ID."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane lock release --name testing-account --json", "runpane lock release --name testing-account --session \"<session-id-or-name>\" --force --json"]; readonly jsonSchemas: readonly ["lockReleaseResult"]; readonly notes: readonly ["released:false with ok:true means no such lock was held. ok:false with reason not-owner (exit 1) means another owner holds it."]; }; readonly "lock list": { readonly name: "lock list"; readonly summary: "List held named locks, optionally only one Session's."; readonly details: "List every held lock, or with --session the locks scoped to that Session plus those its Panes hold. `runpane sessions overview` includes the same Session locks."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Named Session id or exact name."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane lock list --json", "runpane lock list --session \"<session-id-or-name>\" --json"]; readonly jsonSchemas: readonly ["lockListResult"]; readonly notes: readonly []; }; readonly "workspace list": { readonly name: "workspace list"; readonly summary: "List the machines on your tailnet, each with its owner, and whether each answers workspaces."; readonly details: "Shows this machine's workspace state, then each other Mac, Windows, and Linux machine on your tailnet with its OS, online state, and shell. Your own machines come first; other people's machines carry their owner's login and answer only when their owner lets you in."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane workspace list --json"]; readonly notes: readonly ["A machine has joined when Pane runs there with workspaces on; it answers on https://<machine>.<tailnet>.ts.net:8443."]; }; readonly "workspace enable": { readonly name: "workspace enable"; readonly summary: "Put this machine's Pane on your tailnet for runpane workspace (the default when Tailscale is signed in)."; readonly details: "Serves this Pane's daemon with tailscale serve on port 8443 in HTTP proxy mode. Only your own Tailscale login is accepted unless you set Who can connect to Everyone on tailnet; nothing is opened to the internet."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane workspace enable"]; readonly notes: readonly ["Workspaces are on by default when Tailscale is installed and signed in; this undoes runpane workspace disable."]; }; readonly "workspace disable": { readonly name: "workspace disable"; readonly summary: "Take this machine off runpane workspace and remove its tailscale serve handler on port 8443."; readonly details: "Turns workspaces off for this machine until runpane workspace enable. The remote daemon on port 443 and pairing codes are unaffected."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane workspace disable"]; readonly notes: readonly ["Other machines can no longer reach this one; this machine can still reach theirs."]; }; readonly "workspace read": { readonly name: "workspace read"; readonly summary: "Print a file from a machine on your tailnet; any path form works (C:\\..., /mnt/c/..., /home/..., ~/...)."; readonly details: "Reads the same way on every OS. On Windows, /mnt/c/... reaches C:\\... and WSL paths such as /home/<user>/... are read through \\\\wsl.localhost\\<distro>\\. Directories list their entries."; readonly requiresPaneDaemon: false; readonly mutates: false; readonly arguments: readonly [{ readonly name: "<machine>"; readonly required: false; readonly description: "Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits."; }, { readonly name: "<path>"; readonly required: true; readonly description: "Absolute path in any form; ~ is that machine's home."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane workspace parsa-devbox read 'C:\\Users\\me\\.pane\\plans\\topic\\index.html'", "runpane workspace read /mnt/c/Users/me/notes.md"]; readonly notes: readonly ["--json returns content with encoding utf8 or base64."]; }; readonly "workspace write": { readonly name: "workspace write"; readonly summary: "Write stdin to a file on a machine on your tailnet, creating parent folders."; readonly details: "Takes the same path forms as workspace read. Content comes from stdin and replaces the file."; readonly requiresPaneDaemon: false; readonly mutates: true; readonly arguments: readonly [{ readonly name: "<machine>"; readonly required: false; readonly description: "Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits."; }, { readonly name: "<path>"; readonly required: true; readonly description: "Absolute path in any form."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["echo done | runpane workspace parsa-devbox write '~/notes/status.md'"]; readonly notes: readonly ["Binary stdin is sent as base64 and written byte for byte."]; }; readonly "workspace exec": { readonly name: "workspace exec"; readonly summary: "Run a command in another machine's shell and return stdout, stderr, the exit code, OS, and shell."; readonly details: "Runs in the shell Pane uses for terminals on that machine (PowerShell or Git Bash on Windows, the login shell elsewhere). The exit code becomes runpane's exit code. Without <machine>, a --cwd that cannot exist here picks the machine."; readonly requiresPaneDaemon: false; readonly mutates: true; readonly arguments: readonly [{ readonly name: "<machine>"; readonly required: false; readonly description: "Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits."; }, { readonly name: "--cwd"; readonly value: "<path>"; readonly required: false; readonly description: "Working directory on that machine, in any path form; defaults to its home."; }, { readonly name: "--timeout-ms"; readonly value: "<milliseconds>"; readonly required: false; readonly description: "Stop the command after this long (default 120000, at most 540000)."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "-- <command>"; readonly required: true; readonly description: "The command line, run by that machine's shell."; }]; readonly examples: readonly ["runpane workspace parsa-devbox exec --json -- git -C C:\\src\\app status --short"]; readonly notes: readonly ["This is SSH-level power: a local agent's sandbox and permission prompts see only runpane workspace exec, not what runs on the other machine.", "Pass the command as one quoted string; several words after -- are joined with spaces, so their own quoting is lost."]; }; readonly handoff: { readonly name: "handoff"; readonly summary: "Hand your task to another agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. A same-agent handoff from a Pane tab carries and resumes your own session (a fork on this machine) and checks it continued; otherwise a fresh agent starts with the note. From a Session's terminal, create the Session on another machine instead."; readonly details: "Two steps. The agent writes the note, because only it has the context: run `runpane handoff --template > ~/handoff.md` (outside the checkout) and fill in every section (goal, current state, done and verified, in progress, next steps, decisions and constraints, open questions, how to verify, git state), writing \"None\" where one does not apply. Then `runpane handoff \"<destination>\" --note-file ~/handoff.md` moves it: it rejects a note with a missing or empty section, refuses an unpushed branch unless --push, finds the destination's saved repository with the same remote, fetches the branch there, writes the note to `~/.pane/handoffs/` on that machine with its origin in the front matter and receiver instructions appended, and starts the agent in a new Pane branched from your branch. When you run in a Pane tab and the receiver is your own agent, it carries your session instead of starting fresh: another machine gets a copy of the session's files in its agent store and resumes the same id; this machine resumes a fork. The receiver starts with no prompt, and the CLI checks it resumed and shows the session's last message, then tells it where the session moved. The receiver verifies the head commit, continues from Next steps, pushes to your branch, and reports back to your panel with `runpane workspace <your machine> panels submit`. Run from a Session's terminal (its folder is outside git), handoff moves the Session instead: it skips git, writes the note to the other machine the same way, and creates a Session there with the same name, goal and agent (numbered \"<name> 2\" if the name is taken), whose context and next action point at the note; a same-agent Session also gets your conversation's files and resumes it when first opened. The sender Session stays as it is; the new one waits for your first message. A Session cannot be handed off to the machine it is on."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "<destination>"; readonly required: false; readonly description: "Freeform text naming the agent (claude, codex, cursor), and optionally the model, the effort, and the machine: a Tailscale machine name or unique prefix (list them with `runpane workspace list`), or \"this machine\". Required unless --agent is given. Examples: \"codex gpt-5 high on parsas-macbook-pro\", \"claude opus on parsa-devbox\", \"cursor on this machine\"."; }, { readonly name: "--template"; readonly required: false; readonly description: "Print the note template, with this checkout's (or Session's) origin and git state in its front matter, and exit."; }, { readonly name: "--note-file"; readonly value: "<path|->"; readonly required: false; readonly description: "The note to check and send; required unless --template or --dry-run. Without it, --dry-run checks only the destination and git state."; }, { readonly name: "--machine"; readonly value: "<name>"; readonly required: false; readonly description: "Destination machine; overrides the text."; }, { readonly name: "--agent"; readonly value: "<codex|claude|cursor>"; readonly required: false; readonly description: "Receiving agent; overrides the text."; }, { readonly name: "--model"; readonly value: "<model>"; readonly required: false; readonly description: "Model for the receiving agent, such as opus, sonnet, gpt-5, or claude-opus-5-5; overrides the text."; }, { readonly name: "--effort"; readonly value: "<level>"; readonly required: false; readonly description: "minimal, low, medium, high, xhigh, or max; supported for Claude and Codex only; overrides the text. Cursor effort is rejected."; }, { readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Saved repository on the destination. Defaults to the one with a remote for this repository."; }, { readonly name: "--push"; readonly required: false; readonly description: "Commit uncommitted work (except the note) as WIP and push the branch before sending; never forces. Without it, an unpushed branch stops the handoff."; }, { readonly name: "--note-only"; readonly required: false; readonly description: "Start a fresh agent with the note instead of carrying your own session. Without it, a handoff to the same agent carries and resumes your session."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Check destination daemon reachability and resolve its saved repository name, path, environment and OS; print the note check and git state without committing, pushing, fetching, writing notes or creating a Pane."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }]; readonly examples: readonly ["runpane handoff --template > ~/handoff.md", "runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md --push", "runpane handoff \"codex gpt-5 high on parsa-devbox\" --note-file ~/handoff.md --dry-run --json", "runpane handoff --machine build-server --agent cursor --note-file ~/handoff.md"]; readonly notes: readonly ["Another machine is reached through runpane workspace (Tailscale); it needs Pane running there with workspaces enabled and the repository saved. Repository listing and Pane creation call the reached daemon directly; no global destination CLI installation is required.", "Destination preflight runs before sender commit/push. Inside WSL, an absent or refused local Linux daemon can fall back to its Windows host through reachable Windows Tailscale and enabled workspaces; explicit Pane directory selection keeps its instance. Select a native Windows saved repository; WSL saved repositories are rejected before sending.", "A successful handoff requires initialInput.verifiedSubmitted and delivery taken or queued without blocked/error evidence. Unverified delivery exits nonzero with the created Pane, panel and a panels screen inspection command; inspect before retrying.", "From a Session's terminal (PANE_ORCHESTRATION_SESSION_ID set, folder outside git) the receiver is a Session, not a Pane: it needs only runpane:sessions:create and runpane:machine:write on the destination, pushes nothing, and refuses this machine before sending. JSON output then has receiver.route \"session\", session {id, name, machine} and no git field; a dry run reports the name the Session would get.", "Write the note for a reader with no context: quote errors and commands exactly, and record approaches that failed so they are not retried. Leave the front matter to the CLI.", "Model and effort become agent flags: claude --model/--effort, codex -m and -c model_reasoning_effort, cursor-agent --model. Cursor effort is not supported and is rejected before side effects.", "Run it from the checkout being handed off. On another machine the receiver works in a new Pane; on this machine, from the Pane that owns this checkout, it works in a new tab of that Pane (the result's receiver.route and receiver.reason say which). Either way it pushes back to your branch, so stop changing that branch yourself.", "JSON continuity: { carried, result: continued | inconclusive | not-continued | fresh-agent, agent, sessionId, resumedId, fork, files, bytes, checks: { resumedById, restartResumes, historyLoaded, originalUntouched?, originalAppended? }, reason, next }; a dry run sets carried, sessionId, fork, files and bytes and no result. inconclusive exits 0 and next says to ask the receiver \"What were you last working on? Answer in one or two sentences.\"; not-continued exits 1, keeps the receiver and gives the --note-only command for the person to choose. After continued or inconclusive, the sender ends its turn and makes no more changes on the branch. From a Session the result is inconclusive until the new Session is opened. A Cursor session is carried only to another machine (best effort); on this machine the result is not-continued, since a copied Cursor chat still writes to the original. The destination's agent store is assumed at its default location (~/.claude, ~/.codex, ~/.cursor); a copy already there that holds history the sender's lacks, or that an agent there is running, is never overwritten (not-continued). checks.originalAppended is set when the running sender's own turn appended to its transcript during the fork; every byte it held before is unchanged. A destination Pane too old to resume a carried session is refused before anything is sent (ERR_HANDOFF_RESUME_UNSUPPORTED)."]; }; readonly "sessions unpin": { readonly name: "sessions unpin"; readonly summary: "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state."; readonly details: "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--session"; readonly value: "<id|name>"; readonly required: true; readonly description: "Named Session id or exact name."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print JSON output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly ["Uses the same Session update path as the UI. The requested pin state is idempotent."]; }; readonly "sessions pin": { readonly name: "sessions pin"; readonly summary: "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state."; readonly details: "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--session"; readonly value: "<id|name>"; readonly required: true; readonly description: "Named Session id or exact name."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print JSON output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["sessionResult"]; readonly notes: readonly ["Uses the same Session update path as the UI. The requested pin state is idempotent."]; }; readonly "pr watch": { readonly name: "pr watch"; readonly summary: "Register durable GitHub PR monitoring for a Pane."; readonly details: "Register durable GitHub PR monitoring for a Pane."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<id>"; readonly required: false; readonly description: "Pane id; defaults to PANE_SESSION_ID."; }, { readonly name: "--url"; readonly value: "<PR URL>"; readonly required: true; readonly description: "Full HTTPS GitHub PR URL, including host, repository and number."; }, { readonly name: "--head"; readonly value: "<full-sha>"; readonly required: false; readonly description: "Pin success to this 40-character SHA; otherwise pin the first observed head."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print JSON (also the default for PR commands)."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Pane data directory."; }]; readonly examples: readonly ["runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly notes: readonly ["Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.", "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."]; }; readonly "pr unwatch": { readonly name: "pr unwatch"; readonly summary: "Remove a Pane’s explicit PR registration."; readonly details: "Remove a Pane’s explicit PR registration."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<id>"; readonly required: false; readonly description: "Pane id; defaults to PANE_SESSION_ID."; }, { readonly name: "--url"; readonly value: "<PR URL>"; readonly required: true; readonly description: "Full HTTPS GitHub PR URL, including host, repository and number."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print JSON (also the default for PR commands)."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Pane data directory."; }]; readonly examples: readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly notes: readonly ["Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.", "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."]; }; readonly "pr list": { readonly name: "pr list"; readonly summary: "List PR registrations and stopped watches."; readonly details: "List PR registrations and stopped watches."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--pane"; readonly value: "<id>"; readonly required: false; readonly description: "Pane id; defaults to PANE_SESSION_ID."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print JSON (also the default for PR commands)."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Pane data directory."; }]; readonly examples: readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"]; readonly jsonSchemas: readonly ["prWatchResult"]; readonly notes: readonly ["Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.", "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."]; }; readonly inbox: { readonly name: "inbox"; readonly summary: "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged."; readonly details: "An orchestrator runs it when it starts or resumes, to catch reports, missing reports, and questions that arrived while it was down. Pane never adds the inbox to the orchestrator's turns."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Session; defaults to PANE_ORCHESTRATION_SESSION_ID."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane inbox --session \"$PANE_ORCHESTRATION_SESSION_ID\" --json"]; readonly jsonSchemas: readonly ["inboxListResult"]; readonly notes: readonly ["Items: report (agent.report), report.missing (agent.report.missing), and blocked (agent.blocked, with the prompt's screen lines). Reports coalesce per panel, blockers clear when the panel moves on, and each Session keeps at most 200 items until acknowledged or superseded. A journal replay watermark recovers committed outcomes after restart within journal retention.", "A newer report replaces the panel's older report or missing report."]; }; readonly "inbox ack": { readonly name: "inbox ack"; readonly summary: "Clear Session inbox items once they are handled."; readonly details: "Acknowledge each item once you have acted on it, so the hook stops repeating it."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "<item-id>..."; readonly required: false; readonly description: "Item ids from `runpane inbox`."; }, { readonly name: "--session"; readonly value: "<id|name>"; readonly required: false; readonly description: "Only clear items of this Session; required with --all."; }, { readonly name: "--all"; readonly required: false; readonly description: "Clear every item of the Session."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane inbox ack in-1a2b3c4d --json"]; readonly jsonSchemas: readonly ["inboxAckResult"]; readonly notes: readonly ["Unknown ids are reported under `unknown`; acknowledging twice is harmless."]; }; readonly "loops list": { readonly name: "loops list"; readonly summary: "List loops (scheduled tasks) with their schedule, next run, and recent runs."; readonly details: "Lists every loop: its id, target (projectId for a repo, or orchestrationSessionId for a Session), cron and scheduleText, enabled, nextRunAtMs (null while paused), and its newest runs. A run's sessionId is its Pane (null for a Session loop's runs); read its progress with `runpane agents status --pane <id>`."; readonly requiresPaneDaemon: true; readonly mutates: false; readonly arguments: readonly [{ readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops list --json"]; readonly jsonSchemas: readonly ["loopListResult"]; readonly notes: readonly ["Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."]; }; readonly "loops create": { readonly name: "loops create"; readonly summary: "Create a loop: a cron schedule that starts a new Pane in a fresh worktree for each run, or sends a prompt to a Session's agent. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."; readonly details: "With --repo, each run is a new Pane in a fresh worktree branched from the repo's default base branch, started like `runpane panes create` with the agent or command and prompt given here. With --session, each run sends the prompt to that Session's agent instead of creating a Pane; a Session loop needs --agent and --prompt and takes no --tool-command. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Runs start only while Pane is running, in the host's local time zone. A run up to 15 minutes late still starts; a later one is recorded as skipped and never caught up. Runs may overlap. Unattended agent runs skip permission prompts. Pane keeps each loop's last 10 run Panes and archives older ones."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Repository: active, id, exact path, or saved repository name. Each run is a new Pane in it. Pass this or --session."; }, { readonly name: "--session"; readonly value: "<id|name|new>"; readonly required: false; readonly description: "Session whose agent gets the prompt each run, by id or name, instead of a new Pane. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Pass this or --repo."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: true; readonly description: "Loop name."; }, { readonly name: "--cron"; readonly value: "<expr>"; readonly required: true; readonly description: "Five-field cron in the host's local time zone, such as \"0 3 * * *\" (every day at 03:00). Runs must be at least 60 minutes apart."; }, { readonly name: "--agent"; readonly value: "<claude|codex|cursor>"; readonly required: false; readonly description: "Agent each run starts; for a Session loop, the Session's agent. Pass this or --tool-command."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Command each run starts instead of a built-in agent, such as `./scripts/nightly-report.sh` or `pnpm test`. Project loops only. On Windows it runs in Pane's terminal shell, Git Bash by default: write bash, or `cmd //c echo hi > loop.txt` rather than `cmd /c`."; }, { readonly name: "--prompt"; readonly value: "<text>"; readonly required: false; readonly description: "Text typed into the agent or command after it starts; for a Session loop, the message sent to the Session's agent each run."; }, { readonly name: "--prompt-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read the prompt from a file or stdin."; }, { readonly name: "--worktree-name"; readonly value: "<template>"; readonly required: false; readonly description: "Worktree and branch name template; defaults to loop-<name>. Project loops only."; }, { readonly name: "--paused"; readonly required: false; readonly description: "Create the loop paused."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Check the cron and print the loop that would be saved, with its schedule and next run, without saving."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops create --repo active --name nightly-bug-sweep --cron \"0 3 * * *\" --agent claude --prompt \"Fix one bug from yesterday's issues\" --yes --json", "runpane loops create --repo <repo> --name dependency-check --cron \"0 9 * * 1\" --tool-command \"pnpm test\" --yes --json", "runpane loops create --session new --name morning-triage --cron \"0 9 * * 1-5\" --agent claude --prompt \"Triage the new issues\" --yes --json"]; readonly jsonSchemas: readonly ["loopInput", "loopResult", "loopDryRunResult"]; readonly notes: readonly ["Saving rejects a cron whose runs fall less than 60 minutes apart. Check one first with --dry-run."]; }; readonly "loops update": { readonly name: "loops update"; readonly summary: "Change a loop's repo or Session, name, schedule, agent or command, prompt, or worktree template. Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."; readonly details: "Reads the loop, replaces the values you pass, and saves it. Passing --agent clears --tool-command and the other way round; --repo and --session replace each other the same way. Pause and resume with `loops pause` and `loops resume`. Runs start only while Pane is running, in the host's local time zone. A run up to 15 minutes late still starts; a later one is recorded as skipped and never caught up. Runs may overlap. Unattended agent runs skip permission prompts. Pane keeps each loop's last 10 run Panes and archives older ones."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--loop"; readonly value: "<id>"; readonly required: true; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--repo"; readonly value: "<selector>"; readonly required: false; readonly description: "Repository: active, id, exact path, or saved repository name. Each run is a new Pane in it. Pass this or --session."; }, { readonly name: "--session"; readonly value: "<id|name|new>"; readonly required: false; readonly description: "Session whose agent gets the prompt each run, by id or name, instead of a new Pane. `new` creates a Session named after the loop. The Session's agent then skips permission prompts for every message it gets, not only loop runs. Pass this or --repo."; }, { readonly name: "--name"; readonly value: "<name>"; readonly required: false; readonly description: "Loop name."; }, { readonly name: "--cron"; readonly value: "<expr>"; readonly required: false; readonly description: "Five-field cron in the host's local time zone, such as \"0 3 * * *\" (every day at 03:00). Runs must be at least 60 minutes apart."; }, { readonly name: "--agent"; readonly value: "<claude|codex|cursor>"; readonly required: false; readonly description: "Agent each run starts; for a Session loop, the Session's agent. Pass this or --tool-command."; }, { readonly name: "--tool-command"; readonly value: "<command>"; readonly required: false; readonly description: "Command each run starts instead of a built-in agent, such as `./scripts/nightly-report.sh` or `pnpm test`. Project loops only. On Windows it runs in Pane's terminal shell, Git Bash by default: write bash, or `cmd //c echo hi > loop.txt` rather than `cmd /c`."; }, { readonly name: "--prompt"; readonly value: "<text>"; readonly required: false; readonly description: "Text typed into the agent or command after it starts; for a Session loop, the message sent to the Session's agent each run."; }, { readonly name: "--prompt-file"; readonly value: "<path|->"; readonly required: false; readonly description: "Read the prompt from a file or stdin."; }, { readonly name: "--worktree-name"; readonly value: "<template>"; readonly required: false; readonly description: "Worktree and branch name template; defaults to loop-<name>. Project loops only."; }, { readonly name: "--dry-run"; readonly required: false; readonly description: "Check the cron and print the loop that would be saved, with its schedule and next run, without saving."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops update --loop <loop-id> --cron \"0 4 * * *\" --yes --json"]; readonly jsonSchemas: readonly ["loopInput", "loopResult", "loopDryRunResult"]; readonly notes: readonly []; }; readonly "loops run": { readonly name: "loops run"; readonly summary: "Start a run of a loop now. The schedule stays the same."; readonly details: "Starts a run now, as a new Pane or a message to the loop's Session, even while the loop is paused or another run is still going. The schedule stays the same, and the run counts toward the 10 kept runs."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--loop"; readonly value: "<id>"; readonly required: true; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops run --loop <loop-id> --yes --json"]; readonly jsonSchemas: readonly ["loopResult"]; readonly notes: readonly ["The result is the loop; `runs[0]` is the new run, with `status` started or failed and `sessionId` its Pane (null for a Session loop).", "Loops are for large recurring jobs and run at most once an hour; for short waits, use your agent harness's own sleep and wake."]; }; readonly "loops pause": { readonly name: "loops pause"; readonly summary: "Pause a loop: it starts no scheduled runs until resumed."; readonly details: "A paused loop starts no scheduled runs. `loops run` still starts one by hand."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--loop"; readonly value: "<id>"; readonly required: true; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops pause --loop <loop-id> --yes --json"]; readonly jsonSchemas: readonly ["loopResult"]; readonly notes: readonly []; }; readonly "loops resume": { readonly name: "loops resume"; readonly summary: "Resume a paused loop from its next scheduled time."; readonly details: "Runs resume at the next scheduled time. Runs missed while paused are not caught up."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--loop"; readonly value: "<id>"; readonly required: true; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops resume --loop <loop-id> --yes --json"]; readonly jsonSchemas: readonly ["loopResult"]; readonly notes: readonly []; }; readonly "loops delete": { readonly name: "loops delete"; readonly summary: "Delete a loop. It starts no more runs."; readonly details: "Deletes the loop and its schedule."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--loop"; readonly value: "<id>"; readonly required: true; readonly description: "Loop id, from `runpane loops list`."; }, { readonly name: "--yes"; readonly required: true; readonly description: "Confirm the change."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane loops delete --loop <loop-id> --yes --json"]; readonly jsonSchemas: readonly ["loopDeleteResult"]; readonly notes: readonly []; }; readonly notify: { readonly name: "notify"; readonly summary: "Ask the person a question, or tell them something, wherever they are, and get their answer back."; readonly details: "Prefer this to asking in the terminal whenever you need the person: to pick between options (ui options), to approve or deny an action (ui approve), to type a short answer (ui ask), or to tell them something that needs no answer (ui info). Pane shows it on screen even while the person works in another app, and the call waits until they answer, however long that takes. info returns at once."; readonly requiresPaneDaemon: true; readonly mutates: true; readonly arguments: readonly [{ readonly name: "--ui"; readonly value: "<options|approve|ask|info>"; readonly required: false; readonly description: "options: pick one of choices. approve: Approve or Deny. ask: a typed answer. info: an update that returns at once. Required unless resume."; readonly schema: { readonly type: "string"; readonly enum: readonly ["options", "approve", "ask", "info"]; }; }, { readonly name: "--title"; readonly value: "<text>"; readonly required: false; readonly description: "The question or update in one line; long titles wrap to 3 lines. Required unless resume."; }, { readonly name: "--context"; readonly value: "<text>"; readonly required: false; readonly description: "Background the person can open under Details."; }, { readonly name: "--choices"; readonly value: "<json>"; readonly required: false; readonly description: "ui options only, and required there: 1 to 9 choices. The answer is the chosen label. Mark at most the one you recommend."; readonly schema: { readonly type: "array"; readonly minItems: 1; readonly maxItems: 9; readonly items: { readonly $ref: "#/jsonSchemas/notifyChoice"; }; }; }, { readonly name: "--detail"; readonly value: "<text>"; readonly required: false; readonly description: "ui approve only: a preformatted block, such as the command or SQL to approve, behind a disclosure."; }, { readonly name: "--detail-label"; readonly value: "<text>"; readonly required: false; readonly description: "ui approve only, with detail: the disclosure's label, such as \"Show the SQL\"; up to 40 characters. Defaults to \"Show details\"."; readonly schema: { readonly type: "string"; readonly maxLength: 40; }; }, { readonly name: "--suggestions"; readonly value: "<json>"; readonly required: false; readonly description: "ui ask only: suggested answers, shown as chips above the text field."; readonly schema: { readonly type: "array"; readonly items: { readonly type: "string"; readonly minLength: 1; }; }; }, { readonly name: "--action"; readonly value: "<json>"; readonly required: false; readonly description: "ui info only: one button that opens a URL."; readonly schema: { readonly $ref: "#/jsonSchemas/notifyAction"; }; }, { readonly name: "--resume"; readonly value: "<id>"; readonly required: false; readonly description: "The id from a waiting result: keep waiting on that question. Pass no other fields."; }, { readonly name: "--json"; readonly required: false; readonly description: "Print machine-readable output."; }, { readonly name: "--pane-dir"; readonly value: "<path>"; readonly required: false; readonly description: "Connect to a specific Pane data directory."; }]; readonly examples: readonly ["runpane notify --ui options --title \"Which database for the cache?\" --choices '[{\"label\":\"Redis\",\"recommended\":true},{\"label\":\"SQLite\"}]' --json", "runpane notify --ui approve --title \"Drop the legacy_users table?\" --detail \"DROP TABLE legacy_users;\" --detail-label \"Show the SQL\" --json", "runpane notify --ui ask --title \"Which branch should I base this on?\" --suggestions '[\"main\",\"release\"]' --json", "runpane notify --ui info --title \"PR #812 is ready for review\" --action '{\"label\":\"Open PR\",\"url\":\"https://github.com/org/repo/pull/812\"}' --json", "runpane notify --resume n-4f2a --json"]; readonly jsonSchemas: readonly ["notifyRequest", "notifyResult"]; readonly notes: readonly ["Write the card the way the pane MCP server's instructions say: in plain words, what the work is for, what just happened, and what you need.", "Results: options returns {answer: <chosen label>, note?}; approve returns {approved: true|false, note?}; ask returns {answer}; info returns {delivered: \"screen\"|\"inbox\"}.", "A result of {waiting: true, id} means the question is still on screen and your client would otherwise time out: call `runpane notify --resume <id>` right away to keep waiting. After 15 minutes on this loop Pane gives up and returns unavailable.", "A result of {unavailable, next} means nobody can answer through Pane right now (Pane is not running, Notify is off, or the wait ended): ask in the terminal instead. It is a result, not an error.", "Inside a Pane terminal the question names its Pane and panel (PANE_SESSION_ID and PANE_PANEL_ID); elsewhere it names the working directory.", "Invalid input, such as choices with ui ask or 10 choices, fails with a message naming the field, and nothing is shown."]; }; }; readonly managedBlock: readonly ["## Pane", "", "This repository is used with [Pane](https://runpane.com). Drive it with the CLI or the `pane` MCP server.", "", "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Open later agents with `runpane panels create --pane <id>` (MCP: `panels_create` or `agents_start` with `pane`), not a new Pane.", "", "When you need the person (a choice, an approval, a short answer), call the `notify` MCP tool (or `runpane notify`) instead of asking in the terminal. If it returns `waiting`, call it again with `resume`; if it returns `unavailable`, ask in the terminal.", "", "CLI: `npm i -g runpane` (or `npx --yes runpane@latest`), then `runpane doctor --json`. Full command reference: `runpane agent-context --json`.", "", "MCP: packaged Pane registers a stdio server named `pane` with Claude Code, Codex, and Cursor. Check the connection with `claude mcp list`, `codex mcp list`, or `agent mcp list`. Cursor may ask you to enable `pane` with `agent mcp enable pane`. If tools are missing, add it in the agent's MCP settings: Claude Code `claude mcp add --scope user pane -- npx --yes runpane@latest mcp`; Codex (`~/.codex/config.toml`) table `[mcp_servers.pane]` with `command = \"npx\"` and `args = [\"--yes\", \"runpane@latest\", \"mcp\"]`; Cursor (`~/.cursor/mcp.json`) uses `mcpServers.pane` with the same `npx` command and args; any other stdio client uses them too."]; readonly notifyGuidance: { readonly rules: readonly ["Ask only what you can't find out yourself.", "Put related questions in one card.", "Send `info` rarely, only for what the person must know now.", "Keep titles short and choices to a few words."]; readonly cardRule: "The person is juggling many tasks and has lost the thread. In plain words, say what the work is for (the outcome, not the file), what just happened, and what you need. For a decision, give the options and what each one means. Pane already shows which Pane and agent sent it."; readonly results: "`waiting` means call `notify` again with `resume`; `unavailable` means ask in the terminal."; readonly examples: readonly [{ readonly name: "Needs a decision"; readonly ui: "approve"; readonly bad: readonly [{ readonly title: "Approve the migration?"; readonly context: "Ready to run 0042_add_index on prod. Proceed?"; }]; readonly good: { readonly title: "Speed up slow search: run the database change?"; readonly context: "Search in the app takes 4 s, and an index brings it under 100 ms. It changes the live database and can't easily be undone. Approve runs it now; Deny keeps it ready for later."; }; }, { readonly name: "Blocked"; readonly ui: "options"; readonly bad: readonly [{ readonly title: "Blocked"; readonly context: "CI failing on macos-intel, hdiutil resource busy."; }]; readonly good: { readonly title: "The 2.5 release is stuck on a GitHub hiccup"; readonly context: "The fixes you asked for pass everywhere except one Mac build machine, which errored. That's GitHub's machine, not our code."; readonly choices: readonly ["Rerun it (about 15 min)", "Ship without the Intel Mac build"]; }; }, { readonly name: "Just so you know"; readonly ui: "info"; readonly bad: readonly [{ readonly title: "Done"; readonly context: "Completed refactor of src/notify/queue.ts (head 06d310a)."; }, { readonly title: "PR #812 is ready"; readonly context: "Tests pass."; }]; readonly good: { readonly title: "Questions from agents now wait until you answer"; readonly context: "The fix you asked for this morning is done and tested. Next is your review: one click to merge."; }; }, { readonly name: "A question for ask"; readonly ui: "ask"; readonly bad: readonly [{ readonly title: "Which option?"; readonly context: "1, 2 or 3?"; }]; readonly good: { readonly title: "What should the release headline say?"; readonly context: "You're writing the 2.5 release notes, and the headline is the first line people read. A few words is enough."; }; }]; }; }; }; export type RunpaneCommand = typeof RUNPANE_CONTRACT.commands[number]['name']; export type InstallTarget = typeof RUNPANE_CONTRACT.enums.installTargets[number]; export type ArtifactFormat = typeof RUNPANE_CONTRACT.enums.artifactFormats[number]; export type RunpaneChannel = typeof RUNPANE_CONTRACT.enums.channels[number]; export type RunpaneAgent = typeof RUNPANE_CONTRACT.enums.agents[number]; //# sourceMappingURL=contract.d.ts.map