@kr78/pi-coding-agent 17.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14861 -0
- package/README.md +35 -0
- package/dist/CHANGELOG-chtdxh1z.md +14861 -0
- package/dist/cli.js +20483 -0
- package/dist/template-c2hyaytt.js +1653 -0
- package/dist/template-f8wx9vfn.css +1355 -0
- package/dist/template-qat058wr.html +55 -0
- package/dist/tool-views.generated-jdfmzwmn.js +35 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +78 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +169 -0
- package/package.json +587 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/bench-title-models.ts +332 -0
- package/scripts/build-binary.ts +117 -0
- package/scripts/bundle-dist.ts +123 -0
- package/scripts/compile-binary.ts +69 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +58 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/legacy-pi-virtual-module.ts +205 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +51 -0
- package/scripts/omp.ts +19 -0
- package/scripts/security-compare.ts +40 -0
- package/src/advisor/advise-tool.ts +234 -0
- package/src/advisor/config.ts +341 -0
- package/src/advisor/emission-guard.ts +172 -0
- package/src/advisor/index.ts +6 -0
- package/src/advisor/runtime.ts +1412 -0
- package/src/advisor/transcript-recorder.ts +215 -0
- package/src/advisor/watchdog.ts +135 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +847 -0
- package/src/auto-thinking/classifier.ts +220 -0
- package/src/autolearn/controller.ts +152 -0
- package/src/autolearn/managed-skills.ts +255 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +331 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +541 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +700 -0
- package/src/autoresearch/tools/init-experiment.ts +268 -0
- package/src/autoresearch/tools/log-experiment.ts +520 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +467 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +115 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +298 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +69 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +187 -0
- package/src/cleanse/agent.ts +226 -0
- package/src/cleanse/balance.ts +79 -0
- package/src/cleanse/checkers.ts +996 -0
- package/src/cleanse/index.ts +190 -0
- package/src/cleanse/loop.ts +51 -0
- package/src/cleanse/parsers.ts +726 -0
- package/src/cleanse/progress.ts +50 -0
- package/src/cleanse/prompts/assignment.md +47 -0
- package/src/cleanse/types.ts +72 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +368 -0
- package/src/cli/auth-broker-cli.ts +940 -0
- package/src/cli/auth-gateway-cli.ts +674 -0
- package/src/cli/bench-cli.ts +990 -0
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/command-help.ts +107 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +459 -0
- package/src/cli/dry-balance-cli.ts +864 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +132 -0
- package/src/cli/flag-tables.ts +367 -0
- package/src/cli/gallery-cli.ts +272 -0
- package/src/cli/gallery-fixtures/agentic.ts +420 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +254 -0
- package/src/cli/gallery-fixtures/fs.ts +245 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +46 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +177 -0
- package/src/cli/gallery-fixtures/search.ts +135 -0
- package/src/cli/gallery-fixtures/shell.ts +241 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gc-cli.ts +1566 -0
- package/src/cli/grep-cli.ts +161 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +385 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +369 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +99 -0
- package/src/cli/session-picker.ts +110 -0
- package/src/cli/setup-cli.ts +312 -0
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +58 -0
- package/src/cli/stats-cli.ts +229 -0
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/tiny-models-cli.ts +153 -0
- package/src/cli/ttsr-cli.ts +1013 -0
- package/src/cli/update-cli.ts +1184 -0
- package/src/cli/usage-cli.ts +1084 -0
- package/src/cli/usage-error.ts +7 -0
- package/src/cli/web-search-cli.ts +144 -0
- package/src/cli/worktree-cli.ts +311 -0
- package/src/cli-commands.ts +308 -0
- package/src/cli.ts +428 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/display-name.ts +13 -0
- package/src/collab/guest.ts +764 -0
- package/src/collab/host.ts +692 -0
- package/src/collab/protocol.ts +296 -0
- package/src/collab/relay-client.ts +282 -0
- package/src/collab/replication-shrink.ts +111 -0
- package/src/commands/acp.ts +35 -0
- package/src/commands/agents.ts +58 -0
- package/src/commands/auth-broker.ts +100 -0
- package/src/commands/auth-gateway.ts +70 -0
- package/src/commands/bench.ts +64 -0
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +45 -0
- package/src/commands/commit.ts +47 -0
- package/src/commands/complete.ts +67 -0
- package/src/commands/completions.ts +61 -0
- package/src/commands/config.ts +52 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +61 -0
- package/src/commands/gc.ts +47 -0
- package/src/commands/grep.ts +49 -0
- package/src/commands/grievances.ts +52 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +40 -0
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +34 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +79 -0
- package/src/commands/read.ts +39 -0
- package/src/commands/say.ts +146 -0
- package/src/commands/setup.ts +68 -0
- package/src/commands/share.ts +71 -0
- package/src/commands/shell.ts +30 -0
- package/src/commands/ssh.ts +61 -0
- package/src/commands/stats.ts +30 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +164 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +34 -0
- package/src/commands/usage.ts +55 -0
- package/src/commands/web-search.ts +43 -0
- package/src/commands/worktree.ts +63 -0
- package/src/commit/agentic/agent.ts +322 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +383 -0
- package/src/commit/agentic/lock-files.ts +107 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +148 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +52 -0
- package/src/commit/agentic/tools/git-overview.ts +62 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +147 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +11 -0
- package/src/commit/agentic/tools/split-commit.ts +241 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +107 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +95 -0
- package/src/commit/pipeline.ts +244 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +70 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +81 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +347 -0
- package/src/config/inline-tool-descriptors-mode.ts +26 -0
- package/src/config/keybindings.ts +703 -0
- package/src/config/mcp-schema.json +252 -0
- package/src/config/model-discovery.ts +1077 -0
- package/src/config/model-registry.ts +2822 -0
- package/src/config/model-resolver.ts +2115 -0
- package/src/config/model-roles.ts +113 -0
- package/src/config/models-config-schema-bundle.ts +315 -0
- package/src/config/models-config-schema.ts +14 -0
- package/src/config/models-config.ts +130 -0
- package/src/config/prompt-templates.ts +205 -0
- package/src/config/provider-globals.ts +25 -0
- package/src/config/resolve-config-value.ts +95 -0
- package/src/config/service-tier.ts +146 -0
- package/src/config/settings-schema.ts +5887 -0
- package/src/config/settings.ts +2394 -0
- package/src/config.ts +242 -0
- package/src/cursor-bridge-tools.ts +81 -0
- package/src/cursor.ts +960 -0
- package/src/dap/client.ts +1043 -0
- package/src/dap/config.ts +480 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1841 -0
- package/src/dap/types.ts +611 -0
- package/src/debug/index.ts +584 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +966 -0
- package/src/debug/profiler.ts +168 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +421 -0
- package/src/debug/raw-sse.ts +312 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +411 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agent-plugin-format.ts +551 -0
- package/src/discovery/agent-plugins.ts +341 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +300 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
- package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
- package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
- package/src/discovery/builtin-rules/go-ioutil.md +37 -0
- package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
- package/src/discovery/builtin-rules/go-new-expr.md +44 -0
- package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
- package/src/discovery/builtin-rules/go-range-int.md +45 -0
- package/src/discovery/builtin-rules/index.ts +74 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
- package/src/discovery/builtin-rules/rs-result-type.md +20 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
- package/src/discovery/builtin-rules/ts-import-type.md +43 -0
- package/src/discovery/builtin-rules/ts-no-any.md +66 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
- package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +945 -0
- package/src/discovery/claude-plugins.ts +640 -0
- package/src/discovery/claude.ts +591 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +553 -0
- package/src/discovery/contained-path.ts +78 -0
- package/src/discovery/cursor.ts +223 -0
- package/src/discovery/gemini.ts +386 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1183 -0
- package/src/discovery/index.ts +82 -0
- package/src/discovery/mcp-json.ts +182 -0
- package/src/discovery/omp-extension-roots.ts +272 -0
- package/src/discovery/omp-plugins.ts +409 -0
- package/src/discovery/opencode.ts +441 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +77 -0
- package/src/discovery/vscode.ts +106 -0
- package/src/discovery/windsurf.ts +149 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +1008 -0
- package/src/edit/edit-clipboard.ts +23 -0
- package/src/edit/file-snapshot-store.ts +148 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +402 -0
- package/src/edit/hashline/execute.ts +313 -0
- package/src/edit/hashline/filesystem.ts +247 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +12 -0
- package/src/edit/index.ts +699 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1958 -0
- package/src/edit/modes/replace.ts +1191 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +998 -0
- package/src/edit/snapshot-details.ts +77 -0
- package/src/edit/streaming.ts +710 -0
- package/src/eval/agent-bridge.ts +224 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +65 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +212 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +562 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +551 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +236 -0
- package/src/eval/jl/prelude.jl +736 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +666 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +872 -0
- package/src/eval/js/executor.ts +178 -0
- package/src/eval/js/index.ts +41 -0
- package/src/eval/js/process-entry.ts +31 -0
- package/src/eval/js/shared/helpers.ts +170 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +364 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +294 -0
- package/src/eval/js/shared/rewrite-imports.ts +550 -0
- package/src/eval/js/shared/runtime.ts +590 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +163 -0
- package/src/eval/js/worker-core.ts +380 -0
- package/src/eval/js/worker-entry.ts +37 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/kernel-base.ts +569 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +643 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +235 -0
- package/src/eval/py/prelude.py +673 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1425 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +134 -0
- package/src/eval/py/tool-bridge.ts +201 -0
- package/src/eval/rb/executor.ts +511 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +231 -0
- package/src/eval/rb/prelude.rb +551 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +581 -0
- package/src/eval/rb/runtime.ts +132 -0
- package/src/eval/runtime-env.ts +104 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +627 -0
- package/src/exec/direnv.ts +145 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +118 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +320 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1355 -0
- package/src/export/html/template.html +55 -0
- package/src/export/html/template.js +1653 -0
- package/src/export/html/tool-views.generated.js +35 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/html/web-palette.ts +126 -0
- package/src/export/share.ts +686 -0
- package/src/export/ttsr.ts +590 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +242 -0
- package/src/extensibility/custom-commands/types.ts +119 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +301 -0
- package/src/extensibility/custom-tools/types.ts +287 -0
- package/src/extensibility/custom-tools/wrapper.ts +50 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/load-errors.ts +13 -0
- package/src/extensibility/extensions/loader.ts +663 -0
- package/src/extensibility/extensions/managed-timers.ts +83 -0
- package/src/extensibility/extensions/model-api.ts +39 -0
- package/src/extensibility/extensions/runner.ts +1396 -0
- package/src/extensibility/extensions/types.ts +1603 -0
- package/src/extensibility/extensions/wrapper.ts +395 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +243 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +124 -0
- package/src/extensibility/hooks/types.ts +612 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
- package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
- package/src/extensibility/legacy-typebox.ts +101 -0
- package/src/extensibility/plugins/bun-git-cache.ts +91 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +201 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
- package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
- package/src/extensibility/plugins/loader.ts +535 -0
- package/src/extensibility/plugins/manager.ts +1142 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +927 -0
- package/src/extensibility/plugins/marketplace/registry.ts +192 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +192 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +107 -0
- package/src/extensibility/plugins/runtime-config.ts +9 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/session-handler-types.ts +21 -0
- package/src/extensibility/shared-events.ts +401 -0
- package/src/extensibility/skills.ts +531 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-event-input.ts +80 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/utils.ts +192 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +521 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +680 -0
- package/src/hindsight/config.ts +193 -0
- package/src/hindsight/content.ts +266 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +530 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +180 -0
- package/src/internal-urls/artifact-protocol.ts +151 -0
- package/src/internal-urls/docs-index.ts +102 -0
- package/src/internal-urls/filesystem-resource.ts +34 -0
- package/src/internal-urls/history-protocol.ts +198 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/issue-pr-protocol.ts +594 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +471 -0
- package/src/internal-urls/mcp-protocol.ts +168 -0
- package/src/internal-urls/memory-protocol.ts +380 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +103 -0
- package/src/internal-urls/registry-helpers.ts +132 -0
- package/src/internal-urls/router.ts +153 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/security-protocol.ts +261 -0
- package/src/internal-urls/skill-protocol.ts +131 -0
- package/src/internal-urls/ssh-protocol.ts +368 -0
- package/src/internal-urls/types.ts +196 -0
- package/src/internal-urls/vault-protocol.ts +940 -0
- package/src/internal-urls/xd-protocol.ts +46 -0
- package/src/irc/bus.ts +380 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/launch/broker.ts +1368 -0
- package/src/launch/client.ts +521 -0
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +14 -0
- package/src/launch/presence.ts +82 -0
- package/src/launch/protocol.ts +448 -0
- package/src/launch/spawn-options.ts +17 -0
- package/src/launch/terminal-output-worker-client.ts +53 -0
- package/src/launch/terminal-output-worker-protocol.ts +11 -0
- package/src/launch/terminal-output-worker.ts +23 -0
- package/src/launch/terminal-output.ts +46 -0
- package/src/lib/xai-http.ts +150 -0
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +221 -0
- package/src/live/voices.ts +18 -0
- package/src/lsp/client.ts +1465 -0
- package/src/lsp/clients/biome-client.ts +263 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +85 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +549 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/deferred-diagnostics.ts +66 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +288 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2821 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/mux/daemon.ts +348 -0
- package/src/lsp/mux/protocol.ts +96 -0
- package/src/lsp/mux/server.ts +797 -0
- package/src/lsp/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +479 -0
- package/src/lsp/utils.ts +747 -0
- package/src/main.ts +1799 -0
- package/src/markit/NOTICE +32 -0
- package/src/markit/converters/docx.ts +56 -0
- package/src/markit/converters/epub.ts +136 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +598 -0
- package/src/markit/converters/pdf/grid.ts +780 -0
- package/src/markit/converters/pdf/headers.ts +106 -0
- package/src/markit/converters/pdf/index.ts +146 -0
- package/src/markit/converters/pdf/render.ts +501 -0
- package/src/markit/converters/pdf/types.ts +84 -0
- package/src/markit/converters/pptx.ts +325 -0
- package/src/markit/converters/xlsx.ts +173 -0
- package/src/markit/index.ts +2 -0
- package/src/markit/registry.ts +59 -0
- package/src/markit/types.ts +35 -0
- package/src/mcp/client.ts +511 -0
- package/src/mcp/config-writer.ts +377 -0
- package/src/mcp/config.ts +385 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +125 -0
- package/src/mcp/manager.ts +1524 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +587 -0
- package/src/mcp/oauth-flow.ts +830 -0
- package/src/mcp/render.ts +214 -0
- package/src/mcp/request-id.ts +24 -0
- package/src/mcp/smithery-auth.ts +108 -0
- package/src/mcp/smithery-connect.ts +154 -0
- package/src/mcp/smithery-registry.ts +500 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +691 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/header-policy.ts +95 -0
- package/src/mcp/transports/http.ts +508 -0
- package/src/mcp/transports/index.ts +7 -0
- package/src/mcp/transports/sse.ts +372 -0
- package/src/mcp/transports/stdio.ts +905 -0
- package/src/mcp/types.ts +467 -0
- package/src/memories/index.ts +1434 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +19 -0
- package/src/memory-backend/local-backend.ts +47 -0
- package/src/memory-backend/messages.ts +19 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +629 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +293 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +114 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +940 -0
- package/src/modes/acp/acp-agent.ts +2595 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +1084 -0
- package/src/modes/acp/acp-mode.ts +48 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/advisor-config.ts +635 -0
- package/src/modes/components/advisor-message.ts +109 -0
- package/src/modes/components/agent-dashboard.ts +1252 -0
- package/src/modes/components/agent-hub-projection.ts +248 -0
- package/src/modes/components/agent-hub-renderer.ts +194 -0
- package/src/modes/components/agent-hub.ts +1126 -0
- package/src/modes/components/agent-transcript-viewer.ts +647 -0
- package/src/modes/components/ask-dialog.ts +1017 -0
- package/src/modes/components/assistant-message.ts +978 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +233 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +161 -0
- package/src/modes/components/cache-invalidation-marker.ts +110 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/chat-transcript-builder.ts +518 -0
- package/src/modes/components/codex-reset-fireworks.ts +369 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +221 -0
- package/src/modes/components/copy-selector.ts +218 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +1036 -0
- package/src/modes/components/custom-message.ts +70 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +37 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +169 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +492 -0
- package/src/modes/components/extensions/extension-list.ts +507 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +326 -0
- package/src/modes/components/extensions/state-manager.ts +648 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +213 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +67 -0
- package/src/modes/components/hook-selector.ts +691 -0
- package/src/modes/components/index.ts +42 -0
- package/src/modes/components/keybinding-hints.ts +56 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +197 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1413 -0
- package/src/modes/components/message-frame.ts +98 -0
- package/src/modes/components/model-browser.ts +888 -0
- package/src/modes/components/model-hub.ts +2014 -0
- package/src/modes/components/model-picker.ts +237 -0
- package/src/modes/components/move-overlay.ts +293 -0
- package/src/modes/components/oauth-selector.ts +474 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/pause-screen.ts +208 -0
- package/src/modes/components/plan-review-overlay.ts +1226 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +100 -0
- package/src/modes/components/plugin-settings.ts +745 -0
- package/src/modes/components/queue-mode-selector.ts +61 -0
- package/src/modes/components/read-tool-group.ts +856 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/select-list-mouse-routing.ts +35 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/session-selector.ts +1035 -0
- package/src/modes/components/settings-defs.ts +267 -0
- package/src/modes/components/settings-selector.ts +1445 -0
- package/src/modes/components/show-images-selector.ts +50 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1843 -0
- package/src/modes/components/status-line/context-thresholds.ts +86 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +710 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +159 -0
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/theme-selector.ts +68 -0
- package/src/modes/components/thinking-selector.ts +57 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +26 -0
- package/src/modes/components/todo-reminder.ts +43 -0
- package/src/modes/components/tool-execution.ts +1467 -0
- package/src/modes/components/transcript-container.ts +527 -0
- package/src/modes/components/tree-selector.ts +1006 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +52 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +167 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +578 -0
- package/src/modes/controllers/btw-controller.ts +246 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +2024 -0
- package/src/modes/controllers/event-controller.ts +2173 -0
- package/src/modes/controllers/extension-ui-controller.ts +1243 -0
- package/src/modes/controllers/input-controller.ts +2037 -0
- package/src/modes/controllers/live-command-controller.ts +261 -0
- package/src/modes/controllers/mcp-command-controller.ts +2552 -0
- package/src/modes/controllers/omfg-controller.ts +287 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +2058 -0
- package/src/modes/controllers/session-focus-controller.ts +117 -0
- package/src/modes/controllers/ssh-command-controller.ts +385 -0
- package/src/modes/controllers/streaming-reveal.ts +399 -0
- package/src/modes/controllers/tan-command-controller.ts +243 -0
- package/src/modes/controllers/todo-command-controller.ts +487 -0
- package/src/modes/controllers/tool-args-reveal.ts +591 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/github-ref-autocomplete.ts +75 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +10 -0
- package/src/modes/interactive-mode.ts +5055 -0
- package/src/modes/internal-url-autocomplete.ts +158 -0
- package/src/modes/loop-limit.ts +192 -0
- package/src/modes/magic-keyword-boundary.ts +23 -0
- package/src/modes/magic-keywords.ts +42 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +43 -0
- package/src/modes/print-mode.ts +282 -0
- package/src/modes/prompt-action-autocomplete.ts +322 -0
- package/src/modes/queue-input.ts +132 -0
- package/src/modes/rpc/host-tools.ts +204 -0
- package/src/modes/rpc/host-uris.ts +241 -0
- package/src/modes/rpc/rpc-client.ts +1213 -0
- package/src/modes/rpc/rpc-frame.ts +316 -0
- package/src/modes/rpc/rpc-input.ts +38 -0
- package/src/modes/rpc/rpc-messages.ts +127 -0
- package/src/modes/rpc/rpc-mode.ts +1519 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +544 -0
- package/src/modes/running-subagent-badge.ts +13 -0
- package/src/modes/runtime-init.ts +144 -0
- package/src/modes/session-observer-registry.ts +223 -0
- package/src/modes/session-teardown.ts +82 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +103 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
- package/src/modes/setup-wizard/scenes/model.ts +132 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +105 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +330 -0
- package/src/modes/setup-wizard/scenes/types.ts +65 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
- package/src/modes/shared.ts +49 -0
- package/src/modes/skill-command.ts +91 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +143 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +143 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +92 -0
- package/src/modes/theme/shimmer.ts +305 -0
- package/src/modes/theme/theme-schema.json +463 -0
- package/src/modes/theme/theme.ts +3171 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +494 -0
- package/src/modes/ultrathink.ts +42 -0
- package/src/modes/utils/context-usage.ts +518 -0
- package/src/modes/utils/copy-targets.ts +378 -0
- package/src/modes/utils/hotkeys-markdown.ts +65 -0
- package/src/modes/utils/interactive-context-helpers.ts +31 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +31 -0
- package/src/modes/utils/transcript-render-helpers.ts +253 -0
- package/src/modes/utils/ui-helpers.ts +976 -0
- package/src/modes/warp-events.ts +232 -0
- package/src/modes/workflow.ts +55 -0
- package/src/plan-mode/approved-plan.ts +194 -0
- package/src/plan-mode/model-transition.ts +51 -0
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +60 -0
- package/src/prompts/advisor/active-repo-watchdog.md +6 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/context-files.md +8 -0
- package/src/prompts/advisor/system.md +98 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/frontmatter.md +12 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/scout.md +58 -0
- package/src/prompts/agents/security-reviewer.md +75 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/bench.md +6 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/goals/goal-mode-context.md +4 -0
- package/src/prompts/goals/goal-todo-context.md +12 -0
- package/src/prompts/goals/guided-goal-interview.md +43 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/read-path.md +17 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +21 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +68 -0
- package/src/prompts/security/scan-coordinator.md +7 -0
- package/src/prompts/security/scan-request.md +21 -0
- package/src/prompts/security/validate-request.md +8 -0
- package/src/prompts/session/launch-completion.md +1 -0
- package/src/prompts/skills/autoload.md +8 -0
- package/src/prompts/skills/user-invocation.md +11 -0
- package/src/prompts/steering/parent-irc.md +5 -0
- package/src/prompts/steering/user-interjection.md +6 -0
- package/src/prompts/system/active-repo-context.md +4 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +14 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +18 -0
- package/src/prompts/system/empty-stop-retry.md +4 -0
- package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
- package/src/prompts/system/interrupted-thinking.md +7 -0
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +9 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/mcp-xdev-guidance.md +11 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/mid-run-todo-nudge.md +3 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/personalities/default.md +18 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +125 -0
- package/src/prompts/system/plan-mode-approved.md +22 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
- package/src/prompts/system/plan-mode-reference.md +10 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/plan-yolo-handoff.md +5 -0
- package/src/prompts/system/prewalk-checklist.md +7 -0
- package/src/prompts/system/prewalk-continue.md +1 -0
- package/src/prompts/system/prewalk-plan.md +13 -0
- package/src/prompts/system/project-prompt.md +61 -0
- package/src/prompts/system/recap-user.md +9 -0
- package/src/prompts/system/resolve-device-reminder.md +3 -0
- package/src/prompts/system/rewind-report.md +6 -0
- package/src/prompts/system/side-channel-no-tools.md +3 -0
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/speech-rewrite.md +15 -0
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/subagent-system-prompt.md +73 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +23 -0
- package/src/prompts/system/system-prompt.md +263 -0
- package/src/prompts/system/tan-context-switch.md +17 -0
- package/src/prompts/system/task-label.md +23 -0
- package/src/prompts/system/thinking-loop-redirect.md +10 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/tool-call-loop-redirect.md +8 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/unexpected-stop-classifier.md +17 -0
- package/src/prompts/system/unexpected-stop-retry.md +4 -0
- package/src/prompts/system/vibe-mode-active.md +26 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +112 -0
- package/src/prompts/system/xdev-mount-notice.md +20 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +22 -0
- package/src/prompts/tools/ast-edit.md +11 -0
- package/src/prompts/tools/ast-grep.md +19 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/browser.md +29 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/debug.md +3 -0
- package/src/prompts/tools/eval.md +45 -0
- package/src/prompts/tools/github.md +22 -0
- package/src/prompts/tools/glob.md +16 -0
- package/src/prompts/tools/goal.md +11 -0
- package/src/prompts/tools/grep.md +13 -0
- package/src/prompts/tools/hub.md +34 -0
- package/src/prompts/tools/image-attachment-describe-system.md +8 -0
- package/src/prompts/tools/image-attachment-describe.md +10 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +22 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +19 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +12 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +27 -0
- package/src/prompts/tools/recall.md +7 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +14 -0
- package/src/prompts/tools/security-publish.md +1 -0
- package/src/prompts/tools/security-scan.md +1 -0
- package/src/prompts/tools/task-async-contract.md +1 -0
- package/src/prompts/tools/task-summary.md +20 -0
- package/src/prompts/tools/task.md +83 -0
- package/src/prompts/tools/todo.md +42 -0
- package/src/prompts/tools/vibe-kill.md +3 -0
- package/src/prompts/tools/vibe-list.md +3 -0
- package/src/prompts/tools/vibe-send.md +9 -0
- package/src/prompts/tools/vibe-spawn.md +10 -0
- package/src/prompts/tools/vibe-turn-result.md +19 -0
- package/src/prompts/tools/vibe-wait.md +8 -0
- package/src/prompts/tools/web-search.md +8 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +505 -0
- package/src/registry/agent-registry.ts +287 -0
- package/src/registry/persisted-agents.ts +423 -0
- package/src/sdk.ts +3820 -0
- package/src/secrets/index.ts +375 -0
- package/src/secrets/obfuscator.ts +2629 -0
- package/src/secrets/regex.ts +21 -0
- package/src/security/auth.ts +98 -0
- package/src/security/cloud.ts +686 -0
- package/src/security/comparison.ts +255 -0
- package/src/security/contracts/ids.ts +111 -0
- package/src/security/contracts/index.ts +4 -0
- package/src/security/contracts/schemas.ts +219 -0
- package/src/security/contracts/types.ts +254 -0
- package/src/security/contracts/validation.ts +69 -0
- package/src/security/coordinator.ts +708 -0
- package/src/security/importers/codex-security.ts +387 -0
- package/src/security/importers/index.ts +2 -0
- package/src/security/importers/sarif.ts +357 -0
- package/src/security/index.ts +13 -0
- package/src/security/preflight.ts +405 -0
- package/src/security/provenance.ts +106 -0
- package/src/security/publication.ts +326 -0
- package/src/security/remediation.ts +93 -0
- package/src/security/resource-output.ts +50 -0
- package/src/security/sarif.ts +78 -0
- package/src/security/store.ts +430 -0
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-events.ts +67 -0
- package/src/session/agent-session-types.ts +407 -0
- package/src/session/agent-session.ts +9000 -0
- package/src/session/agent-storage.ts +807 -0
- package/src/session/artifacts.ts +154 -0
- package/src/session/async-job-delivery.ts +82 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +25 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.ts +295 -0
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/claude-session-store.ts +426 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +673 -0
- package/src/session/codex-session-store.ts +673 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/credential-pin.ts +93 -0
- package/src/session/eval-runner.ts +219 -0
- package/src/session/exit-diagnostics.ts +310 -0
- package/src/session/foreign-session-import.ts +52 -0
- package/src/session/foreign-session-jsonl.ts +29 -0
- package/src/session/foreign-session-store.ts +26 -0
- package/src/session/history-storage.ts +329 -0
- package/src/session/indexed-session-storage.ts +553 -0
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/launch-completion.ts +37 -0
- package/src/session/messages.ts +1304 -0
- package/src/session/model-controls.ts +757 -0
- package/src/session/prewalk.ts +279 -0
- package/src/session/provider-image-budget.ts +86 -0
- package/src/session/queued-messages.ts +99 -0
- package/src/session/redis-session-storage.ts +257 -0
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1896 -0
- package/src/session/session-context.ts +584 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +306 -0
- package/src/session/session-handoff.ts +325 -0
- package/src/session/session-history-format.ts +459 -0
- package/src/session/session-listing.ts +715 -0
- package/src/session/session-loader.ts +362 -0
- package/src/session/session-maintenance.ts +3115 -0
- package/src/session/session-manager.ts +2747 -0
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-metadata.ts +53 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +280 -0
- package/src/session/session-persistence.ts +293 -0
- package/src/session/session-provider-boundary.ts +306 -0
- package/src/session/session-stats.ts +349 -0
- package/src/session/session-storage.ts +774 -0
- package/src/session/session-title-slot.ts +141 -0
- package/src/session/session-tools.ts +1385 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/settings-stream-fn.ts +79 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/snapcompact-inline.ts +545 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/sql-session-storage.ts +374 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +1459 -0
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/tool-choice-queue.ts +305 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-persistence.ts +142 -0
- package/src/session/turn-recovery.ts +2005 -0
- package/src/session/unexpected-stop-classifier.ts +141 -0
- package/src/session/yield-queue.ts +288 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +3149 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
- package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
- package/src/slash-commands/helpers/context-report.ts +66 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +108 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +533 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +68 -0
- package/src/slash-commands/helpers/security.ts +451 -0
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/ssh.ts +196 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +198 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +139 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +667 -0
- package/src/ssh/file-transfer.ts +214 -0
- package/src/ssh/sshfs-mount.ts +163 -0
- package/src/ssh/utils.ts +51 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +401 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +603 -0
- package/src/stt/downloader.ts +142 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +6 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/sherpa-runtime.ts +71 -0
- package/src/stt/stt-controller.ts +320 -0
- package/src/stt/submit-trigger.ts +74 -0
- package/src/subprocess/worker-client.ts +463 -0
- package/src/subprocess/worker-runtime.ts +494 -0
- package/src/system-prompt.ts +921 -0
- package/src/task/agents.ts +170 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +145 -0
- package/src/task/executor.ts +3431 -0
- package/src/task/index.ts +1515 -0
- package/src/task/isolation-ownership.ts +106 -0
- package/src/task/isolation-runner.ts +444 -0
- package/src/task/label.ts +40 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +115 -0
- package/src/task/parallel.ts +221 -0
- package/src/task/persisted-revive.ts +173 -0
- package/src/task/prewalk.ts +6 -0
- package/src/task/prompt-policy.ts +8 -0
- package/src/task/provider-concurrency.ts +100 -0
- package/src/task/read-only-policy.ts +27 -0
- package/src/task/render.ts +1830 -0
- package/src/task/renderer.ts +14 -0
- package/src/task/repair-args.ts +118 -0
- package/src/task/spawn-policy.ts +72 -0
- package/src/task/structured-subagent.ts +676 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +555 -0
- package/src/task/worktree.ts +967 -0
- package/src/task/yield-assembly.ts +198 -0
- package/src/telemetry-export.ts +504 -0
- package/src/thinking.ts +377 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/message-preproc.ts +155 -0
- package/src/tiny/models.ts +268 -0
- package/src/tiny/text.ts +290 -0
- package/src/tiny/title-client.ts +460 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +354 -0
- package/src/tools/acp-bridge.ts +125 -0
- package/src/tools/approval.ts +245 -0
- package/src/tools/ask.ts +1459 -0
- package/src/tools/ast-edit.ts +718 -0
- package/src/tools/ast-grep.ts +526 -0
- package/src/tools/auto-generated-guard.ts +335 -0
- package/src/tools/bash-interactive.ts +435 -0
- package/src/tools/bash-interceptor.ts +148 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +350 -0
- package/src/tools/bash.ts +1826 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +131 -0
- package/src/tools/browser/attach.ts +219 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
- package/src/tools/browser/cmux/rpc.ts +200 -0
- package/src/tools/browser/cmux/socket-client.ts +445 -0
- package/src/tools/browser/launch.ts +939 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +447 -0
- package/src/tools/browser/relay/bridge.ts +945 -0
- package/src/tools/browser/relay/daemon.ts +117 -0
- package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
- package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
- package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
- package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
- package/src/tools/browser/relay/kind.ts +41 -0
- package/src/tools/browser/relay/protocol.ts +54 -0
- package/src/tools/browser/relay/server.ts +141 -0
- package/src/tools/browser/render.ts +229 -0
- package/src/tools/browser/run-output.ts +76 -0
- package/src/tools/browser/shared-daemon.ts +139 -0
- package/src/tools/browser/tab-protocol.ts +123 -0
- package/src/tools/browser/tab-supervisor.ts +1077 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1982 -0
- package/src/tools/browser.ts +487 -0
- package/src/tools/builtin-names.ts +67 -0
- package/src/tools/checkpoint.ts +137 -0
- package/src/tools/computer/exposure.ts +14 -0
- package/src/tools/computer/protocol.ts +69 -0
- package/src/tools/computer/supervisor.ts +409 -0
- package/src/tools/computer/worker-entry.ts +39 -0
- package/src/tools/computer/worker.ts +745 -0
- package/src/tools/computer-renderer.ts +147 -0
- package/src/tools/computer.ts +222 -0
- package/src/tools/conflict-detect.ts +815 -0
- package/src/tools/context.ts +49 -0
- package/src/tools/debug.ts +1121 -0
- package/src/tools/default-renderer.ts +154 -0
- package/src/tools/essential-tools.ts +46 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-format/index.ts +24 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/julia.ts +446 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval-format/ruby.ts +380 -0
- package/src/tools/eval-render.ts +784 -0
- package/src/tools/eval.ts +774 -0
- package/src/tools/fetch.ts +1889 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +175 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +484 -0
- package/src/tools/gh.ts +3958 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/glob.ts +691 -0
- package/src/tools/grep.ts +1920 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/hub/index.ts +579 -0
- package/src/tools/hub/jobs.ts +714 -0
- package/src/tools/hub/launch.ts +690 -0
- package/src/tools/hub/messaging.ts +735 -0
- package/src/tools/hub/types.ts +117 -0
- package/src/tools/image-gen.ts +1689 -0
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +736 -0
- package/src/tools/inspect-image-renderer.ts +133 -0
- package/src/tools/inspect-image.ts +316 -0
- package/src/tools/json-tree.ts +260 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/learn.ts +141 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/manage-skill.ts +102 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +61 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +211 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +860 -0
- package/src/tools/output-schema-validator.ts +307 -0
- package/src/tools/path-utils.ts +1489 -0
- package/src/tools/plan-mode-guard.ts +155 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
- package/src/tools/read.ts +3762 -0
- package/src/tools/render-utils.ts +926 -0
- package/src/tools/renderers.ts +133 -0
- package/src/tools/report-tool-issue.ts +568 -0
- package/src/tools/resolve.ts +423 -0
- package/src/tools/review.ts +103 -0
- package/src/tools/run-scope.ts +417 -0
- package/src/tools/security-scan.ts +287 -0
- package/src/tools/shell-tokenize.ts +213 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/terminal-output.ts +141 -0
- package/src/tools/todo.ts +1226 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +38 -0
- package/src/tools/tts.ts +266 -0
- package/src/tools/vibe.ts +608 -0
- package/src/tools/write.ts +1646 -0
- package/src/tools/xdev.ts +560 -0
- package/src/tools/yield.ts +486 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +10 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/speakable.ts +392 -0
- package/src/tts/speech-enhancer.ts +206 -0
- package/src/tts/streaming-player.ts +120 -0
- package/src/tts/tts-client.ts +475 -0
- package/src/tts/tts-protocol.ts +69 -0
- package/src/tts/tts-worker.ts +434 -0
- package/src/tts/vocalizer.ts +419 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +268 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +178 -0
- package/src/tui/index.ts +13 -0
- package/src/tui/output-block.ts +268 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +172 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/tui/width-aware-text.ts +58 -0
- package/src/utils/active-repo-context.ts +143 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +373 -0
- package/src/utils/clipboard.ts +361 -0
- package/src/utils/command-args.ts +74 -0
- package/src/utils/commit-message-generator.ts +148 -0
- package/src/utils/cpuprofile.ts +235 -0
- package/src/utils/edit-mode.ts +61 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +80 -0
- package/src/utils/fetch-timeout.ts +10 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +293 -0
- package/src/utils/git.ts +2472 -0
- package/src/utils/image-loading.ts +236 -0
- package/src/utils/image-resize.ts +420 -0
- package/src/utils/image-vision-fallback.ts +196 -0
- package/src/utils/inspect-image-mode.ts +39 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +422 -0
- package/src/utils/lang-from-path.ts +251 -0
- package/src/utils/late-cleanup.ts +17 -0
- package/src/utils/local-date.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/markit-cache.ts +166 -0
- package/src/utils/markit.ts +223 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +126 -0
- package/src/utils/profile-tree.ts +111 -0
- package/src/utils/prompt-path.ts +3 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/sample-profile.ts +437 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot-fn-env.sh +63 -0
- package/src/utils/shell-snapshot.ts +326 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +163 -0
- package/src/utils/title-generator.ts +597 -0
- package/src/utils/token-rate.ts +72 -0
- package/src/utils/tool-choice.ts +50 -0
- package/src/utils/tools-manager.ts +411 -0
- package/src/utils/turndown.ts +82 -0
- package/src/utils/zip.ts +1106 -0
- package/src/vibe/runtime.ts +1684 -0
- package/src/vibe/state.ts +4 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +354 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +663 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +800 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +129 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +121 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +354 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +393 -0
- package/src/web/search/provider.ts +272 -0
- package/src/web/search/providers/anthropic.ts +406 -0
- package/src/web/search/providers/base.ts +112 -0
- package/src/web/search/providers/brave.ts +181 -0
- package/src/web/search/providers/browser-headers.ts +82 -0
- package/src/web/search/providers/browser-page.ts +125 -0
- package/src/web/search/providers/codex.ts +788 -0
- package/src/web/search/providers/duckduckgo.ts +382 -0
- package/src/web/search/providers/ecosia.ts +183 -0
- package/src/web/search/providers/exa.ts +513 -0
- package/src/web/search/providers/firecrawl.ts +213 -0
- package/src/web/search/providers/gemini.ts +634 -0
- package/src/web/search/providers/google.ts +195 -0
- package/src/web/search/providers/jina.ts +144 -0
- package/src/web/search/providers/kagi.ts +98 -0
- package/src/web/search/providers/kimi.ts +221 -0
- package/src/web/search/providers/mojeek.ts +220 -0
- package/src/web/search/providers/parallel.ts +186 -0
- package/src/web/search/providers/perplexity-auth.ts +142 -0
- package/src/web/search/providers/perplexity.ts +997 -0
- package/src/web/search/providers/public.ts +199 -0
- package/src/web/search/providers/searxng.ts +467 -0
- package/src/web/search/providers/startpage.ts +225 -0
- package/src/web/search/providers/synthetic.ts +126 -0
- package/src/web/search/providers/tavily.ts +244 -0
- package/src/web/search/providers/tinyfish.ts +166 -0
- package/src/web/search/providers/utils.ts +130 -0
- package/src/web/search/providers/xai.ts +372 -0
- package/src/web/search/providers/zai.ts +452 -0
- package/src/web/search/query.ts +850 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +518 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +326 -0
|
@@ -0,0 +1,1396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension runner - executes extensions and manages their lifecycle.
|
|
3
|
+
*/
|
|
4
|
+
import type {
|
|
5
|
+
AgentMessage,
|
|
6
|
+
AgentTool,
|
|
7
|
+
AgentToolContext,
|
|
8
|
+
AgentToolResult,
|
|
9
|
+
AgentToolUpdateCallback,
|
|
10
|
+
} from "@oh-my-pi/pi-agent-core";
|
|
11
|
+
import type { CredentialDisabledEvent, ImageContent, Model, ProviderResponseMetadata } from "@oh-my-pi/pi-ai";
|
|
12
|
+
import type { KeyId } from "@oh-my-pi/pi-tui";
|
|
13
|
+
import { logger } from "@oh-my-pi/pi-utils";
|
|
14
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
15
|
+
import type { Settings } from "../../config/settings";
|
|
16
|
+
import type { LocalProtocolOptions } from "../../internal-urls/local-protocol";
|
|
17
|
+
import type { MemoryRuntimeContext } from "../../memory-backend";
|
|
18
|
+
import { type Theme, theme } from "../../modes/theme/theme";
|
|
19
|
+
import type { AsyncJobSnapshot } from "../../session/agent-session";
|
|
20
|
+
import type { SessionManager } from "../../session/session-manager";
|
|
21
|
+
import type { BranchHandler, NavigateTreeHandler, NewSessionHandler } from "../session-handler-types";
|
|
22
|
+
import { ManagedTimers } from "./managed-timers";
|
|
23
|
+
import { createExtensionModelQuery } from "./model-api";
|
|
24
|
+
import type {
|
|
25
|
+
AfterProviderResponseEvent,
|
|
26
|
+
AssistantThinkingRenderer,
|
|
27
|
+
BeforeAgentStartEvent,
|
|
28
|
+
BeforeAgentStartEventResult,
|
|
29
|
+
BeforeProviderRequestEvent,
|
|
30
|
+
BeforeProviderRequestEventResult,
|
|
31
|
+
CompactOptions,
|
|
32
|
+
ContextEvent,
|
|
33
|
+
ContextEventResult,
|
|
34
|
+
ContextUsage,
|
|
35
|
+
Extension,
|
|
36
|
+
ExtensionActions,
|
|
37
|
+
ExtensionCommandContext,
|
|
38
|
+
ExtensionCommandContextActions,
|
|
39
|
+
ExtensionContext,
|
|
40
|
+
ExtensionContextActions,
|
|
41
|
+
ExtensionError,
|
|
42
|
+
ExtensionEvent,
|
|
43
|
+
ExtensionFlag,
|
|
44
|
+
ExtensionRuntime,
|
|
45
|
+
ExtensionShortcut,
|
|
46
|
+
ExtensionUIContext,
|
|
47
|
+
ExtensionUIDialogOptions,
|
|
48
|
+
InputEvent,
|
|
49
|
+
InputEventResult,
|
|
50
|
+
McpNotificationEvent,
|
|
51
|
+
MessageRenderer,
|
|
52
|
+
RegisteredCommand,
|
|
53
|
+
RegisteredTool,
|
|
54
|
+
ResourcesDiscoverEvent,
|
|
55
|
+
ResourcesDiscoverResult,
|
|
56
|
+
SessionBeforeBranchResult,
|
|
57
|
+
SessionBeforeCompactResult,
|
|
58
|
+
SessionBeforeSwitchResult,
|
|
59
|
+
SessionBeforeTreeResult,
|
|
60
|
+
SessionCompactingResult,
|
|
61
|
+
SessionStopEvent,
|
|
62
|
+
SessionStopEventResult,
|
|
63
|
+
ToolCallEvent,
|
|
64
|
+
ToolCallEventResult,
|
|
65
|
+
ToolResultEvent,
|
|
66
|
+
ToolResultEventResult,
|
|
67
|
+
UserBashEvent,
|
|
68
|
+
UserBashEventResult,
|
|
69
|
+
UserPythonEvent,
|
|
70
|
+
UserPythonEventResult,
|
|
71
|
+
} from "./types";
|
|
72
|
+
|
|
73
|
+
/** Combined result from all before_agent_start handlers */
|
|
74
|
+
interface BeforeAgentStartCombinedResult {
|
|
75
|
+
messages?: NonNullable<BeforeAgentStartEventResult["message"]>[];
|
|
76
|
+
systemPrompt?: string[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type ExtensionErrorListener = (error: ExtensionError) => void;
|
|
80
|
+
|
|
81
|
+
export const EXTENSION_HANDLER_TIMEOUT_MS = 30_000;
|
|
82
|
+
let extensionHandlerTimeoutMs = EXTENSION_HANDLER_TIMEOUT_MS;
|
|
83
|
+
|
|
84
|
+
function throwUnsupportedServiceTierAction(): never {
|
|
85
|
+
throw new Error("This extension host does not support service-tier actions");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function testSetExtensionHandlerTimeoutMs(timeoutMs: number): void {
|
|
89
|
+
extensionHandlerTimeoutMs = timeoutMs;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Dedicated cap for `session_shutdown` handlers. The generic 30s budget is
|
|
94
|
+
* appropriate for events extensions can observe (e.g. `session_start`,
|
|
95
|
+
* `before_provider_request`), but `session_shutdown` is fire-and-forget
|
|
96
|
+
* teardown — extensions receive no result and the user has already asked to
|
|
97
|
+
* leave. A hung handler (e.g. an extension waiting on a stuck IPC pipe to a
|
|
98
|
+
* companion app) MUST NOT hold Ctrl+C / `/exit` hostage for the full window.
|
|
99
|
+
* See issue #2600.
|
|
100
|
+
*/
|
|
101
|
+
export const SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS = 2_000;
|
|
102
|
+
let sessionShutdownHandlerTimeoutMs = SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS;
|
|
103
|
+
|
|
104
|
+
export function testSetSessionShutdownHandlerTimeoutMs(timeoutMs: number): void {
|
|
105
|
+
sessionShutdownHandlerTimeoutMs = timeoutMs;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Per-event handler budget. Defaults to the generic cap; `session_shutdown`
|
|
109
|
+
* uses its own short cap so teardown stays prompt. */
|
|
110
|
+
function handlerTimeoutForEvent(eventType: string): number {
|
|
111
|
+
return eventType === "session_shutdown" ? sessionShutdownHandlerTimeoutMs : extensionHandlerTimeoutMs;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const EXTENSION_HANDLER_TIMEOUT = Symbol("extensionHandlerTimeout");
|
|
115
|
+
const EXTENSION_HANDLER_ABORTED = Symbol("extensionHandlerAborted");
|
|
116
|
+
|
|
117
|
+
function attachHandlerSignal(
|
|
118
|
+
dialogOptions: ExtensionUIDialogOptions | undefined,
|
|
119
|
+
handlerSignal: AbortSignal,
|
|
120
|
+
): ExtensionUIDialogOptions {
|
|
121
|
+
if (!dialogOptions) return { signal: handlerSignal };
|
|
122
|
+
if (!dialogOptions.signal) return { ...dialogOptions, signal: handlerSignal };
|
|
123
|
+
if (dialogOptions.signal === handlerSignal) return dialogOptions;
|
|
124
|
+
return { ...dialogOptions, signal: AbortSignal.any([dialogOptions.signal, handlerSignal]) };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function createHandlerUIContext(ui: ExtensionUIContext, handlerSignal: AbortSignal): ExtensionUIContext {
|
|
128
|
+
const askDialog = ui.askDialog;
|
|
129
|
+
const dialogMethods = {
|
|
130
|
+
select: (title, options, dialogOptions) =>
|
|
131
|
+
ui.select(title, options, attachHandlerSignal(dialogOptions, handlerSignal)),
|
|
132
|
+
confirm: (title, message, dialogOptions) =>
|
|
133
|
+
ui.confirm(title, message, attachHandlerSignal(dialogOptions, handlerSignal)),
|
|
134
|
+
input: (title, placeholder, dialogOptions) =>
|
|
135
|
+
ui.input(title, placeholder, attachHandlerSignal(dialogOptions, handlerSignal)),
|
|
136
|
+
askDialog: askDialog
|
|
137
|
+
? (questions, dialogOptions) =>
|
|
138
|
+
askDialog.call(ui, questions, attachHandlerSignal(dialogOptions, handlerSignal))
|
|
139
|
+
: undefined,
|
|
140
|
+
editor: (title, prefill, dialogOptions, editorOptions) =>
|
|
141
|
+
ui.editor(title, prefill, attachHandlerSignal(dialogOptions, handlerSignal), editorOptions),
|
|
142
|
+
} satisfies Pick<ExtensionUIContext, "select" | "confirm" | "input" | "askDialog" | "editor">;
|
|
143
|
+
const delegatedMethods = new Map<PropertyKey, unknown>();
|
|
144
|
+
|
|
145
|
+
return new Proxy(ui, {
|
|
146
|
+
get(target, property) {
|
|
147
|
+
if (Object.hasOwn(dialogMethods, property)) {
|
|
148
|
+
return Reflect.get(dialogMethods, property, dialogMethods);
|
|
149
|
+
}
|
|
150
|
+
const cached = delegatedMethods.get(property);
|
|
151
|
+
if (cached) return cached;
|
|
152
|
+
const value: unknown = Reflect.get(target, property, target);
|
|
153
|
+
if (typeof value !== "function") return value;
|
|
154
|
+
const delegated: unknown = value.bind(target);
|
|
155
|
+
delegatedMethods.set(property, delegated);
|
|
156
|
+
return delegated;
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Scope `ctx` to a single handler run without spreading it: `{ ...ctx }` would
|
|
163
|
+
* snapshot live accessors (notably the `model` getter), so a handler calling
|
|
164
|
+
* `pi.setModel()` and then reading `ctx.model` would see a stale model.
|
|
165
|
+
* Prototype delegation keeps every getter live while overriding `ui`.
|
|
166
|
+
*/
|
|
167
|
+
function createHandlerContext(ctx: ExtensionContext, handlerSignal: AbortSignal): ExtensionContext {
|
|
168
|
+
const scoped: ExtensionContext = Object.create(ctx);
|
|
169
|
+
Object.defineProperty(scoped, "ui", {
|
|
170
|
+
value: createHandlerUIContext(ctx.ui, handlerSignal),
|
|
171
|
+
enumerable: true,
|
|
172
|
+
configurable: true,
|
|
173
|
+
});
|
|
174
|
+
return scoped;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Race `work` against a `timeoutMs` budget and optional cancellation signal,
|
|
179
|
+
* clearing the timer and abort listener as soon as one branch settles.
|
|
180
|
+
*
|
|
181
|
+
* We deliberately avoid `Bun.sleep(timeoutMs).then(...)` here: that leaves an
|
|
182
|
+
* uncancellable timer registered with the event loop, so every successful
|
|
183
|
+
* handler race leaks a timer that keeps the process alive until the deadline
|
|
184
|
+
* fires — up to the default 30s cap, which stalls non-interactive CLI exit
|
|
185
|
+
* after any subscribed `tool_call`/`tool_result` handler runs (issue #3948
|
|
186
|
+
* review, `chatgpt-codex-connector[bot]`). `setTimeout` returns a handle we
|
|
187
|
+
* can `clearTimeout` on the winning branch.
|
|
188
|
+
*/
|
|
189
|
+
async function raceHandlerWithTimeout<T>(
|
|
190
|
+
work: (handlerSignal: AbortSignal) => Promise<T> | T,
|
|
191
|
+
timeoutMs: number,
|
|
192
|
+
signal?: AbortSignal,
|
|
193
|
+
): Promise<T | typeof EXTENSION_HANDLER_TIMEOUT | typeof EXTENSION_HANDLER_ABORTED> {
|
|
194
|
+
if (signal?.aborted) return EXTENSION_HANDLER_ABORTED;
|
|
195
|
+
|
|
196
|
+
const timeoutController = new AbortController();
|
|
197
|
+
const handlerSignal = signal ? AbortSignal.any([signal, timeoutController.signal]) : timeoutController.signal;
|
|
198
|
+
const { promise: interruptPromise, resolve: resolveInterrupt } = Promise.withResolvers<
|
|
199
|
+
typeof EXTENSION_HANDLER_TIMEOUT | typeof EXTENSION_HANDLER_ABORTED
|
|
200
|
+
>();
|
|
201
|
+
const onAbort = () => resolveInterrupt(EXTENSION_HANDLER_ABORTED);
|
|
202
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
203
|
+
const timer = setTimeout(() => {
|
|
204
|
+
timeoutController.abort(new DOMException(`Handler timed out after ${timeoutMs}ms`, "TimeoutError"));
|
|
205
|
+
resolveInterrupt(EXTENSION_HANDLER_TIMEOUT);
|
|
206
|
+
}, timeoutMs);
|
|
207
|
+
try {
|
|
208
|
+
if (signal?.aborted) return EXTENSION_HANDLER_ABORTED;
|
|
209
|
+
const workPromise = Promise.resolve(work(handlerSignal));
|
|
210
|
+
const result = await Promise.race([workPromise, interruptPromise]);
|
|
211
|
+
if (result === EXTENSION_HANDLER_TIMEOUT) {
|
|
212
|
+
await Promise.race([
|
|
213
|
+
workPromise.then(
|
|
214
|
+
() => undefined,
|
|
215
|
+
() => undefined,
|
|
216
|
+
),
|
|
217
|
+
Bun.sleep(0),
|
|
218
|
+
]);
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
} finally {
|
|
222
|
+
clearTimeout(timer);
|
|
223
|
+
signal?.removeEventListener("abort", onAbort);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const MAX_PENDING_CREDENTIAL_DISABLED = 32;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Buffer cap for `mcp_notification` events received before {@link ExtensionRunner.initialize}
|
|
231
|
+
* has run. Sized to match the manager-side buffer in `MCPManager.NOTIFICATION_BUFFER_CAP` so
|
|
232
|
+
* the two layers can't drop different amounts of the same burst — the pipe drains, or it
|
|
233
|
+
* spills, but it does so consistently at both ends. Drop-oldest under pressure.
|
|
234
|
+
*/
|
|
235
|
+
const MAX_PENDING_MCP_NOTIFICATIONS = 100;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Events handled by the generic emit() method.
|
|
239
|
+
* Events with dedicated emitXxx() methods are excluded for stronger type safety.
|
|
240
|
+
*/
|
|
241
|
+
type RunnerEmitEvent = Exclude<
|
|
242
|
+
ExtensionEvent,
|
|
243
|
+
| ToolCallEvent
|
|
244
|
+
| ToolResultEvent
|
|
245
|
+
| UserBashEvent
|
|
246
|
+
| ContextEvent
|
|
247
|
+
| BeforeProviderRequestEvent
|
|
248
|
+
| AfterProviderResponseEvent
|
|
249
|
+
| BeforeAgentStartEvent
|
|
250
|
+
| ResourcesDiscoverEvent
|
|
251
|
+
| InputEvent
|
|
252
|
+
>;
|
|
253
|
+
|
|
254
|
+
type SessionBeforeEvent = Extract<
|
|
255
|
+
RunnerEmitEvent,
|
|
256
|
+
{ type: "session_before_switch" | "session_before_branch" | "session_before_compact" | "session_before_tree" }
|
|
257
|
+
>;
|
|
258
|
+
|
|
259
|
+
type SessionBeforeEventResult =
|
|
260
|
+
| SessionBeforeSwitchResult
|
|
261
|
+
| SessionBeforeBranchResult
|
|
262
|
+
| SessionBeforeCompactResult
|
|
263
|
+
| SessionBeforeTreeResult;
|
|
264
|
+
|
|
265
|
+
type RunnerEmitResult<TEvent extends RunnerEmitEvent> = TEvent extends { type: "session_before_switch" }
|
|
266
|
+
? SessionBeforeSwitchResult | undefined
|
|
267
|
+
: TEvent extends { type: "session_before_branch" }
|
|
268
|
+
? SessionBeforeBranchResult | undefined
|
|
269
|
+
: TEvent extends { type: "session_before_compact" }
|
|
270
|
+
? SessionBeforeCompactResult | undefined
|
|
271
|
+
: TEvent extends { type: "session_before_tree" }
|
|
272
|
+
? SessionBeforeTreeResult | undefined
|
|
273
|
+
: TEvent extends { type: "session.compacting" }
|
|
274
|
+
? SessionCompactingResult | undefined
|
|
275
|
+
: TEvent extends { type: "session_stop" }
|
|
276
|
+
? SessionStopEventResult | undefined
|
|
277
|
+
: undefined;
|
|
278
|
+
|
|
279
|
+
// Session-lifecycle handler types live once in session-handler-types (imported
|
|
280
|
+
// above for local use); re-exported here to keep this module's public API stable.
|
|
281
|
+
export type { BranchHandler, NavigateTreeHandler, NewSessionHandler };
|
|
282
|
+
|
|
283
|
+
export type SwitchSessionHandler = (sessionPath: string) => Promise<{ cancelled: boolean }>;
|
|
284
|
+
|
|
285
|
+
export type ShutdownHandler = () => void;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Emit `session_shutdown` and clear timers owned by an extension runner.
|
|
289
|
+
*
|
|
290
|
+
* Returns whether any shutdown handlers were present. Timer cleanup runs even
|
|
291
|
+
* when a handler fails so extension background work cannot outlive its host.
|
|
292
|
+
*/
|
|
293
|
+
export async function emitSessionShutdownEvent(extensionRunner: ExtensionRunner | undefined): Promise<boolean> {
|
|
294
|
+
if (!extensionRunner) return false;
|
|
295
|
+
try {
|
|
296
|
+
if (!extensionRunner.hasHandlers("session_shutdown")) return false;
|
|
297
|
+
await extensionRunner.emit({
|
|
298
|
+
type: "session_shutdown",
|
|
299
|
+
});
|
|
300
|
+
return true;
|
|
301
|
+
} finally {
|
|
302
|
+
extensionRunner.clearManagedTimers();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const noOpUIContext: ExtensionUIContext = {
|
|
307
|
+
select: async (_title, _options, _dialogOptions) => undefined,
|
|
308
|
+
confirm: async (_title, _message, _dialogOptions) => false,
|
|
309
|
+
input: async (_title, _placeholder, _dialogOptions) => undefined,
|
|
310
|
+
notify: () => {},
|
|
311
|
+
onTerminalInput: () => () => {},
|
|
312
|
+
setStatus: () => {},
|
|
313
|
+
setWorkingMessage: () => {},
|
|
314
|
+
setWidget: () => {},
|
|
315
|
+
setFooter: () => {},
|
|
316
|
+
setHeader: () => {},
|
|
317
|
+
setTitle: () => {},
|
|
318
|
+
custom: async () => undefined as never,
|
|
319
|
+
setEditorText: () => {},
|
|
320
|
+
pasteToEditor: () => {},
|
|
321
|
+
getEditorText: () => "",
|
|
322
|
+
editor: async () => undefined,
|
|
323
|
+
addAutocompleteProvider: () => {},
|
|
324
|
+
setEditorComponent: () => {},
|
|
325
|
+
get theme() {
|
|
326
|
+
return theme;
|
|
327
|
+
},
|
|
328
|
+
getAllThemes: () => Promise.resolve([]),
|
|
329
|
+
getTheme: () => Promise.resolve(undefined),
|
|
330
|
+
setTheme: (_theme: string | Theme) => Promise.resolve({ success: false, error: "UI not available" }),
|
|
331
|
+
getToolsExpanded: () => false,
|
|
332
|
+
setToolsExpanded: () => {},
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export class ExtensionRunner {
|
|
336
|
+
#uiContext: ExtensionUIContext;
|
|
337
|
+
#errorListeners: Set<ExtensionErrorListener> = new Set();
|
|
338
|
+
#getModel: () => Model | undefined = () => undefined;
|
|
339
|
+
#isIdleFn: () => boolean = () => true;
|
|
340
|
+
#waitForIdleFn: () => Promise<void> = async () => {};
|
|
341
|
+
#abortFn: () => void = () => {};
|
|
342
|
+
#hasPendingMessagesFn: () => boolean = () => false;
|
|
343
|
+
#getContextUsageFn: () => ContextUsage | undefined = () => undefined;
|
|
344
|
+
#compactFn: (instructionsOrOptions?: string | CompactOptions) => Promise<void> = async () => {};
|
|
345
|
+
#getSystemPromptFn: () => string[] = () => [];
|
|
346
|
+
#getAsyncJobSnapshotFn: () => AsyncJobSnapshot | null = () => null;
|
|
347
|
+
#newSessionHandler: NewSessionHandler = async () => ({ cancelled: false });
|
|
348
|
+
#branchHandler: BranchHandler = async () => ({ cancelled: false });
|
|
349
|
+
#navigateTreeHandler: NavigateTreeHandler = async () => ({ cancelled: false });
|
|
350
|
+
#switchSessionHandler: SwitchSessionHandler = async () => ({ cancelled: false });
|
|
351
|
+
#reloadHandler: () => Promise<void> = async () => {};
|
|
352
|
+
#shutdownHandler: ShutdownHandler = () => {};
|
|
353
|
+
#getMemoryFn?: () => MemoryRuntimeContext | undefined;
|
|
354
|
+
#commandDiagnostics: Array<{ type: string; message: string; path: string }> = [];
|
|
355
|
+
#initialized = false;
|
|
356
|
+
/**
|
|
357
|
+
* Buffer for `credential_disabled` events received via {@link emitCredentialDisabled}
|
|
358
|
+
* before {@link initialize} has run. Drained through {@link emit} once initialize sets
|
|
359
|
+
* up the runtime context, so extension handlers see a populated UI/runtime context
|
|
360
|
+
* rather than the constructor's no-op default. Bounded at
|
|
361
|
+
* {@link MAX_PENDING_CREDENTIAL_DISABLED}; oldest entries are dropped under pressure.
|
|
362
|
+
*/
|
|
363
|
+
#pendingCredentialDisabled: CredentialDisabledEvent[] = [];
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Buffer for `mcp_notification` events received via {@link emitMcpNotification} before
|
|
367
|
+
* {@link initialize} has run. Two-layer race: `MCPManager` also buffers frames until
|
|
368
|
+
* its first `addNotificationListener` subscriber attaches, but the sdk.ts bridge is
|
|
369
|
+
* registered inside `createAgentSession` — BEFORE the mode controller calls
|
|
370
|
+
* `ExtensionRunner.initialize()`. Without this second buffer, the manager's drain
|
|
371
|
+
* arrives at the bridge → the bridge calls `emitMcpNotification` → the runner drops
|
|
372
|
+
* the frame because `#initialized === false`, and the frame evaporates a second time.
|
|
373
|
+
* Bounded at {@link MAX_PENDING_MCP_NOTIFICATIONS}; oldest entries are dropped under
|
|
374
|
+
* pressure. Drained in {@link initialize} once the runtime/UI context is wired.
|
|
375
|
+
*/
|
|
376
|
+
#pendingMcpNotifications: Array<Omit<McpNotificationEvent, "type">> = [];
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Timers scheduled by extensions through the sanctioned `ctx.setInterval` /
|
|
380
|
+
* `ctx.setTimeout` helpers. Callbacks run with the same isolation as handler
|
|
381
|
+
* dispatch — a throw is logged and routed through {@link onError} instead of
|
|
382
|
+
* escaping to the process `uncaughtException` handler and tearing down the
|
|
383
|
+
* whole session (issue #5664). Handles are `unref`'d and every outstanding
|
|
384
|
+
* timer is cleared on session teardown via {@link clearManagedTimers}.
|
|
385
|
+
*/
|
|
386
|
+
#managedTimers = new ManagedTimers((event, error, stack) =>
|
|
387
|
+
this.emitError({ extensionPath: "<timer>", event, error, stack }),
|
|
388
|
+
);
|
|
389
|
+
/**
|
|
390
|
+
* Dedup markers for `tool_call` emission, keyed `${toolCallId}:${toolName}`.
|
|
391
|
+
* The agent loop emits `tool_call` at arg-prep time (before scheduling and
|
|
392
|
+
* `tool_execution_start`) via the session's `beforeToolCall` wiring; the
|
|
393
|
+
* marker tells `ExtensionToolWrapper.execute` not to emit a second event for
|
|
394
|
+
* the same dispatch. Keyed by call id + tool name because a nested xd://
|
|
395
|
+
* device dispatch reuses the model's toolCallId under a different tool name
|
|
396
|
+
* and must still emit its own event. Bounded: markers for calls whose
|
|
397
|
+
* execute path never runs (policy deny, validation failure) would otherwise
|
|
398
|
+
* accumulate for the session's lifetime.
|
|
399
|
+
*/
|
|
400
|
+
#emittedToolCalls = new Set<string>();
|
|
401
|
+
|
|
402
|
+
/** Records that the loop already emitted `tool_call` for this dispatch. */
|
|
403
|
+
markToolCallEmitted(toolCallId: string, toolName: string): void {
|
|
404
|
+
if (this.#emittedToolCalls.size >= 512) {
|
|
405
|
+
const oldest = this.#emittedToolCalls.values().next().value;
|
|
406
|
+
if (oldest !== undefined) this.#emittedToolCalls.delete(oldest);
|
|
407
|
+
}
|
|
408
|
+
this.#emittedToolCalls.add(`${toolCallId}:${toolName}`);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** Consumes a {@link markToolCallEmitted} marker; true when the loop already emitted. */
|
|
412
|
+
consumeToolCallEmitted(toolCallId: string, toolName: string): boolean {
|
|
413
|
+
return this.#emittedToolCalls.delete(`${toolCallId}:${toolName}`);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Resolves a tool NAME to its native built-in implementation (the pre-extension-override,
|
|
418
|
+
* unwrapped tool) plus a factory for the `AgentToolContext` that native tool expects, or
|
|
419
|
+
* undefined when no native built-in of that name exists. Set by the SDK; backs same-tool
|
|
420
|
+
* `invokeTool`. The context factory is the same one the agent loop uses for tool execution, so a
|
|
421
|
+
* delegated native call sees the ordinary session tool context (ui, cwd, snapshot state, etc.).
|
|
422
|
+
*/
|
|
423
|
+
#nativeToolResolver?: (name: string) => { tool: AgentTool; makeContext: () => AgentToolContext } | undefined;
|
|
424
|
+
|
|
425
|
+
/** Wires the native-tool resolver used by {@link invokeNativeTool}. */
|
|
426
|
+
setNativeToolResolver(
|
|
427
|
+
resolve: (name: string) => { tool: AgentTool; makeContext: () => AgentToolContext } | undefined,
|
|
428
|
+
): void {
|
|
429
|
+
this.#nativeToolResolver = resolve;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/** Whether a native built-in of `name` is available to delegate to. */
|
|
433
|
+
hasNativeTool(name: string): boolean {
|
|
434
|
+
return this.#nativeToolResolver?.(name) !== undefined;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Run the native built-in of `name` with `params` and return its result — the delegation target
|
|
439
|
+
* of a same-tool `ctx.invokeTool`. Calls the unwrapped native `execute` directly with the loop's
|
|
440
|
+
* ordinary tool context, so it inherits the caller's already-granted approval (the caller is the
|
|
441
|
+
* same tool) rather than re-running the gate. `depth` guards a wrapper that recurses into itself;
|
|
442
|
+
* it is per call chain (threaded from the caller), not session-global, so concurrent independent
|
|
443
|
+
* delegations do not interfere.
|
|
444
|
+
*/
|
|
445
|
+
async invokeNativeTool<TDetails = unknown>(
|
|
446
|
+
name: string,
|
|
447
|
+
params: Record<string, unknown>,
|
|
448
|
+
options?: {
|
|
449
|
+
signal?: AbortSignal;
|
|
450
|
+
onUpdate?: AgentToolUpdateCallback<TDetails>;
|
|
451
|
+
depth?: number;
|
|
452
|
+
/**
|
|
453
|
+
* The caller tool's own context. Reused for the native call so metadata the native tool
|
|
454
|
+
* reads — `toolCall` (write/edit LSP batch flushing) and provider metadata /
|
|
455
|
+
* `providerSafetyApproved` (computer) — is preserved. Falls back to a fresh session tool
|
|
456
|
+
* context only when the caller had none.
|
|
457
|
+
*/
|
|
458
|
+
callerContext?: AgentToolContext;
|
|
459
|
+
},
|
|
460
|
+
): Promise<AgentToolResult<TDetails>> {
|
|
461
|
+
const resolved = this.#nativeToolResolver?.(name);
|
|
462
|
+
if (!resolved) throw new Error(`invokeTool: no native built-in named "${name}" to delegate to`);
|
|
463
|
+
const depth = options?.depth ?? 0;
|
|
464
|
+
if (depth >= 8) {
|
|
465
|
+
throw new Error(`invokeTool: delegation depth exceeded 8 (recursive invokeTool for "${name}"?)`);
|
|
466
|
+
}
|
|
467
|
+
const toolCallId = `invoke-${name}-${Date.now().toString(36)}-${depth}`;
|
|
468
|
+
return (await resolved.tool.execute(
|
|
469
|
+
toolCallId,
|
|
470
|
+
params as never,
|
|
471
|
+
options?.signal,
|
|
472
|
+
options?.onUpdate as never,
|
|
473
|
+
options?.callerContext ?? resolved.makeContext(),
|
|
474
|
+
)) as AgentToolResult<TDetails>;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
constructor(
|
|
478
|
+
private readonly extensions: Extension[],
|
|
479
|
+
private readonly runtime: ExtensionRuntime,
|
|
480
|
+
/** Ignored: `cwd` is always read live via the `cwd` getter below, not cached here. */
|
|
481
|
+
_initialCwd: string,
|
|
482
|
+
private readonly sessionManager: SessionManager,
|
|
483
|
+
private readonly modelRegistry: ModelRegistry,
|
|
484
|
+
getMemory?: () => MemoryRuntimeContext | undefined,
|
|
485
|
+
private readonly settings?: Settings,
|
|
486
|
+
private readonly localProtocolOptions?: LocalProtocolOptions,
|
|
487
|
+
getAsyncJobSnapshot?: () => AsyncJobSnapshot | null,
|
|
488
|
+
) {
|
|
489
|
+
this.#uiContext = noOpUIContext;
|
|
490
|
+
this.#getMemoryFn = getMemory;
|
|
491
|
+
this.#getAsyncJobSnapshotFn = getAsyncJobSnapshot ?? (() => null);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Live session directory, not a session-start snapshot: `/move`
|
|
496
|
+
* (`SessionManager.moveTo()`) relocates the owning session by updating
|
|
497
|
+
* `sessionManager`'s own `#cwd`, not a process-global. Reading it here
|
|
498
|
+
* via the getter — instead of caching the constructor-time value in a
|
|
499
|
+
* field — keeps every `ExtensionContext` built below in sync with this
|
|
500
|
+
* session's actual, current directory. Deliberately `sessionManager.getCwd()`
|
|
501
|
+
* rather than `getProjectDir()`: the latter is a single process-wide value
|
|
502
|
+
* that only the interactive TUI's `/move` handler happens to also update
|
|
503
|
+
* (`InteractiveModeContext#applyCwdChange`) — an SDK/ACP host running
|
|
504
|
+
* several concurrent sessions each with their own `cwd` (see
|
|
505
|
+
* `CreateAgentSessionOptions.cwd`) must never have one session's move
|
|
506
|
+
* leak into another's `ctx.cwd` by reading a shared global.
|
|
507
|
+
*/
|
|
508
|
+
get cwd(): string {
|
|
509
|
+
return this.sessionManager.getCwd();
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
initialize(
|
|
513
|
+
actions: ExtensionActions,
|
|
514
|
+
contextActions: ExtensionContextActions,
|
|
515
|
+
commandContextActions?: ExtensionCommandContextActions,
|
|
516
|
+
uiContext?: ExtensionUIContext,
|
|
517
|
+
): void {
|
|
518
|
+
// Copy actions into the shared runtime (all extension APIs reference this)
|
|
519
|
+
this.runtime.sendMessage = actions.sendMessage;
|
|
520
|
+
this.runtime.sendUserMessage = actions.sendUserMessage;
|
|
521
|
+
this.runtime.appendEntry = actions.appendEntry;
|
|
522
|
+
this.runtime.getActiveTools = actions.getActiveTools;
|
|
523
|
+
this.runtime.getAllTools = actions.getAllTools;
|
|
524
|
+
this.runtime.setActiveTools = actions.setActiveTools;
|
|
525
|
+
this.runtime.getCommands = actions.getCommands;
|
|
526
|
+
this.runtime.setModel = actions.setModel;
|
|
527
|
+
this.runtime.getThinkingLevel = actions.getThinkingLevel;
|
|
528
|
+
this.runtime.setThinkingLevel = actions.setThinkingLevel;
|
|
529
|
+
this.runtime.getServiceTiers = actions.getServiceTiers ?? throwUnsupportedServiceTierAction;
|
|
530
|
+
this.runtime.setServiceTier = actions.setServiceTier ?? throwUnsupportedServiceTierAction;
|
|
531
|
+
this.runtime.getSessionName = actions.getSessionName;
|
|
532
|
+
this.runtime.setSessionName = actions.setSessionName;
|
|
533
|
+
|
|
534
|
+
// Context actions (required)
|
|
535
|
+
this.#getModel = contextActions.getModel;
|
|
536
|
+
this.#isIdleFn = contextActions.isIdle;
|
|
537
|
+
this.#abortFn = contextActions.abort;
|
|
538
|
+
this.#hasPendingMessagesFn = contextActions.hasPendingMessages;
|
|
539
|
+
this.#shutdownHandler = contextActions.shutdown;
|
|
540
|
+
this.#getSystemPromptFn = contextActions.getSystemPrompt;
|
|
541
|
+
|
|
542
|
+
// Command context actions (optional, only for interactive mode)
|
|
543
|
+
if (commandContextActions) {
|
|
544
|
+
this.#waitForIdleFn = commandContextActions.waitForIdle;
|
|
545
|
+
this.#newSessionHandler = commandContextActions.newSession;
|
|
546
|
+
this.#branchHandler = commandContextActions.branch;
|
|
547
|
+
this.#navigateTreeHandler = commandContextActions.navigateTree;
|
|
548
|
+
this.#switchSessionHandler = commandContextActions.switchSession;
|
|
549
|
+
this.#reloadHandler = commandContextActions.reload;
|
|
550
|
+
this.#getContextUsageFn = commandContextActions.getContextUsage;
|
|
551
|
+
this.#compactFn = commandContextActions.compact;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
this.#uiContext = uiContext ?? noOpUIContext;
|
|
555
|
+
this.#initialized = true;
|
|
556
|
+
|
|
557
|
+
// Drain events buffered by emitCredentialDisabled() before initialize ran. The
|
|
558
|
+
// spread adds the `type` discriminator — `event` is the pi-ai shape (no `type`).
|
|
559
|
+
// Deferred by one microtask so callers that register an onError listener
|
|
560
|
+
// synchronously after initialize() see handler errors routed through it.
|
|
561
|
+
const pending = this.#pendingCredentialDisabled.splice(0);
|
|
562
|
+
queueMicrotask(() => {
|
|
563
|
+
for (const event of pending) {
|
|
564
|
+
this.emit({ type: "credential_disabled", ...event }).catch((error: unknown) => {
|
|
565
|
+
logger.warn("credential_disabled handler threw during initialize flush", {
|
|
566
|
+
provider: event.provider,
|
|
567
|
+
error: error instanceof Error ? error.message : String(error),
|
|
568
|
+
});
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
// Drain events buffered by emitMcpNotification() before initialize ran, using the
|
|
574
|
+
// same deferred-microtask ordering as the credential-disabled drain above so any
|
|
575
|
+
// onError listener registered synchronously after initialize() still catches
|
|
576
|
+
// handler errors during flush.
|
|
577
|
+
const pendingMcp = this.#pendingMcpNotifications.splice(0);
|
|
578
|
+
queueMicrotask(() => {
|
|
579
|
+
for (const event of pendingMcp) {
|
|
580
|
+
this.emit({ type: "mcp_notification", ...event }).catch((error: unknown) => {
|
|
581
|
+
logger.warn("mcp_notification handler threw during initialize flush", {
|
|
582
|
+
server: event.server,
|
|
583
|
+
method: event.method,
|
|
584
|
+
error: error instanceof Error ? error.message : String(error),
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Forward a `credential_disabled` event from `AuthStorage` to extension handlers.
|
|
593
|
+
*
|
|
594
|
+
* If {@link initialize} has not yet run, the event is buffered and replayed once
|
|
595
|
+
* initialize wires the runtime/UI context. This matters because mode controllers
|
|
596
|
+
* (interactive, RPC, ACP, print, subagent) call `initialize()` AFTER `createAgentSession`
|
|
597
|
+
* returns, but `AuthStorage` can fire `credential_disabled` during startup model probes
|
|
598
|
+
* inside `createAgentSession()`. Without deferral, extension handlers would observe
|
|
599
|
+
* `hasUI=false`, an unset model, and no-op runtime actions on exactly the headline
|
|
600
|
+
* "OAuth invalid_grant during startup" path the event was designed to surface.
|
|
601
|
+
*
|
|
602
|
+
* Always returns; never throws. Errors from handlers are routed through
|
|
603
|
+
* {@link onError} via {@link emit}'s normal isolation.
|
|
604
|
+
*/
|
|
605
|
+
async emitCredentialDisabled(event: CredentialDisabledEvent): Promise<void> {
|
|
606
|
+
if (!this.#initialized) {
|
|
607
|
+
if (this.#pendingCredentialDisabled.length >= MAX_PENDING_CREDENTIAL_DISABLED) {
|
|
608
|
+
this.#pendingCredentialDisabled.shift();
|
|
609
|
+
}
|
|
610
|
+
this.#pendingCredentialDisabled.push(event);
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
await this.emit({ type: "credential_disabled", ...event });
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Forward an MCP server notification to extension handlers.
|
|
618
|
+
*
|
|
619
|
+
* If {@link initialize} has not yet run, the notification is buffered and replayed
|
|
620
|
+
* once initialize wires the runtime/UI context. Matches the credential-disabled
|
|
621
|
+
* deferral above: the sdk.ts bridge registers `MCPManager.addNotificationListener`
|
|
622
|
+
* inside `createAgentSession` — BEFORE the mode controller calls `initialize()` on
|
|
623
|
+
* this runner — so notification frames drained by the manager (either fresh
|
|
624
|
+
* arrivals or replay from its own startup buffer) can reach us pre-init. Without
|
|
625
|
+
* this buffer they would evaporate for a second time here.
|
|
626
|
+
*
|
|
627
|
+
* Bounded at {@link MAX_PENDING_MCP_NOTIFICATIONS}; oldest entries drop under
|
|
628
|
+
* pressure. Never throws; per-handler errors are routed through {@link onError}
|
|
629
|
+
* via {@link emit}'s normal isolation.
|
|
630
|
+
*/
|
|
631
|
+
async emitMcpNotification(event: Omit<McpNotificationEvent, "type">): Promise<void> {
|
|
632
|
+
if (!this.#initialized) {
|
|
633
|
+
if (this.#pendingMcpNotifications.length >= MAX_PENDING_MCP_NOTIFICATIONS) {
|
|
634
|
+
this.#pendingMcpNotifications.shift();
|
|
635
|
+
}
|
|
636
|
+
this.#pendingMcpNotifications.push(event);
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
await this.emit({ type: "mcp_notification", ...event });
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/** Emits a session stop pass that can be cancelled with the active settle signal. */
|
|
643
|
+
async emitSessionStop(event: Omit<SessionStopEvent, "type">): Promise<SessionStopEventResult | undefined> {
|
|
644
|
+
if (event.signal.aborted) return undefined;
|
|
645
|
+
return await this.emit({ type: "session_stop", ...event });
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
getUIContext(): ExtensionUIContext {
|
|
649
|
+
return this.#uiContext;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
hasUI(): boolean {
|
|
653
|
+
return this.#uiContext !== noOpUIContext;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
getExtensionPaths(): string[] {
|
|
657
|
+
return this.extensions.map(e => e.path);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/** Get all registered tools from all extensions. */
|
|
661
|
+
getAllRegisteredTools(): RegisteredTool[] {
|
|
662
|
+
const tools: RegisteredTool[] = [];
|
|
663
|
+
for (const ext of this.extensions) {
|
|
664
|
+
for (const tool of ext.tools.values()) {
|
|
665
|
+
tools.push(tool);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return tools;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Aggregate the registered CLI flags across a set of extensions (last write
|
|
673
|
+
* wins on name collision). Static so callers that need the flag set before a
|
|
674
|
+
* runner exists — e.g. the CLI resolving `@file`/flag args before session
|
|
675
|
+
* creation — share this exact logic instead of duplicating it.
|
|
676
|
+
*/
|
|
677
|
+
static aggregateFlags(extensions: readonly Extension[]): Map<string, ExtensionFlag> {
|
|
678
|
+
const allFlags = new Map<string, ExtensionFlag>();
|
|
679
|
+
for (const ext of extensions) {
|
|
680
|
+
for (const [name, flag] of ext.flags) {
|
|
681
|
+
allFlags.set(name, flag);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
return allFlags;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
getFlags(): Map<string, ExtensionFlag> {
|
|
688
|
+
return ExtensionRunner.aggregateFlags(this.extensions);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
getFlagValues(): Map<string, boolean | string> {
|
|
692
|
+
return new Map(this.runtime.flagValues);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
setFlagValue(name: string, value: boolean | string): void {
|
|
696
|
+
this.runtime.flagValues.set(name, value);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
static readonly #RESERVED_SHORTCUTS: Record<string, true> = {
|
|
700
|
+
"ctrl+c": true,
|
|
701
|
+
"ctrl+d": true,
|
|
702
|
+
"ctrl+z": true,
|
|
703
|
+
"ctrl+k": true,
|
|
704
|
+
"ctrl+p": true,
|
|
705
|
+
"ctrl+l": true,
|
|
706
|
+
"ctrl+o": true,
|
|
707
|
+
"ctrl+t": true,
|
|
708
|
+
"ctrl+g": true,
|
|
709
|
+
"alt+m": true,
|
|
710
|
+
// Default chord for `app.message.followUp` (Windows Terminal can't deliver Ctrl+Enter; #1903).
|
|
711
|
+
"ctrl+q": true,
|
|
712
|
+
"shift+tab": true,
|
|
713
|
+
"shift+ctrl+p": true,
|
|
714
|
+
"alt+enter": true,
|
|
715
|
+
escape: true,
|
|
716
|
+
enter: true,
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
getShortcuts(): Map<KeyId, ExtensionShortcut> {
|
|
720
|
+
const allShortcuts = new Map<KeyId, ExtensionShortcut>();
|
|
721
|
+
for (const ext of this.extensions) {
|
|
722
|
+
for (const [key, shortcut] of ext.shortcuts) {
|
|
723
|
+
const normalizedKey = key.toLowerCase() as KeyId;
|
|
724
|
+
|
|
725
|
+
if (ExtensionRunner.#RESERVED_SHORTCUTS[normalizedKey]) {
|
|
726
|
+
logger.warn("Extension shortcut conflicts with built-in shortcut", {
|
|
727
|
+
key,
|
|
728
|
+
extensionPath: shortcut.extensionPath,
|
|
729
|
+
});
|
|
730
|
+
continue;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
const existing = allShortcuts.get(normalizedKey);
|
|
734
|
+
if (existing) {
|
|
735
|
+
logger.warn("Extension shortcut conflict", {
|
|
736
|
+
key,
|
|
737
|
+
extensionPath: shortcut.extensionPath,
|
|
738
|
+
existingExtensionPath: existing.extensionPath,
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
allShortcuts.set(normalizedKey, shortcut);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
return allShortcuts;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
onError(listener: ExtensionErrorListener): () => void {
|
|
748
|
+
this.#errorListeners.add(listener);
|
|
749
|
+
return () => this.#errorListeners.delete(listener);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
emitError(error: ExtensionError): void {
|
|
753
|
+
for (const listener of this.#errorListeners) {
|
|
754
|
+
listener(error);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
hasHandlers(eventType: string): boolean {
|
|
759
|
+
for (const ext of this.extensions) {
|
|
760
|
+
const handlers = ext.handlers.get(eventType);
|
|
761
|
+
if (handlers && handlers.length > 0) {
|
|
762
|
+
return true;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
return false;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
getMessageRenderer(customType: string): MessageRenderer | undefined {
|
|
769
|
+
for (const ext of this.extensions) {
|
|
770
|
+
const renderer = ext.messageRenderers.get(customType);
|
|
771
|
+
if (renderer) {
|
|
772
|
+
return renderer;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
return undefined;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
getAssistantThinkingRenderers(): AssistantThinkingRenderer[] {
|
|
779
|
+
return this.extensions.flatMap(ext => ext.assistantThinkingRenderers);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
getRegisteredCommands(reserved?: ReadonlySet<string>): RegisteredCommand[] {
|
|
783
|
+
this.#commandDiagnostics = [];
|
|
784
|
+
|
|
785
|
+
const commands = new Map<string, RegisteredCommand>();
|
|
786
|
+
for (const ext of this.extensions) {
|
|
787
|
+
for (const command of ext.commands.values()) {
|
|
788
|
+
if (reserved?.has(command.name)) {
|
|
789
|
+
const message = `Extension command '${command.name}' from ${ext.path} conflicts with built-in commands. Skipping.`;
|
|
790
|
+
this.#commandDiagnostics.push({ type: "warning", message, path: ext.path });
|
|
791
|
+
if (!this.hasUI()) {
|
|
792
|
+
logger.warn(message);
|
|
793
|
+
}
|
|
794
|
+
continue;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
commands.set(command.name, command);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
return [...commands.values()];
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
getCommandDiagnostics(): Array<{ type: string; message: string; path: string }> {
|
|
804
|
+
return this.#commandDiagnostics;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
getCommand(name: string): RegisteredCommand | undefined {
|
|
808
|
+
for (let index = this.extensions.length - 1; index >= 0; index -= 1) {
|
|
809
|
+
const command = this.extensions[index]?.commands.get(name);
|
|
810
|
+
if (command) {
|
|
811
|
+
return command;
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
return undefined;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* Creates an extension context, optionally scoped to a provider request model.
|
|
819
|
+
*
|
|
820
|
+
* `delegation` wires the same-tool `ctx.invokeTool` for a re-registered built-in: when `toolName`
|
|
821
|
+
* names an existing native built-in, the context carries an `invokeTool` that runs it (see
|
|
822
|
+
* {@link invokeNativeTool}). The rest inherits the wrapper's own call so a bare
|
|
823
|
+
* `ctx.invokeTool(params)` behaves like the outer call — `context` preserves `toolCall`/provider
|
|
824
|
+
* metadata, `signal`/`onUpdate` default to the wrapper's own channels so aborting the outer tool
|
|
825
|
+
* call stops the native one and native progress still streams, and `depth` bounds recursion per
|
|
826
|
+
* call chain. Explicit options passed to `invokeTool` override the inherited `signal`/`onUpdate`.
|
|
827
|
+
*/
|
|
828
|
+
createContext(
|
|
829
|
+
model?: Model,
|
|
830
|
+
delegation?: {
|
|
831
|
+
toolName: string;
|
|
832
|
+
depth?: number;
|
|
833
|
+
context?: AgentToolContext;
|
|
834
|
+
signal?: AbortSignal;
|
|
835
|
+
onUpdate?: AgentToolUpdateCallback;
|
|
836
|
+
},
|
|
837
|
+
): ExtensionContext {
|
|
838
|
+
const getModel = model ? () => model : this.#getModel;
|
|
839
|
+
return {
|
|
840
|
+
ui: this.#uiContext,
|
|
841
|
+
getContextUsage: () => this.#getContextUsageFn(),
|
|
842
|
+
compact: instructionsOrOptions => this.#compactFn(instructionsOrOptions),
|
|
843
|
+
getAsyncJobSnapshot: () => this.#getAsyncJobSnapshotFn(),
|
|
844
|
+
hasUI: this.hasUI(),
|
|
845
|
+
cwd: this.cwd,
|
|
846
|
+
sessionManager: this.sessionManager,
|
|
847
|
+
modelRegistry: this.modelRegistry,
|
|
848
|
+
get model() {
|
|
849
|
+
return getModel();
|
|
850
|
+
},
|
|
851
|
+
models: createExtensionModelQuery(this.modelRegistry, this.settings, getModel),
|
|
852
|
+
isIdle: () => this.#isIdleFn(),
|
|
853
|
+
abort: () => this.#abortFn(),
|
|
854
|
+
hasPendingMessages: () => this.#hasPendingMessagesFn(),
|
|
855
|
+
shutdown: () => this.#shutdownHandler(),
|
|
856
|
+
getSystemPrompt: () => this.#getSystemPromptFn(),
|
|
857
|
+
localProtocolOptions: this.localProtocolOptions,
|
|
858
|
+
memory: this.#getMemoryFn?.(),
|
|
859
|
+
setInterval: (callback, ms, ...args) => this.#managedTimers.setInterval(callback, ms, ...args),
|
|
860
|
+
setTimeout: (callback, ms, ...args) => this.#managedTimers.setTimeout(callback, ms, ...args),
|
|
861
|
+
clearTimer: timer => this.#managedTimers.clear(timer),
|
|
862
|
+
invokeTool:
|
|
863
|
+
delegation !== undefined && this.hasNativeTool(delegation.toolName)
|
|
864
|
+
? (params, options) =>
|
|
865
|
+
this.invokeNativeTool(delegation.toolName, params, {
|
|
866
|
+
// Inherit the wrapper's own channels so a bare `ctx.invokeTool(params)` aborts
|
|
867
|
+
// and streams with the outer call. Explicit options win.
|
|
868
|
+
signal: options?.signal ?? delegation.signal,
|
|
869
|
+
onUpdate: options?.onUpdate ?? delegation.onUpdate,
|
|
870
|
+
depth: (delegation.depth ?? 0) + 1,
|
|
871
|
+
callerContext: delegation.context,
|
|
872
|
+
})
|
|
873
|
+
: undefined,
|
|
874
|
+
};
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Request a graceful shutdown. Called by extension tools and event handlers.
|
|
879
|
+
*/
|
|
880
|
+
shutdown(): void {
|
|
881
|
+
this.#shutdownHandler();
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/**
|
|
885
|
+
* Clear every timer scheduled through `ctx.setInterval` / `ctx.setTimeout`.
|
|
886
|
+
* Called during session teardown so extension background work does not
|
|
887
|
+
* outlive the session (a self-scheduling interval would otherwise keep
|
|
888
|
+
* firing against a disposed session).
|
|
889
|
+
*/
|
|
890
|
+
clearManagedTimers(): void {
|
|
891
|
+
this.#managedTimers.clearAll();
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
createCommandContext(): ExtensionCommandContext {
|
|
895
|
+
return {
|
|
896
|
+
...this.createContext(),
|
|
897
|
+
getContextUsage: () => this.#getContextUsageFn(),
|
|
898
|
+
waitForIdle: () => this.#waitForIdleFn(),
|
|
899
|
+
newSession: options => this.#newSessionHandler(options),
|
|
900
|
+
branch: entryId => this.#branchHandler(entryId),
|
|
901
|
+
navigateTree: (targetId, options) => this.#navigateTreeHandler(targetId, options),
|
|
902
|
+
switchSession: sessionPath => this.#switchSessionHandler(sessionPath),
|
|
903
|
+
reload: () => this.#reloadHandler(),
|
|
904
|
+
compact: instructionsOrOptions => this.#compactFn(instructionsOrOptions),
|
|
905
|
+
};
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
#isSessionBeforeEvent(event: RunnerEmitEvent): event is SessionBeforeEvent {
|
|
909
|
+
return (
|
|
910
|
+
event.type === "session_before_switch" ||
|
|
911
|
+
event.type === "session_before_branch" ||
|
|
912
|
+
event.type === "session_before_compact" ||
|
|
913
|
+
event.type === "session_before_tree"
|
|
914
|
+
);
|
|
915
|
+
}
|
|
916
|
+
#isSessionShutdownEvent(event: RunnerEmitEvent): event is Extract<RunnerEmitEvent, { type: "session_shutdown" }> {
|
|
917
|
+
return event.type === "session_shutdown";
|
|
918
|
+
}
|
|
919
|
+
async #runHandlerWithTimeout<TEvent extends { type: string }, TResult>(
|
|
920
|
+
handler: (event: TEvent, ctx: ExtensionContext) => Promise<TResult | undefined> | TResult | undefined,
|
|
921
|
+
event: TEvent,
|
|
922
|
+
ctx: ExtensionContext,
|
|
923
|
+
ext: Extension,
|
|
924
|
+
timeoutMs: number,
|
|
925
|
+
): Promise<TResult | undefined> {
|
|
926
|
+
const signal =
|
|
927
|
+
event.type === "session_stop" && "signal" in event && event.signal instanceof AbortSignal
|
|
928
|
+
? event.signal
|
|
929
|
+
: undefined;
|
|
930
|
+
if (signal?.aborted) return undefined;
|
|
931
|
+
try {
|
|
932
|
+
const handlerResult = await raceHandlerWithTimeout(
|
|
933
|
+
handlerSignal => handler(event, createHandlerContext(ctx, handlerSignal)),
|
|
934
|
+
timeoutMs,
|
|
935
|
+
signal,
|
|
936
|
+
);
|
|
937
|
+
if (handlerResult === EXTENSION_HANDLER_ABORTED) return undefined;
|
|
938
|
+
if (handlerResult === EXTENSION_HANDLER_TIMEOUT) {
|
|
939
|
+
const error = `handler timed out after ${timeoutMs}ms`;
|
|
940
|
+
logger.warn("Extension handler timed out", {
|
|
941
|
+
extensionPath: ext.path,
|
|
942
|
+
event: event.type,
|
|
943
|
+
timeoutMs,
|
|
944
|
+
});
|
|
945
|
+
this.emitError({
|
|
946
|
+
extensionPath: ext.path,
|
|
947
|
+
event: event.type,
|
|
948
|
+
error,
|
|
949
|
+
});
|
|
950
|
+
return undefined;
|
|
951
|
+
}
|
|
952
|
+
return handlerResult as TResult | undefined;
|
|
953
|
+
} catch (err) {
|
|
954
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
955
|
+
const stack = err instanceof Error ? err.stack : undefined;
|
|
956
|
+
this.emitError({
|
|
957
|
+
extensionPath: ext.path,
|
|
958
|
+
event: event.type,
|
|
959
|
+
error: message,
|
|
960
|
+
stack,
|
|
961
|
+
});
|
|
962
|
+
return undefined;
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
async emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>> {
|
|
967
|
+
// Defer the per-event context allocation (and the Promise.race/Bun.sleep
|
|
968
|
+
// timeout machinery) to the first matching handler. Streaming sessions emit
|
|
969
|
+
// message_update / tool_execution_* per delta with usually no extension
|
|
970
|
+
// subscribed; building `ctx` for a zero-handler event is pure waste.
|
|
971
|
+
let ctx: ExtensionContext | undefined;
|
|
972
|
+
let result: SessionBeforeEventResult | SessionCompactingResult | SessionStopEventResult | undefined;
|
|
973
|
+
|
|
974
|
+
if (this.#isSessionShutdownEvent(event)) {
|
|
975
|
+
const timeoutMs = handlerTimeoutForEvent(event.type);
|
|
976
|
+
const promises: Promise<unknown>[] = [];
|
|
977
|
+
for (const ext of this.extensions) {
|
|
978
|
+
const handlers = ext.handlers.get(event.type);
|
|
979
|
+
if (!handlers || handlers.length === 0) continue;
|
|
980
|
+
ctx ??= this.createContext();
|
|
981
|
+
for (const handler of handlers) {
|
|
982
|
+
promises.push(this.#runHandlerWithTimeout(handler, event, ctx, ext, timeoutMs));
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
if (promises.length > 0) await Promise.all(promises);
|
|
986
|
+
return result as RunnerEmitResult<TEvent>;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
for (const ext of this.extensions) {
|
|
990
|
+
const handlers = ext.handlers.get(event.type);
|
|
991
|
+
if (!handlers || handlers.length === 0) continue;
|
|
992
|
+
ctx ??= this.createContext();
|
|
993
|
+
|
|
994
|
+
for (const handler of handlers) {
|
|
995
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
996
|
+
handler,
|
|
997
|
+
event,
|
|
998
|
+
ctx,
|
|
999
|
+
ext,
|
|
1000
|
+
handlerTimeoutForEvent(event.type),
|
|
1001
|
+
);
|
|
1002
|
+
|
|
1003
|
+
if (this.#isSessionBeforeEvent(event) && handlerResult) {
|
|
1004
|
+
result = handlerResult as SessionBeforeEventResult;
|
|
1005
|
+
if (result.cancel) {
|
|
1006
|
+
return result as RunnerEmitResult<TEvent>;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
if (event.type === "session.compacting" && handlerResult) {
|
|
1011
|
+
result = handlerResult as SessionCompactingResult;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
if (event.type === "session_stop" && handlerResult) {
|
|
1015
|
+
result = handlerResult as SessionStopEventResult;
|
|
1016
|
+
const hasContinuationContext =
|
|
1017
|
+
(typeof result.additionalContext === "string" && result.additionalContext.length > 0) ||
|
|
1018
|
+
(typeof result.reason === "string" && result.reason.length > 0);
|
|
1019
|
+
if ((result.continue === true || result.decision === "block") && hasContinuationContext) {
|
|
1020
|
+
return result as RunnerEmitResult<TEvent>;
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return result as RunnerEmitResult<TEvent>;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
async emitToolResult(event: ToolResultEvent): Promise<ToolResultEventResult | undefined> {
|
|
1030
|
+
const ctx = this.createContext();
|
|
1031
|
+
const currentEvent: ToolResultEvent = { ...event };
|
|
1032
|
+
let modified = false;
|
|
1033
|
+
|
|
1034
|
+
for (const ext of this.extensions) {
|
|
1035
|
+
const handlers = ext.handlers.get("tool_result");
|
|
1036
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1037
|
+
|
|
1038
|
+
for (const handler of handlers) {
|
|
1039
|
+
const handlerResult = (await this.#runHandlerWithTimeout(
|
|
1040
|
+
handler,
|
|
1041
|
+
currentEvent,
|
|
1042
|
+
ctx,
|
|
1043
|
+
ext,
|
|
1044
|
+
extensionHandlerTimeoutMs,
|
|
1045
|
+
)) as ToolResultEventResult | undefined;
|
|
1046
|
+
if (!handlerResult) continue;
|
|
1047
|
+
|
|
1048
|
+
if (handlerResult.content !== undefined) {
|
|
1049
|
+
currentEvent.content = handlerResult.content;
|
|
1050
|
+
modified = true;
|
|
1051
|
+
}
|
|
1052
|
+
if (handlerResult.details !== undefined) {
|
|
1053
|
+
currentEvent.details = handlerResult.details;
|
|
1054
|
+
modified = true;
|
|
1055
|
+
}
|
|
1056
|
+
if (handlerResult.isError !== undefined) {
|
|
1057
|
+
currentEvent.isError = handlerResult.isError;
|
|
1058
|
+
modified = true;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
if (!modified) return undefined;
|
|
1064
|
+
|
|
1065
|
+
return {
|
|
1066
|
+
content: currentEvent.content,
|
|
1067
|
+
details: currentEvent.details,
|
|
1068
|
+
isError: currentEvent.isError,
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
/**
|
|
1073
|
+
* Emit a `tool_call` event to every subscribed extension before the tool executes.
|
|
1074
|
+
*
|
|
1075
|
+
* Each handler is bounded by `extensionHandlerTimeoutMs` (default 30s). This
|
|
1076
|
+
* matches the timeout policy already applied to `emitToolResult` and every
|
|
1077
|
+
* other handler routed through `#runHandlerWithTimeout`; without it a single
|
|
1078
|
+
* hung extension (unresolved `await`, network call with no timeout) would
|
|
1079
|
+
* park `ExtensionToolWrapper.execute` indefinitely and freeze tool
|
|
1080
|
+
* dispatch — see issue #3948.
|
|
1081
|
+
*
|
|
1082
|
+
* On-timeout policy: **fail-closed** (return `{ block: true }`). This is
|
|
1083
|
+
* symmetric with the existing error path below and safer for a
|
|
1084
|
+
* pre-execution gate — an unresponsive extension MUST NOT be treated as
|
|
1085
|
+
* silent consent to run the tool.
|
|
1086
|
+
*/
|
|
1087
|
+
async emitToolCall(event: ToolCallEvent): Promise<ToolCallEventResult | undefined> {
|
|
1088
|
+
const ctx = this.createContext();
|
|
1089
|
+
const timeoutMs = extensionHandlerTimeoutMs;
|
|
1090
|
+
let result: ToolCallEventResult | undefined;
|
|
1091
|
+
|
|
1092
|
+
for (const ext of this.extensions) {
|
|
1093
|
+
const handlers = ext.handlers.get("tool_call");
|
|
1094
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1095
|
+
|
|
1096
|
+
for (const handler of handlers) {
|
|
1097
|
+
try {
|
|
1098
|
+
const handlerResult = await raceHandlerWithTimeout(
|
|
1099
|
+
handlerSignal => handler(event, createHandlerContext(ctx, handlerSignal)),
|
|
1100
|
+
timeoutMs,
|
|
1101
|
+
);
|
|
1102
|
+
|
|
1103
|
+
if (handlerResult === EXTENSION_HANDLER_TIMEOUT) {
|
|
1104
|
+
const error = `handler timed out after ${timeoutMs}ms`;
|
|
1105
|
+
logger.warn("Extension handler timed out", {
|
|
1106
|
+
extensionPath: ext.path,
|
|
1107
|
+
event: "tool_call",
|
|
1108
|
+
timeoutMs,
|
|
1109
|
+
});
|
|
1110
|
+
this.emitError({
|
|
1111
|
+
extensionPath: ext.path,
|
|
1112
|
+
event: "tool_call",
|
|
1113
|
+
error,
|
|
1114
|
+
});
|
|
1115
|
+
return {
|
|
1116
|
+
block: true,
|
|
1117
|
+
reason: `Extension ${ext.path} timed out after ${timeoutMs}ms`,
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
if (handlerResult) {
|
|
1122
|
+
result = handlerResult as ToolCallEventResult;
|
|
1123
|
+
if (result.block) {
|
|
1124
|
+
return result;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
} catch (err) {
|
|
1128
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1129
|
+
const stack = err instanceof Error ? err.stack : undefined;
|
|
1130
|
+
this.emitError({
|
|
1131
|
+
extensionPath: ext.path,
|
|
1132
|
+
event: "tool_call",
|
|
1133
|
+
error: message,
|
|
1134
|
+
stack,
|
|
1135
|
+
});
|
|
1136
|
+
return { block: true, reason: `Extension ${ext.path} failed: ${message}` };
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
return result;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
async emitUserBash(event: UserBashEvent): Promise<UserBashEventResult | undefined> {
|
|
1145
|
+
return this.emitUserEvent<UserBashEventResult>(event, "user_bash");
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
async emitUserPython(event: UserPythonEvent): Promise<UserPythonEventResult | undefined> {
|
|
1149
|
+
return this.emitUserEvent<UserPythonEventResult>(event, "user_python");
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
private async emitUserEvent<R>(
|
|
1153
|
+
event: UserBashEvent | UserPythonEvent,
|
|
1154
|
+
eventName: "user_bash" | "user_python",
|
|
1155
|
+
): Promise<R | undefined> {
|
|
1156
|
+
const ctx = this.createContext();
|
|
1157
|
+
|
|
1158
|
+
for (const ext of this.extensions) {
|
|
1159
|
+
const handlers = ext.handlers.get(eventName);
|
|
1160
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1161
|
+
|
|
1162
|
+
for (const handler of handlers) {
|
|
1163
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
1164
|
+
handler,
|
|
1165
|
+
event,
|
|
1166
|
+
ctx,
|
|
1167
|
+
ext,
|
|
1168
|
+
extensionHandlerTimeoutMs,
|
|
1169
|
+
);
|
|
1170
|
+
if (handlerResult) {
|
|
1171
|
+
return handlerResult as R;
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
return undefined;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
async emitResourcesDiscover(
|
|
1180
|
+
cwd: string,
|
|
1181
|
+
reason: ResourcesDiscoverEvent["reason"],
|
|
1182
|
+
): Promise<{
|
|
1183
|
+
skillPaths: Array<{ path: string; extensionPath: string }>;
|
|
1184
|
+
promptPaths: Array<{ path: string; extensionPath: string }>;
|
|
1185
|
+
themePaths: Array<{ path: string; extensionPath: string }>;
|
|
1186
|
+
}> {
|
|
1187
|
+
const ctx = this.createContext();
|
|
1188
|
+
const skillPaths: Array<{ path: string; extensionPath: string }> = [];
|
|
1189
|
+
const promptPaths: Array<{ path: string; extensionPath: string }> = [];
|
|
1190
|
+
const themePaths: Array<{ path: string; extensionPath: string }> = [];
|
|
1191
|
+
|
|
1192
|
+
for (const ext of this.extensions) {
|
|
1193
|
+
const handlers = ext.handlers.get("resources_discover");
|
|
1194
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1195
|
+
|
|
1196
|
+
for (const handler of handlers) {
|
|
1197
|
+
const event: ResourcesDiscoverEvent = { type: "resources_discover", cwd, reason };
|
|
1198
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
1199
|
+
handler,
|
|
1200
|
+
event,
|
|
1201
|
+
ctx,
|
|
1202
|
+
ext,
|
|
1203
|
+
extensionHandlerTimeoutMs,
|
|
1204
|
+
);
|
|
1205
|
+
const result = handlerResult as ResourcesDiscoverResult | undefined;
|
|
1206
|
+
|
|
1207
|
+
if (result?.skillPaths?.length) {
|
|
1208
|
+
skillPaths.push(...result.skillPaths.map(path => ({ path, extensionPath: ext.path })));
|
|
1209
|
+
}
|
|
1210
|
+
if (result?.promptPaths?.length) {
|
|
1211
|
+
promptPaths.push(...result.promptPaths.map(path => ({ path, extensionPath: ext.path })));
|
|
1212
|
+
}
|
|
1213
|
+
if (result?.themePaths?.length) {
|
|
1214
|
+
themePaths.push(...result.themePaths.map(path => ({ path, extensionPath: ext.path })));
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
return { skillPaths, promptPaths, themePaths };
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/** Emit input event. Transforms chain, "handled" short-circuits. */
|
|
1223
|
+
async emitInput(
|
|
1224
|
+
text: string,
|
|
1225
|
+
images: ImageContent[] | undefined,
|
|
1226
|
+
source: "interactive" | "rpc" | "extension",
|
|
1227
|
+
): Promise<InputEventResult> {
|
|
1228
|
+
const ctx = this.createContext();
|
|
1229
|
+
let currentText = text;
|
|
1230
|
+
let currentImages = images;
|
|
1231
|
+
|
|
1232
|
+
for (const ext of this.extensions) {
|
|
1233
|
+
for (const handler of ext.handlers.get("input") ?? []) {
|
|
1234
|
+
const event: InputEvent = { type: "input", text: currentText, images: currentImages, source };
|
|
1235
|
+
const result = (await this.#runHandlerWithTimeout(handler, event, ctx, ext, extensionHandlerTimeoutMs)) as
|
|
1236
|
+
| InputEventResult
|
|
1237
|
+
| undefined;
|
|
1238
|
+
if (result?.handled) return result;
|
|
1239
|
+
if (result?.text !== undefined) {
|
|
1240
|
+
currentText = result.text;
|
|
1241
|
+
currentImages = result.images ?? currentImages;
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
return currentText !== text || currentImages !== images ? { text: currentText, images: currentImages } : {};
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
async emitContext(messages: AgentMessage[]): Promise<AgentMessage[]> {
|
|
1249
|
+
const ctx = this.createContext();
|
|
1250
|
+
|
|
1251
|
+
// Check if any extensions actually have context handlers before cloning
|
|
1252
|
+
let hasContextHandlers = false;
|
|
1253
|
+
for (const ext of this.extensions) {
|
|
1254
|
+
if (ext.handlers.get("context")?.length) {
|
|
1255
|
+
hasContextHandlers = true;
|
|
1256
|
+
break;
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
if (!hasContextHandlers) return messages;
|
|
1260
|
+
|
|
1261
|
+
let currentMessages: AgentMessage[];
|
|
1262
|
+
try {
|
|
1263
|
+
currentMessages = structuredClone(messages);
|
|
1264
|
+
} catch {
|
|
1265
|
+
// Messages may contain non-cloneable objects (e.g. in ToolResultMessage.details
|
|
1266
|
+
// or ProviderPayload). Fall back to a shallow array clone — extensions should
|
|
1267
|
+
// return new message arrays rather than mutating in place.
|
|
1268
|
+
currentMessages = [...messages];
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
for (const ext of this.extensions) {
|
|
1272
|
+
const handlers = ext.handlers.get("context");
|
|
1273
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1274
|
+
|
|
1275
|
+
for (const handler of handlers) {
|
|
1276
|
+
const event: ContextEvent = { type: "context", messages: currentMessages };
|
|
1277
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
1278
|
+
handler,
|
|
1279
|
+
event,
|
|
1280
|
+
ctx,
|
|
1281
|
+
ext,
|
|
1282
|
+
extensionHandlerTimeoutMs,
|
|
1283
|
+
);
|
|
1284
|
+
|
|
1285
|
+
if (handlerResult && (handlerResult as ContextEventResult).messages) {
|
|
1286
|
+
currentMessages = (handlerResult as ContextEventResult).messages!;
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
return currentMessages;
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
/** Runs request payload hooks with the model used for that provider request. */
|
|
1295
|
+
async emitBeforeProviderRequest(payload: unknown, model?: Model): Promise<BeforeProviderRequestEventResult> {
|
|
1296
|
+
const ctx = this.createContext(model);
|
|
1297
|
+
let currentPayload = payload;
|
|
1298
|
+
|
|
1299
|
+
for (const ext of this.extensions) {
|
|
1300
|
+
const handlers = ext.handlers.get("before_provider_request");
|
|
1301
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1302
|
+
|
|
1303
|
+
for (const handler of handlers) {
|
|
1304
|
+
const event: BeforeProviderRequestEvent = {
|
|
1305
|
+
type: "before_provider_request",
|
|
1306
|
+
payload: currentPayload,
|
|
1307
|
+
};
|
|
1308
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
1309
|
+
handler,
|
|
1310
|
+
event,
|
|
1311
|
+
ctx,
|
|
1312
|
+
ext,
|
|
1313
|
+
extensionHandlerTimeoutMs,
|
|
1314
|
+
);
|
|
1315
|
+
if (handlerResult !== undefined) {
|
|
1316
|
+
currentPayload = handlerResult;
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
return currentPayload;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
async emitAfterProviderResponse(response: ProviderResponseMetadata, _model?: Model): Promise<void> {
|
|
1325
|
+
const ctx = this.createContext();
|
|
1326
|
+
|
|
1327
|
+
for (const ext of this.extensions) {
|
|
1328
|
+
const handlers = ext.handlers.get("after_provider_response");
|
|
1329
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1330
|
+
|
|
1331
|
+
for (const handler of handlers) {
|
|
1332
|
+
const event: AfterProviderResponseEvent = {
|
|
1333
|
+
type: "after_provider_response",
|
|
1334
|
+
status: response.status,
|
|
1335
|
+
headers: response.headers,
|
|
1336
|
+
requestId: response.requestId,
|
|
1337
|
+
metadata: response.metadata,
|
|
1338
|
+
};
|
|
1339
|
+
await this.#runHandlerWithTimeout(handler, event, ctx, ext, extensionHandlerTimeoutMs);
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
async emitBeforeAgentStart(
|
|
1345
|
+
prompt: string,
|
|
1346
|
+
images: ImageContent[] | undefined,
|
|
1347
|
+
systemPrompt: string[],
|
|
1348
|
+
): Promise<BeforeAgentStartCombinedResult | undefined> {
|
|
1349
|
+
const ctx = this.createContext();
|
|
1350
|
+
const messages: NonNullable<BeforeAgentStartEventResult["message"]>[] = [];
|
|
1351
|
+
let currentSystemPrompt = systemPrompt;
|
|
1352
|
+
let systemPromptModified = false;
|
|
1353
|
+
|
|
1354
|
+
for (const ext of this.extensions) {
|
|
1355
|
+
const handlers = ext.handlers.get("before_agent_start");
|
|
1356
|
+
if (!handlers || handlers.length === 0) continue;
|
|
1357
|
+
|
|
1358
|
+
for (const handler of handlers) {
|
|
1359
|
+
const event: BeforeAgentStartEvent = {
|
|
1360
|
+
type: "before_agent_start",
|
|
1361
|
+
prompt,
|
|
1362
|
+
images,
|
|
1363
|
+
systemPrompt: currentSystemPrompt,
|
|
1364
|
+
};
|
|
1365
|
+
const handlerResult = await this.#runHandlerWithTimeout(
|
|
1366
|
+
handler,
|
|
1367
|
+
event,
|
|
1368
|
+
ctx,
|
|
1369
|
+
ext,
|
|
1370
|
+
extensionHandlerTimeoutMs,
|
|
1371
|
+
);
|
|
1372
|
+
|
|
1373
|
+
if (handlerResult) {
|
|
1374
|
+
const result = handlerResult as BeforeAgentStartEventResult;
|
|
1375
|
+
if (result.message) {
|
|
1376
|
+
messages.push(result.message);
|
|
1377
|
+
}
|
|
1378
|
+
if (result.systemPrompt !== undefined) {
|
|
1379
|
+
currentSystemPrompt =
|
|
1380
|
+
typeof result.systemPrompt === "string" ? [result.systemPrompt] : result.systemPrompt;
|
|
1381
|
+
systemPromptModified = true;
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
if (messages.length > 0 || systemPromptModified) {
|
|
1388
|
+
return {
|
|
1389
|
+
messages: messages.length > 0 ? messages : undefined,
|
|
1390
|
+
systemPrompt: systemPromptModified ? currentSystemPrompt : undefined,
|
|
1391
|
+
};
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
return undefined;
|
|
1395
|
+
}
|
|
1396
|
+
}
|