@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,1304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom message types and transformers for the coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Extends the base AgentMessage type with coding-agent specific message types,
|
|
5
|
+
* and provides a transformer to convert them to LLM-compatible messages.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
8
|
+
import {
|
|
9
|
+
invalidateMessageCache,
|
|
10
|
+
registerMessageCacheInvalidator,
|
|
11
|
+
} from "@oh-my-pi/pi-agent-core/compaction/message-cache";
|
|
12
|
+
import {
|
|
13
|
+
type BranchSummaryMessage,
|
|
14
|
+
type CompactionSummaryMessage,
|
|
15
|
+
convertMessageToLlm,
|
|
16
|
+
} from "@oh-my-pi/pi-agent-core/compaction/messages";
|
|
17
|
+
import type {
|
|
18
|
+
AssistantMessage,
|
|
19
|
+
ImageContent,
|
|
20
|
+
Message,
|
|
21
|
+
MessageAttribution,
|
|
22
|
+
TextContent,
|
|
23
|
+
UserMessage,
|
|
24
|
+
} from "@oh-my-pi/pi-ai";
|
|
25
|
+
import * as AIError from "@oh-my-pi/pi-ai/error";
|
|
26
|
+
import { isRecord, logger, prompt } from "@oh-my-pi/pi-utils";
|
|
27
|
+
import { COLLAB_PROMPT_MESSAGE_TYPE } from "@oh-my-pi/pi-wire";
|
|
28
|
+
import userInterjectionTemplate from "../prompts/steering/user-interjection.md" with { type: "text" };
|
|
29
|
+
import { formatTitleConversationContext, type TitleConversationTurn } from "../tiny/message-preproc";
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
type BranchSummaryMessage,
|
|
33
|
+
type CompactionSummaryMessage,
|
|
34
|
+
createBranchSummaryMessage,
|
|
35
|
+
createCompactionSummaryMessage,
|
|
36
|
+
createCustomMessage,
|
|
37
|
+
} from "@oh-my-pi/pi-agent-core/compaction/messages";
|
|
38
|
+
|
|
39
|
+
import type { OutputMeta } from "../tools/output-meta";
|
|
40
|
+
import { formatOutputNotice } from "../tools/output-meta";
|
|
41
|
+
|
|
42
|
+
export const SKILL_PROMPT_MESSAGE_TYPE = "skill-prompt";
|
|
43
|
+
export const LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE = "lsp-late-diagnostic";
|
|
44
|
+
export const BACKGROUND_TAN_DISPATCH_MESSAGE_TYPE = "background-tan-dispatch";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Logs provider-error turns so their actual cause is available outside the
|
|
48
|
+
* session transcript. No-op for non-error stop reasons.
|
|
49
|
+
*/
|
|
50
|
+
export function logProviderTurnError(msg: AssistantMessage): void {
|
|
51
|
+
if (msg.stopReason !== "error") return;
|
|
52
|
+
logger.warn("agent turn ended with provider error", {
|
|
53
|
+
provider: msg.provider,
|
|
54
|
+
model: msg.model,
|
|
55
|
+
errorMessage: msg.errorMessage,
|
|
56
|
+
errorStatus: msg.errorStatus,
|
|
57
|
+
errorId: msg.errorId,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const EPHEMERAL_REPLY_MAX_BYTES = 4096;
|
|
62
|
+
const REPLAN_TITLE_CONTEXT_TURN_LIMIT = 6;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Removes replay-bound provider state before reparenting an assistant message
|
|
66
|
+
* under a different user turn.
|
|
67
|
+
*/
|
|
68
|
+
export function sanitizeAssistantForReparentedHistory(message: AssistantMessage): AssistantMessage {
|
|
69
|
+
const content: AssistantMessage["content"] = [];
|
|
70
|
+
for (const block of message.content) {
|
|
71
|
+
if (block.type === "redactedThinking" || block.type === "anthropicServerTool") continue;
|
|
72
|
+
if (block.type === "thinking") {
|
|
73
|
+
content.push({ type: "thinking", thinking: block.thinking });
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
content.push(block);
|
|
77
|
+
}
|
|
78
|
+
return { ...message, content, providerPayload: undefined };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Collapses degenerate repeated lines and bounds an ephemeral side-channel
|
|
83
|
+
* reply to 4 KiB.
|
|
84
|
+
*/
|
|
85
|
+
export function dedupeEphemeralReply(text: string): string {
|
|
86
|
+
if (!text) return text;
|
|
87
|
+
const lines = text.split("\n");
|
|
88
|
+
const out: string[] = [];
|
|
89
|
+
let i = 0;
|
|
90
|
+
while (i < lines.length) {
|
|
91
|
+
let j = i + 1;
|
|
92
|
+
while (j < lines.length && lines[j] === lines[i]) j++;
|
|
93
|
+
const runLen = j - i;
|
|
94
|
+
if (runLen > 3) {
|
|
95
|
+
out.push(lines[i], `[…${runLen}×]`);
|
|
96
|
+
} else {
|
|
97
|
+
for (let k = 0; k < runLen; k++) out.push(lines[i]);
|
|
98
|
+
}
|
|
99
|
+
i = j;
|
|
100
|
+
}
|
|
101
|
+
let result = out.join("\n");
|
|
102
|
+
if (Buffer.byteLength(result, "utf8") > EPHEMERAL_REPLY_MAX_BYTES) {
|
|
103
|
+
const suffix = "\n[…truncated]";
|
|
104
|
+
const budget = EPHEMERAL_REPLY_MAX_BYTES - Buffer.byteLength(suffix, "utf8");
|
|
105
|
+
while (Buffer.byteLength(result, "utf8") > budget) {
|
|
106
|
+
result = result.slice(0, -1);
|
|
107
|
+
}
|
|
108
|
+
result += suffix;
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Builds the recent user/assistant context supplied to title regeneration. */
|
|
114
|
+
export function buildReplanTitleContext(messages: AgentMessage[]): string {
|
|
115
|
+
const turns: TitleConversationTurn[] = [];
|
|
116
|
+
for (let i = messages.length - 1; i >= 0 && turns.length < REPLAN_TITLE_CONTEXT_TURN_LIMIT; i--) {
|
|
117
|
+
const message = messages[i];
|
|
118
|
+
if (!message) continue;
|
|
119
|
+
const turn = titleConversationTurnFromMessage(message);
|
|
120
|
+
if (turn) turns.push(turn);
|
|
121
|
+
}
|
|
122
|
+
turns.reverse();
|
|
123
|
+
return formatTitleConversationContext(turns);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Compares session messages by provider-replay semantics, ignoring runtime-only
|
|
128
|
+
* fields that do not change a restored request.
|
|
129
|
+
*/
|
|
130
|
+
export function didSessionMessagesChange(previousMessages: AgentMessage[], nextMessages: AgentMessage[]): boolean {
|
|
131
|
+
if (previousMessages.length !== nextMessages.length) return true;
|
|
132
|
+
return previousMessages.some(
|
|
133
|
+
(message, i) =>
|
|
134
|
+
!Bun.deepEquals(
|
|
135
|
+
normalizeSessionMessageForProviderReplay(message),
|
|
136
|
+
normalizeSessionMessageForProviderReplay(nextMessages[i]),
|
|
137
|
+
),
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function textFromContent(content: unknown): string {
|
|
142
|
+
if (typeof content === "string") return content.trim();
|
|
143
|
+
if (!Array.isArray(content)) return "";
|
|
144
|
+
const parts: string[] = [];
|
|
145
|
+
for (const block of content) {
|
|
146
|
+
if (!isRecord(block) || block.type !== "text" || typeof block.text !== "string") continue;
|
|
147
|
+
const text = block.text.trim();
|
|
148
|
+
if (text) parts.push(text);
|
|
149
|
+
}
|
|
150
|
+
return parts.join("\n\n");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function thinkingFromContent(content: unknown): string {
|
|
154
|
+
if (!Array.isArray(content)) return "";
|
|
155
|
+
const parts: string[] = [];
|
|
156
|
+
for (const block of content) {
|
|
157
|
+
if (!isRecord(block) || block.type !== "thinking" || typeof block.thinking !== "string") continue;
|
|
158
|
+
const thinking = block.thinking.trim();
|
|
159
|
+
if (thinking) parts.push(thinking);
|
|
160
|
+
}
|
|
161
|
+
return parts.join("\n\n");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function titleConversationTurnFromMessage(message: AgentMessage): TitleConversationTurn | undefined {
|
|
165
|
+
if (message.role !== "user" && message.role !== "assistant") return undefined;
|
|
166
|
+
const text = textFromContent(message.content);
|
|
167
|
+
const thinking = message.role === "assistant" ? thinkingFromContent(message.content) : undefined;
|
|
168
|
+
if (!text && !thinking) return undefined;
|
|
169
|
+
return { role: message.role, ...(text ? { text } : {}), ...(thinking ? { thinking } : {}) };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function normalizeProviderReplayValue(value: unknown): unknown {
|
|
173
|
+
if (Array.isArray(value)) {
|
|
174
|
+
return value.map(normalizeProviderReplayValue);
|
|
175
|
+
}
|
|
176
|
+
if (value && typeof value === "object") {
|
|
177
|
+
return Object.fromEntries(
|
|
178
|
+
Object.entries(value).map(([key, entryValue]) => [key, normalizeProviderReplayValue(entryValue)]),
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function normalizeSessionMessageForProviderReplay(message: AgentMessage): unknown {
|
|
185
|
+
switch (message.role) {
|
|
186
|
+
case "user":
|
|
187
|
+
case "developer":
|
|
188
|
+
return {
|
|
189
|
+
role: message.role,
|
|
190
|
+
content: normalizeProviderReplayValue(message.content),
|
|
191
|
+
providerPayload: message.providerPayload,
|
|
192
|
+
};
|
|
193
|
+
case "assistant": {
|
|
194
|
+
const isResponsesFamilyMessage =
|
|
195
|
+
message.api === "openai-responses" || message.api === "openai-codex-responses";
|
|
196
|
+
return {
|
|
197
|
+
role: message.role,
|
|
198
|
+
content:
|
|
199
|
+
isResponsesFamilyMessage && Array.isArray(message.content)
|
|
200
|
+
? message.content.flatMap(block => {
|
|
201
|
+
if (block.type === "thinking") {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
if (block.type === "toolCall") {
|
|
205
|
+
return [
|
|
206
|
+
{
|
|
207
|
+
type: block.type,
|
|
208
|
+
id: block.id,
|
|
209
|
+
name: block.name,
|
|
210
|
+
arguments: block.arguments,
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
}
|
|
214
|
+
if (block.type === "text") {
|
|
215
|
+
return [{ type: block.type, text: block.text, textSignature: block.textSignature }];
|
|
216
|
+
}
|
|
217
|
+
return [normalizeProviderReplayValue(block)];
|
|
218
|
+
})
|
|
219
|
+
: normalizeProviderReplayValue(message.content),
|
|
220
|
+
api: message.api,
|
|
221
|
+
provider: message.provider,
|
|
222
|
+
model: message.model,
|
|
223
|
+
stopReason: message.stopReason,
|
|
224
|
+
errorMessage: message.errorMessage,
|
|
225
|
+
providerPayload: isResponsesFamilyMessage ? undefined : message.providerPayload,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case "toolResult":
|
|
229
|
+
return {
|
|
230
|
+
role: message.role,
|
|
231
|
+
toolName: message.toolName,
|
|
232
|
+
toolCallId: message.toolCallId,
|
|
233
|
+
isError: message.isError,
|
|
234
|
+
content: normalizeProviderReplayValue(message.content),
|
|
235
|
+
};
|
|
236
|
+
case "bashExecution":
|
|
237
|
+
return {
|
|
238
|
+
role: message.role,
|
|
239
|
+
command: message.command,
|
|
240
|
+
output: message.output,
|
|
241
|
+
exitCode: message.exitCode,
|
|
242
|
+
cancelled: message.cancelled,
|
|
243
|
+
meta: message.meta
|
|
244
|
+
? {
|
|
245
|
+
truncation: normalizeProviderReplayValue(message.meta.truncation),
|
|
246
|
+
limits: normalizeProviderReplayValue(message.meta.limits),
|
|
247
|
+
diagnostics: message.meta.diagnostics
|
|
248
|
+
? normalizeProviderReplayValue({
|
|
249
|
+
summary: message.meta.diagnostics.summary,
|
|
250
|
+
messages: message.meta.diagnostics.messages,
|
|
251
|
+
})
|
|
252
|
+
: undefined,
|
|
253
|
+
}
|
|
254
|
+
: undefined,
|
|
255
|
+
excludeFromContext: message.excludeFromContext,
|
|
256
|
+
};
|
|
257
|
+
case "pythonExecution":
|
|
258
|
+
return {
|
|
259
|
+
role: message.role,
|
|
260
|
+
code: message.code,
|
|
261
|
+
output: message.output,
|
|
262
|
+
exitCode: message.exitCode,
|
|
263
|
+
cancelled: message.cancelled,
|
|
264
|
+
meta: message.meta
|
|
265
|
+
? {
|
|
266
|
+
truncation: normalizeProviderReplayValue(message.meta.truncation),
|
|
267
|
+
limits: normalizeProviderReplayValue(message.meta.limits),
|
|
268
|
+
diagnostics: message.meta.diagnostics
|
|
269
|
+
? normalizeProviderReplayValue({
|
|
270
|
+
summary: message.meta.diagnostics.summary,
|
|
271
|
+
messages: message.meta.diagnostics.messages,
|
|
272
|
+
})
|
|
273
|
+
: undefined,
|
|
274
|
+
}
|
|
275
|
+
: undefined,
|
|
276
|
+
excludeFromContext: message.excludeFromContext,
|
|
277
|
+
};
|
|
278
|
+
case "custom":
|
|
279
|
+
case "hookMessage":
|
|
280
|
+
return {
|
|
281
|
+
role: message.role,
|
|
282
|
+
customType: message.customType,
|
|
283
|
+
content: normalizeProviderReplayValue(message.content),
|
|
284
|
+
};
|
|
285
|
+
case "branchSummary":
|
|
286
|
+
return { role: message.role, summary: message.summary };
|
|
287
|
+
case "compactionSummary":
|
|
288
|
+
return {
|
|
289
|
+
role: message.role,
|
|
290
|
+
summary: message.summary,
|
|
291
|
+
providerPayload: message.providerPayload,
|
|
292
|
+
};
|
|
293
|
+
case "fileMention":
|
|
294
|
+
return {
|
|
295
|
+
role: message.role,
|
|
296
|
+
files: message.files.map(file => ({
|
|
297
|
+
path: file.path,
|
|
298
|
+
content: file.content,
|
|
299
|
+
image: file.image,
|
|
300
|
+
})),
|
|
301
|
+
};
|
|
302
|
+
default:
|
|
303
|
+
return normalizeProviderReplayValue(message);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** Fallback type for extension-injected messages that omit a custom type. */
|
|
308
|
+
export const DEFAULT_CUSTOM_MESSAGE_TYPE = "custom-message";
|
|
309
|
+
|
|
310
|
+
/** Custom message carrying a coding request delegated by the live voice model. */
|
|
311
|
+
export const LIVE_DELEGATION_MESSAGE_TYPE = "live-delegation";
|
|
312
|
+
|
|
313
|
+
/** Content shape accepted for extension-injected messages. */
|
|
314
|
+
export type CustomMessageContent = string | (TextContent | ImageContent)[];
|
|
315
|
+
|
|
316
|
+
/** Public input accepted by `pi.sendMessage` and `AgentSession.sendCustomMessage`. */
|
|
317
|
+
export type CustomMessagePayload<T = unknown> =
|
|
318
|
+
| string
|
|
319
|
+
| Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">>;
|
|
320
|
+
|
|
321
|
+
/** Custom message payload after applying runtime defaults. */
|
|
322
|
+
export type NormalizedCustomMessagePayload<T = unknown> = Pick<
|
|
323
|
+
CustomMessage<T>,
|
|
324
|
+
"customType" | "content" | "display" | "details" | "attribution"
|
|
325
|
+
>;
|
|
326
|
+
|
|
327
|
+
/** Custom message type for hidden interrupted-thinking continuity context. */
|
|
328
|
+
export const INTERRUPTED_THINKING_MESSAGE_TYPE = "interrupted-thinking";
|
|
329
|
+
|
|
330
|
+
/** Metadata persisted with a hidden interrupted-thinking continuity message. */
|
|
331
|
+
export interface InterruptedThinkingDetails {
|
|
332
|
+
interruptedAt: number;
|
|
333
|
+
provider: AssistantMessage["provider"];
|
|
334
|
+
model: string;
|
|
335
|
+
blockCount: number;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** Pure helper result for persisting interrupted thinking outside the assistant turn. */
|
|
339
|
+
export interface DemotedInterruptedThinking {
|
|
340
|
+
reasoning: string;
|
|
341
|
+
strippedContent: AssistantMessage["content"];
|
|
342
|
+
blockCount: number;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Demote a trailing run of *incomplete* interrupted-thinking from an assistant
|
|
347
|
+
* message — reasoning that was still streaming when the user aborted.
|
|
348
|
+
*
|
|
349
|
+
* A block joins the run only when it is a non-empty `thinking` block with no
|
|
350
|
+
* `thinkingSignature`. A signed/complete thinking block (Anthropic signature,
|
|
351
|
+
* OpenAI reasoning item id) is safely replayable, so it ends the run and stays
|
|
352
|
+
* in place — as do `redactedThinking` encrypted blobs, text, tool calls,
|
|
353
|
+
* empty-thinking blocks, and trailing empty text placeholders.
|
|
354
|
+
*/
|
|
355
|
+
export function demoteInterruptedThinking(
|
|
356
|
+
message: Pick<AssistantMessage, "content">,
|
|
357
|
+
): DemotedInterruptedThinking | undefined {
|
|
358
|
+
const content = message.content;
|
|
359
|
+
let scanEnd = content.length;
|
|
360
|
+
while (scanEnd > 0) {
|
|
361
|
+
const block = content[scanEnd - 1]!;
|
|
362
|
+
if (block.type !== "text" || block.text.trim().length > 0) {
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
scanEnd--;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
let runStart = scanEnd;
|
|
369
|
+
while (runStart > 0) {
|
|
370
|
+
const block = content[runStart - 1]!;
|
|
371
|
+
if (block.type !== "thinking" || block.thinking.trim().length === 0 || block.thinkingSignature) {
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
runStart--;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const blockCount = scanEnd - runStart;
|
|
378
|
+
if (blockCount === 0) {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const reasoningBlocks: string[] = [];
|
|
383
|
+
for (let index = runStart; index < scanEnd; index++) {
|
|
384
|
+
const block = content[index]!;
|
|
385
|
+
if (block.type === "thinking") {
|
|
386
|
+
reasoningBlocks.push(block.thinking.trim());
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return {
|
|
391
|
+
reasoning: reasoningBlocks.join("\n\n"),
|
|
392
|
+
strippedContent: content.slice(0, runStart),
|
|
393
|
+
blockCount,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* True when the assistant turn at `messages[index]` is immediately followed by
|
|
399
|
+
* its hidden `interrupted-thinking` continuity message — the marker that a
|
|
400
|
+
* trailing thinking run was demoted on user interrupt. The run stays on the
|
|
401
|
+
* persisted/displayed assistant message; this flag tells the LLM path to drop it.
|
|
402
|
+
*/
|
|
403
|
+
function followedByInterruptedThinking(messages: AgentMessage[], index: number): boolean {
|
|
404
|
+
const next = messages[index + 1];
|
|
405
|
+
return next !== undefined && next.role === "custom" && next.customType === INTERRUPTED_THINKING_MESSAGE_TYPE;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Drop the demoted trailing thinking run from an assistant message for the LLM
|
|
410
|
+
* view only. The run is incomplete and unsigned, so providers reject it; the
|
|
411
|
+
* continuity message that follows carries the reasoning instead.
|
|
412
|
+
*/
|
|
413
|
+
function stripDemotedThinkingForLlm(message: AssistantMessage): AssistantMessage {
|
|
414
|
+
const demoted = demoteInterruptedThinking(message);
|
|
415
|
+
return demoted ? { ...message, content: demoted.strippedContent } : message;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** Details persisted on a `/tan` background-dispatch breadcrumb. */
|
|
419
|
+
export interface BackgroundTanDispatchDetails {
|
|
420
|
+
jobId: string;
|
|
421
|
+
work: string;
|
|
422
|
+
/** Forked clone session file, named `<agentId>.jsonl`; the Agent Hub reads its transcript. */
|
|
423
|
+
sessionFile: string;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export interface SkillPromptDetails {
|
|
427
|
+
name: string;
|
|
428
|
+
path: string;
|
|
429
|
+
args?: string;
|
|
430
|
+
lineCount: number;
|
|
431
|
+
/** Internal: compact label shown for a queued custom message. Optional —
|
|
432
|
+
* non-streaming skill prompts never set it. Stripped from persisted
|
|
433
|
+
* `details` by `SessionManager.appendCustomMessageEntry` via the
|
|
434
|
+
* `INTERNAL_DETAILS_FIELDS` allowlist below. */
|
|
435
|
+
__queueChipText?: string;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
|
|
439
|
+
* was an *expected internal transition* (plan-mode → execution compaction)
|
|
440
|
+
* and must NOT surface as a red "Operation aborted" line. Distinct from
|
|
441
|
+
* `undefined` (default) so user-cancel aborts with no errorMessage still
|
|
442
|
+
* render normally. Persists through SessionManager so history replay
|
|
443
|
+
* branches identically.
|
|
444
|
+
*
|
|
445
|
+
* Consumers: `AgentSession.#handleAgentEvent` (stamper) writes this value;
|
|
446
|
+
* `EventController.#handleMessageEnd`, `AssistantMessageComponent`,
|
|
447
|
+
* `ui-helpers.addMessageToChat` (renderers), `AgentHubOverlayComponent
|
|
448
|
+
* #buildTranscriptLines`, `runPrintMode`, and `AcpAgent#replayAssistantMessage`
|
|
449
|
+
* (fallback error emission) read it via `isSilentAbort`. */
|
|
450
|
+
export const SILENT_ABORT_MARKER = "__omp.silent_abort__";
|
|
451
|
+
|
|
452
|
+
/** Type-guard for silent aborts. Renderers MUST call this helper so structured
|
|
453
|
+
* `errorId` and legacy persisted marker messages stay in lockstep. */
|
|
454
|
+
export function isSilentAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
455
|
+
return AIError.is(message.errorId, AIError.Flag.SilentAbort) || message.errorMessage === SILENT_ABORT_MARKER;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** Reason threaded through `AbortController.abort(reason)` when the user aborts
|
|
459
|
+
* the turn with Esc (see `AgentSession.abort`). The agent keeps it on the
|
|
460
|
+
* aborted assistant message's `errorMessage` so queued follow-ups/tool-result
|
|
461
|
+
* placeholders can distinguish a deliberate interrupt from a bare lifecycle
|
|
462
|
+
* abort, but interactive renderers suppress this redundant transcript line. */
|
|
463
|
+
export const USER_INTERRUPT_LABEL = "Interrupted by user";
|
|
464
|
+
|
|
465
|
+
export function isUserInterruptAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
466
|
+
return AIError.is(message.errorId, AIError.Flag.UserInterrupt) || message.errorMessage === USER_INTERRUPT_LABEL;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
export function shouldRenderAbortReason(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
470
|
+
return !isSilentAbort(message) && !isUserInterruptAbort(message);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/** A provider-rejection turn carrying nothing but the error flag: stopReason
|
|
474
|
+
* "error" with no text, thinking, or tool calls — e.g. a request the provider
|
|
475
|
+
* rejected before any output (an oversized 413 payload). Persisting it writes an
|
|
476
|
+
* empty assistant turn that replays on reload and re-sends the rejected context;
|
|
477
|
+
* the error is surfaced live (pinned) instead. A turn that streamed partial text,
|
|
478
|
+
* reasoning, or tool calls is NOT empty and stays in history. */
|
|
479
|
+
export function isEmptyErrorTurn(message: Pick<AssistantMessage, "stopReason" | "content">): boolean {
|
|
480
|
+
if (message.stopReason !== "error") return false;
|
|
481
|
+
return !message.content.some(block => {
|
|
482
|
+
switch (block.type) {
|
|
483
|
+
case "text":
|
|
484
|
+
return block.text.trim().length > 0;
|
|
485
|
+
case "thinking":
|
|
486
|
+
return block.thinking.trim().length > 0 || (block.thinkingSignature?.trim().length ?? 0) > 0;
|
|
487
|
+
case "redactedThinking":
|
|
488
|
+
return block.data.trim().length > 0;
|
|
489
|
+
case "toolCall":
|
|
490
|
+
return true;
|
|
491
|
+
case "fallback":
|
|
492
|
+
return false;
|
|
493
|
+
// Unknown/new block kinds count as content: never silently discard a turn.
|
|
494
|
+
default:
|
|
495
|
+
return true;
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Sentinel `errorMessage` the agent stamps on any abort that carried no custom
|
|
501
|
+
* reason (bare `abort()`). Renderers treat it as "no specific reason given". */
|
|
502
|
+
export const GENERIC_ABORT_SENTINEL = "Request was aborted";
|
|
503
|
+
|
|
504
|
+
/** Resolve the operator-facing label for an aborted assistant turn. A custom
|
|
505
|
+
* abort reason threaded onto `errorMessage` is returned verbatim; aborts with
|
|
506
|
+
* no threaded reason fall back to the retry-aware generic label. Call
|
|
507
|
+
* `shouldRenderAbortReason` before rendering when user interrupts should stay
|
|
508
|
+
* visually quiet. */
|
|
509
|
+
export function resolveAbortLabel(
|
|
510
|
+
message: Pick<AssistantMessage, "errorId" | "errorMessage">,
|
|
511
|
+
retryAttempt = 0,
|
|
512
|
+
): string {
|
|
513
|
+
const genericAbort =
|
|
514
|
+
AIError.is(message.errorId, AIError.Flag.Abort) ||
|
|
515
|
+
!message.errorMessage ||
|
|
516
|
+
message.errorMessage === GENERIC_ABORT_SENTINEL ||
|
|
517
|
+
isSilentAbort(message);
|
|
518
|
+
if (!genericAbort) {
|
|
519
|
+
return message.errorMessage!;
|
|
520
|
+
}
|
|
521
|
+
if (retryAttempt > 0) {
|
|
522
|
+
return `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? "s" : ""}`;
|
|
523
|
+
}
|
|
524
|
+
return "Operation aborted";
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/** Extract the optional `__queueChipText` field from a CustomMessage's
|
|
528
|
+
* `details` blob. Safe over `unknown`; returns undefined when the field is
|
|
529
|
+
* absent or non-string. */
|
|
530
|
+
export function readQueueChipText(details: unknown): string | undefined {
|
|
531
|
+
if (typeof details !== "object" || details === null) return undefined;
|
|
532
|
+
const candidate = (details as { __queueChipText?: unknown }).__queueChipText;
|
|
533
|
+
return typeof candidate === "string" ? candidate : undefined;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/** Explicit allowlist of `details` field names that are AgentSession-internal
|
|
537
|
+
* transient bookkeeping and MUST be removed before SessionManager persists
|
|
538
|
+
* the CustomMessageEntry to disk. Scoped intentionally narrow: only fields
|
|
539
|
+
* declared here are stripped. Adding a new entry is a deliberate, reviewed
|
|
540
|
+
* change — unrelated future payload fields are never silently dropped. */
|
|
541
|
+
export const INTERNAL_DETAILS_FIELDS = ["__queueChipText"] as const;
|
|
542
|
+
|
|
543
|
+
/** Return a `details` copy with every key in `INTERNAL_DETAILS_FIELDS`
|
|
544
|
+
* removed. Returns the input unchanged when there is nothing to strip
|
|
545
|
+
* (null/non-object, or no listed fields present) so callers don't pay a
|
|
546
|
+
* clone cost on the common path. */
|
|
547
|
+
export function stripInternalDetailsFields<T>(details: T | undefined): T | undefined {
|
|
548
|
+
if (details == null || typeof details !== "object") return details;
|
|
549
|
+
const obj = details as Record<string, unknown>;
|
|
550
|
+
let hit = false;
|
|
551
|
+
for (const key of INTERNAL_DETAILS_FIELDS) {
|
|
552
|
+
if (key in obj) {
|
|
553
|
+
hit = true;
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
if (!hit) return details;
|
|
558
|
+
const cleaned: Record<string, unknown> = { ...obj };
|
|
559
|
+
for (const key of INTERNAL_DETAILS_FIELDS) {
|
|
560
|
+
delete cleaned[key];
|
|
561
|
+
}
|
|
562
|
+
return cleaned as T;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/** True when a persisted or extension-supplied value can be sent as custom-message content. */
|
|
566
|
+
export function isCustomMessageContent(content: unknown): content is CustomMessageContent {
|
|
567
|
+
return typeof content === "string" || Array.isArray(content);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
function normalizeCustomMessageContent(content: unknown): CustomMessageContent {
|
|
571
|
+
return isCustomMessageContent(content) ? content : "";
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function normalizeCustomMessageType(customType: unknown): string {
|
|
575
|
+
return typeof customType === "string" && customType.length > 0 ? customType : DEFAULT_CUSTOM_MESSAGE_TYPE;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function normalizeCustomMessageAttribution(attribution: unknown): MessageAttribution {
|
|
579
|
+
return attribution === "user" ? "user" : "agent";
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function isCustomMessagePayloadObject<T>(
|
|
583
|
+
payload: unknown,
|
|
584
|
+
): payload is Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">> {
|
|
585
|
+
return payload !== null && typeof payload === "object" && !Array.isArray(payload);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/** Normalizes extension-provided custom message input before it reaches session state or disk. */
|
|
589
|
+
export function normalizeCustomMessagePayload<T = unknown>(
|
|
590
|
+
payload: CustomMessagePayload<T> | unknown,
|
|
591
|
+
): NormalizedCustomMessagePayload<T> {
|
|
592
|
+
if (typeof payload === "string") {
|
|
593
|
+
return {
|
|
594
|
+
customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
|
|
595
|
+
content: payload,
|
|
596
|
+
display: true,
|
|
597
|
+
attribution: "agent",
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
if (!isCustomMessagePayloadObject<T>(payload)) {
|
|
601
|
+
const content = payload === undefined || payload === null ? "" : String(payload);
|
|
602
|
+
return {
|
|
603
|
+
customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
|
|
604
|
+
content,
|
|
605
|
+
display: content.length > 0,
|
|
606
|
+
attribution: "agent",
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
return {
|
|
610
|
+
customType: normalizeCustomMessageType(payload.customType),
|
|
611
|
+
content: normalizeCustomMessageContent(payload.content),
|
|
612
|
+
display: typeof payload.display === "boolean" ? payload.display : false,
|
|
613
|
+
details: payload.details,
|
|
614
|
+
attribution: normalizeCustomMessageAttribution(payload.attribution),
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
type SteeringUserMessage =
|
|
619
|
+
| (UserMessage & { steering: true })
|
|
620
|
+
| (CustomMessage & {
|
|
621
|
+
customType: typeof COLLAB_PROMPT_MESSAGE_TYPE;
|
|
622
|
+
attribution: "user";
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
function isSteeringUserMessage(message: AgentMessage | undefined): message is SteeringUserMessage {
|
|
626
|
+
if (message?.role === "user") return message.steering === true;
|
|
627
|
+
return (
|
|
628
|
+
message?.role === "custom" && message.customType === COLLAB_PROMPT_MESSAGE_TYPE && message.attribution === "user"
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function userMessageWithoutSteering(message: UserMessage): UserMessage {
|
|
633
|
+
const { steering, ...rest } = message;
|
|
634
|
+
void steering;
|
|
635
|
+
return rest;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
function renderSteeringEnvelope(message: string): string {
|
|
639
|
+
return prompt.render(userInterjectionTemplate, { message });
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
function getArrayContentText(content: (TextContent | ImageContent)[]): string {
|
|
643
|
+
let firstText: string | undefined;
|
|
644
|
+
let textParts: string[] | undefined;
|
|
645
|
+
for (const part of content) {
|
|
646
|
+
if (part.type !== "text") continue;
|
|
647
|
+
if (firstText === undefined) {
|
|
648
|
+
firstText = part.text;
|
|
649
|
+
continue;
|
|
650
|
+
}
|
|
651
|
+
if (textParts === undefined) {
|
|
652
|
+
textParts = [firstText];
|
|
653
|
+
}
|
|
654
|
+
textParts.push(part.text);
|
|
655
|
+
}
|
|
656
|
+
return textParts === undefined ? (firstText ?? "") : textParts.join("\n");
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
function getArrayContentImages(content: (TextContent | ImageContent)[]): ImageContent[] {
|
|
660
|
+
let images: ImageContent[] | undefined;
|
|
661
|
+
for (const part of content) {
|
|
662
|
+
if (part.type !== "image") continue;
|
|
663
|
+
if (images === undefined) images = [];
|
|
664
|
+
images.push(part);
|
|
665
|
+
}
|
|
666
|
+
return images ?? [];
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
function wrapSteeringUserMessage(message: SteeringUserMessage): UserMessage {
|
|
670
|
+
const userMessage: UserMessage =
|
|
671
|
+
message.role === "user"
|
|
672
|
+
? userMessageWithoutSteering(message)
|
|
673
|
+
: {
|
|
674
|
+
role: "user",
|
|
675
|
+
content: message.content,
|
|
676
|
+
attribution: "user",
|
|
677
|
+
timestamp: message.timestamp,
|
|
678
|
+
};
|
|
679
|
+
if (typeof message.content === "string") {
|
|
680
|
+
if (message.content.length === 0) return message.role === "user" ? message : userMessage;
|
|
681
|
+
return { ...userMessage, content: renderSteeringEnvelope(message.content) };
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const text = getArrayContentText(message.content);
|
|
685
|
+
if (text.length === 0) return message.role === "user" ? message : userMessage;
|
|
686
|
+
const content: (TextContent | ImageContent)[] = [{ type: "text", text: renderSteeringEnvelope(text) }];
|
|
687
|
+
content.push(...getArrayContentImages(message.content));
|
|
688
|
+
return { ...userMessage, content };
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
export function wrapSteeringForModel(messages: AgentMessage[]): AgentMessage[] {
|
|
692
|
+
// Wrap EVERY steering message, not just a trailing run. The wire bytes of a
|
|
693
|
+
// steering message must be a pure function of the message itself, independent
|
|
694
|
+
// of its position in the array. When only the trailing steer was wrapped, the
|
|
695
|
+
// same persisted message was sent enveloped while it was the tail and raw once
|
|
696
|
+
// the assistant's reply buried it — rewriting already-cached prefix bytes and
|
|
697
|
+
// busting the provider prompt cache from that message onward on the next turn.
|
|
698
|
+
let wrappedMessages: AgentMessage[] | undefined;
|
|
699
|
+
for (let i = 0; i < messages.length; i++) {
|
|
700
|
+
const message = messages[i];
|
|
701
|
+
if (!isSteeringUserMessage(message)) continue;
|
|
702
|
+
const wrappedMessage = wrapSteeringUserMessage(message);
|
|
703
|
+
if (wrappedMessage === message) continue;
|
|
704
|
+
if (wrappedMessages === undefined) {
|
|
705
|
+
wrappedMessages = messages.slice();
|
|
706
|
+
}
|
|
707
|
+
wrappedMessages[i] = wrappedMessage;
|
|
708
|
+
}
|
|
709
|
+
return wrappedMessages ?? messages;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/** Result of filtering image blocks out of a `(TextContent | ImageContent)[]` array. */
|
|
713
|
+
interface StripContentResult {
|
|
714
|
+
content: (TextContent | ImageContent)[];
|
|
715
|
+
removed: number;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
function stripImagesFromArrayContent(content: (TextContent | ImageContent)[]): StripContentResult {
|
|
719
|
+
let removed = 0;
|
|
720
|
+
const kept: (TextContent | ImageContent)[] = [];
|
|
721
|
+
for (const part of content) {
|
|
722
|
+
if (part.type === "image") {
|
|
723
|
+
removed++;
|
|
724
|
+
} else {
|
|
725
|
+
kept.push(part);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
if (removed === 0) {
|
|
729
|
+
return { content, removed };
|
|
730
|
+
}
|
|
731
|
+
// Avoid emitting an empty `content` array — providers reject zero-block user/tool
|
|
732
|
+
// messages and the LLM still needs to see *something* where the image used to be.
|
|
733
|
+
if (kept.length === 0) {
|
|
734
|
+
kept.push({ type: "text", text: "[image removed]" });
|
|
735
|
+
}
|
|
736
|
+
return { content: kept, removed };
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* Strip image content blocks from `message` in place. Returns the count of
|
|
741
|
+
* images removed across `content` (every role that carries `ImageContent`) and
|
|
742
|
+
* any tool-result `details.images` payload. Callers MUST rewrite session
|
|
743
|
+
* entries (`SessionManager.rewriteEntries`) and replay them through
|
|
744
|
+
* `Agent.replaceMessages` afterwards so persisted state and provider-side
|
|
745
|
+
* caches stay aligned with the mutated tree — `stripImagesFromMessage` is a
|
|
746
|
+
* pure local mutation and intentionally does neither.
|
|
747
|
+
*/
|
|
748
|
+
export function stripImagesFromMessage(message: AgentMessage): number {
|
|
749
|
+
const removed = stripImagesFromMessageContent(message);
|
|
750
|
+
// The mutated message keeps its identity across context rebuilds, so drop its
|
|
751
|
+
// cached estimate/convert before the next pass counts/converts the new shape.
|
|
752
|
+
if (removed > 0) invalidateMessageCache(message);
|
|
753
|
+
return removed;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
function stripImagesFromMessageContent(message: AgentMessage): number {
|
|
757
|
+
switch (message.role) {
|
|
758
|
+
case "user":
|
|
759
|
+
case "developer":
|
|
760
|
+
case "custom":
|
|
761
|
+
case "hookMessage": {
|
|
762
|
+
if (typeof message.content === "string") return 0;
|
|
763
|
+
const { content, removed } = stripImagesFromArrayContent(message.content);
|
|
764
|
+
if (removed > 0) {
|
|
765
|
+
// All four roles type `content` as `string | (TextContent | ImageContent)[]`;
|
|
766
|
+
// TypeScript can't narrow the assignment across the union, so cast once.
|
|
767
|
+
(message as { content: typeof content }).content = content;
|
|
768
|
+
}
|
|
769
|
+
return removed;
|
|
770
|
+
}
|
|
771
|
+
case "toolResult": {
|
|
772
|
+
let removed = 0;
|
|
773
|
+
const { content, removed: contentRemoved } = stripImagesFromArrayContent(message.content);
|
|
774
|
+
if (contentRemoved > 0) {
|
|
775
|
+
message.content = content;
|
|
776
|
+
removed += contentRemoved;
|
|
777
|
+
}
|
|
778
|
+
const details = message.details as { images?: unknown } | null | undefined;
|
|
779
|
+
if (details && Array.isArray(details.images)) {
|
|
780
|
+
const original = details.images as unknown[];
|
|
781
|
+
const kept: unknown[] = [];
|
|
782
|
+
for (const candidate of original) {
|
|
783
|
+
const looksLikeImageBlock =
|
|
784
|
+
!!candidate && typeof candidate === "object" && (candidate as { type?: unknown }).type === "image";
|
|
785
|
+
if (looksLikeImageBlock) {
|
|
786
|
+
removed++;
|
|
787
|
+
} else {
|
|
788
|
+
kept.push(candidate);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (kept.length !== original.length) {
|
|
792
|
+
details.images = kept;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
return removed;
|
|
796
|
+
}
|
|
797
|
+
case "fileMention": {
|
|
798
|
+
let removed = 0;
|
|
799
|
+
for (const file of message.files) {
|
|
800
|
+
if (file.image) {
|
|
801
|
+
file.image = undefined;
|
|
802
|
+
removed++;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
return removed;
|
|
806
|
+
}
|
|
807
|
+
default:
|
|
808
|
+
return 0;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* Replace every `ImageContent` block in already-converted LLM {@link Message}s
|
|
814
|
+
* with a text placeholder, returning a new array only when something changed.
|
|
815
|
+
*
|
|
816
|
+
* Unlike {@link stripImagesFromMessage} (which mutates persisted `AgentMessage`s
|
|
817
|
+
* in place), this operates on the ephemeral provider-request view produced by
|
|
818
|
+
* {@link convertToLlm}, so history on disk keeps its images while the outbound
|
|
819
|
+
* request is scrubbed. Used to keep image blocks off the wire when the active
|
|
820
|
+
* model has no vision support (or `images.blockImages` is set) — e.g. after
|
|
821
|
+
* switching from a vision model to a text-only one mid-session (#5400).
|
|
822
|
+
*
|
|
823
|
+
* Consecutive placeholder texts collapse into one so a message that was nothing
|
|
824
|
+
* but images does not balloon into a run of identical notes.
|
|
825
|
+
*/
|
|
826
|
+
export function replaceLlmImagesWithText(messages: Message[], placeholder: string): Message[] {
|
|
827
|
+
let out: Message[] | undefined;
|
|
828
|
+
for (let i = 0; i < messages.length; i++) {
|
|
829
|
+
const msg = messages[i];
|
|
830
|
+
if (msg.role !== "user" && msg.role !== "developer" && msg.role !== "toolResult") continue;
|
|
831
|
+
const content = msg.content;
|
|
832
|
+
if (!Array.isArray(content) || !content.some(part => part.type === "image")) continue;
|
|
833
|
+
const replaced: (TextContent | ImageContent)[] = [];
|
|
834
|
+
for (const part of content) {
|
|
835
|
+
if (part.type !== "image") {
|
|
836
|
+
replaced.push(part);
|
|
837
|
+
continue;
|
|
838
|
+
}
|
|
839
|
+
const prev = replaced[replaced.length - 1];
|
|
840
|
+
if (prev?.type === "text" && prev.text === placeholder) continue;
|
|
841
|
+
replaced.push({ type: "text", text: placeholder });
|
|
842
|
+
}
|
|
843
|
+
if (out === undefined) out = messages.slice();
|
|
844
|
+
out[i] = { ...msg, content: replaced } as Message;
|
|
845
|
+
}
|
|
846
|
+
return out ?? messages;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* Message type for bash executions via the ! command.
|
|
851
|
+
*/
|
|
852
|
+
export interface BashExecutionMessage {
|
|
853
|
+
role: "bashExecution";
|
|
854
|
+
command: string;
|
|
855
|
+
output: string;
|
|
856
|
+
exitCode: number | undefined;
|
|
857
|
+
cancelled: boolean;
|
|
858
|
+
truncated: boolean;
|
|
859
|
+
meta?: OutputMeta;
|
|
860
|
+
timestamp: number;
|
|
861
|
+
/** If true, this message is excluded from LLM context (!! prefix) */
|
|
862
|
+
excludeFromContext?: boolean;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/**
|
|
866
|
+
* Message type for user-initiated Python executions via the $ command.
|
|
867
|
+
* Shares the same kernel session as eval's Python backend.
|
|
868
|
+
*/
|
|
869
|
+
export interface PythonExecutionMessage {
|
|
870
|
+
role: "pythonExecution";
|
|
871
|
+
code: string;
|
|
872
|
+
output: string;
|
|
873
|
+
exitCode: number | undefined;
|
|
874
|
+
cancelled: boolean;
|
|
875
|
+
truncated: boolean;
|
|
876
|
+
meta?: OutputMeta;
|
|
877
|
+
timestamp: number;
|
|
878
|
+
/** If true, this message is excluded from LLM context ($$ prefix) */
|
|
879
|
+
excludeFromContext?: boolean;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* Message type for extension-injected messages via sendMessage().
|
|
884
|
+
*/
|
|
885
|
+
export interface CustomMessage<T = unknown> {
|
|
886
|
+
role: "custom";
|
|
887
|
+
customType: string;
|
|
888
|
+
content: CustomMessageContent;
|
|
889
|
+
display: boolean;
|
|
890
|
+
details?: T;
|
|
891
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
892
|
+
attribution?: MessageAttribution;
|
|
893
|
+
timestamp: number;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
/**
|
|
897
|
+
* Legacy hook message type (pre-extensions). Kept for session migration.
|
|
898
|
+
*/
|
|
899
|
+
export interface HookMessage<T = unknown> {
|
|
900
|
+
role: "hookMessage";
|
|
901
|
+
customType: string;
|
|
902
|
+
content: CustomMessageContent;
|
|
903
|
+
display: boolean;
|
|
904
|
+
details?: T;
|
|
905
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
906
|
+
attribution?: MessageAttribution;
|
|
907
|
+
timestamp: number;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/**
|
|
911
|
+
* Message type for auto-read file mentions via @filepath syntax.
|
|
912
|
+
*/
|
|
913
|
+
export interface FileMentionMessage {
|
|
914
|
+
role: "fileMention";
|
|
915
|
+
files: Array<{
|
|
916
|
+
path: string;
|
|
917
|
+
content: string;
|
|
918
|
+
lineCount?: number;
|
|
919
|
+
/** File size in bytes, if known. */
|
|
920
|
+
byteSize?: number;
|
|
921
|
+
/** Why the file contents were omitted from auto-read. */
|
|
922
|
+
skippedReason?: "tooLarge" | "binary";
|
|
923
|
+
image?: ImageContent;
|
|
924
|
+
}>;
|
|
925
|
+
timestamp: number;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Extend CustomAgentMessages via declaration merging
|
|
929
|
+
// Legacy hookMessage is kept for migration; new code should use custom.
|
|
930
|
+
declare module "@oh-my-pi/pi-agent-core" {
|
|
931
|
+
interface CustomAgentMessages {
|
|
932
|
+
bashExecution: BashExecutionMessage;
|
|
933
|
+
pythonExecution: PythonExecutionMessage;
|
|
934
|
+
custom: CustomMessage;
|
|
935
|
+
hookMessage: HookMessage;
|
|
936
|
+
branchSummary: BranchSummaryMessage;
|
|
937
|
+
compactionSummary: CompactionSummaryMessage;
|
|
938
|
+
fileMention: FileMentionMessage;
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
/**
|
|
943
|
+
* Convert a BashExecutionMessage to user message text for LLM context.
|
|
944
|
+
*/
|
|
945
|
+
export function bashExecutionToText(msg: BashExecutionMessage): string {
|
|
946
|
+
let text = `Ran \`${msg.command}\`\n`;
|
|
947
|
+
if (msg.output) {
|
|
948
|
+
text += `\`\`\`\n${msg.output}\n\`\`\``;
|
|
949
|
+
} else {
|
|
950
|
+
text += "(no output)";
|
|
951
|
+
}
|
|
952
|
+
if (msg.cancelled) {
|
|
953
|
+
text += "\n\n(command cancelled)";
|
|
954
|
+
} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
|
|
955
|
+
text += `\n\nCommand exited with code ${msg.exitCode}`;
|
|
956
|
+
}
|
|
957
|
+
text += formatOutputNotice(msg.meta);
|
|
958
|
+
return text;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/**
|
|
962
|
+
* Convert a PythonExecutionMessage to user message text for LLM context.
|
|
963
|
+
*/
|
|
964
|
+
export function pythonExecutionToText(msg: PythonExecutionMessage): string {
|
|
965
|
+
let text = `Ran Python:\n\`\`\`python\n${msg.code}\n\`\`\`\n`;
|
|
966
|
+
if (msg.output) {
|
|
967
|
+
text += `Output:\n\`\`\`\n${msg.output}\n\`\`\``;
|
|
968
|
+
} else {
|
|
969
|
+
text += "(no output)";
|
|
970
|
+
}
|
|
971
|
+
if (msg.cancelled) {
|
|
972
|
+
text += "\n\n(execution cancelled)";
|
|
973
|
+
} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
|
|
974
|
+
text += `\n\nExecution failed with code ${msg.exitCode}`;
|
|
975
|
+
}
|
|
976
|
+
text += formatOutputNotice(msg.meta);
|
|
977
|
+
return text;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
export function sanitizeRehydratedOpenAIResponsesAssistantMessage(message: AssistantMessage): AssistantMessage {
|
|
981
|
+
if (message.providerPayload?.type !== "openaiResponsesHistory") {
|
|
982
|
+
return message;
|
|
983
|
+
}
|
|
984
|
+
// Only GitHub Copilot rejects replayed assistant-side native history on a
|
|
985
|
+
// warmed (resumed) session with HTTP 401 — that is the sole reason this strip
|
|
986
|
+
// exists. For every other Responses-family provider (OpenAI, OpenAI-Codex,
|
|
987
|
+
// Azure) the encrypted reasoning and native response items are self-contained
|
|
988
|
+
// and MUST survive rehydration: remote compaction replays them to rebuild
|
|
989
|
+
// faithful native history (user + assistant turns + encrypted reasoning), and
|
|
990
|
+
// same-model live turns reuse them for prompt-cache continuity. Stripping them
|
|
991
|
+
// for all providers is what left resumed sessions compacting tool-call-only
|
|
992
|
+
// history with no reasoning and no assistant prose.
|
|
993
|
+
if (message.provider !== "github-copilot") {
|
|
994
|
+
return message;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
let didSanitizeContent = false;
|
|
998
|
+
const sanitizedContent = message.content.map(block => {
|
|
999
|
+
if (block.type !== "thinking" || block.thinkingSignature === undefined) {
|
|
1000
|
+
return block;
|
|
1001
|
+
}
|
|
1002
|
+
didSanitizeContent = true;
|
|
1003
|
+
return { ...block, thinkingSignature: undefined };
|
|
1004
|
+
});
|
|
1005
|
+
|
|
1006
|
+
// Strip the assistant-side native replay payload entirely. After rehydration
|
|
1007
|
+
// it belongs to a previous live Copilot connection and replaying it on a
|
|
1008
|
+
// warmed session causes 401 rejections. User/developer payloads are preserved
|
|
1009
|
+
// separately by the caller.
|
|
1010
|
+
return {
|
|
1011
|
+
...message,
|
|
1012
|
+
...(didSanitizeContent ? { content: sanitizedContent } : {}),
|
|
1013
|
+
providerPayload: undefined,
|
|
1014
|
+
};
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
function customMessageContentToLlmContent(content: CustomMessage["content"]): (TextContent | ImageContent)[] {
|
|
1018
|
+
return typeof content === "string" ? [{ type: "text", text: content }] : content;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
function isUserInvokedSkillPrompt(message: CustomMessage): boolean {
|
|
1022
|
+
return message.customType === SKILL_PROMPT_MESSAGE_TYPE && message.attribution === "user";
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
function convertImageBearingCustomMessage(message: CustomMessage | HookMessage): Message[] | undefined {
|
|
1026
|
+
if (!isCustomMessageContent(message.content)) return undefined;
|
|
1027
|
+
if (typeof message.content === "string") return undefined;
|
|
1028
|
+
const textBlocks = message.content.filter((content): content is TextContent => content.type === "text");
|
|
1029
|
+
const imageBlocks = message.content.filter((content): content is ImageContent => content.type === "image");
|
|
1030
|
+
if (imageBlocks.length === 0) return undefined;
|
|
1031
|
+
|
|
1032
|
+
const converted: Message[] = [];
|
|
1033
|
+
if (textBlocks.length > 0) {
|
|
1034
|
+
converted.push({
|
|
1035
|
+
role: "developer",
|
|
1036
|
+
content: textBlocks,
|
|
1037
|
+
attribution: message.attribution,
|
|
1038
|
+
timestamp: message.timestamp,
|
|
1039
|
+
});
|
|
1040
|
+
}
|
|
1041
|
+
converted.push({
|
|
1042
|
+
role: "user",
|
|
1043
|
+
content: [{ type: "text", text: `Images attached to ${message.customType}.` }, ...imageBlocks],
|
|
1044
|
+
attribution: message.attribution,
|
|
1045
|
+
timestamp: message.timestamp,
|
|
1046
|
+
});
|
|
1047
|
+
return converted;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
/**
|
|
1051
|
+
* Per-message conversion result, keyed by message identity. `interruptedNext`
|
|
1052
|
+
* records the neighbor state the fragment was built against so an assistant
|
|
1053
|
+
* whose following {@link INTERRUPTED_THINKING_MESSAGE_TYPE} marker appears or
|
|
1054
|
+
* disappears is recomputed (its LLM view strips the trailing thinking run only
|
|
1055
|
+
* while that marker follows).
|
|
1056
|
+
*
|
|
1057
|
+
* WeakMap (not a symbol tag) is deliberate: `wrapSteeringForModel` and
|
|
1058
|
+
* `deobfuscateAgentMessages` spread messages into fresh variants with different
|
|
1059
|
+
* content; a symbol-keyed fragment would ride that spread and mis-convert the
|
|
1060
|
+
* copy. Identity keying keeps the cache off spread copies.
|
|
1061
|
+
*/
|
|
1062
|
+
interface ConvertMemoEntry {
|
|
1063
|
+
interruptedNext: boolean;
|
|
1064
|
+
fragment: Message[];
|
|
1065
|
+
}
|
|
1066
|
+
const convertCache = new WeakMap<AgentMessage, ConvertMemoEntry>();
|
|
1067
|
+
|
|
1068
|
+
// Array-level shortcuts over the per-message memo. The live agent mutates one
|
|
1069
|
+
// `AgentMessage[]` identity across a turn: appending new messages and swapping
|
|
1070
|
+
// the streaming tail (`context.messages[len-1] = partial → trailing`). Between
|
|
1071
|
+
// owner invalidations (prune/shake/strip bump `convertGeneration`) and for a
|
|
1072
|
+
// given array identity, only the last index is ever swapped and the array only
|
|
1073
|
+
// grows — interior prefix messages are immutable. That invariant lets two
|
|
1074
|
+
// shortcuts skip the O(N) re-walk:
|
|
1075
|
+
// - exact-repeat: same array, same length, same generation, same tail identity
|
|
1076
|
+
// → hand back the same outer array.
|
|
1077
|
+
// - slice-on-growth: same array, same generation, length grew → copy the
|
|
1078
|
+
// unchanged prefix output and reconvert only the neighbor-sensitive boundary
|
|
1079
|
+
// message plus the appended suffix.
|
|
1080
|
+
// The tail-identity guard on exact-repeat catches the streaming snapshot swap
|
|
1081
|
+
// (partial → trailing is a fresh identity), so a settled tail is never served
|
|
1082
|
+
// from a stale mid-stream fragment.
|
|
1083
|
+
let convertGeneration = 0;
|
|
1084
|
+
let lastConvertInput: AgentMessage[] | undefined;
|
|
1085
|
+
let lastConvertLength = 0;
|
|
1086
|
+
let lastConvertOutput: Message[] | undefined;
|
|
1087
|
+
let lastConvertGeneration = -1;
|
|
1088
|
+
let lastConvertTail: AgentMessage | undefined;
|
|
1089
|
+
// Output-message count contributed by messages[0 .. lastConvertLength-1), i.e.
|
|
1090
|
+
// every message except the last. The last message is neighbor-sensitive (its LLM
|
|
1091
|
+
// view drops the trailing thinking run only while an interrupted-thinking marker
|
|
1092
|
+
// follows), so growth reconverts it rather than reusing its old fragment.
|
|
1093
|
+
let lastConvertPrefixOutputLen = 0;
|
|
1094
|
+
|
|
1095
|
+
registerMessageCacheInvalidator(message => {
|
|
1096
|
+
convertCache.delete(message);
|
|
1097
|
+
convertGeneration++;
|
|
1098
|
+
});
|
|
1099
|
+
|
|
1100
|
+
/** Convert one message to its LLM fragment. `interruptedNext` is true only for an
|
|
1101
|
+
* assistant turn immediately followed by its interrupted-thinking marker. */
|
|
1102
|
+
function convertOne(m: AgentMessage, interruptedNext: boolean): Message[] {
|
|
1103
|
+
switch (m.role) {
|
|
1104
|
+
case "bashExecution":
|
|
1105
|
+
if (m.excludeFromContext) {
|
|
1106
|
+
return [];
|
|
1107
|
+
}
|
|
1108
|
+
return [
|
|
1109
|
+
{
|
|
1110
|
+
role: "user",
|
|
1111
|
+
content: [{ type: "text", text: bashExecutionToText(m) }],
|
|
1112
|
+
attribution: "user",
|
|
1113
|
+
timestamp: m.timestamp,
|
|
1114
|
+
},
|
|
1115
|
+
];
|
|
1116
|
+
case "pythonExecution":
|
|
1117
|
+
if (m.excludeFromContext) {
|
|
1118
|
+
return [];
|
|
1119
|
+
}
|
|
1120
|
+
return [
|
|
1121
|
+
{
|
|
1122
|
+
role: "user",
|
|
1123
|
+
content: [{ type: "text", text: pythonExecutionToText(m) }],
|
|
1124
|
+
attribution: "user",
|
|
1125
|
+
timestamp: m.timestamp,
|
|
1126
|
+
},
|
|
1127
|
+
];
|
|
1128
|
+
case "fileMention": {
|
|
1129
|
+
// One `fileMention` can mix `@notes.md` (text) and `@screenshot.png` (image)
|
|
1130
|
+
// in the same turn (`generateFileMentionMessages` packs every `@…` into a
|
|
1131
|
+
// single message). Splitting by image presence keeps text-only mentions on
|
|
1132
|
+
// the higher-priority `developer` slot while routing image attachments
|
|
1133
|
+
// through `user`, the only Responses content slot that legitimately accepts
|
|
1134
|
+
// `input_image` (Codex chatgpt.com /codex/responses rejects everything else
|
|
1135
|
+
// with `Invalid value: 'input_image'`, #3443).
|
|
1136
|
+
const wrap = (file: FileMentionMessage["files"][number]): string => {
|
|
1137
|
+
const inner = file.content ? `\n${file.content}\n` : "\n";
|
|
1138
|
+
return `<file path="${file.path}">${inner}</file>`;
|
|
1139
|
+
};
|
|
1140
|
+
const textFiles = m.files.filter(file => !file.image);
|
|
1141
|
+
const imageFiles = m.files.filter(file => file.image);
|
|
1142
|
+
const out: Message[] = [];
|
|
1143
|
+
if (textFiles.length > 0) {
|
|
1144
|
+
out.push({
|
|
1145
|
+
role: "developer",
|
|
1146
|
+
content: [{ type: "text" as const, text: textFiles.map(wrap).join("\n") }],
|
|
1147
|
+
attribution: "user",
|
|
1148
|
+
timestamp: m.timestamp,
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
if (imageFiles.length > 0) {
|
|
1152
|
+
const content: (TextContent | ImageContent)[] = [
|
|
1153
|
+
{ type: "text" as const, text: imageFiles.map(wrap).join("\n") },
|
|
1154
|
+
];
|
|
1155
|
+
for (const file of imageFiles) {
|
|
1156
|
+
if (file.image) content.push(file.image);
|
|
1157
|
+
}
|
|
1158
|
+
out.push({
|
|
1159
|
+
role: "user",
|
|
1160
|
+
content,
|
|
1161
|
+
attribution: "user",
|
|
1162
|
+
timestamp: m.timestamp,
|
|
1163
|
+
});
|
|
1164
|
+
}
|
|
1165
|
+
return out;
|
|
1166
|
+
}
|
|
1167
|
+
case "custom": {
|
|
1168
|
+
if (!isCustomMessageContent(m.content)) return [];
|
|
1169
|
+
if (isSteeringUserMessage(m)) {
|
|
1170
|
+
const converted = convertMessageToLlm(wrapSteeringUserMessage(m));
|
|
1171
|
+
return converted ? [converted] : [];
|
|
1172
|
+
}
|
|
1173
|
+
if (isUserInvokedSkillPrompt(m)) {
|
|
1174
|
+
return [
|
|
1175
|
+
{
|
|
1176
|
+
role: "user",
|
|
1177
|
+
content: customMessageContentToLlmContent(m.content),
|
|
1178
|
+
attribution: "user",
|
|
1179
|
+
timestamp: m.timestamp,
|
|
1180
|
+
},
|
|
1181
|
+
];
|
|
1182
|
+
}
|
|
1183
|
+
const split = convertImageBearingCustomMessage(m);
|
|
1184
|
+
if (split) return split;
|
|
1185
|
+
const converted = convertMessageToLlm(m);
|
|
1186
|
+
return converted ? [converted] : [];
|
|
1187
|
+
}
|
|
1188
|
+
case "hookMessage": {
|
|
1189
|
+
if (!isCustomMessageContent(m.content)) return [];
|
|
1190
|
+
const split = convertImageBearingCustomMessage(m);
|
|
1191
|
+
if (split) return split;
|
|
1192
|
+
const converted = convertMessageToLlm(m);
|
|
1193
|
+
return converted ? [converted] : [];
|
|
1194
|
+
}
|
|
1195
|
+
case "assistant": {
|
|
1196
|
+
// A user-interrupted turn keeps its trailing thinking run on the
|
|
1197
|
+
// persisted/displayed message so reload and display-reset rebuilds still
|
|
1198
|
+
// show it. That run is incomplete/unsigned and gets rejected on
|
|
1199
|
+
// resend, so strip it here — LLM path only — when the hidden
|
|
1200
|
+
// interrupted-thinking continuity message follows.
|
|
1201
|
+
const source = interruptedNext ? stripDemotedThinkingForLlm(m) : m;
|
|
1202
|
+
const converted = convertMessageToLlm(source);
|
|
1203
|
+
return converted ? [converted] : [];
|
|
1204
|
+
}
|
|
1205
|
+
case "branchSummary":
|
|
1206
|
+
case "compactionSummary":
|
|
1207
|
+
case "user":
|
|
1208
|
+
case "developer":
|
|
1209
|
+
case "toolResult": {
|
|
1210
|
+
// Core roles share one transformer with agent-core —
|
|
1211
|
+
// duplicating them here is how snapcompact frames once
|
|
1212
|
+
// silently fell off the provider request.
|
|
1213
|
+
const converted = convertMessageToLlm(m);
|
|
1214
|
+
return converted ? [converted] : [];
|
|
1215
|
+
}
|
|
1216
|
+
default:
|
|
1217
|
+
m satisfies never;
|
|
1218
|
+
return [];
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/** Cached per-message conversion. Reuses the stored fragment while identity and
|
|
1223
|
+
* `interruptedNext` neighbor state hold; recomputes on a neighbor flip. */
|
|
1224
|
+
function convertOneCached(m: AgentMessage, interruptedNext: boolean): Message[] {
|
|
1225
|
+
const cached = convertCache.get(m);
|
|
1226
|
+
if (cached !== undefined && cached.interruptedNext === interruptedNext) return cached.fragment;
|
|
1227
|
+
const fragment = convertOne(m, interruptedNext);
|
|
1228
|
+
convertCache.set(m, { interruptedNext, fragment });
|
|
1229
|
+
return fragment;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
/**
|
|
1233
|
+
* Transform AgentMessages (including custom types) to LLM-compatible Messages.
|
|
1234
|
+
*
|
|
1235
|
+
* This is used by:
|
|
1236
|
+
* - Agent's transormToLlm option (for prompt calls and queued messages)
|
|
1237
|
+
* - Compaction's generateSummary (for summarization)
|
|
1238
|
+
* - Custom extensions and tools
|
|
1239
|
+
*
|
|
1240
|
+
* Settled history converts once and is reused per message identity: an
|
|
1241
|
+
* append-only turn on the same array re-pays only the new suffix, and an
|
|
1242
|
+
* unchanged re-convert of the same array hands back the same outer `Message[]`.
|
|
1243
|
+
* Owner mutations (prune/shake/strip-images) invalidate the affected message
|
|
1244
|
+
* through the shared registry before the next pass.
|
|
1245
|
+
*/
|
|
1246
|
+
export function convertToLlm(messages: AgentMessage[]): Message[] {
|
|
1247
|
+
const len = messages.length;
|
|
1248
|
+
const sameArray = messages === lastConvertInput && lastConvertGeneration === convertGeneration;
|
|
1249
|
+
const tail = len > 0 ? messages[len - 1] : undefined;
|
|
1250
|
+
|
|
1251
|
+
// Exact-repeat: same array, same length, same trailing identity → reuse the
|
|
1252
|
+
// outer array. The tail-identity check rejects the streaming snapshot swap
|
|
1253
|
+
// (partial → settled trailing keeps array identity/length but mints a fresh
|
|
1254
|
+
// tail), so a settled tail never reads a stale mid-stream fragment.
|
|
1255
|
+
if (sameArray && lastConvertOutput !== undefined && len === lastConvertLength && tail === lastConvertTail) {
|
|
1256
|
+
return lastConvertOutput;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
// Slice-on-growth: same array grew by append. Every interior message is
|
|
1260
|
+
// immutable under one array identity, so copy the unchanged prefix output
|
|
1261
|
+
// (messages[0 .. lastLen-1)) and reconvert only the old boundary message
|
|
1262
|
+
// (neighbor-sensitive: a following interrupted-thinking marker may now exist)
|
|
1263
|
+
// plus the appended suffix. The boundary-identity check (old tail still sits
|
|
1264
|
+
// at its old index) rejects an in-place interior splice-replace that grew the
|
|
1265
|
+
// array while swapping earlier identities, forcing a full rebuild.
|
|
1266
|
+
let out: Message[];
|
|
1267
|
+
let start: number;
|
|
1268
|
+
if (
|
|
1269
|
+
sameArray &&
|
|
1270
|
+
lastConvertOutput !== undefined &&
|
|
1271
|
+
len > lastConvertLength &&
|
|
1272
|
+
lastConvertLength > 0 &&
|
|
1273
|
+
messages[lastConvertLength - 1] === lastConvertTail &&
|
|
1274
|
+
lastConvertPrefixOutputLen <= lastConvertOutput.length
|
|
1275
|
+
) {
|
|
1276
|
+
out = lastConvertOutput.slice(0, lastConvertPrefixOutputLen);
|
|
1277
|
+
start = lastConvertLength - 1;
|
|
1278
|
+
} else {
|
|
1279
|
+
out = [];
|
|
1280
|
+
start = 0;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
// Output length contributed by messages[0 .. len-1), captured when the loop
|
|
1284
|
+
// reaches the final index so the next growth can reuse this prefix.
|
|
1285
|
+
let prefixOutputLen = 0;
|
|
1286
|
+
for (let i = start; i < len; i++) {
|
|
1287
|
+
if (i === len - 1) prefixOutputLen = out.length;
|
|
1288
|
+
const m = messages[i];
|
|
1289
|
+
const interruptedNext = m.role === "assistant" && followedByInterruptedThinking(messages, i);
|
|
1290
|
+
const fragment = convertOneCached(m, interruptedNext);
|
|
1291
|
+
for (const msg of fragment) out.push(msg);
|
|
1292
|
+
}
|
|
1293
|
+
if (len === 0) prefixOutputLen = 0;
|
|
1294
|
+
|
|
1295
|
+
// Record for the next call's shortcuts. `out` is a fresh array (slice or new),
|
|
1296
|
+
// so a prior caller holding the previous `lastConvertOutput` never sees it grow.
|
|
1297
|
+
lastConvertInput = messages;
|
|
1298
|
+
lastConvertLength = len;
|
|
1299
|
+
lastConvertOutput = out;
|
|
1300
|
+
lastConvertGeneration = convertGeneration;
|
|
1301
|
+
lastConvertTail = tail;
|
|
1302
|
+
lastConvertPrefixOutputLen = prefixOutputLen;
|
|
1303
|
+
return out;
|
|
1304
|
+
}
|