runpane 2.4.185 → 2.4.187

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,7 +25,7 @@ export declare const RUNPANE_CONTRACT: {
25
25
  readonly watch: {
26
26
  readonly follow: {
27
27
  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.";
28
- 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.review", "pr.comment", "pr.stopped", "github.unavailable", "github.recovered"];
28
+ 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"];
29
29
  readonly readySettle: "3m";
30
30
  readonly blockedSettle: "30s";
31
31
  readonly minInterval: "10m";
@@ -229,8 +229,8 @@ export declare const RUNPANE_CONTRACT: {
229
229
  readonly localControl: true;
230
230
  }, {
231
231
  readonly name: "handoff";
232
- readonly summary: "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. From a Session's terminal, create the Session on another machine instead.";
233
- readonly usage: readonly ["runpane handoff --template", "runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]"];
232
+ 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.";
233
+ readonly usage: readonly ["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]"];
234
234
  readonly mutates: true;
235
235
  readonly wrappers: readonly ["npm"];
236
236
  readonly localControl: true;
@@ -244,11 +244,11 @@ export declare const RUNPANE_CONTRACT: {
244
244
  }, {
245
245
  readonly name: "panes create";
246
246
  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>`.";
247
- readonly usage: readonly ["runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]", "runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]", "runpane panes create --from-json <path|-> [--yes] [--json] [--pane-dir <path>]"];
247
+ readonly usage: readonly ["runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] [options] [--pane-dir <path>]", "runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] [options] [--pane-dir <path>]", "runpane panes create --from-json <path|-> [--yes] [--json] [--pane-dir <path>]"];
248
248
  readonly mutates: true;
249
249
  readonly additive: true;
250
250
  readonly toolsets: readonly ["panes"];
251
- readonly jsonSchemas: readonly ["paneCreateRequest", "paneCreateResult"];
251
+ readonly jsonSchemas: readonly ["paneCreateRequest", "paneCreateResult", "dispatchWaitResult"];
252
252
  readonly localControl: true;
253
253
  }, {
254
254
  readonly name: "panes adopt";
@@ -307,11 +307,11 @@ export declare const RUNPANE_CONTRACT: {
307
307
  }, {
308
308
  readonly name: "panels create";
309
309
  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.";
310
- readonly usage: readonly ["runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]", "runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]"];
310
+ readonly usage: readonly ["runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]", "runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]"];
311
311
  readonly mutates: true;
312
312
  readonly additive: true;
313
313
  readonly toolsets: readonly ["core", "panels"];
314
- readonly jsonSchemas: readonly ["panelCreateRequest", "panelCreateResult"];
314
+ readonly jsonSchemas: readonly ["panelCreateRequest", "panelCreateResult", "dispatchWaitResult"];
315
315
  readonly localControl: true;
316
316
  }, {
317
317
  readonly name: "panels open";
@@ -352,10 +352,10 @@ export declare const RUNPANE_CONTRACT: {
352
352
  }, {
353
353
  readonly name: "panels submit";
354
354
  readonly summary: "Send and submit text to a terminal panel, including idle agent composers.";
355
- readonly usage: readonly ["runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] [--source user|agent] --yes [--json] [--pane-dir <path>]"];
355
+ 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>]"];
356
356
  readonly mutates: true;
357
357
  readonly toolsets: readonly ["panels"];
358
- readonly jsonSchemas: readonly ["panelSubmitRequest", "panelSubmitResult"];
358
+ readonly jsonSchemas: readonly ["panelSubmitRequest", "panelSubmitResult", "dispatchWaitResult"];
359
359
  readonly localControl: true;
360
360
  }, {
361
361
  readonly name: "panels submit-composer";
@@ -667,6 +667,20 @@ export declare const RUNPANE_CONTRACT: {
667
667
  readonly toolsets: readonly ["agents"];
668
668
  readonly jsonSchemas: readonly ["reportResult"];
669
669
  readonly localControl: true;
670
+ }, {
671
+ readonly name: "inbox";
672
+ readonly summary: "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.";
673
+ readonly usage: readonly ["runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]"];
674
+ readonly jsonSchemas: readonly ["inboxListResult"];
675
+ readonly localControl: true;
676
+ }, {
677
+ readonly name: "inbox ack";
678
+ readonly summary: "Clear Session inbox items once they are handled.";
679
+ 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>]"];
680
+ readonly mutates: true;
681
+ readonly idempotent: true;
682
+ readonly jsonSchemas: readonly ["inboxAckResult"];
683
+ readonly localControl: true;
670
684
  }, {
671
685
  readonly name: "sessions list";
672
686
  readonly summary: "List durable named orchestration Sessions.";
@@ -939,6 +953,10 @@ export declare const RUNPANE_CONTRACT: {
939
953
  readonly value: "<path|->";
940
954
  readonly aliases: readonly ["--prompt-file"];
941
955
  readonly description: "Read initial input from a file or stdin. --prompt-file is an alias.";
956
+ }, {
957
+ readonly name: "--attach";
958
+ readonly value: "<file>";
959
+ readonly description: "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable.";
942
960
  }, {
943
961
  readonly name: "--from-json";
944
962
  readonly value: "<path|->";
@@ -1050,7 +1068,11 @@ export declare const RUNPANE_CONTRACT: {
1050
1068
  }, {
1051
1069
  readonly name: "--wait";
1052
1070
  readonly value: "<milliseconds>";
1053
- readonly description: "How long lock acquire waits for a held lock to come free; 0 (the default) returns at once.";
1071
+ 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.";
1072
+ }, {
1073
+ readonly name: "--timeout";
1074
+ readonly value: "<duration>";
1075
+ readonly description: "With --wait: give up after this long (30m, 2h; 0 waits without limit) and exit 124.";
1054
1076
  }, {
1055
1077
  readonly name: "--note";
1056
1078
  readonly value: "<text>";
@@ -1165,7 +1187,7 @@ export declare const RUNPANE_CONTRACT: {
1165
1187
  readonly description: "Run an adopted pane's agent resume command immediately instead of staging it.";
1166
1188
  }, {
1167
1189
  readonly name: "--as-file-pointer";
1168
- readonly description: "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead.";
1190
+ 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.";
1169
1191
  }, {
1170
1192
  readonly name: "--follow";
1171
1193
  readonly description: "Continue waiting for workspace events until interrupted.";
@@ -1202,14 +1224,26 @@ export declare const RUNPANE_CONTRACT: {
1202
1224
  }, {
1203
1225
  readonly name: "--push";
1204
1226
  readonly description: "Before a handoff, commit uncommitted work as WIP and push the branch (never forces).";
1227
+ }, {
1228
+ readonly name: "--note-only";
1229
+ readonly description: "Hand off to a fresh agent with the note, instead of carrying and resuming your own session.";
1205
1230
  }, {
1206
1231
  readonly name: "--interrupt";
1207
1232
  readonly description: "Stop the current agent turn, wait for an empty idle composer, then submit and verify the replacement.";
1233
+ }, {
1234
+ readonly name: "--expect-report";
1235
+ 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.";
1236
+ }, {
1237
+ readonly name: "--no-expect-report";
1238
+ readonly description: "Send work without waiting for a `runpane report` (fire-and-forget input); no agent.report.missing follows.";
1239
+ }, {
1240
+ readonly name: "--all";
1241
+ readonly description: "inbox ack only: clear every item of the --session.";
1208
1242
  }];
1209
1243
  };
1210
1244
  readonly help: {
1211
1245
  readonly npm: {
1212
- 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 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 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."];
1246
+ 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 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 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."];
1213
1247
  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>"];
1214
1248
  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"];
1215
1249
  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."];
@@ -1223,8 +1257,8 @@ export declare const RUNPANE_CONTRACT: {
1223
1257
  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"];
1224
1258
  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'"];
1225
1259
  readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."];
1226
- 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", " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m", " (REPORT, BLOCKED, conflicts, 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.", "", "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."];
1227
- 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", " --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."];
1260
+ 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."];
1261
+ 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."];
1228
1262
  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."];
1229
1263
  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"];
1230
1264
  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"];
@@ -1239,9 +1273,9 @@ export declare const RUNPANE_CONTRACT: {
1239
1273
  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"];
1240
1274
  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"];
1241
1275
  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"];
1242
- readonly "panels submit": readonly ["Usage:", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --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.", "", "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>`", " --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"];
1276
+ 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"];
1243
1277
  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"];
1244
- 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] --yes [--json]", " 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.", " --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."];
1278
+ 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."];
1245
1279
  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."];
1246
1280
  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."];
1247
1281
  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."];
@@ -1289,15 +1323,17 @@ export declare const RUNPANE_CONTRACT: {
1289
1323
  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."];
1290
1324
  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."];
1291
1325
  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."];
1292
- readonly handoff: readonly ["Usage:", " runpane handoff --template", " runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]", "", "Hand your task to a fresh 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 Session's terminal it skips git and creates the Session on the other machine, with the note as", "its next action; the new Session waits for your first message. 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).", " --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"];
1326
+ 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"];
1293
1327
  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."];
1294
1328
  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."];
1295
1329
  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."];
1296
1330
  readonly "pr unwatch": readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]", "", "Remove a Pane’s explicit PR registration."];
1297
1331
  readonly "pr list": readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]", "", "List PR registrations and stopped watches."];
1332
+ 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>...`."];
1333
+ 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"];
1298
1334
  };
1299
1335
  readonly pip: {
1300
- 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 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>]", " 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."];
1336
+ 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 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>]", " 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."];
1301
1337
  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>"];
1302
1338
  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"];
1303
1339
  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."];
@@ -1311,8 +1347,8 @@ export declare const RUNPANE_CONTRACT: {
1311
1347
  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"];
1312
1348
  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"];
1313
1349
  readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."];
1314
- 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", " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m", " (REPORT, BLOCKED, conflicts, 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.", "", "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."];
1315
- 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", " --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."];
1350
+ 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."];
1351
+ 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."];
1316
1352
  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."];
1317
1353
  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"];
1318
1354
  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"];
@@ -1327,9 +1363,9 @@ export declare const RUNPANE_CONTRACT: {
1327
1363
  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"];
1328
1364
  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"];
1329
1365
  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"];
1330
- readonly "panels submit": readonly ["Usage:", " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --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.", "", "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>`", " --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"];
1366
+ 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"];
1331
1367
  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"];
1332
- 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.", " --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."];
1368
+ 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."];
1333
1369
  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."];
1334
1370
  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."];
1335
1371
  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."];
@@ -1377,12 +1413,14 @@ export declare const RUNPANE_CONTRACT: {
1377
1413
  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"];
1378
1414
  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"];
1379
1415
  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"];
1380
- readonly handoff: readonly ["Usage:", " runpane handoff --template", " runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--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"];
1416
+ 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"];
1381
1417
  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."];
1382
1418
  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."];
1383
1419
  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."];
1384
1420
  readonly "pr unwatch": readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]", "", "Remove a Pane’s explicit PR registration."];
1385
1421
  readonly "pr list": readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]", "", "List PR registrations and stopped watches."];
1422
+ 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>...`."];
1423
+ 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"];
1386
1424
  };
1387
1425
  };
1388
1426
  readonly docs: {
@@ -1392,7 +1430,7 @@ export declare const RUNPANE_CONTRACT: {
1392
1430
  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\""];
1393
1431
  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."];
1394
1432
  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 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>]"];
1395
- 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, the Linux wrapper may look for a missing `/tmp/pane-daemon.../daemon.sock` or resolve to a Windows shim such as Volta. In that case 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.", "`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.", "`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 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` (`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 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 a fresh 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. From a Session's terminal it skips git and creates a Session with the same name, goal and agent on the other machine instead. 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."];
1433
+ 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, the Linux wrapper may look for a missing `/tmp/pane-daemon.../daemon.sock` or resolve to a Windows shim such as Volta. In that case 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.", "`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 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.", "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."];
1396
1434
  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.";
1397
1435
  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 Node 22 or newer, for example `node packages/runpane/dist/cli.js doctor --json`. From WSL, if the user runs Windows Pane, call the Windows wrapper through `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane ...'` so the command can reach the Windows named-pipe daemon and avoid UNC cwd issues.";
1398
1436
  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.";
@@ -1400,7 +1438,7 @@ export declare const RUNPANE_CONTRACT: {
1400
1438
  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."];
1401
1439
  };
1402
1440
  readonly testFixtures: {
1403
- 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"]];
1441
+ 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"]];
1404
1442
  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:"];
1405
1443
  readonly npmHelpIncludes: readonly ["pnpm dlx runpane@latest", "npx --yes runpane@latest"];
1406
1444
  readonly pipHelpIncludes: readonly ["pipx run runpane", "python -m pip install runpane && python -m runpane setup"];
@@ -2009,6 +2047,12 @@ export declare const RUNPANE_CONTRACT: {
2009
2047
  readonly initialInputAsFilePointer: {
2010
2048
  readonly type: "boolean";
2011
2049
  };
2050
+ readonly initialInputAttachments: {
2051
+ readonly type: "array";
2052
+ readonly items: {
2053
+ readonly type: "string";
2054
+ };
2055
+ };
2012
2056
  };
2013
2057
  readonly additionalProperties: false;
2014
2058
  }, {
@@ -2030,6 +2074,12 @@ export declare const RUNPANE_CONTRACT: {
2030
2074
  readonly initialInputAsFilePointer: {
2031
2075
  readonly type: "boolean";
2032
2076
  };
2077
+ readonly initialInputAttachments: {
2078
+ readonly type: "array";
2079
+ readonly items: {
2080
+ readonly type: "string";
2081
+ };
2082
+ };
2033
2083
  };
2034
2084
  readonly additionalProperties: false;
2035
2085
  }];
@@ -2066,6 +2116,10 @@ export declare const RUNPANE_CONTRACT: {
2066
2116
  readonly type: "string";
2067
2117
  readonly description: "Session id to associate each created Pane with; the CLI sets it from PANE_ORCHESTRATION_SESSION_ID unless --no-associate.";
2068
2118
  };
2119
+ readonly expectReport: {
2120
+ readonly type: "boolean";
2121
+ 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).";
2122
+ };
2069
2123
  };
