@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
package/src/cursor.ts
ADDED
|
@@ -0,0 +1,960 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import type {
|
|
5
|
+
AgentEvent,
|
|
6
|
+
AgentTool,
|
|
7
|
+
AgentToolContext,
|
|
8
|
+
AgentToolResult,
|
|
9
|
+
AgentToolUpdateCallback,
|
|
10
|
+
} from "@oh-my-pi/pi-agent-core";
|
|
11
|
+
import type {
|
|
12
|
+
CursorMcpCall,
|
|
13
|
+
CursorMcpResource,
|
|
14
|
+
CursorMcpResourceContent,
|
|
15
|
+
CursorShellStreamCallbacks,
|
|
16
|
+
CursorTodoSnapshot,
|
|
17
|
+
CursorExecHandlers as ICursorExecHandlers,
|
|
18
|
+
ToolResultMessage,
|
|
19
|
+
} from "@oh-my-pi/pi-ai";
|
|
20
|
+
import {
|
|
21
|
+
piEscapeRegexLiteral,
|
|
22
|
+
piGrepSkip,
|
|
23
|
+
piJoinPath,
|
|
24
|
+
piLimit,
|
|
25
|
+
piLsPath,
|
|
26
|
+
piReadPath,
|
|
27
|
+
piTimeout,
|
|
28
|
+
} from "@oh-my-pi/pi-ai/providers/cursor/exec-modern";
|
|
29
|
+
import { sanitizeText } from "@oh-my-pi/pi-utils";
|
|
30
|
+
import type { MCPResourceReadResult } from "./mcp/types";
|
|
31
|
+
import type { ApprovalMode } from "./tools/approval";
|
|
32
|
+
import { resolveApproval } from "./tools/approval";
|
|
33
|
+
import { confineToWorkspace, resolveToCwd } from "./tools/path-utils";
|
|
34
|
+
import type { TodoPhase, TodoStatus } from "./tools/todo";
|
|
35
|
+
|
|
36
|
+
/** Phase used for Cursor-owned tasks with no local phase grouping. */
|
|
37
|
+
const CURSOR_TODO_PHASE = "Tasks";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A tool instance the bridge can run, matching the erased shape the session's
|
|
41
|
+
* tool registry stores. The concrete tools have narrower `execute` parameter
|
|
42
|
+
* types than the default `AgentTool`, which only unify through this alias.
|
|
43
|
+
*/
|
|
44
|
+
type CursorBridgeTool = AgentTool<any, any, any>;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The live MCP connections Cursor's resource frames are answered from.
|
|
48
|
+
*
|
|
49
|
+
* Named so every construction site can hand over the same adapter; a session
|
|
50
|
+
* and its advisors share one set of connections.
|
|
51
|
+
*/
|
|
52
|
+
export interface CursorMcpResourceAdapter {
|
|
53
|
+
serverNames(): string[];
|
|
54
|
+
getServerResources(
|
|
55
|
+
name: string,
|
|
56
|
+
): Promise<{ resources: { uri: string; name?: string; description?: string; mimeType?: string }[] } | undefined>;
|
|
57
|
+
readServerResource(name: string, uri: string): Promise<MCPResourceReadResult | undefined>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface CursorExecBridgeOptions {
|
|
61
|
+
cwd: string;
|
|
62
|
+
getCwd?: () => string;
|
|
63
|
+
tools: Map<string, AgentTool>;
|
|
64
|
+
/** Resolves execution overrides (mounted-device permission wrappers) before the canonical map. */
|
|
65
|
+
getExecutableTool?: (name: string) => AgentTool | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* The `replace`-mode `edit` instance `pi_edit` must run, when the session
|
|
68
|
+
* granted `edit` at all.
|
|
69
|
+
*
|
|
70
|
+
* `PiEditExecArgs` is that mode's schema verbatim, and the session's own
|
|
71
|
+
* `edit` may be in any mode — `hashline` by default — whose schema rejects
|
|
72
|
+
* `old_string`/`new_string` outright. {@link tools} therefore cannot be trusted
|
|
73
|
+
* for this one frame: a session that starts on another provider keeps its
|
|
74
|
+
* configured instance in the map (only Cursor sessions move `edit` out), and
|
|
75
|
+
* switching to Cursor later does not rebuild the roster.
|
|
76
|
+
*/
|
|
77
|
+
getEditReplaceTool?: () => CursorBridgeTool | undefined;
|
|
78
|
+
getToolContext?: () => AgentToolContext | undefined;
|
|
79
|
+
emitEvent?: (event: AgentEvent) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Whether frames that mutate the filesystem WITHOUT running a registry tool
|
|
82
|
+
* may do so: the native `delete` frame, and a `read_mcp_resource` carrying
|
|
83
|
+
* `download_path`. Both write or remove workspace files directly instead of
|
|
84
|
+
* consulting {@link tools}, so a background read-only advisor could touch
|
|
85
|
+
* files it was never granted a mutating tool for (issue #5680 review).
|
|
86
|
+
*
|
|
87
|
+
* This is a grant, not a policy: it answers "did the session hand this
|
|
88
|
+
* channel a file-writing tool", which callers derive from their own roster
|
|
89
|
+
* before any bridge-specific rewriting. The primary Cursor session moves
|
|
90
|
+
* `edit` out of {@link tools} and serves it through
|
|
91
|
+
* {@link getEditReplaceTool}, so reading the map here would deny an
|
|
92
|
+
* edit-only session. Defaults to allowed
|
|
93
|
+
* to preserve the primary agent's behavior; callers with a restricted tool
|
|
94
|
+
* set (advisors) opt out. The user's approval policy is resolved separately,
|
|
95
|
+
* per call.
|
|
96
|
+
*/
|
|
97
|
+
allowDirectFileMutation?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Mirror Cursor's server-owned todo list into local session state. Cursor
|
|
100
|
+
* resolves `update_todos` / `read_todos` remotely, so without this bridge
|
|
101
|
+
* the provider's list and the local `todo` state diverge silently.
|
|
102
|
+
*/
|
|
103
|
+
setTodoPhases?: (phases: TodoPhase[]) => void;
|
|
104
|
+
getTodoPhases?: () => TodoPhase[];
|
|
105
|
+
/**
|
|
106
|
+
* Persist the mirrored list to the session branch so it survives reloads.
|
|
107
|
+
* Cursor emits no local `todo` toolResult, so nothing else records it.
|
|
108
|
+
*/
|
|
109
|
+
persistTodoPhases?: (phases: TodoPhase[]) => void;
|
|
110
|
+
/**
|
|
111
|
+
* Build a `grep` tool honoring a frame's own context width and match cap.
|
|
112
|
+
*
|
|
113
|
+
* The modern `pi_grep` frame carries both, and the shared `grep` instance
|
|
114
|
+
* is fixed to the session settings at construction — so without this the
|
|
115
|
+
* two fields are silently dropped. Callers that cannot supply it keep the
|
|
116
|
+
* shared instance and the session's defaults.
|
|
117
|
+
*
|
|
118
|
+
* The returned tool is executed as-is. Callers whose registry tools carry an
|
|
119
|
+
* approval wrapper MUST apply the same wrapper here, or a frame supplying
|
|
120
|
+
* either field silently escapes the approval gate that every other call
|
|
121
|
+
* goes through.
|
|
122
|
+
*/
|
|
123
|
+
createGrepTool?(options: { context?: number; totalMatchLimit?: number }): CursorBridgeTool | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* The session's live MCP connections, for Cursor's resource frames.
|
|
126
|
+
*
|
|
127
|
+
* `list_mcp_resources` / `read_mcp_resource` ask what this client's servers
|
|
128
|
+
* advertise. Without this the bridge answers an empty catalog and
|
|
129
|
+
* `not_found`, hiding resources the session is in fact connected to.
|
|
130
|
+
*
|
|
131
|
+
* `getServerResources` is async because a server's catalog loads in the
|
|
132
|
+
* background after its tools register: a frame arriving in that window would
|
|
133
|
+
* otherwise read the not-yet-populated cache and report an empty catalog,
|
|
134
|
+
* which is indistinguishable from a server that advertises nothing.
|
|
135
|
+
*/
|
|
136
|
+
mcpResources?: CursorMcpResourceAdapter;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Write a downloaded resource without following a link at the target.
|
|
141
|
+
*
|
|
142
|
+
* The containment check and the write are separate syscalls, so a link planted
|
|
143
|
+
* at the target in between would redirect the bytes — the check cannot close
|
|
144
|
+
* that window on its own. `O_NOFOLLOW` decides it atomically for symlinks.
|
|
145
|
+
*
|
|
146
|
+
* A hard link needs a second check: it is a regular file that passes both the
|
|
147
|
+
* containment check and `O_NOFOLLOW` while sharing its inode with a file
|
|
148
|
+
* anywhere else on the volume, so truncating it overwrites that file too.
|
|
149
|
+
* `nlink > 1` on the OPEN handle is the test — statting the path first would
|
|
150
|
+
* reintroduce the race the open just closed. Same reasoning, and the same
|
|
151
|
+
* refusal, as `autolearn/managed-skills.ts`.
|
|
152
|
+
*
|
|
153
|
+
* Truncation therefore happens after that check rather than through `O_TRUNC`,
|
|
154
|
+
* which would have already destroyed the contents by the time it ran.
|
|
155
|
+
*
|
|
156
|
+
* Scope: `O_NOFOLLOW` applies to the FINAL component only. A parent directory
|
|
157
|
+
* swapped for an outward symlink between the check and this open is still
|
|
158
|
+
* followed; refusing that needs an `openat`/dirfd walk of every segment, which
|
|
159
|
+
* this does not attempt — an attacker who can rewrite the workspace tree
|
|
160
|
+
* mid-download is already inside the boundary this guard defends.
|
|
161
|
+
*
|
|
162
|
+
* Parent directories are created first, since the frame may name a path whose
|
|
163
|
+
* directories do not exist yet.
|
|
164
|
+
*
|
|
165
|
+
* `O_NONBLOCK` is what keeps the guard below reachable. A write-only open of a
|
|
166
|
+
* FIFO blocks until a reader arrives, so a `download_path` naming one would
|
|
167
|
+
* hang the turn forever WITHOUT the non-regular check ever running — the open
|
|
168
|
+
* itself never returns. Non-blocking turns that into `ENXIO` when no reader is
|
|
169
|
+
* attached, and hands back a descriptor the `isFile()` check refuses when one
|
|
170
|
+
* is. The flag has no effect on regular files, which is every legitimate
|
|
171
|
+
* target.
|
|
172
|
+
*/
|
|
173
|
+
async function writeWithoutFollowingLinks(absolutePath: string, payload: string | Buffer): Promise<void> {
|
|
174
|
+
await fs.promises.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
175
|
+
const handle = await fs.promises
|
|
176
|
+
.open(
|
|
177
|
+
absolutePath,
|
|
178
|
+
fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK,
|
|
179
|
+
)
|
|
180
|
+
.catch((error: NodeJS.ErrnoException) => {
|
|
181
|
+
// A readerless FIFO. Reported as the refusal it is, rather than the
|
|
182
|
+
// bare "no such device or address" the errno spells out.
|
|
183
|
+
if (error.code === "ENXIO") {
|
|
184
|
+
throw new Error(`Refusing to download onto a special file: ${absolutePath}`);
|
|
185
|
+
}
|
|
186
|
+
throw error;
|
|
187
|
+
});
|
|
188
|
+
try {
|
|
189
|
+
const stat = await handle.stat();
|
|
190
|
+
if (!stat.isFile()) {
|
|
191
|
+
throw new Error(`Refusing to download onto a non-regular file: ${absolutePath}`);
|
|
192
|
+
}
|
|
193
|
+
if (stat.nlink > 1) {
|
|
194
|
+
throw new Error(
|
|
195
|
+
`Refusing to download onto a file with ${stat.nlink} hard links, which would overwrite its other names: ${absolutePath}`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
await handle.truncate(0);
|
|
199
|
+
await handle.writeFile(payload);
|
|
200
|
+
} finally {
|
|
201
|
+
await handle.close();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function createToolResultMessage(
|
|
206
|
+
toolCallId: string,
|
|
207
|
+
toolName: string,
|
|
208
|
+
result: AgentToolResult<unknown>,
|
|
209
|
+
isError: boolean,
|
|
210
|
+
): ToolResultMessage {
|
|
211
|
+
return {
|
|
212
|
+
role: "toolResult",
|
|
213
|
+
toolCallId,
|
|
214
|
+
toolName,
|
|
215
|
+
content: result.content,
|
|
216
|
+
details: result.details,
|
|
217
|
+
isError,
|
|
218
|
+
timestamp: Date.now(),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function buildToolErrorResult(message: string): AgentToolResult<unknown> {
|
|
223
|
+
return {
|
|
224
|
+
content: [{ type: "text", text: message }],
|
|
225
|
+
details: {},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async function executeTool(
|
|
230
|
+
options: CursorExecBridgeOptions,
|
|
231
|
+
toolName: string,
|
|
232
|
+
toolCallId: string,
|
|
233
|
+
args: Record<string, unknown>,
|
|
234
|
+
overrideTool?: CursorBridgeTool,
|
|
235
|
+
): Promise<ToolResultMessage> {
|
|
236
|
+
const tool = overrideTool ?? options.getExecutableTool?.(toolName) ?? options.tools.get(toolName);
|
|
237
|
+
if (!tool) {
|
|
238
|
+
const result = buildToolErrorResult(`Tool "${toolName}" not available`);
|
|
239
|
+
return createToolResultMessage(toolCallId, toolName, result, true);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
options.emitEvent?.({ type: "tool_execution_start", toolCallId, toolName, args });
|
|
243
|
+
|
|
244
|
+
let result: AgentToolResult<unknown>;
|
|
245
|
+
let isError = false;
|
|
246
|
+
|
|
247
|
+
const onUpdate: AgentToolUpdateCallback<unknown> | undefined = options.emitEvent
|
|
248
|
+
? partialResult => {
|
|
249
|
+
const sanitizedResult: AgentToolResult<unknown> = {
|
|
250
|
+
content: partialResult.content.map(c => (c.type === "text" ? { ...c, text: sanitizeText(c.text) } : c)),
|
|
251
|
+
details: partialResult.details,
|
|
252
|
+
};
|
|
253
|
+
options.emitEvent?.({
|
|
254
|
+
type: "tool_execution_update",
|
|
255
|
+
toolCallId,
|
|
256
|
+
toolName,
|
|
257
|
+
args,
|
|
258
|
+
partialResult: sanitizedResult,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
: undefined;
|
|
262
|
+
|
|
263
|
+
try {
|
|
264
|
+
result = await tool.execute(
|
|
265
|
+
toolCallId,
|
|
266
|
+
args as Record<string, unknown>,
|
|
267
|
+
undefined,
|
|
268
|
+
onUpdate,
|
|
269
|
+
options.getToolContext?.(),
|
|
270
|
+
);
|
|
271
|
+
} catch (error) {
|
|
272
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
273
|
+
result = buildToolErrorResult(message);
|
|
274
|
+
isError = true;
|
|
275
|
+
}
|
|
276
|
+
isError ||= result.isError === true;
|
|
277
|
+
|
|
278
|
+
const sanitizedFinalResult: AgentToolResult<unknown> = {
|
|
279
|
+
content: result.content.map(c => (c.type === "text" ? { ...c, text: sanitizeText(c.text) } : c)),
|
|
280
|
+
details: result.details,
|
|
281
|
+
};
|
|
282
|
+
options.emitEvent?.({ type: "tool_execution_end", toolCallId, toolName, result: sanitizedFinalResult, isError });
|
|
283
|
+
|
|
284
|
+
return createToolResultMessage(toolCallId, toolName, result, isError);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Resolve the user's policy for a frame that mutates the filesystem directly.
|
|
289
|
+
*
|
|
290
|
+
* The native `delete` and `read_mcp_resource` download frames both bypass the
|
|
291
|
+
* registry, so no approval wrapper sits in front of them. `write` is the tier
|
|
292
|
+
* a file creation or removal belongs to. Returns `null` when the call may
|
|
293
|
+
* proceed, or the refusal text to answer with.
|
|
294
|
+
*/
|
|
295
|
+
function refuseByWritePolicy(options: CursorExecBridgeOptions, toolName: string, pathArg: string): string | null {
|
|
296
|
+
const context = options.getToolContext?.();
|
|
297
|
+
const settings = context?.settings;
|
|
298
|
+
const approvalMode: ApprovalMode =
|
|
299
|
+
context?.autoApprove === true ? "yolo" : (settings?.get("tools.approvalMode") ?? "yolo");
|
|
300
|
+
const approval = resolveApproval(
|
|
301
|
+
{ name: toolName, approval: "write" },
|
|
302
|
+
{ path: pathArg },
|
|
303
|
+
approvalMode,
|
|
304
|
+
(settings?.get("tools.approval") ?? {}) as Record<string, unknown>,
|
|
305
|
+
);
|
|
306
|
+
if (approval.policy === "allow") return null;
|
|
307
|
+
return approval.policy === "deny"
|
|
308
|
+
? `Tool "${toolName}" is blocked by user policy.`
|
|
309
|
+
: `Tool "${toolName}" requires approval, which this channel cannot request.`;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async function executeDelete(options: CursorExecBridgeOptions, pathArg: string, toolCallId: string) {
|
|
313
|
+
const toolName = "delete";
|
|
314
|
+
|
|
315
|
+
if (options.allowDirectFileMutation === false) {
|
|
316
|
+
const result = buildToolErrorResult(`Tool "${toolName}" not available`);
|
|
317
|
+
return createToolResultMessage(toolCallId, toolName, result, true);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Unlike every other frame, this one mutates the filesystem directly instead
|
|
321
|
+
// of running a registry tool, so no approval wrapper sits in front of it.
|
|
322
|
+
// `allowDirectFileMutation` answers "was a mutating tool granted", which is a
|
|
323
|
+
// different question from "does the user's policy allow this call" — without
|
|
324
|
+
// this, a configured `deny` or an `always-ask` session still lost the file.
|
|
325
|
+
const refusal = refuseByWritePolicy(options, toolName, pathArg);
|
|
326
|
+
if (refusal) {
|
|
327
|
+
return createToolResultMessage(toolCallId, toolName, buildToolErrorResult(refusal), true);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
options.emitEvent?.({ type: "tool_execution_start", toolCallId, toolName, args: { path: pathArg } });
|
|
331
|
+
|
|
332
|
+
const absolutePath = resolveToCwd(pathArg, options.getCwd?.() ?? options.cwd);
|
|
333
|
+
let isError = false;
|
|
334
|
+
let result: AgentToolResult<unknown>;
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
let fileStat: fs.Stats | undefined;
|
|
338
|
+
try {
|
|
339
|
+
fileStat = fs.statSync(absolutePath);
|
|
340
|
+
} catch {
|
|
341
|
+
throw new Error(`File not found: ${pathArg}`);
|
|
342
|
+
}
|
|
343
|
+
if (!fileStat.isFile()) {
|
|
344
|
+
throw new Error(`Path is not a file: ${pathArg}`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
fs.rmSync(absolutePath);
|
|
348
|
+
|
|
349
|
+
const sizeText = fileStat.size ? ` (${fileStat.size} bytes)` : "";
|
|
350
|
+
const message = `Deleted ${pathArg}${sizeText}`;
|
|
351
|
+
result = { content: [{ type: "text", text: message }], details: {} };
|
|
352
|
+
} catch (error) {
|
|
353
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
354
|
+
result = buildToolErrorResult(message);
|
|
355
|
+
isError = true;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
options.emitEvent?.({ type: "tool_execution_end", toolCallId, toolName, result, isError });
|
|
359
|
+
return createToolResultMessage(toolCallId, toolName, result, isError);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function decodeToolCallId(toolCallId?: string): string {
|
|
363
|
+
return toolCallId && toolCallId.length > 0 ? toolCallId : randomUUID();
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function decodeMcpArgs(rawArgs: Record<string, Uint8Array>): Record<string, unknown> {
|
|
367
|
+
const decoded: Record<string, unknown> = {};
|
|
368
|
+
for (const [key, value] of Object.entries(rawArgs)) {
|
|
369
|
+
const text = new TextDecoder().decode(value);
|
|
370
|
+
try {
|
|
371
|
+
decoded[key] = JSON.parse(text);
|
|
372
|
+
} catch {
|
|
373
|
+
decoded[key] = text;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return decoded;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function formatMcpToolErrorMessage(toolName: string, availableTools: string[]): string {
|
|
380
|
+
const list = availableTools.length > 0 ? availableTools.join(", ") : "none";
|
|
381
|
+
return `MCP tool "${toolName}" not found. Available tools: ${list}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* One-line summary for the synthesized todo result. Cursor's server-resolved
|
|
386
|
+
* call produces no local tool output, but the transcript entry still needs
|
|
387
|
+
* text content alongside the phases the UI renders.
|
|
388
|
+
*/
|
|
389
|
+
function formatTodoSyncSummary(phases: TodoPhase[]): string {
|
|
390
|
+
const tasks = phases.flatMap(phase => phase.tasks);
|
|
391
|
+
if (tasks.length === 0) return "No todos";
|
|
392
|
+
const done = tasks.filter(task => task.status === "completed").length;
|
|
393
|
+
return `${done}/${tasks.length} tasks completed`;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Persisted result for a server-resolved todo call.
|
|
398
|
+
*
|
|
399
|
+
* `details` is only attached for an authoritative snapshot, and then
|
|
400
|
+
* `details.phases` is load-bearing rather than decoration: `todoToolRenderer`
|
|
401
|
+
* rebuilds the rendered list exclusively from it, so a mirrored update that
|
|
402
|
+
* omitted it would replay as `Todo 0 tasks` after a reload.
|
|
403
|
+
*
|
|
404
|
+
* A refusal or a server error carries no `details`. Echoing the current phases
|
|
405
|
+
* there would replay a call that changed nothing as if it had re-asserted the
|
|
406
|
+
* whole list — and `event-controller` feeds `details.phases` straight into
|
|
407
|
+
* `setTodos`, so a refused `read_todos` would overwrite live UI state.
|
|
408
|
+
*/
|
|
409
|
+
function buildTodoSyncResult(
|
|
410
|
+
toolCallId: string,
|
|
411
|
+
phases: TodoPhase[] | undefined,
|
|
412
|
+
error: string | null,
|
|
413
|
+
): ToolResultMessage {
|
|
414
|
+
return {
|
|
415
|
+
role: "toolResult",
|
|
416
|
+
toolCallId,
|
|
417
|
+
toolName: "todo",
|
|
418
|
+
content: [
|
|
419
|
+
{ type: "text", text: error ?? (phases ? formatTodoSyncSummary(phases) : "Todo snapshot not mirrored") },
|
|
420
|
+
],
|
|
421
|
+
details: phases ? { phases, storage: "session" } : undefined,
|
|
422
|
+
isError: error !== null,
|
|
423
|
+
timestamp: Date.now(),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export class CursorExecHandlers implements ICursorExecHandlers {
|
|
428
|
+
constructor(private options: CursorExecBridgeOptions) {}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Modern Cursor builds paginate the legacy `read` frame with
|
|
432
|
+
* `offset`/`limit`, exactly as `pi_read` does. Dropping them returns the
|
|
433
|
+
* whole file (or its own truncation) for every page, so a model walking a
|
|
434
|
+
* large file never advances. Composed with the same helper, so both frames
|
|
435
|
+
* translate a range identically.
|
|
436
|
+
*/
|
|
437
|
+
async read(args: Parameters<NonNullable<ICursorExecHandlers["read"]>>[0]) {
|
|
438
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
439
|
+
const composed = piReadPath(args.path, args.offset, args.limit);
|
|
440
|
+
// A present `limit: 0` asks for zero lines; no selector expresses that.
|
|
441
|
+
if (composed === null) {
|
|
442
|
+
return createToolResultMessage(toolCallId, "read", { content: [{ type: "text", text: "" }] }, false);
|
|
443
|
+
}
|
|
444
|
+
return await executeTool(this.options, "read", toolCallId, { path: composed });
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
async ls(args: Parameters<NonNullable<ICursorExecHandlers["ls"]>>[0]) {
|
|
448
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
449
|
+
// Redirect ls to read tool, which handles directories
|
|
450
|
+
const toolResultMessage = await executeTool(this.options, "read", toolCallId, { path: args.path });
|
|
451
|
+
return toolResultMessage;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Modern Cursor builds paginate this frame with `offset`. The local `grep`
|
|
456
|
+
* paginates by file through `skip`, which is the same unit its own
|
|
457
|
+
* "use skip=N for the next page" advice counts in — so an unforwarded
|
|
458
|
+
* offset re-runs the identical search and returns page one forever.
|
|
459
|
+
*/
|
|
460
|
+
async grep(args: Parameters<NonNullable<ICursorExecHandlers["grep"]>>[0]) {
|
|
461
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
462
|
+
const searchPath = args.glob ? `${args.path || "."}/${args.glob}` : args.path || ".";
|
|
463
|
+
const toolResultMessage = await executeTool(this.options, "grep", toolCallId, {
|
|
464
|
+
pattern: args.pattern,
|
|
465
|
+
path: searchPath,
|
|
466
|
+
case: args.caseInsensitive === true ? false : undefined,
|
|
467
|
+
skip: piGrepSkip(args.offset),
|
|
468
|
+
});
|
|
469
|
+
return toolResultMessage;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
async write(args: Parameters<NonNullable<ICursorExecHandlers["write"]>>[0]) {
|
|
473
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
474
|
+
const content = args.fileText ?? new TextDecoder().decode(args.fileBytes ?? new Uint8Array());
|
|
475
|
+
const toolResultMessage = await executeTool(this.options, "write", toolCallId, {
|
|
476
|
+
path: args.path,
|
|
477
|
+
content,
|
|
478
|
+
});
|
|
479
|
+
return toolResultMessage;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
async delete(args: Parameters<NonNullable<ICursorExecHandlers["delete"]>>[0]) {
|
|
483
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
484
|
+
const toolResultMessage = await executeDelete(this.options, args.path, toolCallId);
|
|
485
|
+
return toolResultMessage;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
async shell(args: Parameters<NonNullable<ICursorExecHandlers["shell"]>>[0]) {
|
|
489
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
490
|
+
const timeoutSeconds = args.timeout && args.timeout > 0 ? args.timeout : undefined;
|
|
491
|
+
const toolResultMessage = await executeTool(this.options, "bash", toolCallId, {
|
|
492
|
+
command: args.command,
|
|
493
|
+
cwd: args.workingDirectory || undefined,
|
|
494
|
+
timeout: timeoutSeconds,
|
|
495
|
+
});
|
|
496
|
+
return toolResultMessage;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
async shellStream(
|
|
500
|
+
args: Parameters<NonNullable<ICursorExecHandlers["shellStream"]>>[0],
|
|
501
|
+
callbacks: CursorShellStreamCallbacks,
|
|
502
|
+
) {
|
|
503
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
504
|
+
const toolName = "bash";
|
|
505
|
+
const tool = this.options.tools.get(toolName);
|
|
506
|
+
if (!tool) {
|
|
507
|
+
const result = buildToolErrorResult(`Tool "${toolName}" not available`);
|
|
508
|
+
return createToolResultMessage(toolCallId, toolName, result, true);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
const timeoutSeconds = args.timeout && args.timeout > 0 ? args.timeout : undefined;
|
|
512
|
+
const toolArgs: Record<string, unknown> = {
|
|
513
|
+
command: args.command,
|
|
514
|
+
cwd: args.workingDirectory || undefined,
|
|
515
|
+
timeout: timeoutSeconds,
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
this.options.emitEvent?.({ type: "tool_execution_start", toolCallId, toolName, args: toolArgs });
|
|
519
|
+
|
|
520
|
+
let result: AgentToolResult<unknown>;
|
|
521
|
+
let isError = false;
|
|
522
|
+
|
|
523
|
+
let rawText = "";
|
|
524
|
+
let sanitizedRawText = "";
|
|
525
|
+
let streamedSanitizedText = "";
|
|
526
|
+
let canStreamSanitizedDelta = true;
|
|
527
|
+
const onUpdate: AgentToolUpdateCallback<unknown> = partialResult => {
|
|
528
|
+
const newRawText = partialResult.content.map(c => (c.type === "text" ? c.text : "")).join("");
|
|
529
|
+
if (newRawText === rawText) {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
rawText = newRawText;
|
|
533
|
+
sanitizedRawText = sanitizeText(newRawText);
|
|
534
|
+
const sanitizedPartialResult: AgentToolResult<unknown> = {
|
|
535
|
+
content: [{ type: "text" as const, text: sanitizedRawText }],
|
|
536
|
+
details: partialResult.details,
|
|
537
|
+
};
|
|
538
|
+
this.options.emitEvent?.({
|
|
539
|
+
type: "tool_execution_update",
|
|
540
|
+
toolCallId,
|
|
541
|
+
toolName,
|
|
542
|
+
args: toolArgs,
|
|
543
|
+
partialResult: sanitizedPartialResult,
|
|
544
|
+
});
|
|
545
|
+
if (!canStreamSanitizedDelta) {
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
if (sanitizedRawText.startsWith(streamedSanitizedText)) {
|
|
549
|
+
const sanitizedDelta = sanitizedRawText.slice(streamedSanitizedText.length);
|
|
550
|
+
streamedSanitizedText = sanitizedRawText;
|
|
551
|
+
if (sanitizedDelta) {
|
|
552
|
+
callbacks.onStdout(sanitizedDelta);
|
|
553
|
+
}
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
// Cursor's shell-stream callback is append-only. Once the sanitized snapshot
|
|
557
|
+
// stops being a prefix extension, we can no longer repair the stream safely.
|
|
558
|
+
// Keep emitting full snapshots via tool_execution_update, but stop stdout deltas.
|
|
559
|
+
canStreamSanitizedDelta = false;
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
try {
|
|
563
|
+
result = await tool.execute(toolCallId, toolArgs, undefined, onUpdate, this.options.getToolContext?.());
|
|
564
|
+
} catch (error) {
|
|
565
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
566
|
+
result = buildToolErrorResult(message);
|
|
567
|
+
isError = true;
|
|
568
|
+
}
|
|
569
|
+
isError ||= result.isError === true;
|
|
570
|
+
|
|
571
|
+
// onUpdate may not fire for every chunk — flush any remaining output
|
|
572
|
+
// from the final result that wasn't already streamed.
|
|
573
|
+
const finalRawText = result.content.map(c => (c.type === "text" ? c.text : "")).join("");
|
|
574
|
+
if (finalRawText !== rawText) {
|
|
575
|
+
rawText = finalRawText;
|
|
576
|
+
sanitizedRawText = sanitizeText(finalRawText);
|
|
577
|
+
}
|
|
578
|
+
if (canStreamSanitizedDelta && sanitizedRawText.startsWith(streamedSanitizedText)) {
|
|
579
|
+
const finalDelta = sanitizedRawText.slice(streamedSanitizedText.length);
|
|
580
|
+
streamedSanitizedText = sanitizedRawText;
|
|
581
|
+
if (finalDelta) {
|
|
582
|
+
callbacks.onStdout(finalDelta);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
const sanitizedFinalResult: AgentToolResult<unknown> = {
|
|
587
|
+
content: result.content.map(c => (c.type === "text" ? { ...c, text: sanitizeText(c.text) } : c)),
|
|
588
|
+
details: result.details,
|
|
589
|
+
};
|
|
590
|
+
this.options.emitEvent?.({
|
|
591
|
+
type: "tool_execution_end",
|
|
592
|
+
toolCallId,
|
|
593
|
+
toolName,
|
|
594
|
+
result: sanitizedFinalResult,
|
|
595
|
+
isError,
|
|
596
|
+
});
|
|
597
|
+
return createToolResultMessage(toolCallId, toolName, result, isError);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
async diagnostics(args: Parameters<NonNullable<ICursorExecHandlers["diagnostics"]>>[0]) {
|
|
601
|
+
const toolCallId = decodeToolCallId(args.toolCallId);
|
|
602
|
+
const toolResultMessage = await executeTool(this.options, "lsp", toolCallId, {
|
|
603
|
+
action: "diagnostics",
|
|
604
|
+
file: args.path,
|
|
605
|
+
});
|
|
606
|
+
return toolResultMessage;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Modern Cursor CLI Pi tool frames (`ExecServerMessage` 45-51).
|
|
610
|
+
*
|
|
611
|
+
* These are a separate frame family from the legacy `read`/`shell`/... set,
|
|
612
|
+
* not aliases: different args, different result oneofs, and no `tool_call_id`
|
|
613
|
+
* (the provider mints one and passes it in `call.toolCallId`). Each maps onto
|
|
614
|
+
* the local tool with matching semantics, so the same approval, sandboxing
|
|
615
|
+
* and event plumbing applies as for a model-issued call.
|
|
616
|
+
*/
|
|
617
|
+
/**
|
|
618
|
+
* `offset`/`limit` are a 1-indexed start line plus a line count (verified
|
|
619
|
+
* against the reference `LocalPiReadExecutor`), which is exactly the local
|
|
620
|
+
* `read` tool's `:N+K` inline selector — the tool takes no range kwargs, so
|
|
621
|
+
* the range has to be composed onto the path or ranged reads silently
|
|
622
|
+
* return the whole file.
|
|
623
|
+
*/
|
|
624
|
+
async piRead(call: Parameters<NonNullable<ICursorExecHandlers["piRead"]>>[0]) {
|
|
625
|
+
const { path: readPath, offset, limit } = call.args;
|
|
626
|
+
const composed = piReadPath(readPath, offset, limit);
|
|
627
|
+
// A present `limit: 0` asks for zero lines. The reference slices an empty
|
|
628
|
+
// string for it; no `read` selector expresses that, so answer directly
|
|
629
|
+
// rather than falling back to a whole-file read.
|
|
630
|
+
if (composed === null) {
|
|
631
|
+
return createToolResultMessage(call.toolCallId, "read", { content: [{ type: "text", text: "" }] }, false);
|
|
632
|
+
}
|
|
633
|
+
return await executeTool(this.options, "read", call.toolCallId, { path: composed });
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
async piBash(call: Parameters<NonNullable<ICursorExecHandlers["piBash"]>>[0]) {
|
|
637
|
+
return await executeTool(this.options, "bash", call.toolCallId, {
|
|
638
|
+
command: call.args.command,
|
|
639
|
+
timeout: piTimeout(call.args.timeout),
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* `PiEditExecArgs` carries a path plus `oldText`/`newText` replacement
|
|
645
|
+
* pairs. A single replacement maps onto the model-facing single-edit
|
|
646
|
+
* `replace` schema verbatim; a multi-replacement frame still runs as ONE
|
|
647
|
+
* tool lifecycle (one start/end event pair, one aggregate diff), so it is
|
|
648
|
+
* sent in the tool's internal `edits` batch form (`ReplaceBatchParams`),
|
|
649
|
+
* which only this bridge produces.
|
|
650
|
+
*
|
|
651
|
+
* The replace-mode instance is requested explicitly rather than resolved
|
|
652
|
+
* from {@link CursorExecBridgeOptions.tools}: the registry's `edit` is in
|
|
653
|
+
* the session's configured mode, whose schema rejects these arguments.
|
|
654
|
+
*/
|
|
655
|
+
async piEdit(call: Parameters<NonNullable<ICursorExecHandlers["piEdit"]>>[0]) {
|
|
656
|
+
const edits = call.args.edits.map(edit => ({ old_string: edit.oldText, new_string: edit.newText }));
|
|
657
|
+
const args = edits.length === 1 ? { path: call.args.path, ...edits[0] } : { path: call.args.path, edits };
|
|
658
|
+
return await executeTool(this.options, "edit", call.toolCallId, args, this.options.getEditReplaceTool?.());
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
async piWrite(call: Parameters<NonNullable<ICursorExecHandlers["piWrite"]>>[0]) {
|
|
662
|
+
return await executeTool(this.options, "write", call.toolCallId, {
|
|
663
|
+
path: call.args.path,
|
|
664
|
+
content: call.args.content,
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* `literal` makes the pattern a fixed string; the local tool is regex-only,
|
|
670
|
+
* so the pattern is escaped on the way in (same translation the legacy pi
|
|
671
|
+
* shim does).
|
|
672
|
+
*
|
|
673
|
+
* `context` and `limit` are not expressible in the model-facing schema —
|
|
674
|
+
* context width comes from settings fixed at tool construction — so the
|
|
675
|
+
* frame's values are honored by building a per-call `grep` through
|
|
676
|
+
* {@link CursorExecBridgeOptions.createGrepTool}. Both are `optional int32`,
|
|
677
|
+
* so a present `0` context means "no context lines", not "use the default".
|
|
678
|
+
* Without the factory the shared instance runs with session defaults.
|
|
679
|
+
*/
|
|
680
|
+
async piGrep(call: Parameters<NonNullable<ICursorExecHandlers["piGrep"]>>[0]) {
|
|
681
|
+
const { pattern, path, glob, ignoreCase, literal, context, limit } = call.args;
|
|
682
|
+
const scoped =
|
|
683
|
+
context !== undefined || limit !== undefined
|
|
684
|
+
? this.options.createGrepTool?.({ context, totalMatchLimit: piLimit(limit) })
|
|
685
|
+
: undefined;
|
|
686
|
+
// Same arg mapping as the legacy `grep` handler: the local tool takes one
|
|
687
|
+
// path spec, and its `case` flag is case-SENSITIVITY, the inverse of the
|
|
688
|
+
// frame's `ignore_case`.
|
|
689
|
+
return await executeTool(
|
|
690
|
+
this.options,
|
|
691
|
+
"grep",
|
|
692
|
+
call.toolCallId,
|
|
693
|
+
{
|
|
694
|
+
pattern: literal === true ? piEscapeRegexLiteral(pattern) : pattern,
|
|
695
|
+
path: glob ? piJoinPath(path, glob) : path || ".",
|
|
696
|
+
case: ignoreCase === true ? false : undefined,
|
|
697
|
+
},
|
|
698
|
+
scoped,
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* `pi_find` is a filename search, which is the local `glob` tool — not
|
|
704
|
+
* `grep`. Its `pattern` is a glob, joined onto `path` because `glob` takes a
|
|
705
|
+
* single combined path spec.
|
|
706
|
+
*
|
|
707
|
+
* `limit` is `optional int32`, so `0` is present rather than unset; the
|
|
708
|
+
* reference clamps it with `Math.max(1, limit ?? 1000)`, and an unset limit
|
|
709
|
+
* leaves the local tool's own default in place.
|
|
710
|
+
*/
|
|
711
|
+
async piFind(call: Parameters<NonNullable<ICursorExecHandlers["piFind"]>>[0]) {
|
|
712
|
+
const { pattern, path, limit } = call.args;
|
|
713
|
+
return await executeTool(this.options, "glob", call.toolCallId, {
|
|
714
|
+
path: piJoinPath(path, pattern),
|
|
715
|
+
limit: piLimit(limit),
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* Redirected to `read`, which lists directories — same as the legacy `ls`.
|
|
721
|
+
* The frame's entry `limit` is not mapped; see {@link piLsPath}.
|
|
722
|
+
*/
|
|
723
|
+
async piLs(call: Parameters<NonNullable<ICursorExecHandlers["piLs"]>>[0]) {
|
|
724
|
+
return await executeTool(this.options, "read", call.toolCallId, { path: piLsPath(call.args.path) });
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* The resources this client's MCP servers advertise.
|
|
729
|
+
*
|
|
730
|
+
* Cursor addresses a later read by `server`, so every entry carries the name
|
|
731
|
+
* it came from. An absent `server` filter means "all of them".
|
|
732
|
+
*/
|
|
733
|
+
async listMcpResources({ server }: { server?: string }): Promise<CursorMcpResource[]> {
|
|
734
|
+
const mcp = this.options.mcpResources;
|
|
735
|
+
if (!mcp) return [];
|
|
736
|
+
const names = server ? [server] : mcp.serverNames();
|
|
737
|
+
// Concurrently: each name may block on that server's first catalog load,
|
|
738
|
+
// and a slow server should not delay the rest of the listing.
|
|
739
|
+
const catalogs = await Promise.all(names.map(async name => [name, await mcp.getServerResources(name)] as const));
|
|
740
|
+
const listed: CursorMcpResource[] = [];
|
|
741
|
+
for (const [name, catalog] of catalogs) {
|
|
742
|
+
for (const resource of catalog?.resources ?? []) {
|
|
743
|
+
listed.push({
|
|
744
|
+
uri: resource.uri,
|
|
745
|
+
name: resource.name,
|
|
746
|
+
description: resource.description,
|
|
747
|
+
mimeType: resource.mimeType,
|
|
748
|
+
server: name,
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
return listed;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Read one resource, or `null` when the server or uri is unknown.
|
|
757
|
+
*
|
|
758
|
+
* MCP returns a list of content items; the wire carries exactly one text or
|
|
759
|
+
* blob. Text items are joined, since a multi-part text resource is one
|
|
760
|
+
* document; otherwise the first blob stands in. `blob` arrives base64 and
|
|
761
|
+
* the wire wants bytes.
|
|
762
|
+
*
|
|
763
|
+
* A `downloadPath` frame is a different contract: write the bytes to that
|
|
764
|
+
* workspace-relative path and answer with the path alone, so a large binary
|
|
765
|
+
* lands on disk instead of in the model's context. That makes it a workspace
|
|
766
|
+
* mutation reached without a registry tool, so it is gated exactly like the
|
|
767
|
+
* native `delete` frame — on the session actually granting a file-writing
|
|
768
|
+
* tool, and on the user's `write`-tier policy. The gate runs before the read
|
|
769
|
+
* so a refused download never fetches the resource either.
|
|
770
|
+
*/
|
|
771
|
+
async readMcpResource({
|
|
772
|
+
server,
|
|
773
|
+
uri,
|
|
774
|
+
downloadPath,
|
|
775
|
+
}: {
|
|
776
|
+
server: string;
|
|
777
|
+
uri: string;
|
|
778
|
+
downloadPath?: string;
|
|
779
|
+
}): Promise<CursorMcpResourceContent | null> {
|
|
780
|
+
if (downloadPath) {
|
|
781
|
+
if (this.options.allowDirectFileMutation === false) {
|
|
782
|
+
throw new Error('Tool "write" not available: this session cannot download resources to disk.');
|
|
783
|
+
}
|
|
784
|
+
const refusal = refuseByWritePolicy(this.options, "write", downloadPath);
|
|
785
|
+
if (refusal) throw new Error(refusal);
|
|
786
|
+
}
|
|
787
|
+
const mcp = this.options.mcpResources;
|
|
788
|
+
if (!mcp) return null;
|
|
789
|
+
const read = await mcp.readServerResource(server, uri);
|
|
790
|
+
if (!read) return null;
|
|
791
|
+
// The mime type must describe the bytes actually sent, not whatever item
|
|
792
|
+
// happened to be first: an image blob followed by a text note would
|
|
793
|
+
// otherwise label the text `image/png` and mislead the model about what
|
|
794
|
+
// it is holding. Each branch below takes the type from its own producer.
|
|
795
|
+
const textItems = read.contents.filter(item => item.text !== undefined);
|
|
796
|
+
const texts = textItems.map(item => item.text as string);
|
|
797
|
+
const blobItem = read.contents.find(item => item.blob !== undefined);
|
|
798
|
+
const blob = blobItem?.blob;
|
|
799
|
+
const textMimeType = textItems[0]?.mimeType;
|
|
800
|
+
const blobMimeType = blobItem?.mimeType;
|
|
801
|
+
|
|
802
|
+
if (downloadPath) {
|
|
803
|
+
// Text resources download as their own bytes; a blob decodes first.
|
|
804
|
+
const payload =
|
|
805
|
+
texts.length > 0 ? texts.join("\n") : blob !== undefined ? Buffer.from(blob, "base64") : undefined;
|
|
806
|
+
if (payload === undefined) return null;
|
|
807
|
+
// The path is workspace-relative BY CONTRACT, but it arrives from the
|
|
808
|
+
// server, and `resolveToCwd` deliberately honors absolute paths and
|
|
809
|
+
// `..` for user-authored tool input. Taking it at its word would let a
|
|
810
|
+
// frame write anywhere this process can reach, so confine it here
|
|
811
|
+
// rather than trusting the declaration.
|
|
812
|
+
const cwd = this.options.getCwd?.() ?? this.options.cwd;
|
|
813
|
+
const absolutePath = confineToWorkspace(downloadPath, cwd);
|
|
814
|
+
if (!absolutePath) throw new Error(`Refusing to download outside the workspace: ${downloadPath}`);
|
|
815
|
+
await writeWithoutFollowingLinks(absolutePath, payload);
|
|
816
|
+
// The path echoed back is the one the frame asked for; the model
|
|
817
|
+
// addresses it the same relative way.
|
|
818
|
+
return { uri, mimeType: texts.length > 0 ? textMimeType : blobMimeType, downloadPath };
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
if (texts.length > 0) return { uri, mimeType: textMimeType, text: texts.join("\n") };
|
|
822
|
+
if (blob === undefined) return null;
|
|
823
|
+
return { uri, mimeType: blobMimeType, blob: Buffer.from(blob, "base64") };
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Settle a completed native Cursor todo call, mirroring its list when the
|
|
828
|
+
* server supplied an authoritative one.
|
|
829
|
+
*
|
|
830
|
+
* Cursor's snapshot is a flat list, so tasks already known locally keep
|
|
831
|
+
* their phase and only their status is updated; unknown tasks land in a
|
|
832
|
+
* single fallback phase. Statuses come straight from the server snapshot —
|
|
833
|
+
* no local normalization, or an all-pending remote list would gain a
|
|
834
|
+
* phantom in-progress task the remote list does not have.
|
|
835
|
+
*
|
|
836
|
+
* The snapshot is also persisted to the session branch. Every other
|
|
837
|
+
* provider's todo state survives a reload because `todo` runs locally and
|
|
838
|
+
* its `toolResult` (carrying `details.phases`) lands in the branch, which
|
|
839
|
+
* `#syncTodoPhasesFromBranch` replays. Cursor resolves the tool remotely and
|
|
840
|
+
* emits no such result, so without an explicit entry the list is in-memory
|
|
841
|
+
* only and every reload, rewind, compaction, or session switch drops it.
|
|
842
|
+
*
|
|
843
|
+
* This ALWAYS settles the call and returns the result to persist, even when
|
|
844
|
+
* nothing is mirrored. Two reasons it cannot bail out early:
|
|
845
|
+
*
|
|
846
|
+
* - the interactive card leaves `pendingTools` only on a matching
|
|
847
|
+
* `tool_execution_end`, so staying silent leaves it animating forever;
|
|
848
|
+
* - an unpaired `toolCall` is stripped as dangling by `buildSessionContext`,
|
|
849
|
+
* erasing the interaction from every rebuilt transcript.
|
|
850
|
+
*
|
|
851
|
+
* A `null` snapshot means nothing may be mirrored — a server `error`, or a
|
|
852
|
+
* benign refusal: a filtered, truncated, or empty read, or a snapshot the
|
|
853
|
+
* local model cannot represent. Local state is left untouched, and the result
|
|
854
|
+
* carries no `details` (text `"Todo snapshot not mirrored"`): `event-controller`
|
|
855
|
+
* feeds `details.phases` straight into `setTodos`, so echoing the current list
|
|
856
|
+
* back would let a call that changed nothing overwrite live UI state.
|
|
857
|
+
*/
|
|
858
|
+
todoSync(snapshot: CursorTodoSnapshot | null, toolCallId: string, error: string | null = null): ToolResultMessage {
|
|
859
|
+
const setPhases = this.options.setTodoPhases;
|
|
860
|
+
const existing = this.options.getTodoPhases?.() ?? [];
|
|
861
|
+
|
|
862
|
+
// Mirroring is gated on having both a snapshot and somewhere to put it.
|
|
863
|
+
// Settling the call is NOT: the interactive card leaves `pendingTools`
|
|
864
|
+
// only on a matching `tool_execution_end`, so a refusal, a server error,
|
|
865
|
+
// or a host with no local todo state must still resolve it.
|
|
866
|
+
let phases: TodoPhase[] | undefined;
|
|
867
|
+
if (snapshot && setPhases) {
|
|
868
|
+
const phaseByContent = new Map<string, string>();
|
|
869
|
+
for (const phase of existing) {
|
|
870
|
+
for (const task of phase.tasks) phaseByContent.set(task.content, phase.name);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
const grouped = new Map<string, TodoPhase["tasks"]>();
|
|
874
|
+
for (const todo of snapshot.todos) {
|
|
875
|
+
const name = phaseByContent.get(todo.content) ?? CURSOR_TODO_PHASE;
|
|
876
|
+
let tasks = grouped.get(name);
|
|
877
|
+
if (!tasks) {
|
|
878
|
+
tasks = [];
|
|
879
|
+
grouped.set(name, tasks);
|
|
880
|
+
}
|
|
881
|
+
tasks.push({ content: todo.content, status: todo.status as TodoStatus });
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// Preserve the local phase order; phases new to this snapshot append.
|
|
885
|
+
const next: TodoPhase[] = [];
|
|
886
|
+
for (const phase of existing) {
|
|
887
|
+
const tasks = grouped.get(phase.name);
|
|
888
|
+
if (!tasks) continue;
|
|
889
|
+
next.push({ name: phase.name, tasks });
|
|
890
|
+
grouped.delete(phase.name);
|
|
891
|
+
}
|
|
892
|
+
for (const [name, tasks] of grouped) next.push({ name, tasks });
|
|
893
|
+
setPhases(next);
|
|
894
|
+
this.options.persistTodoPhases?.(next);
|
|
895
|
+
phases = next;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
const result = buildTodoSyncResult(toolCallId, phases, error);
|
|
899
|
+
// This completion is emitted synchronously mid-parse, while the streamed
|
|
900
|
+
// `toolcall_start` that creates the visible card rides
|
|
901
|
+
// `AssistantMessageEventStream` and lands a microtask later. When Cursor
|
|
902
|
+
// packs start and completion into one HTTP/2 chunk the completion arrives
|
|
903
|
+
// first; the interactive controller holds it as an orphan and replays it
|
|
904
|
+
// once the streamed block creates the card (`event-controller.ts`,
|
|
905
|
+
// `#orphanedToolCompletions`). Emitting a synthetic `tool_execution_start`
|
|
906
|
+
// here instead was measured and rejected: settling deletes the pending
|
|
907
|
+
// entry, and the next cumulative `message_update` re-creates the card —
|
|
908
|
+
// one settled card plus one stuck forever.
|
|
909
|
+
this.options.emitEvent?.({
|
|
910
|
+
type: "tool_execution_end",
|
|
911
|
+
toolCallId,
|
|
912
|
+
toolName: "todo",
|
|
913
|
+
result: { content: result.content, details: result.details },
|
|
914
|
+
isError: error !== null,
|
|
915
|
+
});
|
|
916
|
+
return result;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
async mcp(call: CursorMcpCall) {
|
|
920
|
+
const toolName = call.toolName || call.name;
|
|
921
|
+
const toolCallId = decodeToolCallId(call.toolCallId);
|
|
922
|
+
const tool = this.options.getExecutableTool?.(toolName) ?? this.options.tools.get(toolName);
|
|
923
|
+
if (!tool) {
|
|
924
|
+
const availableTools = Array.from(this.options.tools.keys()).filter(name => name.startsWith("mcp__"));
|
|
925
|
+
const message = formatMcpToolErrorMessage(toolName, availableTools);
|
|
926
|
+
const result = buildToolErrorResult(message);
|
|
927
|
+
return createToolResultMessage(toolCallId, toolName, result, true);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
const args = Object.keys(call.args ?? {}).length > 0 ? call.args : decodeMcpArgs(call.rawArgs ?? {});
|
|
931
|
+
const toolResultMessage = await executeTool(this.options, toolName, toolCallId, args);
|
|
932
|
+
return toolResultMessage;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
/**
|
|
936
|
+
* Resolve an MCP call's approval without running it.
|
|
937
|
+
*
|
|
938
|
+
* Same resolution the wrapper applies at execution time, minus the
|
|
939
|
+
* execution: an unknown tool is not approvable, and a `prompt` is not an
|
|
940
|
+
* approval — the frame has no way to carry an interactive question, and the
|
|
941
|
+
* user is asked for real when the call itself arrives.
|
|
942
|
+
*/
|
|
943
|
+
async mcpApprovalPreflight(call: CursorMcpCall) {
|
|
944
|
+
const toolName = call.toolName || call.name;
|
|
945
|
+
const tool = this.options.getExecutableTool?.(toolName) ?? this.options.tools.get(toolName);
|
|
946
|
+
if (!tool) return false;
|
|
947
|
+
const context = this.options.getToolContext?.();
|
|
948
|
+
const settings = context?.settings;
|
|
949
|
+
const approvalMode: ApprovalMode =
|
|
950
|
+
context?.autoApprove === true ? "yolo" : (settings?.get("tools.approvalMode") ?? "yolo");
|
|
951
|
+
const args = Object.keys(call.args ?? {}).length > 0 ? call.args : decodeMcpArgs(call.rawArgs ?? {});
|
|
952
|
+
const approval = resolveApproval(
|
|
953
|
+
tool,
|
|
954
|
+
args,
|
|
955
|
+
approvalMode,
|
|
956
|
+
(settings?.get("tools.approval") ?? {}) as Record<string, unknown>,
|
|
957
|
+
);
|
|
958
|
+
return approval.policy === "allow";
|
|
959
|
+
}
|
|
960
|
+
}
|