@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,905 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP stdio transport.
|
|
3
|
+
*
|
|
4
|
+
* Implements JSON-RPC 2.0 over subprocess stdin/stdout.
|
|
5
|
+
* Messages are newline-delimited JSON.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from "node:fs/promises";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { getProjectDir, readJsonl } from "@oh-my-pi/pi-utils";
|
|
11
|
+
import type { Subprocess } from "bun";
|
|
12
|
+
import { hostHasInheritableConsole } from "../../eval/py/spawn-options";
|
|
13
|
+
import type {
|
|
14
|
+
JsonRpcError,
|
|
15
|
+
JsonRpcMessage,
|
|
16
|
+
JsonRpcRequest,
|
|
17
|
+
JsonRpcResponse,
|
|
18
|
+
MCPRequestOptions,
|
|
19
|
+
MCPStdioServerConfig,
|
|
20
|
+
MCPTransport,
|
|
21
|
+
} from "../../mcp/types";
|
|
22
|
+
import { toJsonRpcError } from "../../mcp/types";
|
|
23
|
+
import { RequestIdAllocator } from "../request-id";
|
|
24
|
+
import { isMCPTimeoutEnabled, resolveMCPTimeoutMs } from "../timeout";
|
|
25
|
+
|
|
26
|
+
/** Subprocess argv and platform-derived spawn flags for an MCP stdio server. */
|
|
27
|
+
export interface StdioSpawnCommand {
|
|
28
|
+
cmd: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Hide the Windows console window for the direct child.
|
|
31
|
+
*
|
|
32
|
+
* Windows uses this only when the OMP host has no console to share. When
|
|
33
|
+
* the host is running inside a terminal, `windowsHide: true` maps to
|
|
34
|
+
* `CREATE_NO_WINDOW`, which strips that inheritable console from hidden
|
|
35
|
+
* `cmd.exe` / PowerShell wrapper chains. Their console grandchildren then
|
|
36
|
+
* allocate fresh visible conhost windows during startup or reconnects
|
|
37
|
+
* (#3567).
|
|
38
|
+
*/
|
|
39
|
+
windowsHide?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Run the subprocess in its own session when the platform can safely do so.
|
|
42
|
+
*
|
|
43
|
+
* Linux/other POSIX: `true`. Detach → `setsid`, so the MCP process tree has
|
|
44
|
+
* no controlling terminal and terminal job-control signals (Ctrl+Z SIGTSTP,
|
|
45
|
+
* background-read SIGTTIN) cannot stop stdio servers such as
|
|
46
|
+
* `chrome-devtools-mcp` and leave our read loop blocked on silent pipes.
|
|
47
|
+
*
|
|
48
|
+
* macOS: `false`. LaunchServices/TCC attributes Apple Events automation to
|
|
49
|
+
* the responsible terminal process only while the child stays in the
|
|
50
|
+
* inherited session; detaching via `setsid` prevents the permission prompt
|
|
51
|
+
* for servers such as `xcrun mcpbridge` (#4987).
|
|
52
|
+
*
|
|
53
|
+
* Windows: `false`. There is no SIGTSTP/SIGTTIN to escape, and Windows
|
|
54
|
+
* wrapper chains must stay in the OMP console session so nested console
|
|
55
|
+
* grandchildren keep stdout routed through our pipe (#3544).
|
|
56
|
+
*/
|
|
57
|
+
detached: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Pass argv to `Bun.spawn` verbatim (Windows only), suppressing the
|
|
60
|
+
* default libuv backslash-quoting.
|
|
61
|
+
*
|
|
62
|
+
* Set when `cmd` already holds a `cmd.exe /d /e:ON /v:OFF /c "<line>"`
|
|
63
|
+
* command line escaped for `cmd.exe`'s parser (see `buildCmdExeArgv`).
|
|
64
|
+
* libuv's quoting targets `CommandLineToArgvW`, not `cmd.exe`, so letting
|
|
65
|
+
* it re-quote a batch launch would corrupt arguments and re-open the
|
|
66
|
+
* `%VAR%` / quote-injection holes the escaping closes (BatBadBut,
|
|
67
|
+
* CVE-2024-24576).
|
|
68
|
+
*/
|
|
69
|
+
windowsVerbatimArguments?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Inputs used to resolve platform-specific stdio spawn behavior. */
|
|
73
|
+
export interface ResolveStdioSpawnOptions {
|
|
74
|
+
cwd: string;
|
|
75
|
+
env: Record<string, string | undefined>;
|
|
76
|
+
hostHasInheritableConsole?: boolean;
|
|
77
|
+
platform?: NodeJS.Platform;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const DEFAULT_WINDOWS_PATHEXT = [".COM", ".EXE", ".BAT", ".CMD"];
|
|
81
|
+
const WINDOWS_BATCH_EXTENSIONS = new Set([".bat", ".cmd"]);
|
|
82
|
+
|
|
83
|
+
function getCaseInsensitiveEnv(env: Record<string, string | undefined>, name: string): string | undefined {
|
|
84
|
+
const direct = env[name];
|
|
85
|
+
if (direct !== undefined) return direct;
|
|
86
|
+
const normalized = name.toLowerCase();
|
|
87
|
+
for (const [key, value] of Object.entries(env)) {
|
|
88
|
+
if (key.toLowerCase() === normalized) return value;
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function getWindowsPathExt(env: Record<string, string | undefined>): string[] {
|
|
94
|
+
const raw = getCaseInsensitiveEnv(env, "PATHEXT");
|
|
95
|
+
if (!raw) return DEFAULT_WINDOWS_PATHEXT;
|
|
96
|
+
const extensions: string[] = [];
|
|
97
|
+
for (const part of raw.split(";")) {
|
|
98
|
+
const trimmed = part.trim();
|
|
99
|
+
if (!trimmed) continue;
|
|
100
|
+
extensions.push(trimmed.startsWith(".") ? trimmed : `.${trimmed}`);
|
|
101
|
+
}
|
|
102
|
+
return extensions.length > 0 ? extensions : DEFAULT_WINDOWS_PATHEXT;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function fileExists(filePath: string): Promise<boolean> {
|
|
106
|
+
try {
|
|
107
|
+
await fs.access(filePath);
|
|
108
|
+
return true;
|
|
109
|
+
} catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function hasPathSegment(command: string): boolean {
|
|
115
|
+
return command.includes("/") || command.includes("\\") || path.isAbsolute(command);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function hasExecutableExtension(command: string, extensions: string[]): boolean {
|
|
119
|
+
const ext = path.extname(command).toLowerCase();
|
|
120
|
+
if (!ext) return false;
|
|
121
|
+
return extensions.some(candidate => candidate.toLowerCase() === ext);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function resolveWindowsCommandPath(
|
|
125
|
+
command: string,
|
|
126
|
+
cwd: string,
|
|
127
|
+
env: Record<string, string | undefined>,
|
|
128
|
+
): Promise<string | null> {
|
|
129
|
+
const extensions = getWindowsPathExt(env);
|
|
130
|
+
const hasExt = hasExecutableExtension(command, extensions);
|
|
131
|
+
const candidates = hasExt ? [command] : extensions.map(ext => `${command}${ext}`);
|
|
132
|
+
|
|
133
|
+
if (hasPathSegment(command)) {
|
|
134
|
+
for (const candidate of candidates) {
|
|
135
|
+
const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);
|
|
136
|
+
if (await fileExists(resolved)) return resolved;
|
|
137
|
+
}
|
|
138
|
+
return hasExt ? command : null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Match cmd.exe's lookup order for an unqualified name: current directory
|
|
142
|
+
// first, then PATH. Skipping cwd would launch a global shim instead of a
|
|
143
|
+
// project-local one with the same name.
|
|
144
|
+
const searchDirs = [cwd];
|
|
145
|
+
const pathValue = getCaseInsensitiveEnv(env, "PATH");
|
|
146
|
+
if (pathValue) {
|
|
147
|
+
for (const dir of pathValue.split(";")) {
|
|
148
|
+
if (dir) searchDirs.push(dir);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const dir of searchDirs) {
|
|
152
|
+
for (const candidate of candidates) {
|
|
153
|
+
const resolved = path.join(dir, candidate);
|
|
154
|
+
if (await fileExists(resolved)) return resolved;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return hasExt ? command : null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function resolveWindowsShimPath(value: string, shimDir: string): string | null {
|
|
161
|
+
const match = /^%dp0%[\\/]*(.*)$/i.exec(value);
|
|
162
|
+
if (!match) return null;
|
|
163
|
+
const suffix = match[1];
|
|
164
|
+
if (!suffix) return shimDir;
|
|
165
|
+
return path.join(shimDir, ...suffix.split(/[\\/]+/).filter(Boolean));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async function resolveWindowsNpmShimCommand(
|
|
169
|
+
command: string,
|
|
170
|
+
args: readonly string[],
|
|
171
|
+
cwd: string,
|
|
172
|
+
windowsHide: boolean,
|
|
173
|
+
): Promise<StdioSpawnCommand | null> {
|
|
174
|
+
if (!isWindowsBatchCommand(command)) return null;
|
|
175
|
+
if (!hasPathSegment(command)) return null;
|
|
176
|
+
const commandPath = path.resolve(cwd, command);
|
|
177
|
+
const commandName = path
|
|
178
|
+
.basename(commandPath)
|
|
179
|
+
.replace(/\.cmd$/i, "")
|
|
180
|
+
.toLowerCase();
|
|
181
|
+
if (commandName === "npx") return null;
|
|
182
|
+
|
|
183
|
+
let content: string;
|
|
184
|
+
try {
|
|
185
|
+
content = await Bun.file(commandPath).text();
|
|
186
|
+
} catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// cmd-shim emits the same invocation line for every interpreter; only
|
|
191
|
+
// bypass cmd.exe when the shim's fallback interpreter is actually node.
|
|
192
|
+
// The IF EXIST branch assigns a %dp0%-prefixed value, so requiring a
|
|
193
|
+
// non-%-leading SET value picks the bare PATH-fallback program name.
|
|
194
|
+
const prog = /SET\s+"_prog=([^%"][^"]*)"/i.exec(content)?.[1];
|
|
195
|
+
if (
|
|
196
|
+
!prog ||
|
|
197
|
+
path
|
|
198
|
+
.basename(prog)
|
|
199
|
+
.replace(/\.exe$/i, "")
|
|
200
|
+
.toLowerCase() !== "node"
|
|
201
|
+
)
|
|
202
|
+
return null;
|
|
203
|
+
|
|
204
|
+
const rawTarget = /"%_prog%"\s+"([^"]+)"\s+%\*/i.exec(content)?.[1];
|
|
205
|
+
if (!rawTarget) return null;
|
|
206
|
+
|
|
207
|
+
const target = resolveWindowsShimPath(rawTarget, path.dirname(commandPath));
|
|
208
|
+
if (!target) return null;
|
|
209
|
+
|
|
210
|
+
const siblingNode = path.join(path.dirname(commandPath), "node.exe");
|
|
211
|
+
const nodeCommand = (await fileExists(siblingNode)) ? siblingNode : "node";
|
|
212
|
+
return {
|
|
213
|
+
cmd: [nodeCommand, target, ...args],
|
|
214
|
+
windowsHide,
|
|
215
|
+
detached: false,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function isWindowsBatchCommand(command: string): boolean {
|
|
220
|
+
return WINDOWS_BATCH_EXTENSIONS.has(path.extname(command).toLowerCase());
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function resolveComSpec(env: Record<string, string | undefined>): string {
|
|
224
|
+
const comspec = getCaseInsensitiveEnv(env, "COMSPEC");
|
|
225
|
+
return comspec && comspec.length > 0 ? comspec : "cmd.exe";
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Argument bytes cmd.exe delivers unchanged without quoting. Anything outside
|
|
229
|
+
// this set (spaces, quotes, `%`, shell metacharacters, non-ASCII) forces the
|
|
230
|
+
// quoted+escaped path below. Mirrors the fuzz-tested allow-list from Zig's
|
|
231
|
+
// BatBadBut mitigation.
|
|
232
|
+
const CMD_SAFE_ARG = /^[A-Za-z0-9#$*+\-./:?@\\_]+$/;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Escape the interior of a `cmd.exe`-quoted token: neutralize `%VAR%` expansion
|
|
236
|
+
* and double any backslash run that precedes a quote (including the caller's
|
|
237
|
+
* closing quote) so `CommandLineToArgvW` delivers the backslashes literally.
|
|
238
|
+
*
|
|
239
|
+
* `cmd.exe` re-parses the whole `/c` string and expands `%…%` *before* the
|
|
240
|
+
* batch shim's own argv split runs, so both the command path and every argument
|
|
241
|
+
* must pass through this. Percent → `%%cd:~,%` (which expands to nothing,
|
|
242
|
+
* leaving a literal `%`) and `"` → `""` are the documented BatBadBut mitigation
|
|
243
|
+
* (CVE-2024-24576). The caller supplies the surrounding double quotes.
|
|
244
|
+
*
|
|
245
|
+
* @see https://flatt.tech/research/posts/batbadbut-you-cant-securely-execute-commands-on-windows/
|
|
246
|
+
*/
|
|
247
|
+
function escapeCmdQuotedInterior(value: string): string {
|
|
248
|
+
let out = "";
|
|
249
|
+
let backslashes = 0;
|
|
250
|
+
for (const ch of value) {
|
|
251
|
+
if (ch === "\\") {
|
|
252
|
+
backslashes += 1;
|
|
253
|
+
out += ch;
|
|
254
|
+
} else if (ch === '"') {
|
|
255
|
+
out += "\\".repeat(backslashes);
|
|
256
|
+
out += '""';
|
|
257
|
+
backslashes = 0;
|
|
258
|
+
} else if (ch === "%") {
|
|
259
|
+
out += "%%cd:~,%";
|
|
260
|
+
backslashes = 0;
|
|
261
|
+
} else {
|
|
262
|
+
backslashes = 0;
|
|
263
|
+
out += ch;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Double the trailing backslash run so it stays literal before the closing
|
|
267
|
+
// quote the caller appends.
|
|
268
|
+
out += "\\".repeat(backslashes);
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Reject bytes that cannot round-trip through `cmd.exe`'s `/c` command line. */
|
|
273
|
+
function assertCmdBatchToken(value: string, kind: "command" | "argument"): void {
|
|
274
|
+
// NUL/LF act as an end-of-command marker and CR is stripped, so any of them
|
|
275
|
+
// would silently truncate or corrupt the launch.
|
|
276
|
+
if (/[\0\r\n]/.test(value)) {
|
|
277
|
+
throw new Error(`Windows batch MCP ${kind} cannot contain NUL, CR, or LF characters`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Escape one argument for `cmd.exe`'s command-line pre-parse so a `.cmd`/`.bat`
|
|
283
|
+
* shim receives it verbatim. Quotes only when the argument is empty, ends in a
|
|
284
|
+
* backslash, or holds a byte outside {@link CMD_SAFE_ARG}; the quoted body is
|
|
285
|
+
* escaped by {@link escapeCmdQuotedInterior}.
|
|
286
|
+
*
|
|
287
|
+
* @throws when the argument contains NUL, CR, or LF (see {@link assertCmdBatchToken}).
|
|
288
|
+
*/
|
|
289
|
+
function escapeCmdBatchArg(arg: string): string {
|
|
290
|
+
assertCmdBatchToken(arg, "argument");
|
|
291
|
+
const needsQuotes = arg.length === 0 || arg.endsWith("\\") || !CMD_SAFE_ARG.test(arg);
|
|
292
|
+
// An unquoted arg is pure allow-list bytes (no `%`, `"`, or trailing `\`), so
|
|
293
|
+
// it needs no interior escaping.
|
|
294
|
+
return needsQuotes ? `"${escapeCmdQuotedInterior(arg)}"` : arg;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Build the `cmd.exe` argv for a Windows `.cmd`/`.bat` (or unresolved bare)
|
|
299
|
+
* MCP command.
|
|
300
|
+
*
|
|
301
|
+
* The trailing element is a single `/c` string wrapped in an outer quote pair
|
|
302
|
+
* that `cmd.exe` strips (its opening-quote rule). The command token is always
|
|
303
|
+
* quoted and, like every argument, escaped so a `%` in the resolved path (e.g.
|
|
304
|
+
* `C:\work\%TOKEN%\server.cmd`) is not expanded before the shim launches.
|
|
305
|
+
* `/e:ON` keeps command extensions on (required for the `%%cd:~,%` trick) and
|
|
306
|
+
* `/v:OFF` disables delayed expansion. The result MUST be spawned with
|
|
307
|
+
* `windowsVerbatimArguments` so libuv passes it through unmodified.
|
|
308
|
+
*/
|
|
309
|
+
function buildCmdExeArgv(comspec: string, command: string, args: readonly string[]): string[] {
|
|
310
|
+
assertCmdBatchToken(command, "command");
|
|
311
|
+
let line = `""${escapeCmdQuotedInterior(command)}"`;
|
|
312
|
+
for (const arg of args) line += ` ${escapeCmdBatchArg(arg)}`;
|
|
313
|
+
line += '"';
|
|
314
|
+
return [comspec, "/d", "/e:ON", "/v:OFF", "/c", line];
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Resolve the subprocess argv used to launch an MCP stdio server.
|
|
319
|
+
*
|
|
320
|
+
* On Windows, our PATH/PATHEXT walk may return `null` for a bare command
|
|
321
|
+
* (e.g. `npx`) — `Bun.env.PATH` empty under a restricted parent process,
|
|
322
|
+
* UNC/network mounts that reject `fs.access`, locked-down shells. The
|
|
323
|
+
* legacy fallback handed `Bun.spawn` the bare name, but `CreateProcess`
|
|
324
|
+
* only appends `.exe` for extensionless names — `.cmd`/`.bat` are never
|
|
325
|
+
* tried, so `npx` (which exists only as `npx.cmd` on Windows) crashes the
|
|
326
|
+
* subprocess immediately. When the resolver can't pin the command down,
|
|
327
|
+
* route through `cmd.exe` so Windows's own PATHEXT lookup runs.
|
|
328
|
+
*/
|
|
329
|
+
export async function resolveStdioSpawnCommand(
|
|
330
|
+
config: MCPStdioServerConfig,
|
|
331
|
+
options: ResolveStdioSpawnOptions,
|
|
332
|
+
): Promise<StdioSpawnCommand> {
|
|
333
|
+
const args = config.args ?? [];
|
|
334
|
+
if (options.platform !== "win32") return { cmd: [config.command, ...args], detached: options.platform !== "darwin" };
|
|
335
|
+
|
|
336
|
+
const windowsHide = options.hostHasInheritableConsole === undefined ? true : !options.hostHasInheritableConsole;
|
|
337
|
+
const resolved = await resolveWindowsCommandPath(config.command, options.cwd, options.env);
|
|
338
|
+
const resolvedCommand = resolved ?? config.command;
|
|
339
|
+
const npmShimCommand = await resolveWindowsNpmShimCommand(resolvedCommand, args, options.cwd, windowsHide);
|
|
340
|
+
if (npmShimCommand) return npmShimCommand;
|
|
341
|
+
|
|
342
|
+
// Direct-spawn only when we resolved to a concrete file AND its extension
|
|
343
|
+
// is not a batch script. Everything else (resolved .cmd/.bat, or an
|
|
344
|
+
// unresolved extensionless command) goes through cmd.exe so PATHEXT runs.
|
|
345
|
+
// Windows stdio servers stay attached so wrapper grandchildren inherit the
|
|
346
|
+
// same console session. Only hide the child when OMP itself has no console
|
|
347
|
+
// to share; CREATE_NO_WINDOW breaks console inheritance for nested wrappers.
|
|
348
|
+
const detached = false;
|
|
349
|
+
const needsCmdExe = resolved === null || isWindowsBatchCommand(resolvedCommand);
|
|
350
|
+
if (!needsCmdExe) return { cmd: [resolvedCommand, ...args], windowsHide, detached };
|
|
351
|
+
|
|
352
|
+
return {
|
|
353
|
+
cmd: buildCmdExeArgv(resolveComSpec(options.env), resolvedCommand, args),
|
|
354
|
+
windowsHide,
|
|
355
|
+
detached,
|
|
356
|
+
windowsVerbatimArguments: true,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** Minimal write surface of `Subprocess.stdin` we need for framed sends. */
|
|
361
|
+
interface FrameSink {
|
|
362
|
+
write(chunk: string): unknown;
|
|
363
|
+
flush(): unknown;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** Narrow a value to a thenable so a rejection handler can be attached. */
|
|
367
|
+
function isThenable(value: unknown): value is PromiseLike<unknown> {
|
|
368
|
+
return (
|
|
369
|
+
value != null &&
|
|
370
|
+
(typeof value === "object" || typeof value === "function") &&
|
|
371
|
+
typeof (value as { then?: unknown }).then === "function"
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Write a newline-delimited JSON-RPC frame to the subprocess's stdin sink,
|
|
377
|
+
* swallowing both synchronous throws and asynchronous rejections so the caller
|
|
378
|
+
* can decide how to react.
|
|
379
|
+
*
|
|
380
|
+
* Bun's `FileSink.write()`/`flush()` can fail two ways once the read end of the
|
|
381
|
+
* pipe has been closed by a subprocess that exited between read-loop ticks:
|
|
382
|
+
* - a synchronous throw (most reliably observed on Windows), and
|
|
383
|
+
* - a *rejected Promise* returned from `write()`/`flush()`, i.e. the EPIPE is
|
|
384
|
+
* surfaced asynchronously (note the `processTicksAndRejections` frame in the
|
|
385
|
+
* stack traces on #1710 and the follow-up report).
|
|
386
|
+
*
|
|
387
|
+
* A sibling `async` method's `try/catch` only catches the synchronous case; an
|
|
388
|
+
* un-awaited rejected Promise escapes as a fatal unhandled rejection. So we both
|
|
389
|
+
* catch the throw and neutralize any returned promise's rejection.
|
|
390
|
+
*
|
|
391
|
+
* Returns `true` when the frame was accepted synchronously, `false` when the
|
|
392
|
+
* sink threw — callers signal transport closure on `false`. An asynchronous
|
|
393
|
+
* failure cannot be reflected in the return value; it is neutralized here and
|
|
394
|
+
* the dead transport is detected by the read loop / request timeout instead.
|
|
395
|
+
*/
|
|
396
|
+
export function writeFrame(stdin: FrameSink, frame: string): boolean {
|
|
397
|
+
try {
|
|
398
|
+
const wrote = stdin.write(frame);
|
|
399
|
+
const flushed = stdin.flush();
|
|
400
|
+
if (isThenable(wrote)) wrote.then(undefined, () => {});
|
|
401
|
+
if (isThenable(flushed)) flushed.then(undefined, () => {});
|
|
402
|
+
return true;
|
|
403
|
+
} catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** Grace window to observe a cooperative exit after SIGTERM before escalating to SIGKILL. */
|
|
409
|
+
const TERM_GRACE_MS = 1000;
|
|
410
|
+
/** Grace window to observe SIGKILL taking effect before `close()` gives up and returns. */
|
|
411
|
+
const KILL_GRACE_MS = 500;
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* The subset of `Subprocess` that termination needs. Decoupled from the
|
|
415
|
+
* `Subprocess<In, Out, Err>` stdio generics — `#process`'s pipes are
|
|
416
|
+
* irrelevant to signaling — so tests can exercise it against a plain
|
|
417
|
+
* `Bun.spawn(cmd, { stdio: "ignore" })` child without fighting the generics.
|
|
418
|
+
*/
|
|
419
|
+
interface KillableSubprocess {
|
|
420
|
+
readonly pid: number;
|
|
421
|
+
readonly exited: Promise<number>;
|
|
422
|
+
kill(signal?: number | NodeJS.Signals): void;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Race `exited` against a timer. Resolves `true` once the process has exited
|
|
427
|
+
* within `timeoutMs`, `false` if the timer wins first. `exited` resolving OR
|
|
428
|
+
* rejecting both count as "exited" — mirrors `waitForExit()` in
|
|
429
|
+
* `lsp/client.ts`, which treats the same ambiguity (Bun documents
|
|
430
|
+
* `Subprocess.exited` as resolve-only, but a settle either way means there is
|
|
431
|
+
* nothing left to wait on).
|
|
432
|
+
*
|
|
433
|
+
* The timer is always cleared before returning — win or lose — so a process
|
|
434
|
+
* that exits promptly never leaves a dangling `timeoutMs` timer holding the
|
|
435
|
+
* event loop open behind it.
|
|
436
|
+
*/
|
|
437
|
+
async function waitForProcessExit(exited: Promise<number>, timeoutMs: number): Promise<boolean> {
|
|
438
|
+
const { promise: timedOut, resolve: resolveTimedOut } = Promise.withResolvers<false>();
|
|
439
|
+
const timer = setTimeout(() => resolveTimedOut(false), timeoutMs);
|
|
440
|
+
try {
|
|
441
|
+
return await Promise.race([
|
|
442
|
+
exited.then(
|
|
443
|
+
() => true,
|
|
444
|
+
() => true,
|
|
445
|
+
),
|
|
446
|
+
timedOut,
|
|
447
|
+
]);
|
|
448
|
+
} finally {
|
|
449
|
+
clearTimeout(timer);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/** `true` when `error` is a Node errno exception carrying the given `code`. */
|
|
454
|
+
function isErrnoCode(error: unknown, code: string): boolean {
|
|
455
|
+
if (typeof error !== "object" || error === null || !("code" in error)) return false;
|
|
456
|
+
return error.code === code;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Signal `signal` to `proc`. When `detached` is true on a POSIX platform,
|
|
461
|
+
* targets the whole process group via the negative-pid convention
|
|
462
|
+
* (`process.kill(-pid, signal)`) so a detached session leader's descendants —
|
|
463
|
+
* not just the direct child — receive it too; a bare direct-child signal
|
|
464
|
+
* never reaches grandchildren the child itself spawned.
|
|
465
|
+
*
|
|
466
|
+
* `ESRCH` from the group signal means the group is already gone — that is a
|
|
467
|
+
* success (nothing left to signal), not a failure — so it does not fall
|
|
468
|
+
* through. Any other group-signal failure (e.g. `EPERM`) falls back to
|
|
469
|
+
* signaling the direct child as a last resort. Non-detached transports
|
|
470
|
+
* (macOS, Windows, or POSIX where detach did not apply) always signal the
|
|
471
|
+
* direct child only: a negative-pid signal outside a detached session could
|
|
472
|
+
* hit an unrelated process group.
|
|
473
|
+
*/
|
|
474
|
+
function signalStdioProcess(
|
|
475
|
+
proc: KillableSubprocess,
|
|
476
|
+
detached: boolean,
|
|
477
|
+
signal: NodeJS.Signals,
|
|
478
|
+
platform: NodeJS.Platform,
|
|
479
|
+
): void {
|
|
480
|
+
if (detached && platform !== "win32") {
|
|
481
|
+
try {
|
|
482
|
+
process.kill(-proc.pid, signal);
|
|
483
|
+
return;
|
|
484
|
+
} catch (error) {
|
|
485
|
+
if (isErrnoCode(error, "ESRCH")) return;
|
|
486
|
+
// Fall through to the direct-child signal below.
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
try {
|
|
490
|
+
proc.kill(signal);
|
|
491
|
+
} catch {
|
|
492
|
+
// Already gone.
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Terminate an MCP stdio subprocess: SIGTERM (process-group when `detached`
|
|
498
|
+
* on POSIX, direct child otherwise), wait up to `TERM_GRACE_MS` for a
|
|
499
|
+
* cooperative exit, then escalate to SIGKILL — waiting up to `KILL_GRACE_MS`
|
|
500
|
+
* more only when the leader itself hadn't already exited. A detached
|
|
501
|
+
* leader's cooperative exit does not prove the whole process group is gone
|
|
502
|
+
* (a grandchild can outlive it and ignore SIGTERM), so detached transports
|
|
503
|
+
* always fire the group SIGKILL sweep, even after a clean SIGTERM exit.
|
|
504
|
+
* Every step is a no-op-safe signal against an already-exited target, so
|
|
505
|
+
* repeat calls (idempotent `close()`) never throw.
|
|
506
|
+
*
|
|
507
|
+
* Exported so tests can exercise group-signal escalation with an explicit
|
|
508
|
+
* `detached`/`platform` pair: `StdioTransport.connect()` derives `detached`
|
|
509
|
+
* from `resolveStdioSpawnCommand()`, which is tied to the host's real
|
|
510
|
+
* `process.platform`, so a POSIX detached session cannot be reproduced
|
|
511
|
+
* end-to-end through `connect()` on a non-Linux dev/CI host.
|
|
512
|
+
*/
|
|
513
|
+
export async function terminateStdioProcess(
|
|
514
|
+
proc: KillableSubprocess,
|
|
515
|
+
detached: boolean,
|
|
516
|
+
platform: NodeJS.Platform = process.platform,
|
|
517
|
+
): Promise<void> {
|
|
518
|
+
signalStdioProcess(proc, detached, "SIGTERM", platform);
|
|
519
|
+
const exitedOnTerm = await waitForProcessExit(proc.exited, TERM_GRACE_MS);
|
|
520
|
+
// A non-detached transport has no process group beyond the leader itself:
|
|
521
|
+
// once it exits, there is nothing left to signal. A detached transport's
|
|
522
|
+
// leader exiting is NOT proof the group is empty — a grandchild it spawned
|
|
523
|
+
// can still be alive and ignoring SIGTERM — so detached transports always
|
|
524
|
+
// fall through to the group SIGKILL, even on a cooperative leader exit.
|
|
525
|
+
if (exitedOnTerm && !detached) return;
|
|
526
|
+
signalStdioProcess(proc, detached, "SIGKILL", platform);
|
|
527
|
+
// Once the leader has already exited there is no further `exited` signal
|
|
528
|
+
// to wait on for this call — the SIGKILL above is a fire-and-forget sweep
|
|
529
|
+
// for any surviving group members — so only block on the grace window
|
|
530
|
+
// when the leader itself is still the thing being escalated against.
|
|
531
|
+
if (!exitedOnTerm) await waitForProcessExit(proc.exited, KILL_GRACE_MS);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Stdio transport for MCP servers.
|
|
536
|
+
* Spawns a subprocess and communicates via stdin/stdout.
|
|
537
|
+
*/
|
|
538
|
+
export class StdioTransport implements MCPTransport {
|
|
539
|
+
#process: Subprocess<"pipe", "pipe", "pipe"> | null = null;
|
|
540
|
+
#pendingRequests = new Map<
|
|
541
|
+
string | number,
|
|
542
|
+
{
|
|
543
|
+
resolve: (value: unknown) => void;
|
|
544
|
+
reject: (error: Error) => void;
|
|
545
|
+
}
|
|
546
|
+
>();
|
|
547
|
+
#connected = false;
|
|
548
|
+
#readLoop: Promise<void> | null = null;
|
|
549
|
+
/**
|
|
550
|
+
* Set from `resolveStdioSpawnCommand()`'s `detached` flag in `connect()`.
|
|
551
|
+
* Gates process-group signaling in `close()` — only a transport that
|
|
552
|
+
* actually spawned into its own session may target it.
|
|
553
|
+
*/
|
|
554
|
+
#detached = false;
|
|
555
|
+
readonly #requestIds = new RequestIdAllocator();
|
|
556
|
+
|
|
557
|
+
onClose?: () => void;
|
|
558
|
+
onError?: (error: Error) => void;
|
|
559
|
+
onNotification?: (method: string, params: unknown) => void;
|
|
560
|
+
onRequest?: (method: string, params: unknown) => Promise<unknown>;
|
|
561
|
+
|
|
562
|
+
constructor(private config: MCPStdioServerConfig) {}
|
|
563
|
+
|
|
564
|
+
get connected(): boolean {
|
|
565
|
+
return this.#connected;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Start the subprocess and begin reading.
|
|
570
|
+
*/
|
|
571
|
+
async connect(): Promise<void> {
|
|
572
|
+
if (this.#connected) return;
|
|
573
|
+
|
|
574
|
+
const env = {
|
|
575
|
+
...Bun.env,
|
|
576
|
+
...this.config.env,
|
|
577
|
+
};
|
|
578
|
+
const cwd = this.config.cwd ?? getProjectDir();
|
|
579
|
+
const spawnCommand = await resolveStdioSpawnCommand(this.config, {
|
|
580
|
+
cwd,
|
|
581
|
+
env,
|
|
582
|
+
platform: process.platform,
|
|
583
|
+
hostHasInheritableConsole: hostHasInheritableConsole(),
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
// Platform-derived session and console-window handling come from
|
|
587
|
+
// `resolveStdioSpawnCommand`: Linux/other POSIX detach into their own
|
|
588
|
+
// session to escape terminal job-control signals (SIGTSTP, SIGTTIN);
|
|
589
|
+
// macOS stays attached so TCC can prompt for Apple Events automation;
|
|
590
|
+
// Windows stays attached, and only hides the child when the host has no
|
|
591
|
+
// console to share. See `StdioSpawnCommand`.
|
|
592
|
+
// Keep this on Bun's argv-first overload. The eval JS kernel path that
|
|
593
|
+
// triggers macOS Apple Events TCC prompts uses the same shape; the
|
|
594
|
+
// one-object `{ cmd }` overload timed out before prompting for `mcpbridge`
|
|
595
|
+
// even with `detached: false` (#5085).
|
|
596
|
+
this.#process = Bun.spawn(spawnCommand.cmd, {
|
|
597
|
+
cwd,
|
|
598
|
+
env,
|
|
599
|
+
stdin: "pipe",
|
|
600
|
+
stdout: "pipe",
|
|
601
|
+
stderr: "pipe",
|
|
602
|
+
windowsHide: spawnCommand.windowsHide,
|
|
603
|
+
detached: spawnCommand.detached,
|
|
604
|
+
windowsVerbatimArguments: spawnCommand.windowsVerbatimArguments,
|
|
605
|
+
});
|
|
606
|
+
this.#detached = spawnCommand.detached;
|
|
607
|
+
|
|
608
|
+
this.#connected = true;
|
|
609
|
+
|
|
610
|
+
// Start reading stdout
|
|
611
|
+
this.#readLoop = this.#startReadLoop();
|
|
612
|
+
|
|
613
|
+
// Log stderr for debugging
|
|
614
|
+
this.#startStderrLoop();
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
async #startReadLoop(): Promise<void> {
|
|
618
|
+
if (!this.#process?.stdout) return;
|
|
619
|
+
try {
|
|
620
|
+
for await (const line of readJsonl(this.#process.stdout)) {
|
|
621
|
+
if (!this.#connected) break;
|
|
622
|
+
try {
|
|
623
|
+
this.#handleMessage(line as JsonRpcMessage);
|
|
624
|
+
} catch {
|
|
625
|
+
// Skip malformed lines
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
} catch (error) {
|
|
629
|
+
if (this.#connected) {
|
|
630
|
+
this.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
631
|
+
}
|
|
632
|
+
} finally {
|
|
633
|
+
this.#handleClose();
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
async #startStderrLoop(): Promise<void> {
|
|
638
|
+
if (!this.#process?.stderr) return;
|
|
639
|
+
|
|
640
|
+
const reader = this.#process.stderr.getReader();
|
|
641
|
+
const decoder = new TextDecoder();
|
|
642
|
+
|
|
643
|
+
try {
|
|
644
|
+
while (this.#connected) {
|
|
645
|
+
const { done, value } = await reader.read();
|
|
646
|
+
if (done) break;
|
|
647
|
+
// Log stderr but don't treat as error - servers use it for logging
|
|
648
|
+
const text = decoder.decode(value, { stream: true });
|
|
649
|
+
if (text.trim()) {
|
|
650
|
+
// Could expose via onStderr callback if needed
|
|
651
|
+
// For now, silent - MCP spec says clients MAY capture/ignore
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
} catch {
|
|
655
|
+
// Ignore stderr read errors
|
|
656
|
+
} finally {
|
|
657
|
+
reader.releaseLock();
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
#handleMessage(message: JsonRpcMessage | JsonRpcMessage[]): void {
|
|
662
|
+
if (Array.isArray(message)) {
|
|
663
|
+
for (const m of message) this.#handleMessage(m);
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
// Server-to-client request: has both method and id
|
|
667
|
+
if ("method" in message && "id" in message && message.id != null) {
|
|
668
|
+
void this.#handleServerRequest(message as JsonRpcRequest);
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// Response to our request: has id
|
|
673
|
+
if ("id" in message && message.id != null) {
|
|
674
|
+
const response = message as JsonRpcResponse;
|
|
675
|
+
const pending = this.#pendingRequests.get(response.id);
|
|
676
|
+
if (pending) {
|
|
677
|
+
this.#pendingRequests.delete(response.id);
|
|
678
|
+
if (response.error) {
|
|
679
|
+
pending.reject(new Error(`MCP error ${response.error.code}: ${response.error.message}`));
|
|
680
|
+
} else {
|
|
681
|
+
pending.resolve(response.result);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// Notification: has method but no id
|
|
688
|
+
if ("method" in message) {
|
|
689
|
+
const notification = message as { method: string; params?: unknown };
|
|
690
|
+
this.onNotification?.(notification.method, notification.params);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
async #handleServerRequest(request: JsonRpcRequest): Promise<void> {
|
|
695
|
+
try {
|
|
696
|
+
if (!this.onRequest) {
|
|
697
|
+
this.#sendResponse(request.id, undefined, { code: -32601, message: "Method not found" });
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
const result = await this.onRequest(request.method, request.params);
|
|
701
|
+
this.#sendResponse(request.id, result);
|
|
702
|
+
} catch (error) {
|
|
703
|
+
this.#sendResponse(request.id, undefined, toJsonRpcError(error));
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
#sendResponse(id: string | number, result?: unknown, error?: JsonRpcError): void {
|
|
708
|
+
if (!this.#connected || !this.#process?.stdin) return;
|
|
709
|
+
const response = error
|
|
710
|
+
? { jsonrpc: "2.0" as const, id, error }
|
|
711
|
+
: { jsonrpc: "2.0" as const, id, result: result ?? {} };
|
|
712
|
+
// Silent on failure — a dead subprocess has no use for the response,
|
|
713
|
+
// and the read loop will close the transport on EOF.
|
|
714
|
+
writeFrame(this.#process.stdin, `${JSON.stringify(response)}\n`);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
#handleClose(): void {
|
|
718
|
+
if (!this.#connected) return;
|
|
719
|
+
this.#connected = false;
|
|
720
|
+
|
|
721
|
+
// Reject all pending requests
|
|
722
|
+
for (const [, pending] of this.#pendingRequests) {
|
|
723
|
+
pending.reject(new Error("Transport closed"));
|
|
724
|
+
}
|
|
725
|
+
this.#pendingRequests.clear();
|
|
726
|
+
|
|
727
|
+
this.onClose?.();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
async request<T = unknown>(
|
|
731
|
+
method: string,
|
|
732
|
+
params?: Record<string, unknown>,
|
|
733
|
+
options?: MCPRequestOptions,
|
|
734
|
+
): Promise<T> {
|
|
735
|
+
if (!this.#connected || !this.#process?.stdin) {
|
|
736
|
+
throw new Error("Transport not connected");
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
const id = this.#requestIds.next(this.config.requestIdFormat);
|
|
740
|
+
const request = {
|
|
741
|
+
jsonrpc: "2.0" as const,
|
|
742
|
+
id,
|
|
743
|
+
method,
|
|
744
|
+
params: params ?? {},
|
|
745
|
+
};
|
|
746
|
+
|
|
747
|
+
const timeout = resolveMCPTimeoutMs(this.config.timeout);
|
|
748
|
+
const signal = options?.signal;
|
|
749
|
+
|
|
750
|
+
if (signal?.aborted) {
|
|
751
|
+
const reason = signal.reason instanceof Error ? signal.reason : new Error("Aborted");
|
|
752
|
+
return Promise.reject(reason);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
const { promise, resolve, reject } = Promise.withResolvers<T>();
|
|
756
|
+
let timer: NodeJS.Timeout | undefined;
|
|
757
|
+
let settled = false;
|
|
758
|
+
|
|
759
|
+
const cleanup = () => {
|
|
760
|
+
if (settled) return;
|
|
761
|
+
settled = true;
|
|
762
|
+
if (timer) {
|
|
763
|
+
clearTimeout(timer);
|
|
764
|
+
timer = undefined;
|
|
765
|
+
}
|
|
766
|
+
if (signal) {
|
|
767
|
+
signal.removeEventListener("abort", onAbort);
|
|
768
|
+
}
|
|
769
|
+
this.#pendingRequests.delete(id);
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
const onAbort = () => {
|
|
773
|
+
cleanup();
|
|
774
|
+
const reason = signal?.reason instanceof Error ? signal.reason : new Error("Aborted");
|
|
775
|
+
reject(reason);
|
|
776
|
+
};
|
|
777
|
+
|
|
778
|
+
if (signal) {
|
|
779
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
this.#pendingRequests.set(id, {
|
|
783
|
+
resolve: (value: unknown) => {
|
|
784
|
+
cleanup();
|
|
785
|
+
resolve(value as T);
|
|
786
|
+
},
|
|
787
|
+
reject: (error: Error) => {
|
|
788
|
+
cleanup();
|
|
789
|
+
reject(error);
|
|
790
|
+
},
|
|
791
|
+
});
|
|
792
|
+
|
|
793
|
+
if (isMCPTimeoutEnabled(timeout)) {
|
|
794
|
+
timer = setTimeout(() => {
|
|
795
|
+
cleanup();
|
|
796
|
+
reject(new Error(`Request timeout after ${timeout}ms`));
|
|
797
|
+
}, timeout);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
const stdin = this.#process.stdin;
|
|
801
|
+
const message = `${JSON.stringify(request)}\n`;
|
|
802
|
+
const failFromSend = (error: unknown) => {
|
|
803
|
+
if (settled) return;
|
|
804
|
+
cleanup();
|
|
805
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
806
|
+
};
|
|
807
|
+
try {
|
|
808
|
+
// Never `await` write/flush. Bun's FileSink returns a pending Promise
|
|
809
|
+
// once the OS pipe buffer fills (default ~64 KB on POSIX), and a
|
|
810
|
+
// subprocess that stops draining stdin will park those awaits forever.
|
|
811
|
+
// Awaiting here would keep the async fn stuck above `return promise`,
|
|
812
|
+
// past the timeout timer and the abort handler, orphaning the deferred
|
|
813
|
+
// rejection and hanging the caller (#3945). Route sync throws (Windows
|
|
814
|
+
// EPIPE) and async rejections (POSIX EPIPE on processTicksAndRejections)
|
|
815
|
+
// into `reject()` while leaving the returned promise free to settle
|
|
816
|
+
// from the response, timer, abort signal, or read-loop transport-close.
|
|
817
|
+
const wrote = stdin.write(message);
|
|
818
|
+
if (isThenable(wrote)) wrote.then(undefined, failFromSend);
|
|
819
|
+
const flushed = stdin.flush();
|
|
820
|
+
if (isThenable(flushed)) flushed.then(undefined, failFromSend);
|
|
821
|
+
} catch (error) {
|
|
822
|
+
failFromSend(error);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
return promise;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
async notify(method: string, params?: Record<string, unknown>): Promise<void> {
|
|
829
|
+
if (!this.#connected || !this.#process?.stdin) {
|
|
830
|
+
throw new Error("Transport not connected");
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
const notification = {
|
|
834
|
+
jsonrpc: "2.0" as const,
|
|
835
|
+
method,
|
|
836
|
+
params: params ?? {},
|
|
837
|
+
};
|
|
838
|
+
|
|
839
|
+
// Bun's FileSink can throw EPIPE synchronously on Windows when the
|
|
840
|
+
// subprocess has exited between the last read-loop tick and this
|
|
841
|
+
// write (e.g. an MCP server that dies after returning `initialize`
|
|
842
|
+
// but before `notifications/initialized` is delivered). Tear the
|
|
843
|
+
// transport down so any wired `onClose` (and reconnect machinery)
|
|
844
|
+
// engages, then surface the failure to the caller so a write that
|
|
845
|
+
// dropped on the floor is never silently treated as delivered —
|
|
846
|
+
// `initializeConnection()` runs before the manager installs its
|
|
847
|
+
// `onClose` handler, so a swallowed failure there would yield a
|
|
848
|
+
// "connected" handle wrapping a dead transport. See #1710.
|
|
849
|
+
if (!writeFrame(this.#process.stdin, `${JSON.stringify(notification)}\n`)) {
|
|
850
|
+
this.#handleClose();
|
|
851
|
+
throw new Error(`Transport closed while sending notification "${method}"`);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
async close(): Promise<void> {
|
|
856
|
+
// `close()` is the authoritative resource teardown. `#handleClose()`
|
|
857
|
+
// may have already run (read-loop EOF, or a notify() write failure
|
|
858
|
+
// that surfaces the dead transport to the caller) and flipped
|
|
859
|
+
// `#connected` to false — but the subprocess and read loop are still
|
|
860
|
+
// alive in that path, so we MUST keep cleaning up regardless. Each
|
|
861
|
+
// step is individually guarded so this remains idempotent across
|
|
862
|
+
// repeat calls.
|
|
863
|
+
if (this.#connected) {
|
|
864
|
+
this.#handleClose();
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
if (this.#process) {
|
|
868
|
+
// Grab the handle and null the field immediately (before any
|
|
869
|
+
// `await`) so a concurrent/repeat `close()` sees `#process` already
|
|
870
|
+
// cleared and skips straight past this block — no double-signal.
|
|
871
|
+
const proc = this.#process;
|
|
872
|
+
this.#process = null;
|
|
873
|
+
|
|
874
|
+
// 1. Cooperative EOF first: a well-behaved server sees stdin close
|
|
875
|
+
// and can exit on its own before any signal is sent. Guarded — the
|
|
876
|
+
// sink can throw if the pipe is already closed/dead (e.g. the child
|
|
877
|
+
// already exited and the read loop got there first).
|
|
878
|
+
try {
|
|
879
|
+
proc.stdin.end();
|
|
880
|
+
} catch {
|
|
881
|
+
// Already closed/dead.
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// 2-3. Group-aware SIGTERM (when this transport actually spawned
|
|
885
|
+
// detached), bounded wait, then escalate to SIGKILL. See
|
|
886
|
+
// `terminateStdioProcess` for the exact signaling/escalation rules.
|
|
887
|
+
await terminateStdioProcess(proc, this.#detached);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
if (this.#readLoop) {
|
|
891
|
+
// Do not block/await the read loop as it can hang indefinitely in some environments
|
|
892
|
+
this.#readLoop.catch(() => {});
|
|
893
|
+
this.#readLoop = null;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Create and connect a stdio transport.
|
|
900
|
+
*/
|
|
901
|
+
export async function createStdioTransport(config: MCPStdioServerConfig): Promise<StdioTransport> {
|
|
902
|
+
const transport = new StdioTransport(config);
|
|
903
|
+
await transport.connect();
|
|
904
|
+
return transport;
|
|
905
|
+
}
|