2070
2124
  readonly additionalProperties: false;
2071
2125
  };
@@ -2315,6 +2369,12 @@ export declare const RUNPANE_CONTRACT: {
2315
2369
  readonly promptFile: {
2316
2370
  readonly type: "string";
2317
2371
  };
2372
+ readonly attachments: {
2373
+ readonly type: "array";
2374
+ readonly items: {
2375
+ readonly type: "string";
2376
+ };
2377
+ };
2318
2378
  readonly warnings: {
2319
2379
  readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/warnings";
2320
2380
  };
@@ -2393,6 +2453,10 @@ export declare const RUNPANE_CONTRACT: {
2393
2453
  }];
2394
2454
  };
2395
2455
  };
2456
+ readonly epoch: {
2457
+ readonly type: "string";
2458
+ readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting.";
2459
+ };
2396
2460
  };
2397
2461
  readonly additionalProperties: false;
2398
2462
  };
@@ -2730,7 +2794,7 @@ export declare const RUNPANE_CONTRACT: {
2730
2794
  readonly type: "string";
2731
2795
  };
2732
2796
  readonly kind: {
2733
- readonly enum: readonly ["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", "pr.closed", "pr.head", "pr.review", "pr.comment", "pr.stopped", "github.unavailable", "github.recovered"];
2797
+ 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"];
2734
2798
  };
