runpane 2.4.169 → 2.4.170

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.
@@ -61,7 +61,8 @@ exports.RUNPANE_CONTRACT = {
61
61
  "agents": [
62
62
  "codex",
63
63
  "claude",
64
- "cursor"
64
+ "cursor",
65
+ "opencode"
65
66
  ]
66
67
  },
67
68
  "agentTemplates": {
@@ -79,6 +80,11 @@ exports.RUNPANE_CONTRACT = {
79
80
  "title": "Cursor",
80
81
  "command": "cursor-agent --force --trust",
81
82
  "description": "Open a Cursor Agent terminal tab and allow the initial input to drive the agent."
83
+ },
84
+ "opencode": {
85
+ "title": "OpenCode",
86
+ "command": "opencode --auto",
87
+ "description": "Open an OpenCode terminal tab and allow the initial input to drive the agent."
82
88
  }
83
89
  },
84
90
  "terminalKeys": {
@@ -614,7 +620,7 @@ exports.RUNPANE_CONTRACT = {
614
620
  "name": "panels submit",
615
621
  "summary": "Send and submit text to a terminal panel, including idle agent composers.",
616
622
  "usage": [
617
- "runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--source user|agent] --yes [--json] [--pane-dir <path>]"
623
+ "runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] [--source user|agent] --yes [--json] [--pane-dir <path>]"
618
624
  ],
619
625
  "mutates": true,
620
626
  "toolsets": [
@@ -1191,7 +1197,7 @@ exports.RUNPANE_CONTRACT = {
1191
1197
  },
1192
1198
  {
1193
1199
  "name": "sessions create",
1194
- "summary": "Create a durable named orchestration Session and its hidden terminal owner.",
1200
+ "summary": "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false).",
1195
1201
  "usage": [
1196
1202
  "runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]"
1197
1203
  ],
@@ -1221,7 +1227,7 @@ exports.RUNPANE_CONTRACT = {
1221
1227
  },
1222
1228
  {
1223
1229
  "name": "sessions update",
1224
- "summary": "Update a Session overview from structured JSON.",
1230
+ "summary": "Update a Session overview from structured JSON; isPinned sets the UI pin star.",
1225
1231
  "usage": [
1226
1232
  "runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]"
1227
1233
  ],
@@ -1345,6 +1351,38 @@ exports.RUNPANE_CONTRACT = {
1345
1351
  "lockListResult"
1346
1352
  ],
1347
1353
  "localControl": true
1354
+ },
1355
+ {
1356
+ "name": "sessions unpin",
1357
+ "summary": "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state.",
1358
+ "usage": [
1359
+ "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]"
1360
+ ],
1361
+ "mutates": true,
1362
+ "idempotent": true,
1363
+ "toolsets": [
1364
+ "sessions"
1365
+ ],
1366
+ "jsonSchemas": [
1367
+ "sessionResult"
1368
+ ],
1369
+ "localControl": true
1370
+ },
1371
+ {
1372
+ "name": "sessions pin",
1373
+ "summary": "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state.",
1374
+ "usage": [
1375
+ "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]"
1376
+ ],
1377
+ "mutates": true,
1378
+ "idempotent": true,
1379
+ "toolsets": [
1380
+ "sessions"
1381
+ ],
1382
+ "jsonSchemas": [
1383
+ "sessionResult"
1384
+ ],
1385
+ "localControl": true
1348
1386
  }
1349
1387
  ],
1350
1388
  "flags": {
@@ -1518,7 +1556,7 @@ exports.RUNPANE_CONTRACT = {
1518
1556
  {
1519
1557
  "name": "--file",
1520
1558
  "value": "<path>",
1521
- "description": "File inside the Pane worktree to open; HTML renders in a browser tab."
1559
+ "description": "File inside the Pane worktree to open; supported formats have read-only previews, including HTML source."
1522
1560
  },
1523
1561
  {
1524
1562
  "name": "--initial-input",
@@ -1789,7 +1827,7 @@ exports.RUNPANE_CONTRACT = {
1789
1827
  },
1790
1828
  {
1791
1829
  "name": "--pinned",
1792
- "description": "Accepted for backward compatibility; `panes create` already pins by default."
1830
+ "description": "Request pinning at creation; Session association still clears the first pin. Outside a Session, creation pins by default."
1793
1831
  },
1794
1832
  {
1795
1833
  "name": "--no-pinned",
@@ -1877,6 +1915,10 @@ exports.RUNPANE_CONTRACT = {
1877
1915
  {
1878
1916
  "name": "--push",
1879
1917
  "description": "Before a handoff, commit uncommitted work as WIP and push the branch (never forces)."
1918
+ },
1919
+ {
1920
+ "name": "--interrupt",
1921
+ "description": "Stop the current agent turn, wait for an empty idle composer, then submit and verify the replacement."
1880
1922
  }
1881
1923
  ]
1882
1924
  },
@@ -1901,6 +1943,8 @@ exports.RUNPANE_CONTRACT = {
1901
1943
  " runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]",
1902
1944
  " runpane sessions get --session <id|name> [--json] [--pane-dir <path>]",
1903
1945
  " runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]",
1946
+ " runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]",
1947
+ " runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
1904
1948
  " runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]",
1905
1949
  " runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]",
1906
1950
  " runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]",
@@ -2239,13 +2283,15 @@ exports.RUNPANE_CONTRACT = {
2239
2283
  " --source <user|agent> Mark mutation source; agent implies background creation",
2240
2284
  " --no-focus Create in the background without stealing focus",
2241
2285
  " --focus Explicitly focus the created pane",
2242
- " --pinned Accepted for compatibility; creation already pins by default",
2243
- " --no-pinned Create unpinned instead of the default pinned (the UI's favorite/pin star)",
2286
+ " --pinned Request pinning at creation; first Session association clears it",
2287
+ " --no-pinned Create unpinned (the UI's favorite/pin star)",
2244
2288
  " --no-associate Inside a Session orchestrator, do not associate the new pane with that Session",
2245
2289
  " --pane-dir <path> Connect to a specific Pane data directory",
2246
2290
  " --json Print machine-readable output",
2247
2291
  " --dry-run Validate and preview without creating panes",
2248
- " --yes Skip confirmation for mutating commands"
2292
+ " --yes Skip confirmation for mutating commands",
2293
+ "",
2294
+ "Outside a Session, creation pins by default, including --source agent. Inside a Session (PANE_ORCHESTRATION_SESSION_ID), children default to unpinned to avoid duplicating them in the global pinned list. First Session association clears the creation pin, including --pinned; use panes pin afterward to pin an associated child."
2249
2295
  ],
2250
2296
  "panes adopt": [
2251
2297
  "Usage:",
@@ -2450,7 +2496,7 @@ exports.RUNPANE_CONTRACT = {
2450
2496
  ],
2451
2497
  "panels submit": [
2452
2498
  "Usage:",
2453
- " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] --yes [--json]",
2499
+ " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
2454
2500
  "",
2455
2501
  "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
2456
2502
  "",
@@ -2467,7 +2513,8 @@ exports.RUNPANE_CONTRACT = {
2467
2513
  " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
2468
2514
  " --pane-dir <path> Connect to a specific Pane data directory",
2469
2515
  " --json Print machine-readable output",
2470
- " --yes Skip confirmation for this mutating command"
2516
+ " --yes Skip confirmation for this mutating command",
2517
+ " --interrupt Stop the current turn, wait for idle, then submit the replacement"
2471
2518
  ],
2472
2519
  "panels wait": [
2473
2520
  "Usage:",
@@ -2513,7 +2560,7 @@ exports.RUNPANE_CONTRACT = {
2513
2560
  "Usage:",
2514
2561
  " runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]",
2515
2562
  "",
2516
- "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: .html/.htm files render in a browser tab, other files open in an editor tab. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
2563
+ "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats, including HTML source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
2517
2564
  "",
2518
2565
  "Options:",
2519
2566
  " --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.",
@@ -2561,7 +2608,10 @@ exports.RUNPANE_CONTRACT = {
2561
2608
  " --from-json <path|-> Read structured JSON from a file or stdin.",
2562
2609
  " --pane <pane-id> User-visible Pane to associate or detach.",
2563
2610
  " --agent <codex|claude|cursor> Agent terminal to use.",
2564
- " --json Print JSON output."
2611
+ " --json Print JSON output.",
2612
+ "",
2613
+ "JSON isPinned: true pins the Session; omitted or false leaves it unpinned.",
2614
+ "Create-time isPinned requires an updated Pane app; on older apps, use sessions pin after creation and read back the result."
2565
2615
  ],
2566
2616
  "sessions get": [
2567
2617
  "Usage:",
@@ -2583,7 +2633,9 @@ exports.RUNPANE_CONTRACT = {
2583
2633
  " --from-json <path|-> Read structured JSON from a file or stdin.",
2584
2634
  " --pane <pane-id> User-visible Pane to associate or detach.",
2585
2635
  " --agent <codex|claude|cursor> Agent terminal to use.",
2586
- " --json Print JSON output."
2636
+ " --json Print JSON output.",
2637
+ "",
2638
+ "JSON isPinned: true/false sets the Session pin star. Select the Session with --session, not a session field in JSON."
2587
2639
  ],
2588
2640
  "sessions set-agent": [
2589
2641
  "Usage:",
@@ -3099,6 +3151,18 @@ exports.RUNPANE_CONTRACT = {
3099
3151
  " runpane handoff --template > ~/handoff.md",
3100
3152
  " runpane handoff \"claude opus on parsas-macbook-pro\" --note-file ~/handoff.md --push",
3101
3153
  " runpane handoff \"codex gpt-5 high on parsa-devbox\" --note-file ~/handoff.md --dry-run"
3154
+ ],
3155
+ "sessions pin": [
3156
+ "Usage:",
3157
+ "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]",
3158
+ "",
3159
+ "Set the named Session pin star on. Repeated requests keep that state. Uses the same Session update path as the UI."
3160
+ ],
3161
+ "sessions unpin": [
3162
+ "Usage:",
3163
+ "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
3164
+ "",
3165
+ "Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."
3102
3166
  ]
3103
3167
  },
3104
3168
  "pip": {
@@ -3430,13 +3494,15 @@ exports.RUNPANE_CONTRACT = {
3430
3494
  " --source <user|agent> Mark mutation source; agent implies background creation",
3431
3495
  " --no-focus Create in the background without stealing focus",
3432
3496
  " --focus Explicitly focus the created pane",
3433
- " --pinned Accepted for compatibility; creation already pins by default",
3434
- " --no-pinned Create unpinned instead of the default pinned (the UI's favorite/pin star)",
3497
+ " --pinned Request pinning at creation; first Session association clears it",
3498
+ " --no-pinned Create unpinned (the UI's favorite/pin star)",
3435
3499
  " --no-associate Inside a Session orchestrator, do not associate the new pane with that Session",
3436
3500
  " --pane-dir <path> Connect to a specific Pane data directory",
3437
3501
  " --json Print machine-readable output",
3438
3502
  " --dry-run Validate and preview without creating panes",
3439
- " --yes Skip confirmation for mutating commands"
3503
+ " --yes Skip confirmation for mutating commands",
3504
+ "",
3505
+ "Outside a Session, creation pins by default, including --source agent. Inside a Session (PANE_ORCHESTRATION_SESSION_ID), children default to unpinned to avoid duplicating them in the global pinned list. First Session association clears the creation pin, including --pinned; use panes pin afterward to pin an associated child."
3440
3506
  ],
3441
3507
  "panes adopt": [
3442
3508
  "Usage:",
@@ -3633,7 +3699,7 @@ exports.RUNPANE_CONTRACT = {
3633
3699
  ],
3634
3700
  "panels submit": [
3635
3701
  "Usage:",
3636
- " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] --yes [--json]",
3702
+ " runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] --yes [--json]",
3637
3703
  "",
3638
3704
  "Sends text to a terminal panel and normalizes the final terminal Enter to CR. Use this for ordinary prompt answers and shell commands.",
3639
3705
  "",
@@ -3650,7 +3716,8 @@ exports.RUNPANE_CONTRACT = {
3650
3716
  " --as-file-pointer Write the text to a prompt file and submit `Read and follow <path>`",
3651
3717
  " --pane-dir <path> Connect to a specific Pane data directory",
3652
3718
  " --json Print machine-readable output",
3653
- " --yes Skip confirmation for this mutating command"
3719
+ " --yes Skip confirmation for this mutating command",
3720
+ " --interrupt Stop the current turn, wait for idle, then submit the replacement"
3654
3721
  ],
3655
3722
  "panels wait": [
3656
3723
  "Usage:",
@@ -3696,7 +3763,7 @@ exports.RUNPANE_CONTRACT = {
3696
3763
  "Usage:",
3697
3764
  " python -m runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]",
3698
3765
  "",
3699
- "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: .html/.htm files render in a browser tab, other files open in an editor tab. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
3766
+ "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats, including HTML source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
3700
3767
  "",
3701
3768
  "Options:",
3702
3769
  " --pane <pane-id> Pane to open the tab in; defaults to PANE_SESSION_ID.",
@@ -3744,7 +3811,10 @@ exports.RUNPANE_CONTRACT = {
3744
3811
  " --from-json <path|-> Read structured JSON from a file or stdin.",
3745
3812
  " --pane <pane-id> User-visible Pane to associate or detach.",
3746
3813
  " --agent <codex|claude|cursor> Agent terminal to use.",
3747
- " --json Print JSON output."
3814
+ " --json Print JSON output.",
3815
+ "",
3816
+ "JSON isPinned: true pins the Session; omitted or false leaves it unpinned.",
3817
+ "Create-time isPinned requires an updated Pane app; on older apps, use sessions pin after creation and read back the result."
3748
3818
  ],
3749
3819
  "sessions get": [
3750
3820
  "Usage:",
@@ -3766,7 +3836,9 @@ exports.RUNPANE_CONTRACT = {
3766
3836
  " --from-json <path|-> Read structured JSON from a file or stdin.",
3767
3837
  " --pane <pane-id> User-visible Pane to associate or detach.",
3768
3838
  " --agent <codex|claude|cursor> Agent terminal to use.",
3769
- " --json Print JSON output."
3839
+ " --json Print JSON output.",
3840
+ "",
3841
+ "JSON isPinned: true/false sets the Session pin star. Select the Session with --session, not a session field in JSON."
3770
3842
  ],
3771
3843
  "sessions set-agent": [
3772
3844
  "Usage:",
@@ -4213,6 +4285,18 @@ exports.RUNPANE_CONTRACT = {
4213
4285
  "",
4214
4286
  "`runpane handoff` ships in the npm package and the Pane app, not in the Python package.",
4215
4287
  "Run it with Node instead: npx --yes runpane@latest handoff"
4288
+ ],
4289
+ "sessions pin": [
4290
+ "Usage:",
4291
+ "python -m runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]",
4292
+ "",
4293
+ "Set the named Session pin star on. Repeated requests keep that state. Uses the same Session update path as the UI."
4294
+ ],
4295
+ "sessions unpin": [
4296
+ "Usage:",
4297
+ "python -m runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
4298
+ "",
4299
+ "Set the named Session pin star off. Repeated requests keep that state. Uses the same Session update path as the UI."
4216
4300
  ]
4217
4301
  }
4218
4302
  },
@@ -4302,6 +4386,8 @@ exports.RUNPANE_CONTRACT = {
4302
4386
  "runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]",
4303
4387
  "runpane sessions get --session <id|name> [--json] [--pane-dir <path>]",
4304
4388
  "runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]",
4389
+ "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]",
4390
+ "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]",
4305
4391
  "runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]",
4306
4392
  "runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]",
4307
4393
  "runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]",
@@ -4337,12 +4423,12 @@ exports.RUNPANE_CONTRACT = {
4337
4423
  "`runpane repos add` registers an existing git repository with the running local Pane daemon. It does not create directories or initialize git repositories by default.",
4338
4424
  "`runpane panes list` lists Pane sessions, optionally scoped to one saved repository.",
4339
4425
  "`runpane panes cost` reports estimated token costs per Pane for the last 30 days, including per-model breakdowns and cache efficiency; unscoped output includes an Unattributed bucket that reconciles against workspace totals.",
4340
- "`runpane panes create` connects to the running local Pane daemon, resolves the requested saved base repository, creates user-visible Pane sessions backed by Pane-managed worktrees/branches, opens terminal-backed tool tabs, and optionally sends initial input to the started tool. Built-in agent panes and `--source agent` default to background/no-focus unless `--focus` is passed. New Panes are pinned into the UI's favorite/pin set by default, except when the CLI runs inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID`), where child worktrees default to unpinned. Explicit `--pinned` / `--no-pinned` override creation defaults. First Session association clears an existing pin; manual pins applied afterward are preserved. Panes created interactively in the Pane UI are unaffected. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.",
4341
- "For `panes create --wait-ready`, `initialInput.delivery` says where the prompt went: `taken` or `queued` (from the agent's transcript, its screen, or `argv` for a launch-argument prompt), `in-composer`, or `unknown`. `initialInput.verifiedSubmitted` is true exactly when it is `taken` or `queued`. Routing input does not by itself verify submission.",
4426
+ "`runpane panes create` connects to the running local Pane daemon, resolves the requested saved base repository, creates user-visible Pane sessions backed by Pane-managed worktrees/branches, opens terminal-backed tool tabs, and optionally sends initial input to the started tool. Built-in agent panes and `--source agent` default to background/no-focus unless `--focus` is passed. New Panes are pinned into the UI's favorite/pin set by default, except when the CLI runs inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID`), where child worktrees default to unpinned. Explicit `--pinned` / `--no-pinned` override creation defaults. First Session association clears an existing pin, including an explicit creation pin; use `panes pin` after association to pin a child. This avoids duplicating Session children in the global pinned list. Manual pins applied afterward are preserved. Panes created interactively in the Pane UI are unaffected. Inside a Session orchestrator (`PANE_ORCHESTRATION_SESSION_ID` set), new Panes are associated with that Session automatically; `--no-associate` opts out. A failed association is reported on the item and never undoes the Pane.",
4427
+ "For `panes create --wait-ready`, `initialInput.delivery` says where the prompt went: `taken` or `queued` (from the agent's transcript or its screen), `in-composer`, or `unknown` (`argv` means a prompt was routed at launch but acceptance is not yet observed). `initialInput.verifiedSubmitted` is true exactly when it is `taken` or `queued`. Routing input does not by itself verify submission. CLI readiness is confirmed on consecutive polls. Codex also requires a recognized configured model or context footer below its live composer; its provisional startup composer is not ready. Hidden or unrecognized Codex status lines conservatively time out rather than prove readiness. Cursor launch prompts currently remain unknown because no acceptance probe is available. First-run trust and daemon dialogs return blocked.kind=first-run-dialog with the dialog in blocked.message and a suggestedCommand; while readiness is blocked or times out, launch-argument delivery remains unknown and unverified.",
4342
4428
  "`runpane panes archive` refreshes the configured upstream, reports exact unpushed commit evidence, and refuses unsafe archive operations unless `--force` is used. A branch whose upstream is gone counts as pushed when a merged GitHub pull request has HEAD as its head (`safetyCheck.mergedViaPr`). Add `--dry-run` to inspect the same evidence without archiving. `--remove-worktree` applies the same check and removal to an adopted worktree; local branches are always kept. Successful archives report `worktreeCleanup: completed` once the worktree is gone from its path and from git; `trashDeletion: pending` means its files are still being deleted in the background. `runpane panes archive --session <id|name> --merged` archives every Session Pane that is clean and pushed or merged, and reports a reason for each skipped Pane.",
4343
4429
  "`runpane panes rename` trims and updates a Pane's display name without changing its worktree, branch, panels, or focus, and returns the updated pane summary.",
4344
4430
  "`runpane panes focus` raises the Pane window and selects a Pane (and optionally one of its panels) exactly like clicking it in the UI. Because it steals the user's window focus, run it only on an explicit user request to open, focus, show, or switch to a Pane; never focus a Pane proactively, the same doctrine that keeps `panes create` background/no-focus for `--source agent`.",
4345
- "`runpane panels open` opens a URL or a file from the Pane worktree as a tab in an existing Pane (default: the calling panel's Pane from `PANE_SESSION_ID`), in split view beside the agent unless `--tab` is passed. HTML files render in a browser tab and other files open in an editor tab; an existing tab showing the same target is reused. It activates the tab inside the Pane but never raises or focuses the Pane window.",
4431
+ "`runpane panels open` opens a URL or a file from the Pane worktree as a tab in an existing Pane (default: the calling panel's Pane from `PANE_SESSION_ID`), in split view beside the agent unless `--tab` is passed. Files open in an editor tab with read-only previews for supported formats, including HTML source; an existing tab showing the same target is reused. It activates the tab inside the Pane but never raises or focuses the Pane window.",
4346
4432
  "`runpane panels list` lists tool panels inside one Pane session.",
4347
4433
  "`runpane panels output` reads bounded recent terminal output from one panel and strips common terminal control noise for agent use.",
4348
4434
  "`runpane panels input` sends exact input bytes to one terminal panel. Prefer `--input-file` for newlines, Ctrl-C, quotes, or shell-sensitive text.",
@@ -4357,6 +4443,7 @@ exports.RUNPANE_CONTRACT = {
4357
4443
  "`sessions create` create a durable named orchestration Session and its hidden terminal owner.",
4358
4444
  "`sessions get` read one durable named orchestration Session.",
4359
4445
  "`sessions update` update a Session overview from structured JSON.",
4446
+ "`sessions pin` and `sessions unpin` set the Session pin star through the existing UI update path. Create JSON accepts `isPinned` (default false); update JSON preserves the pin when the field is omitted.",
4360
4447
  "`sessions set-agent` switch the durable terminal agent for a named Session.",
4361
4448
  "`sessions associate` associate a user-visible Pane with a named Session.",
4362
4449
  "`sessions detach` detach a Pane from a named Session.",
@@ -4378,9 +4465,10 @@ exports.RUNPANE_CONTRACT = {
4378
4465
  "The PyPI package uses `source=pip` for all Python consumers, including pip, pipx, uvx, and `python -m runpane`.",
4379
4466
  "Wrappers should prefer `https://runpane.com/api/download?platform=<platform>&arch=<arch>&format=<format>&version=<version>&channel=<channel>&source=<npm|pip>`.",
4380
4467
  "If the website route cannot satisfy the download, wrappers may fall back to the matching GitHub release asset and print a warning that website attribution may be incomplete for that run.",
4381
- "Wrappers also emit best-effort lifecycle telemetry to `https://runpane.com/api/runpane/telemetry` for command start/success/failure, download request/success/failure, and GitHub fallback usage.",
4382
- "Wrapper telemetry uses a persisted anonymous `install_id` in the form `install_<uuid>` and PostHog `distinct_id = install:<install_id>` so distinct wrapper users can be counted with `count(DISTINCT properties.install_id)`.",
4383
- "Wrapper telemetry must be disabled in CI and when `RUNPANE_TELEMETRY_DISABLED` is set, and must not include raw paths, labels, prompts, raw error text, or environment values."
4468
+ "Wrappers emit best-effort telemetry to `https://runpane.com/api/runpane/telemetry` for command failures, download request/success/failure, and GitHub fallback usage. Routine command starts and successes emit nothing.",
4469
+ "Wrapper telemetry uses a persisted anonymous `install_id` in the form `install_<uuid>` and PostHog `distinct_id = install:<install_id>` so installs reporting failures or downloads can be counted with `count(DISTINCT properties.install_id)`; this is not a count of all CLI users.",
4470
+ "Wrapper telemetry must be disabled in CI, when `RUNPANE_TELEMETRY_DISABLED` is set, and when the local config explicitly disables analytics. It must not include raw paths, labels, prompts, raw error text, or environment values.",
4471
+ "Desktop local control reports useful failures as `runpane_local_control_failed`; normal polling, wait deadlines, and optional agent unavailability emit nothing. Reports contain coarse operation and failure classification only, with a five-minute deduplication interval and a maximum of 20 per hour per app process. Handled CLI failures are ordinary events, not exceptions."
4384
4472
  ],
4385
4473
  "publishingCredentials": [
4386
4474
  "Local implementation, build, and dry-run validation do not need npm or PyPI API tokens.",
@@ -5210,6 +5298,17 @@ exports.RUNPANE_CONTRACT = {
5210
5298
  "--tab",
5211
5299
  "--yes",
5212
5300
  "--json"
5301
+ ],
5302
+ [
5303
+ "panels",
5304
+ "submit",
5305
+ "--panel",
5306
+ "panel-1",
5307
+ "--text",
5308
+ "correction",
5309
+ "--interrupt",
5310
+ "--yes",
5311
+ "--json"
5213
5312
  ]
5214
5313
  ],
5215
5314
  "topLevelHelpIncludes": [
@@ -6216,6 +6315,7 @@ exports.RUNPANE_CONTRACT = {
6216
6315
  "properties": {
6217
6316
  "kind": {
6218
6317
  "enum": [
6318
+ "first-run-dialog",
6219
6319
  "codex-update",
6220
6320
  "agent-prompt",
6221
6321
  "submission_unverified",
@@ -6294,6 +6394,7 @@ exports.RUNPANE_CONTRACT = {
6294
6394
  "properties": {
6295
6395
  "kind": {
6296
6396
  "enum": [
6397
+ "first-run-dialog",
6297
6398
  "codex-update",
6298
6399
  "agent-prompt",
6299
6400
  "submission_unverified",
@@ -8148,6 +8249,9 @@ exports.RUNPANE_CONTRACT = {
8148
8249
  "user",
8149
8250
  "agent"
8150
8251
  ]
8252
+ },
8253
+ "interrupt": {
8254
+ "type": "boolean"
8151
8255
  }
8152
8256
  },
8153
8257
  "additionalProperties": false
@@ -8216,6 +8320,10 @@ exports.RUNPANE_CONTRACT = {
8216
8320
  "screen",
8217
8321
  "argv"
8218
8322
  ]
8323
+ },
8324
+ "message": {
8325
+ "type": "string",
8326
+ "description": "Human explanation of delivery; queued means the agent has not read the message yet."
8219
8327
  }
8220
8328
  },
8221
8329
  "additionalProperties": false
@@ -8349,6 +8457,7 @@ exports.RUNPANE_CONTRACT = {
8349
8457
  "properties": {
8350
8458
  "kind": {
8351
8459
  "enum": [
8460
+ "first-run-dialog",
8352
8461
  "codex-update",
8353
8462
  "agent-prompt",
8354
8463
  "submission_unverified",
@@ -8713,6 +8822,7 @@ exports.RUNPANE_CONTRACT = {
8713
8822
  "properties": {
8714
8823
  "kind": {
8715
8824
  "enum": [
8825
+ "first-run-dialog",
8716
8826
  "codex-update",
8717
8827
  "agent-prompt",
8718
8828
  "submission_unverified",
@@ -8916,6 +9026,7 @@ exports.RUNPANE_CONTRACT = {
8916
9026
  "properties": {
8917
9027
  "kind": {
8918
9028
  "enum": [
9029
+ "first-run-dialog",
8919
9030
  "codex-update",
8920
9031
  "agent-prompt",
8921
9032
  "submission_unverified",
@@ -11393,6 +11504,11 @@ exports.RUNPANE_CONTRACT = {
11393
11504
  "required": false,
11394
11505
  "description": "Write the prompt or text to a private file under the Pane directory and send the one line `Read and follow <path>` instead."
11395
11506
  },
11507
+ {
11508
+ "name": "--interrupt",
11509
+ "required": false,
11510
+ "description": "Interrupt the current turn and wait up to 30 seconds for an empty idle composer before delivering. Escape for Codex/Claude; Ctrl+C for Cursor."
11511
+ },
11396
11512
  {
11397
11513
  "name": "--yes",
11398
11514
  "required": false,
@@ -11413,7 +11529,8 @@ exports.RUNPANE_CONTRACT = {
11413
11529
  "examples": [
11414
11530
  "runpane panels submit --panel <panel-id> --text \"2\" --yes --json",
11415
11531
  "printf \"echo hello\" | runpane panels submit --panel <panel-id> --input-file - --yes --json",
11416
- "runpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --json"
11532
+ "runpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --json",
11533
+ "runpane panels submit --panel <panel-id> --text \"Stop that approach and follow this correction\" --interrupt --yes --json"
11417
11534
  ],
11418
11535
  "jsonSchemas": [
11419
11536
  "panelSubmitRequest",
@@ -11425,7 +11542,8 @@ exports.RUNPANE_CONTRACT = {
11425
11542
  "Use `panels input` for Ctrl-C, escape sequences, or any workflow requiring exact bytes.",
11426
11543
  "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`.",
11427
11544
  "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.",
11428
- "`--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."
11545
+ "`--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.",
11546
+ "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."
11429
11547
  ]
11430
11548
  },
11431
11549
  "panels wait": {
@@ -11643,7 +11761,7 @@ exports.RUNPANE_CONTRACT = {
11643
11761
  "panels open": {
11644
11762
  "name": "panels open",
11645
11763
  "summary": "Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default.",
11646
- "details": "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: .html/.htm files render in a browser tab, other files open in an editor tab. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
11764
+ "details": "Opens a tab inside a Pane (default: the Pane of the calling panel, from PANE_SESSION_ID). Use it to show the user an HTML page, plan, report, local dev server, or file beside the conversation. --url opens a browser tab (http, https, or file). --file opens a file inside the Pane worktree: files open in an editor tab with read-only previews for supported formats, including HTML source. Tabs open in split view beside the agent by default; --tab keeps them in the current group. An existing tab showing the same URL or file is reused. Never raises or focuses the Pane window.",
11647
11765
  "requiresPaneDaemon": true,
11648
11766
  "mutates": true,
11649
11767
  "arguments": [
@@ -11663,7 +11781,7 @@ exports.RUNPANE_CONTRACT = {
11663
11781
  "name": "--file",
11664
11782
  "value": "<path>",
11665
11783
  "required": false,
11666
- "description": "File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. .html/.htm renders in a browser tab; other files open in an editor tab."
11784
+ "description": "File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. Files open in an editor tab; supported formats have read-only previews, including HTML source."
11667
11785
  },
11668
11786
  {
11669
11787
  "name": "--title",
@@ -11719,7 +11837,7 @@ exports.RUNPANE_CONTRACT = {
11719
11837
  ],
11720
11838
  "notes": [
11721
11839
  "Prefer this over opening the system browser when showing the user a page, plan, report, or dev server.",
11722
- "Write plans and reports as self-contained HTML files, then open them with --file; rerunning the command on the same file reuses its tab.",
11840
+ "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 inspect its read-only source; reopening the same target reuses its tab.",
11723
11841
  "Opening a tab does not steal window focus; use `panes focus` only on explicit user request."
11724
11842
  ]
11725
11843
  },
@@ -13121,8 +13239,8 @@ exports.RUNPANE_CONTRACT = {
13121
13239
  },
13122
13240
  "sessions create": {
13123
13241
  "name": "sessions create",
13124
- "summary": "Create a durable named orchestration Session and its hidden terminal owner.",
13125
- "details": "Create a durable named orchestration Session and its hidden terminal owner.",
13242
+ "summary": "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false).",
13243
+ "details": "Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false).",
13126
13244
  "requiresPaneDaemon": true,
13127
13245
  "mutates": true,
13128
13246
  "arguments": [
@@ -13140,7 +13258,9 @@ exports.RUNPANE_CONTRACT = {
13140
13258
  "sessionResult"
13141
13259
  ],
13142
13260
  "notes": [
13143
- "Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch."
13261
+ "Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.",
13262
+ "JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted.",
13263
+ "Create-time isPinned requires an updated Pane app. Older apps may ignore the field; use sessions pin after creation and read back the result."
13144
13264
  ]
13145
13265
  },
13146
13266
  "sessions get": {
@@ -13167,8 +13287,8 @@ exports.RUNPANE_CONTRACT = {
13167
13287
  },
13168
13288
  "sessions update": {
13169
13289
  "name": "sessions update",
13170
- "summary": "Update a Session overview from structured JSON.",
13171
- "details": "Update a Session overview from structured JSON.",
13290
+ "summary": "Update a Session overview from structured JSON; isPinned sets the UI pin star.",
13291
+ "details": "Update a Session overview from structured JSON; isPinned sets the UI pin star.",
13172
13292
  "requiresPaneDaemon": true,
13173
13293
  "mutates": true,
13174
13294
  "arguments": [
@@ -13186,7 +13306,8 @@ exports.RUNPANE_CONTRACT = {
13186
13306
  "sessionResult"
13187
13307
  ],
13188
13308
  "notes": [
13189
- "Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch."
13309
+ "Structured input accepts launchCommand (full command including arguments; empty uses the selected agent default) and profile (Session behavior instructions). Creating/opening a Session submits no automatic prompt. Changes apply on next terminal launch.",
13310
+ "JSON isPinned: true/false sets the UI pin star. Creation defaults to false; update preserves the pin when omitted."
13190
13311
  ]
13191
13312
  },
13192
13313
  "sessions set-agent": {
@@ -13694,6 +13815,76 @@ exports.RUNPANE_CONTRACT = {
13694
13815
  "Model and effort become agent flags: claude --model/--effort, codex -m and -c model_reasoning_effort, cursor-agent --model. Cursor effort is not supported and is rejected before side effects.",
13695
13816
  "Run it from the checkout being handed off. The receiver works in a new Pane on the destination and pushes back to your branch, so stop changing that branch yourself."
13696
13817
  ]
13818
+ },
13819
+ "sessions unpin": {
13820
+ "name": "sessions unpin",
13821
+ "summary": "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state.",
13822
+ "details": "Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state.",
13823
+ "requiresPaneDaemon": true,
13824
+ "mutates": true,
13825
+ "arguments": [
13826
+ {
13827
+ "name": "--session",
13828
+ "value": "<id|name>",
13829
+ "required": true,
13830
+ "description": "Named Session id or exact name."
13831
+ },
13832
+ {
13833
+ "name": "--json",
13834
+ "required": false,
13835
+ "description": "Print JSON output."
13836
+ },
13837
+ {
13838
+ "name": "--pane-dir",
13839
+ "value": "<path>",
13840
+ "required": false,
13841
+ "description": "Connect to a specific Pane data directory."
13842
+ }
13843
+ ],
13844
+ "examples": [
13845
+ "runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]"
13846
+ ],
13847
+ "jsonSchemas": [
13848
+ "sessionResult"
13849
+ ],
13850
+ "notes": [
13851
+ "Uses the same Session update path as the UI. The requested pin state is idempotent."
13852
+ ]
13853
+ },
13854
+ "sessions pin": {
13855
+ "name": "sessions pin",
13856
+ "summary": "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state.",
13857
+ "details": "Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state.",
13858
+ "requiresPaneDaemon": true,
13859
+ "mutates": true,
13860
+ "arguments": [
13861
+ {
13862
+ "name": "--session",
13863
+ "value": "<id|name>",
13864
+ "required": true,
13865
+ "description": "Named Session id or exact name."
13866
+ },
13867
+ {
13868
+ "name": "--json",
13869
+ "required": false,
13870
+ "description": "Print JSON output."
13871
+ },
13872
+ {
13873
+ "name": "--pane-dir",
13874
+ "value": "<path>",
13875
+ "required": false,
13876
+ "description": "Connect to a specific Pane data directory."
13877
+ }
13878
+ ],
13879
+ "examples": [
13880
+ "runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]"
13881
+ ],
13882
+ "jsonSchemas": [
13883
+ "sessionResult"
13884
+ ],
13885
+ "notes": [
13886
+ "Uses the same Session update path as the UI. The requested pin state is idempotent."
13887
+ ]
13697
13888
  }
13698
13889
  },
13699
13890
  "managedBlock": [