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.
- package/README.md +57 -3
- package/dist/agentTasks.d.ts.map +1 -1
- package/dist/agentTasks.js +4 -0
- package/dist/agentTasks.js.map +1 -1
- package/dist/boundaryDecoder.d.ts.map +1 -1
- package/dist/boundaryDecoder.js +6 -1
- package/dist/boundaryDecoder.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +17 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +55 -1
- package/dist/commands.js.map +1 -1
- package/dist/docs-index.json +1 -1
- package/dist/generated/contract.d.ts +557 -43
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +927 -48
- package/dist/generated/contract.js.map +1 -1
- package/dist/handoff.d.ts +33 -0
- package/dist/handoff.d.ts.map +1 -1
- package/dist/handoff.js +641 -26
- package/dist/handoff.js.map +1 -1
- package/dist/localControl.d.ts +46 -2
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +276 -9
- package/dist/localControl.js.map +1 -1
- package/dist/nativeSession.d.ts +92 -0
- package/dist/nativeSession.d.ts.map +1 -0
- package/dist/nativeSession.js +410 -0
- package/dist/nativeSession.js.map +1 -0
- package/dist/watchLines.d.ts.map +1 -1
- package/dist/watchLines.js +3 -0
- package/dist/watchLines.js.map +1 -1
- package/dist/workspace.d.ts +4 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +17 -7
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -47,6 +47,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
47
47
|
"pr.merged",
|
|
48
48
|
"pr.closed",
|
|
49
49
|
"pr.head",
|
|
50
|
+
"pr.base_changed",
|
|
51
|
+
"pr.base_deleted",
|
|
50
52
|
"pr.review",
|
|
51
53
|
"pr.comment",
|
|
52
54
|
"pr.stopped",
|
|
@@ -409,10 +411,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
409
411
|
},
|
|
410
412
|
{
|
|
411
413
|
"name": "handoff",
|
|
412
|
-
"summary": "Hand your task to
|
|
414
|
+
"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.",
|
|
413
415
|
"usage": [
|
|
414
416
|
"runpane handoff --template",
|
|
415
|
-
"runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]"
|
|
417
|
+
"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]"
|
|
416
418
|
],
|
|
417
419
|
"mutates": true,
|
|
418
420
|
"wrappers": [
|
|
@@ -439,8 +441,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
439
441
|
"name": "panes create",
|
|
440
442
|
"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>`.",
|
|
441
443
|
"usage": [
|
|
442
|
-
"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>]",
|
|
443
|
-
"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>]",
|
|
444
|
+
"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>]",
|
|
445
|
+
"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>]",
|
|
444
446
|
"runpane panes create --from-json <path|-> [--yes] [--json] [--pane-dir <path>]"
|
|
445
447
|
],
|
|
446
448
|
"mutates": true,
|
|
@@ -450,7 +452,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
450
452
|
],
|
|
451
453
|
"jsonSchemas": [
|
|
452
454
|
"paneCreateRequest",
|
|
453
|
-
"paneCreateResult"
|
|
455
|
+
"paneCreateResult",
|
|
456
|
+
"dispatchWaitResult"
|
|
454
457
|
],
|
|
455
458
|
"localControl": true
|
|
456
459
|
},
|
|
@@ -564,8 +567,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
564
567
|
"name": "panels create",
|
|
565
568
|
"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.",
|
|
566
569
|
"usage": [
|
|
567
|
-
"runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]",
|
|
568
|
-
"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>]"
|
|
570
|
+
"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>]",
|
|
571
|
+
"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>]"
|
|
569
572
|
],
|
|
570
573
|
"mutates": true,
|
|
571
574
|
"additive": true,
|
|
@@ -575,7 +578,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
575
578
|
],
|
|
576
579
|
"jsonSchemas": [
|
|
577
580
|
"panelCreateRequest",
|
|
578
|
-
"panelCreateResult"
|
|
581
|
+
"panelCreateResult",
|
|
582
|
+
"dispatchWaitResult"
|
|
579
583
|
],
|
|
580
584
|
"localControl": true
|
|
581
585
|
},
|
|
@@ -655,7 +659,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
655
659
|
"name": "panels submit",
|
|
656
660
|
"summary": "Send and submit text to a terminal panel, including idle agent composers.",
|
|
657
661
|
"usage": [
|
|
658
|
-
"runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] [--source user|agent] --yes [--json] [--pane-dir <path>]"
|
|
662
|
+
"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>]"
|
|
659
663
|
],
|
|
660
664
|
"mutates": true,
|
|
661
665
|
"toolsets": [
|
|
@@ -663,7 +667,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
663
667
|
],
|
|
664
668
|
"jsonSchemas": [
|
|
665
669
|
"panelSubmitRequest",
|
|
666
|
-
"panelSubmitResult"
|
|
670
|
+
"panelSubmitResult",
|
|
671
|
+
"dispatchWaitResult"
|
|
667
672
|
],
|
|
668
673
|
"localControl": true
|
|
669
674
|
},
|
|
@@ -1235,6 +1240,31 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1235
1240
|
],
|
|
1236
1241
|
"localControl": true
|
|
1237
1242
|
},
|
|
1243
|
+
{
|
|
1244
|
+
"name": "inbox",
|
|
1245
|
+
"summary": "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.",
|
|
1246
|
+
"usage": [
|
|
1247
|
+
"runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]"
|
|
1248
|
+
],
|
|
1249
|
+
"jsonSchemas": [
|
|
1250
|
+
"inboxListResult"
|
|
1251
|
+
],
|
|
1252
|
+
"localControl": true
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
"name": "inbox ack",
|
|
1256
|
+
"summary": "Clear Session inbox items once they are handled.",
|
|
1257
|
+
"usage": [
|
|
1258
|
+
"runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
1259
|
+
"runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]"
|
|
1260
|
+
],
|
|
1261
|
+
"mutates": true,
|
|
1262
|
+
"idempotent": true,
|
|
1263
|
+
"jsonSchemas": [
|
|
1264
|
+
"inboxAckResult"
|
|
1265
|
+
],
|
|
1266
|
+
"localControl": true
|
|
1267
|
+
},
|
|
1238
1268
|
{
|
|
1239
1269
|
"name": "sessions list",
|
|
1240
1270
|
"summary": "List durable named orchestration Sessions.",
|
|
@@ -1670,6 +1700,11 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1670
1700
|
],
|
|
1671
1701
|
"description": "Read initial input from a file or stdin. --prompt-file is an alias."
|
|
1672
1702
|
},
|
|
1703
|
+
{
|
|
1704
|
+
"name": "--attach",
|
|
1705
|
+
"value": "<file>",
|
|
1706
|
+
"description": "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable."
|
|
1707
|
+
},
|
|
1673
1708
|
{
|
|
1674
1709
|
"name": "--from-json",
|
|
1675
1710
|
"value": "<path|->",
|
|
@@ -1808,7 +1843,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1808
1843
|
{
|
|
1809
1844
|
"name": "--wait",
|
|
1810
1845
|
"value": "<milliseconds>",
|
|
1811
|
-
"description": "
|
|
1846
|
+
"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."
|
|
1847
|
+
},
|
|
1848
|
+
{
|
|
1849
|
+
"name": "--timeout",
|
|
1850
|
+
"value": "<duration>",
|
|
1851
|
+
"description": "With --wait: give up after this long (30m, 2h; 0 waits without limit) and exit 124."
|
|
1812
1852
|
},
|
|
1813
1853
|
{
|
|
1814
1854
|
"name": "--note",
|
|
@@ -1956,7 +1996,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1956
1996
|
},
|
|
1957
1997
|
{
|
|
1958
1998
|
"name": "--as-file-pointer",
|
|
1959
|
-
"description": "Write the prompt or text to a private file
|
|
1999
|
+
"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."
|
|
1960
2000
|
},
|
|
1961
2001
|
{
|
|
1962
2002
|
"name": "--follow",
|
|
@@ -2006,9 +2046,25 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2006
2046
|
"name": "--push",
|
|
2007
2047
|
"description": "Before a handoff, commit uncommitted work as WIP and push the branch (never forces)."
|
|
2008
2048
|
},
|
|
2049
|
+
{
|
|
2050
|
+
"name": "--note-only",
|
|
2051
|
+
"description": "Hand off to a fresh agent with the note, instead of carrying and resuming your own session."
|
|
2052
|
+
},
|
|
2009
2053
|
{
|
|
2010
2054
|
"name": "--interrupt",
|
|
2011
2055
|
"description": "Stop the current agent turn, wait for an empty idle composer, then submit and verify the replacement."
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
"name": "--expect-report",
|
|
2059
|
+
"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."
|
|
2060
|
+
},
|
|
2061
|
+
{
|
|
2062
|
+
"name": "--no-expect-report",
|
|
2063
|
+
"description": "Send work without waiting for a `runpane report` (fire-and-forget input); no agent.report.missing follows."
|
|
2064
|
+
},
|
|
2065
|
+
{
|
|
2066
|
+
"name": "--all",
|
|
2067
|
+
"description": "inbox ack only: clear every item of the --session."
|
|
2012
2068
|
}
|
|
2013
2069
|
]
|
|
2014
2070
|
},
|
|
@@ -2076,6 +2132,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2076
2132
|
" runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]",
|
|
2077
2133
|
" runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]",
|
|
2078
2134
|
" runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]",
|
|
2135
|
+
" runpane inbox [--session <id|name>] [--json]",
|
|
2136
|
+
" runpane inbox ack <item-id>... [--session <id|name>] [--json]",
|
|
2079
2137
|
" runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
|
|
2080
2138
|
" runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]",
|
|
2081
2139
|
" runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]",
|
|
@@ -2303,9 +2361,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2303
2361
|
"What --follow does by default (see defaults.watch.follow in the contract):",
|
|
2304
2362
|
" prints WATCH OK once when armed, then one line per event, with no heartbeats",
|
|
2305
2363
|
" kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
|
|
2306
|
-
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
|
|
2364
|
+
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,",
|
|
2365
|
+
" pr.base_changed, pr.base_deleted",
|
|
2307
2366
|
" READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
|
|
2308
|
-
" (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
|
|
2367
|
+
" (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)",
|
|
2309
2368
|
" IDLE reminders at 10m, 30m, 1h, 3h, then daily",
|
|
2310
2369
|
" ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
|
|
2311
2370
|
"",
|
|
@@ -2314,6 +2373,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2314
2373
|
"its line, then run it again; its named cursor means nothing is missed between runs.",
|
|
2315
2374
|
"Single-event waits deliver immediately without follow settling or batching.",
|
|
2316
2375
|
"--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.",
|
|
2376
|
+
"agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:",
|
|
2377
|
+
"add it to --kinds to wake on MISSING REPORT too.",
|
|
2317
2378
|
"",
|
|
2318
2379
|
"Options:",
|
|
2319
2380
|
" --session <id|name> Watch every Pane in a Session; associate/detach apply live",
|
|
@@ -2372,6 +2433,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2372
2433
|
" --prompt <text> Alias for --initial-input",
|
|
2373
2434
|
" --initial-input-file <path|-> Read initial input from a file or stdin",
|
|
2374
2435
|
" --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt",
|
|
2436
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable",
|
|
2437
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
2438
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
2439
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
2440
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
2441
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
2375
2442
|
" --prompt-file <path|-> Alias for --initial-input-file",
|
|
2376
2443
|
" --from-json <path|-> Read a full request payload",
|
|
2377
2444
|
" --timeout-ms <milliseconds> Pane creation timeout",
|
|
@@ -2596,7 +2663,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2596
2663
|
],
|
|
2597
2664
|
"panels submit": [
|
|
2598
2665
|
"Usage:",
|
|
2599
|
-
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
|
|
2666
|
+
" 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]",
|
|
2600
2667
|
"",
|
|
2601
2668
|
"Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
|
|
2602
2669
|
"",
|
|
@@ -2606,11 +2673,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2606
2673
|
"",
|
|
2607
2674
|
"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.",
|
|
2608
2675
|
"",
|
|
2676
|
+
"Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.",
|
|
2677
|
+
"It returns once, with a compact result: outcome, ids, the report (state, summary,",
|
|
2678
|
+
"summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing",
|
|
2679
|
+
"report. Answer a blocked panel with `panels submit --no-expect-report`,",
|
|
2680
|
+
"then watch for the original result.",
|
|
2681
|
+
"",
|
|
2609
2682
|
"Options:",
|
|
2610
2683
|
" --panel <panel-id> Terminal panel id",
|
|
2611
2684
|
" --text <text> Text to submit before Enter",
|
|
2612
2685
|
" --input-file <path|-> Read text from a file or stdin before Enter",
|
|
2613
2686
|
" --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
|
|
2687
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable",
|
|
2688
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
2689
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
2690
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
2691
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
2692
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
2614
2693
|
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
2615
2694
|
" --json Print machine-readable output",
|
|
2616
2695
|
" --yes Skip confirmation for this mutating command",
|
|
@@ -2635,8 +2714,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2635
2714
|
"Create a terminal-backed tool panel inside an existing Pane session.",
|
|
2636
2715
|
"",
|
|
2637
2716
|
"Usage:",
|
|
2638
|
-
" runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--title <title>] [--initial-input <text>] [--no-focus] [--wait-ready] --yes [--json]",
|
|
2639
|
-
" runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--no-focus] [--wait-ready] --yes [--json]",
|
|
2717
|
+
" 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]",
|
|
2718
|
+
" 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]",
|
|
2640
2719
|
"",
|
|
2641
2720
|
"Options:",
|
|
2642
2721
|
" --pane <pane-id> Existing Pane session to add the panel to.",
|
|
@@ -2646,6 +2725,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2646
2725
|
" --initial-input, --prompt Initial input to send after the tool starts.",
|
|
2647
2726
|
" --initial-input-file <path|-> Read initial input from a file or stdin.",
|
|
2648
2727
|
" --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.",
|
|
2728
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable.",
|
|
2729
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
2730
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
2731
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
2732
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
2733
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
2649
2734
|
" --no-focus Create the panel in the background.",
|
|
2650
2735
|
" --focus Explicitly focus the created panel.",
|
|
2651
2736
|
" --source <user|agent> Mark the mutation source; agent implies background creation.",
|
|
@@ -3262,12 +3347,16 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3262
3347
|
"handoff": [
|
|
3263
3348
|
"Usage:",
|
|
3264
3349
|
" runpane handoff --template",
|
|
3265
|
-
" runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]",
|
|
3350
|
+
" 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]",
|
|
3266
3351
|
"",
|
|
3267
|
-
"Hand your task to
|
|
3352
|
+
"Hand your task to another agent. You write the note (runpane handoff --template); the CLI checks it,",
|
|
3268
3353
|
"makes sure your branch is pushed, sends the note to the destination, and starts the agent there.",
|
|
3269
|
-
"From a
|
|
3270
|
-
"
|
|
3354
|
+
"From a Pane tab, a handoff to the same agent (Claude, Codex, Cursor or OpenCode) carries your own session:",
|
|
3355
|
+
"another machine resumes a copy of it, this machine resumes a fork. The CLI then checks the receiver",
|
|
3356
|
+
"continued it (continued, inconclusive, or not-continued, which exits 1 and keeps the receiver).",
|
|
3357
|
+
"--note-only, another agent, or no session to carry starts a fresh agent with the note instead.",
|
|
3358
|
+
"From a Session's terminal it skips git and creates the Session on the other machine; a same-agent",
|
|
3359
|
+
"Session resumes your conversation when first opened, otherwise it reads the note. The sender Session stays.",
|
|
3271
3360
|
"",
|
|
3272
3361
|
"Options:",
|
|
3273
3362
|
" <destination> Freeform: agent, model, effort, and machine, such as \"codex gpt-5 high on parsas-macbook-pro\".",
|
|
@@ -3279,6 +3368,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3279
3368
|
" --effort <level> minimal, low, medium, high, xhigh, or max; supported for Claude and Codex only; overrides the text. Cursor effort is rejected.",
|
|
3280
3369
|
" --repo <selector> Saved repository on the destination; defaults to the one with the same remote.",
|
|
3281
3370
|
" --push Commit uncommitted work (not the note) as WIP and push the branch first (never forces).",
|
|
3371
|
+
" --note-only Start a fresh agent with the note instead of carrying your own session.",
|
|
3282
3372
|
" --dry-run Check destination reachability, saved repo and OS; print note and git state; send nothing. From a Session: the name it would get.",
|
|
3283
3373
|
" --json Print machine-readable output.",
|
|
3284
3374
|
"",
|
|
@@ -3313,6 +3403,35 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3313
3403
|
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
|
|
3314
3404
|
"",
|
|
3315
3405
|
"List PR registrations and stopped watches."
|
|
3406
|
+
],
|
|
3407
|
+
"inbox": [
|
|
3408
|
+
"Usage:",
|
|
3409
|
+
" runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
3410
|
+
"",
|
|
3411
|
+
"Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),",
|
|
3412
|
+
"missing reports (agent.report.missing), and questions waiting on a worker's screen",
|
|
3413
|
+
"(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across",
|
|
3414
|
+
"restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.",
|
|
3415
|
+
"",
|
|
3416
|
+
"Options:",
|
|
3417
|
+
" --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID",
|
|
3418
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
3419
|
+
" --json Print machine-readable output",
|
|
3420
|
+
"",
|
|
3421
|
+
"Clear handled items with `runpane inbox ack <item-id>...`."
|
|
3422
|
+
],
|
|
3423
|
+
"inbox ack": [
|
|
3424
|
+
"Usage:",
|
|
3425
|
+
" runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
3426
|
+
" runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]",
|
|
3427
|
+
"",
|
|
3428
|
+
"Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.",
|
|
3429
|
+
"",
|
|
3430
|
+
"Options:",
|
|
3431
|
+
" --session <id|name> Only clear items of this Session; required with --all",
|
|
3432
|
+
" --all Clear every item of the Session",
|
|
3433
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
3434
|
+
" --json Print machine-readable output"
|
|
3316
3435
|
]
|
|
3317
3436
|
},
|
|
3318
3437
|
"pip": {
|
|
@@ -3363,6 +3482,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3363
3482
|
" runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]",
|
|
3364
3483
|
" runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]",
|
|
3365
3484
|
" runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]",
|
|
3485
|
+
" runpane inbox [--session <id|name>] [--json]",
|
|
3486
|
+
" runpane inbox ack <item-id>... [--session <id|name>] [--json]",
|
|
3366
3487
|
" runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
|
|
3367
3488
|
" runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]",
|
|
3368
3489
|
" runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]",
|
|
@@ -3585,9 +3706,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3585
3706
|
"What --follow does by default (see defaults.watch.follow in the contract):",
|
|
3586
3707
|
" prints WATCH OK once when armed, then one line per event, with no heartbeats",
|
|
3587
3708
|
" kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
|
|
3588
|
-
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
|
|
3709
|
+
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,",
|
|
3710
|
+
" pr.base_changed, pr.base_deleted",
|
|
3589
3711
|
" READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
|
|
3590
|
-
" (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
|
|
3712
|
+
" (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)",
|
|
3591
3713
|
" IDLE reminders at 10m, 30m, 1h, 3h, then daily",
|
|
3592
3714
|
" ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
|
|
3593
3715
|
"",
|
|
@@ -3596,6 +3718,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3596
3718
|
"its line, then run it again; its named cursor means nothing is missed between runs.",
|
|
3597
3719
|
"Single-event waits deliver immediately without follow settling or batching.",
|
|
3598
3720
|
"--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.",
|
|
3721
|
+
"agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:",
|
|
3722
|
+
"add it to --kinds to wake on MISSING REPORT too.",
|
|
3599
3723
|
"",
|
|
3600
3724
|
"Options:",
|
|
3601
3725
|
" --session <id|name> Watch every Pane in a Session; associate/detach apply live",
|
|
@@ -3654,6 +3778,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3654
3778
|
" --prompt <text> Alias for --initial-input",
|
|
3655
3779
|
" --initial-input-file <path|-> Read initial input from a file or stdin",
|
|
3656
3780
|
" --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt",
|
|
3781
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable",
|
|
3782
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
3783
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
3784
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
3785
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
3786
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
3657
3787
|
" --prompt-file <path|-> Alias for --initial-input-file",
|
|
3658
3788
|
" --from-json <path|-> Read a full request payload",
|
|
3659
3789
|
" --timeout-ms <milliseconds> Pane creation timeout",
|
|
@@ -3870,7 +4000,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3870
4000
|
],
|
|
3871
4001
|
"panels submit": [
|
|
3872
4002
|
"Usage:",
|
|
3873
|
-
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
|
|
4003
|
+
" 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]",
|
|
3874
4004
|
"",
|
|
3875
4005
|
"Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
|
|
3876
4006
|
"",
|
|
@@ -3880,11 +4010,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3880
4010
|
"",
|
|
3881
4011
|
"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.",
|
|
3882
4012
|
"",
|
|
4013
|
+
"Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.",
|
|
4014
|
+
"It returns once, with a compact result: outcome, ids, the report (state, summary,",
|
|
4015
|
+
"summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing",
|
|
4016
|
+
"report. Answer a blocked panel with `panels submit --no-expect-report`,",
|
|
4017
|
+
"then watch for the original result.",
|
|
4018
|
+
"",
|
|
3883
4019
|
"Options:",
|
|
3884
4020
|
" --panel <panel-id> Terminal panel id",
|
|
3885
4021
|
" --text <text> Text to submit before Enter",
|
|
3886
4022
|
" --input-file <path|-> Read text from a file or stdin before Enter",
|
|
3887
4023
|
" --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
|
|
4024
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable",
|
|
4025
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
4026
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
4027
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
4028
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
4029
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
3888
4030
|
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
3889
4031
|
" --json Print machine-readable output",
|
|
3890
4032
|
" --yes Skip confirmation for this mutating command",
|
|
@@ -3920,6 +4062,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3920
4062
|
" --initial-input, --prompt Initial input to send after the tool starts.",
|
|
3921
4063
|
" --initial-input-file <path|-> Read initial input from a file or stdin.",
|
|
3922
4064
|
" --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.",
|
|
4065
|
+
" --attach <file> Copy a file beside the prompt file and list it; repeatable.",
|
|
4066
|
+
" --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
|
|
4067
|
+
" --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
|
|
4068
|
+
" --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
|
|
4069
|
+
" print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
|
|
4070
|
+
" --timeout <duration> With --wait: give up after this long (30m, 2h)",
|
|
3923
4071
|
" --no-focus Create the panel in the background.",
|
|
3924
4072
|
" --focus Explicitly focus the created panel.",
|
|
3925
4073
|
" --source <user|agent> Mark the mutation source; agent implies background creation.",
|
|
@@ -4485,7 +4633,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4485
4633
|
"handoff": [
|
|
4486
4634
|
"Usage:",
|
|
4487
4635
|
" runpane handoff --template",
|
|
4488
|
-
" runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]",
|
|
4636
|
+
" 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]",
|
|
4489
4637
|
"",
|
|
4490
4638
|
"`runpane handoff` ships in the npm package and the Pane app, not in the Python package.",
|
|
4491
4639
|
"Run it with Node instead: npx --yes runpane@latest handoff"
|
|
@@ -4516,6 +4664,35 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4516
4664
|
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
|
|
4517
4665
|
"",
|
|
4518
4666
|
"List PR registrations and stopped watches."
|
|
4667
|
+
],
|
|
4668
|
+
"inbox": [
|
|
4669
|
+
"Usage:",
|
|
4670
|
+
" runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
4671
|
+
"",
|
|
4672
|
+
"Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),",
|
|
4673
|
+
"missing reports (agent.report.missing), and questions waiting on a worker's screen",
|
|
4674
|
+
"(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across",
|
|
4675
|
+
"restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.",
|
|
4676
|
+
"",
|
|
4677
|
+
"Options:",
|
|
4678
|
+
" --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID",
|
|
4679
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
4680
|
+
" --json Print machine-readable output",
|
|
4681
|
+
"",
|
|
4682
|
+
"Clear handled items with `runpane inbox ack <item-id>...`."
|
|
4683
|
+
],
|
|
4684
|
+
"inbox ack": [
|
|
4685
|
+
"Usage:",
|
|
4686
|
+
" runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
|
|
4687
|
+
" runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]",
|
|
4688
|
+
"",
|
|
4689
|
+
"Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.",
|
|
4690
|
+
"",
|
|
4691
|
+
"Options:",
|
|
4692
|
+
" --session <id|name> Only clear items of this Session; required with --all",
|
|
4693
|
+
" --all Clear every item of the Session",
|
|
4694
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
4695
|
+
" --json Print machine-readable output"
|
|
4519
4696
|
]
|
|
4520
4697
|
}
|
|
4521
4698
|
},
|
|
@@ -4672,16 +4849,19 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4672
4849
|
"`sessions set-agent` switch the durable terminal agent for a named Session.",
|
|
4673
4850
|
"`sessions associate` associate a user-visible Pane with a named Session.",
|
|
4674
4851
|
"`sessions detach` detach a Pane from a named Session.",
|
|
4675
|
-
"`sessions overview` read a live status, activity, git, and pull request overview for a named Session.",
|
|
4852
|
+
"`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.",
|
|
4676
4853
|
"`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.",
|
|
4677
4854
|
"`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.",
|
|
4678
|
-
"`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.",
|
|
4855
|
+
"`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.",
|
|
4856
|
+
"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.",
|
|
4857
|
+
"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.",
|
|
4858
|
+
"`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.",
|
|
4679
4859
|
"`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`.",
|
|
4680
4860
|
"`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.",
|
|
4681
4861
|
"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.",
|
|
4682
4862
|
"`runpane links create` builds `pane://open?...` links; opening one in Pane selects what it names and never changes Pane state.",
|
|
4683
4863
|
"`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.",
|
|
4684
|
-
"`runpane handoff` hands a task to
|
|
4864
|
+
"`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.",
|
|
4685
4865
|
"`runpane pr watch`: Register durable GitHub PR monitoring for a Pane.",
|
|
4686
4866
|
"`runpane pr unwatch`: Remove a Pane’s explicit PR registration.",
|
|
4687
4867
|
"`runpane pr list`: List PR registrations and stopped watches."
|
|
@@ -5645,6 +5825,117 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5645
5825
|
"42",
|
|
5646
5826
|
"--epoch",
|
|
5647
5827
|
"test-epoch"
|
|
5828
|
+
],
|
|
5829
|
+
[
|
|
5830
|
+
"panels",
|
|
5831
|
+
"submit",
|
|
5832
|
+
"--panel",
|
|
5833
|
+
"panel-1",
|
|
5834
|
+
"--text",
|
|
5835
|
+
"go",
|
|
5836
|
+
"--expect-report",
|
|
5837
|
+
"--yes",
|
|
5838
|
+
"--json"
|
|
5839
|
+
],
|
|
5840
|
+
[
|
|
5841
|
+
"panels",
|
|
5842
|
+
"create",
|
|
5843
|
+
"--pane",
|
|
5844
|
+
"pane-1",
|
|
5845
|
+
"--agent",
|
|
5846
|
+
"claude",
|
|
5847
|
+
"--expect-report",
|
|
5848
|
+
"--yes"
|
|
5849
|
+
],
|
|
5850
|
+
[
|
|
5851
|
+
"panes",
|
|
5852
|
+
"create",
|
|
5853
|
+
"--repo",
|
|
5854
|
+
"active",
|
|
5855
|
+
"--name",
|
|
5856
|
+
"feat",
|
|
5857
|
+
"--agent",
|
|
5858
|
+
"codex",
|
|
5859
|
+
"--expect-report",
|
|
5860
|
+
"--yes"
|
|
5861
|
+
],
|
|
5862
|
+
[
|
|
5863
|
+
"inbox",
|
|
5864
|
+
"--session",
|
|
5865
|
+
"Release",
|
|
5866
|
+
"--json"
|
|
5867
|
+
],
|
|
5868
|
+
[
|
|
5869
|
+
"inbox",
|
|
5870
|
+
"ack",
|
|
5871
|
+
"in-1a2b3c4d",
|
|
5872
|
+
"in-5e6f7a8b",
|
|
5873
|
+
"--session",
|
|
5874
|
+
"Release",
|
|
5875
|
+
"--json"
|
|
5876
|
+
],
|
|
5877
|
+
[
|
|
5878
|
+
"inbox",
|
|
5879
|
+
"ack",
|
|
5880
|
+
"--all",
|
|
5881
|
+
"--session",
|
|
5882
|
+
"Release"
|
|
5883
|
+
],
|
|
5884
|
+
[
|
|
5885
|
+
"panels",
|
|
5886
|
+
"submit",
|
|
5887
|
+
"--panel",
|
|
5888
|
+
"panel-1",
|
|
5889
|
+
"--text",
|
|
5890
|
+
"fyi",
|
|
5891
|
+
"--no-expect-report",
|
|
5892
|
+
"--yes"
|
|
5893
|
+
],
|
|
5894
|
+
[
|
|
5895
|
+
"panels",
|
|
5896
|
+
"submit",
|
|
5897
|
+
"--panel",
|
|
5898
|
+
"panel-1",
|
|
5899
|
+
"--input-file",
|
|
5900
|
+
"prompt.md",
|
|
5901
|
+
"--as-file-pointer",
|
|
5902
|
+
"--wait",
|
|
5903
|
+
"--yes"
|
|
5904
|
+
],
|
|
5905
|
+
[
|
|
5906
|
+
"panels",
|
|
5907
|
+
"submit",
|
|
5908
|
+
"--panel",
|
|
5909
|
+
"panel-1",
|
|
5910
|
+
"--text",
|
|
5911
|
+
"Red",
|
|
5912
|
+
"--wait",
|
|
5913
|
+
"--timeout",
|
|
5914
|
+
"30m",
|
|
5915
|
+
"--yes",
|
|
5916
|
+
"--json"
|
|
5917
|
+
],
|
|
5918
|
+
[
|
|
5919
|
+
"panes",
|
|
5920
|
+
"create",
|
|
5921
|
+
"--repo",
|
|
5922
|
+
"active",
|
|
5923
|
+
"--name",
|
|
5924
|
+
"feat",
|
|
5925
|
+
"--agent",
|
|
5926
|
+
"claude",
|
|
5927
|
+
"--prompt-file",
|
|
5928
|
+
"task.md",
|
|
5929
|
+
"--wait",
|
|
5930
|
+
"--yes"
|
|
5931
|
+
],
|
|
5932
|
+
[
|
|
5933
|
+
"lock",
|
|
5934
|
+
"acquire",
|
|
5935
|
+
"--name",
|
|
5936
|
+
"deploy",
|
|
5937
|
+
"--wait",
|
|
5938
|
+
"5000"
|
|
5648
5939
|
]
|
|
5649
5940
|
],
|
|
5650
5941
|
"topLevelHelpIncludes": [
|
|
@@ -6490,6 +6781,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6490
6781
|
},
|
|
6491
6782
|
"initialInputAsFilePointer": {
|
|
6492
6783
|
"type": "boolean"
|
|
6784
|
+
},
|
|
6785
|
+
"initialInputAttachments": {
|
|
6786
|
+
"type": "array",
|
|
6787
|
+
"items": {
|
|
6788
|
+
"type": "string"
|
|
6789
|
+
}
|
|
6493
6790
|
}
|
|
6494
6791
|
},
|
|
6495
6792
|
"additionalProperties": false
|
|
@@ -6518,6 +6815,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6518
6815
|
},
|
|
6519
6816
|
"initialInputAsFilePointer": {
|
|
6520
6817
|
"type": "boolean"
|
|
6818
|
+
},
|
|
6819
|
+
"initialInputAttachments": {
|
|
6820
|
+
"type": "array",
|
|
6821
|
+
"items": {
|
|
6822
|
+
"type": "string"
|
|
6823
|
+
}
|
|
6521
6824
|
}
|
|
6522
6825
|
},
|
|
6523
6826
|
"additionalProperties": false
|
|
@@ -6558,6 +6861,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6558
6861
|
"associateSession": {
|
|
6559
6862
|
"type": "string",
|
|
6560
6863
|
"description": "Session id to associate each created Pane with; the CLI sets it from PANE_ORCHESTRATION_SESSION_ID unless --no-associate."
|
|
6864
|
+
},
|
|
6865
|
+
"expectReport": {
|
|
6866
|
+
"type": "boolean",
|
|
6867
|
+
"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)."
|
|
6561
6868
|
}
|
|
6562
6869
|
},
|
|
6563
6870
|
"additionalProperties": false
|
|
@@ -6891,6 +7198,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6891
7198
|
"promptFile": {
|
|
6892
7199
|
"type": "string"
|
|
6893
7200
|
},
|
|
7201
|
+
"attachments": {
|
|
7202
|
+
"type": "array",
|
|
7203
|
+
"items": {
|
|
7204
|
+
"type": "string"
|
|
7205
|
+
}
|
|
7206
|
+
},
|
|
6894
7207
|
"warnings": {
|
|
6895
7208
|
"$ref": "#/jsonSchemas/panelSubmitResult/properties/warnings"
|
|
6896
7209
|
},
|
|
@@ -6987,6 +7300,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6987
7300
|
}
|
|
6988
7301
|
]
|
|
6989
7302
|
}
|
|
7303
|
+
},
|
|
7304
|
+
"epoch": {
|
|
7305
|
+
"type": "string",
|
|
7306
|
+
"description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
|
|
6990
7307
|
}
|
|
6991
7308
|
},
|
|
6992
7309
|
"additionalProperties": false
|
|
@@ -7439,6 +7756,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7439
7756
|
"panel.exited",
|
|
7440
7757
|
"panel.stopped",
|
|
7441
7758
|
"agent.report",
|
|
7759
|
+
"agent.report.missing",
|
|
7442
7760
|
"pane.associated",
|
|
7443
7761
|
"pane.detached",
|
|
7444
7762
|
"pr.conflicted",
|
|
@@ -7446,6 +7764,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7446
7764
|
"pr.merged",
|
|
7447
7765
|
"pr.closed",
|
|
7448
7766
|
"pr.head",
|
|
7767
|
+
"pr.base_changed",
|
|
7768
|
+
"pr.base_deleted",
|
|
7449
7769
|
"pr.review",
|
|
7450
7770
|
"pr.comment",
|
|
7451
7771
|
"pr.stopped",
|
|
@@ -7568,6 +7888,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7568
7888
|
},
|
|
7569
7889
|
"additionalProperties": false
|
|
7570
7890
|
},
|
|
7891
|
+
"base": {
|
|
7892
|
+
"type": "object",
|
|
7893
|
+
"description": "Base branch of a pr.base_changed (old to new) or pr.base_deleted (to is the PR's current base name) entry.",
|
|
7894
|
+
"required": [
|
|
7895
|
+
"from",
|
|
7896
|
+
"to"
|
|
7897
|
+
],
|
|
7898
|
+
"properties": {
|
|
7899
|
+
"from": {
|
|
7900
|
+
"type": "string"
|
|
7901
|
+
},
|
|
7902
|
+
"to": {
|
|
7903
|
+
"type": "string"
|
|
7904
|
+
}
|
|
7905
|
+
},
|
|
7906
|
+
"additionalProperties": false
|
|
7907
|
+
},
|
|
7571
7908
|
"checks": {
|
|
7572
7909
|
"enum": [
|
|
7573
7910
|
"passed",
|
|
@@ -7589,6 +7926,28 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7589
7926
|
"epoch": {
|
|
7590
7927
|
"type": "string",
|
|
7591
7928
|
"description": "Added to watch --json NDJSON events. Persist with gen after processing for numeric rearm."
|
|
7929
|
+
},
|
|
7930
|
+
"lastOutput": {
|
|
7931
|
+
"type": "string",
|
|
7932
|
+
"description": "What an agent.report.missing entry's agent said last, up to 2,000 characters (the end is kept)."
|
|
7933
|
+
},
|
|
7934
|
+
"lastOutputSource": {
|
|
7935
|
+
"enum": [
|
|
7936
|
+
"transcript",
|
|
7937
|
+
"screen"
|
|
7938
|
+
],
|
|
7939
|
+
"description": "transcript: the agent's last reply; screen: the last lines on its screen."
|
|
7940
|
+
},
|
|
7941
|
+
"expectedSince": {
|
|
7942
|
+
"type": "string",
|
|
7943
|
+
"description": "When the work an agent.report.missing entry is about was sent."
|
|
7944
|
+
},
|
|
7945
|
+
"screenLines": {
|
|
7946
|
+
"type": "array",
|
|
7947
|
+
"items": {
|
|
7948
|
+
"type": "string"
|
|
7949
|
+
},
|
|
7950
|
+
"description": "The screen lines of the prompt an agent.blocked entry's agent waits on (at most 20)."
|
|
7592
7951
|
}
|
|
7593
7952
|
},
|
|
7594
7953
|
"additionalProperties": false
|
|
@@ -7633,6 +7992,50 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7633
7992
|
},
|
|
7634
7993
|
"additionalProperties": false
|
|
7635
7994
|
},
|
|
7995
|
+
"panelReport": {
|
|
7996
|
+
"type": "object",
|
|
7997
|
+
"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.",
|
|
7998
|
+
"required": [
|
|
7999
|
+
"state",
|
|
8000
|
+
"reportedAt"
|
|
8001
|
+
],
|
|
8002
|
+
"properties": {
|
|
8003
|
+
"state": {
|
|
8004
|
+
"enum": [
|
|
8005
|
+
"ready",
|
|
8006
|
+
"blocked",
|
|
8007
|
+
"failed",
|
|
8008
|
+
"done"
|
|
8009
|
+
]
|
|
8010
|
+
},
|
|
8011
|
+
"pr": {
|
|
8012
|
+
"type": "number"
|
|
8013
|
+
},
|
|
8014
|
+
"head": {
|
|
8015
|
+
"type": "string"
|
|
8016
|
+
},
|
|
8017
|
+
"summary": {
|
|
8018
|
+
"type": "string"
|
|
8019
|
+
},
|
|
8020
|
+
"summaryTruncated": {
|
|
8021
|
+
"const": true
|
|
8022
|
+
},
|
|
8023
|
+
"summaryPath": {
|
|
8024
|
+
"type": "string"
|
|
8025
|
+
},
|
|
8026
|
+
"question": {
|
|
8027
|
+
"type": "string"
|
|
8028
|
+
},
|
|
8029
|
+
"reportedAt": {
|
|
8030
|
+
"type": "string"
|
|
8031
|
+
},
|
|
8032
|
+
"data": {
|
|
8033
|
+
"type": "object",
|
|
8034
|
+
"description": "The worker's JSON object summary, returned as given. Pane never reads, renames or validates its fields."
|
|
8035
|
+
}
|
|
8036
|
+
},
|
|
8037
|
+
"additionalProperties": false
|
|
8038
|
+
},
|
|
7636
8039
|
"workspaceWaitRequest": {
|
|
7637
8040
|
"type": "object",
|
|
7638
8041
|
"properties": {
|
|
@@ -8765,6 +9168,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8765
9168
|
"asFilePointer": {
|
|
8766
9169
|
"type": "boolean"
|
|
8767
9170
|
},
|
|
9171
|
+
"attachments": {
|
|
9172
|
+
"type": "array",
|
|
9173
|
+
"items": {
|
|
9174
|
+
"type": "string"
|
|
9175
|
+
}
|
|
9176
|
+
},
|
|
8768
9177
|
"source": {
|
|
8769
9178
|
"type": "string",
|
|
8770
9179
|
"enum": [
|
|
@@ -8774,6 +9183,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8774
9183
|
},
|
|
8775
9184
|
"interrupt": {
|
|
8776
9185
|
"type": "boolean"
|
|
9186
|
+
},
|
|
9187
|
+
"expectReport": {
|
|
9188
|
+
"type": "boolean",
|
|
9189
|
+
"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)."
|
|
8777
9190
|
}
|
|
8778
9191
|
},
|
|
8779
9192
|
"additionalProperties": false
|
|
@@ -8859,6 +9272,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8859
9272
|
"promptFile": {
|
|
8860
9273
|
"type": "string"
|
|
8861
9274
|
},
|
|
9275
|
+
"attachments": {
|
|
9276
|
+
"type": "array",
|
|
9277
|
+
"items": {
|
|
9278
|
+
"type": "string"
|
|
9279
|
+
}
|
|
9280
|
+
},
|
|
8862
9281
|
"warnings": {
|
|
8863
9282
|
"type": "array",
|
|
8864
9283
|
"items": {
|
|
@@ -8891,6 +9310,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8891
9310
|
"observed",
|
|
8892
9311
|
"unverifiable"
|
|
8893
9312
|
]
|
|
9313
|
+
},
|
|
9314
|
+
"expectedReport": {
|
|
9315
|
+
"type": "object",
|
|
9316
|
+
"required": [
|
|
9317
|
+
"since"
|
|
9318
|
+
],
|
|
9319
|
+
"properties": {
|
|
9320
|
+
"since": {
|
|
9321
|
+
"type": "string"
|
|
9322
|
+
}
|
|
9323
|
+
},
|
|
9324
|
+
"additionalProperties": false,
|
|
9325
|
+
"description": "The report Pane now waits for: set for work an agent sent, or with --expect-report."
|
|
9326
|
+
},
|
|
9327
|
+
"epoch": {
|
|
9328
|
+
"type": "string",
|
|
9329
|
+
"description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
|
|
8894
9330
|
}
|
|
8895
9331
|
},
|
|
8896
9332
|
"additionalProperties": false
|
|
@@ -9678,6 +10114,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
9678
10114
|
},
|
|
9679
10115
|
"readyTimeoutMs": {
|
|
9680
10116
|
"type": "number"
|
|
10117
|
+
},
|
|
10118
|
+
"expectReport": {
|
|
10119
|
+
"type": "boolean",
|
|
10120
|
+
"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)."
|
|
9681
10121
|
}
|
|
9682
10122
|
},
|
|
9683
10123
|
"additionalProperties": false
|
|
@@ -9862,14 +10302,37 @@ exports.RUNPANE_CONTRACT = {
|
|
|
9862
10302
|
"promptFile": {
|
|
9863
10303
|
"type": "string"
|
|
9864
10304
|
},
|
|
10305
|
+
"attachments": {
|
|
10306
|
+
"type": "array",
|
|
10307
|
+
"items": {
|
|
10308
|
+
"type": "string"
|
|
10309
|
+
}
|
|
10310
|
+
},
|
|
9865
10311
|
"warnings": {
|
|
9866
10312
|
"$ref": "#/jsonSchemas/panelSubmitResult/properties/warnings"
|
|
9867
10313
|
},
|
|
9868
10314
|
"nextCommand": {
|
|
9869
10315
|
"type": "string"
|
|
9870
|
-
}
|
|
9871
|
-
|
|
9872
|
-
|
|
10316
|
+
},
|
|
10317
|
+
"expectedReport": {
|
|
10318
|
+
"type": "object",
|
|
10319
|
+
"required": [
|
|
10320
|
+
"since"
|
|
10321
|
+
],
|
|
10322
|
+
"properties": {
|
|
10323
|
+
"since": {
|
|
10324
|
+
"type": "string"
|
|
10325
|
+
}
|
|
10326
|
+
},
|
|
10327
|
+
"additionalProperties": false,
|
|
10328
|
+
"description": "The report Pane now waits for: set for work an agent sent, or with --expect-report."
|
|
10329
|
+
},
|
|
10330
|
+
"epoch": {
|
|
10331
|
+
"type": "string",
|
|
10332
|
+
"description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
|
|
10333
|
+
}
|
|
10334
|
+
},
|
|
10335
|
+
"additionalProperties": false
|
|
9873
10336
|
},
|
|
9874
10337
|
"panelOpenRequest": {
|
|
9875
10338
|
"type": "object",
|
|
@@ -10135,7 +10598,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10135
10598
|
"type": "string"
|
|
10136
10599
|
},
|
|
10137
10600
|
"panes": {
|
|
10138
|
-
"type": "array"
|
|
10601
|
+
"type": "array",
|
|
10602
|
+
"items": {
|
|
10603
|
+
"type": "object",
|
|
10604
|
+
"properties": {
|
|
10605
|
+
"panels": {
|
|
10606
|
+
"type": "array",
|
|
10607
|
+
"items": {
|
|
10608
|
+
"type": "object",
|
|
10609
|
+
"properties": {
|
|
10610
|
+
"report": {
|
|
10611
|
+
"$ref": "#/jsonSchemas/panelReport"
|
|
10612
|
+
}
|
|
10613
|
+
}
|
|
10614
|
+
}
|
|
10615
|
+
}
|
|
10616
|
+
}
|
|
10617
|
+
}
|
|
10139
10618
|
},
|
|
10140
10619
|
"activity": {
|
|
10141
10620
|
"type": "array"
|
|
@@ -10929,6 +11408,234 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10929
11408
|
}
|
|
10930
11409
|
},
|
|
10931
11410
|
"additionalProperties": false
|
|
11411
|
+
},
|
|
11412
|
+
"inboxListResult": {
|
|
11413
|
+
"type": "object",
|
|
11414
|
+
"required": [
|
|
11415
|
+
"ok",
|
|
11416
|
+
"session",
|
|
11417
|
+
"items"
|
|
11418
|
+
],
|
|
11419
|
+
"properties": {
|
|
11420
|
+
"ok": {
|
|
11421
|
+
"const": true
|
|
11422
|
+
},
|
|
11423
|
+
"session": {
|
|
11424
|
+
"type": "object",
|
|
11425
|
+
"required": [
|
|
11426
|
+
"id",
|
|
11427
|
+
"name"
|
|
11428
|
+
],
|
|
11429
|
+
"properties": {
|
|
11430
|
+
"id": {
|
|
11431
|
+
"type": "string"
|
|
11432
|
+
},
|
|
11433
|
+
"name": {
|
|
11434
|
+
"type": "string"
|
|
11435
|
+
}
|
|
11436
|
+
},
|
|
11437
|
+
"additionalProperties": false
|
|
11438
|
+
},
|
|
11439
|
+
"items": {
|
|
11440
|
+
"type": "array",
|
|
11441
|
+
"items": {
|
|
11442
|
+
"type": "object",
|
|
11443
|
+
"required": [
|
|
11444
|
+
"id",
|
|
11445
|
+
"sessionId",
|
|
11446
|
+
"kind",
|
|
11447
|
+
"at",
|
|
11448
|
+
"paneId",
|
|
11449
|
+
"paneName",
|
|
11450
|
+
"panelId"
|
|
11451
|
+
],
|
|
11452
|
+
"properties": {
|
|
11453
|
+
"id": {
|
|
11454
|
+
"type": "string"
|
|
11455
|
+
},
|
|
11456
|
+
"sessionId": {
|
|
11457
|
+
"type": "string"
|
|
11458
|
+
},
|
|
11459
|
+
"kind": {
|
|
11460
|
+
"enum": [
|
|
11461
|
+
"report",
|
|
11462
|
+
"report.missing",
|
|
11463
|
+
"blocked"
|
|
11464
|
+
]
|
|
11465
|
+
},
|
|
11466
|
+
"at": {
|
|
11467
|
+
"type": "string"
|
|
11468
|
+
},
|
|
11469
|
+
"paneId": {
|
|
11470
|
+
"type": "string"
|
|
11471
|
+
},
|
|
11472
|
+
"paneName": {
|
|
11473
|
+
"type": "string"
|
|
11474
|
+
},
|
|
11475
|
+
"panelId": {
|
|
11476
|
+
"type": "string"
|
|
11477
|
+
},
|
|
11478
|
+
"panelTitle": {
|
|
11479
|
+
"type": "string"
|
|
11480
|
+
},
|
|
11481
|
+
"agentType": {
|
|
11482
|
+
"type": "string"
|
|
11483
|
+
},
|
|
11484
|
+
"report": {
|
|
11485
|
+
"$ref": "#/jsonSchemas/agentReport"
|
|
11486
|
+
},
|
|
11487
|
+
"lastOutput": {
|
|
11488
|
+
"type": "string"
|
|
11489
|
+
},
|
|
11490
|
+
"lastOutputSource": {
|
|
11491
|
+
"enum": [
|
|
11492
|
+
"transcript",
|
|
11493
|
+
"screen"
|
|
11494
|
+
]
|
|
11495
|
+
},
|
|
11496
|
+
"reason": {
|
|
11497
|
+
"type": "string"
|
|
11498
|
+
},
|
|
11499
|
+
"screenLines": {
|
|
11500
|
+
"type": "array",
|
|
11501
|
+
"items": {
|
|
11502
|
+
"type": "string"
|
|
11503
|
+
}
|
|
11504
|
+
}
|
|
11505
|
+
},
|
|
11506
|
+
"additionalProperties": false
|
|
11507
|
+
}
|
|
11508
|
+
}
|
|
11509
|
+
},
|
|
11510
|
+
"additionalProperties": false
|
|
11511
|
+
},
|
|
11512
|
+
"inboxAckResult": {
|
|
11513
|
+
"type": "object",
|
|
11514
|
+
"required": [
|
|
11515
|
+
"ok",
|
|
11516
|
+
"acknowledged",
|
|
11517
|
+
"unknown"
|
|
11518
|
+
],
|
|
11519
|
+
"properties": {
|
|
11520
|
+
"ok": {
|
|
11521
|
+
"const": true
|
|
11522
|
+
},
|
|
11523
|
+
"acknowledged": {
|
|
11524
|
+
"type": "array",
|
|
11525
|
+
"items": {
|
|
11526
|
+
"type": "string"
|
|
11527
|
+
}
|
|
11528
|
+
},
|
|
11529
|
+
"unknown": {
|
|
11530
|
+
"type": "array",
|
|
11531
|
+
"items": {
|
|
11532
|
+
"type": "string"
|
|
11533
|
+
}
|
|
11534
|
+
}
|
|
11535
|
+
},
|
|
11536
|
+
"additionalProperties": false
|
|
11537
|
+
},
|
|
11538
|
+
"dispatchWaitResult": {
|
|
11539
|
+
"type": "object",
|
|
11540
|
+
"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.",
|
|
11541
|
+
"required": [
|
|
11542
|
+
"ok",
|
|
11543
|
+
"outcome"
|
|
11544
|
+
],
|
|
11545
|
+
"properties": {
|
|
11546
|
+
"ok": {
|
|
11547
|
+
"type": "boolean",
|
|
11548
|
+
"description": "true only for outcome report."
|
|
11549
|
+
},
|
|
11550
|
+
"outcome": {
|
|
11551
|
+
"enum": [
|
|
11552
|
+
"report",
|
|
11553
|
+
"missing",
|
|
11554
|
+
"blocked",
|
|
11555
|
+
"exited",
|
|
11556
|
+
"gone",
|
|
11557
|
+
"timeout",
|
|
11558
|
+
"indeterminate"
|
|
11559
|
+
]
|
|
11560
|
+
},
|
|
11561
|
+
"paneId": {
|
|
11562
|
+
"type": "string"
|
|
11563
|
+
},
|
|
11564
|
+
"paneName": {
|
|
11565
|
+
"type": "string"
|
|
11566
|
+
},
|
|
11567
|
+
"panelId": {
|
|
11568
|
+
"type": "string"
|
|
11569
|
+
},
|
|
11570
|
+
"generation": {
|
|
11571
|
+
"type": "number",
|
|
11572
|
+
"description": "The journal entry that ended the wait (on timeout, the position reached)."
|
|
11573
|
+
},
|
|
11574
|
+
"at": {
|
|
11575
|
+
"type": "string"
|
|
11576
|
+
},
|
|
11577
|
+
"report": {
|
|
11578
|
+
"type": "object",
|
|
11579
|
+
"required": [
|
|
11580
|
+
"state"
|
|
11581
|
+
],
|
|
11582
|
+
"properties": {
|
|
11583
|
+
"state": {
|
|
11584
|
+
"enum": [
|
|
11585
|
+
"ready",
|
|
11586
|
+
"blocked",
|
|
11587
|
+
"failed",
|
|
11588
|
+
"done"
|
|
11589
|
+
]
|
|
11590
|
+
},
|
|
11591
|
+
"pr": {
|
|
11592
|
+
"type": "number"
|
|
11593
|
+
},
|
|
11594
|
+
"head": {
|
|
11595
|
+
"type": "string"
|
|
11596
|
+
},
|
|
11597
|
+
"summary": {
|
|
11598
|
+
"type": "string"
|
|
11599
|
+
},
|
|
11600
|
+
"summaryTruncated": {
|
|
11601
|
+
"const": true
|
|
11602
|
+
},
|
|
11603
|
+
"summaryPath": {
|
|
11604
|
+
"type": "string"
|
|
11605
|
+
},
|
|
11606
|
+
"question": {
|
|
11607
|
+
"type": "string"
|
|
11608
|
+
}
|
|
11609
|
+
},
|
|
11610
|
+
"additionalProperties": false
|
|
11611
|
+
},
|
|
11612
|
+
"screenLines": {
|
|
11613
|
+
"type": "array",
|
|
11614
|
+
"items": {
|
|
11615
|
+
"type": "string"
|
|
11616
|
+
}
|
|
11617
|
+
},
|
|
11618
|
+
"lastOutput": {
|
|
11619
|
+
"type": "string"
|
|
11620
|
+
},
|
|
11621
|
+
"lastOutputSource": {
|
|
11622
|
+
"enum": [
|
|
11623
|
+
"transcript",
|
|
11624
|
+
"screen"
|
|
11625
|
+
]
|
|
11626
|
+
},
|
|
11627
|
+
"reason": {
|
|
11628
|
+
"type": "string"
|
|
11629
|
+
},
|
|
11630
|
+
"exitCode": {
|
|
11631
|
+
"type": "number"
|
|
11632
|
+
},
|
|
11633
|
+
"nextCommand": {
|
|
11634
|
+
"type": "string",
|
|
11635
|
+
"description": "Recovery command when the outcome is indeterminate."
|
|
11636
|
+
}
|
|
11637
|
+
},
|
|
11638
|
+
"additionalProperties": false
|
|
10932
11639
|
}
|
|
10933
11640
|
},
|
|
10934
11641
|
"agentContext": {
|
|
@@ -11809,7 +12516,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11809
12516
|
{
|
|
11810
12517
|
"name": "--as-file-pointer",
|
|
11811
12518
|
"required": false,
|
|
11812
|
-
"description": "Write the prompt or text to a private file
|
|
12519
|
+
"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."
|
|
12520
|
+
},
|
|
12521
|
+
{
|
|
12522
|
+
"name": "--attach",
|
|
12523
|
+
"required": false,
|
|
12524
|
+
"value": "<file>",
|
|
12525
|
+
"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`."
|
|
11813
12526
|
},
|
|
11814
12527
|
{
|
|
11815
12528
|
"name": "--from-json",
|
|
@@ -11885,6 +12598,27 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11885
12598
|
"value": "<path>",
|
|
11886
12599
|
"required": false,
|
|
11887
12600
|
"description": "Connect to a specific Pane data directory."
|
|
12601
|
+
},
|
|
12602
|
+
{
|
|
12603
|
+
"name": "--expect-report",
|
|
12604
|
+
"required": false,
|
|
12605
|
+
"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."
|
|
12606
|
+
},
|
|
12607
|
+
{
|
|
12608
|
+
"name": "--no-expect-report",
|
|
12609
|
+
"required": false,
|
|
12610
|
+
"description": "Fire-and-forget input: don't wait for a report."
|
|
12611
|
+
},
|
|
12612
|
+
{
|
|
12613
|
+
"name": "--wait",
|
|
12614
|
+
"required": false,
|
|
12615
|
+
"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."
|
|
12616
|
+
},
|
|
12617
|
+
{
|
|
12618
|
+
"name": "--timeout",
|
|
12619
|
+
"value": "<duration>",
|
|
12620
|
+
"required": false,
|
|
12621
|
+
"description": "With --wait: give up after this long and exit 124 (outcome timeout)."
|
|
11888
12622
|
}
|
|
11889
12623
|
],
|
|
11890
12624
|
"examples": [
|
|
@@ -11906,7 +12640,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11906
12640
|
"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.",
|
|
11907
12641
|
"The built-in agent templates come from the runpane contract; custom terminal commands can pass agent-specific flags when requested by the user.",
|
|
11908
12642
|
"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.",
|
|
11909
|
-
"`--as-file-pointer` writes the text to `<pane-dir>/prompts/<pane-id
|
|
12643
|
+
"`--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.",
|
|
12644
|
+
"`--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`.",
|
|
11910
12645
|
"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.",
|
|
11911
12646
|
"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.",
|
|
11912
12647
|
"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.",
|
|
@@ -12610,7 +13345,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12610
13345
|
{
|
|
12611
13346
|
"name": "--as-file-pointer",
|
|
12612
13347
|
"required": false,
|
|
12613
|
-
"description": "Write the prompt or text to a private file
|
|
13348
|
+
"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."
|
|
13349
|
+
},
|
|
13350
|
+
{
|
|
13351
|
+
"name": "--attach",
|
|
13352
|
+
"required": false,
|
|
13353
|
+
"value": "<file>",
|
|
13354
|
+
"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`."
|
|
12614
13355
|
},
|
|
12615
13356
|
{
|
|
12616
13357
|
"name": "--interrupt",
|
|
@@ -12632,9 +13373,31 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12632
13373
|
"value": "<path>",
|
|
12633
13374
|
"required": false,
|
|
12634
13375
|
"description": "Connect to a specific Pane data directory."
|
|
13376
|
+
},
|
|
13377
|
+
{
|
|
13378
|
+
"name": "--expect-report",
|
|
13379
|
+
"required": false,
|
|
13380
|
+
"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."
|
|
13381
|
+
},
|
|
13382
|
+
{
|
|
13383
|
+
"name": "--no-expect-report",
|
|
13384
|
+
"required": false,
|
|
13385
|
+
"description": "Fire-and-forget input: don't wait for a report."
|
|
13386
|
+
},
|
|
13387
|
+
{
|
|
13388
|
+
"name": "--wait",
|
|
13389
|
+
"required": false,
|
|
13390
|
+
"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."
|
|
13391
|
+
},
|
|
13392
|
+
{
|
|
13393
|
+
"name": "--timeout",
|
|
13394
|
+
"value": "<duration>",
|
|
13395
|
+
"required": false,
|
|
13396
|
+
"description": "With --wait: give up after this long and exit 124 (outcome timeout)."
|
|
12635
13397
|
}
|
|
12636
13398
|
],
|
|
12637
13399
|
"examples": [
|
|
13400
|
+
"runpane panels submit --panel <panel-id> --input-file prompt.md --as-file-pointer --wait --yes",
|
|
12638
13401
|
"runpane panels submit --panel <panel-id> --text \"2\" --yes --json",
|
|
12639
13402
|
"printf \"echo hello\" | runpane panels submit --panel <panel-id> --input-file - --yes --json",
|
|
12640
13403
|
"runpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --json",
|
|
@@ -12650,7 +13413,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12650
13413
|
"Use `panels input` for Ctrl-C, escape sequences, or any workflow requiring exact bytes.",
|
|
12651
13414
|
"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`.",
|
|
12652
13415
|
"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.",
|
|
12653
|
-
"`--as-file-pointer` writes the text to `<pane-dir>/prompts/<pane-id
|
|
13416
|
+
"`--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.",
|
|
13417
|
+
"`--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`.",
|
|
12654
13418
|
"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."
|
|
12655
13419
|
]
|
|
12656
13420
|
},
|
|
@@ -12876,7 +13640,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12876
13640
|
{
|
|
12877
13641
|
"name": "--as-file-pointer",
|
|
12878
13642
|
"required": false,
|
|
12879
|
-
"description": "Write the prompt or text to a private file
|
|
13643
|
+
"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."
|
|
13644
|
+
},
|
|
13645
|
+
{
|
|
13646
|
+
"name": "--attach",
|
|
13647
|
+
"required": false,
|
|
13648
|
+
"value": "<file>",
|
|
13649
|
+
"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`."
|
|
12880
13650
|
},
|
|
12881
13651
|
{
|
|
12882
13652
|
"name": "--source",
|
|
@@ -12920,6 +13690,27 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12920
13690
|
"value": "<path>",
|
|
12921
13691
|
"required": false,
|
|
12922
13692
|
"description": "Connect to a specific Pane data directory."
|
|
13693
|
+
},
|
|
13694
|
+
{
|
|
13695
|
+
"name": "--expect-report",
|
|
13696
|
+
"required": false,
|
|
13697
|
+
"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."
|
|
13698
|
+
},
|
|
13699
|
+
{
|
|
13700
|
+
"name": "--no-expect-report",
|
|
13701
|
+
"required": false,
|
|
13702
|
+
"description": "Fire-and-forget input: don't wait for a report."
|
|
13703
|
+
},
|
|
13704
|
+
{
|
|
13705
|
+
"name": "--wait",
|
|
13706
|
+
"required": false,
|
|
13707
|
+
"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."
|
|
13708
|
+
},
|
|
13709
|
+
{
|
|
13710
|
+
"name": "--timeout",
|
|
13711
|
+
"value": "<duration>",
|
|
13712
|
+
"required": false,
|
|
13713
|
+
"description": "With --wait: give up after this long and exit 124 (outcome timeout)."
|
|
12923
13714
|
}
|
|
12924
13715
|
],
|
|
12925
13716
|
"examples": [
|
|
@@ -13207,7 +13998,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13207
13998
|
"name": "--min-interval",
|
|
13208
13999
|
"value": "<duration>",
|
|
13209
14000
|
"required": false,
|
|
13210
|
-
"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."
|
|
14001
|
+
"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."
|
|
13211
14002
|
},
|
|
13212
14003
|
{
|
|
13213
14004
|
"name": "--idle-after",
|
|
@@ -13293,7 +14084,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13293
14084
|
"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.",
|
|
13294
14085
|
"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.",
|
|
13295
14086
|
"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.",
|
|
13296
|
-
"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.",
|
|
14087
|
+
"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.",
|
|
13297
14088
|
"--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.",
|
|
13298
14089
|
"--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."
|
|
13299
14090
|
]
|
|
@@ -14278,7 +15069,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14278
15069
|
{
|
|
14279
15070
|
"name": "--as-file-pointer",
|
|
14280
15071
|
"required": false,
|
|
14281
|
-
"description": "Write the prompt or text to a private file
|
|
15072
|
+
"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."
|
|
14282
15073
|
},
|
|
14283
15074
|
{
|
|
14284
15075
|
"name": "--yes",
|
|
@@ -14307,7 +15098,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14307
15098
|
"notes": [
|
|
14308
15099
|
"`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.",
|
|
14309
15100
|
"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`.",
|
|
14310
|
-
"`--as-file-pointer` writes the text to `<pane-dir>/prompts/<pane-id
|
|
15101
|
+
"`--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."
|
|
14311
15102
|
]
|
|
14312
15103
|
},
|
|
14313
15104
|
"report": {
|
|
@@ -14585,7 +15376,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14585
15376
|
"sessionOverviewResult"
|
|
14586
15377
|
],
|
|
14587
15378
|
"notes": [
|
|
14588
|
-
"The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`)."
|
|
15379
|
+
"The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`).",
|
|
15380
|
+
"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`."
|
|
14589
15381
|
]
|
|
14590
15382
|
},
|
|
14591
15383
|
"lock acquire": {
|
|
@@ -14922,8 +15714,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14922
15714
|
},
|
|
14923
15715
|
"handoff": {
|
|
14924
15716
|
"name": "handoff",
|
|
14925
|
-
"summary": "Hand your task to
|
|
14926
|
-
"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.",
|
|
15717
|
+
"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.",
|
|
15718
|
+
"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.",
|
|
14927
15719
|
"requiresPaneDaemon": true,
|
|
14928
15720
|
"mutates": true,
|
|
14929
15721
|
"arguments": [
|
|
@@ -14978,6 +15770,11 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14978
15770
|
"required": false,
|
|
14979
15771
|
"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."
|
|
14980
15772
|
},
|
|
15773
|
+
{
|
|
15774
|
+
"name": "--note-only",
|
|
15775
|
+
"required": false,
|
|
15776
|
+
"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."
|
|
15777
|
+
},
|
|
14981
15778
|
{
|
|
14982
15779
|
"name": "--dry-run",
|
|
14983
15780
|
"required": false,
|
|
@@ -15002,7 +15799,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
15002
15799
|
"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.",
|
|
15003
15800
|
"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.",
|
|
15004
15801
|
"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.",
|
|
15005
|
-
"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."
|
|
15802
|
+
"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.",
|
|
15803
|
+
"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)."
|
|
15006
15804
|
]
|
|
15007
15805
|
},
|
|
15008
15806
|
"sessions unpin": {
|
|
@@ -15119,7 +15917,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
15119
15917
|
"prWatchResult"
|
|
15120
15918
|
],
|
|
15121
15919
|
"notes": [
|
|
15122
|
-
"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.",
|
|
15920
|
+
"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.",
|
|
15123
15921
|
"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."
|
|
15124
15922
|
]
|
|
15125
15923
|
},
|
|
@@ -15161,7 +15959,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
15161
15959
|
"prWatchResult"
|
|
15162
15960
|
],
|
|
15163
15961
|
"notes": [
|
|
15164
|
-
"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.",
|
|
15962
|
+
"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.",
|
|
15165
15963
|
"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."
|
|
15166
15964
|
]
|
|
15167
15965
|
},
|
|
@@ -15197,9 +15995,90 @@ exports.RUNPANE_CONTRACT = {
|
|
|
15197
15995
|
"prWatchResult"
|
|
15198
15996
|
],
|
|
15199
15997
|
"notes": [
|
|
15200
|
-
"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.",
|
|
15998
|
+
"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.",
|
|
15201
15999
|
"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."
|
|
15202
16000
|
]
|
|
16001
|
+
},
|
|
16002
|
+
"inbox": {
|
|
16003
|
+
"name": "inbox",
|
|
16004
|
+
"summary": "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.",
|
|
16005
|
+
"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.",
|
|
16006
|
+
"requiresPaneDaemon": true,
|
|
16007
|
+
"mutates": false,
|
|
16008
|
+
"arguments": [
|
|
16009
|
+
{
|
|
16010
|
+
"name": "--session",
|
|
16011
|
+
"value": "<id|name>",
|
|
16012
|
+
"required": false,
|
|
16013
|
+
"description": "Session; defaults to PANE_ORCHESTRATION_SESSION_ID."
|
|
16014
|
+
},
|
|
16015
|
+
{
|
|
16016
|
+
"name": "--json",
|
|
16017
|
+
"required": false,
|
|
16018
|
+
"description": "Print machine-readable output."
|
|
16019
|
+
},
|
|
16020
|
+
{
|
|
16021
|
+
"name": "--pane-dir",
|
|
16022
|
+
"value": "<path>",
|
|
16023
|
+
"required": false,
|
|
16024
|
+
"description": "Connect to a specific Pane data directory."
|
|
16025
|
+
}
|
|
16026
|
+
],
|
|
16027
|
+
"examples": [
|
|
16028
|
+
"runpane inbox --session \"$PANE_ORCHESTRATION_SESSION_ID\" --json"
|
|
16029
|
+
],
|
|
16030
|
+
"jsonSchemas": [
|
|
16031
|
+
"inboxListResult"
|
|
16032
|
+
],
|
|
16033
|
+
"notes": [
|
|
16034
|
+
"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.",
|
|
16035
|
+
"A newer report replaces the panel's older report or missing report."
|
|
16036
|
+
]
|
|
16037
|
+
},
|
|
16038
|
+
"inbox ack": {
|
|
16039
|
+
"name": "inbox ack",
|
|
16040
|
+
"summary": "Clear Session inbox items once they are handled.",
|
|
16041
|
+
"details": "Acknowledge each item once you have acted on it, so the hook stops repeating it.",
|
|
16042
|
+
"requiresPaneDaemon": true,
|
|
16043
|
+
"mutates": true,
|
|
16044
|
+
"arguments": [
|
|
16045
|
+
{
|
|
16046
|
+
"name": "<item-id>...",
|
|
16047
|
+
"required": false,
|
|
16048
|
+
"description": "Item ids from `runpane inbox`."
|
|
16049
|
+
},
|
|
16050
|
+
{
|
|
16051
|
+
"name": "--session",
|
|
16052
|
+
"value": "<id|name>",
|
|
16053
|
+
"required": false,
|
|
16054
|
+
"description": "Only clear items of this Session; required with --all."
|
|
16055
|
+
},
|
|
16056
|
+
{
|
|
16057
|
+
"name": "--all",
|
|
16058
|
+
"required": false,
|
|
16059
|
+
"description": "Clear every item of the Session."
|
|
16060
|
+
},
|
|
16061
|
+
{
|
|
16062
|
+
"name": "--json",
|
|
16063
|
+
"required": false,
|
|
16064
|
+
"description": "Print machine-readable output."
|
|
16065
|
+
},
|
|
16066
|
+
{
|
|
16067
|
+
"name": "--pane-dir",
|
|
16068
|
+
"value": "<path>",
|
|
16069
|
+
"required": false,
|
|
16070
|
+
"description": "Connect to a specific Pane data directory."
|
|
16071
|
+
}
|
|
16072
|
+
],
|
|
16073
|
+
"examples": [
|
|
16074
|
+
"runpane inbox ack in-1a2b3c4d --json"
|
|
16075
|
+
],
|
|
16076
|
+
"jsonSchemas": [
|
|
16077
|
+
"inboxAckResult"
|
|
16078
|
+
],
|
|
16079
|
+
"notes": [
|
|
16080
|
+
"Unknown ids are reported under `unknown`; acknowledging twice is harmless."
|
|
16081
|
+
]
|
|
15203
16082
|
}
|
|
15204
16083
|
},
|
|
15205
16084
|
"managedBlock": [
|