2735
2799
  readonly paneId: {
2736
2800
  readonly type: "string";
@@ -2825,6 +2889,20 @@ export declare const RUNPANE_CONTRACT: {
2825
2889
  };
2826
2890
  readonly additionalProperties: false;
2827
2891
  };
2892
+ readonly base: {
2893
+ readonly type: "object";
2894
+ 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.";
2895
+ readonly required: readonly ["from", "to"];
2896
+ readonly properties: {
2897
+ readonly from: {
2898
+ readonly type: "string";
2899
+ };
2900
+ readonly to: {
2901
+ readonly type: "string";
2902
+ };
2903
+ };
2904
+ readonly additionalProperties: false;
2905
+ };
2828
2906
  readonly checks: {
2829
2907
  readonly enum: readonly ["passed", "failed"];
2830
2908
  readonly description: "Failures are immediate; success requires complete nonempty required checks on the pinned head.";
@@ -2844,6 +2922,25 @@ export declare const RUNPANE_CONTRACT: {
2844
2922
  readonly type: "string";
2845
2923
  readonly description: "Added to watch --json NDJSON events. Persist with gen after processing for numeric rearm.";
2846
2924
  };
2925
+ readonly lastOutput: {
2926
+ readonly type: "string";
2927
+ readonly description: "What an agent.report.missing entry's agent said last, up to 2,000 characters (the end is kept).";
2928
+ };
2929
+ readonly lastOutputSource: {
2930
+ readonly enum: readonly ["transcript", "screen"];
2931
+ readonly description: "transcript: the agent's last reply; screen: the last lines on its screen.";
2932
+ };
2933
+ readonly expectedSince: {
2934
+ readonly type: "string";
2935
+ readonly description: "When the work an agent.report.missing entry is about was sent.";
2936
+ };
2937
+ readonly screenLines: {
2938
+ readonly type: "array";
2939
+ readonly items: {
2940
+ readonly type: "string";
2941
+ };
2942
+ readonly description: "The screen lines of the prompt an agent.blocked entry's agent waits on (at most 20).";
2943
+ };
2847
2944
  };
