runpane 2.4.103 → 2.4.105
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 +43 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +37 -10
- package/dist/commands.js.map +1 -1
- package/dist/doctor.d.ts +7 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +14 -0
- package/dist/doctor.js.map +1 -1
- package/dist/generated/contract.d.ts +126 -16
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +192 -13
- package/dist/generated/contract.js.map +1 -1
- package/dist/localControl.d.ts +1 -1
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +9 -1
- package/dist/localControl.js.map +1 -1
- package/package.json +1 -1
|
@@ -26,6 +26,10 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
26
26
|
readonly format: "lines";
|
|
27
27
|
readonly heartbeatSeconds: 60;
|
|
28
28
|
readonly idleAfterMs: 600000;
|
|
29
|
+
readonly settleMs: 0;
|
|
30
|
+
readonly blockedSettleMs: 0;
|
|
31
|
+
readonly minIntervalMs: 0;
|
|
32
|
+
readonly idleBackoff: false;
|
|
29
33
|
readonly agentsOnly: true;
|
|
30
34
|
readonly includeHeldInputPresence: true;
|
|
31
35
|
};
|
|
@@ -128,7 +132,7 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
128
132
|
}, {
|
|
129
133
|
readonly name: "watch";
|
|
130
134
|
readonly summary: "Wait for workspace agent and Pane transitions using a daemon-held cursor.";
|
|
131
|
-
readonly usage: readonly ["runpane watch [--as <name>|--since <generation>] [--follow] [--format <lines|json>] [--heartbeat <seconds>] [--idle-after <ms>] [--all-managed|--pane <id>] [--include-shells] [--self-test] [--kinds <kind,...>] [--repo <selector>] [--name-contains <text>] [--timeout-ms <ms>] [--from <now|earliest>] [--json]"];
|
|
135
|
+
readonly usage: readonly ["runpane watch [--as <name>|--since <generation>] [--follow] [--format <lines|json>] [--heartbeat <seconds>] [--idle-after <ms>] [--settle <ms>] [--blocked-settle <ms>] [--min-interval <ms>] [--idle-backoff] [--all-managed|--pane <id>] [--include-shells] [--self-test] [--kinds <kind,...>] [--repo <selector>] [--name-contains <text>] [--timeout-ms <ms>] [--from <now|earliest>] [--json]"];
|
|
132
136
|
readonly jsonSchemas: readonly ["workspaceWaitRequest", "workspaceWaitResult"];
|
|
133
137
|
}, {
|
|
134
138
|
readonly name: "panes create";
|
|
@@ -420,6 +424,18 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
420
424
|
readonly name: "--idle-after";
|
|
421
425
|
readonly value: "<milliseconds>";
|
|
422
426
|
readonly description: "Emit agent.idle after this READY duration; 0 disables idle events.";
|
|
427
|
+
}, {
|
|
428
|
+
readonly name: "--settle";
|
|
429
|
+
readonly value: "<milliseconds>";
|
|
430
|
+
readonly description: "Follow-only opt-in: emit READY only after the panel stays idle this long; a BUSY inside the window cancels it silently.";
|
|
431
|
+
}, {
|
|
432
|
+
readonly name: "--blocked-settle";
|
|
433
|
+
readonly value: "<milliseconds>";
|
|
434
|
+
readonly description: "Follow-only opt-in: emit BLOCKED only after the panel stays blocked this long; an in-pane answer inside the window cancels it silently.";
|
|
435
|
+
}, {
|
|
436
|
+
readonly name: "--min-interval";
|
|
437
|
+
readonly value: "<milliseconds>";
|
|
438
|
+
readonly description: "Follow-only opt-in: hold non-urgent lines and flush them together at most once per interval; BLOCKED bypasses it.";
|
|
423
439
|
}, {
|
|
424
440
|
readonly name: "--body-file";
|
|
425
441
|
readonly value: "<path|->";
|
|
@@ -473,6 +489,9 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
473
489
|
}, {
|
|
474
490
|
readonly name: "--self-test";
|
|
475
491
|
readonly description: "Probe the current daemon watch path without advancing a named cursor.";
|
|
492
|
+
}, {
|
|
493
|
+
readonly name: "--idle-backoff";
|
|
494
|
+
readonly description: "Follow-only opt-in: IDLE fires at --idle-after, then 30m, 1h, 3h, then daily per panel; any activity resets it.";
|
|
476
495
|
}, {
|
|
477
496
|
readonly name: "--report";
|
|
478
497
|
readonly description: "Prepare a redacted doctor report; external filing still requires --yes.";
|
|
@@ -494,7 +513,7 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
494
513
|
readonly "panes cost": readonly ["Usage:", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", "", "Reports estimated token costs per Pane for the last 30 days, including per-model and cache-efficiency details.", "", "Options:", " --repo <selector> Limit results to one saved repository", " --pane <pane-id> Return one Pane, including an idle Pane with zero usage", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output"];
|
|
495
514
|
readonly workspace: readonly ["Workspace observation commands.", "", "Usage:", " runpane workspace state [--repo <selector>] [--json]", " runpane watch --follow"];
|
|
496
515
|
readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."];
|
|
497
|
-
readonly watch: readonly ["Usage:", " runpane watch [--as <name>|--since <generation>] [--follow] [options]", "", "Waits for agent state, Pane lifecycle, and panel exit transitions without polling.", "", "Options:", " --as <name> Use a persisted daemon-held cursor", " --since <generation> Use an explicit cursor instead", " --from <now|earliest> Starting point for a new named cursor", " --follow Continue waiting until interrupted", " --format <lines|json> Output format; lines is the follow default", " --heartbeat <seconds> Healthy-silence bound; defaults to 60 under --follow", " --idle-after <ms> Re-firing READY idle interval; defaults to 600000 under --follow", " --all-managed Explicitly watch all managed panes", " --include-shells Include ordinary shell panels", " --agents-only Limit to CLI agent panels", " --exclude-pane <id> Exclude a Pane; repeatable", " --self-test Anonymous, read-only daemon path probe", " --kinds <kind,...> Limit event kinds", " --pane <id> Limit to a Pane; repeatable", " --repo <selector> Limit to a saved repository", " --name-contains <text> Limit by Pane name substring", " --timeout-ms <ms> Wait timeout; 0 polls once", " --limit <count> Maximum entries per response", " --ack-now Use at-most-once named-cursor delivery", " --include-held-input Include unsubmitted composer text in JSON", " --no-held-input Disable redacted STUCK detection", " --json Alias for --format json"];
|
|
516
|
+
readonly watch: readonly ["Usage:", " runpane watch [--as <name>|--since <generation>] [--follow] [options]", "", "Waits for agent state, Pane lifecycle, and panel exit transitions without polling.", "", "Options:", " --as <name> Use a persisted daemon-held cursor", " --since <generation> Use an explicit cursor instead", " --from <now|earliest> Starting point for a new named cursor", " --follow Continue waiting until interrupted", " --format <lines|json> Output format; lines is the follow default", " --heartbeat <seconds> Healthy-silence bound; defaults to 60 under --follow", " --idle-after <ms> Re-firing READY idle interval; defaults to 600000 under --follow", " --settle <ms> Opt-in: emit READY only after this quiet window (--follow only)", " --blocked-settle <ms> Opt-in: emit BLOCKED only after this window (--follow only)", " --min-interval <ms> Opt-in: batch non-urgent lines per interval; BLOCKED bypasses (--follow only)", " --idle-backoff Opt-in: IDLE at --idle-after, 30m, 1h, 3h, then daily (--follow only)", " --all-managed Explicitly watch all managed panes", " --include-shells Include ordinary shell panels", " --agents-only Limit to CLI agent panels", " --exclude-pane <id> Exclude a Pane; repeatable", " --self-test Anonymous, read-only daemon path probe", " --kinds <kind,...> Limit event kinds", " --pane <id> Limit to a Pane; repeatable", " --repo <selector> Limit to a saved repository", " --name-contains <text> Limit by Pane name substring", " --timeout-ms <ms> Wait timeout; 0 polls once", " --limit <count> Maximum entries per response", " --ack-now Use at-most-once named-cursor delivery", " --include-held-input Include unsubmitted composer text in JSON", " --no-held-input Disable redacted STUCK detection", " --json Alias for --format json", "", "Defaults are responsive: no settle, no batching, all kinds, IDLE every --idle-after. BUSY carries no action; drop it with --kinds.", "Expensive consumers opt in: --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff", "Pane Chat arms those flags itself through its skill; pass them only for your own scripts.", "STUCK means real unsubmitted composer text; an agent prompt suggestion never counts.", "Dead watch: HEARTBEAT is proof of life only. Judge death by a non-zero exit or a WATCH ERROR line, not by silence."];
|
|
498
517
|
readonly "panes create": readonly ["Usage:", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes create --from-json <path|-> [--yes] [--json]", "", "Creates user-visible Panes (Pane sessions) for feature/PR work in a saved repository and opens a terminal-backed tool tab. Pane creates and owns the worktree/branch for each new Pane.", "", "Options:", " --repo <selector> active, id, exact path, or saved repository name", " --name <name> Pane/session name", " --worktree-name <name> Worktree name; defaults to --name", " --base-branch <branch> Base branch for the worktree", " --agent <codex|claude|cursor> Built-in terminal template", " --tool-command <command> Custom terminal command", " --title <title> Terminal tab title", " --initial-input <text> Text sent after the command is ready", " --prompt <text> Alias for --initial-input", " --initial-input-file <path|-> Read initial input from a file or stdin", " --from-json <path|-> Read a full request payload", " --timeout-ms <milliseconds> Pane creation timeout", " --wait-ready Wait for terminal readiness before returning", " --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000", " --concurrency <count> Accepted; creation is currently serialized", " --source <user|agent> Mark mutation source; agent implies background creation", " --no-focus Create in the background without stealing focus", " --focus Explicitly focus the created pane", " --pinned Accepted for compatibility; creation already pins by default", " --no-pinned Create unpinned instead of the default pinned (the UI's favorite/pin star)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without creating panes", " --yes Skip confirmation for mutating commands"];
|
|
499
518
|
readonly "panes adopt": readonly ["Usage:", " runpane panes adopt --repo <selector> --path <dir> --name <name> --agent <codex|claude|cursor> [options]", "", "Adopts an existing externally managed git worktree without creating, syncing, or deleting it.", "", "Options: --resume <id> stages the agent resume command; --launch runs it immediately; --folder <name> groups the pane; --no-pinned opts out of pinning; --dry-run previews."];
|
|
500
519
|
readonly "panes archive": readonly ["Usage:", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--dry-run] --yes [--json]", "", "Archives a Pane (session) exactly like the UI Archive action, including removal of its Pane-managed git worktree. Refreshes the configured upstream before checking for unpushed commits and reports exact commit evidence. Refuses unsafe archives unless --force is passed. Use --dry-run to print the evidence without mutating Pane state.", "", "Options:", " --pane <pane-id> Pane/session id to archive", " --source <user|agent> Mark mutation source", " --force Archive even if the pane has uncommitted, untracked, or unpushed changes", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Refresh and print archive safety evidence without archiving", " --yes Skip confirmation for mutating commands"];
|
|
@@ -528,7 +547,7 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
528
547
|
readonly "panes cost": readonly ["Usage:", " runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json]", "", "Reports estimated token costs per Pane for the last 30 days, including per-model and cache-efficiency details.", "", "Options:", " --repo <selector>", " --pane <pane-id>", " --pane-dir <path>", " --json"];
|
|
529
548
|
readonly workspace: readonly ["Workspace observation commands.", "", "Usage:", " runpane workspace state [--repo <selector>] [--json]", " runpane watch --follow"];
|
|
530
549
|
readonly "workspace state": readonly ["Usage:", " runpane workspace state [--repo <selector>] [--json]", "", "Returns one workspace snapshot of every Pane and CLI panel."];
|
|
531
|
-
readonly watch: readonly ["Usage:", " runpane watch [--as <name>|--since <generation>] [--follow] [options]", "", "Waits for workspace transitions without polling.", "", "Options:", " --as <name>", " --since <generation>", " --from <now|earliest>", " --follow", " --format <lines|json>", " --heartbeat <seconds>", " --idle-after <ms>", " --all-managed", " --include-shells", " --agents-only", " --exclude-pane <id> Repeatable", " --self-test", " --kinds <kind,...>", " --pane <id> Repeatable", " --repo <selector>", " --name-contains <text>", " --timeout-ms <ms> 0 polls once", " --limit <count>", " --ack-now", " --include-held-input", " --no-held-input", " --json Alias for --format json"];
|
|
550
|
+
readonly watch: readonly ["Usage:", " runpane watch [--as <name>|--since <generation>] [--follow] [options]", "", "Waits for workspace transitions without polling.", "", "Options:", " --as <name>", " --since <generation>", " --from <now|earliest>", " --follow", " --format <lines|json>", " --heartbeat <seconds>", " --idle-after <ms>", " --settle <ms> Opt-in READY quiet window (--follow only)", " --blocked-settle <ms> Opt-in BLOCKED window (--follow only)", " --min-interval <ms> Opt-in batching; BLOCKED bypasses (--follow only)", " --idle-backoff Opt-in IDLE backoff (--follow only)", " --all-managed", " --include-shells", " --agents-only", " --exclude-pane <id> Repeatable", " --self-test", " --kinds <kind,...>", " --pane <id> Repeatable", " --repo <selector>", " --name-contains <text>", " --timeout-ms <ms> 0 polls once", " --limit <count>", " --ack-now", " --include-held-input", " --no-held-input", " --json Alias for --format json", "", "Defaults are responsive: no settle, no batching, all kinds, IDLE every --idle-after. BUSY carries no action; drop it with --kinds.", "Expensive consumers opt in: --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff", "Pane Chat arms those flags itself through its skill; pass them only for your own scripts.", "STUCK means real unsubmitted composer text; an agent prompt suggestion never counts.", "Dead watch: HEARTBEAT is proof of life only. Judge death by a non-zero exit or a WATCH ERROR line, not by silence."];
|
|
532
551
|
readonly "panes create": readonly ["Usage:", " runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [options]", " runpane panes create --from-json <path|-> [--yes] [--json]", "", "Creates user-visible Panes (Pane sessions) for feature/PR work in a saved repository and opens a terminal-backed tool tab. Pane creates and owns the worktree/branch for each new Pane.", "", "Options:", " --repo <selector> active, id, exact path, or saved repository name", " --name <name> Pane/session name", " --worktree-name <name> Worktree name; defaults to --name", " --base-branch <branch> Base branch for the worktree", " --agent <codex|claude|cursor> Built-in terminal template", " --tool-command <command> Custom terminal command", " --title <title> Terminal tab title", " --initial-input <text> Text sent after the command is ready", " --prompt <text> Alias for --initial-input", " --initial-input-file <path|-> Read initial input from a file or stdin", " --from-json <path|-> Read a full request payload", " --timeout-ms <milliseconds> Pane creation timeout", " --wait-ready Wait for terminal readiness before returning", " --ready-timeout-ms <ms> Readiness wait timeout; defaults to 30000", " --concurrency <count> Accepted; creation is currently serialized", " --source <user|agent> Mark mutation source; agent implies background creation", " --no-focus Create in the background without stealing focus", " --focus Explicitly focus the created pane", " --pinned Accepted for compatibility; creation already pins by default", " --no-pinned Create unpinned instead of the default pinned (the UI's favorite/pin star)", " --pane-dir <path> Connect to a specific Pane data directory", " --json Print machine-readable output", " --dry-run Validate and preview without creating panes", " --yes Skip confirmation for mutating commands"];
|
|
533
552
|
readonly "panes adopt": readonly ["Usage:", " runpane panes adopt --repo <selector> --path <dir> --name <name> --agent <codex|claude|cursor> [options]", "", "Adopts an existing externally managed git worktree without creating, syncing, or deleting it.", "", "Options: --resume <id> stages the agent resume command; --launch runs it immediately; --folder <name> groups the pane; --no-pinned opts out of pinning; --dry-run previews."];
|
|
534
553
|
readonly "panes archive": readonly ["Usage:", " runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--dry-run] --yes [--json]", "", "Archives a Pane (session) exactly like the UI Archive action, including removal of its Pane-managed git worktree. Refreshes the configured upstream before checking for unpushed commits and reports exact commit evidence. Refuses unsafe archives unless --force is passed. Use --dry-run to print the evidence without mutating Pane state.", "", "Options:", " --pane <pane-id>", " --source <user|agent>", " --force", " --pane-dir <path>", " --json", " --dry-run", " --yes"];
|
|
@@ -554,8 +573,8 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
554
573
|
readonly npmCommands: readonly ["npx --yes runpane@latest", "npx --yes runpane@latest setup", "npx --yes runpane@latest install client", "npx --yes runpane@latest install daemon --label \"My Server\"", "pnpm dlx runpane@latest", "pnpm dlx runpane@latest install daemon --label \"My Server\"", "npm i -g runpane && runpane", "npm i -g runpane && runpane setup", "npm i -g runpane && runpane install daemon --label \"My Server\"", "pnpm add -g runpane && runpane", "pnpm add -g runpane && runpane setup", "pnpm add -g runpane && runpane install daemon --label \"My Server\"", "yarn dlx runpane@latest install daemon --label \"My Server\"", "bunx runpane@latest install daemon --label \"My Server\""];
|
|
555
574
|
readonly pythonCommands: readonly ["pipx run runpane", "pipx run runpane setup", "python -m pip install runpane", "runpane", "runpane setup", "python -m runpane setup", "runpane install daemon --label \"My Server\"", "pipx install runpane", "runpane", "runpane setup", "pipx run runpane install daemon --label \"My Server\"", "uvx runpane@latest", "uvx runpane@latest setup", "uvx runpane@latest install daemon --label \"My Server\"", "python -m runpane install daemon --label \"My Server\""];
|
|
556
575
|
readonly packageManagerNotes: readonly ["Use `pnpm dlx` for one-shot pnpm execution and `pnpm add -g` for persistent CLI installation.", "Do not document `pnpm install runpane` as the public CLI install path."];
|
|
557
|
-
readonly commandUsages: readonly ["runpane", "runpane setup", "runpane install", "runpane install client", "runpane install daemon", "runpane update", "runpane version", "runpane doctor", "runpane doctor --json", "runpane daemon repair --pane-dir ~/.pane_remote --yes --json", "runpane agent-context", "runpane agent-context --command \"panes create\" --json", "runpane repos list --json", "runpane repos add --path /path/to/repo --name Pane --yes --json", "runpane panes list --repo active --json", "runpane panes cost --pane <pane-id> --json", "runpane panes create --repo active --name issue-252 --agent <agent> --prompt \"Kick off the discussion skill for issue 252\" --source agent --no-focus --wait-ready --yes --json", "runpane panes create --from-json panes.json --yes --json", "runpane panes archive --pane <pane-id> --source agent --yes --json", "runpane panes rename --pane <pane-id> --name issue-393 --yes --json", "runpane panels list --pane <pane-id> --json", "runpane panels output --panel <panel-id> --limit 200 --json", "printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes --json", "runpane help", "runpane <command> --help"];
|
|
558
|
-
readonly commandDescriptions: readonly ["`runpane` with no arguments and `runpane setup` open an interactive wizard when stdin and stdout are TTYs. 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.", "`runpane install` is an alias for `runpane install client`.", "`runpane install client` downloads the selected Pane desktop artifact and installs, opens, or launches it for the current platform.", "`runpane install daemon` downloads or installs Pane, resolves a stable Pane executable path, and spawns `<pane executable> --remote-setup <forwarded remote setup args>`.", "The wrapper must stream Pane stdout/stderr without reformatting because `pane --remote-setup` prints the one-time `pane-remote://...` connection code.", "`runpane update` uses the same release resolution and installer path as `install client`.", "`runpane version` prints only wrapper package metadata and does not contact, launch, or focus the Pane app or daemon.", "`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`.", "`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.", "`runpane agent-context` prints a brief, token-efficient command schema for coding agents without connecting to the Pane daemon.", "`runpane agent-context --command \"panes create\"` prints the detailed definition for one command. Add `--json` for machine-readable output.", "`runpane repos list` connects to the running local Pane daemon and prints saved repository records.", "`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.", "`runpane panes list` lists Pane sessions, optionally scoped to one saved repository.", "`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.", "`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; pass `--no-pinned` to opt out. Panes created interactively in the Pane UI are unaffected.", "For `panes create --wait-ready`, `initialInput.verifiedSubmitted: true` is reported only after argument attachment or composer-clear plus activity evidence. Routing input does not by itself verify submission.", "`runpane panes archive` refreshes the configured upstream, reports exact unpushed commit evidence, and refuses unsafe archive operations unless `--force` is used. Add `--dry-run` to inspect the same evidence without archiving. Successful archives wait for worktree removal and report `worktreeCleanup`.", "`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.", "`runpane panels list` lists tool panels inside one Pane session.", "`runpane panels output` reads bounded recent terminal output from one panel and strips common terminal control noise for agent use.", "`runpane panels input` sends exact input bytes to one terminal panel. Prefer `--input-file` for newlines, Ctrl-C, quotes, or shell-sensitive text.", "`runpane panes create --prompt` is an alias for `--initial-input`; request JSON and daemon payloads should use the canonical `initialInput` field.", "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.", "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'`."];
|
|
576
|
+
readonly commandUsages: readonly ["runpane", "runpane setup", "runpane install", "runpane install client", "runpane install daemon", "runpane update", "runpane version", "runpane doctor", "runpane doctor --json", "runpane daemon repair --pane-dir ~/.pane_remote --yes --json", "runpane agent-context", "runpane agent-context --command \"panes create\" --json", "runpane repos list --json", "runpane repos add --path /path/to/repo --name Pane --yes --json", "runpane panes list --repo active --json", "runpane panes cost --pane <pane-id> --json", "runpane panes create --repo active --name issue-252 --agent <agent> --prompt \"Kick off the discussion skill for issue 252\" --source agent --no-focus --wait-ready --yes --json", "runpane panes create --from-json panes.json --yes --json", "runpane panes archive --pane <pane-id> --source agent --yes --json", "runpane panes rename --pane <pane-id> --name issue-393 --yes --json", "runpane panels list --pane <pane-id> --json", "runpane panels output --panel <panel-id> --limit 200 --json", "printf 'Continue\\n' | runpane panels input --panel <panel-id> --input-file - --yes --json", "runpane watch --self-test", "runpane watch --follow", "runpane watch --follow --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff", "runpane help", "runpane <command> --help"];
|
|
577
|
+
readonly commandDescriptions: readonly ["`runpane` with no arguments and `runpane setup` open an interactive wizard when stdin and stdout are TTYs. 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.", "`runpane install` is an alias for `runpane install client`.", "`runpane install client` downloads the selected Pane desktop artifact and installs, opens, or launches it for the current platform.", "`runpane install daemon` downloads or installs Pane, resolves a stable Pane executable path, and spawns `<pane executable> --remote-setup <forwarded remote setup args>`.", "The wrapper must stream Pane stdout/stderr without reformatting because `pane --remote-setup` prints the one-time `pane-remote://...` connection code.", "`runpane update` uses the same release resolution and installer path as `install client`.", "`runpane version` prints only wrapper package metadata and does not contact, launch, or focus the Pane app or daemon.", "`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`.", "`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.", "`runpane agent-context` prints a brief, token-efficient command schema for coding agents without connecting to the Pane daemon.", "`runpane agent-context --command \"panes create\"` prints the detailed definition for one command. Add `--json` for machine-readable output.", "`runpane repos list` connects to the running local Pane daemon and prints saved repository records.", "`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.", "`runpane panes list` lists Pane sessions, optionally scoped to one saved repository.", "`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.", "`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; pass `--no-pinned` to opt out. Panes created interactively in the Pane UI are unaffected.", "For `panes create --wait-ready`, `initialInput.verifiedSubmitted: true` is reported only after argument attachment or composer-clear plus activity evidence. Routing input does not by itself verify submission.", "`runpane panes archive` refreshes the configured upstream, reports exact unpushed commit evidence, and refuses unsafe archive operations unless `--force` is used. Add `--dry-run` to inspect the same evidence without archiving. Successful archives wait for worktree removal and report `worktreeCleanup`.", "`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.", "`runpane panels list` lists tool panels inside one Pane session.", "`runpane panels output` reads bounded recent terminal output from one panel and strips common terminal control noise for agent use.", "`runpane panels input` sends exact input bytes to one terminal panel. Prefer `--input-file` for newlines, Ctrl-C, quotes, or shell-sensitive text.", "`runpane panes create --prompt` is an alias for `--initial-input`; request JSON and daemon payloads should use the canonical `initialInput` field.", "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.", "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'`.", "`runpane watch` waits for workspace transitions from the daemon journal without polling. `--follow` keeps waiting and prints one line per event: READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT, plus HEARTBEAT every 60 seconds as proof of life. Defaults are responsive: no settle, no batching, all kinds, IDLE every `--idle-after`. Expensive consumers opt into `--kinds` (drop `agent.busy`; BUSY carries no action), `--settle <ms>` (READY only after a quiet window; a BUSY inside it cancels the line), `--blocked-settle <ms>`, `--min-interval <ms>` (batch non-urgent lines; BLOCKED bypasses it), and `--idle-backoff` (10m, 30m, 1h, 3h, then daily). The recommended orchestrator invocation is `runpane watch --follow --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff`, which budgets about 6 wake-ups per active pane per hour worst case, usually 1-3. Pane Chat arms it automatically through its skill; only your own scripts need the flags. STUCK means real unsubmitted composer text, never an agent prompt suggestion. Judge a dead watch by a non-zero exit or a WATCH ERROR line, not by silence."];
|
|
559
578
|
readonly 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.";
|
|
560
579
|
readonly 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. In a Pane repository checkout, if `runpane` is not on PATH, use the built local wrapper with Node 22, for example `PATH=/opt/homebrew/opt/node@22/bin:$PATH 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.";
|
|
561
580
|
readonly daemonFlagNote: "Unknown daemon flags should be forwarded rather than dropped so newer Pane versions can extend `--remote-setup` without requiring an immediate wrapper release. Unknown flags for non-daemon commands should fail clearly.";
|
|
@@ -563,7 +582,7 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
563
582
|
readonly publishingCredentials: readonly ["Local implementation, build, and dry-run validation do not need npm or PyPI API tokens.", "Release publishing should prefer npm Trusted Publishing and PyPI Trusted Publishing from GitHub Actions.", "Fallback `NPM_TOKEN` or `PYPI_API_TOKEN` credentials may be used for first package reservation or manual publication only. They must be supplied through local environment variables or GitHub Actions secrets, never committed, and revoked or rotated after use."];
|
|
564
583
|
};
|
|
565
584
|
readonly testFixtures: {
|
|
566
|
-
readonly parserSamples: readonly [readonly ["setup"], readonly ["install"], readonly ["install", "client", "--version", "v2.2.8", "--format", "dmg", "--download-dir", "/tmp/pane-downloads", "--dry-run", "--yes"], readonly ["install", "daemon", "--label", "VM", "--prefer-tunnel", "ssh", "--channel", "nightly", "--base-url", "https://example.test", "--pane-dir", "/tmp/pane", "--listen-port", "4555", "--auto-listen-port", "--print-only", "--repo-ref", "main", "--unknown-future-flag", "future-value", "--dry-run", "--verbose"], readonly ["update", "--version", "latest", "--format", "appimage", "--pane-path", "/usr/bin/pane", "--dry-run"], readonly ["doctor", "--pane-path", "/usr/bin/pane", "--format", "zip", "--verbose"], readonly ["doctor", "--json", "--pane-dir", "/tmp/pane"], readonly ["doctor", "--report", "--title", "watch failed", "--body-file", "/tmp/watch-evidence.txt", "--json"], readonly ["watch", "--as", "monitor", "--from", "earliest", "--follow", "--format", "lines", "--heartbeat", "60", "--idle-after", "600000", "--all-managed", "--agents-only", "--exclude-pane", "pane-old", "--kinds", "agent.ready,agent.idle", "--include-held-input", "--self-test"], readonly ["daemon", "repair", "--pane-dir", "/tmp/pane-remote", "--yes", "--json"], readonly ["agent-context"], readonly ["agent-context", "--command", "panes create", "--json"], readonly ["repos", "list", "--json", "--pane-dir", "/tmp/pane"], readonly ["repos", "add", "--path", "/tmp/repo", "--name", "Repo", "--dry-run", "--yes", "--json", "--pane-dir", "/tmp/pane"], readonly ["panes", "list", "--repo", "active", "--json"], readonly ["panes", "cost", "--pane", "session-1", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--pinned", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--no-pinned", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--from-json", "-", "--yes", "--json"], readonly ["panes", "archive", "--pane", "session-1", "--force", "--source", "agent", "--yes", "--json"], readonly ["panes", "pin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "unpin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "rename", "--pane", "session-1", "--name", "issue-393", "--yes", "--json"], readonly ["panels", "list", "--pane", "session-1", "--json"], readonly ["panels", "output", "--panel", "panel-1", "--limit", "200", "--json"], readonly ["panels", "input", "--panel", "panel-1", "--text", "Continue\\n", "--yes", "--json"], readonly ["--version"], readonly ["agents", "doctor", "--agent", "codex", "--repo", "active", "--json"], readonly ["panes", "create", "--from-json", "-", "--source", "agent", "--focus", "--wait-ready", "--ready-timeout-ms", "45000", "--concurrency", "2", "--yes", "--json"], readonly ["panels", "screen", "--panel", "panel-1", "--limit", "80", "--json"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "2", "--yes", "--json"], readonly ["panels", "wait", "--panel", "panel-1", "--for", "text", "--contains", "ready", "--timeout-ms", "30000", "--interval-ms", "500", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--source", "agent", "--no-focus", "--wait-ready", "--ready-timeout-ms", "15000", "--yes", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--focus", "--yes", "--json"], readonly ["panels", "submit-composer", "--panel", "panel-1", "--strategy", "auto", "--yes", "--json"]];
|
|
585
|
+
readonly parserSamples: readonly [readonly ["setup"], readonly ["install"], readonly ["install", "client", "--version", "v2.2.8", "--format", "dmg", "--download-dir", "/tmp/pane-downloads", "--dry-run", "--yes"], readonly ["install", "daemon", "--label", "VM", "--prefer-tunnel", "ssh", "--channel", "nightly", "--base-url", "https://example.test", "--pane-dir", "/tmp/pane", "--listen-port", "4555", "--auto-listen-port", "--print-only", "--repo-ref", "main", "--unknown-future-flag", "future-value", "--dry-run", "--verbose"], readonly ["update", "--version", "latest", "--format", "appimage", "--pane-path", "/usr/bin/pane", "--dry-run"], readonly ["doctor", "--pane-path", "/usr/bin/pane", "--format", "zip", "--verbose"], readonly ["doctor", "--json", "--pane-dir", "/tmp/pane"], readonly ["doctor", "--report", "--title", "watch failed", "--body-file", "/tmp/watch-evidence.txt", "--json"], readonly ["watch", "--as", "monitor", "--from", "earliest", "--follow", "--format", "lines", "--heartbeat", "60", "--idle-after", "600000", "--settle", "180000", "--blocked-settle", "30000", "--min-interval", "600000", "--idle-backoff", "--all-managed", "--agents-only", "--exclude-pane", "pane-old", "--kinds", "agent.ready,agent.idle", "--include-held-input", "--self-test"], readonly ["daemon", "repair", "--pane-dir", "/tmp/pane-remote", "--yes", "--json"], readonly ["agent-context"], readonly ["agent-context", "--command", "panes create", "--json"], readonly ["repos", "list", "--json", "--pane-dir", "/tmp/pane"], readonly ["repos", "add", "--path", "/tmp/repo", "--name", "Repo", "--dry-run", "--yes", "--json", "--pane-dir", "/tmp/pane"], readonly ["panes", "list", "--repo", "active", "--json"], readonly ["panes", "cost", "--pane", "session-1", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--pinned", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--repo", "active", "--name", "issue-252", "--agent", "codex", "--prompt", "Kick off discussion", "--source", "agent", "--no-pinned", "--dry-run", "--yes", "--json"], readonly ["panes", "create", "--from-json", "-", "--yes", "--json"], readonly ["panes", "archive", "--pane", "session-1", "--force", "--source", "agent", "--yes", "--json"], readonly ["panes", "pin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "unpin", "--pane", "session-1", "--yes", "--json"], readonly ["panes", "rename", "--pane", "session-1", "--name", "issue-393", "--yes", "--json"], readonly ["panels", "list", "--pane", "session-1", "--json"], readonly ["panels", "output", "--panel", "panel-1", "--limit", "200", "--json"], readonly ["panels", "input", "--panel", "panel-1", "--text", "Continue\\n", "--yes", "--json"], readonly ["--version"], readonly ["agents", "doctor", "--agent", "codex", "--repo", "active", "--json"], readonly ["panes", "create", "--from-json", "-", "--source", "agent", "--focus", "--wait-ready", "--ready-timeout-ms", "45000", "--concurrency", "2", "--yes", "--json"], readonly ["panels", "screen", "--panel", "panel-1", "--limit", "80", "--json"], readonly ["panels", "submit", "--panel", "panel-1", "--text", "2", "--yes", "--json"], readonly ["panels", "wait", "--panel", "panel-1", "--for", "text", "--contains", "ready", "--timeout-ms", "30000", "--interval-ms", "500", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--source", "agent", "--no-focus", "--wait-ready", "--ready-timeout-ms", "15000", "--yes", "--json"], readonly ["panels", "create", "--pane", "pane-1", "--agent", "codex", "--focus", "--yes", "--json"], readonly ["panels", "submit-composer", "--panel", "panel-1", "--strategy", "auto", "--yes", "--json"]];
|
|
567
586
|
readonly topLevelHelpIncludes: readonly ["runpane setup", "runpane install", "runpane update", "runpane version", "runpane doctor", "runpane agent-context", "runpane repos list", "runpane repos add", "runpane panes list", "runpane panes create", "runpane panes archive", "runpane panels create", "runpane panels list", "runpane panels output", "runpane panels input", "runpane agents doctor", "runpane panels screen", "runpane panels submit", "runpane panels submit-composer", "runpane panels wait", "runpane doctor --json", "runpane agent-context --json", "Agent discovery:", "Common commands:"];
|
|
568
587
|
readonly npmHelpIncludes: readonly ["pnpm dlx runpane@latest", "npx --yes runpane@latest"];
|
|
569
588
|
readonly pipHelpIncludes: readonly ["pipx run runpane", "python -m pip install runpane && python -m runpane setup"];
|
|
@@ -1806,6 +1825,18 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
1806
1825
|
readonly idleWindowStartMs: {
|
|
1807
1826
|
readonly type: "number";
|
|
1808
1827
|
};
|
|
1828
|
+
readonly settleMs: {
|
|
1829
|
+
readonly type: "number";
|
|
1830
|
+
};
|
|
1831
|
+
readonly blockedSettleMs: {
|
|
1832
|
+
readonly type: "number";
|
|
1833
|
+
};
|
|
1834
|
+
readonly minIntervalMs: {
|
|
1835
|
+
readonly type: "number";
|
|
1836
|
+
};
|
|
1837
|
+
readonly idleBackoff: {
|
|
1838
|
+
readonly type: "boolean";
|
|
1839
|
+
};
|
|
1809
1840
|
};
|
|
1810
1841
|
readonly additionalProperties: false;
|
|
1811
1842
|
};
|
|
@@ -2989,6 +3020,10 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
2989
3020
|
readonly name: "panels wait";
|
|
2990
3021
|
readonly summary: "Wait for terminal initialized, ready, idle, or text state with compact output.";
|
|
2991
3022
|
readonly arguments: readonly ["--panel <panel-id>", "--for <condition>", "--contains <text>", "--timeout-ms <ms>", "--interval-ms <ms>", "--json", "--pane-dir <path>"];
|
|
3023
|
+
}, {
|
|
3024
|
+
readonly name: "watch";
|
|
3025
|
+
readonly summary: "Wait for workspace transitions (READY, BLOCKED, IDLE, STUCK, NEW, GONE, EXIT) from the daemon journal without polling; responsive by default, with opt-in cadence flags for expensive consumers.";
|
|
3026
|
+
readonly arguments: readonly ["--follow", "--self-test", "--kinds <kind,...>", "--settle <ms>", "--blocked-settle <ms>", "--min-interval <ms>", "--idle-backoff", "--json"];
|
|
2992
3027
|
}];
|
|
2993
3028
|
};
|
|
2994
3029
|
readonly commands: {
|
|
@@ -3939,38 +3974,91 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
3939
3974
|
readonly watch: {
|
|
3940
3975
|
readonly name: "watch";
|
|
3941
3976
|
readonly summary: "Wait for workspace transitions using the daemon journal.";
|
|
3942
|
-
readonly details: "`runpane watch --follow` is the
|
|
3977
|
+
readonly details: "`runpane watch --follow` is the responsive monitor: lines, 60-second heartbeats, IDLE every 10 minutes, managed-agent scope, redacted STUCK detection, no settle, no batching, all kinds. Expensive consumers (one wake-up per line) opt into the cadence flags. Pane Chat arms them automatically through its pane-orchestrator skill; only your own scripts need to pass them. Named cursors persist in the Pane data directory.";
|
|
3943
3978
|
readonly requiresPaneDaemon: true;
|
|
3944
3979
|
readonly mutates: false;
|
|
3945
3980
|
readonly arguments: readonly [{
|
|
3946
3981
|
readonly name: "--as";
|
|
3947
3982
|
readonly value: "<consumer-name>";
|
|
3948
3983
|
readonly required: false;
|
|
3949
|
-
readonly description: "Use a persisted named cursor.";
|
|
3984
|
+
readonly description: "Use a persisted named cursor (at-least-once delivery). Default: PANE_PANEL_ID under --follow when set, otherwise anonymous.";
|
|
3950
3985
|
}, {
|
|
3951
3986
|
readonly name: "--since";
|
|
3952
3987
|
readonly value: "<generation>";
|
|
3953
3988
|
readonly required: false;
|
|
3954
|
-
readonly description: "Use an explicit generation cursor.";
|
|
3989
|
+
readonly description: "Use an explicit generation cursor instead of a name. Cannot be combined with --as, or with --settle, --blocked-settle, --min-interval.";
|
|
3990
|
+
}, {
|
|
3991
|
+
readonly name: "--from";
|
|
3992
|
+
readonly required: false;
|
|
3993
|
+
readonly value: "<now|earliest>";
|
|
3994
|
+
readonly description: "Starting point for a new named cursor. Default now (silent baseline); earliest replays the journal.";
|
|
3955
3995
|
}, {
|
|
3956
3996
|
readonly name: "--follow";
|
|
3957
3997
|
readonly required: false;
|
|
3958
|
-
readonly description: "Continue waiting until interrupted.";
|
|
3998
|
+
readonly description: "Continue waiting until interrupted. Required by every cadence flag.";
|
|
3959
3999
|
}, {
|
|
3960
4000
|
readonly name: "--format";
|
|
3961
4001
|
readonly value: "<lines|json>";
|
|
3962
4002
|
readonly required: false;
|
|
3963
|
-
readonly description: "Output format
|
|
4003
|
+
readonly description: "Output format. Default lines in every mode; --json selects json.";
|
|
3964
4004
|
}, {
|
|
3965
4005
|
readonly name: "--heartbeat";
|
|
3966
4006
|
readonly value: "<seconds>";
|
|
3967
4007
|
readonly required: false;
|
|
3968
|
-
readonly description: "Healthy-silence bound;
|
|
4008
|
+
readonly description: "Healthy-silence bound; a HEARTBEAT line proves the watcher is alive. Default 60 under --follow, 0 otherwise. Filter it out of any monitor that wakes an agent.";
|
|
3969
4009
|
}, {
|
|
3970
4010
|
readonly name: "--idle-after";
|
|
3971
4011
|
readonly value: "<milliseconds>";
|
|
3972
4012
|
readonly required: false;
|
|
3973
|
-
readonly description: "
|
|
4013
|
+
readonly description: "IDLE fires after a READY panel has stayed idle this long, then re-fires every multiple. Default 600000 under --follow, 0 otherwise.";
|
|
4014
|
+
}, {
|
|
4015
|
+
readonly name: "--settle";
|
|
4016
|
+
readonly value: "<milliseconds>";
|
|
4017
|
+
readonly required: false;
|
|
4018
|
+
readonly description: "Opt-in (follow only): emit READY only after the panel stays idle this long; a BUSY, BLOCKED, UNKNOWN, EXIT, or GONE inside the window cancels it silently. Default 0. Use when a pane flips idle/working while it waits on subagents; the orchestrator value is 180000.";
|
|
4019
|
+
}, {
|
|
4020
|
+
readonly name: "--blocked-settle";
|
|
4021
|
+
readonly value: "<milliseconds>";
|
|
4022
|
+
readonly required: false;
|
|
4023
|
+
readonly description: "Opt-in (follow only): emit BLOCKED only after this window; an in-pane answer inside it cancels the line. Default 0. The orchestrator value is 30000.";
|
|
4024
|
+
}, {
|
|
4025
|
+
readonly name: "--min-interval";
|
|
4026
|
+
readonly value: "<milliseconds>";
|
|
4027
|
+
readonly required: false;
|
|
4028
|
+
readonly description: "Opt-in (follow only): hold READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines and flush them together at most once per interval; BLOCKED bypasses it and carries the held lines with it. Default 0. The orchestrator value is 600000.";
|
|
4029
|
+
}, {
|
|
4030
|
+
readonly name: "--idle-backoff";
|
|
4031
|
+
readonly required: false;
|
|
4032
|
+
readonly description: "Opt-in (follow only): IDLE fires at --idle-after, then 30m, 1h, 3h, then daily per panel; any activity resets the schedule. Default off (fixed multiples of --idle-after).";
|
|
4033
|
+
}, {
|
|
4034
|
+
readonly name: "--kinds";
|
|
4035
|
+
readonly required: false;
|
|
4036
|
+
readonly value: "<kind,...>";
|
|
4037
|
+
readonly description: "Limit event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited. Default all. Drop agent.busy for any consumer that acts on lines; BUSY carries no action.";
|
|
4038
|
+
}, {
|
|
4039
|
+
readonly name: "--pane";
|
|
4040
|
+
readonly required: false;
|
|
4041
|
+
readonly value: "<pane-id>";
|
|
4042
|
+
readonly description: "Limit to a Pane; repeatable. Default all managed panes.";
|
|
4043
|
+
}, {
|
|
4044
|
+
readonly name: "--exclude-pane";
|
|
4045
|
+
readonly required: false;
|
|
4046
|
+
readonly value: "<pane-id>";
|
|
4047
|
+
readonly description: "Exclude a Pane; repeatable.";
|
|
4048
|
+
}, {
|
|
4049
|
+
readonly name: "--repo";
|
|
4050
|
+
readonly required: false;
|
|
4051
|
+
readonly value: "<selector>";
|
|
4052
|
+
readonly description: "Limit to a saved repository (active, id, path, or name). Default all repositories.";
|
|
4053
|
+
}, {
|
|
4054
|
+
readonly name: "--name-contains";
|
|
4055
|
+
readonly required: false;
|
|
4056
|
+
readonly value: "<text>";
|
|
4057
|
+
readonly description: "Limit by Pane name substring.";
|
|
4058
|
+
}, {
|
|
4059
|
+
readonly name: "--agents-only";
|
|
4060
|
+
readonly required: false;
|
|
4061
|
+
readonly description: "Limit to CLI agent panels. Default on under --follow.";
|
|
3974
4062
|
}, {
|
|
3975
4063
|
readonly name: "--all-managed";
|
|
3976
4064
|
readonly required: false;
|
|
@@ -3979,17 +4067,39 @@ export declare const RUNPANE_CONTRACT: {
|
|
|
3979
4067
|
readonly name: "--include-shells";
|
|
3980
4068
|
readonly required: false;
|
|
3981
4069
|
readonly description: "Include ordinary shell panels.";
|
|
4070
|
+
}, {
|
|
4071
|
+
readonly name: "--timeout-ms";
|
|
4072
|
+
readonly required: false;
|
|
4073
|
+
readonly value: "<milliseconds>";
|
|
4074
|
+
readonly description: "Wait timeout per request; 0 polls once. Default 60000, capped at 120000 (the follow loop re-issues requests).";
|
|
4075
|
+
}, {
|
|
4076
|
+
readonly name: "--limit";
|
|
4077
|
+
readonly required: false;
|
|
4078
|
+
readonly value: "<count>";
|
|
4079
|
+
readonly description: "Maximum entries per response. Default 256.";
|
|
4080
|
+
}, {
|
|
4081
|
+
readonly name: "--ack-now";
|
|
4082
|
+
readonly required: false;
|
|
4083
|
+
readonly description: "At-most-once named-cursor delivery (advance before you act). Default at-least-once.";
|
|
4084
|
+
}, {
|
|
4085
|
+
readonly name: "--include-held-input";
|
|
4086
|
+
readonly required: false;
|
|
4087
|
+
readonly description: "Include up to 120 characters of unsubmitted composer text in JSON entries. Default off (presence only).";
|
|
4088
|
+
}, {
|
|
4089
|
+
readonly name: "--no-held-input";
|
|
4090
|
+
readonly required: false;
|
|
4091
|
+
readonly description: "Disable redacted STUCK detection in lines follow mode.";
|
|
3982
4092
|
}, {
|
|
3983
4093
|
readonly name: "--self-test";
|
|
3984
4094
|
readonly required: false;
|
|
3985
|
-
readonly description: "Probe the watch path anonymously without advancing a named cursor.";
|
|
4095
|
+
readonly description: "Probe the watch path anonymously without advancing a named cursor; run it before arming --follow.";
|
|
3986
4096
|
}, {
|
|
3987
4097
|
readonly name: "--json";
|
|
3988
4098
|
readonly required: false;
|
|
3989
4099
|
readonly description: "Emit structured NDJSON; held-input content remains opt-in.";
|
|
3990
4100
|
}];
|
|
3991
|
-
readonly examples: readonly ["runpane watch --follow", "runpane watch --as monitor --follow --json"];
|
|
3992
|
-
readonly notes: readonly ["Journal loss is surfaced through reset and dropped metadata.", "The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly."];
|
|
4101
|
+
readonly examples: readonly ["runpane watch --self-test", "runpane watch --follow", "runpane watch --as monitor --follow --json", "runpane watch --follow --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff"];
|
|
4102
|
+
readonly notes: readonly ["Defaults stay responsive: no settle, no batching, all kinds, IDLE every --idle-after. Cadence flags are opt-in for expensive consumers and require --follow.", "Recommended orchestrator invocation (what Pane Chat arms automatically): runpane watch --self-test, then runpane watch --follow --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff. Budget: about 6 wake-ups per active pane per hour worst case, usually 1-3.", "BUSY carries no action; drop it with --kinds. HEARTBEAT is client-side proof of life, is never shaped by cadence flags, and should be filtered out of any monitor that wakes an agent.", "STUCK means real unsubmitted composer text. An agent prompt suggestion (for example a grey Try \"...\" hint) never counts.", "Dead watch: judge death by a non-zero exit or a WATCH ERROR line, not by silence. Re-arm once; if it dies again, file runpane doctor --report.", "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.", "Journal loss is surfaced through reset and dropped metadata.", "The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly."];
|
|
3993
4103
|
};
|
|
3994
4104
|
};
|
|
3995
4105
|
readonly managedBlock: readonly ["## Pane", "", "The developer is using Pane for this repository. Pane can manage saved repositories and create user-visible Panes with terminal-backed tools for planning, discussion, implementation, and review work.", "", "This managed guidance was created by [runpane.com](https://runpane.com) for the [Pane repository](https://github.com/dcouple/Pane). Do not delete or overwrite this block; the developer uses it for their workflow and it should remain committed to the main repository unless they explicitly ask to remove it.", "", "Pane mental model: a repository is the saved base repo; a Pane is a user-visible feature/PR workspace (Pane session) that normally maps to one Pane-managed git worktree and branch; a panel/tab is a terminal inside one Pane and shares that Pane's worktree; an agent is the CLI process running in a panel.", "", "Default happy path when the user asks you to use Pane or RunPane: run `runpane doctor --json`; read `runpane agent-context --json`; resolve the saved base repository with `runpane repos list --json` or add it once with `runpane repos add --path <repo> --yes --json`; create one visible Pane (Pane session) for the requested feature/PR with a complete command such as `runpane panes create --repo <repo> --name <name> --agent <agent> --prompt \"<task>\" --source agent --no-focus --wait-ready --yes --json` or the equivalent `--tool-command <command>` form; then validate with `runpane panels wait` or `runpane panels screen` before reporting progress.", "", "Use Pane when the user wants visible Panes or co-drivable parallel feature/PR workspaces. Do not use Pane as your default private delegation mechanism; for private background decomposition, use your normal subagent/worktree workflow.", "", "Register the main/base repository once. Do not register pre-created git worktrees as separate Pane repositories unless the user explicitly asks.", "", "Use `runpane panes create` for separate visible Panes (Pane sessions) for feature/PR work. Use `runpane panels create` for reviewer/helper tabs inside an existing Pane that should share that Pane's worktree.", "", "Typical workflow: register the saved base repository once; create one Pane (Pane session) per feature/PR; use panels/tabs inside that Pane for helper or reviewer agents that should share the worktree; archive the Pane after the PR is done to remove it from active Panes and clean up its managed worktree when applicable.", "", "Skill routing reference: when the user says `discussion`, `plan`, `simple-plan`, `create-plan`, or `implement`, or asks for the behavior those words imply, treat three references as peer context: Pane's local skill cache under `<PANE_DIR>/skills/`, the Pane Chat orchestrator handoff at `<PANE_DIR>/skills/pane-chat/runpane-orchestrator.md` when present, and the [workflow map](https://github.com/dcouple/skills/raw/main/docs/readme-workflow-map.png).", "Use those peer references together to choose the phase: discuss/investigate until the work is clear enough to delegate, then ticket/plan/implement/review/PR-test/teach-back as appropriate. The orchestrator and workflow map may point to different skills; reconcile them with the user's request instead of hardcoding a skill list or treating one reference as subordinate.", "For the Pane implementation source of truth for where the skill cache, cached workflow assets, and Pane Chat bootstrap live, reference [PR #291](https://github.com/dcouple/Pane/pull/291): `main/src/services/skillCacheManager.ts` owns `<PANE_DIR>/skills/`, `.sources/dcouple-skills`, and `pane-chat/runpane-orchestrator.md`; `main/src/services/paneChatManager.ts` owns the tiny bootstrap prompt that tells the selected Pane Chat agent to read that guide.", "Use GitHub reads against the [Parsa skills folder](https://github.com/dcouple/skills/tree/main/parsa) only to inspect or refresh referenced skill files; do not clone/install the repo unless the user asks.", "Do not hardcode a specific assistant brand in workflow guidance. Use the Pane agent or custom tool command the user selected, and use `runpane agents doctor --agent <agent> --repo <selector> --json` only when checking a built-in agent template.", "", "Start with `runpane doctor --json` before taking Pane actions. Use it to understand wrapper/runtime details, daemon reachability, and the next safe commands.", "", "In a Pane repository checkout, if `runpane` is not on PATH, use the built local wrapper with Node 22: `PATH=/opt/homebrew/opt/node@22/bin:$PATH node packages/runpane/dist/cli.js doctor --json`.", "", "Use `runpane agent-context --json` for full Pane CLI context. Use `runpane agent-context --command \"panels wait\" --json` or another command name for detailed schema only when needed.", "", "Default to context-safe validation: after creating Panes or sending terminal input, run `runpane panels wait` or `runpane panels screen` before reporting success. Prefer `runpane panels submit` for normal text plus Enter; use `runpane panels input` only for exact bytes such as Ctrl-C or escape sequences.", "", "Pane terminals draw inline images: sixel, iTerm2 inline images, and the kitty graphics protocol. Tools that need kitty graphics, such as [terminal-browser](https://github.com/zenbu-labs/terminal-browser) and [terminal-doom](https://github.com/dcouple/terminal-doom), run inside a Pane panel. `runpane doctor --json` reports the protocol list under `terminal.graphicsProtocols`.", "", "Common commands:", "- `runpane doctor --json`", "- `runpane agent-context --json`", "- `runpane repos list --json`", "- `runpane repos add --path <repo> --yes --json`", "- `runpane agents doctor --agent <agent> --repo active --json`", "- `runpane panes create --repo active --name <name> --agent <agent> --prompt \"<task>\" --source agent --no-focus --wait-ready --yes --json`", "- `runpane panels create --pane <pane-id> --agent <agent> --source agent --no-focus --wait-ready --yes --json`", "- `runpane panels list --pane <pane-id> --json`", "- `runpane panels screen --panel <panel-id> --limit 80 --json`", "- `runpane panels wait --panel <panel-id> --for ready --timeout-ms 30000 --json`", "- `runpane panels submit --panel <panel-id> --text \"<answer>\" --yes --json`", "- `runpane panels input --panel <panel-id> --input-file <path|-> --yes --json`", "", "WSL note: if `runpane doctor --json` cannot find `/tmp/pane-daemon.../daemon.sock` or `runpane` resolves to a broken Windows shim, Pane may be running on Windows. Try `powershell.exe -NoProfile -Command 'Set-Location $env:TEMP; runpane doctor --json'`, then create Panes through the same PowerShell form using the saved WSL repo name or id. Use `runpane agents doctor --agent <agent> --repo <selector> --json` to diagnose the repo environment Pane will actually use."];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/generated/contract.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/generated/contract.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuiOnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9E,MAAM,MAAM,aAAa,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AACjF,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5E,MAAM,MAAM,YAAY,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC"}
|