runpane 2.4.182 → 2.4.184
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 +167 -74
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +106 -10
- package/dist/commands.js.map +1 -1
- package/dist/docs-index.json +1 -1
- package/dist/doctor.d.ts +1 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +5 -5
- package/dist/doctor.js.map +1 -1
- package/dist/generated/contract.d.ts +360 -164
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +720 -312
- package/dist/generated/contract.js.map +1 -1
- package/dist/localControl.d.ts +2 -1
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +51 -15
- package/dist/localControl.js.map +1 -1
- package/dist/update.d.ts +9 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +312 -0
- package/dist/update.js.map +1 -0
- package/dist/updateArtifacts.d.ts +12 -0
- package/dist/updateArtifacts.d.ts.map +1 -0
- package/dist/updateArtifacts.js +112 -0
- package/dist/updateArtifacts.js.map +1 -0
- package/dist/updateCapacity.d.ts +5 -0
- package/dist/updateCapacity.d.ts.map +1 -0
- package/dist/updateCapacity.js +72 -0
- package/dist/updateCapacity.js.map +1 -0
- package/dist/updateOperation.d.ts +48 -0
- package/dist/updateOperation.d.ts.map +1 -0
- package/dist/updateOperation.js +208 -0
- package/dist/updateOperation.js.map +1 -0
- package/dist/updatePackage.d.ts +14 -0
- package/dist/updatePackage.d.ts.map +1 -0
- package/dist/updatePackage.js +103 -0
- package/dist/updatePackage.js.map +1 -0
- package/dist/updatePreflight.d.ts +46 -0
- package/dist/updatePreflight.d.ts.map +1 -0
- package/dist/updatePreflight.js +134 -0
- package/dist/updatePreflight.js.map +1 -0
- package/dist/updatePython.d.ts +16 -0
- package/dist/updatePython.d.ts.map +1 -0
- package/dist/updatePython.js +46 -0
- package/dist/updatePython.js.map +1 -0
- package/dist/updateRuntime.d.ts +3 -0
- package/dist/updateRuntime.d.ts.map +1 -0
- package/dist/updateRuntime.js +61 -0
- package/dist/updateRuntime.js.map +1 -0
- package/dist/updateSupervisor.d.ts +13 -0
- package/dist/updateSupervisor.d.ts.map +1 -0
- package/dist/updateSupervisor.js +103 -0
- package/dist/updateSupervisor.js.map +1 -0
- package/dist/watchLines.d.ts +2 -1
- package/dist/watchLines.d.ts.map +1 -1
- package/dist/watchLines.js +12 -3
- package/dist/watchLines.js.map +1 -1
- package/package.json +1 -1
|
@@ -30,15 +30,48 @@ exports.RUNPANE_CONTRACT = {
|
|
|
30
30
|
"yes": false,
|
|
31
31
|
"verbose": false,
|
|
32
32
|
"watch": {
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
"follow": {
|
|
34
|
+
"summary": "What `runpane watch --follow` does with no other flags: quiet, batched updates and expiry after 3 hours with nothing happening. Individual duration flags override the defaults.",
|
|
35
|
+
"kinds": [
|
|
36
|
+
"agent.report",
|
|
37
|
+
"agent.ready",
|
|
38
|
+
"agent.blocked",
|
|
39
|
+
"agent.idle",
|
|
40
|
+
"panel.exited",
|
|
41
|
+
"panel.stopped",
|
|
42
|
+
"pane.gone",
|
|
43
|
+
"pane.associated",
|
|
44
|
+
"pane.detached",
|
|
45
|
+
"pr.conflicted",
|
|
46
|
+
"pr.checks",
|
|
47
|
+
"pr.merged",
|
|
48
|
+
"pr.closed",
|
|
49
|
+
"pr.head",
|
|
50
|
+
"pr.review",
|
|
51
|
+
"pr.comment",
|
|
52
|
+
"pr.stopped",
|
|
53
|
+
"github.unavailable",
|
|
54
|
+
"github.recovered"
|
|
55
|
+
],
|
|
56
|
+
"readySettle": "3m",
|
|
57
|
+
"blockedSettle": "30s",
|
|
58
|
+
"minInterval": "10m",
|
|
59
|
+
"idleAfter": "10m",
|
|
60
|
+
"idleBackoff": true,
|
|
61
|
+
"expireAfter": "3h",
|
|
62
|
+
"heartbeat": "off",
|
|
63
|
+
"includeShells": false,
|
|
64
|
+
"heldInputDetection": true
|
|
65
|
+
},
|
|
66
|
+
"untilEvent": {
|
|
67
|
+
"summary": "What `runpane watch --until-event` does with no other flags: waits for the first event worth waking an agent for, prints it immediately without follow settling or batching, and exits 0.",
|
|
68
|
+
"kinds": [
|
|
69
|
+
"agent.report",
|
|
70
|
+
"agent.blocked",
|
|
71
|
+
"panel.exited",
|
|
72
|
+
"pane.gone"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
42
75
|
}
|
|
43
76
|
},
|
|
44
77
|
"enums": {
|
|
@@ -134,9 +167,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
134
167
|
},
|
|
135
168
|
{
|
|
136
169
|
"name": "update",
|
|
137
|
-
"summary": "Update
|
|
170
|
+
"summary": "Update both Pane and the invoked supported CLI through an independent helper.",
|
|
138
171
|
"usage": [
|
|
139
|
-
"runpane update [
|
|
172
|
+
" runpane update [--pane-only | --cli-only] [--version <latest|vX.Y.Z>] [--pane-dir <path>] [--dry-run] [--wait] [--json]",
|
|
173
|
+
" runpane update --status <operation-id> [--wait] [--pane-dir <path>] [--json]"
|
|
140
174
|
],
|
|
141
175
|
"target": "client",
|
|
142
176
|
"localControl": false
|
|
@@ -390,7 +424,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
390
424
|
"name": "watch",
|
|
391
425
|
"summary": "Wait for workspace agent and Pane transitions using a daemon-held cursor.",
|
|
392
426
|
"usage": [
|
|
393
|
-
"runpane watch [--
|
|
427
|
+
"runpane watch [--follow|--until-event] [--session <id|name>|--pane <id>] [--json] [overrides]"
|
|
394
428
|
],
|
|
395
429
|
"toolsets": [
|
|
396
430
|
"agents"
|
|
@@ -1403,6 +1437,48 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1403
1437
|
"sessionResult"
|
|
1404
1438
|
],
|
|
1405
1439
|
"localControl": true
|
|
1440
|
+
},
|
|
1441
|
+
{
|
|
1442
|
+
"name": "pr watch",
|
|
1443
|
+
"summary": "Register durable GitHub PR monitoring for a Pane.",
|
|
1444
|
+
"usage": [
|
|
1445
|
+
"runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]"
|
|
1446
|
+
],
|
|
1447
|
+
"toolsets": [
|
|
1448
|
+
"agents"
|
|
1449
|
+
],
|
|
1450
|
+
"jsonSchemas": [
|
|
1451
|
+
"prWatchResult"
|
|
1452
|
+
],
|
|
1453
|
+
"localControl": true
|
|
1454
|
+
},
|
|
1455
|
+
{
|
|
1456
|
+
"name": "pr unwatch",
|
|
1457
|
+
"summary": "Remove a Pane’s explicit PR registration.",
|
|
1458
|
+
"usage": [
|
|
1459
|
+
"runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]"
|
|
1460
|
+
],
|
|
1461
|
+
"toolsets": [
|
|
1462
|
+
"agents"
|
|
1463
|
+
],
|
|
1464
|
+
"jsonSchemas": [
|
|
1465
|
+
"prWatchResult"
|
|
1466
|
+
],
|
|
1467
|
+
"localControl": true
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
"name": "pr list",
|
|
1471
|
+
"summary": "List PR registrations and stopped watches.",
|
|
1472
|
+
"usage": [
|
|
1473
|
+
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"
|
|
1474
|
+
],
|
|
1475
|
+
"toolsets": [
|
|
1476
|
+
"agents"
|
|
1477
|
+
],
|
|
1478
|
+
"jsonSchemas": [
|
|
1479
|
+
"prWatchResult"
|
|
1480
|
+
],
|
|
1481
|
+
"localControl": true
|
|
1406
1482
|
}
|
|
1407
1483
|
],
|
|
1408
1484
|
"flags": {
|
|
@@ -1684,35 +1760,35 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1684
1760
|
"value": "<pane-id>",
|
|
1685
1761
|
"description": "Exclude a Pane from workspace watch results; repeatable."
|
|
1686
1762
|
},
|
|
1687
|
-
{
|
|
1688
|
-
"name": "--format",
|
|
1689
|
-
"value": "<lines|json>",
|
|
1690
|
-
"description": "Watch output format; scoped to the watch command."
|
|
1691
|
-
},
|
|
1692
1763
|
{
|
|
1693
1764
|
"name": "--heartbeat",
|
|
1694
|
-
"value": "<
|
|
1695
|
-
"description": "
|
|
1765
|
+
"value": "<duration>",
|
|
1766
|
+
"description": "Print a HEARTBEAT line this often under --follow (a duration; default off)."
|
|
1696
1767
|
},
|
|
1697
1768
|
{
|
|
1698
1769
|
"name": "--idle-after",
|
|
1699
|
-
"value": "<
|
|
1700
|
-
"description": "
|
|
1770
|
+
"value": "<duration>",
|
|
1771
|
+
"description": "First IDLE reminder after a READY panel stays idle (a duration; default 10m under --follow; 0 turns IDLE off)."
|
|
1701
1772
|
},
|
|
1702
1773
|
{
|
|
1703
|
-
"name": "--
|
|
1704
|
-
"value": "<
|
|
1705
|
-
"description": "
|
|
1774
|
+
"name": "--expire-after",
|
|
1775
|
+
"value": "<duration>",
|
|
1776
|
+
"description": "End a --follow watch after this long with nothing but IDLE, printing WATCH EXPIRED and exiting 0 (a duration; default 3h; 0 never expires)."
|
|
1777
|
+
},
|
|
1778
|
+
{
|
|
1779
|
+
"name": "--ready-settle",
|
|
1780
|
+
"value": "<duration>",
|
|
1781
|
+
"description": "Quiet time before READY under --follow (a duration; default 3m)."
|
|
1706
1782
|
},
|
|
1707
1783
|
{
|
|
1708
1784
|
"name": "--blocked-settle",
|
|
1709
|
-
"value": "<
|
|
1710
|
-
"description": "
|
|
1785
|
+
"value": "<duration>",
|
|
1786
|
+
"description": "Time before BLOCKED under --follow (a duration; default 30s)."
|
|
1711
1787
|
},
|
|
1712
1788
|
{
|
|
1713
1789
|
"name": "--min-interval",
|
|
1714
|
-
"value": "<
|
|
1715
|
-
"description": "
|
|
1790
|
+
"value": "<duration>",
|
|
1791
|
+
"description": "Batch window for non-urgent lines under --follow (a duration; default 10m)."
|
|
1716
1792
|
},
|
|
1717
1793
|
{
|
|
1718
1794
|
"name": "--body-file",
|
|
@@ -1818,6 +1894,11 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1818
1894
|
"name": "--effort",
|
|
1819
1895
|
"value": "<level>",
|
|
1820
1896
|
"description": "Reasoning effort for the receiving agent (minimal, low, medium, high, xhigh, max); overrides the destination text."
|
|
1897
|
+
},
|
|
1898
|
+
{
|
|
1899
|
+
"name": "--epoch",
|
|
1900
|
+
"value": "<epoch>",
|
|
1901
|
+
"description": "Journal epoch paired with --since; a mismatch emits _reset instead of silently skipping events."
|
|
1821
1902
|
}
|
|
1822
1903
|
],
|
|
1823
1904
|
"localBoolean": [
|
|
@@ -1893,18 +1974,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1893
1974
|
"name": "--include-held-input",
|
|
1894
1975
|
"description": "Include up to 120 characters of unsubmitted composer text in ready events."
|
|
1895
1976
|
},
|
|
1896
|
-
{
|
|
1897
|
-
"name": "--agents-only",
|
|
1898
|
-
"description": "Limit workspace events to CLI agent panels."
|
|
1899
|
-
},
|
|
1900
1977
|
{
|
|
1901
1978
|
"name": "--all-stopped",
|
|
1902
1979
|
"description": "Resume every stopped agent panel in every non-archived Pane."
|
|
1903
1980
|
},
|
|
1904
|
-
{
|
|
1905
|
-
"name": "--all-managed",
|
|
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."
|
|
1907
|
-
},
|
|
1908
1981
|
{
|
|
1909
1982
|
"name": "--include-shells",
|
|
1910
1983
|
"description": "Include ordinary shell panels in follow mode."
|
|
@@ -1917,17 +1990,6 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1917
1990
|
"name": "--self-test",
|
|
1918
1991
|
"description": "Probe the current daemon watch path without advancing a named cursor."
|
|
1919
1992
|
},
|
|
1920
|
-
{
|
|
1921
|
-
"name": "--quiet",
|
|
1922
|
-
"aliases": [
|
|
1923
|
-
"--no-control-lines"
|
|
1924
|
-
],
|
|
1925
|
-
"description": "Watch only: drop the WATCH OK, HEARTBEAT, and WATCH RECONNECTED control lines (_ok, _heartbeat, _reconnected in JSON). Errors, resets, and dropped counts always print."
|
|
1926
|
-
},
|
|
1927
|
-
{
|
|
1928
|
-
"name": "--idle-backoff",
|
|
1929
|
-
"description": "Follow-only opt-in: IDLE fires at --idle-after, then 30m, 1h, 3h, then daily per panel; any activity resets it."
|
|
1930
|
-
},
|
|
1931
1993
|
{
|
|
1932
1994
|
"name": "--report",
|
|
1933
1995
|
"description": "Prepare a redacted doctor report; external filing still requires --yes."
|
|
@@ -1986,7 +2048,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
1986
2048
|
" runpane workspace list [--json]",
|
|
1987
2049
|
" runpane workspace <machine> read|write|exec|<command>",
|
|
1988
2050
|
" runpane watch --follow",
|
|
1989
|
-
" runpane watch --
|
|
2051
|
+
" runpane watch --until-event",
|
|
1990
2052
|
" runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]",
|
|
1991
2053
|
" runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes",
|
|
1992
2054
|
" runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes",
|
|
@@ -2092,18 +2154,14 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2092
2154
|
],
|
|
2093
2155
|
"update": [
|
|
2094
2156
|
"Usage:",
|
|
2095
|
-
" runpane update [
|
|
2157
|
+
" runpane update [--pane-only | --cli-only] [--version <latest|vX.Y.Z>] [--pane-dir <path>] [--dry-run] [--wait] [--json]",
|
|
2158
|
+
" runpane update --status <operation-id> [--wait] [--pane-dir <path>] [--json]",
|
|
2096
2159
|
"",
|
|
2097
|
-
"Updates Pane
|
|
2098
|
-
"",
|
|
2099
|
-
"
|
|
2100
|
-
"
|
|
2101
|
-
"
|
|
2102
|
-
" --download-dir <path>",
|
|
2103
|
-
" --pane-path <path>",
|
|
2104
|
-
" --dry-run",
|
|
2105
|
-
" --yes",
|
|
2106
|
-
" --verbose"
|
|
2160
|
+
"Updates both Pane and the invoked supported CLI by default, on this machine.",
|
|
2161
|
+
"Preflight identifies the host and installation owner before downtime. The independent helper stages an app, CLI, and standalone Node runtime before stopping Pane.",
|
|
2162
|
+
"Status distinguishes acceptance, installed components, host health, and per-panel restoration. No prompts or uncertain actions are replayed.",
|
|
2163
|
+
"CLI-only updates do not restart Pane; a managed CLI pin survives later Pane startup.",
|
|
2164
|
+
"Use workspace <machine> exec -- runpane update for an explicit remote machine."
|
|
2107
2165
|
],
|
|
2108
2166
|
"version": [
|
|
2109
2167
|
"Usage:",
|
|
@@ -2236,54 +2294,60 @@ exports.RUNPANE_CONTRACT = {
|
|
|
2236
2294
|
],
|
|
2237
2295
|
"watch": [
|
|
2238
2296
|
"Usage:",
|
|
2239
|
-
" runpane watch
|
|
2297
|
+
" runpane watch Print what changed since your cursor, then exit",
|
|
2298
|
+
" runpane watch --follow Keep watching, tuned for an agent watching unattended",
|
|
2299
|
+
" runpane watch --until-event Wait for one event worth waking for, print it, exit 0",
|
|
2300
|
+
"",
|
|
2301
|
+
"Waits for agent, Pane, panel, and PR events from the daemon without polling.",
|
|
2240
2302
|
"",
|
|
2241
|
-
"
|
|
2303
|
+
"What --follow does by default (see defaults.watch.follow in the contract):",
|
|
2304
|
+
" prints WATCH OK once when armed, then one line per event, with no heartbeats",
|
|
2305
|
+
" kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
|
|
2306
|
+
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
|
|
2307
|
+
" READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
|
|
2308
|
+
" (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
|
|
2309
|
+
" IDLE reminders at 10m, 30m, 1h, 3h, then daily",
|
|
2310
|
+
" ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
|
|
2311
|
+
"",
|
|
2312
|
+
"What --until-event does by default: waits for agent.report, agent.blocked, panel.exited,",
|
|
2313
|
+
"or pane.gone, prints that one line, and exits 0. Run it as a background task, act on",
|
|
2314
|
+
"its line, then run it again; its named cursor means nothing is missed between runs.",
|
|
2315
|
+
"Single-event waits deliver immediately without follow settling or batching.",
|
|
2316
|
+
"--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.",
|
|
2242
2317
|
"",
|
|
2243
2318
|
"Options:",
|
|
2244
|
-
" --
|
|
2245
|
-
" --
|
|
2246
|
-
" --
|
|
2247
|
-
" --follow Continue waiting until interrupted",
|
|
2248
|
-
" --until-event Exit 0 after the first event; --timeout-ms is the total deadline (exit 124)",
|
|
2249
|
-
" --format <lines|json> Output format; lines is the follow default",
|
|
2250
|
-
" --heartbeat <seconds> Healthy-silence bound; defaults to 60 under --follow",
|
|
2251
|
-
" --idle-after <ms> Re-firing READY idle interval; defaults to 600000 under --follow",
|
|
2252
|
-
" --settle <ms> Opt-in: emit READY only after this quiet window (--follow only)",
|
|
2253
|
-
" --blocked-settle <ms> Opt-in: emit BLOCKED only after this window (--follow only)",
|
|
2254
|
-
" --min-interval <ms> Opt-in: batch non-urgent lines per interval; BLOCKED, REPORT, and PR failures bypass (--follow only)",
|
|
2255
|
-
" --idle-backoff Opt-in: IDLE at --idle-after, 30m, 1h, 3h, then daily (--follow only)",
|
|
2256
|
-
" --all-managed Explicitly watch all managed panes",
|
|
2257
|
-
" --include-shells Include ordinary shell panels",
|
|
2258
|
-
" --agents-only Limit to CLI agent panels",
|
|
2259
|
-
" --exclude-pane <id> Exclude a Pane; repeatable",
|
|
2260
|
-
" --self-test Anonymous, read-only daemon path probe",
|
|
2261
|
-
" --quiet Drop WATCH OK, HEARTBEAT, and WATCH RECONNECTED lines",
|
|
2262
|
-
" --no-control-lines Alias for --quiet",
|
|
2263
|
-
" --kinds <kind,...> Limit event kinds",
|
|
2264
|
-
" --pane <id> Limit to a Pane; repeatable",
|
|
2265
|
-
" --session <id|name> Follow every Pane in a named Session; associate/detach apply live",
|
|
2319
|
+
" --session <id|name> Watch every Pane in a Session; associate/detach apply live",
|
|
2320
|
+
" --pane <id> Watch one Pane; repeatable (default: every managed Pane)",
|
|
2321
|
+
" --exclude-pane <id> Leave out a Pane; repeatable",
|
|
2266
2322
|
" --repo <selector> Limit to a saved repository",
|
|
2267
2323
|
" --name-contains <text> Limit by Pane name substring",
|
|
2268
|
-
" --
|
|
2324
|
+
" --include-shells Include plain shell panels (default: agent panels only)",
|
|
2325
|
+
" --kinds <kind,...> Replace the default event kinds",
|
|
2326
|
+
" --json One JSON object per line",
|
|
2327
|
+
" --as <name> Name the cursor (default: from --session or this panel)",
|
|
2328
|
+
" --since <generation> Use an explicit cursor instead of a name",
|
|
2329
|
+
" --epoch <epoch> Pair with --since to detect journal resets",
|
|
2330
|
+
" --from <now|earliest> Where a new named cursor starts (default: now)",
|
|
2331
|
+
" --self-test Check the daemon watch path and exit",
|
|
2332
|
+
"",
|
|
2333
|
+
"Overrides (durations such as 30s, 10m, 3h; a bare number is milliseconds; 0 turns it off):",
|
|
2334
|
+
" --ready-settle <duration> Quiet time before READY (default 3m)",
|
|
2335
|
+
" --blocked-settle <duration> Time before BLOCKED (default 30s)",
|
|
2336
|
+
" --min-interval <duration> Batch window for non-urgent lines (default 10m)",
|
|
2337
|
+
" --idle-after <duration> First IDLE reminder (default 10m)",
|
|
2338
|
+
" --expire-after <duration> End after this long with nothing but IDLE (default 3h)",
|
|
2339
|
+
" --heartbeat <duration> Print a HEARTBEAT line this often (default off)",
|
|
2340
|
+
" --timeout-ms <duration> Per-request wait; with --until-event, the total deadline (exit 124)",
|
|
2269
2341
|
" --limit <count> Maximum entries per response",
|
|
2270
|
-
" --ack-now
|
|
2342
|
+
" --ack-now At-most-once cursor delivery",
|
|
2271
2343
|
" --include-held-input Include unsubmitted composer text in JSON",
|
|
2272
|
-
" --no-held-input
|
|
2344
|
+
" --no-held-input Turn off STUCK detection",
|
|
2273
2345
|
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
2274
|
-
"
|
|
2275
|
-
"",
|
|
2276
|
-
"
|
|
2277
|
-
"
|
|
2278
|
-
"
|
|
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.",
|
|
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",
|
|
2282
|
-
"User present: the same kinds with --settle 60000 --blocked-settle 15000 --min-interval 120000 and no --idle-backoff",
|
|
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",
|
|
2284
|
-
"Pane Chat arms those flags itself through its skill; pass them only for your own scripts.",
|
|
2285
|
-
"STUCK means real unsubmitted composer text; an agent prompt suggestion never counts.",
|
|
2286
|
-
"Dead watch: HEARTBEAT is proof of life only (--quiet drops it). Judge death by a non-zero exit or a WATCH ERROR line, not by silence. If the message says the cursor was superseded, keep the replacement monitor and do not re-arm the old one."
|
|
2346
|
+
"",
|
|
2347
|
+
"How a watch ends: WATCH EXPIRED (exit 0) means nothing happened; arm a new one with the next",
|
|
2348
|
+
"dispatch. A non-zero exit or a WATCH ERROR line means it failed: say so and re-arm once. Judge",
|
|
2349
|
+
"a watch by WATCH OK and these endings, never by silence. Never pipe --follow into grep -m1 or head.",
|
|
2350
|
+
"STUCK means real unsubmitted composer text; a prompt suggestion never counts."
|
|
2287
2351
|
],
|
|
2288
2352
|
"panes create": [
|
|
2289
2353
|
"Usage:",
|
|
@@ -3234,6 +3298,21 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3234
3298
|
"runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
|
|
3235
3299
|
"",
|
|
3236
3300
|
"Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."
|
|
3301
|
+
],
|
|
3302
|
+
"pr watch": [
|
|
3303
|
+
"runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]",
|
|
3304
|
+
"",
|
|
3305
|
+
"Register durable GitHub PR monitoring for a Pane."
|
|
3306
|
+
],
|
|
3307
|
+
"pr unwatch": [
|
|
3308
|
+
"runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]",
|
|
3309
|
+
"",
|
|
3310
|
+
"Remove a Pane’s explicit PR registration."
|
|
3311
|
+
],
|
|
3312
|
+
"pr list": [
|
|
3313
|
+
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
|
|
3314
|
+
"",
|
|
3315
|
+
"List PR registrations and stopped watches."
|
|
3237
3316
|
]
|
|
3238
3317
|
},
|
|
3239
3318
|
"pip": {
|
|
@@ -3256,7 +3335,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3256
3335
|
" runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]",
|
|
3257
3336
|
" runpane workspace state [--repo <selector>] [--json]",
|
|
3258
3337
|
" runpane watch --follow",
|
|
3259
|
-
" runpane watch --
|
|
3338
|
+
" runpane watch --until-event",
|
|
3260
3339
|
" runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--base-branch <branch>] [--source user|agent] [--focus|--no-focus] [--wait-ready]",
|
|
3261
3340
|
" runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes",
|
|
3262
3341
|
" runpane panes archive --session <id|name> --merged [--remove-worktree] [--dry-run] --yes",
|
|
@@ -3365,7 +3444,14 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3365
3444
|
],
|
|
3366
3445
|
"update": [
|
|
3367
3446
|
"Usage:",
|
|
3368
|
-
" runpane update [--version <latest|vX.Y.Z>] [--dry-run] [--
|
|
3447
|
+
" runpane update [--pane-only | --cli-only] [--version <latest|vX.Y.Z>] [--pane-dir <path>] [--dry-run] [--wait] [--json]",
|
|
3448
|
+
" runpane update --status <operation-id> [--wait] [--pane-dir <path>] [--json]",
|
|
3449
|
+
"",
|
|
3450
|
+
"Updates both Pane and the invoked supported CLI by default, on this machine.",
|
|
3451
|
+
"Preflight identifies the host and installation owner before downtime. The independent helper stages an app, CLI, and standalone Node runtime before stopping Pane.",
|
|
3452
|
+
"Status distinguishes acceptance, installed components, host health, and per-panel restoration. No prompts or uncertain actions are replayed.",
|
|
3453
|
+
"CLI-only updates do not restart Pane; a managed CLI pin survives later Pane startup.",
|
|
3454
|
+
"Use workspace <machine> exec -- runpane update for an explicit remote machine."
|
|
3369
3455
|
],
|
|
3370
3456
|
"version": [
|
|
3371
3457
|
"Usage:",
|
|
@@ -3490,54 +3576,60 @@ exports.RUNPANE_CONTRACT = {
|
|
|
3490
3576
|
],
|
|
3491
3577
|
"watch": [
|
|
3492
3578
|
"Usage:",
|
|
3493
|
-
" runpane watch
|
|
3579
|
+
" runpane watch Print what changed since your cursor, then exit",
|
|
3580
|
+
" runpane watch --follow Keep watching, tuned for an agent watching unattended",
|
|
3581
|
+
" runpane watch --until-event Wait for one event worth waking for, print it, exit 0",
|
|
3582
|
+
"",
|
|
3583
|
+
"Waits for agent, Pane, panel, and PR events from the daemon without polling.",
|
|
3584
|
+
"",
|
|
3585
|
+
"What --follow does by default (see defaults.watch.follow in the contract):",
|
|
3586
|
+
" prints WATCH OK once when armed, then one line per event, with no heartbeats",
|
|
3587
|
+
" kinds: agent.report, agent.ready, agent.blocked, agent.idle, panel.exited, panel.stopped,",
|
|
3588
|
+
" pane.gone, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged",
|
|
3589
|
+
" READY after 3m of quiet; BLOCKED after 30s; other lines batched at most every 10m",
|
|
3590
|
+
" (REPORT, BLOCKED, conflicts, and failed checks arrive at once)",
|
|
3591
|
+
" IDLE reminders at 10m, 30m, 1h, 3h, then daily",
|
|
3592
|
+
" ends with WATCH EXPIRED and exit 0 after 3h with nothing but IDLE",
|
|
3494
3593
|
"",
|
|
3495
|
-
"
|
|
3594
|
+
"What --until-event does by default: waits for agent.report, agent.blocked, panel.exited,",
|
|
3595
|
+
"or pane.gone, prints that one line, and exits 0. Run it as a background task, act on",
|
|
3596
|
+
"its line, then run it again; its named cursor means nothing is missed between runs.",
|
|
3597
|
+
"Single-event waits deliver immediately without follow settling or batching.",
|
|
3598
|
+
"--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.",
|
|
3496
3599
|
"",
|
|
3497
3600
|
"Options:",
|
|
3498
|
-
" --
|
|
3499
|
-
" --
|
|
3500
|
-
" --
|
|
3501
|
-
" --
|
|
3502
|
-
" --
|
|
3503
|
-
" --
|
|
3504
|
-
" --
|
|
3505
|
-
" --
|
|
3506
|
-
" --
|
|
3507
|
-
" --
|
|
3508
|
-
" --
|
|
3509
|
-
" --
|
|
3510
|
-
" --
|
|
3511
|
-
"
|
|
3512
|
-
"
|
|
3513
|
-
" --
|
|
3514
|
-
" --
|
|
3515
|
-
" --
|
|
3516
|
-
" --
|
|
3517
|
-
" --
|
|
3518
|
-
" --
|
|
3519
|
-
" --
|
|
3520
|
-
" --
|
|
3521
|
-
" --
|
|
3522
|
-
" --
|
|
3523
|
-
" --
|
|
3524
|
-
" --ack-now",
|
|
3525
|
-
" --include-held-input",
|
|
3526
|
-
" --no-held-input",
|
|
3601
|
+
" --session <id|name> Watch every Pane in a Session; associate/detach apply live",
|
|
3602
|
+
" --pane <id> Watch one Pane; repeatable (default: every managed Pane)",
|
|
3603
|
+
" --exclude-pane <id> Leave out a Pane; repeatable",
|
|
3604
|
+
" --repo <selector> Limit to a saved repository",
|
|
3605
|
+
" --name-contains <text> Limit by Pane name substring",
|
|
3606
|
+
" --include-shells Include plain shell panels (default: agent panels only)",
|
|
3607
|
+
" --kinds <kind,...> Replace the default event kinds",
|
|
3608
|
+
" --json One JSON object per line",
|
|
3609
|
+
" --as <name> Name the cursor (default: from --session or this panel)",
|
|
3610
|
+
" --since <generation> Use an explicit cursor instead of a name",
|
|
3611
|
+
" --epoch <epoch> Pair with --since to detect journal resets",
|
|
3612
|
+
" --from <now|earliest> Where a new named cursor starts (default: now)",
|
|
3613
|
+
" --self-test Check the daemon watch path and exit",
|
|
3614
|
+
"",
|
|
3615
|
+
"Overrides (durations such as 30s, 10m, 3h; a bare number is milliseconds; 0 turns it off):",
|
|
3616
|
+
" --ready-settle <duration> Quiet time before READY (default 3m)",
|
|
3617
|
+
" --blocked-settle <duration> Time before BLOCKED (default 30s)",
|
|
3618
|
+
" --min-interval <duration> Batch window for non-urgent lines (default 10m)",
|
|
3619
|
+
" --idle-after <duration> First IDLE reminder (default 10m)",
|
|
3620
|
+
" --expire-after <duration> End after this long with nothing but IDLE (default 3h)",
|
|
3621
|
+
" --heartbeat <duration> Print a HEARTBEAT line this often (default off)",
|
|
3622
|
+
" --timeout-ms <duration> Per-request wait; with --until-event, the total deadline (exit 124)",
|
|
3623
|
+
" --limit <count> Maximum entries per response",
|
|
3624
|
+
" --ack-now At-most-once cursor delivery",
|
|
3625
|
+
" --include-held-input Include unsubmitted composer text in JSON",
|
|
3626
|
+
" --no-held-input Turn off STUCK detection",
|
|
3527
3627
|
" --pane-dir <path> Connect to a specific Pane data directory",
|
|
3528
|
-
"
|
|
3529
|
-
"",
|
|
3530
|
-
"
|
|
3531
|
-
"
|
|
3532
|
-
"
|
|
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.",
|
|
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",
|
|
3536
|
-
"User present: the same kinds with --settle 60000 --blocked-settle 15000 --min-interval 120000 and no --idle-backoff",
|
|
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",
|
|
3538
|
-
"Pane Chat arms those flags itself through its skill; pass them only for your own scripts.",
|
|
3539
|
-
"STUCK means real unsubmitted composer text; an agent prompt suggestion never counts.",
|
|
3540
|
-
"Dead watch: HEARTBEAT is proof of life only (--quiet drops it). Judge death by a non-zero exit or a WATCH ERROR line, not by silence. If the message says the cursor was superseded, keep the replacement monitor and do not re-arm the old one."
|
|
3628
|
+
"",
|
|
3629
|
+
"How a watch ends: WATCH EXPIRED (exit 0) means nothing happened; arm a new one with the next",
|
|
3630
|
+
"dispatch. A non-zero exit or a WATCH ERROR line means it failed: say so and re-arm once. Judge",
|
|
3631
|
+
"a watch by WATCH OK and these endings, never by silence. Never pipe --follow into grep -m1 or head.",
|
|
3632
|
+
"STUCK means real unsubmitted composer text; a prompt suggestion never counts."
|
|
3541
3633
|
],
|
|
3542
3634
|
"panes create": [
|
|
3543
3635
|
"Usage:",
|
|
@@ -4409,6 +4501,21 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4409
4501
|
"python -m runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
|
|
4410
4502
|
"",
|
|
4411
4503
|
"Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."
|
|
4504
|
+
],
|
|
4505
|
+
"pr watch": [
|
|
4506
|
+
"runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]",
|
|
4507
|
+
"",
|
|
4508
|
+
"Register durable GitHub PR monitoring for a Pane."
|
|
4509
|
+
],
|
|
4510
|
+
"pr unwatch": [
|
|
4511
|
+
"runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]",
|
|
4512
|
+
"",
|
|
4513
|
+
"Remove a Pane’s explicit PR registration."
|
|
4514
|
+
],
|
|
4515
|
+
"pr list": [
|
|
4516
|
+
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]",
|
|
4517
|
+
"",
|
|
4518
|
+
"List PR registrations and stopped watches."
|
|
4412
4519
|
]
|
|
4413
4520
|
}
|
|
4414
4521
|
},
|
|
@@ -4490,11 +4597,6 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4490
4597
|
"runpane panels list --pane <pane-id> --json",
|
|
4491
4598
|
"runpane panels output --panel <panel-id> --limit 200 --json",
|
|
4492
4599
|
"printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes --json",
|
|
4493
|
-
"runpane watch --self-test",
|
|
4494
|
-
"runpane watch --follow",
|
|
4495
|
-
"runpane watch --as <name> --until-event --quiet --json --kinds agent.report,agent.blocked,panel.exited,pane.gone",
|
|
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",
|
|
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",
|
|
4498
4600
|
"runpane sessions list [--json] [--pane-dir <path>]",
|
|
4499
4601
|
"runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]",
|
|
4500
4602
|
"runpane sessions get --session <id|name> [--json] [--pane-dir <path>]",
|
|
@@ -4520,7 +4622,14 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4520
4622
|
"runpane links create --pane <pane-id> --json",
|
|
4521
4623
|
"runpane panes git-status --pane <pane-id> --json",
|
|
4522
4624
|
"runpane help",
|
|
4523
|
-
"runpane <command> --help"
|
|
4625
|
+
"runpane <command> --help",
|
|
4626
|
+
"runpane watch --until-event",
|
|
4627
|
+
"runpane watch --follow",
|
|
4628
|
+
"runpane watch --session <id|name> --follow",
|
|
4629
|
+
"runpane watch --session <id|name> --follow --ready-settle 1m --blocked-settle 15s --min-interval 2m",
|
|
4630
|
+
"runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]",
|
|
4631
|
+
"runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]",
|
|
4632
|
+
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"
|
|
4524
4633
|
],
|
|
4525
4634
|
"commandDescriptions": [
|
|
4526
4635
|
"`runpane` with no arguments and `runpane setup` open an interactive wizard when stdin and stdout are TTYs. The remote-host wizard asks only for a name, then runs interactive Tailscale setup with automatic port selection; explicit install daemon flags remain available for SSH and manual URLs. In non-interactive shells or CI, both forms must print help, common commands, and agent discovery hints, then exit successfully instead of waiting for input.",
|
|
@@ -4528,7 +4637,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4528
4637
|
"`runpane install client` downloads the selected Pane desktop artifact and installs, opens, or launches it for the current platform.",
|
|
4529
4638
|
"`runpane install daemon` downloads or installs Pane, resolves a stable Pane executable path, and spawns `<pane executable> --remote-setup <forwarded remote setup args>`.",
|
|
4530
4639
|
"The wrapper must stream Pane stdout/stderr without reformatting because `pane --remote-setup` prints the one-time `pane-remote://...` connection code.",
|
|
4531
|
-
"`runpane update`
|
|
4640
|
+
"`runpane update` defaults to both app and active supported CLI, with independent supervision, staging, durable status, and explicit restoration outcomes. Prerequisites, status fields/exit codes, draft handling and manual recovery are documented in [Update recovery](UPDATE_RECOVERY.md).",
|
|
4532
4641
|
"`runpane version` prints only wrapper package metadata and does not contact, launch, or focus the Pane app or daemon.",
|
|
4533
4642
|
"`runpane doctor` checks platform support, release metadata reachability, download URL selection, installed Pane detection, daemon reachability, and remote-daemon hints. Add `--json` for a machine-readable report that agents should run before mutating Pane state. Installed app version detection must be best-effort and must not launch, focus, or configure Pane; macOS wrappers read app bundle metadata instead of executing `Pane --version`.",
|
|
4534
4643
|
"`runpane daemon repair` rewrites and restarts only the managed remote-daemon launcher/service. It never creates pairing credentials, changes tunnels, or downloads Pane; doctor only recommends it and never runs it automatically.",
|
|
@@ -4553,7 +4662,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4553
4662
|
"`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.",
|
|
4554
4663
|
"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.",
|
|
4555
4664
|
"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'`.",
|
|
4556
|
-
"`runpane watch` waits for
|
|
4665
|
+
"`runpane watch` waits for agent, Pane, panel, and PR events from the daemon journal without polling. `--follow` keeps watching with defaults tuned for an agent watching unattended (quiet, batched, and it ends itself after 3 hours with nothing happening); individual duration flags override these defaults. Cadence requires a named follow consumer; `--follow --since <generation>` has no consumer name and bypasses settling and batching. `--until-event` waits for one event worth waking for, prints it immediately without follow settling or batching, and exits 0. The defaults are listed in the contract under defaults.watch.",
|
|
4557
4666
|
"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.",
|
|
4558
4667
|
"`sessions list` list durable named orchestration Sessions.",
|
|
4559
4668
|
"`sessions create` create a durable named orchestration Session and its hidden terminal owner.",
|
|
@@ -4572,7 +4681,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4572
4681
|
"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.",
|
|
4573
4682
|
"`runpane links create` builds `pane://open?...` links; opening one in Pane selects what it names and never changes Pane state.",
|
|
4574
4683
|
"`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.",
|
|
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."
|
|
4684
|
+
"`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.",
|
|
4685
|
+
"`runpane pr watch`: Register durable GitHub PR monitoring for a Pane.",
|
|
4686
|
+
"`runpane pr unwatch`: Remove a Pane’s explicit PR registration.",
|
|
4687
|
+
"`runpane pr list`: List PR registrations and stopped watches."
|
|
4576
4688
|
],
|
|
4577
4689
|
"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.",
|
|
4578
4690
|
"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.",
|
|
@@ -4677,21 +4789,18 @@ exports.RUNPANE_CONTRACT = {
|
|
|
4677
4789
|
"--from",
|
|
4678
4790
|
"earliest",
|
|
4679
4791
|
"--follow",
|
|
4680
|
-
"--format",
|
|
4681
|
-
"lines",
|
|
4682
4792
|
"--heartbeat",
|
|
4683
|
-
"
|
|
4793
|
+
"60s",
|
|
4684
4794
|
"--idle-after",
|
|
4685
4795
|
"600000",
|
|
4686
|
-
"--settle",
|
|
4796
|
+
"--ready-settle",
|
|
4687
4797
|
"180000",
|
|
4688
4798
|
"--blocked-settle",
|
|
4689
4799
|
"30000",
|
|
4690
4800
|
"--min-interval",
|
|
4691
4801
|
"600000",
|
|
4692
|
-
"--
|
|
4693
|
-
"
|
|
4694
|
-
"--agents-only",
|
|
4802
|
+
"--expire-after",
|
|
4803
|
+
"10800000",
|
|
4695
4804
|
"--exclude-pane",
|
|
4696
4805
|
"pane-old",
|
|
4697
4806
|
"--kinds",
|
|
@@ -5106,27 +5215,23 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5106
5215
|
[
|
|
5107
5216
|
"watch",
|
|
5108
5217
|
"--follow",
|
|
5109
|
-
"--quiet",
|
|
5110
5218
|
"--json",
|
|
5111
5219
|
"--pane-dir",
|
|
5112
5220
|
"/tmp/pane"
|
|
5113
5221
|
],
|
|
5114
5222
|
[
|
|
5115
5223
|
"watch",
|
|
5116
|
-
"--follow"
|
|
5117
|
-
"--no-control-lines",
|
|
5118
|
-
"--all-managed"
|
|
5224
|
+
"--follow"
|
|
5119
5225
|
],
|
|
5120
5226
|
[
|
|
5121
5227
|
"watch",
|
|
5122
5228
|
"--session",
|
|
5123
5229
|
"__orchestration_session_1b4e28ba-2fa1-11d2-883f-0016d3cca427__",
|
|
5124
5230
|
"--follow",
|
|
5125
|
-
"--quiet",
|
|
5126
5231
|
"--json",
|
|
5127
5232
|
"--kinds",
|
|
5128
5233
|
"agent.ready,agent.blocked,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged",
|
|
5129
|
-
"--settle",
|
|
5234
|
+
"--ready-settle",
|
|
5130
5235
|
"180000"
|
|
5131
5236
|
],
|
|
5132
5237
|
[
|
|
@@ -5453,12 +5558,93 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5453
5558
|
"--as",
|
|
5454
5559
|
"orch",
|
|
5455
5560
|
"--until-event",
|
|
5456
|
-
"--quiet",
|
|
5457
5561
|
"--json",
|
|
5458
5562
|
"--kinds",
|
|
5459
5563
|
"agent.report,agent.blocked,panel.exited,pane.gone",
|
|
5460
5564
|
"--timeout-ms",
|
|
5461
5565
|
"600000"
|
|
5566
|
+
],
|
|
5567
|
+
[
|
|
5568
|
+
"pr",
|
|
5569
|
+
"watch",
|
|
5570
|
+
"--pane",
|
|
5571
|
+
"worker",
|
|
5572
|
+
"--url",
|
|
5573
|
+
"https://github.com/acme/app/pull/7"
|
|
5574
|
+
],
|
|
5575
|
+
[
|
|
5576
|
+
"pr",
|
|
5577
|
+
"unwatch",
|
|
5578
|
+
"--pane",
|
|
5579
|
+
"worker",
|
|
5580
|
+
"--url",
|
|
5581
|
+
"https://github.com/acme/app/pull/7"
|
|
5582
|
+
],
|
|
5583
|
+
[
|
|
5584
|
+
"pr",
|
|
5585
|
+
"list",
|
|
5586
|
+
"--pane",
|
|
5587
|
+
"worker"
|
|
5588
|
+
],
|
|
5589
|
+
[
|
|
5590
|
+
"watch",
|
|
5591
|
+
"--follow",
|
|
5592
|
+
"--ready-settle",
|
|
5593
|
+
"5s",
|
|
5594
|
+
"--expire-after",
|
|
5595
|
+
"0"
|
|
5596
|
+
],
|
|
5597
|
+
[
|
|
5598
|
+
"watch",
|
|
5599
|
+
"--until-event",
|
|
5600
|
+
"--timeout-ms",
|
|
5601
|
+
"30s"
|
|
5602
|
+
],
|
|
5603
|
+
[
|
|
5604
|
+
"watch",
|
|
5605
|
+
"--timeout-ms",
|
|
5606
|
+
"off"
|
|
5607
|
+
],
|
|
5608
|
+
[
|
|
5609
|
+
"watch",
|
|
5610
|
+
"--since",
|
|
5611
|
+
"42",
|
|
5612
|
+
"--epoch",
|
|
5613
|
+
"test-epoch",
|
|
5614
|
+
"--until-event",
|
|
5615
|
+
"--json"
|
|
5616
|
+
],
|
|
5617
|
+
[
|
|
5618
|
+
"watch",
|
|
5619
|
+
"--follow",
|
|
5620
|
+
"--ready-settle",
|
|
5621
|
+
"5s",
|
|
5622
|
+
"--expire-after",
|
|
5623
|
+
"off"
|
|
5624
|
+
],
|
|
5625
|
+
[
|
|
5626
|
+
"watch",
|
|
5627
|
+
"--follow",
|
|
5628
|
+
"--ready-settle",
|
|
5629
|
+
"5s",
|
|
5630
|
+
"--blocked-settle",
|
|
5631
|
+
"2s",
|
|
5632
|
+
"--min-interval",
|
|
5633
|
+
"1m",
|
|
5634
|
+
"--idle-after",
|
|
5635
|
+
"20m",
|
|
5636
|
+
"--expire-after",
|
|
5637
|
+
"off",
|
|
5638
|
+
"--heartbeat",
|
|
5639
|
+
"30s"
|
|
5640
|
+
],
|
|
5641
|
+
[
|
|
5642
|
+
"watch",
|
|
5643
|
+
"--follow",
|
|
5644
|
+
"--since",
|
|
5645
|
+
"42",
|
|
5646
|
+
"--epoch",
|
|
5647
|
+
"test-epoch"
|
|
5462
5648
|
]
|
|
5463
5649
|
],
|
|
5464
5650
|
"topLevelHelpIncludes": [
|
|
@@ -5884,38 +6070,92 @@ exports.RUNPANE_CONTRACT = {
|
|
|
5884
6070
|
"watchDefaults": {
|
|
5885
6071
|
"type": "object",
|
|
5886
6072
|
"required": [
|
|
5887
|
-
"
|
|
5888
|
-
"
|
|
5889
|
-
"settleMs",
|
|
5890
|
-
"blockedSettleMs",
|
|
5891
|
-
"minIntervalMs",
|
|
5892
|
-
"idleBackoff",
|
|
5893
|
-
"kinds"
|
|
6073
|
+
"follow",
|
|
6074
|
+
"untilEvent"
|
|
5894
6075
|
],
|
|
6076
|
+
"additionalProperties": false,
|
|
5895
6077
|
"properties": {
|
|
5896
|
-
"
|
|
5897
|
-
"type": "
|
|
5898
|
-
|
|
5899
|
-
|
|
5900
|
-
|
|
5901
|
-
|
|
5902
|
-
|
|
5903
|
-
|
|
5904
|
-
|
|
5905
|
-
|
|
5906
|
-
|
|
5907
|
-
|
|
5908
|
-
|
|
5909
|
-
|
|
5910
|
-
|
|
5911
|
-
|
|
5912
|
-
"
|
|
6078
|
+
"follow": {
|
|
6079
|
+
"type": "object",
|
|
6080
|
+
"additionalProperties": false,
|
|
6081
|
+
"required": [
|
|
6082
|
+
"summary",
|
|
6083
|
+
"kinds",
|
|
6084
|
+
"readySettle",
|
|
6085
|
+
"blockedSettle",
|
|
6086
|
+
"minInterval",
|
|
6087
|
+
"idleAfter",
|
|
6088
|
+
"idleBackoff",
|
|
6089
|
+
"expireAfter",
|
|
6090
|
+
"heartbeat",
|
|
6091
|
+
"includeShells",
|
|
6092
|
+
"heldInputDetection"
|
|
6093
|
+
],
|
|
6094
|
+
"properties": {
|
|
6095
|
+
"summary": {
|
|
6096
|
+
"type": "string"
|
|
6097
|
+
},
|
|
6098
|
+
"kinds": {
|
|
6099
|
+
"type": "array",
|
|
6100
|
+
"items": {
|
|
6101
|
+
"type": "string"
|
|
6102
|
+
}
|
|
6103
|
+
},
|
|
6104
|
+
"readySettle": {
|
|
6105
|
+
"type": "string",
|
|
6106
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6107
|
+
},
|
|
6108
|
+
"blockedSettle": {
|
|
6109
|
+
"type": "string",
|
|
6110
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6111
|
+
},
|
|
6112
|
+
"minInterval": {
|
|
6113
|
+
"type": "string",
|
|
6114
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6115
|
+
},
|
|
6116
|
+
"idleAfter": {
|
|
6117
|
+
"type": "string",
|
|
6118
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6119
|
+
},
|
|
6120
|
+
"idleBackoff": {
|
|
6121
|
+
"type": "boolean"
|
|
6122
|
+
},
|
|
6123
|
+
"expireAfter": {
|
|
6124
|
+
"type": "string",
|
|
6125
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6126
|
+
},
|
|
6127
|
+
"heartbeat": {
|
|
6128
|
+
"type": "string",
|
|
6129
|
+
"pattern": "^(off|[0-9]+(ms|s|m|h))$"
|
|
6130
|
+
},
|
|
6131
|
+
"includeShells": {
|
|
6132
|
+
"type": "boolean"
|
|
6133
|
+
},
|
|
6134
|
+
"heldInputDetection": {
|
|
6135
|
+
"type": "boolean"
|
|
6136
|
+
}
|
|
6137
|
+
}
|
|
5913
6138
|
},
|
|
5914
|
-
"
|
|
5915
|
-
"
|
|
6139
|
+
"untilEvent": {
|
|
6140
|
+
"type": "object",
|
|
6141
|
+
"required": [
|
|
6142
|
+
"summary",
|
|
6143
|
+
"kinds"
|
|
6144
|
+
],
|
|
6145
|
+
"properties": {
|
|
6146
|
+
"summary": {
|
|
6147
|
+
"type": "string"
|
|
6148
|
+
},
|
|
6149
|
+
"kinds": {
|
|
6150
|
+
"type": "array",
|
|
6151
|
+
"items": {
|
|
6152
|
+
"type": "string"
|
|
6153
|
+
}
|
|
6154
|
+
}
|
|
6155
|
+
},
|
|
6156
|
+
"additionalProperties": false
|
|
5916
6157
|
}
|
|
5917
|
-
}
|
|
5918
|
-
"additionalProperties": false
|
|
6158
|
+
}
|
|
5919
6159
|
},
|
|
5920
6160
|
"nextCommands": {
|
|
5921
6161
|
"type": "array",
|
|
@@ -7203,7 +7443,14 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7203
7443
|
"pane.detached",
|
|
7204
7444
|
"pr.conflicted",
|
|
7205
7445
|
"pr.checks",
|
|
7206
|
-
"pr.merged"
|
|
7446
|
+
"pr.merged",
|
|
7447
|
+
"pr.closed",
|
|
7448
|
+
"pr.head",
|
|
7449
|
+
"pr.review",
|
|
7450
|
+
"pr.comment",
|
|
7451
|
+
"pr.stopped",
|
|
7452
|
+
"github.unavailable",
|
|
7453
|
+
"github.recovered"
|
|
7207
7454
|
]
|
|
7208
7455
|
},
|
|
7209
7456
|
"paneId": {
|
|
@@ -7326,18 +7573,22 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7326
7573
|
"passed",
|
|
7327
7574
|
"failed"
|
|
7328
7575
|
],
|
|
7329
|
-
"description": "
|
|
7576
|
+
"description": "Failures are immediate; success requires complete nonempty required checks on the pinned head."
|
|
7330
7577
|
},
|
|
7331
7578
|
"failingChecks": {
|
|
7332
7579
|
"type": "array",
|
|
7333
7580
|
"items": {
|
|
7334
7581
|
"type": "string"
|
|
7335
7582
|
},
|
|
7336
|
-
"description": "
|
|
7583
|
+
"description": "Newly failing check names on this head."
|
|
7337
7584
|
},
|
|
7338
7585
|
"report": {
|
|
7339
7586
|
"$ref": "#/jsonSchemas/agentReport",
|
|
7340
7587
|
"description": "Report of an agent.report entry; its summary is cut to 2,000 characters (the panel keeps up to 16,000)."
|
|
7588
|
+
},
|
|
7589
|
+
"epoch": {
|
|
7590
|
+
"type": "string",
|
|
7591
|
+
"description": "Added to watch --json NDJSON events. Persist with gen after processing for numeric rearm."
|
|
7341
7592
|
}
|
|
7342
7593
|
},
|
|
7343
7594
|
"additionalProperties": false
|
|
@@ -7482,6 +7733,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7482
7733
|
},
|
|
7483
7734
|
"idleBackoff": {
|
|
7484
7735
|
"type": "boolean"
|
|
7736
|
+
},
|
|
7737
|
+
"epoch": {
|
|
7738
|
+
"type": "string",
|
|
7739
|
+
"description": "Expected epoch for since. Requires since and cannot be combined with as. Mismatch returns epoch-changed reset."
|
|
7485
7740
|
}
|
|
7486
7741
|
},
|
|
7487
7742
|
"additionalProperties": false
|
|
@@ -7581,6 +7836,10 @@ exports.RUNPANE_CONTRACT = {
|
|
|
7581
7836
|
},
|
|
7582
7837
|
"nextCommand": {
|
|
7583
7838
|
"type": "string"
|
|
7839
|
+
},
|
|
7840
|
+
"activityGeneration": {
|
|
7841
|
+
"type": "number",
|
|
7842
|
+
"description": "Latest meaningful activity in scope, including events hidden by output kinds or cadence. Natural expiry resets when it advances."
|
|
7584
7843
|
}
|
|
7585
7844
|
},
|
|
7586
7845
|
"additionalProperties": false
|
|
@@ -10640,6 +10899,36 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10640
10899
|
}
|
|
10641
10900
|
},
|
|
10642
10901
|
"additionalProperties": false
|
|
10902
|
+
},
|
|
10903
|
+
"prWatchResult": {
|
|
10904
|
+
"type": "object",
|
|
10905
|
+
"required": [
|
|
10906
|
+
"ok"
|
|
10907
|
+
],
|
|
10908
|
+
"properties": {
|
|
10909
|
+
"ok": {
|
|
10910
|
+
"const": true
|
|
10911
|
+
},
|
|
10912
|
+
"generation": {
|
|
10913
|
+
"type": "number"
|
|
10914
|
+
},
|
|
10915
|
+
"watch": {
|
|
10916
|
+
"type": "object"
|
|
10917
|
+
},
|
|
10918
|
+
"watches": {
|
|
10919
|
+
"type": "array",
|
|
10920
|
+
"items": {
|
|
10921
|
+
"type": "object"
|
|
10922
|
+
}
|
|
10923
|
+
},
|
|
10924
|
+
"removed": {
|
|
10925
|
+
"type": "boolean"
|
|
10926
|
+
},
|
|
10927
|
+
"epoch": {
|
|
10928
|
+
"type": "string"
|
|
10929
|
+
}
|
|
10930
|
+
},
|
|
10931
|
+
"additionalProperties": false
|
|
10643
10932
|
}
|
|
10644
10933
|
},
|
|
10645
10934
|
"agentContext": {
|
|
@@ -10666,7 +10955,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10666
10955
|
"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.",
|
|
10667
10956
|
"Use `runpane panels input` only when exact bytes are required, such as Ctrl-C or handcrafted terminal input.",
|
|
10668
10957
|
"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`.",
|
|
10669
|
-
"After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen
|
|
10958
|
+
"After creating Panes or sending terminal input, validate with `panels wait` or bounded `panels screen`. For a harness that consumes streaming output, use `runpane watch --follow` (with `--session <id>` for a Session); its named consumer applies settling and batching. Adding numeric --since leaves it unnamed and bypasses cadence; --as cannot be combined with --since. A harness that wakes only when a process exits uses `runpane watch --as <name> --until-event --json` and runs it again after each event. Single-event waits deliver immediately without follow cadence. Never pipe `--follow` into `grep -m1` or `head`.",
|
|
10670
10959
|
"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."
|
|
10671
10960
|
],
|
|
10672
10961
|
"detailCommand": "runpane agent-context --command <command> [--json]",
|
|
@@ -10941,17 +11230,13 @@ exports.RUNPANE_CONTRACT = {
|
|
|
10941
11230
|
},
|
|
10942
11231
|
{
|
|
10943
11232
|
"name": "watch",
|
|
10944
|
-
"summary": "Wait for workspace
|
|
11233
|
+
"summary": "Wait for workspace events from the durable daemon journal; follow uses conservative cadence and quiet expiry by default.",
|
|
10945
11234
|
"arguments": [
|
|
10946
11235
|
"--follow",
|
|
10947
11236
|
"--until-event",
|
|
10948
11237
|
"--session <id|name>",
|
|
10949
11238
|
"--self-test",
|
|
10950
11239
|
"--kinds <kind,...>",
|
|
10951
|
-
"--settle <ms>",
|
|
10952
|
-
"--blocked-settle <ms>",
|
|
10953
|
-
"--min-interval <ms>",
|
|
10954
|
-
"--idle-backoff",
|
|
10955
11240
|
"--json"
|
|
10956
11241
|
]
|
|
10957
11242
|
}
|
|
@@ -11035,8 +11320,8 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11035
11320
|
},
|
|
11036
11321
|
"update": {
|
|
11037
11322
|
"name": "update",
|
|
11038
|
-
"summary": "Update
|
|
11039
|
-
"details": "
|
|
11323
|
+
"summary": "Update Pane and the active supported CLI with durable status.",
|
|
11324
|
+
"details": "Defaults to both components. Use --pane-only or --cli-only to select one. Preflight checks installation ownership and supervisor capability before downtime.",
|
|
11040
11325
|
"requiresPaneDaemon": false,
|
|
11041
11326
|
"mutates": true,
|
|
11042
11327
|
"arguments": [
|
|
@@ -11044,18 +11329,33 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11044
11329
|
"name": "--version",
|
|
11045
11330
|
"value": "<latest|vX.Y.Z>",
|
|
11046
11331
|
"required": false,
|
|
11047
|
-
"description": "
|
|
11332
|
+
"description": "Requested app and CLI release version."
|
|
11048
11333
|
},
|
|
11049
11334
|
{
|
|
11050
|
-
"name": "--
|
|
11051
|
-
"value": "<auto|appimage|deb|dmg|zip|exe>",
|
|
11335
|
+
"name": "--pane-only",
|
|
11052
11336
|
"required": false,
|
|
11053
|
-
"description": "
|
|
11337
|
+
"description": "Update only the installed Pane app."
|
|
11338
|
+
},
|
|
11339
|
+
{
|
|
11340
|
+
"name": "--cli-only",
|
|
11341
|
+
"required": false,
|
|
11342
|
+
"description": "Update only the invoked supported CLI installation."
|
|
11343
|
+
},
|
|
11344
|
+
{
|
|
11345
|
+
"name": "--status",
|
|
11346
|
+
"value": "<operation-id>",
|
|
11347
|
+
"required": false,
|
|
11348
|
+
"description": "Read durable status without a running Pane."
|
|
11349
|
+
},
|
|
11350
|
+
{
|
|
11351
|
+
"name": "--wait",
|
|
11352
|
+
"required": false,
|
|
11353
|
+
"description": "Wait until the operation completes or requires attention."
|
|
11054
11354
|
},
|
|
11055
11355
|
{
|
|
11056
11356
|
"name": "--dry-run",
|
|
11057
11357
|
"required": false,
|
|
11058
|
-
"description": "
|
|
11358
|
+
"description": "Inspect preflight without staging or stopping Pane."
|
|
11059
11359
|
}
|
|
11060
11360
|
],
|
|
11061
11361
|
"examples": [
|
|
@@ -11063,7 +11363,9 @@ exports.RUNPANE_CONTRACT = {
|
|
|
11063
11363
|
"runpane update --version latest"
|
|
11064
11364
|
],
|
|
11065
11365
|
"notes": [
|
|
11066
|
-
"
|
|
11366
|
+
"Requires standalone Node and a current-user OS supervisor. npm, managed CLI, and supported pip environments retain their actual ownership. System-package Linux and installations requiring elevation are refused before downtime.",
|
|
11367
|
+
"The operation preserves a pre-migration data snapshot; it never blindly rolls an old app or database over migrated state.",
|
|
11368
|
+
"The initial result can be accepted or staging; it is not a claim that the update or restoration completed."
|
|
11067
11369
|
]
|
|
11068
11370
|
},
|
|
11069
11371
|
"version": {
|
|
@@ -12806,135 +13108,130 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12806
13108
|
"watch": {
|
|
12807
13109
|
"name": "watch",
|
|
12808
13110
|
"summary": "Wait for workspace transitions using the daemon journal.",
|
|
12809
|
-
"details": "`runpane watch --follow` is the
|
|
13111
|
+
"details": "`runpane watch --follow` is the monitor for an agent: with no other flags it prints WATCH OK once, then one line per event (reports, ready, blocked, idle, exits, Session membership, and PR conflicts, checks, and merges), batches non-urgent lines, and ends itself with WATCH EXPIRED after 3 hours with nothing happening. Set individual duration flags to override these defaults. `--until-event` is for harnesses that wake an agent when a process exits (Claude Code background Bash, Codex): it prints the first event worth waking for immediately, without follow settling or batching, and exits 0, and its named cursor means nothing is missed between runs. Every default is listed in the contract under defaults.watch; each override flag replaces one value.",
|
|
12810
13112
|
"requiresPaneDaemon": true,
|
|
12811
13113
|
"mutates": false,
|
|
12812
13114
|
"arguments": [
|
|
12813
13115
|
{
|
|
12814
|
-
"name": "--
|
|
12815
|
-
"value": "<consumer-name>",
|
|
12816
|
-
"required": false,
|
|
12817
|
-
"description": "Use a persisted named cursor (at-least-once delivery): 1-128 letters, numbers, dots, underscores, or hyphens (daemons before this release accept 64). Default under --follow: session-<uuid> with --session (session-<name> for a name; shortened to session-<sha256 prefix> when longer than 64 characters), else PANE_PANEL_ID when set, shortened to panel-<sha256 prefix> when it is longer than 64 characters; otherwise anonymous."
|
|
12818
|
-
},
|
|
12819
|
-
{
|
|
12820
|
-
"name": "--since",
|
|
12821
|
-
"value": "<generation>",
|
|
13116
|
+
"name": "--follow",
|
|
12822
13117
|
"required": false,
|
|
12823
|
-
"description": "
|
|
13118
|
+
"description": "Keep watching, with the defaults in defaults.watch.follow: WATCH OK once, then one line per event; READY after 3m of quiet, BLOCKED after 30s, other lines batched at most every 10m (REPORT, BLOCKED, PR conflicts, and failed checks arrive at once); IDLE reminders at 10m, 30m, 1h, 3h, then daily; WATCH EXPIRED and exit 0 after 3h with nothing but IDLE."
|
|
12824
13119
|
},
|
|
12825
13120
|
{
|
|
12826
|
-
"name": "--
|
|
13121
|
+
"name": "--until-event",
|
|
12827
13122
|
"required": false,
|
|
12828
|
-
"
|
|
12829
|
-
"description": "Starting point for a new named cursor. Default now (silent baseline); earliest replays the journal."
|
|
13123
|
+
"description": "Wait for the first event in defaults.watch.untilEvent.kinds (agent.report, agent.blocked, panel.exited, pane.gone), print that one line, and exit 0. Inside a Pane terminal the cursor defaults to until-<panel id>, so a re-run resumes where the last stopped. A RESET and the caller's own panel never end the wait. With --timeout-ms, exit 124 with WATCH TIMEOUT when the deadline passes. Cannot be combined with --follow or --self-test."
|
|
12830
13124
|
},
|
|
12831
13125
|
{
|
|
12832
|
-
"name": "--
|
|
13126
|
+
"name": "--session",
|
|
12833
13127
|
"required": false,
|
|
12834
|
-
"
|
|
13128
|
+
"value": "<id|name>",
|
|
13129
|
+
"description": "Follow every Pane associated with a named Session (id or exact name). The daemon re-reads membership on every read, so a Pane associated after arming is included and a detached or archived Pane drops out without a re-arm. The Session's own orchestrator panels are never reported. Cannot be combined with --pane or --all-managed; an unknown Session fails."
|
|
12835
13130
|
},
|
|
12836
13131
|
{
|
|
12837
|
-
"name": "--
|
|
13132
|
+
"name": "--pane",
|
|
12838
13133
|
"required": false,
|
|
12839
|
-
"
|
|
13134
|
+
"value": "<pane-id>",
|
|
13135
|
+
"description": "Limit to a Pane; repeatable. Default all managed panes. Cannot be combined with --session."
|
|
12840
13136
|
},
|
|
12841
13137
|
{
|
|
12842
|
-
"name": "--
|
|
12843
|
-
"value": "<lines|json>",
|
|
13138
|
+
"name": "--exclude-pane",
|
|
12844
13139
|
"required": false,
|
|
12845
|
-
"
|
|
13140
|
+
"value": "<pane-id>",
|
|
13141
|
+
"description": "Exclude a Pane; repeatable."
|
|
12846
13142
|
},
|
|
12847
13143
|
{
|
|
12848
|
-
"name": "--
|
|
12849
|
-
"value": "<seconds>",
|
|
13144
|
+
"name": "--repo",
|
|
12850
13145
|
"required": false,
|
|
12851
|
-
"
|
|
13146
|
+
"value": "<selector>",
|
|
13147
|
+
"description": "Limit to a saved repository (active, id, path, or name). Default all repositories."
|
|
12852
13148
|
},
|
|
12853
13149
|
{
|
|
12854
|
-
"name": "--
|
|
12855
|
-
"value": "<milliseconds>",
|
|
13150
|
+
"name": "--name-contains",
|
|
12856
13151
|
"required": false,
|
|
12857
|
-
"
|
|
13152
|
+
"value": "<text>",
|
|
13153
|
+
"description": "Limit by Pane name substring."
|
|
12858
13154
|
},
|
|
12859
13155
|
{
|
|
12860
|
-
"name": "--
|
|
12861
|
-
"value": "<milliseconds>",
|
|
13156
|
+
"name": "--include-shells",
|
|
12862
13157
|
"required": false,
|
|
12863
|
-
"description": "
|
|
13158
|
+
"description": "Include plain shell panels. Default: agent panels only. A report (agent.report) arrives from any panel either way."
|
|
12864
13159
|
},
|
|
12865
13160
|
{
|
|
12866
|
-
"name": "--
|
|
12867
|
-
"value": "<milliseconds>",
|
|
13161
|
+
"name": "--kinds",
|
|
12868
13162
|
"required": false,
|
|
12869
|
-
"
|
|
13163
|
+
"value": "<kind,...>",
|
|
13164
|
+
"description": "Replace the default event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited, panel.stopped, agent.report, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged. Defaults: defaults.watch.follow.kinds under --follow, defaults.watch.untilEvent.kinds under --until-event, every kind for a one-shot read."
|
|
12870
13165
|
},
|
|
12871
13166
|
{
|
|
12872
|
-
"name": "--
|
|
12873
|
-
"value": "<milliseconds>",
|
|
13167
|
+
"name": "--json",
|
|
12874
13168
|
"required": false,
|
|
12875
|
-
"description": "
|
|
13169
|
+
"description": "One JSON object per line. Control lines use kinds _ok, _heartbeat, _reconnected, _error, _reset, _dropped, _timeout, and _expired."
|
|
12876
13170
|
},
|
|
12877
13171
|
{
|
|
12878
|
-
"name": "--
|
|
13172
|
+
"name": "--as",
|
|
13173
|
+
"value": "<consumer-name>",
|
|
12879
13174
|
"required": false,
|
|
12880
|
-
"description": "
|
|
13175
|
+
"description": "Name the cursor (at-least-once delivery): 1-128 letters, numbers, dots, underscores, or hyphens. Default under --follow: session-<uuid> with --session, else this panel (PANE_PANEL_ID, shortened to panel-<sha256 prefix> when longer than 64 characters); under --until-event: until-<panel id>; otherwise anonymous."
|
|
12881
13176
|
},
|
|
12882
13177
|
{
|
|
12883
|
-
"name": "--
|
|
13178
|
+
"name": "--since",
|
|
13179
|
+
"value": "<generation>",
|
|
12884
13180
|
"required": false,
|
|
12885
|
-
"
|
|
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."
|
|
13181
|
+
"description": "Use an explicit generation cursor instead of a name. Cannot be combined with --as or --follow."
|
|
12887
13182
|
},
|
|
12888
13183
|
{
|
|
12889
|
-
"name": "--
|
|
13184
|
+
"name": "--from",
|
|
12890
13185
|
"required": false,
|
|
12891
|
-
"value": "<
|
|
12892
|
-
"description": "
|
|
13186
|
+
"value": "<now|earliest>",
|
|
13187
|
+
"description": "Starting point for a new named cursor. Default now (silent baseline); earliest replays the journal."
|
|
12893
13188
|
},
|
|
12894
13189
|
{
|
|
12895
|
-
"name": "--
|
|
13190
|
+
"name": "--self-test",
|
|
12896
13191
|
"required": false,
|
|
12897
|
-
"
|
|
12898
|
-
"description": "Follow every Pane associated with a named Session (id or exact name). The daemon re-reads membership on every read, so a Pane associated after arming is included and a detached or archived Pane drops out without a re-arm. The Session's own orchestrator panels are never reported. Cannot be combined with --pane or --all-managed; an unknown Session fails."
|
|
13192
|
+
"description": "Check the daemon watch path without moving any cursor, print WATCH OK, and exit 0."
|
|
12899
13193
|
},
|
|
12900
13194
|
{
|
|
12901
|
-
"name": "--
|
|
13195
|
+
"name": "--ready-settle",
|
|
13196
|
+
"value": "<duration>",
|
|
12902
13197
|
"required": false,
|
|
12903
|
-
"
|
|
12904
|
-
"description": "Exclude a Pane; repeatable."
|
|
13198
|
+
"description": "Override: how long a panel must stay quiet before READY. Default 3m. A BUSY, BLOCKED, UNKNOWN, EXIT, or GONE inside the window cancels it. 0 turns it off."
|
|
12905
13199
|
},
|
|
12906
13200
|
{
|
|
12907
|
-
"name": "--
|
|
13201
|
+
"name": "--blocked-settle",
|
|
13202
|
+
"value": "<duration>",
|
|
12908
13203
|
"required": false,
|
|
12909
|
-
"
|
|
12910
|
-
"description": "Limit to a saved repository (active, id, path, or name). Default all repositories."
|
|
13204
|
+
"description": "Override: how long before BLOCKED is printed; an in-pane answer inside it cancels the line. Default 30s. 0 turns it off."
|
|
12911
13205
|
},
|
|
12912
13206
|
{
|
|
12913
|
-
"name": "--
|
|
13207
|
+
"name": "--min-interval",
|
|
13208
|
+
"value": "<duration>",
|
|
12914
13209
|
"required": false,
|
|
12915
|
-
"
|
|
12916
|
-
"description": "Limit by Pane name substring."
|
|
13210
|
+
"description": "Override: batch READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines at most once per interval; REPORT, BLOCKED, pr.conflicted, and failed pr.checks arrive at once and carry the held lines. Default 10m. 0 turns batching off."
|
|
12917
13211
|
},
|
|
12918
13212
|
{
|
|
12919
|
-
"name": "--
|
|
13213
|
+
"name": "--idle-after",
|
|
13214
|
+
"value": "<duration>",
|
|
12920
13215
|
"required": false,
|
|
12921
|
-
"description": "
|
|
13216
|
+
"description": "Override: the first IDLE reminder after a READY panel stays idle. Default 10m. Later reminders back off to 30m, 1h, 3h, then daily. 0 turns IDLE off."
|
|
12922
13217
|
},
|
|
12923
13218
|
{
|
|
12924
|
-
"name": "--
|
|
13219
|
+
"name": "--expire-after",
|
|
13220
|
+
"value": "<duration>",
|
|
12925
13221
|
"required": false,
|
|
12926
|
-
"description": "
|
|
13222
|
+
"description": "Override: end the watch with WATCH EXPIRED and exit 0 after this long with no events but IDLE; any other event restarts the clock. Default 3h. 0 never expires."
|
|
12927
13223
|
},
|
|
12928
13224
|
{
|
|
12929
|
-
"name": "--
|
|
13225
|
+
"name": "--heartbeat",
|
|
13226
|
+
"value": "<duration>",
|
|
12930
13227
|
"required": false,
|
|
12931
|
-
"description": "
|
|
13228
|
+
"description": "Override: print a HEARTBEAT line this often as proof of life. Default off; a monitor that wakes an agent should leave it off."
|
|
12932
13229
|
},
|
|
12933
13230
|
{
|
|
12934
13231
|
"name": "--timeout-ms",
|
|
12935
13232
|
"required": false,
|
|
12936
|
-
"value": "<
|
|
12937
|
-
"description": "
|
|
13233
|
+
"value": "<duration>",
|
|
13234
|
+
"description": "Per-request wait in milliseconds; 0 reads once without waiting. Default 60000, capped at 120000 (the follow loop re-issues requests). With --until-event it is the deadline for the whole wait (exit 124 with WATCH TIMEOUT). Accepts ms/s/m/h units; bare values are milliseconds. 0/off is a nonblocking read only, and is rejected with --follow or --until-event."
|
|
12938
13235
|
},
|
|
12939
13236
|
{
|
|
12940
13237
|
"name": "--limit",
|
|
@@ -12957,21 +13254,6 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12957
13254
|
"required": false,
|
|
12958
13255
|
"description": "Disable redacted held-input detection under --follow: no STUCK lines, and no heldInputPresent in JSON."
|
|
12959
13256
|
},
|
|
12960
|
-
{
|
|
12961
|
-
"name": "--self-test",
|
|
12962
|
-
"required": false,
|
|
12963
|
-
"description": "Probe the watch path anonymously without advancing a named cursor; run it before arming --follow."
|
|
12964
|
-
},
|
|
12965
|
-
{
|
|
12966
|
-
"name": "--quiet",
|
|
12967
|
-
"required": false,
|
|
12968
|
-
"description": "Drop the control lines that only prove liveness: WATCH OK, HEARTBEAT, and WATCH RECONNECTED (_ok, _heartbeat, _reconnected in JSON). WATCH ERROR/_error, RESET/_reset, and DROPPED/_dropped always print, and --self-test still prints its WATCH OK result. Alias: --no-control-lines."
|
|
12969
|
-
},
|
|
12970
|
-
{
|
|
12971
|
-
"name": "--json",
|
|
12972
|
-
"required": false,
|
|
12973
|
-
"description": "Emit structured NDJSON; held-input content remains opt-in."
|
|
12974
|
-
},
|
|
12975
13257
|
{
|
|
12976
13258
|
"name": "--pane-dir",
|
|
12977
13259
|
"value": "<path>",
|
|
@@ -12979,41 +13261,41 @@ exports.RUNPANE_CONTRACT = {
|
|
|
12979
13261
|
"description": "Connect to a specific Pane data directory."
|
|
12980
13262
|
},
|
|
12981
13263
|
{
|
|
12982
|
-
"name": "--
|
|
12983
|
-
"value": "<
|
|
12984
|
-
"
|
|
12985
|
-
"
|
|
13264
|
+
"name": "--epoch",
|
|
13265
|
+
"value": "<epoch>",
|
|
13266
|
+
"description": "Journal epoch paired with --since; a mismatch emits _reset instead of silently skipping events.",
|
|
13267
|
+
"required": false
|
|
12986
13268
|
}
|
|
12987
13269
|
],
|
|
12988
13270
|
"examples": [
|
|
12989
13271
|
"runpane watch --self-test",
|
|
13272
|
+
"runpane watch --until-event",
|
|
12990
13273
|
"runpane watch --follow",
|
|
12991
|
-
"runpane watch --
|
|
12992
|
-
"runpane watch --
|
|
12993
|
-
"runpane watch --follow --
|
|
12994
|
-
"runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 60000 --blocked-settle 15000 --min-interval 120000",
|
|
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",
|
|
12996
|
-
"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 60000 --blocked-settle 15000 --min-interval 120000"
|
|
13274
|
+
"runpane watch --session <id|name> --follow",
|
|
13275
|
+
"runpane watch --session <id|name> --follow --ready-settle 1m --blocked-settle 15s --min-interval 2m",
|
|
13276
|
+
"runpane watch --follow --json --kinds agent.report,agent.blocked"
|
|
12997
13277
|
],
|
|
12998
13278
|
"notes": [
|
|
12999
|
-
"
|
|
13000
|
-
"
|
|
13001
|
-
"
|
|
13002
|
-
"
|
|
13279
|
+
"Every default is in the contract under defaults.watch: follow (what --follow does) and untilEvent (what --until-event waits for). An override flag replaces one value; nothing else needs remembering.",
|
|
13280
|
+
"Arming: wait for WATCH OK before relying on a --follow monitor. It prints once when the watch is armed. Run the monitor under your harness's background monitor (one line = one notification).",
|
|
13281
|
+
"Ending: WATCH EXPIRED (exit 0) means nothing happened for --expire-after: say so, and arm a new watch with the next dispatch. A non-zero exit or a WATCH ERROR line means it failed: tell the user and re-arm once; if it dies again, file runpane doctor --report. If the message says the cursor was superseded, keep the replacement monitor and leave the old one stopped. Judge a watch by these lines, never by silence.",
|
|
13282
|
+
"--until-event prints exactly one line: the event (exit 0), WATCH TIMEOUT (exit 124, only with --timeout-ms), or WATCH ERROR (exit 2).",
|
|
13003
13283
|
"STUCK means real unsubmitted composer text. An agent prompt suggestion (for example a grey Try \"...\" hint) never counts.",
|
|
13004
|
-
"
|
|
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.",
|
|
13284
|
+
"Cadence state is held per named consumer. Without numeric --since, follow uses an explicit --as or assigns a Session, panel, or follow-<pid> name. With numeric --since it has no name and bypasses cadence; --as cannot be combined with --since. Held lines survive a reconnect of the same consumer; a changed filter re-delivers them under the new filter.",
|
|
13006
13285
|
"Journal loss is surfaced through reset and dropped metadata.",
|
|
13007
13286
|
"The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly.",
|
|
13008
|
-
"Control lines are not journal entries.
|
|
13287
|
+
"Control lines are not journal entries. Lines text and JSON kind: WATCH OK (_ok, once when armed), HEARTBEAT (_heartbeat, only with --heartbeat), WATCH RECONNECTED (_reconnected, after a retried daemon error), WATCH ERROR (_error; exit 2 unless --follow or --until-event retries it), RESET (_reset, the journal restarted or the cursor fell behind; a fresh baseline follows), DROPPED (_dropped, entries lost to journal truncation), WATCH TIMEOUT (_timeout, --until-event deadline; exit 124), and WATCH EXPIRED (_expired, --expire-after passed; exit 0). Under --until-event, only _timeout and _error print.",
|
|
13009
13288
|
"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.",
|
|
13010
13289
|
"--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.",
|
|
13011
13290
|
"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.",
|
|
13012
|
-
"PR
|
|
13291
|
+
"PR watching: the daemon batches up to 25 direct GraphQL fingerprints per host every ~2 minutes. Full details are read on change or a 30-minute backstop. Existing Session branch discovery remains; standalone Panes register with pr watch --url <PR URL> [--head <full-sha>]. Immediate failures, required-check-aware success, head/review/comment/closed/merged events and GitHub outage/recovery events share durable baselines and the journal. A head pin prevents stale success, empty/partial checks never pass, and merge status BLOCKED/UNKNOWN conservatively withholds success. Rate limits honor server waits and reserve 10% for interactive use. Eight other errors or ten comment-only updates stop the watch with pr.stopped. See pr watch/unwatch/list.",
|
|
13013
13292
|
"A daemon that predates --session returns no session field; runpane then fails with WATCH ERROR instead of watching every Pane.",
|
|
13014
13293
|
"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.",
|
|
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
|
|
13016
|
-
"
|
|
13294
|
+
"agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's `runpane report`. It is in the default kinds of --follow and --until-event, and arrives from any panel: a shell tab or a wrapper launch whose agent is not yet detected included. It bypasses --min-interval, and orchestrators treat it as the completion signal; a READY without a report means look, and maybe nudge.",
|
|
13295
|
+
"Never pipe --follow into grep -m1, head, or any other exit-on-match reader: it does not exit when its reader does until its next write. To wait for one event, use --until-event.",
|
|
13296
|
+
"Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
|
|
13297
|
+
"--follow has one default cadence: READY 3m, BLOCKED 30s, non-urgent batches 10m, IDLE after 10m with backoff, expiry 3h, heartbeats off. Individual duration flags override it. --present and --profile were removed; use --ready-settle, --blocked-settle, and --min-interval for timing overrides.",
|
|
13298
|
+
"--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."
|
|
13017
13299
|
]
|
|
13018
13300
|
},
|
|
13019
13301
|
"panes git-status": {
|
|
@@ -14105,7 +14387,7 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14105
14387
|
"notes": [
|
|
14106
14388
|
"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.",
|
|
14107
14389
|
"Each report replaces the panel's previous one and survives a Pane restart.",
|
|
14108
|
-
"
|
|
14390
|
+
"agent.report is in the default kinds of `runpane watch --follow` and `--until-event`, and arrives from any panel, a shell tab included. REPORT lines skip the --min-interval batch.",
|
|
14109
14391
|
"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."
|
|
14110
14392
|
]
|
|
14111
14393
|
},
|
|
@@ -14792,6 +15074,132 @@ exports.RUNPANE_CONTRACT = {
|
|
|
14792
15074
|
"notes": [
|
|
14793
15075
|
"Uses the same Session update path as the UI. The requested pin state is idempotent."
|
|
14794
15076
|
]
|
|
15077
|
+
},
|
|
15078
|
+
"pr watch": {
|
|
15079
|
+
"name": "pr watch",
|
|
15080
|
+
"summary": "Register durable GitHub PR monitoring for a Pane.",
|
|
15081
|
+
"details": "Register durable GitHub PR monitoring for a Pane.",
|
|
15082
|
+
"requiresPaneDaemon": true,
|
|
15083
|
+
"mutates": true,
|
|
15084
|
+
"arguments": [
|
|
15085
|
+
{
|
|
15086
|
+
"name": "--pane",
|
|
15087
|
+
"value": "<id>",
|
|
15088
|
+
"required": false,
|
|
15089
|
+
"description": "Pane id; defaults to PANE_SESSION_ID."
|
|
15090
|
+
},
|
|
15091
|
+
{
|
|
15092
|
+
"name": "--url",
|
|
15093
|
+
"value": "<PR URL>",
|
|
15094
|
+
"required": true,
|
|
15095
|
+
"description": "Full HTTPS GitHub PR URL, including host, repository and number."
|
|
15096
|
+
},
|
|
15097
|
+
{
|
|
15098
|
+
"name": "--head",
|
|
15099
|
+
"value": "<full-sha>",
|
|
15100
|
+
"required": false,
|
|
15101
|
+
"description": "Pin success to this 40-character SHA; otherwise pin the first observed head."
|
|
15102
|
+
},
|
|
15103
|
+
{
|
|
15104
|
+
"name": "--json",
|
|
15105
|
+
"required": false,
|
|
15106
|
+
"description": "Print JSON (also the default for PR commands)."
|
|
15107
|
+
},
|
|
15108
|
+
{
|
|
15109
|
+
"name": "--pane-dir",
|
|
15110
|
+
"value": "<path>",
|
|
15111
|
+
"required": false,
|
|
15112
|
+
"description": "Pane data directory."
|
|
15113
|
+
}
|
|
15114
|
+
],
|
|
15115
|
+
"examples": [
|
|
15116
|
+
"runpane pr watch [--pane <id>] --url <PR URL> [--head <full-sha>] [--json] [--pane-dir <path>]"
|
|
15117
|
+
],
|
|
15118
|
+
"jsonSchemas": [
|
|
15119
|
+
"prWatchResult"
|
|
15120
|
+
],
|
|
15121
|
+
"notes": [
|
|
15122
|
+
"Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
|
|
15123
|
+
"Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
|
|
15124
|
+
]
|
|
15125
|
+
},
|
|
15126
|
+
"pr unwatch": {
|
|
15127
|
+
"name": "pr unwatch",
|
|
15128
|
+
"summary": "Remove a Pane’s explicit PR registration.",
|
|
15129
|
+
"details": "Remove a Pane’s explicit PR registration.",
|
|
15130
|
+
"requiresPaneDaemon": true,
|
|
15131
|
+
"mutates": true,
|
|
15132
|
+
"arguments": [
|
|
15133
|
+
{
|
|
15134
|
+
"name": "--pane",
|
|
15135
|
+
"value": "<id>",
|
|
15136
|
+
"required": false,
|
|
15137
|
+
"description": "Pane id; defaults to PANE_SESSION_ID."
|
|
15138
|
+
},
|
|
15139
|
+
{
|
|
15140
|
+
"name": "--url",
|
|
15141
|
+
"value": "<PR URL>",
|
|
15142
|
+
"required": true,
|
|
15143
|
+
"description": "Full HTTPS GitHub PR URL, including host, repository and number."
|
|
15144
|
+
},
|
|
15145
|
+
{
|
|
15146
|
+
"name": "--json",
|
|
15147
|
+
"required": false,
|
|
15148
|
+
"description": "Print JSON (also the default for PR commands)."
|
|
15149
|
+
},
|
|
15150
|
+
{
|
|
15151
|
+
"name": "--pane-dir",
|
|
15152
|
+
"value": "<path>",
|
|
15153
|
+
"required": false,
|
|
15154
|
+
"description": "Pane data directory."
|
|
15155
|
+
}
|
|
15156
|
+
],
|
|
15157
|
+
"examples": [
|
|
15158
|
+
"runpane pr unwatch [--pane <id>] --url <PR URL> [--json] [--pane-dir <path>]"
|
|
15159
|
+
],
|
|
15160
|
+
"jsonSchemas": [
|
|
15161
|
+
"prWatchResult"
|
|
15162
|
+
],
|
|
15163
|
+
"notes": [
|
|
15164
|
+
"Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
|
|
15165
|
+
"Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
|
|
15166
|
+
]
|
|
15167
|
+
},
|
|
15168
|
+
"pr list": {
|
|
15169
|
+
"name": "pr list",
|
|
15170
|
+
"summary": "List PR registrations and stopped watches.",
|
|
15171
|
+
"details": "List PR registrations and stopped watches.",
|
|
15172
|
+
"requiresPaneDaemon": true,
|
|
15173
|
+
"mutates": false,
|
|
15174
|
+
"arguments": [
|
|
15175
|
+
{
|
|
15176
|
+
"name": "--pane",
|
|
15177
|
+
"value": "<id>",
|
|
15178
|
+
"required": false,
|
|
15179
|
+
"description": "Pane id; defaults to PANE_SESSION_ID."
|
|
15180
|
+
},
|
|
15181
|
+
{
|
|
15182
|
+
"name": "--json",
|
|
15183
|
+
"required": false,
|
|
15184
|
+
"description": "Print JSON (also the default for PR commands)."
|
|
15185
|
+
},
|
|
15186
|
+
{
|
|
15187
|
+
"name": "--pane-dir",
|
|
15188
|
+
"value": "<path>",
|
|
15189
|
+
"required": false,
|
|
15190
|
+
"description": "Pane data directory."
|
|
15191
|
+
}
|
|
15192
|
+
],
|
|
15193
|
+
"examples": [
|
|
15194
|
+
"runpane pr list [--pane <id>] [--json] [--pane-dir <path>]"
|
|
15195
|
+
],
|
|
15196
|
+
"jsonSchemas": [
|
|
15197
|
+
"prWatchResult"
|
|
15198
|
+
],
|
|
15199
|
+
"notes": [
|
|
15200
|
+
"Registration returns generation and epoch. Initially arm watch --until-event --since <generation> --epoch <epoch> --pane <id> --json --kinds pr.checks,pr.head,pr.comment,pr.review,pr.closed,pr.merged,pr.conflicted,pr.stopped,github.unavailable,github.recovered. Process every NDJSON event, then persist its gen and epoch for the next --since/--epoch; --limit 1 delivers one event per run. Never mix --as with --since/--epoch. On _reset or _dropped, resynchronize GitHub state, then use the control record generation and epoch; replay/baseline records are not new events. No merge or GitHub write is performed.",
|
|
15201
|
+
"Watches stop on merge/close, 8 non-rate-limit errors, or 10 comment-only updates. Archived/deleted Panes are removed. Re-register after resolving the reason. Session member PR discovery remains automatic."
|
|
15202
|
+
]
|
|
14795
15203
|
}
|
|
14796
15204
|
},
|
|
14797
15205
|
"managedBlock": [
|