2848
2945
  readonly additionalProperties: false;
2849
2946
  };
@@ -2879,6 +2976,42 @@ export declare const RUNPANE_CONTRACT: {
2879
2976
  };
2880
2977
  readonly additionalProperties: false;
2881
2978
  };
2979
+ readonly panelReport: {
2980
+ readonly type: "object";
2981
+ 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.";
2982
+ readonly required: readonly ["state", "reportedAt"];
2983
+ readonly properties: {
2984
+ readonly state: {
2985
+ readonly enum: readonly ["ready", "blocked", "failed", "done"];
2986
+ };
2987
+ readonly pr: {
2988
+ readonly type: "number";
2989
+ };
2990
+ readonly head: {
2991
+ readonly type: "string";
2992
+ };
2993
+ readonly summary: {
2994
+ readonly type: "string";
2995
+ };
2996
+ readonly summaryTruncated: {
2997
+ readonly const: true;
2998
+ };
2999
+ readonly summaryPath: {
3000
+ readonly type: "string";
3001
+ };
3002
+ readonly question: {
3003
+ readonly type: "string";
3004
+ };
3005
+ readonly reportedAt: {
3006
+ readonly type: "string";
3007
+ };
3008
+ readonly data: {
3009
+ readonly type: "object";
3010
+ readonly description: "The worker's JSON object summary, returned as given. Pane never reads, renames or validates its fields.";
3011
+ };
3012
+ };
3013
+ readonly additionalProperties: false;
3014
+ };
2882
3015
  readonly workspaceWaitRequest: {
2883
3016
  readonly type: "object";
2884
3017
  readonly properties: {
@@ -3798,6 +3931,12 @@ export declare const RUNPANE_CONTRACT: {
3798
3931
  readonly asFilePointer: {
3799
3932
  readonly type: "boolean";
3800
3933
  };
3934
+ readonly attachments: {
3935
+ readonly type: "array";
3936
+ readonly items: {
3937
+ readonly type: "string";
3938
+ };
3939
+ };
3801
3940
  readonly source: {
3802
3941
  readonly type: "string";
3803
3942
  readonly enum: readonly ["user", "agent"];
@@ -3805,6 +3944,10 @@ export declare const RUNPANE_CONTRACT: {
3805
3944
  readonly interrupt: {
3806
3945
  readonly type: "boolean";
3807
3946
  };
3947
+ readonly expectReport: {
3948
+ readonly type: "boolean";
3949
+ 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).";
3950
+ };
3808
3951
  };
3809
3952
  readonly additionalProperties: false;
3810
3953
  };
@@ -3862,6 +4005,12 @@ export declare const RUNPANE_CONTRACT: {
3862
4005
  readonly promptFile: {
3863
4006
  readonly type: "string";
3864
4007
  };
4008
+ readonly attachments: {
4009
+ readonly type: "array";
4010
+ readonly items: {
4011
+ readonly type: "string";
4012
+ };
4013
+ };
3865
4014
  readonly warnings: {
3866
4015
  readonly type: "array";
3867
4016
  readonly items: {
@@ -3884,6 +4033,21 @@ export declare const RUNPANE_CONTRACT: {
3884
4033
  readonly verification: {
3885
4034
  readonly enum: readonly ["observed", "unverifiable"];
3886
4035
  };
4036
+ readonly expectedReport: {
4037
+ readonly type: "object";
4038
+ readonly required: readonly ["since"];
4039
+ readonly properties: {
4040
+ readonly since: {
4041
+ readonly type: "string";
4042
+ };
4043
+ };
4044
+ readonly additionalProperties: false;
4045
+ readonly description: "The report Pane now waits for: set for work an agent sent, or with --expect-report.";
4046
+ };
4047
+ readonly epoch: {
4048
+ readonly type: "string";
4049
+ readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting.";
4050
+ };
3887
4051
  };
3888
4052
  readonly additionalProperties: false;
3889
4053
  };
@@ -4474,6 +4638,10 @@ export declare const RUNPANE_CONTRACT: {
4474
4638
  readonly readyTimeoutMs: {
4475
4639
  readonly type: "number";
4476
4640
  };
4641
+ readonly expectReport: {
4642
+ readonly type: "boolean";
4643
+ 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).";
4644
+ };
4477
4645
  };
4478
4646
  readonly additionalProperties: false;
4479
4647
  };
@@ -4607,12 +4775,33 @@ export declare const RUNPANE_CONTRACT: {
4607
4775
  readonly promptFile: {
4608
4776
  readonly type: "string";
4609
4777
  };
4778
+ readonly attachments: {
4779
+ readonly type: "array";
4780
+ readonly items: {
4781
+ readonly type: "string";
4782
+ };
4783
+ };
4610
4784
  readonly warnings: {
4611
4785
  readonly $ref: "#/jsonSchemas/panelSubmitResult/properties/warnings";
4612
4786
  };
4613
4787
  readonly nextCommand: {
4614
4788
  readonly type: "string";
4615
4789
  };
4790
+ readonly expectedReport: {
4791
+ readonly type: "object";
4792
+ readonly required: readonly ["since"];
4793
+ readonly properties: {
4794
+ readonly since: {
4795
+ readonly type: "string";
4796
+ };
4797
+ };
4798
+ readonly additionalProperties: false;
4799
+ readonly description: "The report Pane now waits for: set for work an agent sent, or with --expect-report.";
4800
+ };
4801
+ readonly epoch: {
4802
+ readonly type: "string";
4803
+ readonly description: "Epoch of the journal position captured before dispatch; pass it with generation when waiting.";
4804
+ };
4616
4805
  };
4617
4806
  readonly additionalProperties: false;
4618
4807
  };
@@ -4809,6 +4998,22 @@ export declare const RUNPANE_CONTRACT: {
4809
4998
  };
4810
4999
  readonly panes: {
4811
5000
  readonly type: "array";
5001
+ readonly items: {
5002
+ readonly type: "object";
5003
+ readonly properties: {
5004
+ readonly panels: {
5005
+ readonly type: "array";
5006
+ readonly items: {
5007
+ readonly type: "object";
5008
+ readonly properties: {
5009
+ readonly report: {
5010
+ readonly $ref: "#/jsonSchemas/panelReport";
5011
+ };
5012
+ };
5013
+ };
5014
+ };
5015
+ };
5016
+ };
4812
5017
  };
4813
5018
  readonly activity: {
4814
5019
  readonly type: "array";
@@ -5428,6 +5633,187 @@ export declare const RUNPANE_CONTRACT: {
5428
5633
  };
5429
5634
  readonly additionalProperties: false;
5430
5635
  };
5636
+ readonly inboxListResult: {
5637
+ readonly type: "object";
5638
+ readonly required: readonly ["ok", "session", "items"];
5639
+ readonly properties: {
5640
+ readonly ok: {
5641
+ readonly const: true;
5642
+ };
5643
+ readonly session: {
5644
+ readonly type: "object";
5645
+ readonly required: readonly ["id", "name"];
5646
+ readonly properties: {
5647
+ readonly id: {
5648
+ readonly type: "string";
5649
+ };
5650
+ readonly name: {
5651
+ readonly type: "string";
5652
+ };
5653
+ };
5654
+ readonly additionalProperties: false;
5655
+ };
5656
+ readonly items: {
5657
+ readonly type: "array";
5658
+ readonly items: {
5659
+ readonly type: "object";
5660
+ readonly required: readonly ["id", "sessionId", "kind", "at", "paneId", "paneName", "panelId"];
5661
+ readonly properties: {
5662
+ readonly id: {
5663
+ readonly type: "string";
5664
+ };
5665
+ readonly sessionId: {
5666
+ readonly type: "string";
5667
+ };
5668
+ readonly kind: {
5669
+ readonly enum: readonly ["report", "report.missing", "blocked"];
5670
+ };
5671
+ readonly at: {
5672
+ readonly type: "string";
5673
+ };
5674
+ readonly paneId: {
5675
+ readonly type: "string";
5676
+ };
5677
+ readonly paneName: {
5678
+ readonly type: "string";
5679
+ };
5680
+ readonly panelId: {
5681
+ readonly type: "string";
5682
+ };
5683
+ readonly panelTitle: {
5684
+ readonly type: "string";
5685
+ };
5686
+ readonly agentType: {
5687
+ readonly type: "string";
5688
+ };
5689
+ readonly report: {
5690
+ readonly $ref: "#/jsonSchemas/agentReport";
5691
+ };
5692
+ readonly lastOutput: {
5693
+ readonly type: "string";
5694
+ };
5695
+ readonly lastOutputSource: {
5696
+ readonly enum: readonly ["transcript", "screen"];
5697
+ };
5698
+ readonly reason: {
5699
+ readonly type: "string";
5700
+ };
5701
+ readonly screenLines: {
5702
+ readonly type: "array";
5703
+ readonly items: {
5704
+ readonly type: "string";
5705
+ };
5706
+ };
5707
+ };
5708
+ readonly additionalProperties: false;
5709
+ };
5710
+ };
5711
+ };
5712
+ readonly additionalProperties: false;
5713
+ };
5714
+ readonly inboxAckResult: {
5715
+ readonly type: "object";
5716
+ readonly required: readonly ["ok", "acknowledged", "unknown"];
5717
+ readonly properties: {
5718
+ readonly ok: {
5719
+ readonly const: true;
5720
+ };
5721
+ readonly acknowledged: {
5722
+ readonly type: "array";
5723
+ readonly items: {
5724
+ readonly type: "string";
5725
+ };
5726
+ };
5727
+ readonly unknown: {
5728
+ readonly type: "array";
5729
+ readonly items: {
5730
+ readonly type: "string";
5731
+ };
5732
+ };
5733
+ };
5734
+ readonly additionalProperties: false;
5735
+ };
5736
+ readonly dispatchWaitResult: {
5737
+ readonly type: "object";
5738
+ 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.";
5739
+ readonly required: readonly ["ok", "outcome"];
5740
+ readonly properties: {
5741
+ readonly ok: {
5742
+ readonly type: "boolean";
5743
+ readonly description: "true only for outcome report.";
5744
+ };
5745
+ readonly outcome: {
5746
+ readonly enum: readonly ["report", "missing", "blocked", "exited", "gone", "timeout", "indeterminate"];
5747
+ };
5748
+ readonly paneId: {
5749
+ readonly type: "string";
5750
+ };
5751
+ readonly paneName: {
5752
+ readonly type: "string";
5753
+ };
5754
+ readonly panelId: {
5755
+ readonly type: "string";
5756
+ };
5757
+ readonly generation: {
5758
+ readonly type: "number";
5759
+ readonly description: "The journal entry that ended the wait (on timeout, the position reached).";
5760
+ };
5761
+ readonly at: {
5762
+ readonly type: "string";
5763
+ };
5764
+ readonly report: {
5765
+ readonly type: "object";
5766
+ readonly required: readonly ["state"];
5767
+ readonly properties: {
5768
+ readonly state: {
5769
+ readonly enum: readonly ["ready", "blocked", "failed", "done"];
5770
+ };
5771
+ readonly pr: {
5772
+ readonly type: "number";
5773
+ };
5774
+ readonly head: {
5775
+ readonly type: "string";
5776
+ };
5777
+ readonly summary: {
5778
+ readonly type: "string";
5779
+ };
5780
+ readonly summaryTruncated: {
5781
+ readonly const: true;
5782
+ };
5783
+ readonly summaryPath: {
5784
+ readonly type: "string";
5785
+ };
5786
+ readonly question: {
5787
+ readonly type: "string";
5788
+ };
5789
+ };
5790
+ readonly additionalProperties: false;
5791
+ };
5792
+ readonly screenLines: {
5793
+ readonly type: "array";
5794
+ readonly items: {
5795
+ readonly type: "string";
5796
+ };
5797
+ };
5798
+ readonly lastOutput: {
5799
+ readonly type: "string";
5800
+ };
5801
+ readonly lastOutputSource: {
5802
+ readonly enum: readonly ["transcript", "screen"];
5803
+ };
5804
+ readonly reason: {
5805
+ readonly type: "string";
5806
+ };
5807
+ readonly exitCode: {
5808
+ readonly type: "number";
5809
+ };
5810
+ readonly nextCommand: {
5811
+ readonly type: "string";
5812
+ readonly description: "Recovery command when the outcome is indeterminate.";
5813
+ };
5814
+ };
5815
+ readonly additionalProperties: false;
5816
+ };
5431
5817
  };
