@kr78/pi-coding-agent 17.2.10
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/CHANGELOG.md +14861 -0
- package/README.md +35 -0
- package/dist/CHANGELOG-chtdxh1z.md +14861 -0
- package/dist/cli.js +20483 -0
- package/dist/template-c2hyaytt.js +1653 -0
- package/dist/template-f8wx9vfn.css +1355 -0
- package/dist/template-qat058wr.html +55 -0
- package/dist/tool-views.generated-jdfmzwmn.js +35 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +78 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +169 -0
- package/package.json +587 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/bench-title-models.ts +332 -0
- package/scripts/build-binary.ts +117 -0
- package/scripts/bundle-dist.ts +123 -0
- package/scripts/compile-binary.ts +69 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +58 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/legacy-pi-virtual-module.ts +205 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +51 -0
- package/scripts/omp.ts +19 -0
- package/scripts/security-compare.ts +40 -0
- package/src/advisor/advise-tool.ts +234 -0
- package/src/advisor/config.ts +341 -0
- package/src/advisor/emission-guard.ts +172 -0
- package/src/advisor/index.ts +6 -0
- package/src/advisor/runtime.ts +1412 -0
- package/src/advisor/transcript-recorder.ts +215 -0
- package/src/advisor/watchdog.ts +135 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +847 -0
- package/src/auto-thinking/classifier.ts +220 -0
- package/src/autolearn/controller.ts +152 -0
- package/src/autolearn/managed-skills.ts +255 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +331 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +541 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +700 -0
- package/src/autoresearch/tools/init-experiment.ts +268 -0
- package/src/autoresearch/tools/log-experiment.ts +520 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +467 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +115 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +298 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +69 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +187 -0
- package/src/cleanse/agent.ts +226 -0
- package/src/cleanse/balance.ts +79 -0
- package/src/cleanse/checkers.ts +996 -0
- package/src/cleanse/index.ts +190 -0
- package/src/cleanse/loop.ts +51 -0
- package/src/cleanse/parsers.ts +726 -0
- package/src/cleanse/progress.ts +50 -0
- package/src/cleanse/prompts/assignment.md +47 -0
- package/src/cleanse/types.ts +72 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +368 -0
- package/src/cli/auth-broker-cli.ts +940 -0
- package/src/cli/auth-gateway-cli.ts +674 -0
- package/src/cli/bench-cli.ts +990 -0
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/command-help.ts +107 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +459 -0
- package/src/cli/dry-balance-cli.ts +864 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +132 -0
- package/src/cli/flag-tables.ts +367 -0
- package/src/cli/gallery-cli.ts +272 -0
- package/src/cli/gallery-fixtures/agentic.ts +420 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +254 -0
- package/src/cli/gallery-fixtures/fs.ts +245 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +46 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +177 -0
- package/src/cli/gallery-fixtures/search.ts +135 -0
- package/src/cli/gallery-fixtures/shell.ts +241 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gc-cli.ts +1566 -0
- package/src/cli/grep-cli.ts +161 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +385 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +369 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +99 -0
- package/src/cli/session-picker.ts +110 -0
- package/src/cli/setup-cli.ts +312 -0
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +58 -0
- package/src/cli/stats-cli.ts +229 -0
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/tiny-models-cli.ts +153 -0
- package/src/cli/ttsr-cli.ts +1013 -0
- package/src/cli/update-cli.ts +1184 -0
- package/src/cli/usage-cli.ts +1084 -0
- package/src/cli/usage-error.ts +7 -0
- package/src/cli/web-search-cli.ts +144 -0
- package/src/cli/worktree-cli.ts +311 -0
- package/src/cli-commands.ts +308 -0
- package/src/cli.ts +428 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/display-name.ts +13 -0
- package/src/collab/guest.ts +764 -0
- package/src/collab/host.ts +692 -0
- package/src/collab/protocol.ts +296 -0
- package/src/collab/relay-client.ts +282 -0
- package/src/collab/replication-shrink.ts +111 -0
- package/src/commands/acp.ts +35 -0
- package/src/commands/agents.ts +58 -0
- package/src/commands/auth-broker.ts +100 -0
- package/src/commands/auth-gateway.ts +70 -0
- package/src/commands/bench.ts +64 -0
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +45 -0
- package/src/commands/commit.ts +47 -0
- package/src/commands/complete.ts +67 -0
- package/src/commands/completions.ts +61 -0
- package/src/commands/config.ts +52 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +61 -0
- package/src/commands/gc.ts +47 -0
- package/src/commands/grep.ts +49 -0
- package/src/commands/grievances.ts +52 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +40 -0
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +34 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +79 -0
- package/src/commands/read.ts +39 -0
- package/src/commands/say.ts +146 -0
- package/src/commands/setup.ts +68 -0
- package/src/commands/share.ts +71 -0
- package/src/commands/shell.ts +30 -0
- package/src/commands/ssh.ts +61 -0
- package/src/commands/stats.ts +30 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +164 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +34 -0
- package/src/commands/usage.ts +55 -0
- package/src/commands/web-search.ts +43 -0
- package/src/commands/worktree.ts +63 -0
- package/src/commit/agentic/agent.ts +322 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +383 -0
- package/src/commit/agentic/lock-files.ts +107 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +148 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +52 -0
- package/src/commit/agentic/tools/git-overview.ts +62 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +147 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +11 -0
- package/src/commit/agentic/tools/split-commit.ts +241 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +107 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +95 -0
- package/src/commit/pipeline.ts +244 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +70 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +81 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +347 -0
- package/src/config/inline-tool-descriptors-mode.ts +26 -0
- package/src/config/keybindings.ts +703 -0
- package/src/config/mcp-schema.json +252 -0
- package/src/config/model-discovery.ts +1077 -0
- package/src/config/model-registry.ts +2822 -0
- package/src/config/model-resolver.ts +2115 -0
- package/src/config/model-roles.ts +113 -0
- package/src/config/models-config-schema-bundle.ts +315 -0
- package/src/config/models-config-schema.ts +14 -0
- package/src/config/models-config.ts +130 -0
- package/src/config/prompt-templates.ts +205 -0
- package/src/config/provider-globals.ts +25 -0
- package/src/config/resolve-config-value.ts +95 -0
- package/src/config/service-tier.ts +146 -0
- package/src/config/settings-schema.ts +5887 -0
- package/src/config/settings.ts +2394 -0
- package/src/config.ts +242 -0
- package/src/cursor-bridge-tools.ts +81 -0
- package/src/cursor.ts +960 -0
- package/src/dap/client.ts +1043 -0
- package/src/dap/config.ts +480 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1841 -0
- package/src/dap/types.ts +611 -0
- package/src/debug/index.ts +584 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +966 -0
- package/src/debug/profiler.ts +168 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +421 -0
- package/src/debug/raw-sse.ts +312 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +411 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agent-plugin-format.ts +551 -0
- package/src/discovery/agent-plugins.ts +341 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +300 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
- package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
- package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
- package/src/discovery/builtin-rules/go-ioutil.md +37 -0
- package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
- package/src/discovery/builtin-rules/go-new-expr.md +44 -0
- package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
- package/src/discovery/builtin-rules/go-range-int.md +45 -0
- package/src/discovery/builtin-rules/index.ts +74 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
- package/src/discovery/builtin-rules/rs-result-type.md +20 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
- package/src/discovery/builtin-rules/ts-import-type.md +43 -0
- package/src/discovery/builtin-rules/ts-no-any.md +66 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
- package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +945 -0
- package/src/discovery/claude-plugins.ts +640 -0
- package/src/discovery/claude.ts +591 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +553 -0
- package/src/discovery/contained-path.ts +78 -0
- package/src/discovery/cursor.ts +223 -0
- package/src/discovery/gemini.ts +386 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1183 -0
- package/src/discovery/index.ts +82 -0
- package/src/discovery/mcp-json.ts +182 -0
- package/src/discovery/omp-extension-roots.ts +272 -0
- package/src/discovery/omp-plugins.ts +409 -0
- package/src/discovery/opencode.ts +441 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +77 -0
- package/src/discovery/vscode.ts +106 -0
- package/src/discovery/windsurf.ts +149 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +1008 -0
- package/src/edit/edit-clipboard.ts +23 -0
- package/src/edit/file-snapshot-store.ts +148 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +402 -0
- package/src/edit/hashline/execute.ts +313 -0
- package/src/edit/hashline/filesystem.ts +247 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +12 -0
- package/src/edit/index.ts +699 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1958 -0
- package/src/edit/modes/replace.ts +1191 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +998 -0
- package/src/edit/snapshot-details.ts +77 -0
- package/src/edit/streaming.ts +710 -0
- package/src/eval/agent-bridge.ts +224 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +65 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +212 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +562 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +551 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +236 -0
- package/src/eval/jl/prelude.jl +736 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +666 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +872 -0
- package/src/eval/js/executor.ts +178 -0
- package/src/eval/js/index.ts +41 -0
- package/src/eval/js/process-entry.ts +31 -0
- package/src/eval/js/shared/helpers.ts +170 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +364 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +294 -0
- package/src/eval/js/shared/rewrite-imports.ts +550 -0
- package/src/eval/js/shared/runtime.ts +590 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +163 -0
- package/src/eval/js/worker-core.ts +380 -0
- package/src/eval/js/worker-entry.ts +37 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/kernel-base.ts +569 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +643 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +235 -0
- package/src/eval/py/prelude.py +673 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1425 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +134 -0
- package/src/eval/py/tool-bridge.ts +201 -0
- package/src/eval/rb/executor.ts +511 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +231 -0
- package/src/eval/rb/prelude.rb +551 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +581 -0
- package/src/eval/rb/runtime.ts +132 -0
- package/src/eval/runtime-env.ts +104 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +627 -0
- package/src/exec/direnv.ts +145 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +118 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +320 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1355 -0
- package/src/export/html/template.html +55 -0
- package/src/export/html/template.js +1653 -0
- package/src/export/html/tool-views.generated.js +35 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/html/web-palette.ts +126 -0
- package/src/export/share.ts +686 -0
- package/src/export/ttsr.ts +590 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +242 -0
- package/src/extensibility/custom-commands/types.ts +119 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +301 -0
- package/src/extensibility/custom-tools/types.ts +287 -0
- package/src/extensibility/custom-tools/wrapper.ts +50 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/load-errors.ts +13 -0
- package/src/extensibility/extensions/loader.ts +663 -0
- package/src/extensibility/extensions/managed-timers.ts +83 -0
- package/src/extensibility/extensions/model-api.ts +39 -0
- package/src/extensibility/extensions/runner.ts +1396 -0
- package/src/extensibility/extensions/types.ts +1603 -0
- package/src/extensibility/extensions/wrapper.ts +395 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +243 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +124 -0
- package/src/extensibility/hooks/types.ts +612 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
- package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
- package/src/extensibility/legacy-typebox.ts +101 -0
- package/src/extensibility/plugins/bun-git-cache.ts +91 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +201 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
- package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
- package/src/extensibility/plugins/loader.ts +535 -0
- package/src/extensibility/plugins/manager.ts +1142 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +927 -0
- package/src/extensibility/plugins/marketplace/registry.ts +192 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +192 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +107 -0
- package/src/extensibility/plugins/runtime-config.ts +9 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/session-handler-types.ts +21 -0
- package/src/extensibility/shared-events.ts +401 -0
- package/src/extensibility/skills.ts +531 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-event-input.ts +80 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/utils.ts +192 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +521 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +680 -0
- package/src/hindsight/config.ts +193 -0
- package/src/hindsight/content.ts +266 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +530 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +180 -0
- package/src/internal-urls/artifact-protocol.ts +151 -0
- package/src/internal-urls/docs-index.ts +102 -0
- package/src/internal-urls/filesystem-resource.ts +34 -0
- package/src/internal-urls/history-protocol.ts +198 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/issue-pr-protocol.ts +594 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +471 -0
- package/src/internal-urls/mcp-protocol.ts +168 -0
- package/src/internal-urls/memory-protocol.ts +380 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +103 -0
- package/src/internal-urls/registry-helpers.ts +132 -0
- package/src/internal-urls/router.ts +153 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/security-protocol.ts +261 -0
- package/src/internal-urls/skill-protocol.ts +131 -0
- package/src/internal-urls/ssh-protocol.ts +368 -0
- package/src/internal-urls/types.ts +196 -0
- package/src/internal-urls/vault-protocol.ts +940 -0
- package/src/internal-urls/xd-protocol.ts +46 -0
- package/src/irc/bus.ts +380 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/launch/broker.ts +1368 -0
- package/src/launch/client.ts +521 -0
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +14 -0
- package/src/launch/presence.ts +82 -0
- package/src/launch/protocol.ts +448 -0
- package/src/launch/spawn-options.ts +17 -0
- package/src/launch/terminal-output-worker-client.ts +53 -0
- package/src/launch/terminal-output-worker-protocol.ts +11 -0
- package/src/launch/terminal-output-worker.ts +23 -0
- package/src/launch/terminal-output.ts +46 -0
- package/src/lib/xai-http.ts +150 -0
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +221 -0
- package/src/live/voices.ts +18 -0
- package/src/lsp/client.ts +1465 -0
- package/src/lsp/clients/biome-client.ts +263 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +85 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +549 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/deferred-diagnostics.ts +66 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +288 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2821 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/mux/daemon.ts +348 -0
- package/src/lsp/mux/protocol.ts +96 -0
- package/src/lsp/mux/server.ts +797 -0
- package/src/lsp/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +479 -0
- package/src/lsp/utils.ts +747 -0
- package/src/main.ts +1799 -0
- package/src/markit/NOTICE +32 -0
- package/src/markit/converters/docx.ts +56 -0
- package/src/markit/converters/epub.ts +136 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +598 -0
- package/src/markit/converters/pdf/grid.ts +780 -0
- package/src/markit/converters/pdf/headers.ts +106 -0
- package/src/markit/converters/pdf/index.ts +146 -0
- package/src/markit/converters/pdf/render.ts +501 -0
- package/src/markit/converters/pdf/types.ts +84 -0
- package/src/markit/converters/pptx.ts +325 -0
- package/src/markit/converters/xlsx.ts +173 -0
- package/src/markit/index.ts +2 -0
- package/src/markit/registry.ts +59 -0
- package/src/markit/types.ts +35 -0
- package/src/mcp/client.ts +511 -0
- package/src/mcp/config-writer.ts +377 -0
- package/src/mcp/config.ts +385 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +125 -0
- package/src/mcp/manager.ts +1524 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +587 -0
- package/src/mcp/oauth-flow.ts +830 -0
- package/src/mcp/render.ts +214 -0
- package/src/mcp/request-id.ts +24 -0
- package/src/mcp/smithery-auth.ts +108 -0
- package/src/mcp/smithery-connect.ts +154 -0
- package/src/mcp/smithery-registry.ts +500 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +691 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/header-policy.ts +95 -0
- package/src/mcp/transports/http.ts +508 -0
- package/src/mcp/transports/index.ts +7 -0
- package/src/mcp/transports/sse.ts +372 -0
- package/src/mcp/transports/stdio.ts +905 -0
- package/src/mcp/types.ts +467 -0
- package/src/memories/index.ts +1434 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +19 -0
- package/src/memory-backend/local-backend.ts +47 -0
- package/src/memory-backend/messages.ts +19 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +629 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +293 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +114 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +940 -0
- package/src/modes/acp/acp-agent.ts +2595 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +1084 -0
- package/src/modes/acp/acp-mode.ts +48 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/advisor-config.ts +635 -0
- package/src/modes/components/advisor-message.ts +109 -0
- package/src/modes/components/agent-dashboard.ts +1252 -0
- package/src/modes/components/agent-hub-projection.ts +248 -0
- package/src/modes/components/agent-hub-renderer.ts +194 -0
- package/src/modes/components/agent-hub.ts +1126 -0
- package/src/modes/components/agent-transcript-viewer.ts +647 -0
- package/src/modes/components/ask-dialog.ts +1017 -0
- package/src/modes/components/assistant-message.ts +978 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +233 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +161 -0
- package/src/modes/components/cache-invalidation-marker.ts +110 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/chat-transcript-builder.ts +518 -0
- package/src/modes/components/codex-reset-fireworks.ts +369 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +221 -0
- package/src/modes/components/copy-selector.ts +218 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +1036 -0
- package/src/modes/components/custom-message.ts +70 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +37 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +169 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +492 -0
- package/src/modes/components/extensions/extension-list.ts +507 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +326 -0
- package/src/modes/components/extensions/state-manager.ts +648 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +213 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +67 -0
- package/src/modes/components/hook-selector.ts +691 -0
- package/src/modes/components/index.ts +42 -0
- package/src/modes/components/keybinding-hints.ts +56 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +197 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1413 -0
- package/src/modes/components/message-frame.ts +98 -0
- package/src/modes/components/model-browser.ts +888 -0
- package/src/modes/components/model-hub.ts +2014 -0
- package/src/modes/components/model-picker.ts +237 -0
- package/src/modes/components/move-overlay.ts +293 -0
- package/src/modes/components/oauth-selector.ts +474 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/pause-screen.ts +208 -0
- package/src/modes/components/plan-review-overlay.ts +1226 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +100 -0
- package/src/modes/components/plugin-settings.ts +745 -0
- package/src/modes/components/queue-mode-selector.ts +61 -0
- package/src/modes/components/read-tool-group.ts +856 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/select-list-mouse-routing.ts +35 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/session-selector.ts +1035 -0
- package/src/modes/components/settings-defs.ts +267 -0
- package/src/modes/components/settings-selector.ts +1445 -0
- package/src/modes/components/show-images-selector.ts +50 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1843 -0
- package/src/modes/components/status-line/context-thresholds.ts +86 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +710 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +159 -0
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/theme-selector.ts +68 -0
- package/src/modes/components/thinking-selector.ts +57 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +26 -0
- package/src/modes/components/todo-reminder.ts +43 -0
- package/src/modes/components/tool-execution.ts +1467 -0
- package/src/modes/components/transcript-container.ts +527 -0
- package/src/modes/components/tree-selector.ts +1006 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +52 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +167 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +578 -0
- package/src/modes/controllers/btw-controller.ts +246 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +2024 -0
- package/src/modes/controllers/event-controller.ts +2173 -0
- package/src/modes/controllers/extension-ui-controller.ts +1243 -0
- package/src/modes/controllers/input-controller.ts +2037 -0
- package/src/modes/controllers/live-command-controller.ts +261 -0
- package/src/modes/controllers/mcp-command-controller.ts +2552 -0
- package/src/modes/controllers/omfg-controller.ts +287 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +2058 -0
- package/src/modes/controllers/session-focus-controller.ts +117 -0
- package/src/modes/controllers/ssh-command-controller.ts +385 -0
- package/src/modes/controllers/streaming-reveal.ts +399 -0
- package/src/modes/controllers/tan-command-controller.ts +243 -0
- package/src/modes/controllers/todo-command-controller.ts +487 -0
- package/src/modes/controllers/tool-args-reveal.ts +591 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/github-ref-autocomplete.ts +75 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +10 -0
- package/src/modes/interactive-mode.ts +5055 -0
- package/src/modes/internal-url-autocomplete.ts +158 -0
- package/src/modes/loop-limit.ts +192 -0
- package/src/modes/magic-keyword-boundary.ts +23 -0
- package/src/modes/magic-keywords.ts +42 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +43 -0
- package/src/modes/print-mode.ts +282 -0
- package/src/modes/prompt-action-autocomplete.ts +322 -0
- package/src/modes/queue-input.ts +132 -0
- package/src/modes/rpc/host-tools.ts +204 -0
- package/src/modes/rpc/host-uris.ts +241 -0
- package/src/modes/rpc/rpc-client.ts +1213 -0
- package/src/modes/rpc/rpc-frame.ts +316 -0
- package/src/modes/rpc/rpc-input.ts +38 -0
- package/src/modes/rpc/rpc-messages.ts +127 -0
- package/src/modes/rpc/rpc-mode.ts +1519 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +544 -0
- package/src/modes/running-subagent-badge.ts +13 -0
- package/src/modes/runtime-init.ts +144 -0
- package/src/modes/session-observer-registry.ts +223 -0
- package/src/modes/session-teardown.ts +82 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +103 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
- package/src/modes/setup-wizard/scenes/model.ts +132 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +105 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +330 -0
- package/src/modes/setup-wizard/scenes/types.ts +65 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
- package/src/modes/shared.ts +49 -0
- package/src/modes/skill-command.ts +91 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +143 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +143 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +92 -0
- package/src/modes/theme/shimmer.ts +305 -0
- package/src/modes/theme/theme-schema.json +463 -0
- package/src/modes/theme/theme.ts +3171 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +494 -0
- package/src/modes/ultrathink.ts +42 -0
- package/src/modes/utils/context-usage.ts +518 -0
- package/src/modes/utils/copy-targets.ts +378 -0
- package/src/modes/utils/hotkeys-markdown.ts +65 -0
- package/src/modes/utils/interactive-context-helpers.ts +31 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +31 -0
- package/src/modes/utils/transcript-render-helpers.ts +253 -0
- package/src/modes/utils/ui-helpers.ts +976 -0
- package/src/modes/warp-events.ts +232 -0
- package/src/modes/workflow.ts +55 -0
- package/src/plan-mode/approved-plan.ts +194 -0
- package/src/plan-mode/model-transition.ts +51 -0
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +60 -0
- package/src/prompts/advisor/active-repo-watchdog.md +6 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/context-files.md +8 -0
- package/src/prompts/advisor/system.md +98 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/frontmatter.md +12 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/scout.md +58 -0
- package/src/prompts/agents/security-reviewer.md +75 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/bench.md +6 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/goals/goal-mode-context.md +4 -0
- package/src/prompts/goals/goal-todo-context.md +12 -0
- package/src/prompts/goals/guided-goal-interview.md +43 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/read-path.md +17 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +21 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +68 -0
- package/src/prompts/security/scan-coordinator.md +7 -0
- package/src/prompts/security/scan-request.md +21 -0
- package/src/prompts/security/validate-request.md +8 -0
- package/src/prompts/session/launch-completion.md +1 -0
- package/src/prompts/skills/autoload.md +8 -0
- package/src/prompts/skills/user-invocation.md +11 -0
- package/src/prompts/steering/parent-irc.md +5 -0
- package/src/prompts/steering/user-interjection.md +6 -0
- package/src/prompts/system/active-repo-context.md +4 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +14 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +18 -0
- package/src/prompts/system/empty-stop-retry.md +4 -0
- package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
- package/src/prompts/system/interrupted-thinking.md +7 -0
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +9 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/mcp-xdev-guidance.md +11 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/mid-run-todo-nudge.md +3 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/personalities/default.md +18 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +125 -0
- package/src/prompts/system/plan-mode-approved.md +22 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
- package/src/prompts/system/plan-mode-reference.md +10 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/plan-yolo-handoff.md +5 -0
- package/src/prompts/system/prewalk-checklist.md +7 -0
- package/src/prompts/system/prewalk-continue.md +1 -0
- package/src/prompts/system/prewalk-plan.md +13 -0
- package/src/prompts/system/project-prompt.md +61 -0
- package/src/prompts/system/recap-user.md +9 -0
- package/src/prompts/system/resolve-device-reminder.md +3 -0
- package/src/prompts/system/rewind-report.md +6 -0
- package/src/prompts/system/side-channel-no-tools.md +3 -0
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/speech-rewrite.md +15 -0
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/subagent-system-prompt.md +73 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +23 -0
- package/src/prompts/system/system-prompt.md +263 -0
- package/src/prompts/system/tan-context-switch.md +17 -0
- package/src/prompts/system/task-label.md +23 -0
- package/src/prompts/system/thinking-loop-redirect.md +10 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/tool-call-loop-redirect.md +8 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/unexpected-stop-classifier.md +17 -0
- package/src/prompts/system/unexpected-stop-retry.md +4 -0
- package/src/prompts/system/vibe-mode-active.md +26 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +112 -0
- package/src/prompts/system/xdev-mount-notice.md +20 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +22 -0
- package/src/prompts/tools/ast-edit.md +11 -0
- package/src/prompts/tools/ast-grep.md +19 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/browser.md +29 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/debug.md +3 -0
- package/src/prompts/tools/eval.md +45 -0
- package/src/prompts/tools/github.md +22 -0
- package/src/prompts/tools/glob.md +16 -0
- package/src/prompts/tools/goal.md +11 -0
- package/src/prompts/tools/grep.md +13 -0
- package/src/prompts/tools/hub.md +34 -0
- package/src/prompts/tools/image-attachment-describe-system.md +8 -0
- package/src/prompts/tools/image-attachment-describe.md +10 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +22 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +19 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +12 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +27 -0
- package/src/prompts/tools/recall.md +7 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +14 -0
- package/src/prompts/tools/security-publish.md +1 -0
- package/src/prompts/tools/security-scan.md +1 -0
- package/src/prompts/tools/task-async-contract.md +1 -0
- package/src/prompts/tools/task-summary.md +20 -0
- package/src/prompts/tools/task.md +83 -0
- package/src/prompts/tools/todo.md +42 -0
- package/src/prompts/tools/vibe-kill.md +3 -0
- package/src/prompts/tools/vibe-list.md +3 -0
- package/src/prompts/tools/vibe-send.md +9 -0
- package/src/prompts/tools/vibe-spawn.md +10 -0
- package/src/prompts/tools/vibe-turn-result.md +19 -0
- package/src/prompts/tools/vibe-wait.md +8 -0
- package/src/prompts/tools/web-search.md +8 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +505 -0
- package/src/registry/agent-registry.ts +287 -0
- package/src/registry/persisted-agents.ts +423 -0
- package/src/sdk.ts +3820 -0
- package/src/secrets/index.ts +375 -0
- package/src/secrets/obfuscator.ts +2629 -0
- package/src/secrets/regex.ts +21 -0
- package/src/security/auth.ts +98 -0
- package/src/security/cloud.ts +686 -0
- package/src/security/comparison.ts +255 -0
- package/src/security/contracts/ids.ts +111 -0
- package/src/security/contracts/index.ts +4 -0
- package/src/security/contracts/schemas.ts +219 -0
- package/src/security/contracts/types.ts +254 -0
- package/src/security/contracts/validation.ts +69 -0
- package/src/security/coordinator.ts +708 -0
- package/src/security/importers/codex-security.ts +387 -0
- package/src/security/importers/index.ts +2 -0
- package/src/security/importers/sarif.ts +357 -0
- package/src/security/index.ts +13 -0
- package/src/security/preflight.ts +405 -0
- package/src/security/provenance.ts +106 -0
- package/src/security/publication.ts +326 -0
- package/src/security/remediation.ts +93 -0
- package/src/security/resource-output.ts +50 -0
- package/src/security/sarif.ts +78 -0
- package/src/security/store.ts +430 -0
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-events.ts +67 -0
- package/src/session/agent-session-types.ts +407 -0
- package/src/session/agent-session.ts +9000 -0
- package/src/session/agent-storage.ts +807 -0
- package/src/session/artifacts.ts +154 -0
- package/src/session/async-job-delivery.ts +82 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +25 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.ts +295 -0
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/claude-session-store.ts +426 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +673 -0
- package/src/session/codex-session-store.ts +673 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/credential-pin.ts +93 -0
- package/src/session/eval-runner.ts +219 -0
- package/src/session/exit-diagnostics.ts +310 -0
- package/src/session/foreign-session-import.ts +52 -0
- package/src/session/foreign-session-jsonl.ts +29 -0
- package/src/session/foreign-session-store.ts +26 -0
- package/src/session/history-storage.ts +329 -0
- package/src/session/indexed-session-storage.ts +553 -0
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/launch-completion.ts +37 -0
- package/src/session/messages.ts +1304 -0
- package/src/session/model-controls.ts +757 -0
- package/src/session/prewalk.ts +279 -0
- package/src/session/provider-image-budget.ts +86 -0
- package/src/session/queued-messages.ts +99 -0
- package/src/session/redis-session-storage.ts +257 -0
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1896 -0
- package/src/session/session-context.ts +584 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +306 -0
- package/src/session/session-handoff.ts +325 -0
- package/src/session/session-history-format.ts +459 -0
- package/src/session/session-listing.ts +715 -0
- package/src/session/session-loader.ts +362 -0
- package/src/session/session-maintenance.ts +3115 -0
- package/src/session/session-manager.ts +2747 -0
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-metadata.ts +53 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +280 -0
- package/src/session/session-persistence.ts +293 -0
- package/src/session/session-provider-boundary.ts +306 -0
- package/src/session/session-stats.ts +349 -0
- package/src/session/session-storage.ts +774 -0
- package/src/session/session-title-slot.ts +141 -0
- package/src/session/session-tools.ts +1385 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/settings-stream-fn.ts +79 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/snapcompact-inline.ts +545 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/sql-session-storage.ts +374 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +1459 -0
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/tool-choice-queue.ts +305 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-persistence.ts +142 -0
- package/src/session/turn-recovery.ts +2005 -0
- package/src/session/unexpected-stop-classifier.ts +141 -0
- package/src/session/yield-queue.ts +288 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +3149 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
- package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
- package/src/slash-commands/helpers/context-report.ts +66 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +108 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +533 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +68 -0
- package/src/slash-commands/helpers/security.ts +451 -0
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/ssh.ts +196 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +198 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +139 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +667 -0
- package/src/ssh/file-transfer.ts +214 -0
- package/src/ssh/sshfs-mount.ts +163 -0
- package/src/ssh/utils.ts +51 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +401 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +603 -0
- package/src/stt/downloader.ts +142 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +6 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/sherpa-runtime.ts +71 -0
- package/src/stt/stt-controller.ts +320 -0
- package/src/stt/submit-trigger.ts +74 -0
- package/src/subprocess/worker-client.ts +463 -0
- package/src/subprocess/worker-runtime.ts +494 -0
- package/src/system-prompt.ts +921 -0
- package/src/task/agents.ts +170 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +145 -0
- package/src/task/executor.ts +3431 -0
- package/src/task/index.ts +1515 -0
- package/src/task/isolation-ownership.ts +106 -0
- package/src/task/isolation-runner.ts +444 -0
- package/src/task/label.ts +40 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +115 -0
- package/src/task/parallel.ts +221 -0
- package/src/task/persisted-revive.ts +173 -0
- package/src/task/prewalk.ts +6 -0
- package/src/task/prompt-policy.ts +8 -0
- package/src/task/provider-concurrency.ts +100 -0
- package/src/task/read-only-policy.ts +27 -0
- package/src/task/render.ts +1830 -0
- package/src/task/renderer.ts +14 -0
- package/src/task/repair-args.ts +118 -0
- package/src/task/spawn-policy.ts +72 -0
- package/src/task/structured-subagent.ts +676 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +555 -0
- package/src/task/worktree.ts +967 -0
- package/src/task/yield-assembly.ts +198 -0
- package/src/telemetry-export.ts +504 -0
- package/src/thinking.ts +377 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/message-preproc.ts +155 -0
- package/src/tiny/models.ts +268 -0
- package/src/tiny/text.ts +290 -0
- package/src/tiny/title-client.ts +460 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +354 -0
- package/src/tools/acp-bridge.ts +125 -0
- package/src/tools/approval.ts +245 -0
- package/src/tools/ask.ts +1459 -0
- package/src/tools/ast-edit.ts +718 -0
- package/src/tools/ast-grep.ts +526 -0
- package/src/tools/auto-generated-guard.ts +335 -0
- package/src/tools/bash-interactive.ts +435 -0
- package/src/tools/bash-interceptor.ts +148 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +350 -0
- package/src/tools/bash.ts +1826 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +131 -0
- package/src/tools/browser/attach.ts +219 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
- package/src/tools/browser/cmux/rpc.ts +200 -0
- package/src/tools/browser/cmux/socket-client.ts +445 -0
- package/src/tools/browser/launch.ts +939 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +447 -0
- package/src/tools/browser/relay/bridge.ts +945 -0
- package/src/tools/browser/relay/daemon.ts +117 -0
- package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
- package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
- package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
- package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
- package/src/tools/browser/relay/kind.ts +41 -0
- package/src/tools/browser/relay/protocol.ts +54 -0
- package/src/tools/browser/relay/server.ts +141 -0
- package/src/tools/browser/render.ts +229 -0
- package/src/tools/browser/run-output.ts +76 -0
- package/src/tools/browser/shared-daemon.ts +139 -0
- package/src/tools/browser/tab-protocol.ts +123 -0
- package/src/tools/browser/tab-supervisor.ts +1077 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1982 -0
- package/src/tools/browser.ts +487 -0
- package/src/tools/builtin-names.ts +67 -0
- package/src/tools/checkpoint.ts +137 -0
- package/src/tools/computer/exposure.ts +14 -0
- package/src/tools/computer/protocol.ts +69 -0
- package/src/tools/computer/supervisor.ts +409 -0
- package/src/tools/computer/worker-entry.ts +39 -0
- package/src/tools/computer/worker.ts +745 -0
- package/src/tools/computer-renderer.ts +147 -0
- package/src/tools/computer.ts +222 -0
- package/src/tools/conflict-detect.ts +815 -0
- package/src/tools/context.ts +49 -0
- package/src/tools/debug.ts +1121 -0
- package/src/tools/default-renderer.ts +154 -0
- package/src/tools/essential-tools.ts +46 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-format/index.ts +24 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/julia.ts +446 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval-format/ruby.ts +380 -0
- package/src/tools/eval-render.ts +784 -0
- package/src/tools/eval.ts +774 -0
- package/src/tools/fetch.ts +1889 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +175 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +484 -0
- package/src/tools/gh.ts +3958 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/glob.ts +691 -0
- package/src/tools/grep.ts +1920 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/hub/index.ts +579 -0
- package/src/tools/hub/jobs.ts +714 -0
- package/src/tools/hub/launch.ts +690 -0
- package/src/tools/hub/messaging.ts +735 -0
- package/src/tools/hub/types.ts +117 -0
- package/src/tools/image-gen.ts +1689 -0
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +736 -0
- package/src/tools/inspect-image-renderer.ts +133 -0
- package/src/tools/inspect-image.ts +316 -0
- package/src/tools/json-tree.ts +260 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/learn.ts +141 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/manage-skill.ts +102 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +61 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +211 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +860 -0
- package/src/tools/output-schema-validator.ts +307 -0
- package/src/tools/path-utils.ts +1489 -0
- package/src/tools/plan-mode-guard.ts +155 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
- package/src/tools/read.ts +3762 -0
- package/src/tools/render-utils.ts +926 -0
- package/src/tools/renderers.ts +133 -0
- package/src/tools/report-tool-issue.ts +568 -0
- package/src/tools/resolve.ts +423 -0
- package/src/tools/review.ts +103 -0
- package/src/tools/run-scope.ts +417 -0
- package/src/tools/security-scan.ts +287 -0
- package/src/tools/shell-tokenize.ts +213 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/terminal-output.ts +141 -0
- package/src/tools/todo.ts +1226 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +38 -0
- package/src/tools/tts.ts +266 -0
- package/src/tools/vibe.ts +608 -0
- package/src/tools/write.ts +1646 -0
- package/src/tools/xdev.ts +560 -0
- package/src/tools/yield.ts +486 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +10 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/speakable.ts +392 -0
- package/src/tts/speech-enhancer.ts +206 -0
- package/src/tts/streaming-player.ts +120 -0
- package/src/tts/tts-client.ts +475 -0
- package/src/tts/tts-protocol.ts +69 -0
- package/src/tts/tts-worker.ts +434 -0
- package/src/tts/vocalizer.ts +419 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +268 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +178 -0
- package/src/tui/index.ts +13 -0
- package/src/tui/output-block.ts +268 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +172 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/tui/width-aware-text.ts +58 -0
- package/src/utils/active-repo-context.ts +143 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +373 -0
- package/src/utils/clipboard.ts +361 -0
- package/src/utils/command-args.ts +74 -0
- package/src/utils/commit-message-generator.ts +148 -0
- package/src/utils/cpuprofile.ts +235 -0
- package/src/utils/edit-mode.ts +61 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +80 -0
- package/src/utils/fetch-timeout.ts +10 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +293 -0
- package/src/utils/git.ts +2472 -0
- package/src/utils/image-loading.ts +236 -0
- package/src/utils/image-resize.ts +420 -0
- package/src/utils/image-vision-fallback.ts +196 -0
- package/src/utils/inspect-image-mode.ts +39 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +422 -0
- package/src/utils/lang-from-path.ts +251 -0
- package/src/utils/late-cleanup.ts +17 -0
- package/src/utils/local-date.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/markit-cache.ts +166 -0
- package/src/utils/markit.ts +223 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +126 -0
- package/src/utils/profile-tree.ts +111 -0
- package/src/utils/prompt-path.ts +3 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/sample-profile.ts +437 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot-fn-env.sh +63 -0
- package/src/utils/shell-snapshot.ts +326 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +163 -0
- package/src/utils/title-generator.ts +597 -0
- package/src/utils/token-rate.ts +72 -0
- package/src/utils/tool-choice.ts +50 -0
- package/src/utils/tools-manager.ts +411 -0
- package/src/utils/turndown.ts +82 -0
- package/src/utils/zip.ts +1106 -0
- package/src/vibe/runtime.ts +1684 -0
- package/src/vibe/state.ts +4 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +354 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +663 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +800 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +129 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +121 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +354 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +393 -0
- package/src/web/search/provider.ts +272 -0
- package/src/web/search/providers/anthropic.ts +406 -0
- package/src/web/search/providers/base.ts +112 -0
- package/src/web/search/providers/brave.ts +181 -0
- package/src/web/search/providers/browser-headers.ts +82 -0
- package/src/web/search/providers/browser-page.ts +125 -0
- package/src/web/search/providers/codex.ts +788 -0
- package/src/web/search/providers/duckduckgo.ts +382 -0
- package/src/web/search/providers/ecosia.ts +183 -0
- package/src/web/search/providers/exa.ts +513 -0
- package/src/web/search/providers/firecrawl.ts +213 -0
- package/src/web/search/providers/gemini.ts +634 -0
- package/src/web/search/providers/google.ts +195 -0
- package/src/web/search/providers/jina.ts +144 -0
- package/src/web/search/providers/kagi.ts +98 -0
- package/src/web/search/providers/kimi.ts +221 -0
- package/src/web/search/providers/mojeek.ts +220 -0
- package/src/web/search/providers/parallel.ts +186 -0
- package/src/web/search/providers/perplexity-auth.ts +142 -0
- package/src/web/search/providers/perplexity.ts +997 -0
- package/src/web/search/providers/public.ts +199 -0
- package/src/web/search/providers/searxng.ts +467 -0
- package/src/web/search/providers/startpage.ts +225 -0
- package/src/web/search/providers/synthetic.ts +126 -0
- package/src/web/search/providers/tavily.ts +244 -0
- package/src/web/search/providers/tinyfish.ts +166 -0
- package/src/web/search/providers/utils.ts +130 -0
- package/src/web/search/providers/xai.ts +372 -0
- package/src/web/search/providers/zai.ts +452 -0
- package/src/web/search/query.ts +850 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +518 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +326 -0
|
@@ -0,0 +1,1519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC mode: Headless operation with JSON stdin/stdout protocol.
|
|
3
|
+
*
|
|
4
|
+
* Used for embedding the agent in other applications.
|
|
5
|
+
* Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
|
|
6
|
+
*
|
|
7
|
+
* Protocol:
|
|
8
|
+
* - Commands: JSON objects with `type` field, optional `id` for correlation
|
|
9
|
+
* - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
|
|
10
|
+
* - Events: AgentSessionEvent objects streamed as they occur
|
|
11
|
+
* - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
|
|
12
|
+
*/
|
|
13
|
+
import { once } from "node:events";
|
|
14
|
+
import { getOAuthProviders } from "@oh-my-pi/pi-ai/oauth";
|
|
15
|
+
import { toolWireSchema } from "@oh-my-pi/pi-ai/utils/schema";
|
|
16
|
+
import { $env, isRecord, readLines, Snowflake } from "@oh-my-pi/pi-utils";
|
|
17
|
+
import { reset as resetCapabilities } from "../../capability";
|
|
18
|
+
import { clearPluginRootsAndCaches, resolveActiveProjectRegistryPath } from "../../discovery/helpers";
|
|
19
|
+
import {
|
|
20
|
+
type ExtensionUIContext,
|
|
21
|
+
type ExtensionUIDialogOptions,
|
|
22
|
+
type ExtensionUISelectItem,
|
|
23
|
+
type ExtensionWidgetOptions,
|
|
24
|
+
getExtensionUISelectOptionLabel,
|
|
25
|
+
} from "../../extensibility/extensions";
|
|
26
|
+
import { buildSkillPromptMessage, parseSkillInvocation } from "../../extensibility/skills";
|
|
27
|
+
import { loadSlashCommands } from "../../extensibility/slash-commands";
|
|
28
|
+
import { type Theme, theme } from "../../modes/theme/theme";
|
|
29
|
+
import type { AgentSession } from "../../session/agent-session";
|
|
30
|
+
import { SKILL_PROMPT_MESSAGE_TYPE, USER_INTERRUPT_LABEL } from "../../session/messages";
|
|
31
|
+
import { executeAcpBuiltinSlashCommand } from "../../slash-commands/acp-builtins";
|
|
32
|
+
import { buildAvailableSlashCommands } from "../../slash-commands/available-commands";
|
|
33
|
+
import { defaultLoadModeForToolName } from "../../tools/essential-tools";
|
|
34
|
+
import type { EventBus } from "../../utils/event-bus";
|
|
35
|
+
import { calculateTokensPerSecond } from "../../utils/token-rate";
|
|
36
|
+
import { initializeExtensions } from "../runtime-init";
|
|
37
|
+
import { isRpcHostToolResult, isRpcHostToolUpdate, RpcHostToolBridge } from "./host-tools";
|
|
38
|
+
import { isRpcHostUriResult, RpcHostUriBridge } from "./host-uris";
|
|
39
|
+
import { MAX_RPC_FRAME_BYTES, MAX_RPC_REASSEMBLED_BYTES, RpcFrameEncoder } from "./rpc-frame";
|
|
40
|
+
import { claimRpcInput } from "./rpc-input";
|
|
41
|
+
import { pageRpcMessages, RPC_MESSAGES_PAGE_BUSY_ERROR, RpcMessagesPageError } from "./rpc-messages";
|
|
42
|
+
import { RpcSubagentRegistry, readRpcSubagentTranscript } from "./rpc-subagents";
|
|
43
|
+
import type {
|
|
44
|
+
RpcCommand,
|
|
45
|
+
RpcExtensionUIRequest,
|
|
46
|
+
RpcExtensionUIResponse,
|
|
47
|
+
RpcHostToolCallRequest,
|
|
48
|
+
RpcHostToolCancelRequest,
|
|
49
|
+
RpcHostToolDefinition,
|
|
50
|
+
RpcHostToolResult,
|
|
51
|
+
RpcHostToolUpdate,
|
|
52
|
+
RpcHostUriCancelRequest,
|
|
53
|
+
RpcHostUriRequest,
|
|
54
|
+
RpcHostUriResult,
|
|
55
|
+
RpcResponse,
|
|
56
|
+
RpcSessionState,
|
|
57
|
+
RpcSubagentSubscriptionLevel,
|
|
58
|
+
} from "./rpc-types";
|
|
59
|
+
|
|
60
|
+
// Re-export types for consumers
|
|
61
|
+
export type * from "./rpc-types";
|
|
62
|
+
|
|
63
|
+
export type PendingExtensionRequest = {
|
|
64
|
+
resolve: (response: RpcExtensionUIResponse) => void;
|
|
65
|
+
reject: (error: Error) => void;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/** Pending extension UI request map that can fail closed when the RPC client disconnects. */
|
|
69
|
+
export class RpcPendingExtensionRequests extends Map<string, PendingExtensionRequest> {
|
|
70
|
+
#closedError: Error | undefined;
|
|
71
|
+
|
|
72
|
+
override set(id: string, request: PendingExtensionRequest): this {
|
|
73
|
+
if (this.#closedError) {
|
|
74
|
+
request.reject(this.#closedError);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
return super.set(id, request);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Reject every active and future extension UI request. */
|
|
81
|
+
rejectAll(message: string): void {
|
|
82
|
+
if (!this.#closedError) this.#closedError = new Error(message);
|
|
83
|
+
const requests = Array.from(this.values());
|
|
84
|
+
this.clear();
|
|
85
|
+
for (const request of requests) {
|
|
86
|
+
request.reject(this.#closedError);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
type RpcOutput = (
|
|
92
|
+
obj:
|
|
93
|
+
| RpcResponse
|
|
94
|
+
| RpcExtensionUIRequest
|
|
95
|
+
| RpcHostToolCallRequest
|
|
96
|
+
| RpcHostToolCancelRequest
|
|
97
|
+
| RpcHostUriRequest
|
|
98
|
+
| RpcHostUriCancelRequest
|
|
99
|
+
| object,
|
|
100
|
+
) => void;
|
|
101
|
+
|
|
102
|
+
export type RpcSessionChangeCommand = Extract<
|
|
103
|
+
RpcCommand,
|
|
104
|
+
{ type: "new_session" } | { type: "switch_session" } | { type: "branch" }
|
|
105
|
+
>;
|
|
106
|
+
|
|
107
|
+
export type RpcSessionChangeResult =
|
|
108
|
+
| { type: "new_session"; data: { cancelled: boolean } }
|
|
109
|
+
| { type: "switch_session"; data: { cancelled: boolean } }
|
|
110
|
+
| { type: "branch"; data: { text: string; cancelled: boolean } };
|
|
111
|
+
|
|
112
|
+
export type RpcSessionChangeSession = Pick<AgentSession, "newSession" | "switchSession" | "branch">;
|
|
113
|
+
|
|
114
|
+
export type RpcSkillCommandSession = Pick<AgentSession, "promptCustomMessage" | "skills" | "skillsSettings">;
|
|
115
|
+
export type RpcSkillCommandResult = { agentInvoked: true };
|
|
116
|
+
|
|
117
|
+
export async function tryRunRpcSkillCommand(
|
|
118
|
+
session: RpcSkillCommandSession,
|
|
119
|
+
text: string,
|
|
120
|
+
streamingBehavior: "steer" | "followUp" = "steer",
|
|
121
|
+
): Promise<RpcSkillCommandResult | false> {
|
|
122
|
+
if (!session.skillsSettings?.enableSkillCommands) return false;
|
|
123
|
+
const parsed = parseSkillInvocation(text);
|
|
124
|
+
if (!parsed) return false;
|
|
125
|
+
const skill = session.skills.find(candidate => candidate.name === parsed.name);
|
|
126
|
+
if (!skill) return false;
|
|
127
|
+
const built = await buildSkillPromptMessage(skill, parsed.args, "user");
|
|
128
|
+
await session.promptCustomMessage(
|
|
129
|
+
{
|
|
130
|
+
customType: SKILL_PROMPT_MESSAGE_TYPE,
|
|
131
|
+
content: built.message,
|
|
132
|
+
display: true,
|
|
133
|
+
details: built.details,
|
|
134
|
+
attribution: "user",
|
|
135
|
+
},
|
|
136
|
+
{ streamingBehavior },
|
|
137
|
+
);
|
|
138
|
+
return { agentInvoked: true };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function reportLocalOnlyPromptResult(input: {
|
|
142
|
+
id: string | undefined;
|
|
143
|
+
prompt: Promise<boolean>;
|
|
144
|
+
output: (obj: object) => void;
|
|
145
|
+
onError: (error: Error) => void;
|
|
146
|
+
hasExtensionAgentMessageTask?: () => boolean;
|
|
147
|
+
waitForExtensionAgentMessageTasks?: () => Promise<void>;
|
|
148
|
+
}): void {
|
|
149
|
+
void input.prompt
|
|
150
|
+
.then(async agentInvoked => {
|
|
151
|
+
if (agentInvoked) return;
|
|
152
|
+
await input.waitForExtensionAgentMessageTasks?.();
|
|
153
|
+
if (!input.hasExtensionAgentMessageTask?.()) {
|
|
154
|
+
input.output({ type: "prompt_result", id: input.id, agentInvoked: false });
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
.catch(error => {
|
|
158
|
+
input.onError(error instanceof Error ? error : new Error(String(error)));
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
type RpcExtensionUserMessageScope = {
|
|
163
|
+
hasAgentMessageTask: boolean;
|
|
164
|
+
pendingAgentMessageTasks: Set<Promise<void>>;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Tracks extension-originated messages while an RPC prompt is executing.
|
|
169
|
+
* A slash command can resolve the outer prompt as local-only while also
|
|
170
|
+
* scheduling agent work through pi.sendUserMessage() or pi.sendMessage()
|
|
171
|
+
* with triggerTurn; that prompt must not report agentInvoked:false to the host.
|
|
172
|
+
*/
|
|
173
|
+
export class RpcExtensionUserMessageTracker {
|
|
174
|
+
#activePromptScopes = new Set<RpcExtensionUserMessageScope>();
|
|
175
|
+
|
|
176
|
+
markAgentMessageTask(): void {
|
|
177
|
+
for (const scope of this.#activePromptScopes) {
|
|
178
|
+
scope.hasAgentMessageTask = true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
trackAgentMessageTask(task: Promise<unknown>): void {
|
|
183
|
+
for (const scope of this.#activePromptScopes) {
|
|
184
|
+
this.#trackAgentMessageTaskForScope(scope, task);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
#trackAgentMessageTaskForScope(scope: RpcExtensionUserMessageScope, task: Promise<unknown>): void {
|
|
189
|
+
const scopedTask = task.then(
|
|
190
|
+
() => {
|
|
191
|
+
scope.hasAgentMessageTask = true;
|
|
192
|
+
},
|
|
193
|
+
() => {},
|
|
194
|
+
);
|
|
195
|
+
scope.pendingAgentMessageTasks.add(scopedTask);
|
|
196
|
+
void scopedTask.finally(() => {
|
|
197
|
+
scope.pendingAgentMessageTasks.delete(scopedTask);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async #waitForAgentMessageTasks(scope: RpcExtensionUserMessageScope): Promise<void> {
|
|
202
|
+
while (scope.pendingAgentMessageTasks.size > 0) {
|
|
203
|
+
await Promise.allSettled(Array.from(scope.pendingAgentMessageTasks));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
watchPrompt<T>(startPrompt: () => Promise<T>): {
|
|
208
|
+
prompt: Promise<T>;
|
|
209
|
+
hasAgentMessageTask: () => boolean;
|
|
210
|
+
waitForAgentMessageTasks: () => Promise<void>;
|
|
211
|
+
} {
|
|
212
|
+
const scope: RpcExtensionUserMessageScope = {
|
|
213
|
+
hasAgentMessageTask: false,
|
|
214
|
+
pendingAgentMessageTasks: new Set(),
|
|
215
|
+
};
|
|
216
|
+
this.#activePromptScopes.add(scope);
|
|
217
|
+
let prompt: Promise<T>;
|
|
218
|
+
try {
|
|
219
|
+
prompt = startPrompt();
|
|
220
|
+
} catch (error) {
|
|
221
|
+
this.#activePromptScopes.delete(scope);
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
prompt: prompt.finally(() => {
|
|
226
|
+
this.#activePromptScopes.delete(scope);
|
|
227
|
+
}),
|
|
228
|
+
hasAgentMessageTask: () => scope.hasAgentMessageTask,
|
|
229
|
+
waitForAgentMessageTasks: () => this.#waitForAgentMessageTasks(scope),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function watchAndReportLocalOnlyPromptResult(input: {
|
|
235
|
+
id: string | undefined;
|
|
236
|
+
startPrompt: () => Promise<boolean>;
|
|
237
|
+
output: (obj: object) => void;
|
|
238
|
+
onError: (error: Error) => void;
|
|
239
|
+
extensionUserMessageTracker: RpcExtensionUserMessageTracker;
|
|
240
|
+
}): void {
|
|
241
|
+
const trackedPrompt = input.extensionUserMessageTracker.watchPrompt(input.startPrompt);
|
|
242
|
+
reportLocalOnlyPromptResult({
|
|
243
|
+
id: input.id,
|
|
244
|
+
prompt: trackedPrompt.prompt,
|
|
245
|
+
output: input.output,
|
|
246
|
+
onError: input.onError,
|
|
247
|
+
hasExtensionAgentMessageTask: trackedPrompt.hasAgentMessageTask,
|
|
248
|
+
waitForExtensionAgentMessageTasks: trackedPrompt.waitForAgentMessageTasks,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Dependencies for {@link dispatchRpcInputFrame}. Provided by the RPC mode
|
|
254
|
+
* entrypoint; broken out so tests can drive the input loop with stubs.
|
|
255
|
+
*/
|
|
256
|
+
export interface RpcInputFrameDeps {
|
|
257
|
+
handleCommand: (command: RpcCommand) => Promise<RpcResponse>;
|
|
258
|
+
output: RpcOutput;
|
|
259
|
+
errorResponse: (id: string | undefined, command: string, message: string) => RpcResponse;
|
|
260
|
+
trackBackgroundTask?: (task: Promise<void>) => void;
|
|
261
|
+
pendingExtensionRequests: Map<string, PendingExtensionRequest>;
|
|
262
|
+
onHostToolResult: (frame: RpcHostToolResult) => void;
|
|
263
|
+
onHostToolUpdate: (frame: RpcHostToolUpdate) => void;
|
|
264
|
+
onHostUriResult: (frame: RpcHostUriResult) => void;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Structural guard for a well-formed extension UI response frame. Mirrors the
|
|
269
|
+
* shape declared in {@link RpcExtensionUIResponse} — a truthy record with
|
|
270
|
+
* `type === "extension_ui_response"` and a string `id`. Payload variants (value,
|
|
271
|
+
* confirmed, cancelled) are validated at the read site.
|
|
272
|
+
*/
|
|
273
|
+
function isRpcExtensionUIResponse(value: unknown): value is RpcExtensionUIResponse {
|
|
274
|
+
if (!isRecord(value)) return false;
|
|
275
|
+
return value.type === "extension_ui_response" && typeof value.id === "string";
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Dispatch side-channel frames that must overtake the serialized command queue. */
|
|
279
|
+
export function dispatchRpcControlFrame(parsed: unknown, deps: RpcInputFrameDeps): boolean {
|
|
280
|
+
if (isRpcExtensionUIResponse(parsed)) {
|
|
281
|
+
const pending = deps.pendingExtensionRequests.get(parsed.id);
|
|
282
|
+
if (pending) pending.resolve(parsed);
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (isRpcHostToolResult(parsed)) {
|
|
287
|
+
deps.onHostToolResult(parsed);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (isRpcHostToolUpdate(parsed)) {
|
|
292
|
+
deps.onHostToolUpdate(parsed);
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (isRpcHostUriResult(parsed)) {
|
|
297
|
+
deps.onHostUriResult(parsed);
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Dispatch a single parsed frame from the RPC input stream.
|
|
306
|
+
*
|
|
307
|
+
* Bash commands are dispatched in the background so the caller can keep reading
|
|
308
|
+
* subsequent frames while a shell command is still running. This lets a client
|
|
309
|
+
* send `abort_bash` while a long-running `bash` is in flight. Response
|
|
310
|
+
* correlation is preserved via each command's `id`; ordering across concurrent
|
|
311
|
+
* commands is not guaranteed and clients MUST match on `id`.
|
|
312
|
+
*
|
|
313
|
+
* @returns `undefined` when the frame was routed to a side-channel handler
|
|
314
|
+
* (extension UI response, host tool/URI frames) or dispatched in the
|
|
315
|
+
* background (`bash`). Otherwise a promise that resolves once the response
|
|
316
|
+
* for the command has been emitted via `output`. Errors from `handleCommand`
|
|
317
|
+
* on non-`bash` commands propagate; the caller is expected to wrap them.
|
|
318
|
+
*/
|
|
319
|
+
export function dispatchRpcInputFrame(parsed: unknown, deps: RpcInputFrameDeps): Promise<void> | undefined {
|
|
320
|
+
if (dispatchRpcControlFrame(parsed, deps)) return undefined;
|
|
321
|
+
// Regular RPC command. The transport contract states each remaining frame
|
|
322
|
+
// is an {@link RpcCommand}; `handleCommand`'s `default` arm surfaces
|
|
323
|
+
// unknown discriminants as an error response, so we do not shape-check
|
|
324
|
+
// the union here.
|
|
325
|
+
const command = parsed as RpcCommand;
|
|
326
|
+
|
|
327
|
+
// `bash` can run for a long time. Dispatch it in the background so a
|
|
328
|
+
// subsequent `abort_bash` frame can be read and handled without waiting
|
|
329
|
+
// for the shell command to finish on its own. The response is emitted
|
|
330
|
+
// when `handleCommand` resolves; clients correlate via `command.id`.
|
|
331
|
+
if (command.type === "bash") {
|
|
332
|
+
const task = (async () => {
|
|
333
|
+
try {
|
|
334
|
+
deps.output(await deps.handleCommand(command));
|
|
335
|
+
} catch (err: unknown) {
|
|
336
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
337
|
+
deps.output(deps.errorResponse(command.id, "bash", message));
|
|
338
|
+
}
|
|
339
|
+
})();
|
|
340
|
+
deps.trackBackgroundTask?.(task);
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return (async () => {
|
|
345
|
+
deps.output(await deps.handleCommand(command));
|
|
346
|
+
})();
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** Serializes ordinary RPC commands while allowing control frames to dispatch immediately. */
|
|
350
|
+
export class RpcInputDispatcher {
|
|
351
|
+
#tail: Promise<void> = Promise.resolve();
|
|
352
|
+
#tasks = new Set<Promise<void>>();
|
|
353
|
+
readonly #deps: RpcInputFrameDeps;
|
|
354
|
+
readonly #afterSerialCommand: (() => Promise<void>) | undefined;
|
|
355
|
+
|
|
356
|
+
constructor(options: { deps: RpcInputFrameDeps; afterSerialCommand?: () => Promise<void> }) {
|
|
357
|
+
this.#deps = options.deps;
|
|
358
|
+
this.#afterSerialCommand = options.afterSerialCommand;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/** Accept a parsed input frame without blocking the stdin reader. */
|
|
362
|
+
dispatch(parsed: unknown): void {
|
|
363
|
+
try {
|
|
364
|
+
if (dispatchRpcControlFrame(parsed, this.#deps)) return;
|
|
365
|
+
|
|
366
|
+
const command = parsed as RpcCommand;
|
|
367
|
+
if (command.type === "bash") {
|
|
368
|
+
dispatchRpcInputFrame(command, this.#deps);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const task = this.#tail.then(
|
|
373
|
+
() => this.#dispatchSerialCommand(command),
|
|
374
|
+
() => this.#dispatchSerialCommand(command),
|
|
375
|
+
);
|
|
376
|
+
this.#tail = task.catch(() => {});
|
|
377
|
+
this.#tasks.add(task);
|
|
378
|
+
void task.finally(() => {
|
|
379
|
+
this.#tasks.delete(task);
|
|
380
|
+
});
|
|
381
|
+
} catch (err: unknown) {
|
|
382
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
383
|
+
this.#deps.output(this.#deps.errorResponse(undefined, "parse", `Failed to parse command: ${message}`));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/** Await every accepted serial command, including commands queued before EOF. */
|
|
388
|
+
async drain(): Promise<void> {
|
|
389
|
+
while (this.#tasks.size > 0) {
|
|
390
|
+
await Promise.allSettled(Array.from(this.#tasks));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
async #dispatchSerialCommand(command: RpcCommand): Promise<void> {
|
|
395
|
+
try {
|
|
396
|
+
const awaited = dispatchRpcInputFrame(command, this.#deps);
|
|
397
|
+
if (awaited) await awaited;
|
|
398
|
+
} catch (err: unknown) {
|
|
399
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
400
|
+
this.#deps.output(this.#deps.errorResponse(command.id, command.type, message));
|
|
401
|
+
} finally {
|
|
402
|
+
await this.#afterSerialCommand?.();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Coordinates deferred shutdown with in-flight background input tasks.
|
|
409
|
+
*
|
|
410
|
+
* `pi.shutdown()` from an extension only *requests* shutdown; the process must
|
|
411
|
+
* not exit while a background-dispatched command (`bash`, see
|
|
412
|
+
* {@link dispatchRpcInputFrame}) still owes the client a response frame. The
|
|
413
|
+
* coordinator tracks those tasks, re-checks the shutdown request whenever one
|
|
414
|
+
* settles (covering a shutdown requested mid-bash with no follow-up client
|
|
415
|
+
* frame), and drains every tracked task before invoking `performShutdown`.
|
|
416
|
+
* The shutdown sequence is latched so concurrent triggers (input loop and
|
|
417
|
+
* settling tasks) run it exactly once.
|
|
418
|
+
*/
|
|
419
|
+
export class RpcShutdownCoordinator {
|
|
420
|
+
#tasks = new Set<Promise<void>>();
|
|
421
|
+
#shutdown: Promise<void> | undefined;
|
|
422
|
+
readonly #isShutdownRequested: () => boolean;
|
|
423
|
+
readonly #performShutdown: () => Promise<void>;
|
|
424
|
+
|
|
425
|
+
constructor(options: { isShutdownRequested: () => boolean; performShutdown: () => Promise<void> }) {
|
|
426
|
+
this.#isShutdownRequested = options.isShutdownRequested;
|
|
427
|
+
this.#performShutdown = options.performShutdown;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Track a background input task. When it settles it is untracked and the
|
|
432
|
+
* shutdown request is re-checked, so a deferred shutdown fires even when
|
|
433
|
+
* no further client frames arrive.
|
|
434
|
+
*/
|
|
435
|
+
track(task: Promise<void>): void {
|
|
436
|
+
this.#tasks.add(task);
|
|
437
|
+
void task.finally(() => {
|
|
438
|
+
this.#tasks.delete(task);
|
|
439
|
+
// Fire-and-forget: performShutdown ends the process. Rejections are
|
|
440
|
+
// not expected — hook errors are caught inside extensionRunner.emit,
|
|
441
|
+
// and background tasks catch their own dispatch errors.
|
|
442
|
+
void this.checkShutdownRequested();
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** Await every tracked task, including tasks tracked while draining. */
|
|
447
|
+
async drain(): Promise<void> {
|
|
448
|
+
while (this.#tasks.size > 0) {
|
|
449
|
+
await Promise.allSettled(Array.from(this.#tasks));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* If shutdown was requested, drain background tasks (so every owed
|
|
455
|
+
* response frame is written) before running the shutdown sequence.
|
|
456
|
+
*/
|
|
457
|
+
checkShutdownRequested(): Promise<void> {
|
|
458
|
+
if (!this.#shutdown) {
|
|
459
|
+
if (!this.#isShutdownRequested()) return Promise.resolve();
|
|
460
|
+
this.#shutdown = this.drain().then(() => this.#performShutdown());
|
|
461
|
+
}
|
|
462
|
+
return this.#shutdown;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export type RpcSubagentResetRegistry = Pick<RpcSubagentRegistry, "clear">;
|
|
467
|
+
|
|
468
|
+
export async function handleRpcSessionChange(
|
|
469
|
+
session: RpcSessionChangeSession,
|
|
470
|
+
command: RpcSessionChangeCommand,
|
|
471
|
+
subagentRegistry?: RpcSubagentResetRegistry,
|
|
472
|
+
): Promise<RpcSessionChangeResult> {
|
|
473
|
+
switch (command.type) {
|
|
474
|
+
case "new_session": {
|
|
475
|
+
const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
|
|
476
|
+
const cancelled = !(await session.newSession(options));
|
|
477
|
+
if (!cancelled) subagentRegistry?.clear();
|
|
478
|
+
return { type: "new_session", data: { cancelled } };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
case "switch_session": {
|
|
482
|
+
const cancelled = !(await session.switchSession(command.sessionPath));
|
|
483
|
+
if (!cancelled) subagentRegistry?.clear();
|
|
484
|
+
return { type: "switch_session", data: { cancelled } };
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
case "branch": {
|
|
488
|
+
const result = await session.branch(command.entryId);
|
|
489
|
+
if (!result.cancelled) subagentRegistry?.clear();
|
|
490
|
+
return { type: "branch", data: { text: result.selectedText, cancelled: result.cancelled } };
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
throw new Error("Unsupported RPC session change command");
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function normalizeHostToolDefinitions(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
|
|
497
|
+
return tools.map((tool, index) => {
|
|
498
|
+
const name = typeof tool.name === "string" ? tool.name.trim() : "";
|
|
499
|
+
if (!name) {
|
|
500
|
+
throw new Error(`Host tool at index ${index} must provide a non-empty name`);
|
|
501
|
+
}
|
|
502
|
+
const description = typeof tool.description === "string" ? tool.description.trim() : "";
|
|
503
|
+
if (!description) {
|
|
504
|
+
throw new Error(`Host tool "${name}" must provide a non-empty description`);
|
|
505
|
+
}
|
|
506
|
+
if (!tool.parameters || typeof tool.parameters !== "object" || Array.isArray(tool.parameters)) {
|
|
507
|
+
throw new Error(`Host tool "${name}" must provide a JSON Schema object`);
|
|
508
|
+
}
|
|
509
|
+
const label = typeof tool.label === "string" && tool.label.trim() ? tool.label.trim() : name;
|
|
510
|
+
return {
|
|
511
|
+
name,
|
|
512
|
+
label,
|
|
513
|
+
description,
|
|
514
|
+
parameters: tool.parameters,
|
|
515
|
+
hidden: tool.hidden === true,
|
|
516
|
+
loadMode: defaultLoadModeForToolName(name, tool.loadMode),
|
|
517
|
+
};
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function parseValueDialogResponse(
|
|
522
|
+
response: RpcExtensionUIResponse,
|
|
523
|
+
dialogOptions: ExtensionUIDialogOptions | undefined,
|
|
524
|
+
): string | undefined {
|
|
525
|
+
if ("cancelled" in response && response.cancelled) {
|
|
526
|
+
if (response.timedOut) dialogOptions?.onTimeout?.();
|
|
527
|
+
return undefined;
|
|
528
|
+
}
|
|
529
|
+
if ("value" in response) return response.value;
|
|
530
|
+
return undefined;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
function shouldEmitRpcTitles(): boolean {
|
|
534
|
+
const raw = $env.PI_RPC_EMIT_TITLE;
|
|
535
|
+
if (!raw) return false;
|
|
536
|
+
const normalized = raw.trim().toLowerCase();
|
|
537
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
function isSubagentSubscriptionLevel(value: unknown): value is RpcSubagentSubscriptionLevel {
|
|
541
|
+
return value === "off" || value === "progress" || value === "events";
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
export function requestRpcEditor(
|
|
545
|
+
pendingRequests: Map<string, PendingExtensionRequest>,
|
|
546
|
+
output: RpcOutput,
|
|
547
|
+
title: string,
|
|
548
|
+
prefill?: string,
|
|
549
|
+
dialogOptions?: ExtensionUIDialogOptions,
|
|
550
|
+
editorOptions?: { promptStyle?: boolean },
|
|
551
|
+
): Promise<string | undefined> {
|
|
552
|
+
if (dialogOptions?.signal?.aborted) return Promise.resolve(undefined);
|
|
553
|
+
|
|
554
|
+
const id = Snowflake.next() as string;
|
|
555
|
+
const { promise, resolve, reject } = Promise.withResolvers<string | undefined>();
|
|
556
|
+
let settled = false;
|
|
557
|
+
|
|
558
|
+
const cleanup = () => {
|
|
559
|
+
dialogOptions?.signal?.removeEventListener("abort", onAbort);
|
|
560
|
+
pendingRequests.delete(id);
|
|
561
|
+
};
|
|
562
|
+
const finish = (value: string | undefined) => {
|
|
563
|
+
if (settled) return;
|
|
564
|
+
settled = true;
|
|
565
|
+
cleanup();
|
|
566
|
+
resolve(value);
|
|
567
|
+
};
|
|
568
|
+
const fail = (error: Error) => {
|
|
569
|
+
if (settled) return;
|
|
570
|
+
settled = true;
|
|
571
|
+
cleanup();
|
|
572
|
+
reject(error);
|
|
573
|
+
};
|
|
574
|
+
const onAbort = () => {
|
|
575
|
+
output({
|
|
576
|
+
type: "extension_ui_request",
|
|
577
|
+
id: Snowflake.next() as string,
|
|
578
|
+
method: "cancel",
|
|
579
|
+
targetId: id,
|
|
580
|
+
} as RpcExtensionUIRequest);
|
|
581
|
+
finish(undefined);
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
dialogOptions?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
585
|
+
pendingRequests.set(id, {
|
|
586
|
+
resolve: response => {
|
|
587
|
+
if ("cancelled" in response && response.cancelled) {
|
|
588
|
+
finish(undefined);
|
|
589
|
+
} else if ("value" in response) {
|
|
590
|
+
finish(response.value);
|
|
591
|
+
} else {
|
|
592
|
+
finish(undefined);
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
reject: fail,
|
|
596
|
+
});
|
|
597
|
+
output({
|
|
598
|
+
type: "extension_ui_request",
|
|
599
|
+
id,
|
|
600
|
+
method: "editor",
|
|
601
|
+
title,
|
|
602
|
+
prefill,
|
|
603
|
+
promptStyle: editorOptions?.promptStyle,
|
|
604
|
+
} as RpcExtensionUIRequest);
|
|
605
|
+
return promise;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/** Sends an RPC extension dialog and cancels the remote presentation when its signal aborts. */
|
|
609
|
+
export function requestRpcDialog<T>(
|
|
610
|
+
pendingRequests: Map<string, PendingExtensionRequest>,
|
|
611
|
+
output: RpcOutput,
|
|
612
|
+
opts: ExtensionUIDialogOptions | undefined,
|
|
613
|
+
defaultValue: T,
|
|
614
|
+
request: Record<string, unknown>,
|
|
615
|
+
parseResponse: (response: RpcExtensionUIResponse) => T,
|
|
616
|
+
): Promise<T> {
|
|
617
|
+
if (opts?.signal?.aborted) return Promise.resolve(defaultValue);
|
|
618
|
+
|
|
619
|
+
const id = Snowflake.next() as string;
|
|
620
|
+
const { promise, resolve, reject } = Promise.withResolvers<T>();
|
|
621
|
+
let timeoutId: NodeJS.Timeout | undefined;
|
|
622
|
+
|
|
623
|
+
const cleanup = () => {
|
|
624
|
+
clearTimeout(timeoutId);
|
|
625
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
626
|
+
pendingRequests.delete(id);
|
|
627
|
+
};
|
|
628
|
+
const onAbort = () => {
|
|
629
|
+
output({
|
|
630
|
+
type: "extension_ui_request",
|
|
631
|
+
id: Snowflake.next() as string,
|
|
632
|
+
method: "cancel",
|
|
633
|
+
targetId: id,
|
|
634
|
+
} as RpcExtensionUIRequest);
|
|
635
|
+
cleanup();
|
|
636
|
+
resolve(defaultValue);
|
|
637
|
+
};
|
|
638
|
+
opts?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
639
|
+
|
|
640
|
+
if (opts?.timeout !== undefined) {
|
|
641
|
+
timeoutId = setTimeout(() => {
|
|
642
|
+
opts.onTimeout?.();
|
|
643
|
+
cleanup();
|
|
644
|
+
resolve(defaultValue);
|
|
645
|
+
}, opts.timeout);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
pendingRequests.set(id, {
|
|
649
|
+
resolve: response => {
|
|
650
|
+
cleanup();
|
|
651
|
+
resolve(parseResponse(response));
|
|
652
|
+
},
|
|
653
|
+
reject,
|
|
654
|
+
});
|
|
655
|
+
output({ type: "extension_ui_request", id, ...request } as RpcExtensionUIRequest);
|
|
656
|
+
return promise;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Run in RPC mode.
|
|
660
|
+
* Listens for JSON commands on stdin, outputs events and responses on stdout.
|
|
661
|
+
*/
|
|
662
|
+
export async function runRpcMode(
|
|
663
|
+
session: AgentSession,
|
|
664
|
+
setToolUIContext?: (uiContext: ExtensionUIContext, hasUI: boolean) => void,
|
|
665
|
+
eventBus?: EventBus,
|
|
666
|
+
input: ReadableStream<Uint8Array> = claimRpcInput(),
|
|
667
|
+
): Promise<never> {
|
|
668
|
+
// Signal to RPC clients that the server is ready to accept commands
|
|
669
|
+
// Suppress terminal notifications: they write \x07 (BEL) or OSC sequences directly to
|
|
670
|
+
// process.stdout with no newline, which the reader merges with the next JSON line and
|
|
671
|
+
// breaks JSON.parse. In RPC mode stdout is the JSON protocol channel — nothing else
|
|
672
|
+
// may write there.
|
|
673
|
+
process.env.PI_NOTIFICATIONS = "off";
|
|
674
|
+
|
|
675
|
+
const frameEncoder = new RpcFrameEncoder();
|
|
676
|
+
// Ordered stdout writer honoring backpressure: chunked v2 frames are produced
|
|
677
|
+
// lazily by the encoder and written one physical line at a time, so a near-limit
|
|
678
|
+
// logical frame never materializes its full base64 transport in memory.
|
|
679
|
+
let stdoutQueue: Promise<void> = Promise.resolve();
|
|
680
|
+
const writeFrames = (frames: Iterable<string>) => {
|
|
681
|
+
stdoutQueue = stdoutQueue
|
|
682
|
+
.then(async () => {
|
|
683
|
+
for (const line of frames) {
|
|
684
|
+
if (!process.stdout.write(line)) await once(process.stdout, "drain");
|
|
685
|
+
}
|
|
686
|
+
})
|
|
687
|
+
// stdout gone (host exited) — nothing left to deliver; keep the queue alive.
|
|
688
|
+
.catch(() => {});
|
|
689
|
+
};
|
|
690
|
+
writeFrames(
|
|
691
|
+
frameEncoder.encodeFrames({
|
|
692
|
+
type: "ready",
|
|
693
|
+
protocolVersion: 1,
|
|
694
|
+
supportedProtocolVersions: [1, 2],
|
|
695
|
+
maxFrameBytes: MAX_RPC_FRAME_BYTES,
|
|
696
|
+
maxReassembledFrameBytes: MAX_RPC_REASSEMBLED_BYTES,
|
|
697
|
+
}),
|
|
698
|
+
);
|
|
699
|
+
const output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {
|
|
700
|
+
writeFrames(frameEncoder.encodeFrames(obj));
|
|
701
|
+
if (isRecord(obj) && obj.type === "response" && obj.command === "negotiate_protocol" && obj.success === true)
|
|
702
|
+
frameEncoder.setProtocolVersion(2);
|
|
703
|
+
};
|
|
704
|
+
const emitRpcTitles = shouldEmitRpcTitles();
|
|
705
|
+
|
|
706
|
+
const success = <T extends RpcCommand["type"]>(
|
|
707
|
+
id: string | undefined,
|
|
708
|
+
command: T,
|
|
709
|
+
data?: object | null,
|
|
710
|
+
): RpcResponse => {
|
|
711
|
+
if (data === undefined) {
|
|
712
|
+
return { id, type: "response", command, success: true } as RpcResponse;
|
|
713
|
+
}
|
|
714
|
+
return { id, type: "response", command, success: true, data } as RpcResponse;
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
const error = (id: string | undefined, command: string, message: string, code?: string): RpcResponse => {
|
|
718
|
+
return { id, type: "response", command, success: false, error: message, ...(code ? { code } : {}) };
|
|
719
|
+
};
|
|
720
|
+
|
|
721
|
+
const extensionUserMessageTracker = new RpcExtensionUserMessageTracker();
|
|
722
|
+
|
|
723
|
+
const pendingExtensionRequests = new RpcPendingExtensionRequests();
|
|
724
|
+
const hostToolBridge = new RpcHostToolBridge(output);
|
|
725
|
+
const hostUriBridge = new RpcHostUriBridge(output);
|
|
726
|
+
const subagentRegistry = eventBus ? new RpcSubagentRegistry(eventBus, output) : undefined;
|
|
727
|
+
|
|
728
|
+
// Shutdown request flag (wrapped in object to allow mutation with const)
|
|
729
|
+
const shutdownState = { requested: false };
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Extension UI context that uses the RPC protocol.
|
|
733
|
+
*/
|
|
734
|
+
class RpcExtensionUIContext implements ExtensionUIContext {
|
|
735
|
+
constructor(
|
|
736
|
+
private pendingRequests: Map<string, PendingExtensionRequest>,
|
|
737
|
+
private output: (obj: RpcResponse | RpcExtensionUIRequest | object) => void,
|
|
738
|
+
) {}
|
|
739
|
+
|
|
740
|
+
select(
|
|
741
|
+
title: string,
|
|
742
|
+
options: ExtensionUISelectItem[],
|
|
743
|
+
dialogOptions?: ExtensionUIDialogOptions,
|
|
744
|
+
): Promise<string | undefined> {
|
|
745
|
+
return requestRpcDialog(
|
|
746
|
+
this.pendingRequests,
|
|
747
|
+
this.output,
|
|
748
|
+
dialogOptions,
|
|
749
|
+
undefined,
|
|
750
|
+
{
|
|
751
|
+
method: "select",
|
|
752
|
+
title,
|
|
753
|
+
options: options.map(getExtensionUISelectOptionLabel),
|
|
754
|
+
timeout: dialogOptions?.timeout,
|
|
755
|
+
},
|
|
756
|
+
response => parseValueDialogResponse(response, dialogOptions),
|
|
757
|
+
);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
confirm(title: string, message: string, dialogOptions?: ExtensionUIDialogOptions): Promise<boolean> {
|
|
761
|
+
return requestRpcDialog(
|
|
762
|
+
this.pendingRequests,
|
|
763
|
+
this.output,
|
|
764
|
+
dialogOptions,
|
|
765
|
+
false,
|
|
766
|
+
{ method: "confirm", title, message, timeout: dialogOptions?.timeout },
|
|
767
|
+
response => {
|
|
768
|
+
if ("cancelled" in response && response.cancelled) {
|
|
769
|
+
if (response.timedOut) dialogOptions?.onTimeout?.();
|
|
770
|
+
return false;
|
|
771
|
+
}
|
|
772
|
+
if ("confirmed" in response) return response.confirmed;
|
|
773
|
+
return false;
|
|
774
|
+
},
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
input(
|
|
779
|
+
title: string,
|
|
780
|
+
placeholder?: string,
|
|
781
|
+
dialogOptions?: ExtensionUIDialogOptions,
|
|
782
|
+
): Promise<string | undefined> {
|
|
783
|
+
return requestRpcDialog(
|
|
784
|
+
this.pendingRequests,
|
|
785
|
+
this.output,
|
|
786
|
+
dialogOptions,
|
|
787
|
+
undefined,
|
|
788
|
+
{ method: "input", title, placeholder, timeout: dialogOptions?.timeout },
|
|
789
|
+
response => parseValueDialogResponse(response, dialogOptions),
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
onTerminalInput(): () => void {
|
|
794
|
+
// Raw terminal input not supported in RPC mode
|
|
795
|
+
return () => {};
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
notify(message: string, type?: "info" | "warning" | "error"): void {
|
|
799
|
+
// Fire and forget - no response needed
|
|
800
|
+
this.output({
|
|
801
|
+
type: "extension_ui_request",
|
|
802
|
+
id: Snowflake.next() as string,
|
|
803
|
+
method: "notify",
|
|
804
|
+
message,
|
|
805
|
+
notifyType: type,
|
|
806
|
+
} as RpcExtensionUIRequest);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
setStatus(key: string, text: string | undefined): void {
|
|
810
|
+
// Fire and forget - no response needed
|
|
811
|
+
this.output({
|
|
812
|
+
type: "extension_ui_request",
|
|
813
|
+
id: Snowflake.next() as string,
|
|
814
|
+
method: "setStatus",
|
|
815
|
+
statusKey: key,
|
|
816
|
+
statusText: text,
|
|
817
|
+
} as RpcExtensionUIRequest);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
setWorkingMessage(_message?: string): void {
|
|
821
|
+
// Not supported in RPC mode
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
setWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {
|
|
825
|
+
// Only support string arrays in RPC mode - factory functions are ignored
|
|
826
|
+
if (content === undefined || Array.isArray(content)) {
|
|
827
|
+
this.output({
|
|
828
|
+
type: "extension_ui_request",
|
|
829
|
+
id: Snowflake.next() as string,
|
|
830
|
+
method: "setWidget",
|
|
831
|
+
widgetKey: key,
|
|
832
|
+
widgetLines: content as string[] | undefined,
|
|
833
|
+
widgetPlacement: options?.placement,
|
|
834
|
+
} as RpcExtensionUIRequest);
|
|
835
|
+
}
|
|
836
|
+
// Component factories are not supported in RPC mode - would need TUI access
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
setFooter(_factory: unknown): void {
|
|
840
|
+
// Custom footer not supported in RPC mode - requires TUI access
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
setHeader(_factory: unknown): void {
|
|
844
|
+
// Custom header not supported in RPC mode - requires TUI access
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
setTitle(title: string): void {
|
|
848
|
+
// Title updates are low-value noise for most RPC hosts; opt in via PI_RPC_EMIT_TITLE=1.
|
|
849
|
+
if (!emitRpcTitles) return;
|
|
850
|
+
this.output({
|
|
851
|
+
type: "extension_ui_request",
|
|
852
|
+
id: Snowflake.next() as string,
|
|
853
|
+
method: "setTitle",
|
|
854
|
+
title,
|
|
855
|
+
} as RpcExtensionUIRequest);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
async custom(): Promise<never> {
|
|
859
|
+
// Custom UI not supported in RPC mode
|
|
860
|
+
return undefined as never;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
pasteToEditor(text: string): void {
|
|
864
|
+
// Paste handling not supported in RPC mode - falls back to setEditorText
|
|
865
|
+
this.setEditorText(text);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
setEditorText(text: string): void {
|
|
869
|
+
// Fire and forget - host can implement editor control
|
|
870
|
+
this.output({
|
|
871
|
+
type: "extension_ui_request",
|
|
872
|
+
id: Snowflake.next() as string,
|
|
873
|
+
method: "set_editor_text",
|
|
874
|
+
text,
|
|
875
|
+
} as RpcExtensionUIRequest);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
getEditorText(): string {
|
|
879
|
+
// Synchronous method can't wait for RPC response
|
|
880
|
+
// Host should track editor state locally if needed
|
|
881
|
+
return "";
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
async editor(
|
|
885
|
+
title: string,
|
|
886
|
+
prefill?: string,
|
|
887
|
+
dialogOptions?: ExtensionUIDialogOptions,
|
|
888
|
+
editorOptions?: { promptStyle?: boolean },
|
|
889
|
+
): Promise<string | undefined> {
|
|
890
|
+
return requestRpcEditor(this.pendingRequests, this.output, title, prefill, dialogOptions, editorOptions);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
addAutocompleteProvider(): void {
|
|
894
|
+
// Autocomplete provider composition is not supported in RPC mode
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
get theme(): Theme {
|
|
898
|
+
return theme;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
getAllThemes(): Promise<{ name: string; path: string | undefined }[]> {
|
|
902
|
+
return Promise.resolve([]);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
getTheme(_name: string): Promise<Theme | undefined> {
|
|
906
|
+
return Promise.resolve(undefined);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
setTheme(_theme: string | Theme): Promise<{ success: boolean; error?: string }> {
|
|
910
|
+
// Theme switching not supported in RPC mode
|
|
911
|
+
return Promise.resolve({ success: false, error: "Theme switching not supported in RPC mode" });
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
getToolsExpanded() {
|
|
915
|
+
// Tool expansion not supported in RPC mode - no TUI
|
|
916
|
+
return false;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
setToolsExpanded(_expanded: boolean) {
|
|
920
|
+
// Tool expansion not supported in RPC mode - no TUI
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
setEditorComponent(): void {
|
|
924
|
+
// Custom editor components not supported in RPC mode
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Wire up UI context for tool execution (ask tool, etc.) and extensions.
|
|
929
|
+
// A single shared instance routes all responses received on stdin to the
|
|
930
|
+
// correct waiting promise regardless of which code path created the request.
|
|
931
|
+
const rpcUiContext = new RpcExtensionUIContext(pendingExtensionRequests, output);
|
|
932
|
+
setToolUIContext?.(rpcUiContext, true);
|
|
933
|
+
|
|
934
|
+
// Set up extensions with RPC-based UI context
|
|
935
|
+
await initializeExtensions(session, {
|
|
936
|
+
reportSendError: (action, err) => {
|
|
937
|
+
output(error(undefined, action, err.message));
|
|
938
|
+
},
|
|
939
|
+
reportRuntimeError: err => {
|
|
940
|
+
output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
|
|
941
|
+
},
|
|
942
|
+
onShutdown: () => {
|
|
943
|
+
shutdownState.requested = true;
|
|
944
|
+
},
|
|
945
|
+
trackAgentInvokingMessage: task => {
|
|
946
|
+
extensionUserMessageTracker.trackAgentMessageTask(task);
|
|
947
|
+
},
|
|
948
|
+
uiContext: rpcUiContext,
|
|
949
|
+
});
|
|
950
|
+
|
|
951
|
+
// Output all agent events as JSON
|
|
952
|
+
session.subscribe(event => {
|
|
953
|
+
output(event);
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
const getAvailableCommands = async () => buildAvailableSlashCommands(session);
|
|
957
|
+
const reloadPluginState = async () => {
|
|
958
|
+
const cwd = session.sessionManager.getCwd();
|
|
959
|
+
const projectPath = await resolveActiveProjectRegistryPath(cwd);
|
|
960
|
+
clearPluginRootsAndCaches(projectPath ? [projectPath] : undefined);
|
|
961
|
+
resetCapabilities();
|
|
962
|
+
await session.refreshSkills();
|
|
963
|
+
session.setSlashCommands(await loadSlashCommands({ cwd }));
|
|
964
|
+
await emitAvailableCommandsUpdate();
|
|
965
|
+
};
|
|
966
|
+
const emitAvailableCommandsUpdate = async () => {
|
|
967
|
+
output({ type: "available_commands_update", commands: await getAvailableCommands() });
|
|
968
|
+
};
|
|
969
|
+
session.subscribeCommandMetadataChanged(() => {
|
|
970
|
+
void emitAvailableCommandsUpdate();
|
|
971
|
+
});
|
|
972
|
+
await emitAvailableCommandsUpdate();
|
|
973
|
+
|
|
974
|
+
// Handle a single command
|
|
975
|
+
const handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {
|
|
976
|
+
const id = command.id;
|
|
977
|
+
|
|
978
|
+
switch (command.type) {
|
|
979
|
+
case "negotiate_protocol": {
|
|
980
|
+
if (command.protocolVersion !== 2)
|
|
981
|
+
return error(id, "negotiate_protocol", `Unsupported RPC protocol version: ${command.protocolVersion}`);
|
|
982
|
+
return success(id, "negotiate_protocol", { protocolVersion: 2 });
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// =================================================================
|
|
986
|
+
// Prompting
|
|
987
|
+
// =================================================================
|
|
988
|
+
|
|
989
|
+
case "prompt": {
|
|
990
|
+
const skillResult = await tryRunRpcSkillCommand(session, command.message, command.streamingBehavior);
|
|
991
|
+
if (skillResult) {
|
|
992
|
+
return success(id, "prompt", skillResult);
|
|
993
|
+
}
|
|
994
|
+
const builtinResult = await executeAcpBuiltinSlashCommand(command.message, {
|
|
995
|
+
session,
|
|
996
|
+
sessionManager: session.sessionManager,
|
|
997
|
+
settings: session.settings,
|
|
998
|
+
cwd: session.sessionManager.getCwd(),
|
|
999
|
+
output: text => output({ type: "command_output", text }),
|
|
1000
|
+
refreshCommands: emitAvailableCommandsUpdate,
|
|
1001
|
+
reloadPlugins: reloadPluginState,
|
|
1002
|
+
notifyTitleChanged: async () => {
|
|
1003
|
+
output({ type: "session_info_update", title: session.sessionName, sessionId: session.sessionId });
|
|
1004
|
+
},
|
|
1005
|
+
notifyConfigChanged: async () => {
|
|
1006
|
+
output({ type: "config_update", model: session.model, thinkingLevel: session.thinkingLevel });
|
|
1007
|
+
},
|
|
1008
|
+
});
|
|
1009
|
+
if (builtinResult !== false) {
|
|
1010
|
+
if ("prompt" in builtinResult) {
|
|
1011
|
+
watchAndReportLocalOnlyPromptResult({
|
|
1012
|
+
id,
|
|
1013
|
+
startPrompt: () => session.prompt(builtinResult.prompt, { images: command.images }),
|
|
1014
|
+
output,
|
|
1015
|
+
onError: promptError => output(error(id, "prompt", promptError.message)),
|
|
1016
|
+
extensionUserMessageTracker,
|
|
1017
|
+
});
|
|
1018
|
+
return success(id, "prompt");
|
|
1019
|
+
}
|
|
1020
|
+
return success(id, "prompt", { agentInvoked: false });
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
// Don't await - events will stream
|
|
1024
|
+
// Extension commands are executed immediately, file prompt templates are expanded
|
|
1025
|
+
// If streaming and streamingBehavior specified, queues via steer/followUp
|
|
1026
|
+
watchAndReportLocalOnlyPromptResult({
|
|
1027
|
+
id,
|
|
1028
|
+
startPrompt: () =>
|
|
1029
|
+
session.prompt(command.message, {
|
|
1030
|
+
images: command.images,
|
|
1031
|
+
streamingBehavior: command.streamingBehavior,
|
|
1032
|
+
}),
|
|
1033
|
+
output,
|
|
1034
|
+
onError: promptError => output(error(id, "prompt", promptError.message)),
|
|
1035
|
+
extensionUserMessageTracker,
|
|
1036
|
+
});
|
|
1037
|
+
return success(id, "prompt");
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
case "steer": {
|
|
1041
|
+
await session.steer(command.message, command.images);
|
|
1042
|
+
return success(id, "steer");
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
case "follow_up": {
|
|
1046
|
+
await session.followUp(command.message, command.images);
|
|
1047
|
+
return success(id, "follow_up");
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
case "abort": {
|
|
1051
|
+
await session.abort({ reason: USER_INTERRUPT_LABEL });
|
|
1052
|
+
return success(id, "abort");
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
case "abort_and_prompt": {
|
|
1056
|
+
await session.abort({ reason: USER_INTERRUPT_LABEL });
|
|
1057
|
+
session
|
|
1058
|
+
.prompt(command.message, { images: command.images })
|
|
1059
|
+
.catch(e => output(error(id, "abort_and_prompt", e.message)));
|
|
1060
|
+
return success(id, "abort_and_prompt");
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
case "new_session":
|
|
1064
|
+
case "switch_session":
|
|
1065
|
+
case "branch": {
|
|
1066
|
+
const result = await handleRpcSessionChange(session, command, subagentRegistry);
|
|
1067
|
+
if (!result.data.cancelled) await emitAvailableCommandsUpdate();
|
|
1068
|
+
return success(id, result.type, result.data);
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
// =================================================================
|
|
1072
|
+
// State
|
|
1073
|
+
// =================================================================
|
|
1074
|
+
|
|
1075
|
+
case "get_state": {
|
|
1076
|
+
const state: RpcSessionState = {
|
|
1077
|
+
model: session.model,
|
|
1078
|
+
thinkingLevel: session.thinkingLevel,
|
|
1079
|
+
isStreaming: session.isStreaming,
|
|
1080
|
+
isCompacting: session.isCompacting,
|
|
1081
|
+
steeringMode: session.steeringMode,
|
|
1082
|
+
followUpMode: session.followUpMode,
|
|
1083
|
+
interruptMode: session.interruptMode,
|
|
1084
|
+
sessionFile: session.sessionFile,
|
|
1085
|
+
sessionId: session.sessionId,
|
|
1086
|
+
sessionName: session.sessionName,
|
|
1087
|
+
autoCompactionEnabled: session.autoCompactionEnabled,
|
|
1088
|
+
queuedMessageCount: session.queuedMessageCount,
|
|
1089
|
+
todoPhases: session.getTodoPhases(),
|
|
1090
|
+
fastModeEnabled: session.isFastModeEnabled(),
|
|
1091
|
+
tokensPerSecond: calculateTokensPerSecond(session.messages, session.isStreaming),
|
|
1092
|
+
fastModeActive: session.isFastModeActive(),
|
|
1093
|
+
messageCount: session.messages.length,
|
|
1094
|
+
systemPrompt: session.systemPrompt,
|
|
1095
|
+
dumpTools: session.agent.state.tools.map(tool => ({
|
|
1096
|
+
name: tool.name,
|
|
1097
|
+
description: tool.description,
|
|
1098
|
+
parameters: toolWireSchema(tool),
|
|
1099
|
+
examples: tool.examples,
|
|
1100
|
+
})),
|
|
1101
|
+
contextUsage: session.getContextUsage(),
|
|
1102
|
+
};
|
|
1103
|
+
return success(id, "get_state", state);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
case "set_fast_mode": {
|
|
1107
|
+
const supported = session.setFastMode(command.enabled);
|
|
1108
|
+
if (command.enabled && !supported) {
|
|
1109
|
+
return error(id, "set_fast_mode", "Fast mode is unavailable for the current model.");
|
|
1110
|
+
}
|
|
1111
|
+
return success(id, "set_fast_mode", {
|
|
1112
|
+
enabled: session.isFastModeEnabled(),
|
|
1113
|
+
active: session.isFastModeActive(),
|
|
1114
|
+
});
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
case "get_available_commands": {
|
|
1118
|
+
return success(id, "get_available_commands", { commands: await getAvailableCommands() });
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
case "set_todos": {
|
|
1122
|
+
session.setTodoPhases(command.phases);
|
|
1123
|
+
return success(id, "set_todos", { todoPhases: session.getTodoPhases() });
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
case "set_host_tools": {
|
|
1127
|
+
const tools = normalizeHostToolDefinitions(command.tools);
|
|
1128
|
+
const rpcTools = hostToolBridge.setTools(tools);
|
|
1129
|
+
await session.refreshRpcHostTools(rpcTools);
|
|
1130
|
+
return success(id, "set_host_tools", { toolNames: tools.map(tool => tool.name) });
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
case "set_host_uri_schemes": {
|
|
1134
|
+
try {
|
|
1135
|
+
const schemes = hostUriBridge.setSchemes(command.schemes);
|
|
1136
|
+
return success(id, "set_host_uri_schemes", { schemes });
|
|
1137
|
+
} catch (err) {
|
|
1138
|
+
return error(id, "set_host_uri_schemes", err instanceof Error ? err.message : String(err));
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
case "set_subagent_subscription": {
|
|
1143
|
+
if (!subagentRegistry) {
|
|
1144
|
+
return error(id, "set_subagent_subscription", "Subagent event bus is unavailable");
|
|
1145
|
+
}
|
|
1146
|
+
if (!isSubagentSubscriptionLevel(command.level)) {
|
|
1147
|
+
return error(
|
|
1148
|
+
id,
|
|
1149
|
+
"set_subagent_subscription",
|
|
1150
|
+
`Invalid subagent subscription level: ${String(command.level)}`,
|
|
1151
|
+
);
|
|
1152
|
+
}
|
|
1153
|
+
subagentRegistry.setSubscriptionLevel(command.level);
|
|
1154
|
+
return success(id, "set_subagent_subscription", { level: subagentRegistry.getSubscriptionLevel() });
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
case "get_subagents": {
|
|
1158
|
+
if (!subagentRegistry) {
|
|
1159
|
+
return error(id, "get_subagents", "Subagent event bus is unavailable");
|
|
1160
|
+
}
|
|
1161
|
+
return success(id, "get_subagents", { subagents: subagentRegistry.getSubagents() });
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
case "get_subagent_messages": {
|
|
1165
|
+
if (!subagentRegistry) {
|
|
1166
|
+
return error(id, "get_subagent_messages", "Subagent event bus is unavailable");
|
|
1167
|
+
}
|
|
1168
|
+
try {
|
|
1169
|
+
if (command.fromByte !== undefined && !Number.isFinite(command.fromByte)) {
|
|
1170
|
+
return error(id, "get_subagent_messages", "fromByte must be a finite number");
|
|
1171
|
+
}
|
|
1172
|
+
const sessionFile = subagentRegistry.resolveSessionFile(command);
|
|
1173
|
+
const transcript = await readRpcSubagentTranscript(sessionFile, command.fromByte);
|
|
1174
|
+
return success(id, "get_subagent_messages", transcript);
|
|
1175
|
+
} catch (err) {
|
|
1176
|
+
return error(id, "get_subagent_messages", err instanceof Error ? err.message : String(err));
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// =================================================================
|
|
1181
|
+
// Model
|
|
1182
|
+
// =================================================================
|
|
1183
|
+
|
|
1184
|
+
case "set_model": {
|
|
1185
|
+
let models = session.getAvailableModels();
|
|
1186
|
+
let model = models.find(m => m.provider === command.provider && m.id === command.modelId);
|
|
1187
|
+
if (!model) {
|
|
1188
|
+
// Model not in the current catalog. Wait for in-flight
|
|
1189
|
+
// background discovery before declaring it missing: on cold
|
|
1190
|
+
// start, discovery-backed providers (proxy / ollama / etc.)
|
|
1191
|
+
// populate seconds after session ready. Models already in
|
|
1192
|
+
// the bundled catalog skip this await entirely so the RPC
|
|
1193
|
+
// queue is not stalled behind unrelated discovery.
|
|
1194
|
+
await session.modelRegistry.awaitBackgroundRefresh();
|
|
1195
|
+
models = session.getAvailableModels();
|
|
1196
|
+
model = models.find(m => m.provider === command.provider && m.id === command.modelId);
|
|
1197
|
+
}
|
|
1198
|
+
if (!model) {
|
|
1199
|
+
return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
|
|
1200
|
+
}
|
|
1201
|
+
await session.setModel(model);
|
|
1202
|
+
return success(id, "set_model", model);
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
case "cycle_model": {
|
|
1206
|
+
const result = await session.cycleModel();
|
|
1207
|
+
if (!result) {
|
|
1208
|
+
return success(id, "cycle_model", null);
|
|
1209
|
+
}
|
|
1210
|
+
return success(id, "cycle_model", result);
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
case "get_available_models": {
|
|
1214
|
+
await session.modelRegistry.awaitBackgroundRefresh();
|
|
1215
|
+
const models = session.getAvailableModels();
|
|
1216
|
+
return success(id, "get_available_models", { models });
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
// =================================================================
|
|
1220
|
+
// Thinking
|
|
1221
|
+
// =================================================================
|
|
1222
|
+
|
|
1223
|
+
case "set_thinking_level": {
|
|
1224
|
+
session.setThinkingLevel(command.level);
|
|
1225
|
+
return success(id, "set_thinking_level");
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
case "cycle_thinking_level": {
|
|
1229
|
+
const level = session.cycleThinkingLevel();
|
|
1230
|
+
if (!level) {
|
|
1231
|
+
return success(id, "cycle_thinking_level", null);
|
|
1232
|
+
}
|
|
1233
|
+
return success(id, "cycle_thinking_level", { level });
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
// =================================================================
|
|
1237
|
+
// Queue Modes
|
|
1238
|
+
// =================================================================
|
|
1239
|
+
|
|
1240
|
+
case "set_steering_mode": {
|
|
1241
|
+
session.setSteeringMode(command.mode);
|
|
1242
|
+
return success(id, "set_steering_mode");
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
case "set_follow_up_mode": {
|
|
1246
|
+
session.setFollowUpMode(command.mode);
|
|
1247
|
+
return success(id, "set_follow_up_mode");
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
case "set_interrupt_mode": {
|
|
1251
|
+
session.setInterruptMode(command.mode);
|
|
1252
|
+
return success(id, "set_interrupt_mode");
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// =================================================================
|
|
1256
|
+
// Compaction
|
|
1257
|
+
// =================================================================
|
|
1258
|
+
|
|
1259
|
+
case "compact": {
|
|
1260
|
+
const result = await session.compact(command.customInstructions);
|
|
1261
|
+
return success(id, "compact", result);
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
case "set_auto_compaction": {
|
|
1265
|
+
session.setAutoCompactionEnabled(command.enabled);
|
|
1266
|
+
return success(id, "set_auto_compaction");
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
// =================================================================
|
|
1270
|
+
// Retry
|
|
1271
|
+
// =================================================================
|
|
1272
|
+
|
|
1273
|
+
case "set_auto_retry": {
|
|
1274
|
+
session.setAutoRetryEnabled(command.enabled);
|
|
1275
|
+
return success(id, "set_auto_retry");
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
case "abort_retry": {
|
|
1279
|
+
session.abortRetry();
|
|
1280
|
+
return success(id, "abort_retry");
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
// =================================================================
|
|
1284
|
+
// Bash
|
|
1285
|
+
// =================================================================
|
|
1286
|
+
|
|
1287
|
+
case "bash": {
|
|
1288
|
+
const result = await session.executeBash(command.command);
|
|
1289
|
+
return success(id, "bash", result);
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
case "abort_bash": {
|
|
1293
|
+
session.abortBash();
|
|
1294
|
+
return success(id, "abort_bash");
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
// =================================================================
|
|
1298
|
+
// Session
|
|
1299
|
+
// =================================================================
|
|
1300
|
+
|
|
1301
|
+
case "get_session_stats": {
|
|
1302
|
+
const stats = session.getSessionStats();
|
|
1303
|
+
return success(id, "get_session_stats", stats);
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
case "export_html": {
|
|
1307
|
+
const path = await session.exportToHtml(command.outputPath);
|
|
1308
|
+
return success(id, "export_html", { path });
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
case "get_branch_messages": {
|
|
1312
|
+
const messages = session.getUserMessagesForBranching();
|
|
1313
|
+
return success(id, "get_branch_messages", { messages });
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
case "get_last_assistant_text": {
|
|
1317
|
+
const text = session.getLastAssistantText();
|
|
1318
|
+
return success(id, "get_last_assistant_text", { text });
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
case "set_session_name": {
|
|
1322
|
+
const name = command.name.trim();
|
|
1323
|
+
if (!name) {
|
|
1324
|
+
return error(id, "set_session_name", "Session name cannot be empty");
|
|
1325
|
+
}
|
|
1326
|
+
const applied = await session.setSessionName(name, "user");
|
|
1327
|
+
if (!applied) {
|
|
1328
|
+
return error(id, "set_session_name", "Session name cannot be empty");
|
|
1329
|
+
}
|
|
1330
|
+
return success(id, "set_session_name");
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
case "handoff": {
|
|
1334
|
+
// Resetting the agent mid-stream lets the live turn keep emitting into a
|
|
1335
|
+
// session that handoff has already torn down. Refuse while a prompt is in
|
|
1336
|
+
// flight (mirrors the TUI /handoff guard).
|
|
1337
|
+
if (session.isStreaming) {
|
|
1338
|
+
return error(id, "handoff", "Cannot hand off while a response is in progress");
|
|
1339
|
+
}
|
|
1340
|
+
const result = await session.handoff(command.customInstructions);
|
|
1341
|
+
return success(id, "handoff", result ? { savedPath: result.savedPath } : null);
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
// =================================================================
|
|
1345
|
+
// Messages
|
|
1346
|
+
// =================================================================
|
|
1347
|
+
|
|
1348
|
+
case "get_messages": {
|
|
1349
|
+
return success(id, "get_messages", { messages: session.messages });
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
case "get_messages_page": {
|
|
1353
|
+
if (session.isStreaming || session.isCompacting)
|
|
1354
|
+
return error(id, "get_messages_page", RPC_MESSAGES_PAGE_BUSY_ERROR, "session_busy");
|
|
1355
|
+
const messages = session.messages;
|
|
1356
|
+
try {
|
|
1357
|
+
return success(
|
|
1358
|
+
id,
|
|
1359
|
+
"get_messages_page",
|
|
1360
|
+
pageRpcMessages(
|
|
1361
|
+
messages,
|
|
1362
|
+
{
|
|
1363
|
+
sessionId: session.sessionId,
|
|
1364
|
+
leafId: session.sessionManager.getLeafId(),
|
|
1365
|
+
messageCount: messages.length,
|
|
1366
|
+
},
|
|
1367
|
+
{ cursor: command.cursor, limit: command.limit },
|
|
1368
|
+
),
|
|
1369
|
+
);
|
|
1370
|
+
} catch (pageError) {
|
|
1371
|
+
return error(
|
|
1372
|
+
id,
|
|
1373
|
+
"get_messages_page",
|
|
1374
|
+
pageError instanceof Error ? pageError.message : String(pageError),
|
|
1375
|
+
pageError instanceof RpcMessagesPageError ? pageError.code : undefined,
|
|
1376
|
+
);
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
// =================================================================
|
|
1381
|
+
// Login
|
|
1382
|
+
// =================================================================
|
|
1383
|
+
|
|
1384
|
+
case "get_login_providers": {
|
|
1385
|
+
const providers = getOAuthProviders().map(provider => ({
|
|
1386
|
+
id: provider.id,
|
|
1387
|
+
name: provider.name,
|
|
1388
|
+
available: provider.available,
|
|
1389
|
+
authenticated: session.modelRegistry.authStorage.hasAuth(provider.id),
|
|
1390
|
+
}));
|
|
1391
|
+
return success(id, "get_login_providers", { providers });
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
case "login": {
|
|
1395
|
+
const knownProvider = getOAuthProviders().find(p => p.id === command.providerId);
|
|
1396
|
+
if (!knownProvider) {
|
|
1397
|
+
return error(id, "login", `Unknown OAuth provider: ${command.providerId}`);
|
|
1398
|
+
}
|
|
1399
|
+
const uiCtx = new RpcExtensionUIContext(pendingExtensionRequests, output);
|
|
1400
|
+
// Track whether onAuth has fired. Providers that require interactive
|
|
1401
|
+
// input before a browser URL cannot be satisfied headlessly; after
|
|
1402
|
+
// onAuth, prompt input is the pasted OAuth code/redirect URL path.
|
|
1403
|
+
let authEmitted = false;
|
|
1404
|
+
try {
|
|
1405
|
+
await session.modelRegistry.authStorage.login(command.providerId, {
|
|
1406
|
+
onAuth: info => {
|
|
1407
|
+
authEmitted = true;
|
|
1408
|
+
output({
|
|
1409
|
+
type: "extension_ui_request",
|
|
1410
|
+
id: Snowflake.next() as string,
|
|
1411
|
+
method: "open_url",
|
|
1412
|
+
url: info.url,
|
|
1413
|
+
launchUrl: info.launchUrl,
|
|
1414
|
+
instructions: info.instructions,
|
|
1415
|
+
} as RpcExtensionUIRequest);
|
|
1416
|
+
},
|
|
1417
|
+
onProgress: message => {
|
|
1418
|
+
uiCtx.notify(message, "info");
|
|
1419
|
+
},
|
|
1420
|
+
onPrompt: async prompt => {
|
|
1421
|
+
if (!authEmitted) {
|
|
1422
|
+
// onPrompt called before any auth URL — provider requires
|
|
1423
|
+
// interactive input that cannot be satisfied headlessly.
|
|
1424
|
+
return Promise.reject(
|
|
1425
|
+
new Error(
|
|
1426
|
+
`Provider '${command.providerId}' requires interactive prompts ` +
|
|
1427
|
+
"which are not supported in RPC mode. Use the terminal UI to log in.",
|
|
1428
|
+
),
|
|
1429
|
+
);
|
|
1430
|
+
}
|
|
1431
|
+
return (await uiCtx.input(prompt.message, prompt.placeholder, { timeout: 600_000 })) ?? "";
|
|
1432
|
+
},
|
|
1433
|
+
});
|
|
1434
|
+
// Provider-scoped online refresh so the just-persisted credential
|
|
1435
|
+
// re-runs discovery instead of reusing a fresh authoritative cache
|
|
1436
|
+
// row (#5780).
|
|
1437
|
+
await session.modelRegistry.refreshProvider(command.providerId, "online");
|
|
1438
|
+
return success(id, "login", { providerId: command.providerId });
|
|
1439
|
+
} catch (err: unknown) {
|
|
1440
|
+
return error(id, "login", err instanceof Error ? err.message : String(err));
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
default: {
|
|
1445
|
+
const unknownCommand = command as { type: string };
|
|
1446
|
+
return error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
};
|
|
1450
|
+
|
|
1451
|
+
// Deferred shutdown (pi.shutdown() from an extension) must not kill the
|
|
1452
|
+
// process while a background-dispatched bash still owes the client its
|
|
1453
|
+
// response frame. The coordinator drains tracked tasks before exiting and
|
|
1454
|
+
// re-checks the request as each task settles.
|
|
1455
|
+
const shutdownCoordinator = new RpcShutdownCoordinator({
|
|
1456
|
+
isShutdownRequested: () => shutdownState.requested,
|
|
1457
|
+
performShutdown: async () => {
|
|
1458
|
+
// Route through the idempotent session.dispose() so the browser
|
|
1459
|
+
// reaper (releaseTabsForOwner) and other bounded teardown run before
|
|
1460
|
+
// the process exits. dispose() also emits `session_shutdown`, so we
|
|
1461
|
+
// must NOT emit it separately here or the event fires twice. Skipping
|
|
1462
|
+
// dispose left OMP-owned Chromium alive after RPC shutdown (#5643).
|
|
1463
|
+
await session.dispose();
|
|
1464
|
+
process.exit(0);
|
|
1465
|
+
},
|
|
1466
|
+
});
|
|
1467
|
+
|
|
1468
|
+
const dispatchFrameDeps: RpcInputFrameDeps = {
|
|
1469
|
+
handleCommand,
|
|
1470
|
+
output,
|
|
1471
|
+
errorResponse: error,
|
|
1472
|
+
trackBackgroundTask: task => shutdownCoordinator.track(task),
|
|
1473
|
+
pendingExtensionRequests,
|
|
1474
|
+
onHostToolResult: frame => hostToolBridge.handleResult(frame),
|
|
1475
|
+
onHostToolUpdate: frame => hostToolBridge.handleUpdate(frame),
|
|
1476
|
+
onHostUriResult: frame => hostUriBridge.handleResult(frame),
|
|
1477
|
+
};
|
|
1478
|
+
|
|
1479
|
+
const inputDispatcher = new RpcInputDispatcher({
|
|
1480
|
+
deps: dispatchFrameDeps,
|
|
1481
|
+
afterSerialCommand: () => shutdownCoordinator.checkShutdownRequested(),
|
|
1482
|
+
});
|
|
1483
|
+
|
|
1484
|
+
// Keep the stdin reader moving: side-channel frames dispatch immediately,
|
|
1485
|
+
// ordinary commands serialize through inputDispatcher, and bash remains
|
|
1486
|
+
// background-dispatched so abort_bash can overtake it. Frames are read
|
|
1487
|
+
// line-by-line and parsed here (not via readJsonl) so a single malformed
|
|
1488
|
+
// line is reported as an error frame and the loop keeps running instead of
|
|
1489
|
+
// throwing out of the generator and killing the whole process (issue #5194).
|
|
1490
|
+
const decoder = new TextDecoder();
|
|
1491
|
+
for await (const line of readLines(input ?? Bun.stdin.stream())) {
|
|
1492
|
+
const text = decoder.decode(line).trim();
|
|
1493
|
+
if (!text) continue;
|
|
1494
|
+
let parsed: unknown;
|
|
1495
|
+
try {
|
|
1496
|
+
parsed = JSON.parse(text);
|
|
1497
|
+
} catch (e: unknown) {
|
|
1498
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
1499
|
+
output(error(undefined, "parse", `Failed to parse command: ${message}`));
|
|
1500
|
+
continue;
|
|
1501
|
+
}
|
|
1502
|
+
inputDispatcher.dispatch(parsed);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
// stdin closed — RPC client is gone. Fail pending side-channel requests
|
|
1506
|
+
// first so active/queued commands can settle, then drain accepted work.
|
|
1507
|
+
pendingExtensionRequests.rejectAll("RPC client disconnected before extension UI response completed");
|
|
1508
|
+
hostToolBridge.close("RPC client disconnected before host tool execution completed");
|
|
1509
|
+
hostUriBridge.clear("RPC client disconnected before host URI request completed");
|
|
1510
|
+
await inputDispatcher.drain();
|
|
1511
|
+
await shutdownCoordinator.drain();
|
|
1512
|
+
subagentRegistry?.dispose();
|
|
1513
|
+
// Dispose the main session before exiting so the browser reaper and other
|
|
1514
|
+
// bounded teardown run on the stdin-EOF path too (#5643). Idempotent: a
|
|
1515
|
+
// prior pi.shutdown() through the coordinator makes this await settle
|
|
1516
|
+
// immediately.
|
|
1517
|
+
await session.dispose();
|
|
1518
|
+
process.exit(0);
|
|
1519
|
+
}
|