runpane 2.4.186 → 2.4.188

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.
@@ -47,6 +47,8 @@ exports.RUNPANE_CONTRACT = {
47
47
  "pr.merged",
48
48
  "pr.closed",
49
49
  "pr.head",
50
+ "pr.base_changed",
51
+ "pr.base_deleted",
50
52
  "pr.review",
51
53
  "pr.comment",
52
54
  "pr.stopped",
@@ -439,8 +441,8 @@ exports.RUNPANE_CONTRACT = {
439
441
  "name": "panes create",
440
442
  "summary": "1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create a Pane (a new worktree) only when the work's branch has no Pane yet; for review, audit, fix or QA on existing work use `panels create --pane <id>`.",
441
443
  "usage": [
442
- "runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]",
443
- "runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]",
444
+ "runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] [options] [--pane-dir <path>]",
445
+ "runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] [options] [--pane-dir <path>]",
444
446
  "runpane panes create --from-json <path|-> [--yes] [--json] [--pane-dir <path>]"
445
447
  ],
446
448
  "mutates": true,
@@ -450,7 +452,8 @@ exports.RUNPANE_CONTRACT = {
450
452
  ],
451
453
  "jsonSchemas": [
452
454
  "paneCreateRequest",
453
- "paneCreateResult"
455
+ "paneCreateResult",
456
+ "dispatchWaitResult"
454
457
  ],
455
458
  "localControl": true
456
459
  },
@@ -564,8 +567,8 @@ exports.RUNPANE_CONTRACT = {
564
567
  "name": "panels create",
565
568
  "summary": "Open a new agent or terminal tab inside an existing Pane, sharing its worktree. The default for review, QA, fixes and any other agent on work that already has a Pane.",
566
569
  "usage": [
567
- "runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]",
568
- "runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]"
570
+ "runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]",
571
+ "runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--focus|--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]"
569
572
  ],
570
573
  "mutates": true,
571
574
  "additive": true,
@@ -575,7 +578,8 @@ exports.RUNPANE_CONTRACT = {
575
578
  ],
576
579
  "jsonSchemas": [
577
580
  "panelCreateRequest",
578
- "panelCreateResult"
581
+ "panelCreateResult",
582
+ "dispatchWaitResult"
579
583
  ],
580
584
  "localControl": true
581
585
  },
@@ -655,7 +659,7 @@ exports.RUNPANE_CONTRACT = {
655
659
  "name": "panels submit",
656
660
  "summary": "Send and submit text to a terminal panel, including idle agent composers.",
657
661
  "usage": [
658
- "runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] [--source user|agent] --yes [--json] [--pane-dir <path>]"
662
+ "runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--source user|agent] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json] [--pane-dir <path>]"
659
663
  ],
660
664
  "mutates": true,
661
665
  "toolsets": [
@@ -663,7 +667,8 @@ exports.RUNPANE_CONTRACT = {
663
667
  ],
664
668
  "jsonSchemas": [
665
669
  "panelSubmitRequest",
666
- "panelSubmitResult"
670
+ "panelSubmitResult",
671
+ "dispatchWaitResult"
667
672
  ],
668
673
  "localControl": true
669
674
  },
@@ -1235,6 +1240,31 @@ exports.RUNPANE_CONTRACT = {
1235
1240
  ],
1236
1241
  "localControl": true
1237
1242
  },
1243
+ {
1244
+ "name": "inbox",
1245
+ "summary": "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.",
1246
+ "usage": [
1247
+ "runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]"
1248
+ ],
1249
+ "jsonSchemas": [
1250
+ "inboxListResult"
1251
+ ],
1252
+ "localControl": true
1253
+ },
1254
+ {
1255
+ "name": "inbox ack",
1256
+ "summary": "Clear Session inbox items once they are handled.",
1257
+ "usage": [
1258
+ "runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
1259
+ "runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]"
1260
+ ],
1261
+ "mutates": true,
1262
+ "idempotent": true,
1263
+ "jsonSchemas": [
1264
+ "inboxAckResult"
1265
+ ],
1266
+ "localControl": true
1267
+ },
1238
1268
  {
1239
1269
  "name": "sessions list",
1240
1270
  "summary": "List durable named orchestration Sessions.",
@@ -1670,6 +1700,11 @@ exports.RUNPANE_CONTRACT = {
1670
1700
  ],
1671
1701
  "description": "Read initial input from a file or stdin. --prompt-file is an alias."
1672
1702
  },
1703
+ {
1704
+ "name": "--attach",
1705
+ "value": "<file>",
1706
+ "description": "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable."
1707
+ },
1673
1708
  {
1674
1709
  "name": "--from-json",
1675
1710
  "value": "<path|->",
@@ -1808,7 +1843,12 @@ exports.RUNPANE_CONTRACT = {
1808
1843
  {
1809
1844
  "name": "--wait",
1810
1845
  "value": "<milliseconds>",
1811
- "description": "How long lock acquire waits for a held lock to come free; 0 (the default) returns at once."
1846
+ "description": "lock acquire: how long to wait for a held lock to come free; 0 (the default) returns at once. On panels submit, panels create and panes create, --wait takes no value: block until that panel reports, misses its report, waits on a prompt, or exits, then print one JSON result."
1847
+ },
1848
+ {
1849
+ "name": "--timeout",
1850
+ "value": "<duration>",
1851
+ "description": "With --wait: give up after this long (30m, 2h; 0 waits without limit) and exit 124."
1812
1852
  },
1813
1853
  {
1814
1854
  "name": "--note",
@@ -1956,7 +1996,7 @@ exports.RUNPANE_CONTRACT = {
1956
1996
  },
1957
1997
  {
1958
1998
  "name": "--as-file-pointer",
1959
- "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
1999
+ "description": "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."
1960
2000
  },
1961
2001
  {
1962
2002
  "name": "--follow",
@@ -2013,6 +2053,18 @@ exports.RUNPANE_CONTRACT = {
2013
2053
  {
2014
2054
  "name": "--interrupt",
2015
2055
  "description": "Stop the current agent turn, wait for an empty idle composer, then submit and verify the replacement."
2056
+ },
2057
+ {
2058
+ "name": "--expect-report",
2059
+ "description": "Pane expects a `runpane report` and emits agent.report.missing if the agent goes ready or exits without one. The default for work an agent sends; use it to ask for one on work marked --source user."
2060
+ },
2061
+ {
2062
+ "name": "--no-expect-report",
2063
+ "description": "Send work without waiting for a `runpane report` (fire-and-forget input); no agent.report.missing follows."
2064
+ },
2065
+ {
2066
+ "name": "--all",
2067
+ "description": "inbox ack only: clear every item of the --session."
2016
2068
  }
2017
2069
  ]
2018
2070
  },
@@ -2080,6 +2132,8 @@ exports.RUNPANE_CONTRACT = {
2080
2132
  " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]",
2081
2133
  " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]",
2082
2134
  " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]",
2135
+ " runpane inbox [--session <id|name>] [--json]",
2136
+ " runpane inbox ack <item-id>... [--session <id|name>] [--json]",
2083
2137
  " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
2084
2138
  " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]",
2085
2139
  " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]",
@@ -2307,9 +2361,10 @@ exports.RUNPANE_CONTRACT = {
2307
2361
  "What --follow does by default (see defaults.watch.follow in the contract):",
2308
2362
  " prints WATCH OK once when armed, then one line per event, with no heartbeats",
2309
2363
  " kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
2310
- " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
2364
+ " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,",
2365
+ " pr.base_changed, pr.base_deleted",
2311
2366
  " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
2312
- " (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
2367
+ " (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)",
2313
2368
  " IDLE reminders at 10m, 30m, 1h, 3h, then daily",
2314
2369
  " ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
2315
2370
  "",
@@ -2318,6 +2373,8 @@ exports.RUNPANE_CONTRACT = {
2318
2373
  "its line, then run it again; its named cursor means nothing is missed between runs.",
2319
2374
  "Single-event waits deliver immediately without follow settling or batching.",
2320
2375
  "--follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since.",
2376
+ "agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:",
2377
+ "add it to --kinds to wake on MISSING REPORT too.",
2321
2378
  "",
2322
2379
  "Options:",
2323
2380
  " --session <id|name> Watch every Pane in a Session; associate/detach apply live",
@@ -2376,6 +2433,12 @@ exports.RUNPANE_CONTRACT = {
2376
2433
  " --prompt <text> Alias for --initial-input",
2377
2434
  " --initial-input-file <path|-> Read initial input from a file or stdin",
2378
2435
  " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt",
2436
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable",
2437
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
2438
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
2439
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
2440
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
2441
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
2379
2442
  " --prompt-file <path|-> Alias for --initial-input-file",
2380
2443
  " --from-json <path|-> Read a full request payload",
2381
2444
  " --timeout-ms <milliseconds> Pane creation timeout",
@@ -2600,7 +2663,7 @@ exports.RUNPANE_CONTRACT = {
2600
2663
  ],
2601
2664
  "panels submit": [
2602
2665
  "Usage:",
2603
- " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
2666
+ " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]",
2604
2667
  "",
2605
2668
  "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
2606
2669
  "",
@@ -2610,11 +2673,23 @@ exports.RUNPANE_CONTRACT = {
2610
2673
  "",
2611
2674
  "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.",
2612
2675
  "",
2676
+ "Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.",
2677
+ "It returns once, with a compact result: outcome, ids, the report (state, summary,",
2678
+ "summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing",
2679
+ "report. Answer a blocked panel with `panels submit --no-expect-report`,",
2680
+ "then watch for the original result.",
2681
+ "",
2613
2682
  "Options:",
2614
2683
  " --panel <panel-id> Terminal panel id",
2615
2684
  " --text <text> Text to submit before Enter",
2616
2685
  " --input-file <path|-> Read text from a file or stdin before Enter",
2617
2686
  " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
2687
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable",
2688
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
2689
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
2690
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
2691
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
2692
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
2618
2693
  " --pane-dir <path> Connect to a specific Pane data directory",
2619
2694
  " --json Print machine-readable output",
2620
2695
  " --yes Skip confirmation for this mutating command",
@@ -2639,8 +2714,8 @@ exports.RUNPANE_CONTRACT = {
2639
2714
  "Create a terminal-backed tool panel inside an existing Pane session.",
2640
2715
  "",
2641
2716
  "Usage:",
2642
- " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--title <title>] [--initial-input <text>] [--no-focus] [--wait-ready] --yes [--json]",
2643
- " runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--no-focus] [--wait-ready] --yes [--json]",
2717
+ " runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--title <title>] [--initial-input <text>] [--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]",
2718
+ " runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--no-focus] [--wait-ready] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]",
2644
2719
  "",
2645
2720
  "Options:",
2646
2721
  " --pane <pane-id> Existing Pane session to add the panel to.",
@@ -2650,6 +2725,12 @@ exports.RUNPANE_CONTRACT = {
2650
2725
  " --initial-input, --prompt Initial input to send after the tool starts.",
2651
2726
  " --initial-input-file <path|-> Read initial input from a file or stdin.",
2652
2727
  " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.",
2728
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable.",
2729
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
2730
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
2731
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
2732
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
2733
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
2653
2734
  " --no-focus Create the panel in the background.",
2654
2735
  " --focus Explicitly focus the created panel.",
2655
2736
  " --source <user|agent> Mark the mutation source; agent implies background creation.",
@@ -3322,6 +3403,35 @@ exports.RUNPANE_CONTRACT = {
3322
3403
  "runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
3323
3404
  "",
3324
3405
  "List PR registrations and stopped watches."
3406
+ ],
3407
+ "inbox": [
3408
+ "Usage:",
3409
+ " runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]",
3410
+ "",
3411
+ "Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),",
3412
+ "missing reports (agent.report.missing), and questions waiting on a worker's screen",
3413
+ "(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across",
3414
+ "restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.",
3415
+ "",
3416
+ "Options:",
3417
+ " --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID",
3418
+ " --pane-dir <path> Connect to a specific Pane data directory",
3419
+ " --json Print machine-readable output",
3420
+ "",
3421
+ "Clear handled items with `runpane inbox ack <item-id>...`."
3422
+ ],
3423
+ "inbox ack": [
3424
+ "Usage:",
3425
+ " runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
3426
+ " runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]",
3427
+ "",
3428
+ "Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.",
3429
+ "",
3430
+ "Options:",
3431
+ " --session <id|name> Only clear items of this Session; required with --all",
3432
+ " --all Clear every item of the Session",
3433
+ " --pane-dir <path> Connect to a specific Pane data directory",
3434
+ " --json Print machine-readable output"
3325
3435
  ]
3326
3436
  },
3327
3437
  "pip": {
@@ -3372,6 +3482,8 @@ exports.RUNPANE_CONTRACT = {
3372
3482
  " runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]",
3373
3483
  " runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> --yes [--json] [--pane-dir <path>]",
3374
3484
  " runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary-file <path|->] [--question <text>] [--json]",
3485
+ " runpane inbox [--session <id|name>] [--json]",
3486
+ " runpane inbox ack <item-id>... [--session <id|name>] [--json]",
3375
3487
  " runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]",
3376
3488
  " runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]",
3377
3489
  " runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]",
@@ -3594,9 +3706,10 @@ exports.RUNPANE_CONTRACT = {
3594
3706
  "What --follow does by default (see defaults.watch.follow in the contract):",
3595
3707
  " prints WATCH OK once when armed, then one line per event, with no heartbeats",
3596
3708
  " kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
3597
- " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
3709
+ " pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged,",
3710
+ " pr.base_changed, pr.base_deleted",
3598
3711
  " READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
3599
- " (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
3712
+ " (REPORT, BLOCKED, conflicts, base changes, and failed checks arrive at once)",
3600
3713
  " IDLE reminders at 10m, 30m, 1h, 3h, then daily",
3601
3714
  " ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
3602
3715
  "",
@@ -3605,6 +3718,8 @@ exports.RUNPANE_CONTRACT = {
3605
3718
  "its line, then run it again; its named cursor means nothing is missed between runs.",
3606
3719
  "Single-event waits deliver immediately without follow settling or batching.",
3607
3720
  "--follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since.",
3721
+ "agent.report.missing (an agent given work ended its turn or exited without `runpane report`) is opt-in:",
3722
+ "add it to --kinds to wake on MISSING REPORT too.",
3608
3723
  "",
3609
3724
  "Options:",
3610
3725
  " --session <id|name> Watch every Pane in a Session; associate/detach apply live",
@@ -3663,6 +3778,12 @@ exports.RUNPANE_CONTRACT = {
3663
3778
  " --prompt <text> Alias for --initial-input",
3664
3779
  " --initial-input-file <path|-> Read initial input from a file or stdin",
3665
3780
  " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt",
3781
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable",
3782
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
3783
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
3784
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
3785
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
3786
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
3666
3787
  " --prompt-file <path|-> Alias for --initial-input-file",
3667
3788
  " --from-json <path|-> Read a full request payload",
3668
3789
  " --timeout-ms <milliseconds> Pane creation timeout",
@@ -3879,7 +4000,7 @@ exports.RUNPANE_CONTRACT = {
3879
4000
  ],
3880
4001
  "panels submit": [
3881
4002
  "Usage:",
3882
- " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
4003
+ " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer [--attach <file>]...] [--interrupt] [--expect-report|--no-expect-report] [--wait [--timeout <duration>]] --yes [--json]",
3883
4004
  "",
3884
4005
  "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
3885
4006
  "",
@@ -3889,11 +4010,23 @@ exports.RUNPANE_CONTRACT = {
3889
4010
  "",
3890
4011
  "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.",
3891
4012
  "",
4013
+ "Optional --wait returns a per-dispatch result; the orchestrator guide uses submit without --wait and a named watch. Choose one completion consumer.",
4014
+ "It returns once, with a compact result: outcome, ids, the report (state, summary,",
4015
+ "summaryPath, PR, head, question), screenLines for a prompt, or lastOutput for a missing",
4016
+ "report. Answer a blocked panel with `panels submit --no-expect-report`,",
4017
+ "then watch for the original result.",
4018
+ "",
3892
4019
  "Options:",
3893
4020
  " --panel <panel-id> Terminal panel id",
3894
4021
  " --text <text> Text to submit before Enter",
3895
4022
  " --input-file <path|-> Read text from a file or stdin before Enter",
3896
4023
  " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
4024
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable",
4025
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
4026
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
4027
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
4028
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
4029
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
3897
4030
  " --pane-dir <path> Connect to a specific Pane data directory",
3898
4031
  " --json Print machine-readable output",
3899
4032
  " --yes Skip confirmation for this mutating command",
@@ -3929,6 +4062,12 @@ exports.RUNPANE_CONTRACT = {
3929
4062
  " --initial-input, --prompt Initial input to send after the tool starts.",
3930
4063
  " --initial-input-file <path|-> Read initial input from a file or stdin.",
3931
4064
  " --as-file-pointer Send `Read and follow <prompt file>` instead of the prompt.",
4065
+ " --attach <file> Copy a file beside the prompt file and list it; repeatable.",
4066
+ " --expect-report Expect a `runpane report` even for --source user work (the default otherwise)",
4067
+ " --no-expect-report Fire-and-forget: no agent.report.missing if the agent ends without reporting",
4068
+ " --wait Block until this panel reports, misses its report, waits on a prompt, or exits;",
4069
+ " print one JSON line (exit 0 report, 3 missing, 4 blocked, 5 exited, 124 timeout)",
4070
+ " --timeout <duration> With --wait: give up after this long (30m, 2h)",
3932
4071
  " --no-focus Create the panel in the background.",
3933
4072
  " --focus Explicitly focus the created panel.",
3934
4073
  " --source <user|agent> Mark the mutation source; agent implies background creation.",
@@ -4525,6 +4664,35 @@ exports.RUNPANE_CONTRACT = {
4525
4664
  "runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
4526
4665
  "",
4527
4666
  "List PR registrations and stopped watches."
4667
+ ],
4668
+ "inbox": [
4669
+ "Usage:",
4670
+ " runpane inbox [--session <id|name>] [--json] [--pane-dir <path>]",
4671
+ "",
4672
+ "Lists what a Session's orchestrator has not acknowledged: worker reports (agent.report),",
4673
+ "missing reports (agent.report.missing), and questions waiting on a worker's screen",
4674
+ "(agent.blocked; these clear themselves once the worker moves on). Pane keeps them across",
4675
+ "restarts. An orchestrator reads it when it starts or resumes, to catch what finished while it was down.",
4676
+ "",
4677
+ "Options:",
4678
+ " --session <id|name> Session; defaults to PANE_ORCHESTRATION_SESSION_ID",
4679
+ " --pane-dir <path> Connect to a specific Pane data directory",
4680
+ " --json Print machine-readable output",
4681
+ "",
4682
+ "Clear handled items with `runpane inbox ack <item-id>...`."
4683
+ ],
4684
+ "inbox ack": [
4685
+ "Usage:",
4686
+ " runpane inbox ack <item-id>... [--session <id|name>] [--json] [--pane-dir <path>]",
4687
+ " runpane inbox ack --all --session <id|name> [--json] [--pane-dir <path>]",
4688
+ "",
4689
+ "Clears Session inbox items. Ids that match nothing are listed as unknown; acknowledging twice is harmless.",
4690
+ "",
4691
+ "Options:",
4692
+ " --session <id|name> Only clear items of this Session; required with --all",
4693
+ " --all Clear every item of the Session",
4694
+ " --pane-dir <path> Connect to a specific Pane data directory",
4695
+ " --json Print machine-readable output"
4528
4696
  ]
4529
4697
  }
4530
4698
  },
@@ -4681,10 +4849,13 @@ exports.RUNPANE_CONTRACT = {
4681
4849
  "`sessions set-agent` switch the durable terminal agent for a named Session.",
4682
4850
  "`sessions associate` associate a user-visible Pane with a named Session.",
4683
4851
  "`sessions detach` detach a Pane from a named Session.",
4684
- "`sessions overview` read a live status, activity, git, and pull request overview for a named Session.",
4852
+ "`sessions overview` read a live status, activity, git, and pull request overview for a named Session. Each panel in `panes[].panels[]` carries its own latest `runpane report` as `report`, so one call shows what every worker last reported and when (`reportedAt`, next to the panel's `state` and `lastActivityAt`). When a report's summary is a complete JSON object, such as a status file sent with `--summary-file`, `report.data` holds it exactly as the worker gave it; Pane never reads, renames or validates its fields. A summary that is not a JSON object (plain text, an array, a scalar or invalid JSON), is nested more than 64 levels deep, or was truncated (`summaryTruncated`), has no `data`. A panel that never reported has no `report`. `panes[].report` is still the newest report among the Pane's panels.",
4685
4853
  "`runpane lock acquire|release|list` coordinate a resource shared between agents, such as one test account. The caller's Pane and panel own the lock; it is scoped to the owner's Session (or global outside one), renews for the same owner, and is released on TTL expiry, owner panel exit, or owner Pane archive. `--wait` blocks in the daemon until the lock comes free.",
4686
4854
  "`runpane agents start|status|send` finish the three common agent jobs in one call each: start an agent on a task (a new tab in the work's Pane with `--pane <id>`, or a new Pane for new work), check on it, and send it a follow-up.",
4687
- "`runpane report --state ready|blocked|failed|done` is how a worker hands back its result. It stores the latest report on the worker's panel (state, `--pr`, `--head`, up to 16,000 characters of `--summary` or `--summary-file`, and the `--question` a blocked worker needs answered), journals an opt-in `agent.report` watch event (`REPORT <pane-name> pane <pane-id> panel <panel-id> ready pr#747 fc5dce9`; it skips the `--min-interval` batch), records it as Session activity, and shows it in `agents status`, `panels list`, and `sessions overview` (`panes[].report`). Inside a Pane terminal the panel comes from `PANE_SESSION_ID` and `PANE_PANEL_ID`; elsewhere pass `--pane` and `--panel`. It prints how many watches were waiting for the report and received it (`Delivered to 1 waiting watcher.`, `liveWatchers` in JSON). Zero means nobody was waiting right now, not that the report is lost: it stays on the panel, and a named-cursor watch receives it when it next waits.",
4855
+ "`runpane report --state ready|blocked|failed|done` is how a worker hands back its result. It stores the latest report on the worker's panel (state, `--pr`, `--head`, up to 16,000 characters of `--summary` or `--summary-file`, and the `--question` a blocked worker needs answered), journals an opt-in `agent.report` watch event (`REPORT <pane-name> pane <pane-id> panel <panel-id> ready pr#747 fc5dce9`; it skips the `--min-interval` batch), records it as Session activity, and shows it in `agents status`, `panels list`, and `sessions overview` (each panel's own report as `panes[].panels[].report`, with a JSON object summary as `data`, and the Pane's newest as `panes[].report`). Inside a Pane terminal the panel comes from `PANE_SESSION_ID` and `PANE_PANEL_ID`; elsewhere pass `--pane` and `--panel`. It prints how many watches were waiting for the report and received it (`Delivered to 1 waiting watcher.`, `liveWatchers` in JSON). Zero means nobody was waiting right now, not that the report is lost: it stays on the panel, and a named-cursor watch receives it when it next waits.",
4856
+ "Work sent to an agent through `runpane panels create`, `panes create` (with a prompt), or `panels submit` records that the sender waits for a `runpane report`, unless the request says `--source user` (Pane's own UI does) or `--no-expect-report`; `--expect-report` asks for one anyway. Typing into a tab never does. If the agent then goes ready or its panel exits without a report, Pane journals one opt-in `agent.report.missing` entry (`MISSING REPORT <pane-name> pane <pane-id> panel <panel-id> ready|exited`) whose `lastOutput` is the agent's last transcript reply or last screen lines; it skips the `--min-interval` batch and reaches only watchers that list it in `--kinds`. While the agent's screen shows background work (Claude's `· 1 shell` footer or a running background subagent row, Codex's `background terminal running` line), Pane waits and looks again every 10 seconds instead. `agent.blocked` entries carry `screenLines`, the prompt the agent waits on, and are journalled once a panel has stayed blocked for 2 seconds.",
4857
+ "The orchestrator guide prescribes submit without `--wait`, followed by its named watch; use one completion consumer. As an optional CLI route, `--wait` on `runpane panels submit`, `panels create`, and `panes create` turns the expected report on and blocks on that panel until the first `agent.report`, `agent.report.missing`, `agent.blocked`, `panel.exited`, or `pane.gone`, then prints one line of JSON (`dispatchWaitResult`): the outcome, ids, the report's state, summary, `summaryPath`, PR and head, `screenLines` for a prompt, or `lastOutput` for a missing report, never the transcript. It exits 0 for a report, 3 missing, 4 blocked, 5 exited or gone, and 124 when `--timeout <duration>` passes. It follows the journal from the position the daemon took before delivering the work, so nothing that happens right after delivery is missed. It reuses watch --until-event and returns indeterminate (exit 6) if the journal epoch changes or retained history is lost; inspect the panel and inbox before retrying. Report-expected dispatches are serialized per panel and refused before writing while a result or missing-output collection is outstanding. Answer a blocked panel with panels submit --no-expect-report, then watch for the original result.",
4858
+ "`runpane inbox [--session <id|name>] [--json]` lists what a Session's orchestrator has not acknowledged: reports, missing reports, and on-screen questions (a question clears itself once its panel moves on). `runpane inbox ack <item-id>...` or `--all --session <id|name>` clears items. An orchestrator runs it when it starts or resumes, to catch anything that finished while it was down; Pane never injects the inbox into its turns.",
4688
4859
  "`runpane panels resume --panel <panel-id>` restarts a stopped terminal panel in place, keeping its panel id: an agent panel relaunches with its resume command (Claude `--resume <session>`, `codex resume <session>`, Agent Farm `agent-farm run <profile> --resume <id>` with the ID Agent Farm printed; the result's `agentSessionId` names it), the same restart the app runs when it shows the panel, without taking focus. A running panel is left alone (`action: \"already-running\"`); one whose agent exited back to its shell is stopped, and resume runs its saved command again in that shell (`action: \"resumed\"`). If that command exits at once, `--wait-ready` returns `ok: false` with `reason.code: \"command-exited\"` and the error line it printed. `--session <id|name>` or `--all-stopped` resumes every stopped agent panel in that scope, `--concurrency` at a time (default 3), then, with `--wait-ready`, waits on the resumed panels together, and returns `{ resumed, alreadyRunning, failed, notReady, items[] }` with each panel's own result, readiness, and blocker or error. After a Pane restart, or once an agent exits back to its shell, stopped panels report `running: false` (`initialized` stays true while the shell lives) in `panels list`, `panels screen`, and `panels wait` (which returns `stopped: true` instead of timing out), and `nextCommand` points at `panels resume`. `runpane watch` reports them as `panel.stopped` (`STOPPED ...`) when `--kinds` lists that kind; other consumers and `workspace state` see `agent.unknown` with `running: false`, never `agent.ready`.",
4689
4860
  "`runpane panels last-message --panel <panel-id>` reads a Claude or Codex agent's last reply from its transcript (up to `--limit` characters, default 20,000, keeping the end and reporting `truncated`). It never scrapes the screen: without a transcript it prints `{ ok: false, reason: \"transcript-unavailable\" }` and exits 1.",
4690
4861
  "Commands with a contract `daemonAction` (the `panes` git, script, restore, and move commands, `folders list|create`, and `links open`) call the same Pane daemon channel as the matching button in the app and print `{ ok, data, error }`. Destructive ones add a pane:// `link` to review the Pane.",
@@ -5654,6 +5825,117 @@ exports.RUNPANE_CONTRACT = {
5654
5825
  "42",
5655
5826
  "--epoch",
5656
5827
  "test-epoch"
5828
+ ],
5829
+ [
5830
+ "panels",
5831
+ "submit",
5832
+ "--panel",
5833
+ "panel-1",
5834
+ "--text",
5835
+ "go",
5836
+ "--expect-report",
5837
+ "--yes",
5838
+ "--json"
5839
+ ],
5840
+ [
5841
+ "panels",
5842
+ "create",
5843
+ "--pane",
5844
+ "pane-1",
5845
+ "--agent",
5846
+ "claude",
5847
+ "--expect-report",
5848
+ "--yes"
5849
+ ],
5850
+ [
5851
+ "panes",
5852
+ "create",
5853
+ "--repo",
5854
+ "active",
5855
+ "--name",
5856
+ "feat",
5857
+ "--agent",
5858
+ "codex",
5859
+ "--expect-report",
5860
+ "--yes"
5861
+ ],
5862
+ [
5863
+ "inbox",
5864
+ "--session",
5865
+ "Release",
5866
+ "--json"
5867
+ ],
5868
+ [
5869
+ "inbox",
5870
+ "ack",
5871
+ "in-1a2b3c4d",
5872
+ "in-5e6f7a8b",
5873
+ "--session",
5874
+ "Release",
5875
+ "--json"
5876
+ ],
5877
+ [
5878
+ "inbox",
5879
+ "ack",
5880
+ "--all",
5881
+ "--session",
5882
+ "Release"
5883
+ ],
5884
+ [
5885
+ "panels",
5886
+ "submit",
5887
+ "--panel",
5888
+ "panel-1",
5889
+ "--text",
5890
+ "fyi",
5891
+ "--no-expect-report",
5892
+ "--yes"
5893
+ ],
5894
+ [
5895
+ "panels",
5896
+ "submit",
5897
+ "--panel",
5898
+ "panel-1",
5899
+ "--input-file",
5900
+ "prompt.md",
5901
+ "--as-file-pointer",
5902
+ "--wait",
5903
+ "--yes"
5904
+ ],
5905
+ [
5906
+ "panels",
5907
+ "submit",
5908
+ "--panel",
5909
+ "panel-1",
5910
+ "--text",
5911
+ "Red",
5912
+ "--wait",
5913
+ "--timeout",
5914
+ "30m",
5915
+ "--yes",
5916
+ "--json"
5917
+ ],
5918
+ [
5919
+ "panes",
5920
+ "create",
5921
+ "--repo",
5922
+ "active",
5923
+ "--name",
5924
+ "feat",
5925
+ "--agent",
5926
+ "claude",
5927
+ "--prompt-file",
5928
+ "task.md",
5929
+ "--wait",
5930
+ "--yes"
5931
+ ],
5932
+ [
5933
+ "lock",
5934
+ "acquire",
5935
+ "--name",
5936
+ "deploy",
5937
+ "--wait",
5938
+ "5000"
5657
5939
  ]
5658
5940
  ],
5659
5941
  "topLevelHelpIncludes": [
@@ -6499,6 +6781,12 @@ exports.RUNPANE_CONTRACT = {
6499
6781
  },
6500
6782
  "initialInputAsFilePointer": {
6501
6783
  "type": "boolean"
6784
+ },
6785
+ "initialInputAttachments": {
6786
+ "type": "array",
6787
+ "items": {
6788
+ "type": "string"
6789
+ }
6502
6790
  }
6503
6791
  },
6504
6792
  "additionalProperties": false
@@ -6527,6 +6815,12 @@ exports.RUNPANE_CONTRACT = {
6527
6815
  },
6528
6816
  "initialInputAsFilePointer": {
6529
6817
  "type": "boolean"
6818
+ },
6819
+ "initialInputAttachments": {
6820
+ "type": "array",
6821
+ "items": {
6822
+ "type": "string"
6823
+ }
6530
6824
  }
6531
6825
  },
6532
6826
  "additionalProperties": false
@@ -6567,6 +6861,10 @@ exports.RUNPANE_CONTRACT = {
6567
6861
  "associateSession": {
6568
6862
  "type": "string",
6569
6863
  "description": "Session id to associate each created Pane with; the CLI sets it from PANE_ORCHESTRATION_SESSION_ID unless --no-associate."
6864
+ },
6865
+ "expectReport": {
6866
+ "type": "boolean",
6867
+ "description": "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."
6570
6868
  }
6571
6869
  },
6572
6870
  "additionalProperties": false
@@ -6900,6 +7198,12 @@ exports.RUNPANE_CONTRACT = {
6900
7198
  "promptFile": {
6901
7199
  "type": "string"
6902
7200
  },
7201
+ "attachments": {
7202
+ "type": "array",
7203
+ "items": {
7204
+ "type": "string"
7205
+ }
7206
+ },
6903
7207
  "warnings": {
6904
7208
  "$ref": "#/jsonSchemas/panelSubmitResult/properties/warnings"
6905
7209
  },
@@ -6996,6 +7300,10 @@ exports.RUNPANE_CONTRACT = {
6996
7300
  }
6997
7301
  ]
6998
7302
  }
7303
+ },
7304
+ "epoch": {
7305
+ "type": "string",
7306
+ "description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
6999
7307
  }
7000
7308
  },
7001
7309
  "additionalProperties": false
@@ -7448,6 +7756,7 @@ exports.RUNPANE_CONTRACT = {
7448
7756
  "panel.exited",
7449
7757
  "panel.stopped",
7450
7758
  "agent.report",
7759
+ "agent.report.missing",
7451
7760
  "pane.associated",
7452
7761
  "pane.detached",
7453
7762
  "pr.conflicted",
@@ -7455,6 +7764,8 @@ exports.RUNPANE_CONTRACT = {
7455
7764
  "pr.merged",
7456
7765
  "pr.closed",
7457
7766
  "pr.head",
7767
+ "pr.base_changed",
7768
+ "pr.base_deleted",
7458
7769
  "pr.review",
7459
7770
  "pr.comment",
7460
7771
  "pr.stopped",
@@ -7577,6 +7888,23 @@ exports.RUNPANE_CONTRACT = {
7577
7888
  },
7578
7889
  "additionalProperties": false
7579
7890
  },
7891
+ "base": {
7892
+ "type": "object",
7893
+ "description": "Base branch of a pr.base_changed (old to new) or pr.base_deleted (to is the PR's current base name) entry.",
7894
+ "required": [
7895
+ "from",
7896
+ "to"
7897
+ ],
7898
+ "properties": {
7899
+ "from": {
7900
+ "type": "string"
7901
+ },
7902
+ "to": {
7903
+ "type": "string"
7904
+ }
7905
+ },
7906
+ "additionalProperties": false
7907
+ },
7580
7908
  "checks": {
7581
7909
  "enum": [
7582
7910
  "passed",
@@ -7598,6 +7926,28 @@ exports.RUNPANE_CONTRACT = {
7598
7926
  "epoch": {
7599
7927
  "type": "string",
7600
7928
  "description": "Added to watch --json NDJSON events. Persist with gen after processing for numeric rearm."
7929
+ },
7930
+ "lastOutput": {
7931
+ "type": "string",
7932
+ "description": "What an agent.report.missing entry's agent said last, up to 2,000 characters (the end is kept)."
7933
+ },
7934
+ "lastOutputSource": {
7935
+ "enum": [
7936
+ "transcript",
7937
+ "screen"
7938
+ ],
7939
+ "description": "transcript: the agent's last reply; screen: the last lines on its screen."
7940
+ },
7941
+ "expectedSince": {
7942
+ "type": "string",
7943
+ "description": "When the work an agent.report.missing entry is about was sent."
7944
+ },
7945
+ "screenLines": {
7946
+ "type": "array",
7947
+ "items": {
7948
+ "type": "string"
7949
+ },
7950
+ "description": "The screen lines of the prompt an agent.blocked entry's agent waits on (at most 20)."
7601
7951
  }
7602
7952
  },
7603
7953
  "additionalProperties": false
@@ -7642,6 +7992,50 @@ exports.RUNPANE_CONTRACT = {
7642
7992
  },
7643
7993
  "additionalProperties": false
7644
7994
  },
7995
+ "panelReport": {
7996
+ "type": "object",
7997
+ "description": "A panel's latest runpane report in sessions overview. data is the summary when it is a complete JSON object, returned as the worker gave it; a plain-text, array, scalar, invalid, more than 64 levels deep, or truncated summary has no data.",
7998
+ "required": [
7999
+ "state",
8000
+ "reportedAt"
8001
+ ],
8002
+ "properties": {
8003
+ "state": {
8004
+ "enum": [
8005
+ "ready",
8006
+ "blocked",
8007
+ "failed",
8008
+ "done"
8009
+ ]
8010
+ },
8011
+ "pr": {
8012
+ "type": "number"
8013
+ },
8014
+ "head": {
8015
+ "type": "string"
8016
+ },
8017
+ "summary": {
8018
+ "type": "string"
8019
+ },
8020
+ "summaryTruncated": {
8021
+ "const": true
8022
+ },
8023
+ "summaryPath": {
8024
+ "type": "string"
8025
+ },
8026
+ "question": {
8027
+ "type": "string"
8028
+ },
8029
+ "reportedAt": {
8030
+ "type": "string"
8031
+ },
8032
+ "data": {
8033
+ "type": "object",
8034
+ "description": "The worker's JSON object summary, returned as given. Pane never reads, renames or validates its fields."
8035
+ }
8036
+ },
8037
+ "additionalProperties": false
8038
+ },
7645
8039
  "workspaceWaitRequest": {
7646
8040
  "type": "object",
7647
8041
  "properties": {
@@ -8774,6 +9168,12 @@ exports.RUNPANE_CONTRACT = {
8774
9168
  "asFilePointer": {
8775
9169
  "type": "boolean"
8776
9170
  },
9171
+ "attachments": {
9172
+ "type": "array",
9173
+ "items": {
9174
+ "type": "string"
9175
+ }
9176
+ },
8777
9177
  "source": {
8778
9178
  "type": "string",
8779
9179
  "enum": [
@@ -8783,6 +9183,10 @@ exports.RUNPANE_CONTRACT = {
8783
9183
  },
8784
9184
  "interrupt": {
8785
9185
  "type": "boolean"
9186
+ },
9187
+ "expectReport": {
9188
+ "type": "boolean",
9189
+ "description": "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."
8786
9190
  }
8787
9191
  },
8788
9192
  "additionalProperties": false
@@ -8868,6 +9272,12 @@ exports.RUNPANE_CONTRACT = {
8868
9272
  "promptFile": {
8869
9273
  "type": "string"
8870
9274
  },
9275
+ "attachments": {
9276
+ "type": "array",
9277
+ "items": {
9278
+ "type": "string"
9279
+ }
9280
+ },
8871
9281
  "warnings": {
8872
9282
  "type": "array",
8873
9283
  "items": {
@@ -8900,6 +9310,23 @@ exports.RUNPANE_CONTRACT = {
8900
9310
  "observed",
8901
9311
  "unverifiable"
8902
9312
  ]
9313
+ },
9314
+ "expectedReport": {
9315
+ "type": "object",
9316
+ "required": [
9317
+ "since"
9318
+ ],
9319
+ "properties": {
9320
+ "since": {
9321
+ "type": "string"
9322
+ }
9323
+ },
9324
+ "additionalProperties": false,
9325
+ "description": "The report Pane now waits for: set for work an agent sent, or with --expect-report."
9326
+ },
9327
+ "epoch": {
9328
+ "type": "string",
9329
+ "description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
8903
9330
  }
8904
9331
  },
8905
9332
  "additionalProperties": false
@@ -9687,6 +10114,10 @@ exports.RUNPANE_CONTRACT = {
9687
10114
  },
9688
10115
  "readyTimeoutMs": {
9689
10116
  "type": "number"
10117
+ },
10118
+ "expectReport": {
10119
+ "type": "boolean",
10120
+ "description": "true or false decides whether Pane waits for a `runpane report`; omitted, it waits unless source is user (and, for a submit, only on an agent's panel)."
9690
10121
  }
9691
10122
  },
9692
10123
  "additionalProperties": false
@@ -9871,16 +10302,39 @@ exports.RUNPANE_CONTRACT = {
9871
10302
  "promptFile": {
9872
10303
  "type": "string"
9873
10304
  },
10305
+ "attachments": {
10306
+ "type": "array",
10307
+ "items": {
10308
+ "type": "string"
10309
+ }
10310
+ },
9874
10311
  "warnings": {
9875
10312
  "$ref": "#/jsonSchemas/panelSubmitResult/properties/warnings"
9876
10313
  },
9877
10314
  "nextCommand": {
9878
10315
  "type": "string"
9879
- }
9880
- },
9881
- "additionalProperties": false
9882
- },
9883
- "panelOpenRequest": {
10316
+ },
10317
+ "expectedReport": {
10318
+ "type": "object",
10319
+ "required": [
10320
+ "since"
10321
+ ],
10322
+ "properties": {
10323
+ "since": {
10324
+ "type": "string"
10325
+ }
10326
+ },
10327
+ "additionalProperties": false,
10328
+ "description": "The report Pane now waits for: set for work an agent sent, or with --expect-report."
10329
+ },
10330
+ "epoch": {
10331
+ "type": "string",
10332
+ "description": "Epoch of the journal position captured before dispatch; pass it with generation when waiting."
10333
+ }
10334
+ },
10335
+ "additionalProperties": false
10336
+ },
10337
+ "panelOpenRequest": {
9884
10338
  "type": "object",
9885
10339
  "required": [
9886
10340
  "paneId"
@@ -10144,7 +10598,23 @@ exports.RUNPANE_CONTRACT = {
10144
10598
  "type": "string"
10145
10599
  },
10146
10600
  "panes": {
10147
- "type": "array"
10601
+ "type": "array",
10602
+ "items": {
10603
+ "type": "object",
10604
+ "properties": {
10605
+ "panels": {
10606
+ "type": "array",
10607
+ "items": {
10608
+ "type": "object",
10609
+ "properties": {
10610
+ "report": {
10611
+ "$ref": "#/jsonSchemas/panelReport"
10612
+ }
10613
+ }
10614
+ }
10615
+ }
10616
+ }
10617
+ }
10148
10618
  },
10149
10619
  "activity": {
10150
10620
  "type": "array"
@@ -10938,6 +11408,234 @@ exports.RUNPANE_CONTRACT = {
10938
11408
  }
10939
11409
  },
10940
11410
  "additionalProperties": false
11411
+ },
11412
+ "inboxListResult": {
11413
+ "type": "object",
11414
+ "required": [
11415
+ "ok",
11416
+ "session",
11417
+ "items"
11418
+ ],
11419
+ "properties": {
11420
+ "ok": {
11421
+ "const": true
11422
+ },
11423
+ "session": {
11424
+ "type": "object",
11425
+ "required": [
11426
+ "id",
11427
+ "name"
11428
+ ],
11429
+ "properties": {
11430
+ "id": {
11431
+ "type": "string"
11432
+ },
11433
+ "name": {
11434
+ "type": "string"
11435
+ }
11436
+ },
11437
+ "additionalProperties": false
11438
+ },
11439
+ "items": {
11440
+ "type": "array",
11441
+ "items": {
11442
+ "type": "object",
11443
+ "required": [
11444
+ "id",
11445
+ "sessionId",
11446
+ "kind",
11447
+ "at",
11448
+ "paneId",
11449
+ "paneName",
11450
+ "panelId"
11451
+ ],
11452
+ "properties": {
11453
+ "id": {
11454
+ "type": "string"
11455
+ },
11456
+ "sessionId": {
11457
+ "type": "string"
11458
+ },
11459
+ "kind": {
11460
+ "enum": [
11461
+ "report",
11462
+ "report.missing",
11463
+ "blocked"
11464
+ ]
11465
+ },
11466
+ "at": {
11467
+ "type": "string"
11468
+ },
11469
+ "paneId": {
11470
+ "type": "string"
11471
+ },
11472
+ "paneName": {
11473
+ "type": "string"
11474
+ },
11475
+ "panelId": {
11476
+ "type": "string"
11477
+ },
11478
+ "panelTitle": {
11479
+ "type": "string"
11480
+ },
11481
+ "agentType": {
11482
+ "type": "string"
11483
+ },
11484
+ "report": {
11485
+ "$ref": "#/jsonSchemas/agentReport"
11486
+ },
11487
+ "lastOutput": {
11488
+ "type": "string"
11489
+ },
11490
+ "lastOutputSource": {
11491
+ "enum": [
11492
+ "transcript",
11493
+ "screen"
11494
+ ]
11495
+ },
11496
+ "reason": {
11497
+ "type": "string"
11498
+ },
11499
+ "screenLines": {
11500
+ "type": "array",
11501
+ "items": {
11502
+ "type": "string"
11503
+ }
11504
+ }
11505
+ },
11506
+ "additionalProperties": false
11507
+ }
11508
+ }
11509
+ },
11510
+ "additionalProperties": false
11511
+ },
11512
+ "inboxAckResult": {
11513
+ "type": "object",
11514
+ "required": [
11515
+ "ok",
11516
+ "acknowledged",
11517
+ "unknown"
11518
+ ],
11519
+ "properties": {
11520
+ "ok": {
11521
+ "const": true
11522
+ },
11523
+ "acknowledged": {
11524
+ "type": "array",
11525
+ "items": {
11526
+ "type": "string"
11527
+ }
11528
+ },
11529
+ "unknown": {
11530
+ "type": "array",
11531
+ "items": {
11532
+ "type": "string"
11533
+ }
11534
+ }
11535
+ },
11536
+ "additionalProperties": false
11537
+ },
11538
+ "dispatchWaitResult": {
11539
+ "type": "object",
11540
+ "description": "What `--wait` prints, as one line: how the dispatched work ended. Exit codes: 0 report, 3 missing, 4 blocked, 5 exited or gone, 124 timeout. Exit 6 is indeterminate after journal replacement or history loss; inspect the panel and inbox before retrying.",
11541
+ "required": [
11542
+ "ok",
11543
+ "outcome"
11544
+ ],
11545
+ "properties": {
11546
+ "ok": {
11547
+ "type": "boolean",
11548
+ "description": "true only for outcome report."
11549
+ },
11550
+ "outcome": {
11551
+ "enum": [
11552
+ "report",
11553
+ "missing",
11554
+ "blocked",
11555
+ "exited",
11556
+ "gone",
11557
+ "timeout",
11558
+ "indeterminate"
11559
+ ]
11560
+ },
11561
+ "paneId": {
11562
+ "type": "string"
11563
+ },
11564
+ "paneName": {
11565
+ "type": "string"
11566
+ },
11567
+ "panelId": {
11568
+ "type": "string"
11569
+ },
11570
+ "generation": {
11571
+ "type": "number",
11572
+ "description": "The journal entry that ended the wait (on timeout, the position reached)."
11573
+ },
11574
+ "at": {
11575
+ "type": "string"
11576
+ },
11577
+ "report": {
11578
+ "type": "object",
11579
+ "required": [
11580
+ "state"
11581
+ ],
11582
+ "properties": {
11583
+ "state": {
11584
+ "enum": [
11585
+ "ready",
11586
+ "blocked",
11587
+ "failed",
11588
+ "done"
11589
+ ]
11590
+ },
11591
+ "pr": {
11592
+ "type": "number"
11593
+ },
11594
+ "head": {
11595
+ "type": "string"
11596
+ },
11597
+ "summary": {
11598
+ "type": "string"
11599
+ },
11600
+ "summaryTruncated": {
11601
+ "const": true
11602
+ },
11603
+ "summaryPath": {
11604
+ "type": "string"
11605
+ },
11606
+ "question": {
11607
+ "type": "string"
11608
+ }
11609
+ },
11610
+ "additionalProperties": false
11611
+ },
11612
+ "screenLines": {
11613
+ "type": "array",
11614
+ "items": {
11615
+ "type": "string"
11616
+ }
11617
+ },
11618
+ "lastOutput": {
11619
+ "type": "string"
11620
+ },
11621
+ "lastOutputSource": {
11622
+ "enum": [
11623
+ "transcript",
11624
+ "screen"
11625
+ ]
11626
+ },
11627
+ "reason": {
11628
+ "type": "string"
11629
+ },
11630
+ "exitCode": {
11631
+ "type": "number"
11632
+ },
11633
+ "nextCommand": {
11634
+ "type": "string",
11635
+ "description": "Recovery command when the outcome is indeterminate."
11636
+ }
11637
+ },
11638
+ "additionalProperties": false
10941
11639
  }
10942
11640
  },
10943
11641
  "agentContext": {
@@ -11818,7 +12516,13 @@ exports.RUNPANE_CONTRACT = {
11818
12516
  {
11819
12517
  "name": "--as-file-pointer",
11820
12518
  "required": false,
11821
- "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
12519
+ "description": "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."
12520
+ },
12521
+ {
12522
+ "name": "--attach",
12523
+ "required": false,
12524
+ "value": "<file>",
12525
+ "description": "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."
11822
12526
  },
11823
12527
  {
11824
12528
  "name": "--from-json",
@@ -11894,6 +12598,27 @@ exports.RUNPANE_CONTRACT = {
11894
12598
  "value": "<path>",
11895
12599
  "required": false,
11896
12600
  "description": "Connect to a specific Pane data directory."
12601
+ },
12602
+ {
12603
+ "name": "--expect-report",
12604
+ "required": false,
12605
+ "description": "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."
12606
+ },
12607
+ {
12608
+ "name": "--no-expect-report",
12609
+ "required": false,
12610
+ "description": "Fire-and-forget input: don't wait for a report."
12611
+ },
12612
+ {
12613
+ "name": "--wait",
12614
+ "required": false,
12615
+ "description": "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."
12616
+ },
12617
+ {
12618
+ "name": "--timeout",
12619
+ "value": "<duration>",
12620
+ "required": false,
12621
+ "description": "With --wait: give up after this long and exit 124 (outcome timeout)."
11897
12622
  }
11898
12623
  ],
11899
12624
  "examples": [
@@ -11915,7 +12640,8 @@ exports.RUNPANE_CONTRACT = {
11915
12640
  "Agent-created Panes should pass `--source agent --no-focus --wait-ready --yes --json` unless the user explicitly wants focus moved. `panes create` pins the new Pane by default, so a follow-up `panes pin` call is unnecessary; pass `--no-pinned` for throwaway shells or bulk imports. `--pinned` is still accepted and is now a no-op. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.",
11916
12641
  "The built-in agent templates come from the runpane contract; custom terminal commands can pass agent-specific flags when requested by the user.",
11917
12642
  "Use --initial-input-file for multi-line prompts or shell-sensitive initial input. A long or multi-line prompt is never typed into the shell: on bash, zsh or sh the agent launches with `\"$(cat '<prompt file>')\"` reading a private copy under `<pane-dir>/prompts/<pane-id>/`; on PowerShell, cmd, fish or WSL the prompt is pasted into the agent's composer once it is ready.",
11918
- "`--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.",
12643
+ "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts.",
12644
+ "`--attach <file>` (repeatable, with `--as-file-pointer`) copies each file into a folder beside the prompt file and sends `Read and follow <path> (attached: <copy>, ...)`; the result lists the copies in `attachments`.",
11919
12645
  "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.",
11920
12646
  "With --wait-ready, `initialInput.delivery` reports `taken`, `queued`, `in-composer` or `unknown` with its evidence (`transcript`, `screen`, or `argv` for a prompt passed at launch); verifiedSubmitted is true for `taken` or `queued`. Routing initial input alone does not imply verified submission, and the create's `ok` is false unless a Claude or Codex starting message is verified.",
11921
12647
  "If initialInput.blocked.kind is submission_unverified, do not submit again automatically. Inspect initialInput.staged and attempts, then run nextCommand to resolve the ambiguous composer state.",
@@ -12619,7 +13345,13 @@ exports.RUNPANE_CONTRACT = {
12619
13345
  {
12620
13346
  "name": "--as-file-pointer",
12621
13347
  "required": false,
12622
- "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
13348
+ "description": "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."
13349
+ },
13350
+ {
13351
+ "name": "--attach",
13352
+ "required": false,
13353
+ "value": "<file>",
13354
+ "description": "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."
12623
13355
  },
12624
13356
  {
12625
13357
  "name": "--interrupt",
@@ -12641,9 +13373,31 @@ exports.RUNPANE_CONTRACT = {
12641
13373
  "value": "<path>",
12642
13374
  "required": false,
12643
13375
  "description": "Connect to a specific Pane data directory."
13376
+ },
13377
+ {
13378
+ "name": "--expect-report",
13379
+ "required": false,
13380
+ "description": "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."
13381
+ },
13382
+ {
13383
+ "name": "--no-expect-report",
13384
+ "required": false,
13385
+ "description": "Fire-and-forget input: don't wait for a report."
13386
+ },
13387
+ {
13388
+ "name": "--wait",
13389
+ "required": false,
13390
+ "description": "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."
13391
+ },
13392
+ {
13393
+ "name": "--timeout",
13394
+ "value": "<duration>",
13395
+ "required": false,
13396
+ "description": "With --wait: give up after this long and exit 124 (outcome timeout)."
12644
13397
  }
12645
13398
  ],
12646
13399
  "examples": [
13400
+ "runpane panels submit --panel <panel-id> --input-file prompt.md --as-file-pointer --wait --yes",
12647
13401
  "runpane panels submit --panel <panel-id> --text \"2\" --yes --json",
12648
13402
  "printf \"echo hello\" | runpane panels submit --panel <panel-id> --input-file - --yes --json",
12649
13403
  "runpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --json",
@@ -12659,7 +13413,8 @@ exports.RUNPANE_CONTRACT = {
12659
13413
  "Use `panels input` for Ctrl-C, escape sequences, or any workflow requiring exact bytes.",
12660
13414
  "On `blocked.kind: composer-unknown`, nothing was typed. Check `panels screen`; if the agent is at a prompt Pane does not recognise, use `panels input`.",
12661
13415
  "For Claude, text starting with `!`, `#`, `/` or `@` is sent unchanged and the result carries a `warnings` entry (for example `leading-bang-runs-shell`), because Claude Code gives those characters a meaning of its own.",
12662
- "`--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.",
13416
+ "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts.",
13417
+ "`--attach <file>` (repeatable, with `--as-file-pointer`) copies each file into a folder beside the prompt file and sends `Read and follow <path> (attached: <copy>, ...)`; the result lists the copies in `attachments`.",
12663
13418
  "With --interrupt, Pane sends the stop key only while the agent is active, waits for an empty idle composer, then submits. If readiness times out, replacement text is not sent. A queued result is not read yet: delivery.message explains the delay; never resend queued text. Interrupt success requires delivery.state: taken. Unknown agents and occupied composers are rejected without typing."
12664
13419
  ]
12665
13420
  },
@@ -12885,7 +13640,13 @@ exports.RUNPANE_CONTRACT = {
12885
13640
  {
12886
13641
  "name": "--as-file-pointer",
12887
13642
  "required": false,
12888
- "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
13643
+ "description": "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."
13644
+ },
13645
+ {
13646
+ "name": "--attach",
13647
+ "required": false,
13648
+ "value": "<file>",
13649
+ "description": "Copy a file beside the --as-file-pointer prompt file and list its copy in the pointer line; repeatable. Needs --as-file-pointer; the result lists the copies in `attachments`."
12889
13650
  },
12890
13651
  {
12891
13652
  "name": "--source",
@@ -12929,6 +13690,27 @@ exports.RUNPANE_CONTRACT = {
12929
13690
  "value": "<path>",
12930
13691
  "required": false,
12931
13692
  "description": "Connect to a specific Pane data directory."
13693
+ },
13694
+ {
13695
+ "name": "--expect-report",
13696
+ "required": false,
13697
+ "description": "Expect a `runpane report` even for --source user work. Work an agent sends expects one by default: Pane emits agent.report.missing (with the agent's last output) if the agent goes ready or exits without one."
13698
+ },
13699
+ {
13700
+ "name": "--no-expect-report",
13701
+ "required": false,
13702
+ "description": "Fire-and-forget input: don't wait for a report."
13703
+ },
13704
+ {
13705
+ "name": "--wait",
13706
+ "required": false,
13707
+ "description": "Block until this panel reports (exit 0), misses its report (3), waits on a prompt (4), or exits (5); print one JSON line. The way an orchestrator dispatches: run it as a background tool call."
13708
+ },
13709
+ {
13710
+ "name": "--timeout",
13711
+ "value": "<duration>",
13712
+ "required": false,
13713
+ "description": "With --wait: give up after this long and exit 124 (outcome timeout)."
12932
13714
  }
12933
13715
  ],
12934
13716
  "examples": [
@@ -13028,6 +13810,7 @@ exports.RUNPANE_CONTRACT = {
13028
13810
  "notes": [
13029
13811
  "Prefer this over opening the system browser when showing the user a page, plan, report, or dev server.",
13030
13812
  "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.",
13813
+ "When the user views Pane from another computer, a file page loads only files in its own folder and the folders inside it. Keep the page's CSS, scripts and images there, put them inline, or serve the folder over HTTP and open its localhost URL. Give file URLs as the host sees them, not as the other computer would.",
13031
13814
  "Opening a tab does not steal window focus; use `panes focus` only on explicit user request."
13032
13815
  ]
13033
13816
  },
@@ -13216,7 +13999,7 @@ exports.RUNPANE_CONTRACT = {
13216
13999
  "name": "--min-interval",
13217
14000
  "value": "<duration>",
13218
14001
  "required": false,
13219
- "description": "Override: batch READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines at most once per interval; REPORT, BLOCKED, pr.conflicted, and failed pr.checks arrive at once and carry the held lines. Default 10m. 0 turns batching off."
14002
+ "description": "Override: batch READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines at most once per interval; REPORT, BLOCKED, pr.conflicted, pr.base_changed, pr.base_deleted, and failed pr.checks arrive at once and carry the held lines. Default 10m. 0 turns batching off."
13220
14003
  },
13221
14004
  {
13222
14005
  "name": "--idle-after",
@@ -13302,7 +14085,7 @@ exports.RUNPANE_CONTRACT = {
13302
14085
  "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.",
13303
14086
  "agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's `runpane report`. It is in the default kinds of --follow and --until-event, and arrives from any panel: a shell tab or a wrapper launch whose agent is not yet detected included. It bypasses --min-interval, and orchestrators treat it as the completion signal; a READY without a report means look, and maybe nudge.",
13304
14087
  "Never pipe --follow into grep -m1, head, or any other exit-on-match reader: it does not exit when its reader does until its next write. To wait for one event, use --until-event.",
13305
- "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
14088
+ "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
13306
14089
  "--follow has one default cadence: READY 3m, BLOCKED 30s, non-urgent batches 10m, IDLE after 10m with backoff, expiry 3h, heartbeats off. Individual duration flags override it. --present and --profile were removed; use --ready-settle, --blocked-settle, and --min-interval for timing overrides.",
13307
14090
  "--until-event delivers matching events immediately without follow settling or batching. A harness that consumes a named follow stream gets its cadence; a process-exit waiter keeps immediate single-event semantics. --follow --since <generation> has no consumer name and bypasses settling and batching. Cadence requires a named follow consumer; --as cannot be combined with numeric --since."
13308
14091
  ]
@@ -14287,7 +15070,7 @@ exports.RUNPANE_CONTRACT = {
14287
15070
  {
14288
15071
  "name": "--as-file-pointer",
14289
15072
  "required": false,
14290
- "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
15073
+ "description": "Write the prompt or text to a private prompt file (in the Pane's worktree, hidden from git, when it has one) and send the one line `Read and follow <path>` instead."
14291
15074
  },
14292
15075
  {
14293
15076
  "name": "--yes",
@@ -14316,7 +15099,7 @@ exports.RUNPANE_CONTRACT = {
14316
15099
  "notes": [
14317
15100
  "`delivered` is true when the agent took the message or queued it for after its current turn; `delivery` says which (`taken` or `queued`) and how Pane knows (`transcript` or `screen`). Never resend a delivered message.",
14318
15101
  "It types the text, then queues with Tab when Codex is working or submits with Enter when ready. It is for messages, not keys. To answer a menu, use `runpane panels input --panel <panel-id> --keys down,enter --yes`, then check the screen with `runpane agents status`.",
14319
- "`--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."
15102
+ "`--as-file-pointer` writes the text to a prompt file readable only by you, inside the Pane's git worktree at `.pane/prompts/` (hidden by the repository's `.git/info/exclude`, never committed) when it has one, otherwise under `<pane-dir>/prompts/<pane-id>/`, so an agent limited to its working directories reads it without a permission prompt, and sends the one line `Read and follow <path>`, with the path relative to the worktree (where the agent starts) when the file is inside it; the result's `promptFile` is always absolute. Prefer it for long prompts."
14320
15103
  ]
14321
15104
  },
14322
15105
  "report": {
@@ -14594,7 +15377,8 @@ exports.RUNPANE_CONTRACT = {
14594
15377
  "sessionOverviewResult"
14595
15378
  ],
14596
15379
  "notes": [
14597
- "The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`)."
15380
+ "The result includes `locks`: named locks scoped to the Session or held by its Panes (see `runpane lock`).",
15381
+ "Each `panes[].panels[]` entry has `report`, that panel's latest `runpane report` (state, `pr`, `head`, `question`, `summary`, `summaryTruncated`, `summaryPath`, `reportedAt`). When the summary is a complete JSON object, `report.data` holds it exactly as the worker gave it; Pane never reads or renames its fields. A plain-text, array or scalar summary, invalid JSON, JSON nested more than 64 levels deep, or a truncated summary (`summaryTruncated`) has no `data`. A panel that never reported has no `report` but keeps `state` and `lastActivityAt`. `panes[].report` is still the newest report among the Pane's panels, with its `panelId`; daemons that predate per-panel reports omit `panels[].report`."
14598
15382
  ]
14599
15383
  },
14600
15384
  "lock acquire": {
@@ -15134,7 +15918,7 @@ exports.RUNPANE_CONTRACT = {
15134
15918
  "prWatchResult"
15135
15919
  ],
15136
15920
  "notes": [
15137
- "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15921
+ "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15138
15922
  "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
15139
15923
  ]
15140
15924
  },
@@ -15176,7 +15960,7 @@ exports.RUNPANE_CONTRACT = {
15176
15960
  "prWatchResult"
15177
15961
  ],
15178
15962
  "notes": [
15179
- "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15963
+ "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15180
15964
  "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
15181
15965
  ]
15182
15966
  },
@@ -15212,9 +15996,90 @@ exports.RUNPANE_CONTRACT = {
15212
15996
  "prWatchResult"
15213
15997
  ],
15214
15998
  "notes": [
15215
- "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15999
+ "Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.base_changed,pr.base_deleted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
15216
16000
  "Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
15217
16001
  ]
16002
+ },
16003
+ "inbox": {
16004
+ "name": "inbox",
16005
+ "summary": "List the reports, missing reports, and on-screen questions a Session's orchestrator has not acknowledged.",
16006
+ "details": "An orchestrator runs it when it starts or resumes, to catch reports, missing reports, and questions that arrived while it was down. Pane never adds the inbox to the orchestrator's turns.",
16007
+ "requiresPaneDaemon": true,
16008
+ "mutates": false,
16009
+ "arguments": [
16010
+ {
16011
+ "name": "--session",
16012
+ "value": "<id|name>",
16013
+ "required": false,
16014
+ "description": "Session; defaults to PANE_ORCHESTRATION_SESSION_ID."
16015
+ },
16016
+ {
16017
+ "name": "--json",
16018
+ "required": false,
16019
+ "description": "Print machine-readable output."
16020
+ },
16021
+ {
16022
+ "name": "--pane-dir",
16023
+ "value": "<path>",
16024
+ "required": false,
16025
+ "description": "Connect to a specific Pane data directory."
16026
+ }
16027
+ ],
16028
+ "examples": [
16029
+ "runpane inbox --session \"$PANE_ORCHESTRATION_SESSION_ID\" --json"
16030
+ ],
16031
+ "jsonSchemas": [
16032
+ "inboxListResult"
16033
+ ],
16034
+ "notes": [
16035
+ "Items: report (agent.report), report.missing (agent.report.missing), and blocked (agent.blocked, with the prompt's screen lines). Reports coalesce per panel, blockers clear when the panel moves on, and each Session keeps at most 200 items until acknowledged or superseded. A journal replay watermark recovers committed outcomes after restart within journal retention.",
16036
+ "A newer report replaces the panel's older report or missing report."
16037
+ ]
16038
+ },
16039
+ "inbox ack": {
16040
+ "name": "inbox ack",
16041
+ "summary": "Clear Session inbox items once they are handled.",
16042
+ "details": "Acknowledge each item once you have acted on it, so the hook stops repeating it.",
16043
+ "requiresPaneDaemon": true,
16044
+ "mutates": true,
16045
+ "arguments": [
16046
+ {
16047
+ "name": "<item-id>...",
16048
+ "required": false,
16049
+ "description": "Item ids from `runpane inbox`."
16050
+ },
16051
+ {
16052
+ "name": "--session",
16053
+ "value": "<id|name>",
16054
+ "required": false,
16055
+ "description": "Only clear items of this Session; required with --all."
16056
+ },
16057
+ {
16058
+ "name": "--all",
16059
+ "required": false,
16060
+ "description": "Clear every item of the Session."
16061
+ },
16062
+ {
16063
+ "name": "--json",
16064
+ "required": false,
16065
+ "description": "Print machine-readable output."
16066
+ },
16067
+ {
16068
+ "name": "--pane-dir",
16069
+ "value": "<path>",
16070
+ "required": false,
16071
+ "description": "Connect to a specific Pane data directory."
16072
+ }
16073
+ ],
16074
+ "examples": [
16075
+ "runpane inbox ack in-1a2b3c4d --json"
16076
+ ],
16077
+ "jsonSchemas": [
16078
+ "inboxAckResult"
16079
+ ],
16080
+ "notes": [
16081
+ "Unknown ids are reported under `unknown`; acknowledging twice is harmless."
16082
+ ]
15218
16083
  }
15219
16084
  },
15220
16085
  "managedBlock": [