5432
5818
  readonly agentContext: {
5433
5819
  readonly brief: {
@@ -5941,7 +6327,12 @@ export declare const RUNPANE_CONTRACT: {
5941
6327
  }, {
5942
6328
  readonly name: "--as-file-pointer";
5943
6329
  readonly required: false;
5944
- readonly description: "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead.";
6330
+ 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.";
6331
+ }, {
6332
+ readonly name: "--attach";
6333
+ readonly required: false;
6334
+ readonly value: "<file>";
6335
+ 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`.";
5945
6336
  }, {
5946
6337
  readonly name: "--from-json";
5947
6338
  readonly value: "<path|->";
@@ -6003,10 +6394,27 @@ export declare const RUNPANE_CONTRACT: {
6003
6394
  readonly value: "<path>";
6004
6395
  readonly required: false;
6005
6396
  readonly description: "Connect to a specific Pane data directory.";
6397
+ }, {
6398
+ readonly name: "--expect-report";
6399
+ readonly required: false;
6400
+ 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.";
6401
+ }, {
6402
+ readonly name: "--no-expect-report";
6403
+ readonly required: false;
6404
+ readonly description: "Fire-and-forget input: don't wait for a report.";
6405
+ }, {
6406
+ readonly name: "--wait";
6407
+ readonly required: false;
6408
+ 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.";
6409
+ }, {
6410
+ readonly name: "--timeout";
6411
+ readonly value: "<duration>";
6412
+ readonly required: false;
6413
+ readonly description: "With --wait: give up after this long and exit 124 (outcome timeout).";
6006
6414
  }];
6007
6415
  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"];
6008
6416
  readonly jsonSchemas: readonly ["paneCreateRequest", "paneCreateResult"];
6009
- 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 `<pane-dir>/prompts/<pane-id>/<timestamp>.md` (readable only by you) and sends the one line `Read and follow <path>`; the result includes `promptFile`. Prefer it for long prompts.", "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, invoke through PowerShell and select the saved WSL repo by name or id, for example `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; 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`."];
6417
+ 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, invoke through PowerShell and select the saved WSL repo by name or id, for example `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; 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`."];
6010
6418
  };
6011
6419
  readonly "panes adopt": {
6012
6420
  readonly name: "panes adopt";
@@ -6483,7 +6891,12 @@ export declare const RUNPANE_CONTRACT: {
6483
6891
  }, {
6484
6892
  readonly name: "--as-file-pointer";
6485
6893
  readonly required: false;
6486
- readonly description: "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead.";
6894
+ 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.";
6895
+ }, {
6896
+ readonly name: "--attach";
6897
+ readonly required: false;
6898
+ readonly value: "<file>";
6899
+ 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`.";
6487
6900
  }, {
6488
6901
  readonly name: "--interrupt";
6489
6902
  readonly required: false;
@@ -6501,10 +6914,27 @@ export declare const RUNPANE_CONTRACT: {
6501
6914
  readonly value: "<path>";
6502
6915
  readonly required: false;
6503
6916
  readonly description: "Connect to a specific Pane data directory.";
6917
+ }, {
6918
+ readonly name: "--expect-report";
6919
+ readonly required: false;
6920
+ 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.";
6921
+ }, {
6922
+ readonly name: "--no-expect-report";
6923
+ readonly required: false;
6924
+ readonly description: "Fire-and-forget input: don't wait for a report.";
6925
+ }, {
6926
+ readonly name: "--wait";
6927
+ readonly required: false;
6928
+ 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.";
6929
+ }, {
6930
+ readonly name: "--timeout";
6931
+ readonly value: "<duration>";
6932
+ readonly required: false;
6933
+ readonly description: "With --wait: give up after this long and exit 124 (outcome timeout).";
6504
6934
  }];
6505
- readonly examples: readonly ["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"];
6935
+ 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"];
6506
6936
  readonly jsonSchemas: readonly ["panelSubmitRequest", "panelSubmitResult"];
6507
- 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 `<pane-dir>/prompts/<pane-id>/<timestamp>.md` (readable only by you) and sends the one line `Read and follow <path>`; the result includes `promptFile`. Prefer it for long prompts.", "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."];
6937
+ 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."];
6508
6938
  };
6509
6939
  readonly "panels resume": {
6510
6940
  readonly name: "panels resume";
@@ -6672,7 +7102,12 @@ export declare const RUNPANE_CONTRACT: {
6672
7102
  }, {
6673
7103
  readonly name: "--as-file-pointer";
6674
7104
  readonly required: false;
6675
- readonly description: "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead.";
7105
+ 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.";
7106
+ }, {
7107
+ readonly name: "--attach";
7108
+ readonly required: false;
7109
+ readonly value: "<file>";
7110
+ 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`.";
6676
7111
  }, {
6677
7112
  readonly name: "--source";
6678
7113
  readonly value: "<user|agent>";
@@ -6708,6 +7143,23 @@ export declare const RUNPANE_CONTRACT: {
6708
7143
  readonly value: "<path>";
6709
7144
  readonly required: false;
6710
7145
  readonly description: "Connect to a specific Pane data directory.";
7146
+ }, {
7147
+ readonly name: "--expect-report";
7148
+ readonly required: false;
7149
+ 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.";
7150
+ }, {
7151
+ readonly name: "--no-expect-report";
7152
+ readonly required: false;
7153
+ readonly description: "Fire-and-forget input: don't wait for a report.";
7154
+ }, {
7155
+ readonly name: "--wait";
7156
+ readonly required: false;
7157
+ 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.";
7158
+ }, {
7159
+ readonly name: "--timeout";
7160
+ readonly value: "<duration>";
7161
+ readonly required: false;
7162
+ readonly description: "With --wait: give up after this long and exit 124 (outcome timeout).";
6711
7163
  }];
6712
7164
  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"];
6713
7165
  readonly jsonSchemas: readonly ["panelCreateRequest", "panelCreateResult"];
@@ -6916,7 +7368,7 @@ export declare const RUNPANE_CONTRACT: {
6916
7368
  readonly name: "--min-interval";
6917
7369
  readonly value: "<duration>";
6918
7370
  readonly required: false;
6919
- readonly description: "Override: batch READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines at most once per interval; REPORT, BLOCKED, pr.conflicted, and failed pr.checks arrive at once and carry the held lines. Default 10m. 0 turns batching off.";
7371
+ 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.";
6920
7372
  }, {
6921
7373
  readonly name: "--idle-after";
6922
7374
  readonly value: "<duration>";
@@ -6966,7 +7418,7 @@ export declare const RUNPANE_CONTRACT: {
6966
7418
  readonly required: false;
6967
7419
  }];
6968
7420
  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"];
6969
- 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.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."];
7421
+ 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."];
6970
7422
  };
6971
7423
  readonly "panes git-status": {
6972
7424
  readonly name: "panes git-status";
@@ -7671,7 +8123,7 @@ export declare const RUNPANE_CONTRACT: {
7671
8123
  }, {
7672
8124
  readonly name: "--as-file-pointer";
7673
8125
  readonly required: false;
7674
- readonly description: "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead.";
8126
+ 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.";
7675
8127
  }, {
7676
8128
  readonly name: "--yes";
7677
8129
  readonly required: false;
@@ -7688,7 +8140,7 @@ export declare const RUNPANE_CONTRACT: {
7688
8140
  }];
7689
8141
  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"];
7690
8142
  readonly jsonSchemas: readonly ["agentSendResult"];
7691
- 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 `<pane-dir>/prompts/<pane-id>/<timestamp>.md` (readable only by you) and sends the one line `Read and follow <path>`; the result includes `promptFile`. Prefer it for long prompts."];
8143
+ 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."];
7692
8144
  };
7693
8145
  readonly report: {
7694
8146
  readonly name: "report";
@@ -7876,7 +8328,7 @@ export declare const RUNPANE_CONTRACT: {
7876
8328
  }];
7877
8329
  readonly examples: readonly ["runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]"];
7878
8330
  readonly jsonSchemas: readonly ["sessionOverviewResult"];
7879
- readonly notes: readonly ["The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`)."];
8331
+ 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`."];
7880
8332
  };
7881
8333
  readonly "lock acquire": {
7882
8334
  readonly name: "lock acquire";
@@ -8122,8 +8574,8 @@ export declare const RUNPANE_CONTRACT: {
8122
8574
  };
8123
8575
  readonly handoff: {
8124
8576
  readonly name: "handoff";
8125
- readonly summary: "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. From a Session's terminal, create the Session on another machine instead.";
8126
- 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. 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. 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.";
8577
+ 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.";
8578
+ 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.";
8127
8579
  readonly requiresPaneDaemon: true;
8128
8580
  readonly mutates: true;
8129
8581
  readonly arguments: readonly [{
@@ -8168,6 +8620,10 @@ export declare const RUNPANE_CONTRACT: {
8168
8620
  readonly name: "--push";
8169
8621
  readonly required: false;
8170
8622
  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.";
8623
+ }, {
8624
+ readonly name: "--note-only";
8625
+ readonly required: false;
8626
+ 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.";
8171
8627
  }, {
8172
8628
  readonly name: "--dry-run";
8173
8629
  readonly required: false;
@@ -8178,7 +8634,7 @@ export declare const RUNPANE_CONTRACT: {
8178
8634
  readonly description: "Print machine-readable output.";
8179
8635
  }];
8180
8636
  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"];
8181
- 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."];
8637
+ 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)."];
8182
8638
  };
8183
8639
  readonly "sessions unpin": {
8184
8640
  readonly name: "sessions unpin";
@@ -8263,7 +8719,7 @@ export declare const RUNPANE_CONTRACT: {
8263
8719
  }];
8264
8720
  readonly examples: readonly ["runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]"];
8265
8721
  readonly jsonSchemas: readonly ["prWatchResult"];
8266
- 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.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."];
8722
+ 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."];
8267
8723
  };
8268
8724
  readonly "pr unwatch": {
8269
8725
  readonly name: "pr unwatch";
@@ -8293,7 +8749,7 @@ export declare const RUNPANE_CONTRACT: {
8293
8749
  }];
8294
8750
  readonly examples: readonly ["runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]"];
8295
8751
  readonly jsonSchemas: readonly ["prWatchResult"];
8296
- 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.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."];
8752
+ 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."];
8297
8753
  };
8298
8754
  readonly "pr list": {
8299
8755
  readonly name: "pr list";
@@ -8318,7 +8774,65 @@ export declare const RUNPANE_CONTRACT: {
8318
8774
  }];
8319
8775
  readonly examples: readonly ["runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"];
8320
8776
  readonly jsonSchemas: readonly ["prWatchResult"];
8321
- 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.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."];
8777
+ 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."];
8778
+ };
8779
+ readonly inbox: {
8780
+ readonly name: "inbox";
8781
+ readonly summary: "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.";
8782
+ 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.";
8783
+ readonly requiresPaneDaemon: true;
8784
+ readonly mutates: false;
8785
+ readonly arguments: readonly [{
8786
+ readonly name: "--session";
8787
+ readonly value: "<id|name>";
8788
+ readonly required: false;
8789
+ readonly description: "Session; defaults to PANE_ORCHESTRATION_SESSION_ID.";
8790
+ }, {
8791
+ readonly name: "--json";
8792
+ readonly required: false;
8793
+ readonly description: "Print machine-readable output.";
8794
+ }, {
8795
+ readonly name: "--pane-dir";
8796
+ readonly value: "<path>";
8797
+ readonly required: false;
8798
+ readonly description: "Connect to a specific Pane data directory.";
8799
+ }];
8800
+ readonly examples: readonly ["runpane inbox --session \"$PANE_ORCHESTRATION_SESSION_ID\" --json"];
8801
+ readonly jsonSchemas: readonly ["inboxListResult"];
8802
+ 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."];
8803
+ };
8804
+ readonly "inbox ack": {
8805
+ readonly name: "inbox ack";
8806
+ readonly summary: "Clear Session inbox items once they are handled.";
8807
+ readonly details: "Acknowledge each item once you have acted on it, so the hook stops repeating it.";
8808
+ readonly requiresPaneDaemon: true;
8809
+ readonly mutates: true;
8810
+ readonly arguments: readonly [{
8811
+ readonly name: "<item-id>...";
8812
+ readonly required: false;
8813
+ readonly description: "Item ids from `runpane inbox`.";
8814
+ }, {
8815
+ readonly name: "--session";
8816
+ readonly value: "<id|name>";
8817
+ readonly required: false;
8818
+ readonly description: "Only clear items of this Session; required with --all.";
8819
+ }, {
8820
+ readonly name: "--all";
8821
+ readonly required: false;
8822
+ readonly description: "Clear every item of the Session.";
8823
+ }, {
8824
+ readonly name: "--json";
8825
+ readonly required: false;
8826
+ readonly description: "Print machine-readable output.";
8827
+ }, {
8828
+ readonly name: "--pane-dir";
8829
+ readonly value: "<path>";
8830
+ readonly required: false;
8831
+ readonly description: "Connect to a specific Pane data directory.";
8832
+ }];
8833
+ readonly examples: readonly ["runpane inbox ack in-1a2b3c4d --json"];
8834
+ readonly jsonSchemas: readonly ["inboxAckResult"];
8835
+ readonly notes: readonly ["Unknown ids are reported under `unknown`; acknowledging twice is harmless."];
8322
8836
  };
8323
8837
  };
8324
8838
  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.", "", "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."];