@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,1412 @@
|
|
|
1
|
+
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
2
|
+
import { estimateTokens } from "@oh-my-pi/pi-agent-core/compaction";
|
|
3
|
+
import type { AssistantMessage, ImageContent, TextContent } from "@oh-my-pi/pi-ai";
|
|
4
|
+
import * as AIError from "@oh-my-pi/pi-ai/error";
|
|
5
|
+
import { raceWithSignal } from "@oh-my-pi/pi-ai/utils/abort";
|
|
6
|
+
import { type CursorExecResolvedCarrier, kCursorExecResolved } from "@oh-my-pi/pi-ai/utils/block-symbols";
|
|
7
|
+
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
|
+
import { obfuscateToolArguments, type SecretObfuscator } from "../secrets/obfuscator";
|
|
9
|
+
import {
|
|
10
|
+
formatExecutionSourcePreview,
|
|
11
|
+
formatSessionHistoryMarkdown,
|
|
12
|
+
formatToolResultErrorPreview,
|
|
13
|
+
PRIMARY_CONTEXT_CUSTOM_TYPES,
|
|
14
|
+
} from "../session/session-history-format";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Minimal slice of `Agent` the runtime drives — satisfied by pi-agent-core
|
|
18
|
+
* `Agent`. `state.error` mirrors `Agent.state.error`: provider/stream failures
|
|
19
|
+
* the loop catches internally never reject `prompt()`, so the runtime reads
|
|
20
|
+
* this field after every prompt to detect a failed turn.
|
|
21
|
+
*/
|
|
22
|
+
export interface AdvisorAgent {
|
|
23
|
+
prompt(input: string): Promise<void>;
|
|
24
|
+
abort(reason?: unknown): void;
|
|
25
|
+
reset(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Drop messages appended past `count`. Called after a failed `prompt()` so a
|
|
28
|
+
* retry doesn't replay the failed user batch + synthetic assistant-error
|
|
29
|
+
* turn `Agent.#runLoop` records on its internal state.
|
|
30
|
+
*/
|
|
31
|
+
rollbackTo?(count: number): void;
|
|
32
|
+
readonly state: { messages: AgentMessage[]; error?: string };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface AdvisorRuntimeHost {
|
|
36
|
+
/** Live primary transcript (use `agent.state.messages`). */
|
|
37
|
+
snapshotMessages(): AgentMessage[];
|
|
38
|
+
/** Surface one advice note to the primary (enqueues into the session YieldQueue). */
|
|
39
|
+
enqueueAdvice(note: string, severity?: "nit" | "concern" | "blocker"): void;
|
|
40
|
+
/** Redact primary transcript bytes before they reach the advisor model. */
|
|
41
|
+
obfuscator?: SecretObfuscator;
|
|
42
|
+
/**
|
|
43
|
+
* Pre-prompt context maintenance for the advisor's own append-only context.
|
|
44
|
+
* Promotes the advisor model to a larger sibling when its context nears the
|
|
45
|
+
* window (mirroring the primary's promote-first policy) and resolves `true`
|
|
46
|
+
* when the advisor must clear its own context before sending the current
|
|
47
|
+
* incremental update. The cursor stays at the current primary position: this
|
|
48
|
+
* recovery path must never replay the full primary transcript.
|
|
49
|
+
* Optional: hosts that omit it get no proactive maintenance.
|
|
50
|
+
*/
|
|
51
|
+
maintainContext?(incomingTokens: number, signal: AbortSignal): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Called immediately before each `agent.prompt(batch)` cycle. Lets the host
|
|
54
|
+
* clear per-update advisor state and apply the in-progress delivery policy.
|
|
55
|
+
* The host owns these gates because it routes `advise()` results back to the
|
|
56
|
+
* primary.
|
|
57
|
+
*/
|
|
58
|
+
beginAdvisorUpdate?(inProgress: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* Called with the error of every failed advisor turn, before the retry sleep
|
|
61
|
+
* or the dropped-after-3 path. Lets the host apply credential-level remedies
|
|
62
|
+
* and configured model fallback that the advisor loop cannot perform itself.
|
|
63
|
+
* Return `true` after switching models so the same clean batch is retried
|
|
64
|
+
* immediately with a fresh failure budget. `failedMessages` contains the
|
|
65
|
+
* failed prompt's appended turns before rollback. Errors thrown here are
|
|
66
|
+
* logged and swallowed.
|
|
67
|
+
*/
|
|
68
|
+
onTurnError?(
|
|
69
|
+
error: unknown,
|
|
70
|
+
failedMessages: readonly AgentMessage[],
|
|
71
|
+
signal: AbortSignal,
|
|
72
|
+
): Promise<boolean | undefined> | boolean | undefined;
|
|
73
|
+
/** Called after a successful advisor turn so the host can finish fallback lifecycle reporting. */
|
|
74
|
+
onTurnSuccess?(): Promise<void> | void;
|
|
75
|
+
/** Surface a non-recovering advisor failure to the host UI without adding model-visible context. */
|
|
76
|
+
notifyFailure?(error: unknown): void;
|
|
77
|
+
/** Signal that the advisor paused on a quota/rate-limit after host-level
|
|
78
|
+
* recovery (credential switch, fallback chain) declined. Cleared only by
|
|
79
|
+
* an explicit reset (`/new`, config rebuild, session restart). */
|
|
80
|
+
notifyQuotaExhausted?(): void;
|
|
81
|
+
/** Stable identity for the live advisor model. Used to restore full transcript rendering after a model switch. */
|
|
82
|
+
getModelIdentity?(): string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A request rejection that no amount of retrying can fix for this advisor
|
|
87
|
+
* configuration: the provider refuses the model/request shape outright (e.g.
|
|
88
|
+
* "The 'gpt-5.3-codex-spark' model is not supported when using Codex with a
|
|
89
|
+
* ChatGPT account", code=invalid_request_error). Distinct from quota errors,
|
|
90
|
+
* which pause via the dedicated quota path and auto-resume on reset.
|
|
91
|
+
*/
|
|
92
|
+
function isPermanentAdvisorError(error: unknown): boolean {
|
|
93
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
94
|
+
return /invalid_request_error|model[_ ]not[_ ]found|is not supported when|does not exist/i.test(message);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const ADVISOR_QUARANTINE_PREFIX = "Advisor response quarantined";
|
|
98
|
+
|
|
99
|
+
/** Signals that an advisor response was discarded before it could become model-visible context. */
|
|
100
|
+
export class AdvisorOutputQuarantinedError extends Error {
|
|
101
|
+
constructor(message: string) {
|
|
102
|
+
super(message);
|
|
103
|
+
this.name = "AdvisorOutputQuarantinedError";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
interface AdvisorOutputHazard {
|
|
108
|
+
label: string;
|
|
109
|
+
pattern: RegExp;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const ADVISOR_OUTPUT_ONLY_HAZARDS: readonly AdvisorOutputHazard[] = [
|
|
113
|
+
{ label: "account-deletion claim", pattern: /\buser\b.{0,80}\b(?:deleted|erased)\b.{0,80}\baccount\b/i },
|
|
114
|
+
{
|
|
115
|
+
label: "instruction override",
|
|
116
|
+
pattern: /\bignore\s+(?:all\s+)?(?:prior|previous|earlier)\s+(?:user\s+)?instructions\b/i,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
label: "destructive shell command",
|
|
120
|
+
pattern: /\brm\s+(?=(?:-[a-z]+\s*)*-[a-z]*r[a-z]*)(?=(?:-[a-z]+\s*)*-[a-z]*f[a-z]*)(?:-[a-z]+\s*)+/i,
|
|
121
|
+
},
|
|
122
|
+
{ label: "denial instruction", pattern: /\bdeny\s+(?:this|it|the\s+request)\s+if\s+(?:asked|questioned)\b/i },
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Replaces an advisor assistant turn that requested unavailable tools or generated
|
|
127
|
+
* output-only destructive directives with a sanitized error before dispatch.
|
|
128
|
+
*
|
|
129
|
+
* The agent loop records assistant turns before dispatching tools. Without this
|
|
130
|
+
* pre-dispatch rewrite, an advisor hallucination can leave unrelated text in the
|
|
131
|
+
* advisor transcript even though the action itself never executes.
|
|
132
|
+
*/
|
|
133
|
+
export function quarantineAdvisorUnsafeOutput(
|
|
134
|
+
message: AssistantMessage,
|
|
135
|
+
availableToolNames: ReadonlySet<string>,
|
|
136
|
+
sourceText = "",
|
|
137
|
+
): string | undefined {
|
|
138
|
+
const reasons: string[] = [];
|
|
139
|
+
const unavailableToolNames = new Set<string>();
|
|
140
|
+
const generatedParts: string[] = [];
|
|
141
|
+
for (const block of message.content) {
|
|
142
|
+
// Cursor exec-channel native blocks (bash/read/grep/...) are stamped
|
|
143
|
+
// kCursorExecResolved: they already ran server-side through the
|
|
144
|
+
// advisor-scoped CursorExecHandlers bridge, which rejects ungranted
|
|
145
|
+
// tools in-band ("Tool not available") and lets the model self-correct.
|
|
146
|
+
// Quarantining them would discard the legitimate advise emitted in the
|
|
147
|
+
// same turn (issue #5900). The scoped bridge is the grant gate here, not
|
|
148
|
+
// this pre-dispatch check.
|
|
149
|
+
if (
|
|
150
|
+
block.type === "toolCall" &&
|
|
151
|
+
!availableToolNames.has(block.name) &&
|
|
152
|
+
(block as CursorExecResolvedCarrier)[kCursorExecResolved] !== true
|
|
153
|
+
) {
|
|
154
|
+
unavailableToolNames.add(block.name);
|
|
155
|
+
}
|
|
156
|
+
if (block.type === "toolCall" && block.name === "advise" && typeof block.arguments.note === "string") {
|
|
157
|
+
generatedParts.push(block.arguments.note);
|
|
158
|
+
}
|
|
159
|
+
if (block.type === "text") generatedParts.push(block.text);
|
|
160
|
+
}
|
|
161
|
+
if (unavailableToolNames.size > 0) {
|
|
162
|
+
const names = [...unavailableToolNames].sort();
|
|
163
|
+
const toolLabel = names.length === 1 ? "tool" : "tools";
|
|
164
|
+
reasons.push(`requested unavailable ${toolLabel} ${names.join(", ")}`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const generatedText = generatedParts.join("\n");
|
|
168
|
+
if (generatedText) {
|
|
169
|
+
const labels: string[] = [];
|
|
170
|
+
const matchedLabels: string[] = [];
|
|
171
|
+
for (const hazard of ADVISOR_OUTPUT_ONLY_HAZARDS) {
|
|
172
|
+
if (!hazard.pattern.test(generatedText)) continue;
|
|
173
|
+
matchedLabels.push(hazard.label);
|
|
174
|
+
if (!hazard.pattern.test(sourceText)) labels.push(hazard.label);
|
|
175
|
+
}
|
|
176
|
+
// A transcript can quote a destructive command while the advisor turns it
|
|
177
|
+
// into a new instruction. The output-only override remains sufficient
|
|
178
|
+
// provenance to quarantine that combination.
|
|
179
|
+
if (
|
|
180
|
+
matchedLabels.includes("destructive shell command") &&
|
|
181
|
+
labels.includes("instruction override") &&
|
|
182
|
+
!labels.includes("destructive shell command")
|
|
183
|
+
) {
|
|
184
|
+
labels.push("destructive shell command");
|
|
185
|
+
}
|
|
186
|
+
if (labels.includes("destructive shell command") || labels.length >= 3) {
|
|
187
|
+
reasons.push(`generated output-only destructive directives: ${labels.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (reasons.length === 0) return undefined;
|
|
192
|
+
|
|
193
|
+
const messageText = `${ADVISOR_QUARANTINE_PREFIX}: ${reasons.join("; ")}`;
|
|
194
|
+
message.content = [{ type: "text", text: messageText }];
|
|
195
|
+
message.stopReason = "error";
|
|
196
|
+
message.stopDetails = undefined;
|
|
197
|
+
message.toolCallAbortMessages = undefined;
|
|
198
|
+
message.providerPayload = undefined;
|
|
199
|
+
message.errorMessage = messageText;
|
|
200
|
+
return messageText;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Builds the provenance text used to decide whether hazardous advisor output was
|
|
205
|
+
* generated by the advisor or came from model-visible primary/tool context.
|
|
206
|
+
*/
|
|
207
|
+
export function buildAdvisorQuarantineSourceText(currentInput: string, messages: readonly AgentMessage[]): string {
|
|
208
|
+
const parts: string[] = [];
|
|
209
|
+
if (currentInput) parts.push(currentInput);
|
|
210
|
+
for (const message of messages) {
|
|
211
|
+
if (message.role !== "toolResult") continue;
|
|
212
|
+
for (const block of message.content) {
|
|
213
|
+
if (block.type === "text") parts.push(block.text);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return parts.join("\n");
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Maximum number of late-arrival coalescing rounds in {@link AdvisorRuntime.#collectAndMaintainBatch}.
|
|
220
|
+
* After this many rounds any items still in `#pending` are left for the next drain iteration
|
|
221
|
+
* so a pathologically fast primary + slow `maintainContext` cannot stall dispatch indefinitely.
|
|
222
|
+
*/
|
|
223
|
+
const MAX_COALESCE_ROUNDS = 3;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Consecutive quarantined advisor turns tolerated before the failure is surfaced
|
|
227
|
+
* to the host UI. A quarantine discards the advisor's whole turn before dispatch,
|
|
228
|
+
* so its advice never reaches the primary; one silent re-prime is allowed to
|
|
229
|
+
* recover a one-off hallucination, but a persistent quarantine loop is a real
|
|
230
|
+
* supervision gap the user must see (issue #6661). Reset on any successful turn.
|
|
231
|
+
*/
|
|
232
|
+
const MAX_QUARANTINE_RETRIES = 2;
|
|
233
|
+
|
|
234
|
+
const ADVISOR_RENDER_OPTIONS = {
|
|
235
|
+
includeToolIntent: true,
|
|
236
|
+
watchedRoles: true,
|
|
237
|
+
expandPrimaryContext: true,
|
|
238
|
+
expandEditDiffs: true,
|
|
239
|
+
} as const;
|
|
240
|
+
|
|
241
|
+
interface PendingDelta {
|
|
242
|
+
text: string;
|
|
243
|
+
rawMessages: AgentMessage[];
|
|
244
|
+
renderRevision: number;
|
|
245
|
+
turns: number;
|
|
246
|
+
/** Whether the primary was mid-turn (willContinue:true) when this delta was rendered. */
|
|
247
|
+
wip: boolean;
|
|
248
|
+
overflowRecovery?: boolean;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
interface CatchupWaiter {
|
|
252
|
+
threshold: number;
|
|
253
|
+
finish: (caughtUp: boolean) => void;
|
|
254
|
+
timer?: NodeJS.Timeout;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
interface DeliveredMessage {
|
|
258
|
+
message: AgentMessage;
|
|
259
|
+
fingerprint: bigint | undefined;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function fingerprintMessage(message: AgentMessage): bigint | undefined {
|
|
263
|
+
try {
|
|
264
|
+
const serialized = JSON.stringify(message);
|
|
265
|
+
if (serialized === undefined) return undefined;
|
|
266
|
+
return Bun.hash.wyhash(serialized);
|
|
267
|
+
} catch {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export class AdvisorRuntime {
|
|
273
|
+
#lastCount = 0;
|
|
274
|
+
/**
|
|
275
|
+
* Delivered prefix identities. References make the normal append-only path
|
|
276
|
+
* allocation-free; fingerprints preserve identity across equivalent clones.
|
|
277
|
+
*/
|
|
278
|
+
#deliveredPrefix: DeliveredMessage[] = [];
|
|
279
|
+
/** Last-shown body, keyed by primary-context customType (plan/goal mode rules,
|
|
280
|
+
* approved plan). These prompts are re-injected verbatim every primary turn;
|
|
281
|
+
* this lets {@link #renderDelta} collapse an unchanged copy to a one-line
|
|
282
|
+
* marker so the advisor isn't re-fed the full ~1k-token rules each turn.
|
|
283
|
+
* Cleared on every re-prime/seed and when a failed batch is dropped. */
|
|
284
|
+
#seenContext = new Map<string, string>();
|
|
285
|
+
/** Incremented whenever the advisor loses context so queued raw deltas are re-rendered against fresh dedupe state. */
|
|
286
|
+
#renderRevision = 0;
|
|
287
|
+
/** Regex secret values observed in primary deltas and retained until advisor context resets. */
|
|
288
|
+
#advisorRegexSecretValues = new Set<string>();
|
|
289
|
+
#pending: PendingDelta[] = [];
|
|
290
|
+
#busy = false;
|
|
291
|
+
#sessionTransitionPaused = false;
|
|
292
|
+
#promptInFlight: Promise<void> | undefined;
|
|
293
|
+
#iterationAbort: AbortController | undefined;
|
|
294
|
+
#backlog = 0;
|
|
295
|
+
#consecutiveFailures = 0;
|
|
296
|
+
#failureNotified = false;
|
|
297
|
+
/** Consecutive quarantined turns since the last success/reset (issue #6661). */
|
|
298
|
+
#consecutiveQuarantines = 0;
|
|
299
|
+
/**
|
|
300
|
+
* Model identities this refusal cascade has already tried. The cascade walks
|
|
301
|
+
* the fallback chain to exhaustion — that is what the chain is for — but
|
|
302
|
+
* visits each model at most once, so a chain whose keys point back at each
|
|
303
|
+
* other (A→B, B→A) cannot ping-pong forever. Cleared when a successful or
|
|
304
|
+
* terminal turn ends the cascade, or on reset, so a later refusal starts fresh.
|
|
305
|
+
*/
|
|
306
|
+
readonly #refusalModelsTried = new Set<string>();
|
|
307
|
+
/** Whether primary reasoning is included in advisor deltas for the current model. */
|
|
308
|
+
#includeThinking = true;
|
|
309
|
+
#modelIdentity: string | undefined;
|
|
310
|
+
/** Completed 3-failure backlog-drop cycles since the last success/reset. */
|
|
311
|
+
#droppedBacklogs = 0;
|
|
312
|
+
/**
|
|
313
|
+
* Hard stop after repeated drop cycles or a permanent request rejection
|
|
314
|
+
* (e.g. "model not supported"): without it the advisor re-attempts on every
|
|
315
|
+
* new delta forever, and in a shared daemon that unbounded churn burns CPU
|
|
316
|
+
* and starves every hosted session's event loop. Cleared only by an
|
|
317
|
+
* explicit {@link reset} (config rebuild, /new, session restart).
|
|
318
|
+
*/
|
|
319
|
+
#halted = false;
|
|
320
|
+
/** True from the moment an advisor turn fails until one succeeds (or an
|
|
321
|
+
* explicit reset/seed). While set, {@link waitForCatchup} resolves
|
|
322
|
+
* immediately: the primary agent NEVER parks on a failing advisor. */
|
|
323
|
+
#failing = false;
|
|
324
|
+
#latestMessages?: AgentMessage[];
|
|
325
|
+
#waiters: CatchupWaiter[] = [];
|
|
326
|
+
/** Bumped by every external {@link reset}/{@link dispose}. A drain iteration
|
|
327
|
+
* captures it before its awaits; a mismatch on resume means a reset aborted
|
|
328
|
+
* the in-flight advisor prompt, so the stale batch is dropped instead of
|
|
329
|
+
* being retried/requeued into the post-reset conversation. */
|
|
330
|
+
#epoch = 0;
|
|
331
|
+
disposed = false;
|
|
332
|
+
/** Quota/rate-limit pause state. When `true`, the advisor stops processing
|
|
333
|
+
* turns and drops new deltas until an explicit {@link reset} clears it
|
|
334
|
+
* (triggered by `/new`, config rebuild, or session restart). There is no
|
|
335
|
+
* timer-based auto-resume: provider quota windows (5h/7d) are far longer
|
|
336
|
+
* than any reasonable timer, and premature retries waste calls and
|
|
337
|
+
* re-trigger the same error. */
|
|
338
|
+
#quotaExhausted = false;
|
|
339
|
+
|
|
340
|
+
constructor(
|
|
341
|
+
private readonly agent: AdvisorAgent,
|
|
342
|
+
private readonly host: AdvisorRuntimeHost,
|
|
343
|
+
private readonly retryDelayMs = 1000,
|
|
344
|
+
) {}
|
|
345
|
+
|
|
346
|
+
get backlog(): number {
|
|
347
|
+
return this.#backlog;
|
|
348
|
+
}
|
|
349
|
+
get quotaExhausted(): boolean {
|
|
350
|
+
return this.#quotaExhausted;
|
|
351
|
+
}
|
|
352
|
+
get failureNotified(): boolean {
|
|
353
|
+
return this.#failureNotified;
|
|
354
|
+
}
|
|
355
|
+
/** True after the runtime hard-stopped on repeated or permanent failures. */
|
|
356
|
+
get halted(): boolean {
|
|
357
|
+
return this.#halted;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Called after each primary turn ends. Renders the incremental delta and
|
|
362
|
+
* queues it for the advisor model.
|
|
363
|
+
*
|
|
364
|
+
* @param messages - Live primary transcript snapshot (defaults to `snapshotMessages()`).
|
|
365
|
+
* @param opts.willContinue - When `true` the primary is mid-turn (more tool-call
|
|
366
|
+
* steps will follow). The rendered heading is tagged `[in progress]` so the
|
|
367
|
+
* advisor knows to withhold critique on partial work. The flag is carried on
|
|
368
|
+
* the delta and forwarded to the reprime path so it is never silently dropped.
|
|
369
|
+
*/
|
|
370
|
+
onTurnEnd(messages?: AgentMessage[], opts?: { willContinue?: boolean }): void {
|
|
371
|
+
if (this.disposed || this.#quotaExhausted || this.#halted) return;
|
|
372
|
+
const all = messages ?? this.host.snapshotMessages();
|
|
373
|
+
this.#latestMessages = all;
|
|
374
|
+
const wip = opts?.willContinue ?? false;
|
|
375
|
+
let rendered: Omit<PendingDelta, "turns" | "overflowRecovery"> | null = null;
|
|
376
|
+
// #renderDelta advances the cursor/prefix/dedup state before formatting
|
|
377
|
+
// can throw; snapshot them so a formatter bug loses NOTHING — the next
|
|
378
|
+
// turn re-renders this delta (a prefix change mid-render self-heals via
|
|
379
|
+
// the fingerprint scan, at worst costing one full replay).
|
|
380
|
+
const cursorBefore = this.#lastCount;
|
|
381
|
+
const prefixBefore = this.#deliveredPrefix.slice();
|
|
382
|
+
const seenBefore = [...this.#seenContext];
|
|
383
|
+
try {
|
|
384
|
+
rendered = this.#renderDelta(all, wip);
|
|
385
|
+
} catch (err) {
|
|
386
|
+
// A render bug must never propagate into the primary agent's
|
|
387
|
+
// turn-end callback: the advisor skips this delta and stops gating
|
|
388
|
+
// the catch-up wait until a turn succeeds.
|
|
389
|
+
this.#lastCount = cursorBefore;
|
|
390
|
+
this.#deliveredPrefix = prefixBefore;
|
|
391
|
+
this.#seenContext.clear();
|
|
392
|
+
for (const [key, value] of seenBefore) this.#seenContext.set(key, value);
|
|
393
|
+
this.#failing = true;
|
|
394
|
+
this.#wakeAllWaiters();
|
|
395
|
+
logger.warn("advisor delta render failed", { err: String(err) });
|
|
396
|
+
}
|
|
397
|
+
if (rendered) {
|
|
398
|
+
this.#pending.push({ ...rendered, turns: 1 });
|
|
399
|
+
this.#backlog++;
|
|
400
|
+
this.#notifyWaiters();
|
|
401
|
+
void this.#drain();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Wait until the advisor backlog falls below `threshold`.
|
|
407
|
+
*
|
|
408
|
+
* Returns `false` when the deadline, abort signal, or a runtime failure releases
|
|
409
|
+
* the waiter before the requested backlog was drained.
|
|
410
|
+
*/
|
|
411
|
+
waitForCatchup(maxMs: number, threshold: number, signal?: AbortSignal): Promise<boolean> {
|
|
412
|
+
if (
|
|
413
|
+
this.disposed ||
|
|
414
|
+
signal?.aborted ||
|
|
415
|
+
this.#backlog < threshold ||
|
|
416
|
+
this.#quotaExhausted ||
|
|
417
|
+
this.#halted ||
|
|
418
|
+
// An advisor mid-failure/retry must NEVER gate the primary agent:
|
|
419
|
+
// its backlog cannot drain until the retry cycle resolves, and the
|
|
420
|
+
// primary would otherwise park for the full catch-up budget.
|
|
421
|
+
this.#failing
|
|
422
|
+
)
|
|
423
|
+
return Promise.resolve(this.#backlog < threshold);
|
|
424
|
+
const { promise, resolve } = Promise.withResolvers<boolean>();
|
|
425
|
+
let waiter!: CatchupWaiter;
|
|
426
|
+
const finish = (caughtUp: boolean): void => {
|
|
427
|
+
const idx = this.#waiters.indexOf(waiter);
|
|
428
|
+
if (idx >= 0) this.#waiters.splice(idx, 1);
|
|
429
|
+
clearTimeout(waiter.timer);
|
|
430
|
+
signal?.removeEventListener("abort", abort);
|
|
431
|
+
resolve(caughtUp);
|
|
432
|
+
};
|
|
433
|
+
const abort = (): void => finish(false);
|
|
434
|
+
waiter = {
|
|
435
|
+
threshold,
|
|
436
|
+
finish,
|
|
437
|
+
timer: setTimeout(abort, maxMs),
|
|
438
|
+
};
|
|
439
|
+
this.#waiters.push(waiter);
|
|
440
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
441
|
+
if (signal?.aborted) {
|
|
442
|
+
abort();
|
|
443
|
+
}
|
|
444
|
+
return promise;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
dispose(): void {
|
|
448
|
+
this.#iterationAbort?.abort("advisor disposed");
|
|
449
|
+
this.disposed = true;
|
|
450
|
+
this.#epoch++;
|
|
451
|
+
this.#pending = [];
|
|
452
|
+
this.#backlog = 0;
|
|
453
|
+
this.#consecutiveFailures = 0;
|
|
454
|
+
this.#failureNotified = false;
|
|
455
|
+
this.#advisorRegexSecretValues.clear();
|
|
456
|
+
this.#wakeAllWaiters();
|
|
457
|
+
try {
|
|
458
|
+
this.agent.abort("advisor disposed");
|
|
459
|
+
} catch {}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
#clearSeenContext(): void {
|
|
463
|
+
this.#seenContext.clear();
|
|
464
|
+
this.#advisorRegexSecretValues.clear();
|
|
465
|
+
this.#renderRevision++;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
#clearAdvisorContextAtCurrentCursor(): void {
|
|
469
|
+
this.#consecutiveFailures = 0;
|
|
470
|
+
this.#clearSeenContext();
|
|
471
|
+
try {
|
|
472
|
+
this.agent.reset();
|
|
473
|
+
} catch {}
|
|
474
|
+
try {
|
|
475
|
+
this.agent.abort("advisor reset");
|
|
476
|
+
} catch {}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
#resetAdvisorContext(clearBacklog: boolean, wakeWaiters: boolean): void {
|
|
480
|
+
this.#lastCount = 0;
|
|
481
|
+
this.#deliveredPrefix = [];
|
|
482
|
+
this.#pending = [];
|
|
483
|
+
this.#clearAdvisorContextAtCurrentCursor();
|
|
484
|
+
if (clearBacklog) {
|
|
485
|
+
this.#backlog = 0;
|
|
486
|
+
}
|
|
487
|
+
if (wakeWaiters) {
|
|
488
|
+
this.#wakeAllWaiters();
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Account one completed 3-failure backlog-drop cycle. Repeated cycles (or a
|
|
494
|
+
* single permanent request rejection, e.g. "model not supported") hard-stop
|
|
495
|
+
* the runtime: in a shared daemon, unbounded advisor churn re-builds heavy
|
|
496
|
+
* context on every new delta and starves every hosted session's event loop.
|
|
497
|
+
* Only an explicit {@link reset} (config rebuild, /new, restart) resumes.
|
|
498
|
+
*/
|
|
499
|
+
#noteDroppedBacklog(error: unknown): void {
|
|
500
|
+
this.#droppedBacklogs++;
|
|
501
|
+
if (this.#droppedBacklogs < 3 && !isPermanentAdvisorError(error)) return;
|
|
502
|
+
this.#halted = true;
|
|
503
|
+
this.#pending = [];
|
|
504
|
+
this.#wakeAllWaiters();
|
|
505
|
+
logger.warn("advisor halted after repeated failures; use /advisor or reload config to re-enable", {
|
|
506
|
+
droppedBacklogs: this.#droppedBacklogs,
|
|
507
|
+
err: String(error),
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/** Stop new advisor work and wait only for the active prompt's recorder-visible events. */
|
|
512
|
+
pauseForSessionTransition(): Promise<void> {
|
|
513
|
+
if (!this.#sessionTransitionPaused) {
|
|
514
|
+
this.#sessionTransitionPaused = true;
|
|
515
|
+
this.#wakeAllWaiters();
|
|
516
|
+
this.#iterationAbort?.abort("advisor session transition");
|
|
517
|
+
try {
|
|
518
|
+
this.agent.abort("advisor session transition");
|
|
519
|
+
} catch {}
|
|
520
|
+
}
|
|
521
|
+
return (
|
|
522
|
+
this.#promptInFlight?.then(
|
|
523
|
+
() => {},
|
|
524
|
+
() => {},
|
|
525
|
+
) ?? Promise.resolve()
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/** Continue queued work after a session transition rolls back or preserves the conversation. */
|
|
530
|
+
resumeAfterSessionTransition(): void {
|
|
531
|
+
if (!this.#sessionTransitionPaused) return;
|
|
532
|
+
this.#sessionTransitionPaused = false;
|
|
533
|
+
if (!this.#quotaExhausted && !this.#halted) void this.#drain();
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Re-prime the advisor after a history rewrite (compaction, session
|
|
538
|
+
* switch/resume, branch). Clears the advisor's own (non-persisted) context
|
|
539
|
+
* and rewinds the cursor to 0 so the NEXT turn replays the full current —
|
|
540
|
+
* post-compaction — transcript, giving the advisor fresh context instead of
|
|
541
|
+
* leaving it blind to everything before the rewrite.
|
|
542
|
+
*/
|
|
543
|
+
reset(): void {
|
|
544
|
+
this.#iterationAbort?.abort("advisor reset");
|
|
545
|
+
this.#epoch++;
|
|
546
|
+
this.#sessionTransitionPaused = false;
|
|
547
|
+
this.#quotaExhausted = false;
|
|
548
|
+
this.#halted = false;
|
|
549
|
+
this.#failing = false;
|
|
550
|
+
this.#droppedBacklogs = 0;
|
|
551
|
+
this.#consecutiveQuarantines = 0;
|
|
552
|
+
this.#refusalModelsTried.clear();
|
|
553
|
+
this.#failureNotified = false;
|
|
554
|
+
this.#resetAdvisorContext(true, true);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Seed the cursor to the current transcript length when the advisor is enabled
|
|
559
|
+
* mid-session. Prevents the next turn from replaying the entire history to the
|
|
560
|
+
* advisor (which would be expensive and likely stale).
|
|
561
|
+
*/
|
|
562
|
+
seedTo(count: number): void {
|
|
563
|
+
const messages = this.host.snapshotMessages().slice(0, count);
|
|
564
|
+
this.#lastCount = messages.length;
|
|
565
|
+
this.#deliveredPrefix = messages.map(message => ({
|
|
566
|
+
message,
|
|
567
|
+
fingerprint: fingerprintMessage(message),
|
|
568
|
+
}));
|
|
569
|
+
this.#pending = [];
|
|
570
|
+
this.#backlog = 0;
|
|
571
|
+
this.#consecutiveFailures = 0;
|
|
572
|
+
this.#failing = false;
|
|
573
|
+
this.#droppedBacklogs = 0;
|
|
574
|
+
this.#failureNotified = false;
|
|
575
|
+
this.#clearSeenContext();
|
|
576
|
+
this.#wakeAllWaiters();
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
#syncModelIdentity(): void {
|
|
580
|
+
const identity = this.host.getModelIdentity?.();
|
|
581
|
+
if (identity === undefined || identity === this.#modelIdentity) return;
|
|
582
|
+
this.#modelIdentity = identity;
|
|
583
|
+
this.#includeThinking = true;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
#formatRawDelta(rawMessages: AgentMessage[], wip = false): string | null {
|
|
587
|
+
const delta = rawMessages
|
|
588
|
+
.filter(message => !(message.role === "custom" && message.customType === "advisor"))
|
|
589
|
+
.map(message => this.#dedupContextMessage(message));
|
|
590
|
+
if (delta.length === 0) return null;
|
|
591
|
+
const obfuscator = this.host.obfuscator;
|
|
592
|
+
let md = formatSessionHistoryMarkdown(delta, {
|
|
593
|
+
...ADVISOR_RENDER_OPTIONS,
|
|
594
|
+
includeThinking: this.#includeThinking,
|
|
595
|
+
});
|
|
596
|
+
if (!md.trim()) return null;
|
|
597
|
+
if (obfuscator?.hasSecrets()) {
|
|
598
|
+
let discoveredNewRegexSecretValue = false;
|
|
599
|
+
const addRegexValues = (text: string): void => {
|
|
600
|
+
for (const secretValue of obfuscator.collectRegexSecretValuesForObfuscation(text)) {
|
|
601
|
+
if (this.#advisorRegexSecretValues.has(secretValue)) continue;
|
|
602
|
+
this.#advisorRegexSecretValues.add(secretValue);
|
|
603
|
+
discoveredNewRegexSecretValue = true;
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
for (const message of delta) {
|
|
607
|
+
if (
|
|
608
|
+
message.role === "custom" &&
|
|
609
|
+
PRIMARY_CONTEXT_CUSTOM_TYPES.has(message.customType) &&
|
|
610
|
+
typeof message.content === "string"
|
|
611
|
+
) {
|
|
612
|
+
addRegexValues(message.content);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
addRegexValues(md);
|
|
616
|
+
scrubAdvisorHistory(obfuscator, this.agent.state.messages, this.#advisorRegexSecretValues);
|
|
617
|
+
if (discoveredNewRegexSecretValue) {
|
|
618
|
+
this.#pending = this.#pending.map(delta => ({
|
|
619
|
+
...delta,
|
|
620
|
+
text: obfuscator.stripUnsafeFriendlyPlaceholderPrefixes(delta.text, this.#advisorRegexSecretValues),
|
|
621
|
+
}));
|
|
622
|
+
}
|
|
623
|
+
md = formatSessionHistoryMarkdown(
|
|
624
|
+
delta.map(message =>
|
|
625
|
+
message.role === "custom" && PRIMARY_CONTEXT_CUSTOM_TYPES.has(message.customType)
|
|
626
|
+
? obfuscateAdvisorMessage(obfuscator, message, this.#advisorRegexSecretValues)
|
|
627
|
+
: message,
|
|
628
|
+
),
|
|
629
|
+
{ ...ADVISOR_RENDER_OPTIONS, includeThinking: this.#includeThinking },
|
|
630
|
+
);
|
|
631
|
+
md = obfuscator.obfuscate(md, this.#advisorRegexSecretValues);
|
|
632
|
+
}
|
|
633
|
+
const heading = wip ? "### Session update [in progress — more steps follow]" : "### Session update";
|
|
634
|
+
return `${heading}\n\n${md}`;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
#renderDelta(messages?: AgentMessage[], wip = false): Omit<PendingDelta, "turns" | "overflowRecovery"> | null {
|
|
638
|
+
const all = messages ?? this.#latestMessages ?? this.host.snapshotMessages();
|
|
639
|
+
let prefixChanged = all.length < this.#lastCount;
|
|
640
|
+
for (let i = 0; !prefixChanged && i < this.#lastCount; i++) {
|
|
641
|
+
const delivered = this.#deliveredPrefix[i];
|
|
642
|
+
const current = all[i];
|
|
643
|
+
if (delivered === undefined || current === undefined) {
|
|
644
|
+
prefixChanged = true;
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
if (delivered.message === current) continue;
|
|
648
|
+
const fingerprint = fingerprintMessage(current);
|
|
649
|
+
if (
|
|
650
|
+
delivered.fingerprint === undefined ||
|
|
651
|
+
fingerprint === undefined ||
|
|
652
|
+
delivered.fingerprint !== fingerprint
|
|
653
|
+
) {
|
|
654
|
+
prefixChanged = true;
|
|
655
|
+
break;
|
|
656
|
+
}
|
|
657
|
+
delivered.message = current;
|
|
658
|
+
}
|
|
659
|
+
if (prefixChanged) {
|
|
660
|
+
this.#epoch++;
|
|
661
|
+
this.#resetAdvisorContext(true, true);
|
|
662
|
+
}
|
|
663
|
+
const rawMessages = all.slice(this.#lastCount);
|
|
664
|
+
for (let i = this.#lastCount; i < all.length; i++) {
|
|
665
|
+
const message = all[i];
|
|
666
|
+
if (message === undefined) continue;
|
|
667
|
+
this.#deliveredPrefix.push({ message, fingerprint: fingerprintMessage(message) });
|
|
668
|
+
}
|
|
669
|
+
this.#lastCount = all.length;
|
|
670
|
+
const text = this.#formatRawDelta(rawMessages, wip);
|
|
671
|
+
return text ? { text, rawMessages, renderRevision: this.#renderRevision, wip } : null;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Collapse a re-injected primary-context prompt (plan/goal mode rules, the
|
|
676
|
+
* approved plan) to a short marker when its body is byte-identical to the
|
|
677
|
+
* copy already shown to the advisor since the last re-prime. The primary
|
|
678
|
+
* re-injects these verbatim every turn; without this the advisor re-reads the
|
|
679
|
+
* full rules (~1k tokens) each turn. Returns a CLONE when collapsing — the
|
|
680
|
+
* input shares the live primary transcript and must never be mutated.
|
|
681
|
+
*/
|
|
682
|
+
#dedupContextMessage(msg: AgentMessage): AgentMessage {
|
|
683
|
+
if (msg.role !== "custom") return msg;
|
|
684
|
+
// Narrowed to CustomMessage: customType and content are properly typed.
|
|
685
|
+
if (!PRIMARY_CONTEXT_CUSTOM_TYPES.has(msg.customType)) return msg;
|
|
686
|
+
if (typeof msg.content !== "string") return msg;
|
|
687
|
+
if (this.#seenContext.get(msg.customType) === msg.content) {
|
|
688
|
+
return { ...msg, content: "(unchanged — still in effect)" };
|
|
689
|
+
}
|
|
690
|
+
this.#seenContext.set(msg.customType, msg.content);
|
|
691
|
+
return msg;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
#notifyWaiters(): void {
|
|
695
|
+
for (let i = this.#waiters.length - 1; i >= 0; i--) {
|
|
696
|
+
const w = this.#waiters[i];
|
|
697
|
+
if (this.#backlog < w.threshold) {
|
|
698
|
+
w.finish(true);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
#wakeAllWaiters(): void {
|
|
704
|
+
for (const w of [...this.#waiters]) {
|
|
705
|
+
w.finish(false);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* Drop the user batch + synthetic assistant-error turn `Agent.#runLoop`
|
|
711
|
+
* appended for a failed prompt so a retry replays a clean baseline and the
|
|
712
|
+
* dropped-after-3 path never leaks orphan failures into the next successful
|
|
713
|
+
* run. Prefers the agent's own `rollbackTo` (which also re-syncs its
|
|
714
|
+
* append-only context); falls back to truncating `state.messages` for tests
|
|
715
|
+
* that hand-roll a minimal facade.
|
|
716
|
+
*/
|
|
717
|
+
#rollbackFailedTurn(snapshot: number): void {
|
|
718
|
+
const messages = this.agent.state.messages;
|
|
719
|
+
if (messages.length <= snapshot) return;
|
|
720
|
+
try {
|
|
721
|
+
if (this.agent.rollbackTo) {
|
|
722
|
+
this.agent.rollbackTo(snapshot);
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
messages.length = snapshot;
|
|
726
|
+
} catch (err) {
|
|
727
|
+
logger.debug("advisor rollback failed", { err: String(err) });
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Collect the popped deltas into one batch, running `maintainContext` for
|
|
733
|
+
* correct token budgeting. Loops until the pending queue is stable (no new
|
|
734
|
+
* deltas arrived during a maintenance check) or the round cap is reached.
|
|
735
|
+
* Every `await` inside the loop has an epoch guard so a reset/dispose
|
|
736
|
+
* mid-await cannot leak a stale batch into the post-reset conversation.
|
|
737
|
+
*
|
|
738
|
+
* When maintenance requests recovery, only the advisor Agent/log is reset
|
|
739
|
+
* (at the current primary cursor) and the already-collected raw batch is
|
|
740
|
+
* re-rendered — older, already-delivered primary transcript is never
|
|
741
|
+
* replayed.
|
|
742
|
+
*
|
|
743
|
+
* The coalescing loop is capped at {@link MAX_COALESCE_ROUNDS} iterations so
|
|
744
|
+
* a pathologically fast primary combined with a slow `maintainContext` cannot
|
|
745
|
+
* stall dispatch indefinitely — any items still in `#pending` after the cap
|
|
746
|
+
* are left for the next drain iteration. Overflow-recovery batches skip
|
|
747
|
+
* coalescing entirely: they retry exactly the bounded batch that overflowed.
|
|
748
|
+
*
|
|
749
|
+
* Returns `null` when the epoch was invalidated — caller should `continue`.
|
|
750
|
+
*/
|
|
751
|
+
async #collectAndMaintainBatch(
|
|
752
|
+
epoch: number,
|
|
753
|
+
initial: PendingDelta[],
|
|
754
|
+
recoveringOverflow: boolean,
|
|
755
|
+
signal: AbortSignal,
|
|
756
|
+
): Promise<{
|
|
757
|
+
batch: string | null;
|
|
758
|
+
rawMessages: AgentMessage[];
|
|
759
|
+
finalTurns: number;
|
|
760
|
+
wip: boolean;
|
|
761
|
+
resetContext: boolean;
|
|
762
|
+
} | null> {
|
|
763
|
+
let batchText = initial.map(b => b.text).join("\n\n");
|
|
764
|
+
let rawMessages = initial.flatMap(b => b.rawMessages);
|
|
765
|
+
let turns = initial.reduce((sum, b) => sum + b.turns, 0);
|
|
766
|
+
// Track WIP state of the most recent delta — forwarded to the re-render
|
|
767
|
+
// so a willContinue:true turn keeps its [in progress] heading. Also
|
|
768
|
+
// returned to #drain so the retry-requeue path preserves it on failed turns.
|
|
769
|
+
let wip = initial.at(-1)?.wip ?? false;
|
|
770
|
+
|
|
771
|
+
for (let round = 0; round < MAX_COALESCE_ROUNDS; round++) {
|
|
772
|
+
if (this.#sessionTransitionPaused) break;
|
|
773
|
+
if (this.host.maintainContext) {
|
|
774
|
+
const incomingTokens = estimateTokens({ role: "user", content: batchText, timestamp: Date.now() });
|
|
775
|
+
let shouldResetContext = false;
|
|
776
|
+
try {
|
|
777
|
+
shouldResetContext = await this.host.maintainContext(incomingTokens, signal);
|
|
778
|
+
} catch (err) {
|
|
779
|
+
logger.debug("advisor context maintenance failed", { err: String(err) });
|
|
780
|
+
}
|
|
781
|
+
// Epoch guard — a reset/dispose during the maintainContext await
|
|
782
|
+
// invalidates this batch.
|
|
783
|
+
if (this.#epoch !== epoch) return null;
|
|
784
|
+
|
|
785
|
+
if (shouldResetContext) {
|
|
786
|
+
// Once coalescing has begun (round > 0), deltas that arrived during
|
|
787
|
+
// this await are part of the coalescing window: tally them so
|
|
788
|
+
// finalTurns stays accurate for backlog accounting and their raw
|
|
789
|
+
// messages join the bounded re-render. On the initial round the
|
|
790
|
+
// popped batch stays bounded exactly as dispatched — later arrivals
|
|
791
|
+
// remain queued and ship as their own subsequent batch.
|
|
792
|
+
if (round > 0) {
|
|
793
|
+
const lateItems = this.#pending.splice(0);
|
|
794
|
+
initial.push(...lateItems);
|
|
795
|
+
turns += lateItems.reduce((sum, b) => sum + b.turns, 0);
|
|
796
|
+
if (lateItems.length > 0) {
|
|
797
|
+
wip = lateItems.at(-1)!.wip;
|
|
798
|
+
rawMessages = rawMessages.concat(lateItems.flatMap(b => b.rawMessages));
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
// Reset only the advisor Agent/log. The primary cursor, backlog,
|
|
802
|
+
// waiters, latest snapshot, and epoch stay untouched. Re-render only
|
|
803
|
+
// this already-popped raw batch so active plan/reference bodies are
|
|
804
|
+
// restored without replaying any older primary transcript.
|
|
805
|
+
this.#clearAdvisorContextAtCurrentCursor();
|
|
806
|
+
const rerendered = this.#formatRawDelta(rawMessages, wip);
|
|
807
|
+
return {
|
|
808
|
+
batch: rerendered ?? (batchText || null),
|
|
809
|
+
rawMessages,
|
|
810
|
+
finalTurns: turns,
|
|
811
|
+
wip,
|
|
812
|
+
resetContext: true,
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// Overflow-recovery batches retry exactly the bounded batch that
|
|
818
|
+
// overflowed; pending updates stay queued behind them.
|
|
819
|
+
if (recoveringOverflow) break;
|
|
820
|
+
|
|
821
|
+
// On the final round stop here — any late arrivals would ship without
|
|
822
|
+
// a subsequent maintainContext budget check. Leave them in #pending for
|
|
823
|
+
// the next drain iteration where they will be properly budgeted.
|
|
824
|
+
if (round === MAX_COALESCE_ROUNDS - 1) break;
|
|
825
|
+
|
|
826
|
+
// Coalesce any deltas that arrived while we were awaiting maintenance.
|
|
827
|
+
// If none arrived the batch is stable and we're done; otherwise merge,
|
|
828
|
+
// update WIP state, and re-check the maintenance budget.
|
|
829
|
+
const late = this.#pending.splice(0);
|
|
830
|
+
if (late.length === 0) break;
|
|
831
|
+
initial.push(...late);
|
|
832
|
+
batchText = [batchText, ...late.map(b => b.text)].join("\n\n");
|
|
833
|
+
rawMessages = rawMessages.concat(late.flatMap(b => b.rawMessages));
|
|
834
|
+
turns += late.reduce((sum, b) => sum + b.turns, 0);
|
|
835
|
+
wip = late.at(-1)!.wip;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
const batchObfuscator = this.host.obfuscator;
|
|
839
|
+
if (batchObfuscator?.hasSecrets()) {
|
|
840
|
+
batchText = batchObfuscator.stripUnsafeFriendlyPlaceholderPrefixes(batchText, this.#advisorRegexSecretValues);
|
|
841
|
+
}
|
|
842
|
+
return { batch: batchText || null, rawMessages, finalTurns: turns, wip, resetContext: false };
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
#terminalAssistantFailure(snapshot: number): AssistantMessage | undefined {
|
|
846
|
+
const messages = this.agent.state.messages;
|
|
847
|
+
for (let i = messages.length - 1; i >= snapshot; i--) {
|
|
848
|
+
const message = messages[i];
|
|
849
|
+
if (message.role === "assistant" && message.stopReason === "error") return message;
|
|
850
|
+
}
|
|
851
|
+
return undefined;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
#notifyFailureOnce(error: unknown): void {
|
|
855
|
+
if (this.#failureNotified) return;
|
|
856
|
+
this.#failureNotified = true;
|
|
857
|
+
try {
|
|
858
|
+
this.host.notifyFailure?.(error);
|
|
859
|
+
} catch (notifyErr) {
|
|
860
|
+
logger.warn("advisor failure notification failed", { err: String(notifyErr) });
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
async #drain(): Promise<void> {
|
|
865
|
+
if (this.#busy || this.#sessionTransitionPaused) return;
|
|
866
|
+
this.#busy = true;
|
|
867
|
+
try {
|
|
868
|
+
this.#syncModelIdentity();
|
|
869
|
+
while (!this.disposed && !this.#sessionTransitionPaused && this.#pending.length) {
|
|
870
|
+
this.#syncModelIdentity();
|
|
871
|
+
let popped: PendingDelta[];
|
|
872
|
+
if (this.#pending[0]?.overflowRecovery) {
|
|
873
|
+
const recovery = this.#pending.shift();
|
|
874
|
+
if (!recovery) continue;
|
|
875
|
+
popped = [recovery];
|
|
876
|
+
} else {
|
|
877
|
+
popped = this.#pending.splice(0);
|
|
878
|
+
}
|
|
879
|
+
const iterationAbort = new AbortController();
|
|
880
|
+
this.#iterationAbort = iterationAbort;
|
|
881
|
+
const epoch = this.#epoch;
|
|
882
|
+
for (const delta of popped) {
|
|
883
|
+
if (delta.renderRevision === this.#renderRevision) continue;
|
|
884
|
+
const refreshed = this.#formatRawDelta(delta.rawMessages, delta.wip);
|
|
885
|
+
if (refreshed) delta.text = refreshed;
|
|
886
|
+
delta.renderRevision = this.#renderRevision;
|
|
887
|
+
}
|
|
888
|
+
const recoveringOverflow = popped.some(delta => delta.overflowRecovery === true);
|
|
889
|
+
const result = await this.#collectAndMaintainBatch(
|
|
890
|
+
epoch,
|
|
891
|
+
popped,
|
|
892
|
+
recoveringOverflow,
|
|
893
|
+
iterationAbort.signal,
|
|
894
|
+
);
|
|
895
|
+
|
|
896
|
+
// Epoch was invalidated during batch collection; restart the loop.
|
|
897
|
+
if (result === null) continue;
|
|
898
|
+
if (this.#sessionTransitionPaused) {
|
|
899
|
+
this.#pending.unshift(...popped);
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
const { batch, rawMessages, finalTurns, wip, resetContext } = result;
|
|
904
|
+
|
|
905
|
+
if (this.disposed || batch === null) {
|
|
906
|
+
this.#backlog = Math.max(0, this.#backlog - finalTurns);
|
|
907
|
+
this.#notifyWaiters();
|
|
908
|
+
continue;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
let success = false;
|
|
912
|
+
// Capture the advisor's message count BEFORE the prompt so a failure can
|
|
913
|
+
// roll back the user batch + synthetic assistant-error turn Agent.#runLoop
|
|
914
|
+
// appends to internal state. Without this, a retry would replay the failed
|
|
915
|
+
// batch on top of stale turns and the dropped-after-3 path would leak
|
|
916
|
+
// orphan failures into the next successful run's context.
|
|
917
|
+
const messageSnapshot = this.agent.state.messages.length;
|
|
918
|
+
const contextWasFresh = resetContext || recoveringOverflow || messageSnapshot === 0;
|
|
919
|
+
try {
|
|
920
|
+
// Reset the host's per-update advisor state (one-advise-per-update
|
|
921
|
+
// gate) and pass through whether this batch reviews partial work.
|
|
922
|
+
this.host.beginAdvisorUpdate?.(wip);
|
|
923
|
+
const prompt = this.agent.prompt(batch);
|
|
924
|
+
this.#promptInFlight = prompt;
|
|
925
|
+
try {
|
|
926
|
+
await prompt;
|
|
927
|
+
} finally {
|
|
928
|
+
if (this.#promptInFlight === prompt) this.#promptInFlight = undefined;
|
|
929
|
+
}
|
|
930
|
+
// Agent.#runLoop catches provider/stream failures internally and
|
|
931
|
+
// resolves prompt() cleanly with stopReason: "error". Treat that
|
|
932
|
+
// as a failed turn so endpoint rejections trip the retry path.
|
|
933
|
+
const promptError = this.agent.state.error;
|
|
934
|
+
if (promptError) throw new Error(promptError);
|
|
935
|
+
// A content-less stop is a deliberate silent review — the documented
|
|
936
|
+
// verifier behavior ("prefer silence when the agent is on track") — and
|
|
937
|
+
// completes the turn. Sessions can legitimately have nothing to advise
|
|
938
|
+
// on for any number of consecutive turns, so silence is never warned
|
|
939
|
+
// about (#5216 did, spamming "Advisor unavailable" at quiet models).
|
|
940
|
+
const turnError = getAdvisorTurnError(this.agent.state.messages.slice(messageSnapshot));
|
|
941
|
+
if (turnError) throw turnError;
|
|
942
|
+
success = true;
|
|
943
|
+
this.#failing = false;
|
|
944
|
+
this.#consecutiveFailures = 0;
|
|
945
|
+
this.#failureNotified = false;
|
|
946
|
+
this.#droppedBacklogs = 0;
|
|
947
|
+
this.#consecutiveQuarantines = 0;
|
|
948
|
+
this.#refusalModelsTried.clear();
|
|
949
|
+
if (this.host.onTurnSuccess) {
|
|
950
|
+
try {
|
|
951
|
+
await raceWithSignal(Promise.resolve(this.host.onTurnSuccess()), iterationAbort.signal);
|
|
952
|
+
} catch (hookErr) {
|
|
953
|
+
logger.debug("advisor onTurnSuccess hook failed", { err: String(hookErr) });
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
} catch (err) {
|
|
957
|
+
if (this.#sessionTransitionPaused) {
|
|
958
|
+
this.#rollbackFailedTurn(messageSnapshot);
|
|
959
|
+
this.#pending.unshift(...popped);
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
// reset()/dispose() aborts the in-flight prompt; treat it as a
|
|
963
|
+
// reset, not a transient failure — drop the stale batch.
|
|
964
|
+
if (this.#epoch !== epoch) continue;
|
|
965
|
+
// Release any parked primary-agent waiters IMMEDIATELY — before
|
|
966
|
+
// the async onTurnError hook or any retry sleep — and refuse new
|
|
967
|
+
// parks until a turn succeeds. A failing advisor must never hold
|
|
968
|
+
// the primary on the catch-up gate.
|
|
969
|
+
this.#failing = true;
|
|
970
|
+
this.#wakeAllWaiters();
|
|
971
|
+
const failedMessages = this.agent.state.messages.slice(messageSnapshot);
|
|
972
|
+
const terminalFailure = this.#terminalAssistantFailure(messageSnapshot);
|
|
973
|
+
const classifierRefusal =
|
|
974
|
+
(terminalFailure !== undefined && isClassifierRefusal(terminalFailure)) ||
|
|
975
|
+
AIError.is(AIError.classify(err), AIError.Flag.ContentBlocked);
|
|
976
|
+
const terminalFailureId =
|
|
977
|
+
terminalFailure === undefined ? undefined : AIError.classifyMessage(terminalFailure);
|
|
978
|
+
const contextOverflow =
|
|
979
|
+
(terminalFailureId !== undefined && AIError.is(terminalFailureId, AIError.Flag.ContextOverflow)) ||
|
|
980
|
+
AIError.is(AIError.classify(err), AIError.Flag.ContextOverflow);
|
|
981
|
+
// A terminal provider failure that is neither retriable nor an
|
|
982
|
+
// overflow (e.g. a blocked prompt) will fail identically on every
|
|
983
|
+
// retry — classify it before rollback so the batch is dropped after
|
|
984
|
+
// one attempt instead of burning the 3-attempt budget (#5468).
|
|
985
|
+
const terminalFailureRetriable =
|
|
986
|
+
terminalFailureId === undefined ||
|
|
987
|
+
AIError.retriable(terminalFailureId) ||
|
|
988
|
+
AIError.is(terminalFailureId, AIError.Flag.ContextOverflow);
|
|
989
|
+
this.#rollbackFailedTurn(messageSnapshot);
|
|
990
|
+
logger.debug("advisor turn failed", { err: String(err) });
|
|
991
|
+
if (classifierRefusal) {
|
|
992
|
+
if (this.#includeThinking) {
|
|
993
|
+
this.#includeThinking = false;
|
|
994
|
+
const strippedBatch = this.#formatRawDelta(rawMessages, wip);
|
|
995
|
+
if (strippedBatch) {
|
|
996
|
+
this.#pending.unshift({
|
|
997
|
+
text: strippedBatch,
|
|
998
|
+
rawMessages,
|
|
999
|
+
renderRevision: this.#renderRevision,
|
|
1000
|
+
turns: finalTurns,
|
|
1001
|
+
wip,
|
|
1002
|
+
overflowRecovery: recoveringOverflow || undefined,
|
|
1003
|
+
});
|
|
1004
|
+
logger.debug("advisor refusal recovered by stripping primary reasoning");
|
|
1005
|
+
continue;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
// A refusal that outlives the strip is this model's policy call, not
|
|
1009
|
+
// a malformed request, so hand it to the host's model fallback before
|
|
1010
|
+
// declaring the advisor dead. The cascade walks the chain to
|
|
1011
|
+
// exhaustion (the host returns false once candidates run out); the
|
|
1012
|
+
// tried-set only stops a cyclic chain from revisiting a model. The
|
|
1013
|
+
// primary turn-recovery path already allows fallback on refusals.
|
|
1014
|
+
const refusalModel = this.host.getModelIdentity?.() ?? this.#modelIdentity ?? "";
|
|
1015
|
+
let refusalRecovered = false;
|
|
1016
|
+
try {
|
|
1017
|
+
if (!this.#refusalModelsTried.has(refusalModel)) {
|
|
1018
|
+
this.#refusalModelsTried.add(refusalModel);
|
|
1019
|
+
refusalRecovered =
|
|
1020
|
+
(await raceWithSignal(
|
|
1021
|
+
Promise.resolve(this.host.onTurnError?.(err, failedMessages, iterationAbort.signal)),
|
|
1022
|
+
iterationAbort.signal,
|
|
1023
|
+
)) === true;
|
|
1024
|
+
} else {
|
|
1025
|
+
logger.debug("advisor refusal chain exhausted", { model: refusalModel });
|
|
1026
|
+
}
|
|
1027
|
+
} catch (hookErr) {
|
|
1028
|
+
logger.debug("advisor onTurnError hook failed after refusal", { err: String(hookErr) });
|
|
1029
|
+
}
|
|
1030
|
+
if (this.#epoch !== epoch) continue;
|
|
1031
|
+
if (this.#sessionTransitionPaused) {
|
|
1032
|
+
this.#pending.unshift(...popped);
|
|
1033
|
+
continue;
|
|
1034
|
+
}
|
|
1035
|
+
if (refusalRecovered) {
|
|
1036
|
+
this.#consecutiveFailures = 0;
|
|
1037
|
+
this.#failureNotified = false;
|
|
1038
|
+
this.#pending.unshift({
|
|
1039
|
+
text: batch,
|
|
1040
|
+
rawMessages,
|
|
1041
|
+
renderRevision: this.#renderRevision,
|
|
1042
|
+
turns: finalTurns,
|
|
1043
|
+
wip,
|
|
1044
|
+
overflowRecovery: recoveringOverflow || undefined,
|
|
1045
|
+
});
|
|
1046
|
+
logger.debug("advisor refusal recovered by model fallback");
|
|
1047
|
+
continue;
|
|
1048
|
+
}
|
|
1049
|
+
// The batch is terminal, so the next primary update is a new
|
|
1050
|
+
// refusal cascade and must be allowed to try the chain again.
|
|
1051
|
+
this.#refusalModelsTried.clear();
|
|
1052
|
+
this.#notifyFailureOnce(err);
|
|
1053
|
+
this.#clearSeenContext();
|
|
1054
|
+
this.#backlog = Math.max(0, this.#backlog - finalTurns);
|
|
1055
|
+
this.#notifyWaiters();
|
|
1056
|
+
continue;
|
|
1057
|
+
}
|
|
1058
|
+
let recovered = false;
|
|
1059
|
+
try {
|
|
1060
|
+
recovered =
|
|
1061
|
+
(await raceWithSignal(
|
|
1062
|
+
Promise.resolve(this.host.onTurnError?.(err, failedMessages, iterationAbort.signal)),
|
|
1063
|
+
iterationAbort.signal,
|
|
1064
|
+
)) === true;
|
|
1065
|
+
} catch (hookErr) {
|
|
1066
|
+
logger.debug("advisor onTurnError hook failed", { err: String(hookErr) });
|
|
1067
|
+
}
|
|
1068
|
+
if (this.#sessionTransitionPaused) {
|
|
1069
|
+
this.#pending.unshift(...popped);
|
|
1070
|
+
continue;
|
|
1071
|
+
}
|
|
1072
|
+
if (err instanceof AdvisorOutputQuarantinedError) {
|
|
1073
|
+
// A quarantine discards the advisor's whole turn before dispatch, so
|
|
1074
|
+
// its advice never reaches the primary. One re-prime is allowed to
|
|
1075
|
+
// recover a one-off hallucination silently; a persistent quarantine
|
|
1076
|
+
// loop is a supervision gap the user must see in the main UI — not an
|
|
1077
|
+
// unbounded silent retry. Surface it (deduped by #notifyFailureOnce)
|
|
1078
|
+
// and drop the batch to break the loop (issue #6661).
|
|
1079
|
+
this.#consecutiveQuarantines++;
|
|
1080
|
+
if (this.#consecutiveQuarantines >= MAX_QUARANTINE_RETRIES) {
|
|
1081
|
+
this.#notifyFailureOnce(err);
|
|
1082
|
+
this.#consecutiveQuarantines = 0;
|
|
1083
|
+
this.#resetAdvisorContext(true, true);
|
|
1084
|
+
continue;
|
|
1085
|
+
}
|
|
1086
|
+
const rePrime = this.#pending.length > 0 ? this.#latestMessages : undefined;
|
|
1087
|
+
// Wake catchup waiters only when nothing is re-primed; otherwise the
|
|
1088
|
+
// re-primed turn restores the backlog and waiters resolve on its completion.
|
|
1089
|
+
this.#resetAdvisorContext(true, !rePrime);
|
|
1090
|
+
if (rePrime) this.onTurnEnd(rePrime);
|
|
1091
|
+
continue;
|
|
1092
|
+
}
|
|
1093
|
+
// Epoch guard after the async error hook.
|
|
1094
|
+
if (this.#epoch !== epoch) continue;
|
|
1095
|
+
if (recovered) {
|
|
1096
|
+
this.#consecutiveFailures = 0;
|
|
1097
|
+
this.#failureNotified = false;
|
|
1098
|
+
this.#pending.unshift({
|
|
1099
|
+
text: batch,
|
|
1100
|
+
rawMessages,
|
|
1101
|
+
renderRevision: this.#renderRevision,
|
|
1102
|
+
turns: finalTurns,
|
|
1103
|
+
wip,
|
|
1104
|
+
overflowRecovery: recoveringOverflow || undefined,
|
|
1105
|
+
});
|
|
1106
|
+
continue;
|
|
1107
|
+
}
|
|
1108
|
+
if (AIError.isUsageLimit(err)) {
|
|
1109
|
+
// Host recovery (credential switch / fallback chain) declined:
|
|
1110
|
+
// pause on the quota latch instead of burning retries — provider
|
|
1111
|
+
// quota windows (5h/7d) outlast any retry budget. The batch is
|
|
1112
|
+
// requeued and the backlog stays visible so reset() replays it.
|
|
1113
|
+
logger.warn("advisor quota exhausted", { err: String(err) });
|
|
1114
|
+
this.#quotaExhausted = true;
|
|
1115
|
+
this.#consecutiveFailures = 0;
|
|
1116
|
+
this.#failureNotified = false;
|
|
1117
|
+
this.#clearSeenContext();
|
|
1118
|
+
this.#pending.unshift({
|
|
1119
|
+
text: batch,
|
|
1120
|
+
rawMessages,
|
|
1121
|
+
renderRevision: this.#renderRevision,
|
|
1122
|
+
turns: finalTurns,
|
|
1123
|
+
wip,
|
|
1124
|
+
overflowRecovery: recoveringOverflow || undefined,
|
|
1125
|
+
});
|
|
1126
|
+
this.#wakeAllWaiters();
|
|
1127
|
+
try {
|
|
1128
|
+
this.host.notifyQuotaExhausted?.();
|
|
1129
|
+
} catch (notifyErr) {
|
|
1130
|
+
logger.warn("advisor quota notification failed", { err: String(notifyErr) });
|
|
1131
|
+
}
|
|
1132
|
+
break;
|
|
1133
|
+
}
|
|
1134
|
+
if (!terminalFailureRetriable) {
|
|
1135
|
+
logger.warn("advisor terminal failure is non-retriable; dropping bounded batch");
|
|
1136
|
+
this.#notifyFailureOnce(err);
|
|
1137
|
+
this.#consecutiveFailures = 0;
|
|
1138
|
+
// The dropped batch may carry primary-context we never delivered; drop
|
|
1139
|
+
// the seen-state too so queued raw deltas re-expand before delivery.
|
|
1140
|
+
this.#clearSeenContext();
|
|
1141
|
+
this.#noteDroppedBacklog(err);
|
|
1142
|
+
success = true;
|
|
1143
|
+
} else if (contextOverflow) {
|
|
1144
|
+
this.#clearAdvisorContextAtCurrentCursor();
|
|
1145
|
+
if (contextWasFresh) {
|
|
1146
|
+
// The bounded update cannot fit even with no advisor history. Drop
|
|
1147
|
+
// only this batch after its one fresh-context retry; pending and later
|
|
1148
|
+
// deltas remain eligible so one oversized update cannot disable the advisor.
|
|
1149
|
+
logger.warn("advisor update overflowed a fresh context; dropping bounded batch");
|
|
1150
|
+
this.#notifyFailureOnce(err);
|
|
1151
|
+
success = true;
|
|
1152
|
+
} else {
|
|
1153
|
+
// Retry once against the fresh advisor context, using only the same
|
|
1154
|
+
// bounded raw batch. Pending updates remain queued behind it.
|
|
1155
|
+
const recoveryBatch = this.#formatRawDelta(rawMessages, wip) ?? batch;
|
|
1156
|
+
this.#pending.unshift({
|
|
1157
|
+
text: recoveryBatch,
|
|
1158
|
+
rawMessages,
|
|
1159
|
+
renderRevision: this.#renderRevision,
|
|
1160
|
+
turns: finalTurns,
|
|
1161
|
+
wip,
|
|
1162
|
+
overflowRecovery: true,
|
|
1163
|
+
});
|
|
1164
|
+
logger.debug("advisor context overflow recovered at current primary cursor");
|
|
1165
|
+
}
|
|
1166
|
+
} else {
|
|
1167
|
+
this.#consecutiveFailures++;
|
|
1168
|
+
if (this.#consecutiveFailures >= 3) {
|
|
1169
|
+
logger.warn("advisor failed consecutively 3 times; dropping backlog to prevent stall");
|
|
1170
|
+
this.#notifyFailureOnce(err);
|
|
1171
|
+
this.#consecutiveFailures = 0;
|
|
1172
|
+
// The dropped batch may carry primary-context we never delivered; drop
|
|
1173
|
+
// the seen-state too so queued raw deltas re-expand before delivery.
|
|
1174
|
+
this.#clearSeenContext();
|
|
1175
|
+
this.#noteDroppedBacklog(err);
|
|
1176
|
+
success = true;
|
|
1177
|
+
} else {
|
|
1178
|
+
this.#pending.unshift({
|
|
1179
|
+
text: batch,
|
|
1180
|
+
rawMessages,
|
|
1181
|
+
renderRevision: this.#renderRevision,
|
|
1182
|
+
turns: finalTurns,
|
|
1183
|
+
wip,
|
|
1184
|
+
overflowRecovery: recoveringOverflow || undefined,
|
|
1185
|
+
});
|
|
1186
|
+
if (this.retryDelayMs <= 0) {
|
|
1187
|
+
await Bun.sleep(0);
|
|
1188
|
+
} else {
|
|
1189
|
+
try {
|
|
1190
|
+
await raceWithSignal(Bun.sleep(this.retryDelayMs), iterationAbort.signal);
|
|
1191
|
+
} catch (sleepError) {
|
|
1192
|
+
if (!iterationAbort.signal.aborted) throw sleepError;
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
if (success && this.#epoch === epoch) {
|
|
1200
|
+
this.#backlog = Math.max(0, this.#backlog - finalTurns);
|
|
1201
|
+
this.#notifyWaiters();
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
} finally {
|
|
1205
|
+
this.#iterationAbort = undefined;
|
|
1206
|
+
this.#busy = false;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
/** Mirrors turn recovery's refusal classification and retains AIError's provider-neutral content-block fallback. */
|
|
1212
|
+
function isClassifierRefusal(message: AssistantMessage): boolean {
|
|
1213
|
+
if (message.stopReason !== "error") return false;
|
|
1214
|
+
const stopType = message.stopDetails?.type;
|
|
1215
|
+
if (stopType === "refusal" || stopType === "sensitive") return true;
|
|
1216
|
+
return AIError.is(AIError.classifyMessage(message), AIError.Flag.ContentBlocked);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/**
|
|
1220
|
+
* The only malformed advisor turn shape: the prompt resolved but produced no
|
|
1221
|
+
* assistant response at all. Everything an assistant message carries — advice,
|
|
1222
|
+
* reasoning, or deliberate silence (empty `stop`) — is a completed review.
|
|
1223
|
+
*/
|
|
1224
|
+
function getAdvisorTurnError(messages: readonly AgentMessage[]): Error | undefined {
|
|
1225
|
+
if (messages.length === 0) return undefined;
|
|
1226
|
+
if (messages.some(message => message.role === "assistant")) return undefined;
|
|
1227
|
+
return new Error("Advisor turn ended without an assistant response");
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
type TextualContent = string | readonly (TextContent | ImageContent)[];
|
|
1231
|
+
|
|
1232
|
+
function obfuscateTextualContent(
|
|
1233
|
+
obfuscator: SecretObfuscator,
|
|
1234
|
+
content: TextualContent,
|
|
1235
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1236
|
+
): TextualContent {
|
|
1237
|
+
if (typeof content === "string") return obfuscator.obfuscate(content, sharedRegexSecretValues);
|
|
1238
|
+
let changed = false;
|
|
1239
|
+
const result = content.map((block): TextContent | ImageContent => {
|
|
1240
|
+
if (block.type !== "text") return block;
|
|
1241
|
+
const text = obfuscator.obfuscate(block.text, sharedRegexSecretValues);
|
|
1242
|
+
if (text === block.text) return block;
|
|
1243
|
+
changed = true;
|
|
1244
|
+
return { ...block, text };
|
|
1245
|
+
});
|
|
1246
|
+
return changed ? result : content;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
function firstAdvisorToolResultErrorLine(content: TextualContent): string | undefined {
|
|
1250
|
+
if (typeof content === "string") return content.split("\n", 1)[0];
|
|
1251
|
+
const first = content[0];
|
|
1252
|
+
if (first?.type !== "text") return undefined;
|
|
1253
|
+
return first.text.split("\n", 1)[0];
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
function obfuscateAdvisorToolResultErrorContent(
|
|
1257
|
+
obfuscator: SecretObfuscator,
|
|
1258
|
+
content: TextualContent,
|
|
1259
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1260
|
+
): TextualContent {
|
|
1261
|
+
const firstLine = firstAdvisorToolResultErrorLine(content);
|
|
1262
|
+
if (firstLine === undefined) return content;
|
|
1263
|
+
const preview = formatToolResultErrorPreview(content);
|
|
1264
|
+
const obfuscatedPreview = obfuscator.obfuscate(preview, sharedRegexSecretValues);
|
|
1265
|
+
if (obfuscatedPreview === firstLine) return content;
|
|
1266
|
+
if (typeof content === "string") return obfuscatedPreview + content.slice(firstLine.length);
|
|
1267
|
+
const first = content[0]!;
|
|
1268
|
+
if (first.type !== "text") return content;
|
|
1269
|
+
return [{ ...first, text: obfuscatedPreview + first.text.slice(firstLine.length) }, ...content.slice(1)];
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
function obfuscateAssistantMessage(
|
|
1273
|
+
obfuscator: SecretObfuscator,
|
|
1274
|
+
message: AssistantMessage,
|
|
1275
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1276
|
+
): AssistantMessage {
|
|
1277
|
+
let changed = false;
|
|
1278
|
+
const content = message.content.map((block): AssistantMessage["content"][number] => {
|
|
1279
|
+
if (block.type === "text") {
|
|
1280
|
+
const text = obfuscator.obfuscate(block.text, sharedRegexSecretValues);
|
|
1281
|
+
if (text === block.text) return block;
|
|
1282
|
+
changed = true;
|
|
1283
|
+
return { ...block, text };
|
|
1284
|
+
}
|
|
1285
|
+
if (block.type === "thinking") {
|
|
1286
|
+
const thinking = obfuscator.obfuscate(block.thinking, sharedRegexSecretValues);
|
|
1287
|
+
if (thinking === block.thinking) return block;
|
|
1288
|
+
changed = true;
|
|
1289
|
+
return { ...block, thinking, thinkingSignature: undefined };
|
|
1290
|
+
}
|
|
1291
|
+
if (block.type === "toolCall") {
|
|
1292
|
+
const args = obfuscateToolArguments(obfuscator, block.arguments, sharedRegexSecretValues);
|
|
1293
|
+
if (args === block.arguments) return block;
|
|
1294
|
+
changed = true;
|
|
1295
|
+
return { ...block, arguments: args };
|
|
1296
|
+
}
|
|
1297
|
+
return block;
|
|
1298
|
+
});
|
|
1299
|
+
return changed ? { ...message, content } : message;
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
function obfuscateDetails(
|
|
1303
|
+
obfuscator: SecretObfuscator,
|
|
1304
|
+
details: Record<string, unknown> | undefined,
|
|
1305
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1306
|
+
): Record<string, unknown> | undefined {
|
|
1307
|
+
if (!details) return details;
|
|
1308
|
+
// Walk strings at every depth: `customOneLiner` renders nested fields
|
|
1309
|
+
// (e.g. `async-result` reads `details.jobs[].label`/`jobId`), so a shallow
|
|
1310
|
+
// pass leaks any secret a background job's label happens to contain.
|
|
1311
|
+
return obfuscateToolArguments(obfuscator, details, sharedRegexSecretValues);
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
function obfuscateAdvisorMessage(
|
|
1315
|
+
obfuscator: SecretObfuscator,
|
|
1316
|
+
message: AgentMessage,
|
|
1317
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1318
|
+
): AgentMessage {
|
|
1319
|
+
switch (message.role) {
|
|
1320
|
+
case "user":
|
|
1321
|
+
case "developer": {
|
|
1322
|
+
const content = obfuscateTextualContent(
|
|
1323
|
+
obfuscator,
|
|
1324
|
+
message.content as TextualContent,
|
|
1325
|
+
sharedRegexSecretValues,
|
|
1326
|
+
);
|
|
1327
|
+
return content === message.content ? message : ({ ...(message as object), content } as AgentMessage);
|
|
1328
|
+
}
|
|
1329
|
+
case "toolResult": {
|
|
1330
|
+
const msg = message as AgentMessage & {
|
|
1331
|
+
content: TextualContent;
|
|
1332
|
+
details?: Record<string, unknown>;
|
|
1333
|
+
isError?: boolean;
|
|
1334
|
+
};
|
|
1335
|
+
const content = msg.isError
|
|
1336
|
+
? obfuscateAdvisorToolResultErrorContent(obfuscator, msg.content, sharedRegexSecretValues)
|
|
1337
|
+
: msg.content;
|
|
1338
|
+
let details = msg.details;
|
|
1339
|
+
if (typeof details?.diff === "string") {
|
|
1340
|
+
const diff = obfuscator.obfuscate(details.diff, sharedRegexSecretValues);
|
|
1341
|
+
if (diff !== details.diff) details = { ...details, diff };
|
|
1342
|
+
}
|
|
1343
|
+
if (content === msg.content && details === msg.details) return message;
|
|
1344
|
+
return { ...(message as object), content, details } as AgentMessage;
|
|
1345
|
+
}
|
|
1346
|
+
case "assistant":
|
|
1347
|
+
return obfuscateAssistantMessage(
|
|
1348
|
+
obfuscator,
|
|
1349
|
+
message as AssistantMessage,
|
|
1350
|
+
sharedRegexSecretValues,
|
|
1351
|
+
) as AgentMessage;
|
|
1352
|
+
case "custom":
|
|
1353
|
+
case "hookMessage": {
|
|
1354
|
+
if (!formatSessionHistoryMarkdown([message], { expandPrimaryContext: true }).trim()) return message;
|
|
1355
|
+
const msg = message as AgentMessage & {
|
|
1356
|
+
content: TextualContent;
|
|
1357
|
+
details?: Record<string, unknown>;
|
|
1358
|
+
};
|
|
1359
|
+
const content = obfuscateTextualContent(obfuscator, msg.content, sharedRegexSecretValues);
|
|
1360
|
+
const details = obfuscateDetails(obfuscator, msg.details, sharedRegexSecretValues);
|
|
1361
|
+
if (content === msg.content && details === msg.details) return message;
|
|
1362
|
+
return { ...(message as object), content, details } as AgentMessage;
|
|
1363
|
+
}
|
|
1364
|
+
case "bashExecution": {
|
|
1365
|
+
const msg = message as AgentMessage & { command: string };
|
|
1366
|
+
const command = obfuscator.obfuscate(formatExecutionSourcePreview(msg.command), sharedRegexSecretValues);
|
|
1367
|
+
return command === msg.command ? message : ({ ...(message as object), command } as AgentMessage);
|
|
1368
|
+
}
|
|
1369
|
+
case "pythonExecution": {
|
|
1370
|
+
const msg = message as AgentMessage & { code: string };
|
|
1371
|
+
const code = obfuscator.obfuscate(formatExecutionSourcePreview(msg.code), sharedRegexSecretValues);
|
|
1372
|
+
return code === msg.code ? message : ({ ...(message as object), code } as AgentMessage);
|
|
1373
|
+
}
|
|
1374
|
+
case "branchSummary": {
|
|
1375
|
+
const msg = message as AgentMessage & { summary: string };
|
|
1376
|
+
const summary = obfuscator.obfuscate(msg.summary, sharedRegexSecretValues);
|
|
1377
|
+
return summary === msg.summary ? message : ({ ...(message as object), summary } as AgentMessage);
|
|
1378
|
+
}
|
|
1379
|
+
case "compactionSummary": {
|
|
1380
|
+
const msg = message as AgentMessage & { summary: string };
|
|
1381
|
+
const summary = obfuscator.obfuscate(msg.summary, sharedRegexSecretValues);
|
|
1382
|
+
return summary === msg.summary ? message : ({ ...(message as object), summary } as AgentMessage);
|
|
1383
|
+
}
|
|
1384
|
+
case "fileMention": {
|
|
1385
|
+
const msg = message as AgentMessage & {
|
|
1386
|
+
files: Array<{ path: string; content: string; image?: unknown }>;
|
|
1387
|
+
};
|
|
1388
|
+
let changed = false;
|
|
1389
|
+
const files = msg.files.map(file => {
|
|
1390
|
+
const path = obfuscator.obfuscate(file.path, sharedRegexSecretValues);
|
|
1391
|
+
if (path === file.path) return file;
|
|
1392
|
+
changed = true;
|
|
1393
|
+
return { ...file, path };
|
|
1394
|
+
});
|
|
1395
|
+
return changed ? ({ ...(message as object), files } as AgentMessage) : message;
|
|
1396
|
+
}
|
|
1397
|
+
default:
|
|
1398
|
+
return message;
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
function scrubAdvisorHistory(
|
|
1403
|
+
obfuscator: SecretObfuscator,
|
|
1404
|
+
messages: AgentMessage[],
|
|
1405
|
+
sharedRegexSecretValues: ReadonlySet<string>,
|
|
1406
|
+
): void {
|
|
1407
|
+
for (let index = 0; index < messages.length; index++) {
|
|
1408
|
+
const message = messages[index]!;
|
|
1409
|
+
const next = obfuscateAdvisorMessage(obfuscator, message, sharedRegexSecretValues);
|
|
1410
|
+
if (next !== message) messages[index] = next;
|
|
1411
|
+
}
|
|
1412
|
+
}
|