runpane 2.4.180 → 2.4.182
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 +28 -1
- package/dist/agentTasks.d.ts.map +1 -1
- package/dist/agentTasks.js +8 -3
- package/dist/agentTasks.js.map +1 -1
- package/dist/boundaryDecoder.d.ts +32 -0
- package/dist/boundaryDecoder.d.ts.map +1 -1
- package/dist/boundaryDecoder.js +90 -6
- package/dist/boundaryDecoder.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +3 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +21 -0
- package/dist/commands.js.map +1 -1
- package/dist/docs-index.json +1 -1
- package/dist/generated/contract.d.ts +572 -57
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +953 -116
- package/dist/generated/contract.js.map +1 -1
- package/dist/handoff.d.ts.map +1 -1
- package/dist/handoff.js +96 -1
- package/dist/handoff.js.map +1 -1
- package/dist/localControl.d.ts +93 -1
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +275 -79
- package/dist/localControl.js.map +1 -1
- package/dist/mcpTools.d.ts.map +1 -1
- package/dist/mcpTools.js +3 -2
- package/dist/mcpTools.js.map +1 -1
- package/dist/sessionPayload.d.ts +77 -0
- package/dist/sessionPayload.d.ts.map +1 -0
- package/dist/sessionPayload.js +99 -0
- package/dist/sessionPayload.js.map +1 -0
- package/dist/watchLines.d.ts +1 -1
- package/dist/watchLines.d.ts.map +1 -1
- package/dist/watchLines.js +4 -1
- package/dist/watchLines.js.map +1 -1
- package/package.json +1 -1
|
@@ -375,7 +375,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
375
375
|
},
|
|
376
376
|
{
|
|
377
377
|
"name": "handoff",
|
|
378
|
-
"summary": "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it.",
|
|
378
|
+
"summary": "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. From a Session's terminal, create the Session on another machine instead.",
|
|
379
379
|
"usage": [
|
|
380
380
|
"runpane handoff --template",
|
|
381
381
|
"runpane handoff \"<destination>\" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]"
|
|
@@ -390,7 +390,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
390
390
|
"name": "watch",
|
|
391
391
|
"summary": "Wait for workspace agent and Pane transitions using a daemon-held cursor.",
|
|
392
392
|
"usage": [
|
|
393
|
-
"runpane watch [--as <name>|--since <generation>] [--follow] [--format <lines|json>] [--heartbeat <seconds>] [--idle-after <ms>] [--settle <ms>] [--blocked-settle <ms>] [--min-interval <ms>] [--idle-backoff] [--all-managed|--pane <id>|--session <id|name>] [--include-shells] [--self-test] [--quiet] [--kinds <kind,...>] [--repo <selector>] [--name-contains <text>] [--timeout-ms <ms>] [--from <now|earliest>] [--json] [--pane-dir <path>]"
|
|
393
|
+
"runpane watch [--as <name>|--since <generation>] [--follow|--until-event] [--format <lines|json>] [--heartbeat <seconds>] [--idle-after <ms>] [--settle <ms>] [--blocked-settle <ms>] [--min-interval <ms>] [--idle-backoff] [--all-managed|--pane <id>|--session <id|name>] [--include-shells] [--self-test] [--quiet] [--kinds <kind,...>] [--repo <selector>] [--name-contains <text>] [--timeout-ms <ms>] [--from <now|earliest>] [--json] [--pane-dir <path>]"
|
|
394
394
|
],
|
|
395
395
|
"toolsets": [
|
|
396
396
|
"agents"
|
|
@@ -663,6 +663,25 @@ exports.RUNPANE_CONTRACT = {
|
|
|
663
663
|
],
|
|
664
664
|
"localControl": true
|
|
665
665
|
},
|
|
666
|
+
{
|
|
667
|
+
"name": "panels resume",
|
|
668
|
+
"summary": "Restart a stopped terminal panel in place, resuming its agent's conversation.",
|
|
669
|
+
"usage": [
|
|
670
|
+
"runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]",
|
|
671
|
+
"runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]"
|
|
672
|
+
],
|
|
673
|
+
"mutates": true,
|
|
674
|
+
"additive": true,
|
|
675
|
+
"idempotent": true,
|
|
676
|
+
"toolsets": [
|
|
677
|
+
"panels"
|
|
678
|
+
],
|
|
679
|
+
"jsonSchemas": [
|
|
680
|
+
"panelResumeResult",
|
|
681
|
+
"panelResumeManyResult"
|
|
682
|
+
],
|
|
683
|
+
"localControl": true
|
|
684
|
+
},
|
|
666
685
|
{
|
|
667
686
|
"name": "panels last-message",
|
|
668
687
|
"summary": "Read an agent's last reply from its transcript, without scraping the screen.",
|
|
@@ -1557,7 +1576,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1557
1576
|
{
|
|
1558
1577
|
"name": "--file",
|
|
1559
1578
|
"value": "<path>",
|
|
1560
|
-
"description": "File inside the Pane worktree to open; supported formats have read-only previews,
|
|
1579
|
+
"description": "File inside the Pane worktree to open; supported formats have read-only previews, and HTML opens as editable source."
|
|
1561
1580
|
},
|
|
1562
1581
|
{
|
|
1563
1582
|
"name": "--initial-input",
|
|
@@ -1808,7 +1827,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1808
1827
|
},
|
|
1809
1828
|
{
|
|
1810
1829
|
"name": "--wait-ready",
|
|
1811
|
-
"description": "Wait
|
|
1830
|
+
"description": "Wait until each created panel's agent is at its input box, then deliver and verify any starting message, before returning."
|
|
1812
1831
|
},
|
|
1813
1832
|
{
|
|
1814
1833
|
"name": "--no-focus",
|
|
@@ -1862,6 +1881,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1862
1881
|
"name": "--follow",
|
|
1863
1882
|
"description": "Continue waiting for workspace events until interrupted."
|
|
1864
1883
|
},
|
|
1884
|
+
{
|
|
1885
|
+
"name": "--until-event",
|
|
1886
|
+
"description": "Watch only: wait across daemon calls for the first matching event, print it, and exit 0. --timeout-ms becomes the total deadline (exit 124). For harnesses that wake an agent when a process exits."
|
|
1887
|
+
},
|
|
1865
1888
|
{
|
|
1866
1889
|
"name": "--ack-now",
|
|
1867
1890
|
"description": "Advance a named cursor immediately for at-most-once delivery."
|
|
@@ -1874,6 +1897,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1874
1897
|
"name": "--agents-only",
|
|
1875
1898
|
"description": "Limit workspace events to CLI agent panels."
|
|
1876
1899
|
},
|
|
1900
|
+
{
|
|
1901
|
+
"name": "--all-stopped",
|
|
1902
|
+
"description": "Resume every stopped agent panel in every non-archived Pane."
|
|
1903
|
+
},
|
|
1877
1904
|
{
|
|
1878
1905
|
"name": "--all-managed",
|
|
1879
1906
|
"description": "Watch every non-archived, non-hidden managed pane. This is the default scope; the flag states it explicitly and cannot be combined with --pane."
|
|
@@ -1911,7 +1938,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1911
1938
|
},
|
|
1912
1939
|
{
|
|
1913
1940
|
"name": "--template",
|
|
1914
|
-
"description": "Print the handoff note template, with this checkout's origin and git state filled in."
|
|
1941
|
+
"description": "Print the handoff note template, with this checkout's (or Session's) origin and git state filled in."
|
|
1915
1942
|
},
|
|
1916
1943
|
{
|
|
1917
1944
|
"name": "--push",
|
|
@@ -1959,6 +1986,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1959
1986
|
" runpane workspace list [--json]",
|
|
1960
1987
|
" runpane workspace <machine> read|write|exec|<command>",
|
|
1961
1988
|
" runpane watch --follow",
|
|
1989
|
+
" runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
1962
1990
|
" runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]",
|
|
1963
1991
|
" runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes",
|
|
1964
1992
|
" runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes",
|
|
@@ -1970,6 +1998,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1970
1998
|
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]",
|
|
1971
1999
|
" runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]",
|
|
1972
2000
|
" runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]",
|
|
2001
|
+
" runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]",
|
|
1973
2002
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json]",
|
|
1974
2003
|
" runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]",
|
|
1975
2004
|
" runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
|
|
@@ -2163,7 +2192,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2163
2192
|
"",
|
|
2164
2193
|
"Lists Pane sessions. Pass --repo to limit results to one saved repository.",
|
|
2165
2194
|
"",
|
|
2166
|
-
"status is running while
|
|
2195
|
+
"status is running while a tool or agent terminal is live; the dock shell does not count. agentState is the most urgent state of the live agent panels: blocked, working, ready, or none.",
|
|
2167
2196
|
"",
|
|
2168
2197
|
"Options:",
|
|
2169
2198
|
" --repo <selector> active, id, exact path, or saved repository name",
|
|
@@ -2207,7 +2236,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2207
2236
|
],
|
|
2208
2237
|
"watch": [
|
|
2209
2238
|
"Usage:",
|
|
2210
|
-
" runpane watch [--as <name>|--since <generation>] [--follow] [options]",
|
|
2239
|
+
" runpane watch [--as <name>|--since <generation>] [--follow|--until-event] [options]",
|
|
2211
2240
|
"",
|
|
2212
2241
|
"Waits for agent state, Pane lifecycle, and panel exit transitions without polling.",
|
|
2213
2242
|
"",
|
|
@@ -2216,6 +2245,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2216
2245
|
" --since <generation> Use an explicit cursor instead",
|
|
2217
2246
|
" --from <now|earliest> Starting point for a new named cursor",
|
|
2218
2247
|
" --follow Continue waiting until interrupted",
|
|
2248
|
+
" --until-event Exit 0 after the first event; --timeout-ms is the total deadline (exit 124)",
|
|
2219
2249
|
" --format <lines|json> Output format; lines is the follow default",
|
|
2220
2250
|
" --heartbeat <seconds> Healthy-silence bound; defaults to 60 under --follow",
|
|
2221
2251
|
" --idle-after <ms> Re-firing READY idle interval; defaults to 600000 under --follow",
|
|
@@ -2235,7 +2265,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2235
2265
|
" --session <id|name> Follow every Pane in a named Session; associate/detach apply live",
|
|
2236
2266
|
" --repo <selector> Limit to a saved repository",
|
|
2237
2267
|
" --name-contains <text> Limit by Pane name substring",
|
|
2238
|
-
" --timeout-ms <ms> Wait timeout; 0 polls once",
|
|
2268
|
+
" --timeout-ms <ms> Wait timeout; 0 polls once; the total deadline with --until-event",
|
|
2239
2269
|
" --limit <count> Maximum entries per response",
|
|
2240
2270
|
" --ack-now Use at-most-once named-cursor delivery",
|
|
2241
2271
|
" --include-held-input Include unsubmitted composer text in JSON",
|
|
@@ -2245,6 +2275,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2245
2275
|
"",
|
|
2246
2276
|
"Defaults are responsive: no settle, no batching, all kinds, IDLE every --idle-after. BUSY carries no action; drop it with --kinds.",
|
|
2247
2277
|
"agent.report (a worker ran `runpane report`) is opt-in: list it in --kinds. REPORT lines skip the --min-interval batch.",
|
|
2278
|
+
"--follow and --until-event imply --agents-only, except for agent.report: a report from any panel, a shell tab included, still arrives.",
|
|
2279
|
+
"Exit-to-wake (Claude Code background Bash, Codex, any harness that wakes when a process exits): runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
2280
|
+
" Run it as a background task; when it exits, act on its line, then run it again. Never pipe --follow into grep -m1 or head to wait.",
|
|
2248
2281
|
"Unattended (Pane Chat default): --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
2249
2282
|
"User present: the same kinds with --settle 60000 --blocked-settle 15000 --min-interval 120000 and no --idle-backoff",
|
|
2250
2283
|
"Session orchestrator: runpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
@@ -2278,7 +2311,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2278
2311
|
" --prompt-file <path|-> Alias for --initial-input-file",
|
|
2279
2312
|
" --from-json <path|-> Read a full request payload",
|
|
2280
2313
|
" --timeout-ms <milliseconds> Pane creation timeout",
|
|
2281
|
-
" --wait-ready Wait for
|
|
2314
|
+
" --wait-ready Wait for the agent's input box, then deliver and verify the prompt",
|
|
2282
2315
|
" --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000",
|
|
2283
2316
|
" --concurrency <count> Accepted; creation is currently serialized",
|
|
2284
2317
|
" --source <user|agent> Mark mutation source; agent implies background creation",
|
|
@@ -2303,7 +2336,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2303
2336
|
"",
|
|
2304
2337
|
"Options: --resume <id> stages the agent resume command (built-in agents only); --launch runs the command immediately; --prompt <text> or --prompt-file <path|-> and --wait-ready require --launch; --folder <name> groups the pane; --no-pinned opts out of pinning; --no-associate skips automatic Session association; --dry-run previews.",
|
|
2305
2338
|
"",
|
|
2306
|
-
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen."
|
|
2339
|
+
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."
|
|
2307
2340
|
],
|
|
2308
2341
|
"panes archive": [
|
|
2309
2342
|
"Usage:",
|
|
@@ -2394,6 +2427,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2394
2427
|
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]",
|
|
2395
2428
|
" runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]",
|
|
2396
2429
|
" runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]",
|
|
2430
|
+
" runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]",
|
|
2397
2431
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json]",
|
|
2398
2432
|
"",
|
|
2399
2433
|
"Run \"runpane help panels create\" or another command-specific topic for options."
|
|
@@ -2405,6 +2439,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2405
2439
|
"Lists tool panels in a Pane session.",
|
|
2406
2440
|
"",
|
|
2407
2441
|
"agentDetection says how Pane knows agentType: declared, command, process, or screen. launchCommand is the command the panel was launched with.",
|
|
2442
|
+
"resumeId is the saved agent session ID that reopens the panel; resumeSource says which rule uses it: agent-farm, configured, or agent.",
|
|
2408
2443
|
"",
|
|
2409
2444
|
"Options:",
|
|
2410
2445
|
" --pane <pane-id> Pane/session id",
|
|
@@ -2550,7 +2585,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2550
2585
|
" --no-focus Create the panel in the background.",
|
|
2551
2586
|
" --focus Explicitly focus the created panel.",
|
|
2552
2587
|
" --source <user|agent> Mark the mutation source; agent implies background creation.",
|
|
2553
|
-
" --wait-ready Wait
|
|
2588
|
+
" --wait-ready Wait for the agent's input box, then deliver and verify the prompt.",
|
|
2554
2589
|
" --ready-timeout-ms <ms> Readiness wait timeout.",
|
|
2555
2590
|
" --yes Skip confirmation prompts.",
|
|
2556
2591
|
" --json Print JSON output."
|
|
@@ -2561,7 +2596,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2561
2596
|
"Usage:",
|
|
2562
2597
|
" runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]",
|
|
2563
2598
|
"",
|
|
2564
|
-
"Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats
|
|
2599
|
+
"Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
|
|
2565
2600
|
"",
|
|
2566
2601
|
"Options:",
|
|
2567
2602
|
" --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.",
|
|
@@ -2982,6 +3017,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2982
3017
|
"Hands back a worker's structured report for its panel: the orchestrator receives it as an",
|
|
2983
3018
|
"agent.report watch event and reads it in `agents status` and `sessions overview`.",
|
|
2984
3019
|
"Inside a Pane terminal the panel comes from PANE_SESSION_ID and PANE_PANEL_ID.",
|
|
3020
|
+
"It prints how many watches were waiting and received it (\"Delivered to 1 waiting watcher.\"). With no Session and",
|
|
3021
|
+
"nobody waiting, the report is still stored: a named-cursor watch receives it when it next waits.",
|
|
2985
3022
|
"",
|
|
2986
3023
|
"Options:",
|
|
2987
3024
|
" --state <state> ready, blocked, failed, or done",
|
|
@@ -2998,6 +3035,37 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2998
3035
|
"Example:",
|
|
2999
3036
|
" runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md"
|
|
3000
3037
|
],
|
|
3038
|
+
"panels resume": [
|
|
3039
|
+
"Usage:",
|
|
3040
|
+
" runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]",
|
|
3041
|
+
" runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]",
|
|
3042
|
+
"",
|
|
3043
|
+
"Restarts a stopped terminal panel in the same panel, keeping its panel id. An agent panel",
|
|
3044
|
+
"relaunches with its resume command (Claude --resume <session>, codex resume <session>, Cursor",
|
|
3045
|
+
"--resume), the same restart the app runs when it shows the panel. Nothing takes focus. A panel",
|
|
3046
|
+
"whose agent exited back to its shell counts as stopped: its saved command runs again in that",
|
|
3047
|
+
"shell. A panel that is already running is left alone and reported as already-running.",
|
|
3048
|
+
"",
|
|
3049
|
+
"With --session or --all-stopped it resumes every stopped agent panel in that scope (a",
|
|
3050
|
+
"Session's associated Panes, or every Pane), --concurrency at a time, skips running ones,",
|
|
3051
|
+
"and returns one result per panel. With --wait-ready the resumed panels then wait together,",
|
|
3052
|
+
"and each result carries its own readiness and blocker. One panel failing does not stop the others.",
|
|
3053
|
+
"",
|
|
3054
|
+
"Options:",
|
|
3055
|
+
" --panel <panel-id> Terminal panel id",
|
|
3056
|
+
" --session <id|name> Resume the stopped agent panels of this Session's associated Panes",
|
|
3057
|
+
" --all-stopped Resume the stopped agent panels of every Pane",
|
|
3058
|
+
" --concurrency <count> Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10",
|
|
3059
|
+
" --wait-ready Wait until the resumed agent is ready; startup prompts come back as readiness.blocked",
|
|
3060
|
+
" --ready-timeout-ms <ms> Readiness wait timeout; resumed panels wait together; defaults to 30000",
|
|
3061
|
+
" --yes Skip the confirmation prompt",
|
|
3062
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
3063
|
+
" --json Print machine-readable output",
|
|
3064
|
+
"",
|
|
3065
|
+
"Examples:",
|
|
3066
|
+
" runpane panels resume --panel <panel-id> --wait-ready --yes --json",
|
|
3067
|
+
" runpane panels resume --session <id|name> --wait-ready --yes --json"
|
|
3068
|
+
],
|
|
3001
3069
|
"panels last-message": [
|
|
3002
3070
|
"Usage:",
|
|
3003
3071
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]",
|
|
@@ -3134,10 +3202,12 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3134
3202
|
"",
|
|
3135
3203
|
"Hand your task to a fresh agent. You write the note (runpane handoff --template); the CLI checks it,",
|
|
3136
3204
|
"makes sure your branch is pushed, sends the note to the destination, and starts the agent there.",
|
|
3205
|
+
"From a Session's terminal it skips git and creates the Session on the other machine, with the note as",
|
|
3206
|
+
"its next action; the new Session waits for your first message. The sender Session stays.",
|
|
3137
3207
|
"",
|
|
3138
3208
|
"Options:",
|
|
3139
3209
|
" <destination> Freeform: agent, model, effort, and machine, such as \"codex gpt-5 high on parsas-macbook-pro\".",
|
|
3140
|
-
" --template Print the note template, with this checkout's origin and git state filled in.",
|
|
3210
|
+
" --template Print the note template, with this checkout's (or Session's) origin and git state filled in.",
|
|
3141
3211
|
" --note-file <path|-> The note to check and send; every template section must be filled in.",
|
|
3142
3212
|
" --machine <name> Destination machine (Tailscale name or unique prefix); overrides the text.",
|
|
3143
3213
|
" --agent <codex|claude|cursor> Receiving agent; overrides the text.",
|
|
@@ -3145,7 +3215,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3145
3215
|
" --effort <level> minimal, low, medium, high, xhigh, or max; supported for Claude and Codex only; overrides the text. Cursor effort is rejected.",
|
|
3146
3216
|
" --repo <selector> Saved repository on the destination; defaults to the one with the same remote.",
|
|
3147
3217
|
" --push Commit uncommitted work (not the note) as WIP and push the branch first (never forces).",
|
|
3148
|
-
" --dry-run Check destination reachability, saved repo and OS; print note and git state; send nothing.",
|
|
3218
|
+
" --dry-run Check destination reachability, saved repo and OS; print note and git state; send nothing. From a Session: the name it would get.",
|
|
3149
3219
|
" --json Print machine-readable output.",
|
|
3150
3220
|
"",
|
|
3151
3221
|
"Examples:",
|
|
@@ -3186,6 +3256,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3186
3256
|
" runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]",
|
|
3187
3257
|
" runpane workspace state [--repo <selector>] [--json]",
|
|
3188
3258
|
" runpane watch --follow",
|
|
3259
|
+
" runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
3189
3260
|
" runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]",
|
|
3190
3261
|
" runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes",
|
|
3191
3262
|
" runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes",
|
|
@@ -3197,6 +3268,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3197
3268
|
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]",
|
|
3198
3269
|
" runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]",
|
|
3199
3270
|
" runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]",
|
|
3271
|
+
" runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]",
|
|
3200
3272
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json]",
|
|
3201
3273
|
" runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]",
|
|
3202
3274
|
" runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
|
|
@@ -3382,7 +3454,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3382
3454
|
"",
|
|
3383
3455
|
"Lists Pane sessions. Pass --repo to limit results to one saved repository.",
|
|
3384
3456
|
"",
|
|
3385
|
-
"status is running while
|
|
3457
|
+
"status is running while a tool or agent terminal is live; the dock shell does not count. agentState is the most urgent state of the live agent panels: blocked, working, ready, or none.",
|
|
3386
3458
|
"",
|
|
3387
3459
|
"Options:",
|
|
3388
3460
|
" --repo <selector>",
|
|
@@ -3418,7 +3490,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3418
3490
|
],
|
|
3419
3491
|
"watch": [
|
|
3420
3492
|
"Usage:",
|
|
3421
|
-
" runpane watch [--as <name>|--since <generation>] [--follow] [options]",
|
|
3493
|
+
" runpane watch [--as <name>|--since <generation>] [--follow|--until-event] [options]",
|
|
3422
3494
|
"",
|
|
3423
3495
|
"Waits for workspace transitions without polling.",
|
|
3424
3496
|
"",
|
|
@@ -3427,6 +3499,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3427
3499
|
" --since <generation>",
|
|
3428
3500
|
" --from <now|earliest>",
|
|
3429
3501
|
" --follow",
|
|
3502
|
+
" --until-event Exit 0 after the first event; --timeout-ms is the total deadline (exit 124)",
|
|
3430
3503
|
" --format <lines|json>",
|
|
3431
3504
|
" --heartbeat <seconds>",
|
|
3432
3505
|
" --idle-after <ms>",
|
|
@@ -3446,7 +3519,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3446
3519
|
" --session <id|name> Follow a named Session's Panes; no re-arm",
|
|
3447
3520
|
" --repo <selector>",
|
|
3448
3521
|
" --name-contains <text>",
|
|
3449
|
-
" --timeout-ms <ms> 0 polls once",
|
|
3522
|
+
" --timeout-ms <ms> 0 polls once; the total deadline with --until-event",
|
|
3450
3523
|
" --limit <count>",
|
|
3451
3524
|
" --ack-now",
|
|
3452
3525
|
" --include-held-input",
|
|
@@ -3456,6 +3529,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3456
3529
|
"",
|
|
3457
3530
|
"Defaults are responsive: no settle, no batching, all kinds, IDLE every --idle-after. BUSY carries no action; drop it with --kinds.",
|
|
3458
3531
|
"agent.report (a worker ran `runpane report`) is opt-in: list it in --kinds. REPORT lines skip the --min-interval batch.",
|
|
3532
|
+
"--follow and --until-event imply --agents-only, except for agent.report: a report from any panel, a shell tab included, still arrives.",
|
|
3533
|
+
"Exit-to-wake (Claude Code background Bash, Codex, any harness that wakes when a process exits): runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
3534
|
+
" Run it as a background task; when it exits, act on its line, then run it again. Never pipe --follow into grep -m1 or head to wait.",
|
|
3459
3535
|
"Unattended (Pane Chat default): --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
3460
3536
|
"User present: the same kinds with --settle 60000 --blocked-settle 15000 --min-interval 120000 and no --idle-backoff",
|
|
3461
3537
|
"Session orchestrator: runpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
@@ -3489,7 +3565,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3489
3565
|
" --prompt-file <path|-> Alias for --initial-input-file",
|
|
3490
3566
|
" --from-json <path|-> Read a full request payload",
|
|
3491
3567
|
" --timeout-ms <milliseconds> Pane creation timeout",
|
|
3492
|
-
" --wait-ready Wait for
|
|
3568
|
+
" --wait-ready Wait for the agent's input box, then deliver and verify the prompt",
|
|
3493
3569
|
" --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000",
|
|
3494
3570
|
" --concurrency <count> Accepted; creation is currently serialized",
|
|
3495
3571
|
" --source <user|agent> Mark mutation source; agent implies background creation",
|
|
@@ -3514,7 +3590,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3514
3590
|
"",
|
|
3515
3591
|
"Options: --resume <id> stages the agent resume command (built-in agents only); --launch runs the command immediately; --prompt <text> or --prompt-file <path|-> and --wait-ready require --launch; --folder <name> groups the pane; --no-pinned opts out of pinning; --no-associate skips automatic Session association; --dry-run previews.",
|
|
3516
3592
|
"",
|
|
3517
|
-
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen."
|
|
3593
|
+
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."
|
|
3518
3594
|
],
|
|
3519
3595
|
"panes archive": [
|
|
3520
3596
|
"Usage:",
|
|
@@ -3605,6 +3681,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3605
3681
|
" runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) --yes [--json]",
|
|
3606
3682
|
" runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json]",
|
|
3607
3683
|
" runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--json]",
|
|
3684
|
+
" runpane panels resume (--panel <panel-id>|--session <id|name>|--all-stopped) [--wait-ready] --yes [--json]",
|
|
3608
3685
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json]",
|
|
3609
3686
|
"",
|
|
3610
3687
|
"Run \"runpane help panels create\" or another command-specific topic for options."
|
|
@@ -3616,6 +3693,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3616
3693
|
"Lists tool panels in a Pane session.",
|
|
3617
3694
|
"",
|
|
3618
3695
|
"agentDetection says how Pane knows agentType: declared, command, process, or screen. launchCommand is the command the panel was launched with.",
|
|
3696
|
+
"resumeId is the saved agent session ID that reopens the panel; resumeSource says which rule uses it: agent-farm, configured, or agent.",
|
|
3619
3697
|
"",
|
|
3620
3698
|
"Options:",
|
|
3621
3699
|
" --pane <pane-id>",
|
|
@@ -3753,7 +3831,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3753
3831
|
" --no-focus Create the panel in the background.",
|
|
3754
3832
|
" --focus Explicitly focus the created panel.",
|
|
3755
3833
|
" --source <user|agent> Mark the mutation source; agent implies background creation.",
|
|
3756
|
-
" --wait-ready Wait
|
|
3834
|
+
" --wait-ready Wait for the agent's input box, then deliver and verify the prompt.",
|
|
3757
3835
|
" --ready-timeout-ms <ms> Readiness wait timeout.",
|
|
3758
3836
|
" --yes Skip confirmation prompts.",
|
|
3759
3837
|
" --json Print JSON output."
|
|
@@ -3764,7 +3842,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3764
3842
|
"Usage:",
|
|
3765
3843
|
" python -m runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]",
|
|
3766
3844
|
"",
|
|
3767
|
-
"Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats
|
|
3845
|
+
"Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
|
|
3768
3846
|
"",
|
|
3769
3847
|
"Options:",
|
|
3770
3848
|
" --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.",
|
|
@@ -4154,6 +4232,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4154
4232
|
"Hands back a worker's structured report for its panel: the orchestrator receives it as an",
|
|
4155
4233
|
"agent.report watch event and reads it in `agents status` and `sessions overview`.",
|
|
4156
4234
|
"Inside a Pane terminal the panel comes from PANE_SESSION_ID and PANE_PANEL_ID.",
|
|
4235
|
+
"It prints how many watches were waiting and received it (\"Delivered to 1 waiting watcher.\"). With no Session and",
|
|
4236
|
+
"nobody waiting, the report is still stored: a named-cursor watch receives it when it next waits.",
|
|
4157
4237
|
"",
|
|
4158
4238
|
"Options:",
|
|
4159
4239
|
" --state <state> ready, blocked, failed, or done",
|
|
@@ -4170,6 +4250,37 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4170
4250
|
"Example:",
|
|
4171
4251
|
" runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md"
|
|
4172
4252
|
],
|
|
4253
|
+
"panels resume": [
|
|
4254
|
+
"Usage:",
|
|
4255
|
+
" runpane panels resume --panel <panel-id> [--wait-ready] [--ready-timeout-ms <ms>] --yes [--json] [--pane-dir <path>]",
|
|
4256
|
+
" runpane panels resume (--session <id|name>|--all-stopped) [--wait-ready] [--ready-timeout-ms <ms>] [--concurrency <count>] --yes [--json] [--pane-dir <path>]",
|
|
4257
|
+
"",
|
|
4258
|
+
"Restarts a stopped terminal panel in the same panel, keeping its panel id. An agent panel",
|
|
4259
|
+
"relaunches with its resume command (Claude --resume <session>, codex resume <session>, Cursor",
|
|
4260
|
+
"--resume), the same restart the app runs when it shows the panel. Nothing takes focus. A panel",
|
|
4261
|
+
"whose agent exited back to its shell counts as stopped: its saved command runs again in that",
|
|
4262
|
+
"shell. A panel that is already running is left alone and reported as already-running.",
|
|
4263
|
+
"",
|
|
4264
|
+
"With --session or --all-stopped it resumes every stopped agent panel in that scope (a",
|
|
4265
|
+
"Session's associated Panes, or every Pane), --concurrency at a time, skips running ones,",
|
|
4266
|
+
"and returns one result per panel. With --wait-ready the resumed panels then wait together,",
|
|
4267
|
+
"and each result carries its own readiness and blocker. One panel failing does not stop the others.",
|
|
4268
|
+
"",
|
|
4269
|
+
"Options:",
|
|
4270
|
+
" --panel <panel-id> Terminal panel id",
|
|
4271
|
+
" --session <id|name> Resume the stopped agent panels of this Session's associated Panes",
|
|
4272
|
+
" --all-stopped Resume the stopped agent panels of every Pane",
|
|
4273
|
+
" --concurrency <count> Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10",
|
|
4274
|
+
" --wait-ready Wait until the resumed agent is ready; startup prompts come back as readiness.blocked",
|
|
4275
|
+
" --ready-timeout-ms <ms> Readiness wait timeout; resumed panels wait together; defaults to 30000",
|
|
4276
|
+
" --yes Skip the confirmation prompt",
|
|
4277
|
+
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
4278
|
+
" --json Print machine-readable output",
|
|
4279
|
+
"",
|
|
4280
|
+
"Examples:",
|
|
4281
|
+
" runpane panels resume --panel <panel-id> --wait-ready --yes --json",
|
|
4282
|
+
" runpane panels resume --session <id|name> --wait-ready --yes --json"
|
|
4283
|
+
],
|
|
4173
4284
|
"panels last-message": [
|
|
4174
4285
|
"Usage:",
|
|
4175
4286
|
" runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]",
|
|
@@ -4381,6 +4492,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4381
4492
|
"printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes --json",
|
|
4382
4493
|
"runpane watch --self-test",
|
|
4383
4494
|
"runpane watch --follow",
|
|
4495
|
+
"runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
4384
4496
|
"runpane watch --follow --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
4385
4497
|
"runpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
4386
4498
|
"runpane sessions list [--json] [--pane-dir <path>]",
|
|
@@ -4402,6 +4514,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4402
4514
|
"runpane agents send --pane <pane-id> --text \"Also add a test\" --yes --json",
|
|
4403
4515
|
"runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md --json",
|
|
4404
4516
|
"runpane panels last-message --panel <panel-id> --json",
|
|
4517
|
+
"runpane panels resume --panel <panel-id> --wait-ready --yes --json",
|
|
4518
|
+
"runpane panels resume --session <id|name> --wait-ready --yes --json",
|
|
4405
4519
|
"runpane docs search --query \"archive a pane\" --json",
|
|
4406
4520
|
"runpane links create --pane <pane-id> --json",
|
|
4407
4521
|
"runpane panes git-status --pane <pane-id> --json",
|
|
@@ -4426,20 +4540,20 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4426
4540
|
"`runpane panes list` lists Pane sessions, optionally scoped to one saved repository.",
|
|
4427
4541
|
"`runpane panes cost` reports estimated token costs per Pane for the last 30 days, including per-model breakdowns and cache efficiency; unscoped output includes an Unattributed bucket that reconciles against workspace totals.",
|
|
4428
4542
|
"`runpane panes create` connects to the running local Pane daemon, resolves the requested saved base repository, creates user-visible Pane sessions backed by Pane-managed worktrees/branches, opens terminal-backed tool tabs, and optionally sends initial input to the started tool. Built-in agent panes and `--source agent` default to background/no-focus unless `--focus` is passed. New Panes are pinned into the UI's favorite/pin set by default, except when the CLI runs inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID`), where child worktrees default to unpinned. Explicit `--pinned` / `--no-pinned` override creation defaults. First Session association clears an existing pin, including an explicit creation pin; use `panes pin` after association to pin a child. This avoids duplicating Session children in the global pinned list. Manual pins applied afterward are preserved. Panes created interactively in the Pane UI are unaffected. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.",
|
|
4429
|
-
"For `panes create --wait-ready`, `
|
|
4543
|
+
"For `panes create --wait-ready` (and `panels create`, `panes adopt --launch`), ready means an identified agent at its own input box: declared with `--agent`, or detected from the command, its foreground process or its screen. A `--tool-command` that never shows a supported agent is not ready: `readiness.ok` is false with `readiness.reason.code` `no-agent-detected` after the timeout, or `command-exited` as soon as the command exits back to the shell, and nothing is typed into it. `agent-not-ready` means the agent was detected but its input box was not ready in time. CLI readiness is confirmed on consecutive polls. Codex also requires a recognized configured model or context footer below its live composer; its provisional startup composer is not ready. Hidden or unrecognized Codex status lines conservatively time out rather than prove readiness. Startup prompts return blocked with the prompt's own text in blocked.message and a suggestedCommand, and Pane never answers them: first-run trust and daemon dialogs and Agent Farm's `Trust this repository workspace? [y/N]` as blocked.kind=first-run-dialog; Codex's security setup banner and any other prompt, including a wrapper's or shell's `[y/N]` before the agent appears, as agent-prompt. A starting message blocked this way is held and sent once the prompt is answered and the agent's input box is ready. Every create with a starting message returns `initialInput`. Pane stages the text in the composer, presses the agent's submit key separately (Ctrl+Enter for Codex, declared or detected), and checks where it went: `initialInput.delivery` is `taken` or `queued` (from the agent's transcript or its screen), `in-composer`, or `unknown` (`argv` means a prompt was routed at launch; Pane gives the transcript up to 10 seconds before settling on unknown). `initialInput.verifiedSubmitted` is true exactly when it is `taken` or `queued`, and the create's `ok` is false unless a Claude or Codex starting message is verified. Cursor and OpenCode have no acceptance probe: their delivery stays `unknown` with a delivery.message saying so, `verification: unverifiable`, and `ok` follows readiness. Without `--wait-ready` the create returns at once with `initialInput.verifiedSubmitted: false`, a delivery.message saying the call did not wait, and a `panels wait` nextCommand; Pane still sends the message once the agent is identified and at its input box, and gives up without typing it if no supported agent appears within 30 seconds.",
|
|
4430
4544
|
"`runpane panes archive` refreshes the configured upstream, reports exact unpushed commit evidence, and refuses unsafe archive operations unless `--force` is used. A branch whose upstream is gone counts as pushed when a merged GitHub pull request has HEAD as its head (`safetyCheck.mergedViaPr`). Add `--dry-run` to inspect the same evidence without archiving. `--remove-worktree` applies the same check and removal to an adopted worktree; local branches are always kept. Successful archives report `worktreeCleanup: completed` once the worktree is gone from its path and from git; `trashDeletion: pending` means its files are still being deleted in the background. `runpane panes archive --session <id|name> --merged` archives every Session Pane that is clean and pushed or merged, and reports a reason for each skipped Pane.",
|
|
4431
4545
|
"`runpane panes rename` trims and updates a Pane's display name without changing its worktree, branch, panels, or focus, and returns the updated pane summary.",
|
|
4432
4546
|
"`runpane panes focus` raises the Pane window and selects a Pane (and optionally one of its panels) exactly like clicking it in the UI. Because it steals the user's window focus, run it only on an explicit user request to open, focus, show, or switch to a Pane; never focus a Pane proactively, the same doctrine that keeps `panes create` background/no-focus for `--source agent`.",
|
|
4433
|
-
"`runpane panels open` opens a URL or a file from the Pane worktree as a tab in an existing Pane (default: the calling panel's Pane from `PANE_SESSION_ID`), in split view beside the agent unless `--tab` is passed. Files open in an editor tab with read-only previews for supported formats,
|
|
4434
|
-
"`runpane panels list` lists tool panels inside one Pane session.",
|
|
4547
|
+
"`runpane panels open` opens a URL or a file from the Pane worktree as a tab in an existing Pane (default: the calling panel's Pane from `PANE_SESSION_ID`), in split view beside the agent unless `--tab` is passed. Files open in an editor tab with read-only previews for supported formats, and HTML opens as editable source; an existing tab showing the same target is reused. It brings the tab forward for clients already showing that Pane, and never raises or focuses the Pane window or switches anyone's Pane.",
|
|
4548
|
+
"`runpane panels list` lists tool panels inside one Pane session. Each panel with a saved agent session ID reports it as `resumeId`, with `resumeSource` (`agent-farm`, `configured`, or `agent`) naming the rule that reopens the conversation.",
|
|
4435
4549
|
"`runpane panels output` reads bounded recent terminal output from one panel and strips common terminal control noise for agent use.",
|
|
4436
4550
|
"`runpane panels input` sends exact input bytes to one terminal panel. Prefer `--input-file` for newlines, Ctrl-C, quotes, or shell-sensitive text.",
|
|
4437
4551
|
"`runpane panes create --prompt` is an alias for `--initial-input`; request JSON and daemon payloads should use the canonical `initialInput` field.",
|
|
4438
|
-
"`runpane panes create --branch <name>` creates the Pane's worktree on exactly that new branch, slashes included (for example `agents/w5a`). The name is checked with `git check-ref-format --branch`, creation fails if the branch already exists, and Pane never renames it to make it unique. `--worktree-name` still names the directory and defaults to `--name`. `--base` is an alias for `--base-branch`, and `--prompt-file` for `--initial-input-file`. `panes create --base <ref> --branch <name> --prompt-file <file>` replaces `git worktree add` plus `panes adopt`.",
|
|
4552
|
+
"`runpane panes create --branch <name>` creates the Pane's worktree on exactly that new branch, slashes included (for example `agents/w5a`). The name is checked with `git check-ref-format --branch`, creation fails if the branch already exists, and Pane never renames it to make it unique. `--worktree-name` still names the directory and defaults to `--name`. `--base` is an alias for `--base-branch`, and `--prompt-file` for `--initial-input-file`. `panes create --base <ref> --branch <name> --prompt-file <file>` replaces `git worktree add` plus `panes adopt`. When the base is a remote-tracking branch (the default `origin/main`, or one named with `--base`), Pane fetches it first, waiting at most about 10 seconds, so the Pane starts at the remote's current tip. Each created item reports `base` (`ref`, `commit`, `refresh`); if the fetch fails the Pane still starts, from the local ref, and `base.notice` says so and how to catch up.",
|
|
4439
4553
|
"`runpane panes adopt --launch` accepts `--prompt`, `--prompt-file`, `--wait-ready`, and `--ready-timeout-ms`, and reports `readiness`, `initialInput`, and `nextCommand` like `panes create`. A prompt without `--launch` is an error rather than being dropped.",
|
|
4440
4554
|
"If composer submission cannot be verified without risking a duplicate, the create item is unsuccessful with `initialInput.staged`, `initialInput.attempts`, `initialInput.blocked.kind: submission_unverified`, and an actionable `nextCommand`. The CLI-facing `--prompt` alias maps to this canonical `initialInput` result.",
|
|
4441
4555
|
"When running from WSL while Pane is installed on Windows, the Linux wrapper may look for a missing `/tmp/pane-daemon.../daemon.sock` or resolve to a Windows shim such as Volta. In that case invoke the Windows wrapper through PowerShell from a Windows cwd, for example `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane repos list --json'`.",
|
|
4442
|
-
"`runpane watch` waits for workspace transitions from the daemon journal without polling. `--follow` keeps waiting and prints one line per event: READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT, plus HEARTBEAT every 60 seconds as proof of life. Defaults are responsive: no settle, no batching, all kinds, IDLE every `--idle-after`. Expensive consumers opt into `--kinds` (drop `agent.busy`; BUSY carries no action), `--settle <ms>` (READY only after a quiet window; a BUSY inside it cancels the line), `--blocked-settle <ms>`, `--min-interval <ms>` (batch non-urgent lines; BLOCKED bypasses it), and `--idle-backoff` (10m, 30m, 1h, 3h, then daily). Two profiles cover orchestrators. Unattended: `runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff`, which budgets about 6 wake-ups per active pane per hour worst case, usually 1-3, and can deliver READY up to about 13 minutes late. User present: the same kinds with `--settle 60000 --blocked-settle 15000 --min-interval 120000` and no `--idle-backoff`, so READY arrives within about 3 minutes. Pane Chat arms it automatically through its skill; only your own scripts need the flags. STUCK means real unsubmitted composer text, never an agent prompt suggestion. `--quiet` (alias `--no-control-lines`) drops the WATCH OK, HEARTBEAT, and WATCH RECONNECTED control lines (`_ok`, `_heartbeat`, `_reconnected` in JSON); WATCH ERROR, RESET, and DROPPED (`_error`, `_reset`, `_dropped`) always print. Judge a dead watch by a non-zero exit or a WATCH ERROR line, not by silence. `--session <id|name>` follows every Pane associated with a named Session and re-reads membership on every read, so associate and detach need no re-arm; JOINED and LEFT (`pane.associated`, `pane.detached`) report membership changes. For Session members with an open PR, the daemon polls GitHub about every 3 minutes and reports `pr.conflicted` (`PR <pane-name> pane <pane-id> #<number> CONFLICTED`), `pr.checks` (`... CHECKS PASSED` or `... CHECKS FAILED <names>`), and `pr.merged` (`... MERGED`) on transitions only; list them in `--kinds`. In JSON, an entry with `replay: true` restates current state after a reset and is never READY.",
|
|
4556
|
+
"`runpane watch` waits for workspace transitions from the daemon journal without polling. `--follow` keeps waiting and prints one line per event: READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT, plus HEARTBEAT every 60 seconds as proof of life. Defaults are responsive: no settle, no batching, all kinds, IDLE every `--idle-after`. Expensive consumers opt into `--kinds` (drop `agent.busy`; BUSY carries no action), `--settle <ms>` (READY only after a quiet window; a BUSY inside it cancels the line), `--blocked-settle <ms>`, `--min-interval <ms>` (batch non-urgent lines; BLOCKED bypasses it), and `--idle-backoff` (10m, 30m, 1h, 3h, then daily). Two profiles cover orchestrators. Unattended: `runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff`, which budgets about 6 wake-ups per active pane per hour worst case, usually 1-3, and can deliver READY up to about 13 minutes late. User present: the same kinds with `--settle 60000 --blocked-settle 15000 --min-interval 120000` and no `--idle-backoff`, so READY arrives within about 3 minutes. Pane Chat arms it automatically through its skill; only your own scripts need the flags. STUCK means real unsubmitted composer text, never an agent prompt suggestion. `--quiet` (alias `--no-control-lines`) drops the WATCH OK, HEARTBEAT, and WATCH RECONNECTED control lines (`_ok`, `_heartbeat`, `_reconnected` in JSON); WATCH ERROR, RESET, and DROPPED (`_error`, `_reset`, `_dropped`) always print. Judge a dead watch by a non-zero exit or a WATCH ERROR line, not by silence. `--session <id|name>` follows every Pane associated with a named Session and re-reads membership on every read, so associate and detach need no re-arm; JOINED and LEFT (`pane.associated`, `pane.detached`) report membership changes. For Session members with an open PR, the daemon polls GitHub about every 3 minutes and reports `pr.conflicted` (`PR <pane-name> pane <pane-id> #<number> CONFLICTED`), `pr.checks` (`... CHECKS PASSED` or `... CHECKS FAILED <names>`), and `pr.merged` (`... MERGED`) on transitions only; list them in `--kinds`. In JSON, an entry with `replay: true` restates current state after a reset and is never READY. `--until-event` waits across daemon calls for the first matching event, prints it, and exits 0, so a harness that wakes an agent when a process exits (Claude Code background Bash, Codex) can wait with `runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone` and run it again after each event; the caller's own panel and a RESET never end the wait, and `--timeout-ms` becomes the total deadline (exit 124, `WATCH TIMEOUT`). Never pipe `--follow` into `grep -m1` or `head` to wait: `--follow` never exits on its own. `--follow` and `--until-event` imply `--agents-only`, except for `agent.report`, which arrives from any panel.",
|
|
4443
4557
|
"A watch releases its pending slot when its client socket or named pipe disconnects. Re-arming the same named cursor takes over the previous request; the superseded watcher exits with a WATCH ERROR instead of competing for the cursor. Anonymous concurrent watchers retain the eight-wait limit. Each request also has a 125-second lease (slightly longer than the maximum 120-second long poll), so an abandoned request is reclaimed even if no disconnect arrives.",
|
|
4444
4558
|
"`sessions list` list durable named orchestration Sessions.",
|
|
4445
4559
|
"`sessions create` create a durable named orchestration Session and its hidden terminal owner.",
|
|
@@ -4452,12 +4566,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4452
4566
|
"`sessions overview` read a live status, activity, git, and pull request overview for a named Session.",
|
|
4453
4567
|
"`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.",
|
|
4454
4568
|
"`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.",
|
|
4455
|
-
"`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`.",
|
|
4569
|
+
"`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.",
|
|
4570
|
+
"`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`.",
|
|
4456
4571
|
"`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.",
|
|
4457
4572
|
"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.",
|
|
4458
4573
|
"`runpane links create` builds `pane://open?...` links; opening one in Pane selects what it names and never changes Pane state.",
|
|
4459
4574
|
"`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.",
|
|
4460
|
-
"`runpane handoff` hands a task to a fresh agent on this or another of your machines. The sending agent writes the note from `runpane handoff --template` (goal, current state, done and verified, in progress, next steps, decisions and constraints, open questions, how to verify, git state); `runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md` checks every section is filled in, requires the branch to be pushed (or pushes it with `--push`, never forcing), writes the note to that machine's `~/.pane/handoffs/` and starts the agent in a new Pane branched from the sender's branch. The receiver reports back to the sender's panel."
|
|
4575
|
+
"`runpane handoff` hands a task to a fresh agent on this or another of your machines. The sending agent writes the note from `runpane handoff --template` (goal, current state, done and verified, in progress, next steps, decisions and constraints, open questions, how to verify, git state); `runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md` checks every section is filled in, requires the branch to be pushed (or pushes it with `--push`, never forcing), writes the note to that machine's `~/.pane/handoffs/` and starts the agent in a new Pane branched from the sender's branch. From a Session's terminal it skips git and creates a Session with the same name, goal and agent on the other machine instead. The receiver reports back to the sender's panel."
|
|
4461
4576
|
],
|
|
4462
4577
|
"wrapperFlagNote": "The top-level `runpane --version` form prints the wrapper version. The install subcommand form `runpane install --version vX.Y.Z` selects a Pane release.",
|
|
4463
4578
|
"localControlFlagNote": "`runpane doctor --json`, `runpane repos list`, `runpane panes ...`, and `runpane panels ...` commands use or describe the local framed daemon socket/pipe for a running Pane app. `--pane-dir` points the wrapper at a non-default Pane data directory, such as `PANE_DIR=~/.pane_test` in development. `runpane agent-context` is local/offline and can be used before Pane is running. `agent-context` and `version` accept and ignore `--pane-dir`, so one `--pane-dir` can be passed to every runpane command. In a Pane repository checkout, if `runpane` is not on PATH, build the local wrapper with `pnpm --filter runpane build` and run it with Node 22 or newer, for example `node packages/runpane/dist/cli.js doctor --json`. From WSL, if the user runs Windows Pane, call the Windows wrapper through `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane ...'` so the command can reach the Windows named-pipe daemon and avoid UNC cwd issues.",
|
|
@@ -5146,6 +5261,27 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5146
5261
|
"--pane-dir",
|
|
5147
5262
|
"/tmp/pane"
|
|
5148
5263
|
],
|
|
5264
|
+
[
|
|
5265
|
+
"panels",
|
|
5266
|
+
"resume",
|
|
5267
|
+
"--all-stopped",
|
|
5268
|
+
"--wait-ready",
|
|
5269
|
+
"--concurrency",
|
|
5270
|
+
"2",
|
|
5271
|
+
"--yes",
|
|
5272
|
+
"--json"
|
|
5273
|
+
],
|
|
5274
|
+
[
|
|
5275
|
+
"panels",
|
|
5276
|
+
"resume",
|
|
5277
|
+
"--panel",
|
|
5278
|
+
"panel-1",
|
|
5279
|
+
"--wait-ready",
|
|
5280
|
+
"--ready-timeout-ms",
|
|
5281
|
+
"45000",
|
|
5282
|
+
"--yes",
|
|
5283
|
+
"--json"
|
|
5284
|
+
],
|
|
5149
5285
|
[
|
|
5150
5286
|
"panels",
|
|
5151
5287
|
"last-message",
|
|
@@ -5311,6 +5447,18 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5311
5447
|
"--interrupt",
|
|
5312
5448
|
"--yes",
|
|
5313
5449
|
"--json"
|
|
5450
|
+
],
|
|
5451
|
+
[
|
|
5452
|
+
"watch",
|
|
5453
|
+
"--as",
|
|
5454
|
+
"orch",
|
|
5455
|
+
"--until-event",
|
|
5456
|
+
"--quiet",
|
|
5457
|
+
"--json",
|
|
5458
|
+
"--kinds",
|
|
5459
|
+
"agent.report,agent.blocked,panel.exited,pane.gone",
|
|
5460
|
+
"--timeout-ms",
|
|
5461
|
+
"600000"
|
|
5314
5462
|
]
|
|
5315
5463
|
],
|
|
5316
5464
|
"topLevelHelpIncludes": [
|
|
@@ -6299,6 +6447,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6299
6447
|
"initialized": {
|
|
6300
6448
|
"type": "boolean"
|
|
6301
6449
|
},
|
|
6450
|
+
"running": {
|
|
6451
|
+
"type": "boolean",
|
|
6452
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
6453
|
+
},
|
|
6302
6454
|
"isAlternateScreen": {
|
|
6303
6455
|
"type": "boolean"
|
|
6304
6456
|
},
|
|
@@ -6351,6 +6503,26 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6351
6503
|
},
|
|
6352
6504
|
"additionalProperties": false
|
|
6353
6505
|
},
|
|
6506
|
+
"reason": {
|
|
6507
|
+
"type": "object",
|
|
6508
|
+
"required": [
|
|
6509
|
+
"code",
|
|
6510
|
+
"message"
|
|
6511
|
+
],
|
|
6512
|
+
"properties": {
|
|
6513
|
+
"code": {
|
|
6514
|
+
"enum": [
|
|
6515
|
+
"no-agent-detected",
|
|
6516
|
+
"agent-not-ready",
|
|
6517
|
+
"command-exited"
|
|
6518
|
+
]
|
|
6519
|
+
},
|
|
6520
|
+
"message": {
|
|
6521
|
+
"type": "string"
|
|
6522
|
+
}
|
|
6523
|
+
},
|
|
6524
|
+
"additionalProperties": false
|
|
6525
|
+
},
|
|
6354
6526
|
"nextCommand": {
|
|
6355
6527
|
"type": "string"
|
|
6356
6528
|
}
|
|
@@ -6497,6 +6669,34 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6497
6669
|
}
|
|
6498
6670
|
},
|
|
6499
6671
|
"additionalProperties": false
|
|
6672
|
+
},
|
|
6673
|
+
"base": {
|
|
6674
|
+
"type": "object",
|
|
6675
|
+
"required": [
|
|
6676
|
+
"ref",
|
|
6677
|
+
"refresh"
|
|
6678
|
+
],
|
|
6679
|
+
"properties": {
|
|
6680
|
+
"ref": {
|
|
6681
|
+
"type": "string"
|
|
6682
|
+
},
|
|
6683
|
+
"commit": {
|
|
6684
|
+
"type": "string"
|
|
6685
|
+
},
|
|
6686
|
+
"refresh": {
|
|
6687
|
+
"type": "string",
|
|
6688
|
+
"enum": [
|
|
6689
|
+
"fetched",
|
|
6690
|
+
"recent",
|
|
6691
|
+
"skipped",
|
|
6692
|
+
"failed"
|
|
6693
|
+
]
|
|
6694
|
+
},
|
|
6695
|
+
"notice": {
|
|
6696
|
+
"type": "string"
|
|
6697
|
+
}
|
|
6698
|
+
},
|
|
6699
|
+
"additionalProperties": false
|
|
6500
6700
|
}
|
|
6501
6701
|
},
|
|
6502
6702
|
"additionalProperties": false
|
|
@@ -6997,6 +7197,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
6997
7197
|
"pane.created",
|
|
6998
7198
|
"pane.gone",
|
|
6999
7199
|
"panel.exited",
|
|
7200
|
+
"panel.stopped",
|
|
7000
7201
|
"agent.report",
|
|
7001
7202
|
"pane.associated",
|
|
7002
7203
|
"pane.detached",
|
|
@@ -7078,6 +7279,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7078
7279
|
"exitCode": {
|
|
7079
7280
|
"type": "number"
|
|
7080
7281
|
},
|
|
7282
|
+
"running": {
|
|
7283
|
+
"type": "boolean",
|
|
7284
|
+
"description": "Baseline agent entries: whether the panel's terminal process is live. A stopped panel is never agent.ready."
|
|
7285
|
+
},
|
|
7081
7286
|
"baseline": {
|
|
7082
7287
|
"const": true
|
|
7083
7288
|
},
|
|
@@ -7866,6 +8071,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7866
8071
|
"initialized": {
|
|
7867
8072
|
"type": "boolean"
|
|
7868
8073
|
},
|
|
8074
|
+
"running": {
|
|
8075
|
+
"type": "boolean",
|
|
8076
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
8077
|
+
},
|
|
7869
8078
|
"agentType": {
|
|
7870
8079
|
"type": "string"
|
|
7871
8080
|
},
|
|
@@ -7883,6 +8092,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7883
8092
|
"isCliPanel": {
|
|
7884
8093
|
"type": "boolean"
|
|
7885
8094
|
},
|
|
8095
|
+
"dock": {
|
|
8096
|
+
"type": "boolean",
|
|
8097
|
+
"description": "True on the Pane's terminal dock (its plain shell); omitted on every other panel."
|
|
8098
|
+
},
|
|
7886
8099
|
"position": {
|
|
7887
8100
|
"type": "number"
|
|
7888
8101
|
},
|
|
@@ -7894,6 +8107,16 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7894
8107
|
},
|
|
7895
8108
|
"report": {
|
|
7896
8109
|
"$ref": "#/jsonSchemas/agentReport"
|
|
8110
|
+
},
|
|
8111
|
+
"resumeId": {
|
|
8112
|
+
"type": "string"
|
|
8113
|
+
},
|
|
8114
|
+
"resumeSource": {
|
|
8115
|
+
"enum": [
|
|
8116
|
+
"agent-farm",
|
|
8117
|
+
"configured",
|
|
8118
|
+
"agent"
|
|
8119
|
+
]
|
|
7897
8120
|
}
|
|
7898
8121
|
},
|
|
7899
8122
|
"additionalProperties": false
|
|
@@ -8208,6 +8431,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8208
8431
|
"initialized": {
|
|
8209
8432
|
"type": "boolean"
|
|
8210
8433
|
},
|
|
8434
|
+
"running": {
|
|
8435
|
+
"type": "boolean",
|
|
8436
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
8437
|
+
},
|
|
8211
8438
|
"isAlternateScreen": {
|
|
8212
8439
|
"type": "boolean"
|
|
8213
8440
|
},
|
|
@@ -8457,6 +8684,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8457
8684
|
"initialized": {
|
|
8458
8685
|
"type": "boolean"
|
|
8459
8686
|
},
|
|
8687
|
+
"running": {
|
|
8688
|
+
"type": "boolean",
|
|
8689
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
8690
|
+
},
|
|
8460
8691
|
"isAlternateScreen": {
|
|
8461
8692
|
"type": "boolean"
|
|
8462
8693
|
},
|
|
@@ -8509,6 +8740,30 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8509
8740
|
},
|
|
8510
8741
|
"additionalProperties": false
|
|
8511
8742
|
},
|
|
8743
|
+
"reason": {
|
|
8744
|
+
"type": "object",
|
|
8745
|
+
"required": [
|
|
8746
|
+
"code",
|
|
8747
|
+
"message"
|
|
8748
|
+
],
|
|
8749
|
+
"properties": {
|
|
8750
|
+
"code": {
|
|
8751
|
+
"enum": [
|
|
8752
|
+
"no-agent-detected",
|
|
8753
|
+
"agent-not-ready",
|
|
8754
|
+
"command-exited"
|
|
8755
|
+
]
|
|
8756
|
+
},
|
|
8757
|
+
"message": {
|
|
8758
|
+
"type": "string"
|
|
8759
|
+
}
|
|
8760
|
+
},
|
|
8761
|
+
"additionalProperties": false
|
|
8762
|
+
},
|
|
8763
|
+
"stopped": {
|
|
8764
|
+
"const": true,
|
|
8765
|
+
"description": "The wait did not match and the panel's terminal is not running (ready and idle waits return this after a 2-second grace instead of timing out); nextCommand is `runpane panels resume`."
|
|
8766
|
+
},
|
|
8512
8767
|
"screen": {
|
|
8513
8768
|
"type": "object",
|
|
8514
8769
|
"required": [
|
|
@@ -8540,23 +8795,57 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8540
8795
|
},
|
|
8541
8796
|
"additionalProperties": false
|
|
8542
8797
|
},
|
|
8543
|
-
"
|
|
8544
|
-
"
|
|
8545
|
-
|
|
8798
|
+
"panelResumeResult": {
|
|
8799
|
+
"type": "object",
|
|
8800
|
+
"required": [
|
|
8801
|
+
"ok",
|
|
8802
|
+
"panelId",
|
|
8803
|
+
"paneId",
|
|
8804
|
+
"action",
|
|
8805
|
+
"message",
|
|
8806
|
+
"panel",
|
|
8807
|
+
"nextCommand"
|
|
8808
|
+
],
|
|
8809
|
+
"properties": {
|
|
8810
|
+
"ok": {
|
|
8811
|
+
"type": "boolean"
|
|
8812
|
+
},
|
|
8813
|
+
"panelId": {
|
|
8814
|
+
"type": "string"
|
|
8815
|
+
},
|
|
8816
|
+
"paneId": {
|
|
8817
|
+
"type": "string"
|
|
8818
|
+
},
|
|
8819
|
+
"action": {
|
|
8820
|
+
"enum": [
|
|
8821
|
+
"resumed",
|
|
8822
|
+
"already-running"
|
|
8823
|
+
],
|
|
8824
|
+
"description": "resumed: the panel's terminal was restarted in place. already-running: nothing was restarted."
|
|
8825
|
+
},
|
|
8826
|
+
"message": {
|
|
8827
|
+
"type": "string"
|
|
8828
|
+
},
|
|
8829
|
+
"agentType": {
|
|
8830
|
+
"type": "string"
|
|
8831
|
+
},
|
|
8832
|
+
"agentSessionId": {
|
|
8833
|
+
"type": "string",
|
|
8834
|
+
"description": "The agent conversation the panel resumes, when Pane knows it."
|
|
8835
|
+
},
|
|
8836
|
+
"panel": {
|
|
8546
8837
|
"type": "object",
|
|
8547
8838
|
"required": [
|
|
8548
|
-
"
|
|
8839
|
+
"id",
|
|
8549
8840
|
"panelId",
|
|
8550
8841
|
"paneId",
|
|
8551
|
-
"
|
|
8552
|
-
"
|
|
8553
|
-
"
|
|
8554
|
-
"limit",
|
|
8555
|
-
"truncated"
|
|
8842
|
+
"type",
|
|
8843
|
+
"title",
|
|
8844
|
+
"active"
|
|
8556
8845
|
],
|
|
8557
8846
|
"properties": {
|
|
8558
|
-
"
|
|
8559
|
-
"
|
|
8847
|
+
"id": {
|
|
8848
|
+
"type": "string"
|
|
8560
8849
|
},
|
|
8561
8850
|
"panelId": {
|
|
8562
8851
|
"type": "string"
|
|
@@ -8564,76 +8853,483 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8564
8853
|
"paneId": {
|
|
8565
8854
|
"type": "string"
|
|
8566
8855
|
},
|
|
8856
|
+
"type": {
|
|
8857
|
+
"type": "string"
|
|
8858
|
+
},
|
|
8859
|
+
"title": {
|
|
8860
|
+
"type": "string"
|
|
8861
|
+
},
|
|
8862
|
+
"active": {
|
|
8863
|
+
"type": "boolean"
|
|
8864
|
+
},
|
|
8865
|
+
"initialized": {
|
|
8866
|
+
"type": "boolean"
|
|
8867
|
+
},
|
|
8868
|
+
"running": {
|
|
8869
|
+
"type": "boolean",
|
|
8870
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
8871
|
+
},
|
|
8567
8872
|
"agentType": {
|
|
8873
|
+
"type": "string"
|
|
8874
|
+
},
|
|
8875
|
+
"agentDetection": {
|
|
8568
8876
|
"enum": [
|
|
8569
|
-
"
|
|
8570
|
-
"
|
|
8877
|
+
"declared",
|
|
8878
|
+
"command",
|
|
8879
|
+
"process",
|
|
8880
|
+
"screen"
|
|
8571
8881
|
]
|
|
8572
8882
|
},
|
|
8573
|
-
"
|
|
8883
|
+
"launchCommand": {
|
|
8574
8884
|
"type": "string"
|
|
8575
8885
|
},
|
|
8576
|
-
"
|
|
8577
|
-
"type": "
|
|
8886
|
+
"isCliPanel": {
|
|
8887
|
+
"type": "boolean"
|
|
8578
8888
|
},
|
|
8579
|
-
"
|
|
8889
|
+
"position": {
|
|
8580
8890
|
"type": "number"
|
|
8581
8891
|
},
|
|
8582
|
-
"
|
|
8583
|
-
"type": "
|
|
8892
|
+
"createdAt": {
|
|
8893
|
+
"type": "string"
|
|
8894
|
+
},
|
|
8895
|
+
"lastActiveAt": {
|
|
8896
|
+
"type": "string"
|
|
8897
|
+
},
|
|
8898
|
+
"report": {
|
|
8899
|
+
"$ref": "#/jsonSchemas/agentReport"
|
|
8584
8900
|
}
|
|
8585
8901
|
},
|
|
8586
8902
|
"additionalProperties": false
|
|
8587
8903
|
},
|
|
8588
|
-
{
|
|
8904
|
+
"readiness": {
|
|
8589
8905
|
"type": "object",
|
|
8590
8906
|
"required": [
|
|
8591
8907
|
"ok",
|
|
8592
|
-
"
|
|
8593
|
-
"
|
|
8594
|
-
"
|
|
8595
|
-
"
|
|
8908
|
+
"condition",
|
|
8909
|
+
"matched",
|
|
8910
|
+
"timedOut",
|
|
8911
|
+
"elapsedMs",
|
|
8912
|
+
"state"
|
|
8596
8913
|
],
|
|
8597
8914
|
"properties": {
|
|
8598
8915
|
"ok": {
|
|
8599
|
-
"
|
|
8916
|
+
"type": "boolean"
|
|
8600
8917
|
},
|
|
8601
|
-
"
|
|
8602
|
-
"
|
|
8918
|
+
"condition": {
|
|
8919
|
+
"enum": [
|
|
8920
|
+
"initialized",
|
|
8921
|
+
"ready",
|
|
8922
|
+
"idle",
|
|
8923
|
+
"text"
|
|
8924
|
+
]
|
|
8603
8925
|
},
|
|
8604
|
-
"
|
|
8605
|
-
"type": "
|
|
8926
|
+
"matched": {
|
|
8927
|
+
"type": "boolean"
|
|
8606
8928
|
},
|
|
8607
|
-
"
|
|
8608
|
-
"
|
|
8929
|
+
"timedOut": {
|
|
8930
|
+
"type": "boolean"
|
|
8609
8931
|
},
|
|
8610
|
-
"
|
|
8611
|
-
"type": "
|
|
8612
|
-
}
|
|
8613
|
-
|
|
8614
|
-
|
|
8615
|
-
|
|
8616
|
-
|
|
8617
|
-
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
|
|
8932
|
+
"elapsedMs": {
|
|
8933
|
+
"type": "number"
|
|
8934
|
+
},
|
|
8935
|
+
"state": {
|
|
8936
|
+
"type": "object",
|
|
8937
|
+
"required": [
|
|
8938
|
+
"initialized"
|
|
8939
|
+
],
|
|
8940
|
+
"properties": {
|
|
8941
|
+
"initialized": {
|
|
8942
|
+
"type": "boolean"
|
|
8943
|
+
},
|
|
8944
|
+
"running": {
|
|
8945
|
+
"type": "boolean",
|
|
8946
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
8947
|
+
},
|
|
8948
|
+
"isAlternateScreen": {
|
|
8949
|
+
"type": "boolean"
|
|
8950
|
+
},
|
|
8951
|
+
"activityStatus": {
|
|
8952
|
+
"enum": [
|
|
8953
|
+
"active",
|
|
8954
|
+
"idle"
|
|
8955
|
+
]
|
|
8956
|
+
},
|
|
8957
|
+
"isCliReady": {
|
|
8958
|
+
"type": "boolean"
|
|
8959
|
+
},
|
|
8960
|
+
"isCliPanel": {
|
|
8961
|
+
"type": "boolean"
|
|
8962
|
+
},
|
|
8963
|
+
"agentType": {
|
|
8964
|
+
"enum": [
|
|
8965
|
+
"codex",
|
|
8966
|
+
"claude"
|
|
8967
|
+
]
|
|
8968
|
+
},
|
|
8969
|
+
"lastActivity": {
|
|
8970
|
+
"type": "string"
|
|
8971
|
+
}
|
|
8972
|
+
},
|
|
8973
|
+
"additionalProperties": false
|
|
8974
|
+
},
|
|
8975
|
+
"blocked": {
|
|
8976
|
+
"type": "object",
|
|
8977
|
+
"required": [
|
|
8978
|
+
"kind",
|
|
8979
|
+
"message"
|
|
8980
|
+
],
|
|
8981
|
+
"properties": {
|
|
8982
|
+
"kind": {
|
|
8983
|
+
"enum": [
|
|
8984
|
+
"codex-update",
|
|
8985
|
+
"agent-prompt",
|
|
8986
|
+
"submission_unverified",
|
|
8987
|
+
"unknown"
|
|
8988
|
+
]
|
|
8989
|
+
},
|
|
8990
|
+
"message": {
|
|
8991
|
+
"type": "string"
|
|
8992
|
+
},
|
|
8993
|
+
"suggestedCommand": {
|
|
8994
|
+
"type": "string"
|
|
8995
|
+
}
|
|
8996
|
+
},
|
|
8997
|
+
"additionalProperties": false
|
|
8998
|
+
},
|
|
8999
|
+
"nextCommand": {
|
|
9000
|
+
"type": "string"
|
|
9001
|
+
}
|
|
9002
|
+
},
|
|
9003
|
+
"additionalProperties": false
|
|
9004
|
+
},
|
|
9005
|
+
"nextCommand": {
|
|
9006
|
+
"type": "string"
|
|
9007
|
+
}
|
|
9008
|
+
},
|
|
9009
|
+
"additionalProperties": false
|
|
9010
|
+
},
|
|
9011
|
+
"panelResumeManyResult": {
|
|
9012
|
+
"type": "object",
|
|
9013
|
+
"required": [
|
|
9014
|
+
"ok",
|
|
9015
|
+
"scope",
|
|
9016
|
+
"resumed",
|
|
9017
|
+
"alreadyRunning",
|
|
9018
|
+
"failed",
|
|
9019
|
+
"notReady",
|
|
9020
|
+
"concurrency",
|
|
9021
|
+
"items"
|
|
9022
|
+
],
|
|
9023
|
+
"properties": {
|
|
9024
|
+
"ok": {
|
|
9025
|
+
"type": "boolean",
|
|
9026
|
+
"description": "Every stopped panel in scope resumed and, with --wait-ready, became ready."
|
|
9027
|
+
},
|
|
9028
|
+
"scope": {
|
|
9029
|
+
"oneOf": [
|
|
9030
|
+
{
|
|
9031
|
+
"type": "object",
|
|
9032
|
+
"required": [
|
|
9033
|
+
"kind",
|
|
9034
|
+
"sessionId",
|
|
9035
|
+
"sessionName"
|
|
9036
|
+
],
|
|
9037
|
+
"properties": {
|
|
9038
|
+
"kind": {
|
|
9039
|
+
"const": "session"
|
|
9040
|
+
},
|
|
9041
|
+
"sessionId": {
|
|
9042
|
+
"type": "string"
|
|
9043
|
+
},
|
|
9044
|
+
"sessionName": {
|
|
9045
|
+
"type": "string"
|
|
9046
|
+
}
|
|
9047
|
+
},
|
|
9048
|
+
"additionalProperties": false
|
|
9049
|
+
},
|
|
9050
|
+
{
|
|
9051
|
+
"type": "object",
|
|
9052
|
+
"required": [
|
|
9053
|
+
"kind"
|
|
9054
|
+
],
|
|
9055
|
+
"properties": {
|
|
9056
|
+
"kind": {
|
|
9057
|
+
"const": "all-stopped"
|
|
9058
|
+
}
|
|
9059
|
+
},
|
|
9060
|
+
"additionalProperties": false
|
|
9061
|
+
}
|
|
9062
|
+
]
|
|
9063
|
+
},
|
|
9064
|
+
"resumed": {
|
|
9065
|
+
"type": "number"
|
|
9066
|
+
},
|
|
9067
|
+
"alreadyRunning": {
|
|
9068
|
+
"type": "number",
|
|
9069
|
+
"description": "Agent panels in scope that were already running and were left alone."
|
|
9070
|
+
},
|
|
9071
|
+
"failed": {
|
|
9072
|
+
"type": "number",
|
|
9073
|
+
"description": "Panels that could not be restarted; their item carries error."
|
|
9074
|
+
},
|
|
9075
|
+
"notReady": {
|
|
9076
|
+
"type": "number",
|
|
9077
|
+
"description": "With --wait-ready: resumed panels that were blocked or not ready within --ready-timeout-ms."
|
|
9078
|
+
},
|
|
9079
|
+
"concurrency": {
|
|
9080
|
+
"type": "number",
|
|
9081
|
+
"description": "Panels restarted at once."
|
|
9082
|
+
},
|
|
9083
|
+
"items": {
|
|
9084
|
+
"type": "array",
|
|
9085
|
+
"items": {
|
|
9086
|
+
"type": "object",
|
|
9087
|
+
"required": [
|
|
9088
|
+
"ok",
|
|
9089
|
+
"panelId",
|
|
9090
|
+
"paneId",
|
|
9091
|
+
"paneName"
|
|
9092
|
+
],
|
|
9093
|
+
"properties": {
|
|
9094
|
+
"ok": {
|
|
9095
|
+
"type": "boolean"
|
|
9096
|
+
},
|
|
9097
|
+
"panelId": {
|
|
9098
|
+
"type": "string"
|
|
9099
|
+
},
|
|
9100
|
+
"paneId": {
|
|
9101
|
+
"type": "string"
|
|
9102
|
+
},
|
|
9103
|
+
"paneName": {
|
|
9104
|
+
"type": "string"
|
|
9105
|
+
},
|
|
9106
|
+
"panelTitle": {
|
|
9107
|
+
"type": "string"
|
|
9108
|
+
},
|
|
9109
|
+
"agentType": {
|
|
9110
|
+
"type": "string"
|
|
9111
|
+
},
|
|
9112
|
+
"action": {
|
|
9113
|
+
"enum": [
|
|
9114
|
+
"resumed",
|
|
9115
|
+
"already-running"
|
|
9116
|
+
]
|
|
9117
|
+
},
|
|
9118
|
+
"message": {
|
|
9119
|
+
"type": "string"
|
|
9120
|
+
},
|
|
9121
|
+
"agentSessionId": {
|
|
9122
|
+
"type": "string"
|
|
9123
|
+
},
|
|
9124
|
+
"readiness": {
|
|
9125
|
+
"type": "object",
|
|
9126
|
+
"required": [
|
|
9127
|
+
"ok",
|
|
9128
|
+
"condition",
|
|
9129
|
+
"matched",
|
|
9130
|
+
"timedOut",
|
|
9131
|
+
"elapsedMs",
|
|
9132
|
+
"state"
|
|
9133
|
+
],
|
|
9134
|
+
"properties": {
|
|
9135
|
+
"ok": {
|
|
9136
|
+
"type": "boolean"
|
|
9137
|
+
},
|
|
9138
|
+
"condition": {
|
|
9139
|
+
"enum": [
|
|
9140
|
+
"initialized",
|
|
9141
|
+
"ready",
|
|
9142
|
+
"idle",
|
|
9143
|
+
"text"
|
|
9144
|
+
]
|
|
9145
|
+
},
|
|
9146
|
+
"matched": {
|
|
9147
|
+
"type": "boolean"
|
|
9148
|
+
},
|
|
9149
|
+
"timedOut": {
|
|
9150
|
+
"type": "boolean"
|
|
9151
|
+
},
|
|
9152
|
+
"elapsedMs": {
|
|
9153
|
+
"type": "number"
|
|
9154
|
+
},
|
|
9155
|
+
"state": {
|
|
9156
|
+
"type": "object",
|
|
9157
|
+
"required": [
|
|
9158
|
+
"initialized"
|
|
9159
|
+
],
|
|
9160
|
+
"properties": {
|
|
9161
|
+
"initialized": {
|
|
9162
|
+
"type": "boolean"
|
|
9163
|
+
},
|
|
9164
|
+
"running": {
|
|
9165
|
+
"type": "boolean",
|
|
9166
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
9167
|
+
},
|
|
9168
|
+
"isAlternateScreen": {
|
|
9169
|
+
"type": "boolean"
|
|
9170
|
+
},
|
|
9171
|
+
"activityStatus": {
|
|
9172
|
+
"enum": [
|
|
9173
|
+
"active",
|
|
9174
|
+
"idle"
|
|
9175
|
+
]
|
|
9176
|
+
},
|
|
9177
|
+
"isCliReady": {
|
|
9178
|
+
"type": "boolean"
|
|
9179
|
+
},
|
|
9180
|
+
"isCliPanel": {
|
|
9181
|
+
"type": "boolean"
|
|
9182
|
+
},
|
|
9183
|
+
"agentType": {
|
|
9184
|
+
"enum": [
|
|
9185
|
+
"codex",
|
|
9186
|
+
"claude"
|
|
9187
|
+
]
|
|
9188
|
+
},
|
|
9189
|
+
"lastActivity": {
|
|
9190
|
+
"type": "string"
|
|
9191
|
+
}
|
|
9192
|
+
},
|
|
9193
|
+
"additionalProperties": false
|
|
9194
|
+
},
|
|
9195
|
+
"blocked": {
|
|
9196
|
+
"type": "object",
|
|
9197
|
+
"required": [
|
|
9198
|
+
"kind",
|
|
9199
|
+
"message"
|
|
9200
|
+
],
|
|
9201
|
+
"properties": {
|
|
9202
|
+
"kind": {
|
|
9203
|
+
"enum": [
|
|
9204
|
+
"codex-update",
|
|
9205
|
+
"agent-prompt",
|
|
9206
|
+
"submission_unverified",
|
|
9207
|
+
"unknown"
|
|
9208
|
+
]
|
|
9209
|
+
},
|
|
9210
|
+
"message": {
|
|
9211
|
+
"type": "string"
|
|
9212
|
+
},
|
|
9213
|
+
"suggestedCommand": {
|
|
9214
|
+
"type": "string"
|
|
9215
|
+
}
|
|
9216
|
+
},
|
|
9217
|
+
"additionalProperties": false
|
|
9218
|
+
},
|
|
9219
|
+
"nextCommand": {
|
|
9220
|
+
"type": "string"
|
|
9221
|
+
}
|
|
9222
|
+
},
|
|
9223
|
+
"additionalProperties": false
|
|
9224
|
+
},
|
|
9225
|
+
"error": {
|
|
9226
|
+
"type": "string",
|
|
9227
|
+
"description": "Why this panel could not be resumed; the others still were."
|
|
9228
|
+
}
|
|
9229
|
+
},
|
|
9230
|
+
"additionalProperties": false
|
|
9231
|
+
}
|
|
9232
|
+
},
|
|
9233
|
+
"nextCommand": {
|
|
9234
|
+
"type": "string"
|
|
9235
|
+
}
|
|
9236
|
+
},
|
|
9237
|
+
"additionalProperties": false
|
|
9238
|
+
},
|
|
9239
|
+
"panelLastMessageResult": {
|
|
9240
|
+
"oneOf": [
|
|
9241
|
+
{
|
|
9242
|
+
"type": "object",
|
|
9243
|
+
"required": [
|
|
9244
|
+
"ok",
|
|
9245
|
+
"panelId",
|
|
9246
|
+
"paneId",
|
|
9247
|
+
"agentType",
|
|
9248
|
+
"text",
|
|
9249
|
+
"length",
|
|
9250
|
+
"limit",
|
|
9251
|
+
"truncated"
|
|
9252
|
+
],
|
|
9253
|
+
"properties": {
|
|
9254
|
+
"ok": {
|
|
9255
|
+
"const": true
|
|
9256
|
+
},
|
|
9257
|
+
"panelId": {
|
|
9258
|
+
"type": "string"
|
|
9259
|
+
},
|
|
9260
|
+
"paneId": {
|
|
9261
|
+
"type": "string"
|
|
9262
|
+
},
|
|
9263
|
+
"agentType": {
|
|
9264
|
+
"enum": [
|
|
9265
|
+
"claude",
|
|
9266
|
+
"codex"
|
|
9267
|
+
]
|
|
9268
|
+
},
|
|
9269
|
+
"text": {
|
|
9270
|
+
"type": "string"
|
|
9271
|
+
},
|
|
9272
|
+
"length": {
|
|
9273
|
+
"type": "number"
|
|
9274
|
+
},
|
|
9275
|
+
"limit": {
|
|
9276
|
+
"type": "number"
|
|
9277
|
+
},
|
|
9278
|
+
"truncated": {
|
|
9279
|
+
"type": "boolean"
|
|
9280
|
+
}
|
|
9281
|
+
},
|
|
9282
|
+
"additionalProperties": false
|
|
9283
|
+
},
|
|
9284
|
+
{
|
|
9285
|
+
"type": "object",
|
|
9286
|
+
"required": [
|
|
9287
|
+
"ok",
|
|
9288
|
+
"panelId",
|
|
9289
|
+
"paneId",
|
|
9290
|
+
"reason",
|
|
9291
|
+
"message"
|
|
9292
|
+
],
|
|
9293
|
+
"properties": {
|
|
9294
|
+
"ok": {
|
|
9295
|
+
"const": false
|
|
9296
|
+
},
|
|
9297
|
+
"panelId": {
|
|
9298
|
+
"type": "string"
|
|
9299
|
+
},
|
|
9300
|
+
"paneId": {
|
|
9301
|
+
"type": "string"
|
|
9302
|
+
},
|
|
9303
|
+
"reason": {
|
|
9304
|
+
"const": "transcript-unavailable"
|
|
9305
|
+
},
|
|
9306
|
+
"message": {
|
|
9307
|
+
"type": "string"
|
|
9308
|
+
}
|
|
9309
|
+
},
|
|
9310
|
+
"additionalProperties": false
|
|
9311
|
+
}
|
|
9312
|
+
]
|
|
9313
|
+
},
|
|
9314
|
+
"agentDoctorResult": {
|
|
9315
|
+
"type": "object",
|
|
9316
|
+
"required": [
|
|
9317
|
+
"ok",
|
|
9318
|
+
"agent",
|
|
9319
|
+
"command",
|
|
9320
|
+
"available",
|
|
9321
|
+
"checks"
|
|
9322
|
+
],
|
|
9323
|
+
"properties": {
|
|
9324
|
+
"ok": {
|
|
9325
|
+
"type": "boolean"
|
|
9326
|
+
},
|
|
9327
|
+
"agent": {
|
|
9328
|
+
"enum": [
|
|
9329
|
+
"codex",
|
|
9330
|
+
"claude"
|
|
9331
|
+
]
|
|
9332
|
+
},
|
|
8637
9333
|
"command": {
|
|
8638
9334
|
"type": "string"
|
|
8639
9335
|
},
|
|
@@ -8822,6 +9518,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8822
9518
|
"initialized": {
|
|
8823
9519
|
"type": "boolean"
|
|
8824
9520
|
},
|
|
9521
|
+
"running": {
|
|
9522
|
+
"type": "boolean",
|
|
9523
|
+
"description": "Whether the terminal process is live. A stopped panel can be restarted with `runpane panels resume`."
|
|
9524
|
+
},
|
|
8825
9525
|
"isAlternateScreen": {
|
|
8826
9526
|
"type": "boolean"
|
|
8827
9527
|
},
|
|
@@ -8874,6 +9574,26 @@ exports.RUNPANE_CONTRACT = {
|
|
|
8874
9574
|
},
|
|
8875
9575
|
"additionalProperties": false
|
|
8876
9576
|
},
|
|
9577
|
+
"reason": {
|
|
9578
|
+
"type": "object",
|
|
9579
|
+
"required": [
|
|
9580
|
+
"code",
|
|
9581
|
+
"message"
|
|
9582
|
+
],
|
|
9583
|
+
"properties": {
|
|
9584
|
+
"code": {
|
|
9585
|
+
"enum": [
|
|
9586
|
+
"no-agent-detected",
|
|
9587
|
+
"agent-not-ready",
|
|
9588
|
+
"command-exited"
|
|
9589
|
+
]
|
|
9590
|
+
},
|
|
9591
|
+
"message": {
|
|
9592
|
+
"type": "string"
|
|
9593
|
+
}
|
|
9594
|
+
},
|
|
9595
|
+
"additionalProperties": false
|
|
9596
|
+
},
|
|
8877
9597
|
"nextCommand": {
|
|
8878
9598
|
"type": "string"
|
|
8879
9599
|
}
|
|
@@ -9751,6 +10471,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
9751
10471
|
"items": {
|
|
9752
10472
|
"type": "string"
|
|
9753
10473
|
}
|
|
10474
|
+
},
|
|
10475
|
+
"liveWatchers": {
|
|
10476
|
+
"type": "number",
|
|
10477
|
+
"description": "Watches that were waiting for this report when it was journaled and received it. A snapshot: a named-cursor watch that waits later still receives it. Absent from older daemons."
|
|
9754
10478
|
}
|
|
9755
10479
|
},
|
|
9756
10480
|
"additionalProperties": false
|
|
@@ -9938,11 +10662,11 @@ exports.RUNPANE_CONTRACT = {
|
|
|
9938
10662
|
"If WSL cannot reach Pane or `runpane` resolves to a broken Windows shim, the user may be running Windows Pane; try `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane doctor --json'`.",
|
|
9939
10663
|
"If the repository exists on disk but is not saved in Pane, use `runpane repos add --path <repo> --yes --json` before creating panes.",
|
|
9940
10664
|
"Use `runpane agents doctor --agent <codex|claude|cursor> --repo <selector> --json` when agent availability differs across host, Windows, WSL, or repo environments.",
|
|
9941
|
-
"Use `runpane panes create --wait-ready` to create Panes and
|
|
9942
|
-
"Use `runpane panels screen` for compact current state, including Claude and Codex composer state. Use `panels wait` for create-time readiness or text checks. Use `runpane watch --follow` to block on workspace transitions (READY, BLOCKED, IDLE, STUCK, EXIT) without polling. Use `panels submit` to send and submit a new turn. Use `panels submit-composer --strategy auto` only for a composer that was filled separately.",
|
|
10665
|
+
"Use `runpane panes create --wait-ready` to create Panes, wait for each agent's input box, and verify its starting message in one call.",
|
|
10666
|
+
"Use `runpane panels screen` for compact current state, including Claude and Codex composer state. Use `panels wait` for create-time readiness or text checks. Use `runpane watch --follow` to block on workspace transitions (READY, BLOCKED, IDLE, STUCK, EXIT) without polling, or `runpane watch --until-event` to exit on the first one. Use `panels submit` to send and submit a new turn. Use `panels submit-composer --strategy auto` only for a composer that was filled separately.",
|
|
9943
10667
|
"Use `runpane panels input` only when exact bytes are required, such as Ctrl-C or handcrafted terminal input.",
|
|
9944
10668
|
"Pane terminals draw inline images: sixel, iTerm2 inline images, and the kitty graphics protocol. Tools that need kitty graphics, such as terminal-browser and terminal-doom, run inside a Pane panel; `runpane doctor --json` reports the exact list under `terminal.graphicsProtocols`.",
|
|
9945
|
-
"After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen` before reporting success. For ongoing supervision, `runpane watch --follow` is the canonical monitor.",
|
|
10669
|
+
"After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen` before reporting success. For ongoing supervision, `runpane watch --follow` is the canonical monitor for a streaming reader. A harness that wakes only when a process exits (Claude Code background Bash, Codex) waits with `runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone` instead and runs it again after each event; never pipe `--follow` into `grep -m1` or `head`.",
|
|
9946
10670
|
"When several agents share one resource, such as a test account, name a lock in their prompts: each worker runs `runpane lock acquire --name <name> --ttl 30m --wait 1800000 --json` before using it and `runpane lock release --name <name>` after."
|
|
9947
10671
|
],
|
|
9948
10672
|
"detailCommand": "runpane agent-context --command <command> [--json]",
|
|
@@ -10200,11 +10924,27 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10200
10924
|
"--pane-dir <path>"
|
|
10201
10925
|
]
|
|
10202
10926
|
},
|
|
10927
|
+
{
|
|
10928
|
+
"name": "panels resume",
|
|
10929
|
+
"summary": "Restart a stopped terminal panel in place (same panel id), resuming its agent's conversation.",
|
|
10930
|
+
"arguments": [
|
|
10931
|
+
"--panel <panel-id>",
|
|
10932
|
+
"--session <id|name>",
|
|
10933
|
+
"--all-stopped",
|
|
10934
|
+
"--concurrency <count>",
|
|
10935
|
+
"--wait-ready",
|
|
10936
|
+
"--ready-timeout-ms <ms>",
|
|
10937
|
+
"--yes",
|
|
10938
|
+
"--json",
|
|
10939
|
+
"--pane-dir <path>"
|
|
10940
|
+
]
|
|
10941
|
+
},
|
|
10203
10942
|
{
|
|
10204
10943
|
"name": "watch",
|
|
10205
|
-
"summary": "Wait for workspace transitions (READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT, JOINED, LEFT, PR) from the daemon journal without polling; responsive by default, with opt-in cadence flags for expensive consumers.",
|
|
10944
|
+
"summary": "Wait for workspace transitions (READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT, STOPPED, JOINED, LEFT, PR) from the daemon journal without polling; responsive by default, with opt-in cadence flags for expensive consumers.",
|
|
10206
10945
|
"arguments": [
|
|
10207
10946
|
"--follow",
|
|
10947
|
+
"--until-event",
|
|
10208
10948
|
"--session <id|name>",
|
|
10209
10949
|
"--self-test",
|
|
10210
10950
|
"--kinds <kind,...>",
|
|
@@ -10644,7 +11384,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10644
11384
|
],
|
|
10645
11385
|
"notes": [
|
|
10646
11386
|
"Without --repo, this lists sessions across saved Pane repositories.",
|
|
10647
|
-
"`status` is `running` while
|
|
11387
|
+
"`status` is `running` while a tool or agent terminal is live, otherwise the stored lifecycle value (`error` and `initializing` always show as stored). The Pane's dock shell (`dock: true` in `panels list`) does not count, so a Pane whose only live terminal is the dock reads its stored value, usually `stopped`. `agentState` is the most urgent state of the live agent panels: `blocked`, `working`, `ready`, or `none`. `agentStatus` (`active`/`idle`) is kept for older clients."
|
|
10648
11388
|
]
|
|
10649
11389
|
},
|
|
10650
11390
|
"panes cost": {
|
|
@@ -10824,7 +11564,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10824
11564
|
{
|
|
10825
11565
|
"name": "--wait-ready",
|
|
10826
11566
|
"required": false,
|
|
10827
|
-
"description": "Wait
|
|
11567
|
+
"description": "Wait until each created panel's agent is at its input box, then deliver and verify any starting message, before returning."
|
|
10828
11568
|
},
|
|
10829
11569
|
{
|
|
10830
11570
|
"name": "--ready-timeout-ms",
|
|
@@ -10866,17 +11606,18 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10866
11606
|
"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.",
|
|
10867
11607
|
"`--as-file-pointer` writes the text to `<pane-dir>/prompts/<pane-id>/<timestamp>.md` (readable only by you) and sends the one line `Read and follow <path>`; the result includes `promptFile`. Prefer it for long prompts.",
|
|
10868
11608
|
"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.",
|
|
10869
|
-
"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.",
|
|
11609
|
+
"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.",
|
|
10870
11610
|
"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.",
|
|
10871
11611
|
"When the JSON result includes nextCommand, run it to validate that the terminal produced output before reporting success.",
|
|
10872
11612
|
"Multi-pane requests are created sequentially today. The --concurrency flag is accepted for compatibility, but agents should not rely on parallel creation.",
|
|
10873
11613
|
"For POSIX or WSL command chaining, use a custom terminal command like `bash -lc 'cmd1 && cmd2 && cmd3'`.",
|
|
10874
11614
|
"For Windows PowerShell command chaining, use a custom terminal command like `powershell -NoProfile -Command \"cmd1; if ($LASTEXITCODE) { exit $LASTEXITCODE }; cmd2\"`.",
|
|
10875
11615
|
"From WSL with Windows Pane, invoke through PowerShell and select the saved WSL repo by name or id, for example `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane panes create --repo \"WSL Pane\" --name issue-123 --agent <agent> --prompt \"Plan this issue\" --source agent --no-focus --wait-ready --yes --json'`.",
|
|
10876
|
-
"Use --wait-ready when an agent needs
|
|
11616
|
+
"Use --wait-ready when an agent needs the started agent at its input box, and its starting message verified, instead of only creating a pane.",
|
|
10877
11617
|
"If readiness returns blocked, inspect blocked.suggestedCommand rather than guessing which prompt to answer.",
|
|
10878
|
-
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen.",
|
|
11618
|
+
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it.",
|
|
10879
11619
|
"At most 2 Panes run setup at once (worktree file sync, dependency install, build script); more wait in line. A queued `panes create` returns the Pane id right away with `setupQueue` ({ position, message }) and no `panelId`; the agent starts when setup finishes. Find its panel later with `runpane panels list --pane <id> --json`.",
|
|
11620
|
+
"A Pane with its own worktree starts at the remote's current tip of a remote-tracking base (the default `origin/main`, or one named with `--base`): Pane fetches that branch first, waiting at most about 10 seconds, and creates started together share the fetch. Each item's `base` reports `{ ref, commit, refresh }`, where `refresh` is `fetched`, `recent` (reused a fetch from the last 30 seconds), `skipped` (a local branch or commit base) or `failed`. A failed refresh never fails the create; the Pane starts from the local ref and `base.notice` says what happened and how to catch up.",
|
|
10880
11621
|
"`panes create --branch <name>` fails with code `ERR_RUNPANE_BRANCH_HAS_PANE` when another Pane already has that branch checked out. The message names the Pane and gives the next step: `runpane panels create --pane <id> --tool-command \"<cmd>\" --source agent --no-focus`."
|
|
10881
11622
|
]
|
|
10882
11623
|
},
|
|
@@ -11001,9 +11742,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11001
11742
|
"The resume command is staged without Enter unless --launch is passed.",
|
|
11002
11743
|
"Archiving never deletes an adopted worktree unless `runpane panes archive --remove-worktree` is used.",
|
|
11003
11744
|
"One of --agent or --tool-command is required.",
|
|
11004
|
-
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen.",
|
|
11745
|
+
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it.",
|
|
11005
11746
|
"--resume needs a built-in agent command; a wrapper command resumes its own way.",
|
|
11006
|
-
"The adopted Pane reports `status: running` in `panes list` while its terminal is live.",
|
|
11747
|
+
"The adopted Pane reports `status: running` in `panes list` while its tool terminal is live.",
|
|
11007
11748
|
"A prompt (--prompt, --initial-input, --prompt-file, --initial-input-file) or --wait-ready needs --launch; without it adopt fails instead of dropping the prompt.",
|
|
11008
11749
|
"With --launch the result carries the same readiness, initialInput, and nextCommand fields as panes create. With --resume the prompt goes to the resumed conversation's composer once the agent is ready.",
|
|
11009
11750
|
"To start new work on a named branch, prefer `panes create --base <ref> --branch <name>` over `git worktree add` plus adopt."
|
|
@@ -11337,7 +12078,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11337
12078
|
],
|
|
11338
12079
|
"notes": [
|
|
11339
12080
|
"The ids returned here are stable inputs for `panels output` and `panels input`.",
|
|
11340
|
-
"`agentType` is the agent Pane treats the panel as; `agentDetection` says how it knows (`declared`, `command`, `process`, or `screen`), and `launchCommand` is the command the panel was launched with."
|
|
12081
|
+
"`agentType` is the agent Pane treats the panel as; `agentDetection` says how it knows (`declared`, `command`, `process`, or `screen`), and `launchCommand` is the command the panel was launched with.",
|
|
12082
|
+
"`resumeId` is the agent session ID Pane saved for reopening the panel, and `resumeSource` says which rule resumes with it: `agent-farm` (an `agent-farm run` or `agent-farm agent` command), `configured` (the panel's own resume command), or `agent` (a built-in agent's captured session). Both are omitted when no ID is saved.",
|
|
12083
|
+
"Every Pane has one plain shell titled `Terminal`, its terminal dock: `dock: true` marks it, and the field is omitted on every other panel. Setup progress notices appear there; it is not a tool or agent tab and does not count toward the Pane's `status`. A `--tool-command` tab without `--title` or `--agent` is titled from its command (whole words up to 40 characters)."
|
|
11341
12084
|
]
|
|
11342
12085
|
},
|
|
11343
12086
|
"panels output": {
|
|
@@ -11609,6 +12352,78 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11609
12352
|
"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."
|
|
11610
12353
|
]
|
|
11611
12354
|
},
|
|
12355
|
+
"panels resume": {
|
|
12356
|
+
"name": "panels resume",
|
|
12357
|
+
"summary": "Restart stopped terminal panels in place, resuming their agents' conversations: one panel, a Session's panels, or every stopped agent panel.",
|
|
12358
|
+
"details": "Use this when `panels list`, `panels screen`, or `panels wait` report `running: false`, or `watch` reports `panel.stopped`, typically after a Pane restart or once its agent exited back to the shell. The panel keeps its id. Pane re-runs the panel's saved launch command resolved to the agent's resume command (Claude `--resume <session>`, `codex resume <session>`, Cursor `--resume`), the same restart the app runs when it shows the panel. It never takes focus. A panel whose agent exited back to its shell has its saved command run again in that shell. On a running panel it does nothing and returns `action: \"already-running\"`. `--session <id|name>` or `--all-stopped` resumes every stopped agent panel in that scope (plain shells are left alone), `--concurrency` at a time, skips running panels, and returns one result per panel; one failure does not stop the others.",
|
|
12359
|
+
"requiresPaneDaemon": true,
|
|
12360
|
+
"mutates": true,
|
|
12361
|
+
"arguments": [
|
|
12362
|
+
{
|
|
12363
|
+
"name": "--panel",
|
|
12364
|
+
"value": "<panel-id>",
|
|
12365
|
+
"required": false,
|
|
12366
|
+
"description": "Terminal panel id. Give exactly one of --panel, --session, or --all-stopped."
|
|
12367
|
+
},
|
|
12368
|
+
{
|
|
12369
|
+
"name": "--session",
|
|
12370
|
+
"value": "<id|name>",
|
|
12371
|
+
"required": false,
|
|
12372
|
+
"description": "Resume the stopped agent panels of this Session's associated Panes."
|
|
12373
|
+
},
|
|
12374
|
+
{
|
|
12375
|
+
"name": "--all-stopped",
|
|
12376
|
+
"required": false,
|
|
12377
|
+
"description": "Resume the stopped agent panels of every non-archived Pane."
|
|
12378
|
+
},
|
|
12379
|
+
{
|
|
12380
|
+
"name": "--concurrency",
|
|
12381
|
+
"value": "<count>",
|
|
12382
|
+
"required": false,
|
|
12383
|
+
"description": "Panels restarted at once for --session or --all-stopped; defaults to 3, at most 10. With --wait-ready the resumed panels then wait together, so the call takes the restarts plus one --ready-timeout-ms."
|
|
12384
|
+
},
|
|
12385
|
+
{
|
|
12386
|
+
"name": "--wait-ready",
|
|
12387
|
+
"required": false,
|
|
12388
|
+
"description": "Wait until the resumed agent is ready, with the same startup-screen checks as `panels create --wait-ready`."
|
|
12389
|
+
},
|
|
12390
|
+
{
|
|
12391
|
+
"name": "--ready-timeout-ms",
|
|
12392
|
+
"value": "<ms>",
|
|
12393
|
+
"required": false,
|
|
12394
|
+
"description": "Readiness wait timeout; defaults to 30000."
|
|
12395
|
+
},
|
|
12396
|
+
{
|
|
12397
|
+
"name": "--yes",
|
|
12398
|
+
"required": false,
|
|
12399
|
+
"description": "Skip confirmation for this mutating command."
|
|
12400
|
+
},
|
|
12401
|
+
{
|
|
12402
|
+
"name": "--json",
|
|
12403
|
+
"required": false,
|
|
12404
|
+
"description": "Print machine-readable output."
|
|
12405
|
+
},
|
|
12406
|
+
{
|
|
12407
|
+
"name": "--pane-dir",
|
|
12408
|
+
"value": "<path>",
|
|
12409
|
+
"required": false,
|
|
12410
|
+
"description": "Connect to a specific Pane data directory."
|
|
12411
|
+
}
|
|
12412
|
+
],
|
|
12413
|
+
"examples": [
|
|
12414
|
+
"runpane panels resume --panel <panel-id> --wait-ready --yes --json",
|
|
12415
|
+
"runpane panels resume --session <id|name> --wait-ready --yes --json"
|
|
12416
|
+
],
|
|
12417
|
+
"jsonSchemas": [
|
|
12418
|
+
"panelResumeResult",
|
|
12419
|
+
"panelResumeManyResult"
|
|
12420
|
+
],
|
|
12421
|
+
"notes": [
|
|
12422
|
+
"If readiness.blocked is present, the agent is at a startup prompt (trust, update, [y/n]); inspect `panels screen` or follow blocked.suggestedCommand. Ask the user before answering trust or permission prompts.",
|
|
12423
|
+
"A Claude panel resumes the conversation whose session id Pane launched it with; a Codex panel resumes the session id Pane captured from its output. Without one, the panel relaunches its original command.",
|
|
12424
|
+
"A bulk resume is ok only when every panel resumed and, with --wait-ready, became ready. Check items[].readiness.blocked and items[].error per panel."
|
|
12425
|
+
]
|
|
12426
|
+
},
|
|
11612
12427
|
"panels wait": {
|
|
11613
12428
|
"name": "panels wait",
|
|
11614
12429
|
"summary": "Wait for a terminal panel to initialize, become ready/idle, or contain text.",
|
|
@@ -11667,6 +12482,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11667
12482
|
],
|
|
11668
12483
|
"notes": [
|
|
11669
12484
|
"If blocked is present, do not assume success. Use blocked.suggestedCommand or inspect `panels screen`.",
|
|
12485
|
+
"If stopped is true, the panel's terminal is not running (for example after a Pane restart); run nextCommand (`panels resume`) instead of waiting again.",
|
|
11670
12486
|
"The default timeout and screen are intentionally small for agent context safety."
|
|
11671
12487
|
]
|
|
11672
12488
|
},
|
|
@@ -11818,13 +12634,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11818
12634
|
"Panels share the existing Pane's worktree and branch.",
|
|
11819
12635
|
"`panels create` is for visible helper/reviewer tabs, not the agent's default private delegation mechanism.",
|
|
11820
12636
|
"For agent-created panels, prefer --source agent or --no-focus to avoid stealing focus from the user or implementation tab.",
|
|
11821
|
-
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen."
|
|
12637
|
+
"With --tool-command, --agent names the agent the command runs (a wrapper such as `agent-farm run`): Pane launches the command unchanged and treats the panel as that agent. Without --agent, Pane detects Claude Code, Codex and Cursor from the foreground process or the agent's screen, and --wait-ready waits for the detected agent's input box; a command that never shows a supported agent is not ready and nothing is typed into it."
|
|
11822
12638
|
]
|
|
11823
12639
|
},
|
|
11824
12640
|
"panels open": {
|
|
11825
12641
|
"name": "panels open",
|
|
11826
12642
|
"summary": "Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default.",
|
|
11827
|
-
"details": "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats
|
|
12643
|
+
"details": "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats; HTML opens as editable source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
|
|
11828
12644
|
"requiresPaneDaemon": true,
|
|
11829
12645
|
"mutates": true,
|
|
11830
12646
|
"arguments": [
|
|
@@ -11844,7 +12660,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11844
12660
|
"name": "--file",
|
|
11845
12661
|
"value": "<path>",
|
|
11846
12662
|
"required": false,
|
|
11847
|
-
"description": "File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. Files open in an editor tab; supported formats have read-only previews,
|
|
12663
|
+
"description": "File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. Files open in an editor tab; supported formats have read-only previews, and HTML opens as editable source."
|
|
11848
12664
|
},
|
|
11849
12665
|
{
|
|
11850
12666
|
"name": "--title",
|
|
@@ -11900,7 +12716,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11900
12716
|
],
|
|
11901
12717
|
"notes": [
|
|
11902
12718
|
"Prefer this over opening the system browser when showing the user a page, plan, report, or dev server.",
|
|
11903
|
-
"Write plans and reports as self-contained HTML files. Use --url with a file URL to render a page in a live browser, or --file to
|
|
12719
|
+
"Write plans and reports as self-contained HTML files. Use --url with a file URL to render a page in a live browser, or --file to open its editable source; reopening the same target reuses its tab.",
|
|
11904
12720
|
"Opening a tab does not steal window focus; use `panes focus` only on explicit user request."
|
|
11905
12721
|
]
|
|
11906
12722
|
},
|
|
@@ -11990,7 +12806,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11990
12806
|
"watch": {
|
|
11991
12807
|
"name": "watch",
|
|
11992
12808
|
"summary": "Wait for workspace transitions using the daemon journal.",
|
|
11993
|
-
"details": "`runpane watch --follow` is the responsive monitor: lines, 60-second heartbeats, IDLE every 10 minutes, managed-agent scope, redacted STUCK detection, no settle, no batching, all kinds. Expensive consumers (one wake-up per line) opt into the cadence flags. Pane Chat arms them automatically through its pane-orchestrator skill; only your own scripts need to pass them. Named cursors persist in the Pane data directory.",
|
|
12809
|
+
"details": "`runpane watch --follow` is the responsive monitor: lines, 60-second heartbeats, IDLE every 10 minutes, managed-agent scope, redacted STUCK detection, no settle, no batching, all kinds. Expensive consumers (one wake-up per line) opt into the cadence flags. Pane Chat arms them automatically through its pane-orchestrator skill; only your own scripts need to pass them. Named cursors persist in the Pane data directory. Harnesses that wake an agent when a process exits (Claude Code background Bash, Codex) use `--until-event` instead: `runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone` exits 0 on the first event, and the agent runs it again after acting on it.",
|
|
11994
12810
|
"requiresPaneDaemon": true,
|
|
11995
12811
|
"mutates": false,
|
|
11996
12812
|
"arguments": [
|
|
@@ -12017,6 +12833,11 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12017
12833
|
"required": false,
|
|
12018
12834
|
"description": "Continue waiting until interrupted. Required by every cadence flag."
|
|
12019
12835
|
},
|
|
12836
|
+
{
|
|
12837
|
+
"name": "--until-event",
|
|
12838
|
+
"required": false,
|
|
12839
|
+
"description": "Wait across daemon calls (each capped at 120 s) for the first matching event, print it, and exit 0. Same scope defaults as --follow. A RESET and entries from the caller's own panel (PANE_PANEL_ID) never end the wait. Without --as inside a Pane terminal the cursor is until-<panel id>, apart from the panel's --follow cursor. --timeout-ms is the total deadline: exit 124 with WATCH TIMEOUT (_timeout). Cannot be combined with --follow, --self-test, or the cadence flags."
|
|
12840
|
+
},
|
|
12020
12841
|
{
|
|
12021
12842
|
"name": "--format",
|
|
12022
12843
|
"value": "<lines|json>",
|
|
@@ -12062,7 +12883,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12062
12883
|
"name": "--kinds",
|
|
12063
12884
|
"required": false,
|
|
12064
12885
|
"value": "<kind,...>",
|
|
12065
|
-
"description": "Limit event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited, agent.report, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged. agent.report arrives only when listed explicitly. Default all, except that pane.associated, pane.detached, and the pr.* kinds arrive only when listed here or implied by --session. Drop agent.busy for any consumer that acts on lines; BUSY carries no action."
|
|
12886
|
+
"description": "Limit event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited, panel.stopped, agent.report, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged. agent.report arrives only when listed explicitly. Default all, except that pane.associated, pane.detached, and the pr.* kinds arrive only when listed here or implied by --session, and panel.stopped arrives only when listed here; without it, a stopped agent panel reads as agent.unknown with running: false. Drop agent.busy for any consumer that acts on lines; BUSY carries no action."
|
|
12066
12887
|
},
|
|
12067
12888
|
{
|
|
12068
12889
|
"name": "--pane",
|
|
@@ -12113,7 +12934,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12113
12934
|
"name": "--timeout-ms",
|
|
12114
12935
|
"required": false,
|
|
12115
12936
|
"value": "<milliseconds>",
|
|
12116
|
-
"description": "Wait timeout per request; 0 polls once. Default 60000, capped at 120000 (the follow loop re-issues requests)."
|
|
12937
|
+
"description": "Wait timeout per request; 0 polls once. Default 60000, capped at 120000 (the follow loop re-issues requests). With --until-event it is the deadline for the whole wait instead."
|
|
12117
12938
|
},
|
|
12118
12939
|
{
|
|
12119
12940
|
"name": "--limit",
|
|
@@ -12129,7 +12950,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12129
12950
|
{
|
|
12130
12951
|
"name": "--include-held-input",
|
|
12131
12952
|
"required": false,
|
|
12132
|
-
"description": "Include up to 120 characters of unsubmitted composer text in JSON entries. Default off: under --follow, JSON entries carry only heldInputPresent: true."
|
|
12953
|
+
"description": "Include up to 120 characters of unsubmitted composer text (typed text only; prompt suggestions and placeholders excluded) in JSON entries. Default off: under --follow, JSON entries carry only heldInputPresent: true."
|
|
12133
12954
|
},
|
|
12134
12955
|
{
|
|
12135
12956
|
"name": "--no-held-input",
|
|
@@ -12168,6 +12989,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12168
12989
|
"runpane watch --self-test",
|
|
12169
12990
|
"runpane watch --follow",
|
|
12170
12991
|
"runpane watch --as monitor --follow --quiet --json",
|
|
12992
|
+
"runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
12171
12993
|
"runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
12172
12994
|
"runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 60000 --blocked-settle 15000 --min-interval 120000",
|
|
12173
12995
|
"runpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff",
|
|
@@ -12183,14 +13005,15 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12183
13005
|
"Cadence state is held per named consumer; an anonymous --follow with a cadence flag names itself follow-<pid>. Held lines survive a reconnect of the same consumer; a changed filter re-delivers them under the new filter.",
|
|
12184
13006
|
"Journal loss is surfaced through reset and dropped metadata.",
|
|
12185
13007
|
"The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly.",
|
|
12186
|
-
"Control lines are not journal entries. JSON kinds and their lines-format text: _ok (WATCH OK, once when armed), _heartbeat (HEARTBEAT, every --heartbeat seconds), _reconnected (WATCH RECONNECTED, after a retried daemon error), _error (WATCH ERROR, a daemon error; the process exits 2 unless --follow retries it), _reset (RESET, the journal restarted or the cursor fell behind; a fresh baseline follows),
|
|
12187
|
-
"Under --follow, JSON entries for panels holding unsubmitted composer text carry heldInputPresent: true, the JSON equivalent of the STUCK line. --no-held-input turns this off.",
|
|
13008
|
+
"Control lines are not journal entries. JSON kinds and their lines-format text: _ok (WATCH OK, once when armed), _heartbeat (HEARTBEAT, every --heartbeat seconds), _reconnected (WATCH RECONNECTED, after a retried daemon error), _error (WATCH ERROR, a daemon error; the process exits 2 unless --follow or --until-event retries it), _reset (RESET, the journal restarted or the cursor fell behind; a fresh baseline follows), _dropped (DROPPED, entries lost to journal truncation), and _timeout (WATCH TIMEOUT after <ms>ms, the --until-event deadline passed; the process exits 124). --quiet drops _ok, _heartbeat, _reconnected, and _timeout; _error, _reset, and _dropped always print, except under --until-event, where --quiet drops _reset and _dropped too.",
|
|
13009
|
+
"Under --follow, JSON entries for panels holding unsubmitted composer text carry heldInputPresent: true, the JSON equivalent of the STUCK line. Only typed composer text counts, the same reading as panels screen composer.hasUndeliveredText; an agent's dim or grey prompt suggestion or placeholder does not. --no-held-input turns this off.",
|
|
12188
13010
|
"--session <id|name> scopes the watch to a named Session. The daemon resolves the Session once per request and its associated Panes on every read, so sessions associate and sessions detach take effect without a re-arm; archived and detached Panes drop out, and the Session's own orchestrator panels are excluded. Cadence state is keyed by the Session, not its current Panes, so membership changes keep held lines. A detached Pane's held lines are dropped.",
|
|
12189
13011
|
"Under --session, pane.associated (JOINED <pane-name> pane <pane-id> session <session-id>) and pane.detached (LEFT ...) report membership changes; list them in --kinds next to the agent kinds. Other consumers receive them only when --kinds lists them, so older clients never see an unknown kind.",
|
|
12190
13012
|
"PR events (decision D7): about every 3 minutes (jittered) the daemon visits each Pane associated with a live Session (none: no gh at all), finds its PR by branch when no open PR is known yet (gh pr list --head, so unwatched workers' new and reopened PRs are found), runs gh pr view on an open PR, and appends pr.conflicted (PR <pane-name> pane <pane-id> #<number> CONFLICTED: the PR now conflicts with its base), pr.checks (... CHECKS PASSED, or CHECKS FAILED <up to five names>: every check on the head commit finished), and pr.merged (... MERGED). Entries carry pr: {number, url, headOid}, plus checks and failingChecks for pr.checks. They fire on transitions only: the first poll of a PR after the daemon starts only records its state, so re-check conflicts after a restart with gh pr view. pr.conflicted and failed pr.checks bypass --min-interval like BLOCKED. Like JOINED/LEFT, they reach a consumer only under --session or when --kinds lists them. Without gh, or while it is signed out or rate limited, polling backs off (up to an hour) and no PR entries arrive.",
|
|
12191
13013
|
"A daemon that predates --session returns no session field; runpane then fails with WATCH ERROR instead of watching every Pane.",
|
|
12192
13014
|
"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.",
|
|
12193
|
-
"agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's `runpane report`. It is opt-in: only a consumer that lists it in --kinds receives it. It bypasses --min-interval, and orchestrators treat it as the completion signal; a READY without a report means look, and maybe nudge."
|
|
13015
|
+
"agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's `runpane report`. It is opt-in: only a consumer that lists it in --kinds (or watches a Session) receives it. It passes --agents-only, which --follow and --until-event imply, whatever panel sent it: 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.",
|
|
13016
|
+
"Exit-to-wake vs streaming: a harness that wakes an agent when a process exits (Claude Code background Bash, Codex) waits with runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone, run as a background task; when it exits, act on the printed line and run it again. The named cursor means nothing is missed between runs and nothing repeats. Streaming monitors (Pane Chat's Session watch, a Monitor tool) keep --follow. Never pipe --follow into grep -m1, head, or any other exit-on-match reader: --follow does not exit when its reader does until its next write."
|
|
12194
13017
|
]
|
|
12195
13018
|
},
|
|
12196
13019
|
"panes git-status": {
|
|
@@ -13208,7 +14031,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13208
14031
|
"report": {
|
|
13209
14032
|
"name": "report",
|
|
13210
14033
|
"summary": "Hand back a worker's structured report: state, PR, head commit, summary, and the question when blocked.",
|
|
13211
|
-
"details": "Run this as a delegated worker when you finish, fail, or get blocked, as the last step of your task. The orchestrator receives it as an agent.report watch event and treats it as the completion signal.",
|
|
14034
|
+
"details": "Run this as a delegated worker when you finish, fail, or get blocked, as the last step of your task. The orchestrator receives it as an agent.report watch event and treats it as the completion signal. It prints whether anyone was waiting for it.",
|
|
13212
14035
|
"requiresPaneDaemon": true,
|
|
13213
14036
|
"mutates": true,
|
|
13214
14037
|
"arguments": [
|
|
@@ -13282,7 +14105,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13282
14105
|
"notes": [
|
|
13283
14106
|
"Inside a Pane terminal the report is for the current panel (PANE_SESSION_ID and PANE_PANEL_ID). Explicit --panel (with an optional --pane) wins; with neither, the command fails with a clear error.",
|
|
13284
14107
|
"Each report replaces the panel's previous one and survives a Pane restart.",
|
|
13285
|
-
"Watchers receive agent.report only when they list it in --kinds. REPORT lines skip the --min-interval batch."
|
|
14108
|
+
"Watchers receive agent.report only when they list it in --kinds or watch a Session; it passes --agents-only from any panel, a shell tab included. REPORT lines skip the --min-interval batch.",
|
|
14109
|
+
"The output says who received it: \"Delivered to N waiting watcher(s).\" counts watches waiting at that moment (liveWatchers in JSON). With no Session and nobody waiting it adds that the report is stored on the panel (runpane agents status --panel <id>) and that a named-cursor watch (runpane watch --as <name> --kinds agent.report) still receives it when it next waits. Zero is not a failure; the exit code is 0 either way."
|
|
13286
14110
|
]
|
|
13287
14111
|
},
|
|
13288
14112
|
"sessions list": {
|
|
@@ -13330,7 +14154,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13330
14154
|
"notes": [
|
|
13331
14155
|
"Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.",
|
|
13332
14156
|
"JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted.",
|
|
13333
|
-
"Create-time isPinned requires an updated Pane app. Older apps may ignore the field; use sessions pin after creation and read back the result."
|
|
14157
|
+
"Create-time isPinned requires an updated Pane app. Older apps may ignore the field; use sessions pin after creation and read back the result.",
|
|
14158
|
+
"runtime appears only on WSL Sessions (\"wsl\", with wslDistribution, Windows only). A Session on the native host has no runtime field on any OS; \"windows\" is accepted on input as a legacy name for the native host and is not stored.",
|
|
14159
|
+
"Payload fields (all optional on update; name required on create): name, goal, context, nextAction, launchCommand, profile (strings); isPinned and, on update, archived (booleans); agent (codex|claude|cursor); decisions and blockers (arrays of strings); evidence and outputs (arrays of links); create also takes runtime (windows|wsl) and wslDistribution; update also takes report, expectedRevision (the revision you read; the update is refused if the Session has moved on) and source (user|agent).",
|
|
14160
|
+
"A link is {\"label\": non-empty string, \"url\": an https://, http://, file:// or grain:// URL, \"addedAt\": ISO 8601 date such as 2026-10-14T09:30:00Z, \"kind\"?: evidence|output|ticket|pull-request|other, \"provenance\"?: string}.",
|
|
14161
|
+
"Arrays replace the stored value: send the whole list, not only new items. Limits: at most 100 items per array and 16000 characters per text.",
|
|
14162
|
+
"Every problem in the payload is reported at once in one ERR_SESSION_PAYLOAD_INVALID error (paths such as outputs[0].addedAt, \"missing\" for an absent required field), and nothing is changed.",
|
|
14163
|
+
"Example: {\"name\": \"Release QA\", \"goal\": \"Ship 2.5\", \"decisions\": [\"Cut from main\"], \"blockers\": [], \"outputs\": [{\"label\": \"Release PR\", \"url\": \"https://github.com/greenfield-inc/Pane/pull/1\", \"addedAt\": \"2026-10-14T09:30:00Z\", \"kind\": \"pull-request\"}]}"
|
|
13334
14164
|
]
|
|
13335
14165
|
},
|
|
13336
14166
|
"sessions get": {
|
|
@@ -13377,7 +14207,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13377
14207
|
],
|
|
13378
14208
|
"notes": [
|
|
13379
14209
|
"Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.",
|
|
13380
|
-
"JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted."
|
|
14210
|
+
"JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted.",
|
|
14211
|
+
"Payload fields (all optional on update; name required on create): name, goal, context, nextAction, launchCommand, profile (strings); isPinned and, on update, archived (booleans); agent (codex|claude|cursor); decisions and blockers (arrays of strings); evidence and outputs (arrays of links); create also takes runtime (windows|wsl) and wslDistribution; update also takes report, expectedRevision (the revision you read; the update is refused if the Session has moved on) and source (user|agent).",
|
|
14212
|
+
"A link is {\"label\": non-empty string, \"url\": an https://, http://, file:// or grain:// URL, \"addedAt\": ISO 8601 date such as 2026-10-14T09:30:00Z, \"kind\"?: evidence|output|ticket|pull-request|other, \"provenance\"?: string}.",
|
|
14213
|
+
"Arrays replace the stored value: send the whole list, not only new items. Limits: at most 100 items per array and 16000 characters per text.",
|
|
14214
|
+
"Every problem in the payload is reported at once in one ERR_SESSION_PAYLOAD_INVALID error (paths such as outputs[0].addedAt, \"missing\" for an absent required field), and nothing is changed.",
|
|
14215
|
+
"update only: report is {\"summary\": non-empty string, \"status\": reported|verified, \"evidence\": [at least one link], \"reportedAt\": ISO 8601 date, \"provenance\": non-empty string}; report null clears it.",
|
|
14216
|
+
"Example: {\"expectedRevision\": 4, \"nextAction\": \"Merge after CI\", \"decisions\": [\"Cut from main\", \"Skip beta\"], \"evidence\": [{\"label\": \"QA log\", \"url\": \"file:///tmp/qa.log\", \"addedAt\": \"2026-10-14T09:30:00Z\", \"kind\": \"evidence\", \"provenance\": \"qa agent\"}], \"report\": {\"summary\": \"QA passed\", \"status\": \"verified\", \"evidence\": [{\"label\": \"QA log\", \"url\": \"file:///tmp/qa.log\", \"addedAt\": \"2026-10-14T09:30:00Z\"}], \"reportedAt\": \"2026-10-14T09:31:00Z\", \"provenance\": \"qa agent\"}}"
|
|
13381
14217
|
]
|
|
13382
14218
|
},
|
|
13383
14219
|
"sessions set-agent": {
|
|
@@ -13804,8 +14640,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13804
14640
|
},
|
|
13805
14641
|
"handoff": {
|
|
13806
14642
|
"name": "handoff",
|
|
13807
|
-
"summary": "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it.",
|
|
13808
|
-
"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`.",
|
|
14643
|
+
"summary": "Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it. From a Session's terminal, create the Session on another machine instead.",
|
|
14644
|
+
"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.",
|
|
13809
14645
|
"requiresPaneDaemon": true,
|
|
13810
14646
|
"mutates": true,
|
|
13811
14647
|
"arguments": [
|
|
@@ -13817,7 +14653,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13817
14653
|
{
|
|
13818
14654
|
"name": "--template",
|
|
13819
14655
|
"required": false,
|
|
13820
|
-
"description": "Print the note template, with this checkout's origin and git state in its front matter, and exit."
|
|
14656
|
+
"description": "Print the note template, with this checkout's (or Session's) origin and git state in its front matter, and exit."
|
|
13821
14657
|
},
|
|
13822
14658
|
{
|
|
13823
14659
|
"name": "--note-file",
|
|
@@ -13881,6 +14717,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
13881
14717
|
"Another machine is reached through runpane workspace (Tailscale); it needs Pane running there with workspaces enabled and the repository saved. Repository listing and Pane creation call the reached daemon directly; no global destination CLI installation is required.",
|
|
13882
14718
|
"Destination preflight runs before sender commit/push. Inside WSL, an absent or refused local Linux daemon can fall back to its Windows host through reachable Windows Tailscale and enabled workspaces; explicit Pane directory selection keeps its instance. Select a native Windows saved repository; WSL saved repositories are rejected before sending.",
|
|
13883
14719
|
"A successful handoff requires initialInput.verifiedSubmitted and delivery taken or queued without blocked/error evidence. Unverified delivery exits nonzero with the created Pane, panel and a panels screen inspection command; inspect before retrying.",
|
|
14720
|
+
"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.",
|
|
13884
14721
|
"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.",
|
|
13885
14722
|
"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.",
|
|
13886
14723
|
"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."
|