@sns-myagent/cli 0.2.0
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 +69 -0
- package/README.md +603 -0
- package/bin/snscoder.js +98 -0
- package/package.json +117 -0
- package/scripts/apply-pi-natives-patch.js +86 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/build-binary.ts +108 -0
- package/scripts/bundle-dist.ts +117 -0
- package/scripts/cron-daily.sh +69 -0
- package/scripts/diagnose.sh +183 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/fetch-binary.mjs +359 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +56 -0
- package/scripts/generate-share-viewer.ts +36 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +42 -0
- package/scripts/omp.ts +19 -0
- package/scripts/pre-commit.sh +85 -0
- package/src/adapters/telegram/bot.ts +181 -0
- package/src/adapters/telegram/format.ts +215 -0
- package/src/adapters/telegram/handler.ts +128 -0
- package/src/adapters/telegram/index.ts +73 -0
- package/src/advisor/__tests__/advisor.test.ts +1133 -0
- package/src/advisor/advise-tool.ts +165 -0
- package/src/advisor/index.ts +4 -0
- package/src/advisor/runtime.ts +434 -0
- package/src/advisor/transcript-recorder.ts +136 -0
- package/src/advisor/watchdog.ts +83 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +674 -0
- package/src/auto-thinking/classifier.ts +190 -0
- package/src/autolearn/controller.ts +139 -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 +536 -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 +269 -0
- package/src/autoresearch/tools/log-experiment.ts +521 -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 +436 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +76 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +261 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +63 -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 +168 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +360 -0
- package/src/cli/auth-broker-cli.ts +893 -0
- package/src/cli/auth-gateway-cli.ts +608 -0
- package/src/cli/bench-cli.ts +552 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +418 -0
- package/src/cli/dry-balance-cli.ts +858 -0
- package/src/cli/entry.ts +40 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +133 -0
- package/src/cli/flag-tables.ts +322 -0
- package/src/cli/gallery-cli.ts +231 -0
- package/src/cli/gallery-fixtures/agentic.ts +407 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +194 -0
- package/src/cli/gallery-fixtures/fs.ts +220 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +49 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +250 -0
- package/src/cli/gallery-fixtures/search.ts +213 -0
- package/src/cli/gallery-fixtures/shell.ts +167 -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/grep-cli.ts +160 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/index.ts +416 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +427 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +338 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +57 -0
- package/src/cli/session-picker.ts +79 -0
- package/src/cli/setup-cli.ts +332 -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/tiny-models-cli.ts +132 -0
- package/src/cli/ttsr-cli.ts +995 -0
- package/src/cli/update-cli.ts +671 -0
- package/src/cli/usage-cli.ts +774 -0
- package/src/cli/web-search-cli.ts +132 -0
- package/src/cli/worktree-cli.ts +291 -0
- package/src/cli-commands.ts +131 -0
- package/src/cli.ts +326 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/guest.ts +602 -0
- package/src/collab/host.ts +619 -0
- package/src/collab/protocol.ts +289 -0
- package/src/collab/relay-client.ts +216 -0
- package/src/commands/acp.ts +24 -0
- package/src/commands/agents.ts +57 -0
- package/src/commands/auth-broker.ts +99 -0
- package/src/commands/auth-gateway.ts +69 -0
- package/src/commands/bench.ts +42 -0
- package/src/commands/chat.ts +24 -0
- package/src/commands/commit.ts +46 -0
- package/src/commands/complete.ts +66 -0
- package/src/commands/completions.ts +60 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +52 -0
- package/src/commands/grep.ts +48 -0
- package/src/commands/grievances.ts +51 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +39 -0
- package/src/commands/launch.ts +182 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +78 -0
- package/src/commands/read.ts +38 -0
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +67 -0
- package/src/commands/shell.ts +29 -0
- package/src/commands/ssh.ts +60 -0
- package/src/commands/stats.ts +29 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +108 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +21 -0
- package/src/commands/usage.ts +43 -0
- package/src/commands/web-search.ts +42 -0
- package/src/commands/worktree.ts +56 -0
- package/src/commit/agentic/agent.ts +318 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +355 -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 +149 -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 +81 -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 +89 -0
- package/src/commit/pipeline.ts +243 -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 +67 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +315 -0
- package/src/config/defaults.ts +55 -0
- package/src/config/file-lock.ts +164 -0
- package/src/config/index.ts +105 -0
- package/src/config/keybindings.ts +634 -0
- package/src/config/loader.ts +93 -0
- package/src/config/mcp-schema.json +238 -0
- package/src/config/model-discovery.ts +589 -0
- package/src/config/model-registry.ts +2267 -0
- package/src/config/model-resolver.ts +1819 -0
- package/src/config/model-roles.ts +99 -0
- package/src/config/models-config-schema.ts +266 -0
- package/src/config/models-config.ts +131 -0
- package/src/config/prompt-templates.ts +185 -0
- package/src/config/resolve-config-value.ts +94 -0
- package/src/config/schema.ts +139 -0
- package/src/config/settings-schema.ts +4903 -0
- package/src/config/settings.ts +1248 -0
- package/src/config/sns-config.ts +126 -0
- package/src/config.ts +242 -0
- package/src/cron/__tests__/cron-parser.test.ts +147 -0
- package/src/cron/cron-parser.ts +228 -0
- package/src/cron/cron-scheduler.ts +260 -0
- package/src/cron/cron-store.ts +275 -0
- package/src/cron/index.ts +21 -0
- package/src/cron/types.ts +65 -0
- package/src/cursor.ts +340 -0
- package/src/dap/client.ts +666 -0
- package/src/dap/config.ts +189 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1441 -0
- package/src/dap/types.ts +610 -0
- package/src/debug/index.ts +559 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +908 -0
- package/src/debug/profiler.ts +162 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +294 -0
- package/src/debug/raw-sse.ts +292 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +375 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +230 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/index.ts +56 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
- package/src/discovery/builtin-rules/rs-result-type.md +19 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
- package/src/discovery/builtin-rules/ts-import-type.md +42 -0
- package/src/discovery/builtin-rules/ts-no-any.md +65 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +44 -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 +65 -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 +934 -0
- package/src/discovery/claude-plugins.ts +386 -0
- package/src/discovery/claude.ts +584 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +522 -0
- package/src/discovery/cursor.ts +220 -0
- package/src/discovery/gemini.ts +383 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1092 -0
- package/src/discovery/index.ts +81 -0
- package/src/discovery/mcp-json.ts +172 -0
- package/src/discovery/omp-extension-roots.ts +190 -0
- package/src/discovery/omp-plugins.ts +383 -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 +29 -0
- package/src/discovery/vscode.ts +105 -0
- package/src/discovery/windsurf.ts +147 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +999 -0
- package/src/edit/file-snapshot-store.ts +143 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +290 -0
- package/src/edit/hashline/execute.ts +237 -0
- package/src/edit/hashline/filesystem.ts +138 -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 +19 -0
- package/src/edit/index.ts +620 -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 +1904 -0
- package/src/edit/modes/replace.ts +1136 -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 +819 -0
- package/src/edit/streaming.ts +517 -0
- package/src/eval/__tests__/agent-bridge.test.ts +769 -0
- package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
- package/src/eval/__tests__/budget-bridge.test.ts +69 -0
- package/src/eval/__tests__/completion-bridge.test.ts +412 -0
- package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
- package/src/eval/__tests__/idle-timeout.test.ts +80 -0
- package/src/eval/__tests__/js-context-manager.test.ts +291 -0
- package/src/eval/__tests__/julia-prelude.test.ts +77 -0
- package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
- package/src/eval/__tests__/prelude-agent.test.ts +73 -0
- package/src/eval/agent-bridge.ts +319 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +44 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +211 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +425 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +540 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +235 -0
- package/src/eval/jl/prelude.jl +930 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +634 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +621 -0
- package/src/eval/js/executor.ts +173 -0
- package/src/eval/js/index.ts +40 -0
- package/src/eval/js/shared/helpers.ts +283 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +342 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +307 -0
- package/src/eval/js/shared/rewrite-imports.ts +532 -0
- package/src/eval/js/shared/runtime.ts +580 -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 +151 -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/__tests__/prelude.test.ts +19 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +533 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +233 -0
- package/src/eval/py/prelude.py +683 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1177 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +126 -0
- package/src/eval/py/tool-bridge.ts +182 -0
- package/src/eval/rb/executor.ts +504 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +230 -0
- package/src/eval/rb/prelude.rb +721 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +474 -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 +478 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +119 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +308 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1337 -0
- package/src/export/html/template.html +49 -0
- package/src/export/html/template.js +1626 -0
- package/src/export/html/tool-views.generated.js +37 -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 +142 -0
- package/src/export/share.ts +481 -0
- package/src/export/ttsr.ts +583 -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 +268 -0
- package/src/extensibility/custom-tools/types.ts +277 -0
- package/src/extensibility/custom-tools/wrapper.ts +47 -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/loader.ts +587 -0
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +982 -0
- package/src/extensibility/extensions/types.ts +1394 -0
- package/src/extensibility/extensions/wrapper.ts +259 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +244 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +107 -0
- package/src/extensibility/hooks/types.ts +613 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +73 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +128 -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 +192 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +712 -0
- package/src/extensibility/plugins/loader.ts +458 -0
- package/src/extensibility/plugins/manager.ts +1026 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +315 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +770 -0
- package/src/extensibility/plugins/marketplace/registry.ts +196 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +191 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +105 -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 +367 -0
- package/src/extensibility/skills.ts +408 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/typebox.ts +945 -0
- package/src/extensibility/utils.ts +44 -0
- package/src/global.d.ts +57 -0
- package/src/goals/guided-setup.ts +142 -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 +623 -0
- package/src/hindsight/config.ts +175 -0
- package/src/hindsight/content.ts +226 -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 +492 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +146 -0
- package/src/internal-urls/artifact-protocol.ts +107 -0
- package/src/internal-urls/docs-index.generated.txt +2 -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 +118 -0
- package/src/internal-urls/index.ts +25 -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 +315 -0
- package/src/internal-urls/mcp-protocol.ts +151 -0
- package/src/internal-urls/memory-protocol.ts +173 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +72 -0
- package/src/internal-urls/registry-helpers.ts +25 -0
- package/src/internal-urls/router.ts +105 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/skill-protocol.ts +112 -0
- package/src/internal-urls/types.ts +152 -0
- package/src/internal-urls/vault-protocol.ts +939 -0
- package/src/irc/bus.ts +311 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/lib/xai-http.ts +124 -0
- package/src/lsp/client.ts +1135 -0
- package/src/lsp/clients/biome-client.ts +264 -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 +502 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +267 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2480 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +444 -0
- package/src/lsp/utils.ts +718 -0
- package/src/main.ts +1429 -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/mammoth.d.ts +24 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +574 -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 +509 -0
- package/src/mcp/config-writer.ts +229 -0
- package/src/mcp/config.ts +365 -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 +1346 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +467 -0
- package/src/mcp/oauth-flow.ts +555 -0
- package/src/mcp/render.ts +155 -0
- package/src/mcp/smithery-auth.ts +104 -0
- package/src/mcp/smithery-connect.ts +145 -0
- package/src/mcp/smithery-registry.ts +477 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +429 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/http.ts +519 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +622 -0
- package/src/mcp/types.ts +427 -0
- package/src/memories/index.ts +1281 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +18 -0
- package/src/memory-backend/lcm-backend.ts +385 -0
- package/src/memory-backend/local-backend.ts +45 -0
- package/src/memory-backend/mem0-backend.ts +326 -0
- package/src/memory-backend/mnemosyne-backend.ts +462 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +28 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +612 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +246 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +113 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +659 -0
- package/src/modes/acp/acp-agent.ts +2362 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +933 -0
- package/src/modes/acp/acp-mode.ts +23 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/__tests__/skill-message.test.ts +92 -0
- package/src/modes/components/advisor-message.ts +99 -0
- package/src/modes/components/agent-dashboard.ts +1183 -0
- package/src/modes/components/agent-hub.ts +570 -0
- package/src/modes/components/agent-transcript-viewer.ts +463 -0
- package/src/modes/components/assistant-message.ts +811 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +220 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +124 -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 +398 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +215 -0
- package/src/modes/components/copy-selector.ts +206 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.test.ts +164 -0
- package/src/modes/components/custom-editor.ts +648 -0
- package/src/modes/components/custom-message.ts +67 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +34 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +158 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +390 -0
- package/src/modes/components/extensions/extension-list.ts +474 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +321 -0
- package/src/modes/components/extensions/state-manager.ts +627 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +276 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +170 -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 +659 -0
- package/src/modes/components/index.ts +38 -0
- package/src/modes/components/keybinding-hints.ts +65 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +164 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1360 -0
- package/src/modes/components/message-frame.ts +92 -0
- package/src/modes/components/model-selector.ts +1378 -0
- package/src/modes/components/oauth-selector.ts +457 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/plan-review-overlay.ts +847 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +95 -0
- package/src/modes/components/plugin-settings.ts +739 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +676 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-selector.ts +629 -0
- package/src/modes/components/settings-defs.ts +225 -0
- package/src/modes/components/settings-selector.ts +1097 -0
- package/src/modes/components/show-images-selector.ts +45 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +18 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1005 -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 +616 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/token-rate.ts +66 -0
- package/src/modes/components/status-line/types.ts +125 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +52 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +24 -0
- package/src/modes/components/todo-reminder.ts +39 -0
- package/src/modes/components/tool-execution.ts +1173 -0
- package/src/modes/components/transcript-container.ts +806 -0
- package/src/modes/components/tree-selector.ts +989 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +18 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +68 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +581 -0
- package/src/modes/controllers/btw-controller.ts +198 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +1669 -0
- package/src/modes/controllers/event-controller.ts +1191 -0
- package/src/modes/controllers/extension-ui-controller.ts +897 -0
- package/src/modes/controllers/input-controller.ts +1627 -0
- package/src/modes/controllers/mcp-command-controller.ts +2190 -0
- package/src/modes/controllers/omfg-controller.ts +283 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +1293 -0
- package/src/modes/controllers/session-focus-controller.ts +112 -0
- package/src/modes/controllers/ssh-command-controller.ts +384 -0
- package/src/modes/controllers/streaming-reveal.ts +353 -0
- package/src/modes/controllers/tan-command-controller.ts +190 -0
- package/src/modes/controllers/todo-command-controller.ts +484 -0
- package/src/modes/controllers/tool-args-reveal.ts +174 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +17 -0
- package/src/modes/interactive-mode.ts +4053 -0
- package/src/modes/internal-url-autocomplete.ts +143 -0
- package/src/modes/loop-limit.ts +192 -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 +42 -0
- package/src/modes/print-mode.ts +130 -0
- package/src/modes/prompt-action-autocomplete.ts +260 -0
- package/src/modes/rpc/host-tools.ts +186 -0
- package/src/modes/rpc/host-uris.ts +235 -0
- package/src/modes/rpc/rpc-client.ts +995 -0
- package/src/modes/rpc/rpc-mode.ts +1156 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +487 -0
- package/src/modes/runtime-init.ts +142 -0
- package/src/modes/session-observer-registry.ts +215 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +101 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +114 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +103 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +286 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +326 -0
- package/src/modes/setup-wizard/scenes/types.ts +57 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +145 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +334 -0
- package/src/modes/shared.ts +49 -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 +142 -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 +142 -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 +235 -0
- package/src/modes/theme/theme-schema.json +459 -0
- package/src/modes/theme/theme.ts +2950 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +425 -0
- package/src/modes/ultrathink.ts +41 -0
- package/src/modes/utils/context-usage.ts +432 -0
- package/src/modes/utils/copy-targets.ts +361 -0
- package/src/modes/utils/hotkeys-markdown.ts +62 -0
- package/src/modes/utils/interactive-context-helpers.ts +27 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +27 -0
- package/src/modes/utils/transcript-render-helpers.ts +157 -0
- package/src/modes/utils/ui-helpers.ts +783 -0
- package/src/modes/workflow.ts +42 -0
- package/src/plan-mode/approved-plan.ts +186 -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 +45 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/system.md +75 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/explore.md +58 -0
- package/src/prompts/agents/frontmatter.md +11 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/oracle.md +54 -0
- package/src/prompts/agents/plan.md +48 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench.md +12 -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/guided-goal-interview.md +8 -0
- package/src/prompts/goals/guided-goal-system.md +12 -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 +22 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +69 -0
- package/src/prompts/steering/user-interjection.md +9 -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 +12 -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.md +3 -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/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/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +7 -0
- package/src/prompts/system/manual-continue.md +7 -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/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 +109 -0
- package/src/prompts/system/plan-mode-approved.md +25 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
- package/src/prompts/system/plan-mode-reference.md +11 -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/project-prompt.md +54 -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/subagent-system-prompt.md +71 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +12 -0
- package/src/prompts/system/system-prompt.md +250 -0
- package/src/prompts/system/tiny-title-system.md +8 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system-marker.md +16 -0
- package/src/prompts/system/title-system.md +16 -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/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +70 -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 +22 -0
- package/src/prompts/tools/ast-grep.md +25 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +44 -0
- package/src/prompts/tools/browser.md +45 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/debug.md +17 -0
- package/src/prompts/tools/eval.md +72 -0
- package/src/prompts/tools/find.md +15 -0
- package/src/prompts/tools/github.md +17 -0
- package/src/prompts/tools/goal.md +11 -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/irc.md +33 -0
- package/src/prompts/tools/job.md +17 -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 +39 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +8 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +75 -0
- package/src/prompts/tools/recall.md +5 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +29 -0
- package/src/prompts/tools/resolve.md +4 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +13 -0
- package/src/prompts/tools/search-tool-bm25.md +32 -0
- package/src/prompts/tools/search.md +22 -0
- package/src/prompts/tools/ssh.md +22 -0
- package/src/prompts/tools/task-summary.md +17 -0
- package/src/prompts/tools/task.md +91 -0
- package/src/prompts/tools/todo.md +39 -0
- package/src/prompts/tools/web-search.md +6 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +270 -0
- package/src/registry/agent-registry.ts +190 -0
- package/src/sdk.ts +2948 -0
- package/src/secrets/index.ts +123 -0
- package/src/secrets/obfuscator.ts +441 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +12886 -0
- package/src/session/agent-storage.ts +478 -0
- package/src/session/artifacts.ts +153 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +24 -0
- package/src/session/blob-store.ts +255 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +202 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/history-storage.ts +360 -0
- package/src/session/indexed-session-storage.ts +427 -0
- package/src/session/messages.ts +546 -0
- package/src/session/redis-session-storage.ts +170 -0
- package/src/session/session-context.ts +404 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +204 -0
- package/src/session/session-history-format.ts +348 -0
- package/src/session/session-listing.ts +588 -0
- package/src/session/session-loader.ts +93 -0
- package/src/session/session-manager.ts +1750 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +193 -0
- package/src/session/session-persistence.ts +147 -0
- package/src/session/session-storage.ts +590 -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 +314 -0
- package/src/session/streaming-output.ts +1330 -0
- package/src/session/tool-choice-queue.ts +290 -0
- package/src/session/unexpected-stop-classifier.ts +129 -0
- package/src/session/yield-queue.ts +183 -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 +2433 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +44 -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/cron.ts +331 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +88 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +532 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +66 -0
- package/src/slash-commands/helpers/ssh.ts +195 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +128 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +137 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +510 -0
- package/src/ssh/ssh-executor.ts +189 -0
- package/src/ssh/sshfs-mount.ts +140 -0
- package/src/ssh/utils.ts +8 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +341 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +638 -0
- package/src/stt/downloader.ts +138 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +7 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/recorder.ts +538 -0
- package/src/stt/stt-controller.ts +380 -0
- package/src/stt/transcriber.ts +60 -0
- package/src/stt/wav.ts +173 -0
- package/src/subprocess/worker-client.ts +297 -0
- package/src/subprocess/worker-runtime.ts +277 -0
- package/src/system-prompt.ts +698 -0
- package/src/task/agents.ts +166 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +122 -0
- package/src/task/executor.ts +2356 -0
- package/src/task/index.ts +1580 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +116 -0
- package/src/task/persisted-revive.ts +128 -0
- package/src/task/render.ts +1558 -0
- package/src/task/repair-args.ts +129 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +401 -0
- package/src/task/worktree.ts +522 -0
- package/src/telemetry-export.ts +144 -0
- package/src/thinking.ts +187 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/models.ts +256 -0
- package/src/tiny/text.ts +169 -0
- package/src/tiny/title-client.ts +378 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +341 -0
- package/src/tool-discovery/mode.ts +24 -0
- package/src/tool-discovery/tool-index.ts +271 -0
- package/src/tools/__tests__/json-tree.test.ts +35 -0
- package/src/tools/acp-bridge.ts +66 -0
- package/src/tools/approval.ts +189 -0
- package/src/tools/ask.ts +977 -0
- package/src/tools/ast-edit.ts +700 -0
- package/src/tools/ast-grep.ts +483 -0
- package/src/tools/auto-generated-guard.ts +322 -0
- package/src/tools/bash-command-fixup.ts +37 -0
- package/src/tools/bash-interactive.ts +408 -0
- package/src/tools/bash-interceptor.ts +67 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +248 -0
- package/src/tools/bash.ts +1405 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +103 -0
- package/src/tools/browser/attach.ts +194 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1336 -0
- package/src/tools/browser/cmux/rpc.ts +156 -0
- package/src/tools/browser/cmux/socket-client.ts +309 -0
- package/src/tools/browser/launch.ts +749 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +241 -0
- package/src/tools/browser/render.ts +221 -0
- package/src/tools/browser/tab-protocol.ts +107 -0
- package/src/tools/browser/tab-supervisor.ts +799 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1421 -0
- package/src/tools/browser.ts +408 -0
- package/src/tools/builtin-names.ts +34 -0
- package/src/tools/checkpoint.ts +136 -0
- package/src/tools/conflict-detect.ts +718 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/debug.ts +1087 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-render.ts +771 -0
- package/src/tools/eval.ts +765 -0
- package/src/tools/fetch.ts +1902 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/find.ts +628 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +255 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +481 -0
- package/src/tools/gh.ts +3752 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/image-gen.ts +1586 -0
- package/src/tools/index.ts +672 -0
- package/src/tools/inspect-image-renderer.ts +132 -0
- package/src/tools/inspect-image.ts +260 -0
- package/src/tools/irc.ts +788 -0
- package/src/tools/job.ts +612 -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 +100 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +59 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +202 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +768 -0
- package/src/tools/output-schema-validator.ts +132 -0
- package/src/tools/path-utils.ts +1116 -0
- package/src/tools/plan-mode-guard.ts +142 -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 +3124 -0
- package/src/tools/render-utils.ts +895 -0
- package/src/tools/renderers.ts +86 -0
- package/src/tools/report-tool-issue.ts +530 -0
- package/src/tools/resolve.ts +302 -0
- package/src/tools/review.ts +251 -0
- package/src/tools/search-tool-bm25.ts +351 -0
- package/src/tools/search.ts +1592 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/ssh.ts +369 -0
- package/src/tools/todo.ts +944 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +30 -0
- package/src/tools/tts.ts +265 -0
- package/src/tools/write.ts +1156 -0
- package/src/tools/yield.ts +269 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +8 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/player.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/streaming-player.ts +266 -0
- package/src/tts/tts-client.ts +474 -0
- package/src/tts/tts-protocol.ts +60 -0
- package/src/tts/tts-worker.ts +431 -0
- package/src/tts/vocalizer.ts +162 -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 +240 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +133 -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/ui/banner.ts +41 -0
- package/src/ui/chat-prompt.ts +34 -0
- package/src/ui/colors.ts +37 -0
- package/src/ui/index.ts +6 -0
- package/src/ui/spinner.ts +15 -0
- package/src/ui/status-bar.ts +57 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +132 -0
- package/src/utils/clipboard.ts +262 -0
- package/src/utils/command-args.ts +76 -0
- package/src/utils/commit-message-generator.ts +147 -0
- package/src/utils/edit-mode.ts +41 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +78 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +284 -0
- package/src/utils/git.ts +1839 -0
- package/src/utils/image-loading.ts +231 -0
- package/src/utils/image-resize.ts +309 -0
- package/src/utils/image-vision-fallback.ts +197 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +295 -0
- package/src/utils/lang-from-path.ts +244 -0
- package/src/utils/markit.ts +143 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +55 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot.ts +249 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +89 -0
- package/src/utils/title-generator.ts +348 -0
- package/src/utils/tool-choice.ts +49 -0
- package/src/utils/tools-manager.ts +372 -0
- package/src/utils/turndown.ts +83 -0
- package/src/utils/zip.ts +1091 -0
- package/src/web/kagi.ts +304 -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 +652 -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 +140 -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 +120 -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 +317 -0
- package/src/web/search/provider.ts +169 -0
- package/src/web/search/providers/anthropic.ts +343 -0
- package/src/web/search/providers/base.ts +90 -0
- package/src/web/search/providers/brave.ts +152 -0
- package/src/web/search/providers/codex.ts +593 -0
- package/src/web/search/providers/exa.ts +400 -0
- package/src/web/search/providers/gemini.ts +518 -0
- package/src/web/search/providers/jina.ts +111 -0
- package/src/web/search/providers/kagi.ts +86 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/parallel.ts +136 -0
- package/src/web/search/providers/perplexity-auth.ts +133 -0
- package/src/web/search/providers/perplexity.ts +878 -0
- package/src/web/search/providers/searxng.ts +325 -0
- package/src/web/search/providers/synthetic.ts +114 -0
- package/src/web/search/providers/tavily.ts +176 -0
- package/src/web/search/providers/utils.ts +128 -0
- package/src/web/search/providers/zai.ts +333 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +462 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +326 -0
|
@@ -0,0 +1,811 @@
|
|
|
1
|
+
import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
|
|
2
|
+
import { Container, Image, type ImageBudget, ImageProtocol, Markdown, Spacer, TERMINAL, Text } from "@oh-my-pi/pi-tui";
|
|
3
|
+
import { formatNumber } from "@oh-my-pi/pi-utils";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import type { AssistantThinkingRenderer } from "../../extensibility/extensions/types";
|
|
6
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
7
|
+
import { resolveAbortLabel, shouldRenderAbortReason } from "../../session/messages";
|
|
8
|
+
import { getPreviewLines, resolveImageOptions, TRUNCATE_LENGTHS } from "../../tools/render-utils";
|
|
9
|
+
import { canonicalizeMessage, formatThinkingForDisplay, hasDisplayableThinking } from "../../utils/thinking-display";
|
|
10
|
+
import { type CacheInvalidation, CacheInvalidationMarkerComponent } from "./cache-invalidation-marker";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Max lines of a turn-ending provider error rendered inline in the transcript.
|
|
14
|
+
* Bounds pathological error bodies — e.g. a proxy 502 whose body is a full HTML
|
|
15
|
+
* page — so they can't flood the scrollback. Blank lines are dropped and each
|
|
16
|
+
* line is width-truncated by {@link getPreviewLines}. Full text is still kept in
|
|
17
|
+
* the persisted session.
|
|
18
|
+
*/
|
|
19
|
+
const MAX_TRANSCRIPT_ERROR_LINES = 8;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A GFM table delimiter row (`| --- | :--: |`, with or without bounding pipes).
|
|
23
|
+
* The header row alone does not render a table — this delimiter is what makes
|
|
24
|
+
* Markdown lay one out, and a streaming table re-aligns its columns as rows
|
|
25
|
+
* arrive. Requires at least one column pipe so a bare thematic break (`---`)
|
|
26
|
+
* does not match.
|
|
27
|
+
*/
|
|
28
|
+
const MARKDOWN_TABLE_DELIMITER = /^ {0,3}\|?(?:[ \t]*:?-+:?[ \t]*\|)+[ \t]*:?-*:?[ \t]*$/;
|
|
29
|
+
|
|
30
|
+
/** Opening or closing fence of a code block: ≥3 backticks/tildes plus info string. */
|
|
31
|
+
const CODE_FENCE_LINE = /^ {0,3}(`{3,}|~{3,})(.*)$/;
|
|
32
|
+
|
|
33
|
+
type ThinkingContentBlock = Extract<AssistantMessage["content"][number], { type: "thinking" }>;
|
|
34
|
+
type DisplayThinkingContentBlock = ThinkingContentBlock & { rawThinking?: string };
|
|
35
|
+
|
|
36
|
+
function resolveThinkingDisplay(block: ThinkingContentBlock, proseOnly: boolean): { text: string; visible: boolean } {
|
|
37
|
+
const rawThinking = (block as DisplayThinkingContentBlock).rawThinking ?? block.thinking;
|
|
38
|
+
const formatted = formatThinkingForDisplay(block.thinking, proseOnly);
|
|
39
|
+
return {
|
|
40
|
+
text: formatted.trim(),
|
|
41
|
+
visible: hasDisplayableThinking(rawThinking, formatted),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Whether `text` currently contains reflowing Markdown whose layout is not yet
|
|
47
|
+
* permanent: an open ` ```mermaid ` fence (the diagram reshapes as source
|
|
48
|
+
* arrives) or a GFM table (columns re-align as rows arrive). Used by
|
|
49
|
+
* {@link AssistantMessageComponent.isTranscriptBlockCommitStable}.
|
|
50
|
+
*
|
|
51
|
+
* Fence-aware: a mermaid block is detected by its opener, and table delimiters
|
|
52
|
+
* inside ordinary fenced code (shell pipes, ASCII separators, doc examples) are
|
|
53
|
+
* ignored so a long streamed code block is never held out of native scrollback.
|
|
54
|
+
* A delimiter counts only directly under a pipe-bearing header row, outside any
|
|
55
|
+
* code fence.
|
|
56
|
+
*/
|
|
57
|
+
function detectLiveReflowingMarkdown(text: string): boolean {
|
|
58
|
+
let fence: string | null = null;
|
|
59
|
+
let prevLine = "";
|
|
60
|
+
for (const line of text.split("\n")) {
|
|
61
|
+
const fenceMatch = CODE_FENCE_LINE.exec(line);
|
|
62
|
+
if (fence !== null) {
|
|
63
|
+
// Inside a code block: only a bare matching closing fence ends it.
|
|
64
|
+
if (
|
|
65
|
+
fenceMatch &&
|
|
66
|
+
fenceMatch[2]!.trim() === "" &&
|
|
67
|
+
fenceMatch[1]![0] === fence[0] &&
|
|
68
|
+
fenceMatch[1]!.length >= fence.length
|
|
69
|
+
) {
|
|
70
|
+
fence = null;
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (fenceMatch) {
|
|
75
|
+
if (/^mermaid\b/.test(fenceMatch[2]!.trim())) return true;
|
|
76
|
+
fence = fenceMatch[1]!;
|
|
77
|
+
prevLine = "";
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (prevLine.includes("|") && MARKDOWN_TABLE_DELIMITER.test(line)) return true;
|
|
81
|
+
prevLine = line;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Frames for the streaming "thinking" pulse rendered in place of a hidden
|
|
88
|
+
* thinking block while the model is still producing it. A single fixed-width
|
|
89
|
+
* starburst cycles through facets (✻ ✼ ❉ ❊ ✺ ✹ ✸ ✶) so the indicator animates
|
|
90
|
+
* in place without shifting the line or the trailing speed badge. The dwell per
|
|
91
|
+
* frame eases between {@link THINKING_DOTS_FRAME_MS_MIN} and
|
|
92
|
+
* {@link THINKING_DOTS_FRAME_MS_MAX} across each revolution (see
|
|
93
|
+
* {@link AssistantMessageComponent.thinkingDotsFrameDelay}).
|
|
94
|
+
*/
|
|
95
|
+
const THINKING_DOTS_FRAMES = ["✻", "✼", "❉", "❊", "✺", "✹", "✸", "✶"] as const;
|
|
96
|
+
/**
|
|
97
|
+
* Pulse cadence bounds (ms). Each frame's dwell eases between these on a
|
|
98
|
+
* raised-cosine "breath" — quickest at the cycle start, slowest at its midpoint —
|
|
99
|
+
* so the starburst accelerates and slows instead of ticking at one fixed rate.
|
|
100
|
+
* Mean ≈ 150ms, snappier than the previous flat 320ms.
|
|
101
|
+
*/
|
|
102
|
+
const THINKING_DOTS_FRAME_MS_MIN = 70;
|
|
103
|
+
const THINKING_DOTS_FRAME_MS_MAX = 230;
|
|
104
|
+
|
|
105
|
+
/** Rolling window (ms) over which streaming-rate observations are averaged. */
|
|
106
|
+
const SPEED_WINDOW_MS = 3000;
|
|
107
|
+
/** Color/clamp ceiling: a rate at or above this maps to the full accent color. */
|
|
108
|
+
const SPEED_MAX = 200;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Session-wide streaming-speed gauge. Only one thinking indicator animates at a
|
|
112
|
+
* time, so a single shared instance accumulates instantaneous tok/s observations
|
|
113
|
+
* and reports their windowed average — smoothing the jumpy per-delta numbers.
|
|
114
|
+
* Each thinking block resets the gauge on its first live sample (see
|
|
115
|
+
* {@link AssistantMessageComponent.updateContent}) so the average reflects only
|
|
116
|
+
* the active block, never a previous turn's trailing rate. Components feed it
|
|
117
|
+
* deltas (not cumulative totals), so a fresh turn restarting its token count at
|
|
118
|
+
* zero never produces a spike.
|
|
119
|
+
*/
|
|
120
|
+
class SpeedTracker {
|
|
121
|
+
#observations: Array<{ time: number; rate: number }> = [];
|
|
122
|
+
|
|
123
|
+
#prune(now: number): void {
|
|
124
|
+
const threshold = now - SPEED_WINDOW_MS;
|
|
125
|
+
while (this.#observations.length > 0 && this.#observations[0]!.time < threshold) {
|
|
126
|
+
this.#observations.shift();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Record one instantaneous tok/s reading, clamped to {@link SPEED_MAX} so a
|
|
131
|
+
* single oversized delta (e.g. a buffered reflow tick) can't poison the
|
|
132
|
+
* windowed average. Non-finite/negative rates ignored. */
|
|
133
|
+
observe(rate: number, now = performance.now()): void {
|
|
134
|
+
if (!Number.isFinite(rate) || rate < 0) return;
|
|
135
|
+
this.#observations.push({ time: now, rate: Math.min(rate, SPEED_MAX) });
|
|
136
|
+
this.#prune(now);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Windowed-average tok/s; 0 once observations age out of the window. */
|
|
140
|
+
getSpeed(now = performance.now()): number {
|
|
141
|
+
this.#prune(now);
|
|
142
|
+
if (this.#observations.length === 0) return 0;
|
|
143
|
+
let sum = 0;
|
|
144
|
+
for (const o of this.#observations) sum += o.rate;
|
|
145
|
+
return sum / this.#observations.length;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
reset(): void {
|
|
149
|
+
this.#observations = [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** One gauge for the whole session — see {@link SpeedTracker}. */
|
|
154
|
+
const sharedSpeedTracker = new SpeedTracker();
|
|
155
|
+
|
|
156
|
+
/** Test-only: clear the shared gauge so observations don't leak across cases. */
|
|
157
|
+
export function resetThinkingSpeedTracker(): void {
|
|
158
|
+
sharedSpeedTracker.reset();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Linear-interpolate two `#rrggbb` colors in sRGB space. `t` clamps to [0,1]:
|
|
163
|
+
* `t = 0` → `from`, `t = 1` → `to`. Drives the streaming speed badge, fading
|
|
164
|
+
* from a dim gray toward the theme accent as tok/s rises.
|
|
165
|
+
*/
|
|
166
|
+
function lerpHex(from: string, to: string, t: number): string {
|
|
167
|
+
const k = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
168
|
+
const fr = Number.parseInt(from.slice(1, 3), 16);
|
|
169
|
+
const fg = Number.parseInt(from.slice(3, 5), 16);
|
|
170
|
+
const fb = Number.parseInt(from.slice(5, 7), 16);
|
|
171
|
+
const tr = Number.parseInt(to.slice(1, 3), 16);
|
|
172
|
+
const tg = Number.parseInt(to.slice(3, 5), 16);
|
|
173
|
+
const tb = Number.parseInt(to.slice(5, 7), 16);
|
|
174
|
+
const r = Math.round(fr + (tr - fr) * k);
|
|
175
|
+
const g = Math.round(fg + (tg - fg) * k);
|
|
176
|
+
const b = Math.round(fb + (tb - fb) * k);
|
|
177
|
+
return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Component that renders a complete assistant message
|
|
182
|
+
*/
|
|
183
|
+
export class AssistantMessageComponent extends Container {
|
|
184
|
+
#contentContainer: Container;
|
|
185
|
+
#markerSlot: Container;
|
|
186
|
+
#lastMessage?: AssistantMessage;
|
|
187
|
+
#toolImagesByCallId = new Map<string, ImageContent[]>();
|
|
188
|
+
#convertedKittyImages = new Map<string, ImageContent>();
|
|
189
|
+
#kittyConversionsInFlight = new Set<string>();
|
|
190
|
+
#transcriptBlockFinalized: boolean;
|
|
191
|
+
/**
|
|
192
|
+
* True while a non-finalized text item carries reflowing Markdown — a
|
|
193
|
+
* ` ```mermaid ` fence or a GFM table — whose layout re-flows every frame as
|
|
194
|
+
* source arrives (a diagram reshaping, a table re-aligning its columns), so
|
|
195
|
+
* no prefix is byte-stable until the message finalizes. See
|
|
196
|
+
* {@link isTranscriptBlockCommitStable}. Recomputed in {@link updateContent}
|
|
197
|
+
* ahead of the fast-path return, so it tracks every stream tick.
|
|
198
|
+
*/
|
|
199
|
+
#hasLiveReflowingMarkdown = false;
|
|
200
|
+
/**
|
|
201
|
+
* When true, the turn-ending `Error: …` line for `stopReason === "error"` is
|
|
202
|
+
* suppressed because the same error is currently shown in the pinned banner
|
|
203
|
+
* above the editor (see `EventController` + `ErrorBannerComponent`). Avoids
|
|
204
|
+
* rendering the identical error twice (inline + banner) at the error moment.
|
|
205
|
+
* Restored to `false` when the banner is cleared at the next turn so the
|
|
206
|
+
* transcript keeps the error in history.
|
|
207
|
+
*/
|
|
208
|
+
#errorPinned = false;
|
|
209
|
+
/**
|
|
210
|
+
* Monotonic content version reported to the transcript container via
|
|
211
|
+
* {@link getTranscriptBlockVersion}. Bumped by {@link updateContent} — the
|
|
212
|
+
* choke point every mutator funnels through, including post-finalize changes
|
|
213
|
+
* such as `setErrorPinned(false)` restoring the inline error at the next
|
|
214
|
+
* turn's `agent_start`, late tool-result images, and async Kitty conversions.
|
|
215
|
+
*/
|
|
216
|
+
#blockVersion = 0;
|
|
217
|
+
/** Whether the last updateContent carried an in-flight streaming partial; such
|
|
218
|
+
* renders bypass the markdown module LRU (see Markdown.transientRenderCache). */
|
|
219
|
+
#lastUpdateTransient = false;
|
|
220
|
+
// Fast-path state: reuse Markdown children when message shape is stable during streaming.
|
|
221
|
+
#fastPathKey: string | undefined;
|
|
222
|
+
#fastPathItems:
|
|
223
|
+
| Array<{ md: Markdown; contentIndex: number; blockType: "text" | "thinking"; lastText: string }>
|
|
224
|
+
| undefined;
|
|
225
|
+
/** Live "thinking" pulse shown in place of a hidden thinking block while it
|
|
226
|
+
* streams; undefined when not animating. Driven by {@link #thinkingDotsTimer}. */
|
|
227
|
+
#thinkingDots: Text | undefined;
|
|
228
|
+
#thinkingDotsTimer: NodeJS.Timeout | undefined;
|
|
229
|
+
#thinkingDotsFrame = 0;
|
|
230
|
+
/** Previous cumulative provider token count + timestamp, for deriving this
|
|
231
|
+
* block's instantaneous streaming rate fed into {@link sharedSpeedTracker}.
|
|
232
|
+
* Undefined until the first thinking update of this block. */
|
|
233
|
+
#lastTokenCount: number | undefined;
|
|
234
|
+
#lastTokenTime = 0;
|
|
235
|
+
/** Provider-reported tokens in the live thinking block — reasoning tokens when
|
|
236
|
+
* the provider streams them, else total output — shown dimmed beside the
|
|
237
|
+
* speed badge. 0 when no thinking is streaming. */
|
|
238
|
+
#thinkingTokens = 0;
|
|
239
|
+
/** Whether this block has observed a positive provider-token delta — i.e. it is
|
|
240
|
+
* genuinely streaming tokens right now. Gates the numeric speed badge so the
|
|
241
|
+
* session-wide {@link sharedSpeedTracker} can't surface a previous turn's rate
|
|
242
|
+
* on a fresh block that has no live token throughput of its own. */
|
|
243
|
+
#thinkingRateLive = false;
|
|
244
|
+
|
|
245
|
+
constructor(
|
|
246
|
+
message?: AssistantMessage,
|
|
247
|
+
private hideThinkingBlock = false,
|
|
248
|
+
private readonly onImageUpdate?: () => void,
|
|
249
|
+
private readonly thinkingRenderers: readonly AssistantThinkingRenderer[] = [],
|
|
250
|
+
private readonly imageBudget?: ImageBudget,
|
|
251
|
+
private proseOnlyThinking = true,
|
|
252
|
+
) {
|
|
253
|
+
super();
|
|
254
|
+
this.#transcriptBlockFinalized = message !== undefined;
|
|
255
|
+
|
|
256
|
+
// Slim cache-invalidation divider, populated above the content when this
|
|
257
|
+
// turn's request lost the prompt cache (see setCacheInvalidation).
|
|
258
|
+
this.#markerSlot = new Container();
|
|
259
|
+
this.addChild(this.#markerSlot);
|
|
260
|
+
|
|
261
|
+
// Container for text/thinking content
|
|
262
|
+
this.#contentContainer = new Container();
|
|
263
|
+
this.addChild(this.#contentContainer);
|
|
264
|
+
|
|
265
|
+
if (message) {
|
|
266
|
+
this.updateContent(message);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Show or clear the slim cache-invalidation divider above this turn. Set at
|
|
272
|
+
* `message_end` (live) or during rebuild, once the turn's usage is known and
|
|
273
|
+
* compared against the previous turn's cache footprint. Bumps the transcript
|
|
274
|
+
* block version so the change repaints even after content finalized.
|
|
275
|
+
*/
|
|
276
|
+
setCacheInvalidation(info: CacheInvalidation | undefined): void {
|
|
277
|
+
this.#markerSlot.clear();
|
|
278
|
+
if (info) {
|
|
279
|
+
this.#markerSlot.addChild(new CacheInvalidationMarkerComponent(info));
|
|
280
|
+
}
|
|
281
|
+
this.#blockVersion++;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
override invalidate(): void {
|
|
285
|
+
super.invalidate();
|
|
286
|
+
// Theme/symbol changes arrive via invalidate(). Fast-path children captured
|
|
287
|
+
// getMarkdownTheme() at construction, so drop them and force the teardown
|
|
288
|
+
// path to rebuild with the current theme. Streaming updates call
|
|
289
|
+
// updateContent() directly and keep the fast path.
|
|
290
|
+
this.#fastPathKey = undefined;
|
|
291
|
+
this.#fastPathItems = undefined;
|
|
292
|
+
if (this.#lastMessage) {
|
|
293
|
+
this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
setHideThinkingBlock(hide: boolean): void {
|
|
298
|
+
this.hideThinkingBlock = hide;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
setProseOnlyThinking(proseOnly: boolean): void {
|
|
302
|
+
this.proseOnlyThinking = proseOnly;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
override dispose(): void {
|
|
306
|
+
this.#stopThinkingAnimation();
|
|
307
|
+
super.dispose();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Whether to render the animated "thinking" pulse in place of the suppressed
|
|
312
|
+
* reasoning: only while this block is still streaming (not yet finalized — the
|
|
313
|
+
* in-flight message always carries `stopReason: "stop"`, so finalization is the
|
|
314
|
+
* only reliable live signal), thinking is hidden, no tool call has started, and
|
|
315
|
+
* the active tail block is a thinking block (the model is reasoning right now).
|
|
316
|
+
* Once text starts, a tool call streams, or the block is sealed, the pulse ends.
|
|
317
|
+
*/
|
|
318
|
+
#shouldAnimateThinking(message: AssistantMessage): boolean {
|
|
319
|
+
if (!this.hideThinkingBlock || this.#transcriptBlockFinalized) return false;
|
|
320
|
+
let tail: "text" | "thinking" | undefined;
|
|
321
|
+
for (const content of message.content) {
|
|
322
|
+
if (content.type === "toolCall") return false;
|
|
323
|
+
if (content.type === "text" && canonicalizeMessage(content.text)) tail = "text";
|
|
324
|
+
else if (content.type === "thinking" && canonicalizeMessage(content.thinking)) tail = "thinking";
|
|
325
|
+
}
|
|
326
|
+
return tail === "thinking";
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
#thinkingDotsLabel(): string {
|
|
330
|
+
const glyph = THINKING_DOTS_FRAMES[this.#thinkingDotsFrame % THINKING_DOTS_FRAMES.length] ?? "…";
|
|
331
|
+
const coloredGlyph = theme.fg("thinkingText", glyph);
|
|
332
|
+
const rate = Math.min(SPEED_MAX, sharedSpeedTracker.getSpeed());
|
|
333
|
+
// The numeric badge ("<total> · <rate> toks/s") only renders while this block
|
|
334
|
+
// is genuinely streaming provider tokens. A block that has observed no token
|
|
335
|
+
// delta (e.g. a provider that reports usage only at turn end) or whose rate
|
|
336
|
+
// has decayed to zero (a streaming lull) drops it entirely — the bare pulse
|
|
337
|
+
// keeps signalling that the model is thinking. The liveness flag also stops
|
|
338
|
+
// the session-wide gauge from leaking a previous turn's rate onto a fresh
|
|
339
|
+
// token-less block.
|
|
340
|
+
if (!this.#thinkingRateLive || rate < 0.05) return coloredGlyph;
|
|
341
|
+
// Total provider tokens, dimmed, sit next to the pulse.
|
|
342
|
+
const totalSpan = this.#thinkingTokens > 0 ? theme.fg("dim", ` ${formatNumber(this.#thinkingTokens)}`) : "";
|
|
343
|
+
// Speed badge color: dim gray at rest, brightening toward the theme accent as
|
|
344
|
+
// streaming speed climbs (gray → bright accent). Ease (sqrt) so typical
|
|
345
|
+
// mid-stream rates already read as clearly accent-tinted instead of staying
|
|
346
|
+
// gray until the rarely-hit SPEED_MAX ceiling.
|
|
347
|
+
const ratio = Math.sqrt(rate / SPEED_MAX);
|
|
348
|
+
const hex = lerpHex(theme.getColorHex("dim"), theme.getAccentColorHex(), ratio);
|
|
349
|
+
const rateText = ` · ${rate.toFixed(1)} toks/s`;
|
|
350
|
+
const rateSpan = theme.getColorMode() === "truecolor" ? chalk.hex(hex)(rateText) : theme.fg("muted", rateText);
|
|
351
|
+
return coloredGlyph + totalSpan + rateSpan;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
#startThinkingAnimation(): void {
|
|
355
|
+
if (this.#thinkingDotsTimer) return;
|
|
356
|
+
this.#scheduleThinkingFrame();
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** Eased dwell (ms) for the current pulse frame: a raised cosine over the
|
|
360
|
+
* 8-frame cycle, continuous across the wrap, so the rotation breathes rather
|
|
361
|
+
* than advancing at a fixed interval. */
|
|
362
|
+
#thinkingDotsFrameDelay(): number {
|
|
363
|
+
const phase = (1 - Math.cos((2 * Math.PI * this.#thinkingDotsFrame) / THINKING_DOTS_FRAMES.length)) / 2;
|
|
364
|
+
return THINKING_DOTS_FRAME_MS_MIN + (THINKING_DOTS_FRAME_MS_MAX - THINKING_DOTS_FRAME_MS_MIN) * phase;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Self-rescheduling timeout (not a fixed interval) so each frame can pick its
|
|
368
|
+
* own eased dwell. */
|
|
369
|
+
#scheduleThinkingFrame(): void {
|
|
370
|
+
this.#thinkingDotsTimer = setTimeout(() => this.#advanceThinkingDots(), this.#thinkingDotsFrameDelay());
|
|
371
|
+
this.#thinkingDotsTimer.unref?.();
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
#advanceThinkingDots(): void {
|
|
375
|
+
this.#thinkingDotsTimer = undefined;
|
|
376
|
+
if (!this.#thinkingDots) {
|
|
377
|
+
this.#stopThinkingAnimation();
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
this.#thinkingDotsFrame = (this.#thinkingDotsFrame + 1) % THINKING_DOTS_FRAMES.length;
|
|
381
|
+
if (this.#thinkingDots.setText(this.#thinkingDotsLabel())) {
|
|
382
|
+
this.onImageUpdate?.();
|
|
383
|
+
}
|
|
384
|
+
this.#scheduleThinkingFrame();
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
#stopThinkingAnimation(): void {
|
|
388
|
+
if (this.#thinkingDotsTimer) {
|
|
389
|
+
clearTimeout(this.#thinkingDotsTimer);
|
|
390
|
+
this.#thinkingDotsTimer = undefined;
|
|
391
|
+
}
|
|
392
|
+
this.#thinkingDotsFrame = 0;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Toggle suppression of the inline `Error: …` line while the same error is
|
|
397
|
+
* pinned in the banner above the editor. Re-renders so the change is visible.
|
|
398
|
+
*/
|
|
399
|
+
setErrorPinned(pinned: boolean): void {
|
|
400
|
+
if (this.#errorPinned === pinned) return;
|
|
401
|
+
this.#errorPinned = pinned;
|
|
402
|
+
if (this.#lastMessage) {
|
|
403
|
+
this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
isTranscriptBlockFinalized(): boolean {
|
|
408
|
+
return this.#transcriptBlockFinalized;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Whether this still-live block's scrolled-off rows may be committed to
|
|
413
|
+
* immutable native scrollback (the {@link TranscriptContainer} durable-
|
|
414
|
+
* snapshot path). Reflowing Markdown — a streaming mermaid diagram or a GFM
|
|
415
|
+
* table — re-lays-out its body as source arrives (the diagram reshapes, the
|
|
416
|
+
* table re-aligns its columns), so committing an intermediate layout strands
|
|
417
|
+
* a stale fragment in native scrollback that only a full repaint (Ctrl+L) can
|
|
418
|
+
* clear. While such content is still streaming the block therefore stays
|
|
419
|
+
* wholly in the repaintable live region and commits once, at its final
|
|
420
|
+
* layout, when the turn finalizes.
|
|
421
|
+
*/
|
|
422
|
+
isTranscriptBlockCommitStable(): boolean {
|
|
423
|
+
return this.#transcriptBlockFinalized || !this.#hasLiveReflowingMarkdown;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
getTranscriptBlockVersion(): number {
|
|
427
|
+
return this.#blockVersion;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
markTranscriptBlockFinalized(): void {
|
|
431
|
+
this.#transcriptBlockFinalized = true;
|
|
432
|
+
this.#stopThinkingAnimation();
|
|
433
|
+
// If the live pulse was on screen when the block sealed, drop the fast path
|
|
434
|
+
// and rebuild so the placeholder is removed — finalized blocks never animate.
|
|
435
|
+
if (this.#thinkingDots) {
|
|
436
|
+
this.#fastPathKey = undefined;
|
|
437
|
+
this.#fastPathItems = undefined;
|
|
438
|
+
if (this.#lastMessage) this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Render a turn-ending provider error inline. Drops blank lines, clamps the
|
|
444
|
+
* line count to {@link MAX_TRANSCRIPT_ERROR_LINES}, and width-truncates each
|
|
445
|
+
* line so a pathological body — e.g. the HTML page a proxy returns on a 502 —
|
|
446
|
+
* can't flood the transcript. Mirrors {@link ErrorBannerComponent}.
|
|
447
|
+
*/
|
|
448
|
+
#appendErrorBlock(message: string): void {
|
|
449
|
+
const lines = getPreviewLines(message, MAX_TRANSCRIPT_ERROR_LINES, TRUNCATE_LENGTHS.LINE);
|
|
450
|
+
if (lines.length === 0) lines.push("Unknown error");
|
|
451
|
+
this.#contentContainer.addChild(new Spacer(1));
|
|
452
|
+
this.#contentContainer.addChild(new Text(theme.fg("error", `Error: ${lines[0]}`), 1, 0));
|
|
453
|
+
for (const line of lines.slice(1)) {
|
|
454
|
+
this.#contentContainer.addChild(new Text(theme.fg("error", ` ${line}`), 1, 0));
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
setToolResultImages(toolCallId: string, images: ImageContent[]): void {
|
|
459
|
+
if (!toolCallId) return;
|
|
460
|
+
const validImages = images.filter(img => img.type === "image" && img.data && img.mimeType);
|
|
461
|
+
for (const key of Array.from(this.#convertedKittyImages.keys())) {
|
|
462
|
+
if (key.startsWith(`${toolCallId}:`)) {
|
|
463
|
+
this.#convertedKittyImages.delete(key);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
for (const key of Array.from(this.#kittyConversionsInFlight)) {
|
|
467
|
+
if (key.startsWith(`${toolCallId}:`)) {
|
|
468
|
+
this.#kittyConversionsInFlight.delete(key);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (validImages.length === 0) {
|
|
472
|
+
this.#toolImagesByCallId.delete(toolCallId);
|
|
473
|
+
} else {
|
|
474
|
+
this.#toolImagesByCallId.set(toolCallId, validImages);
|
|
475
|
+
this.#convertToolImagesForKitty(toolCallId, validImages);
|
|
476
|
+
}
|
|
477
|
+
if (this.#lastMessage) {
|
|
478
|
+
this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
#convertToolImagesForKitty(toolCallId: string, images: ImageContent[]): void {
|
|
483
|
+
if (TERMINAL.imageProtocol !== ImageProtocol.Kitty) return;
|
|
484
|
+
for (let index = 0; index < images.length; index++) {
|
|
485
|
+
const image = images[index];
|
|
486
|
+
if (!image || image.mimeType === "image/png") continue;
|
|
487
|
+
const key = `${toolCallId}:${index}`;
|
|
488
|
+
if (this.#convertedKittyImages.has(key) || this.#kittyConversionsInFlight.has(key)) continue;
|
|
489
|
+
this.#kittyConversionsInFlight.add(key);
|
|
490
|
+
new Bun.Image(Buffer.from(image.data, "base64"))
|
|
491
|
+
.png()
|
|
492
|
+
.toBase64()
|
|
493
|
+
.then(data => {
|
|
494
|
+
this.#kittyConversionsInFlight.delete(key);
|
|
495
|
+
this.#convertedKittyImages.set(key, {
|
|
496
|
+
type: "image",
|
|
497
|
+
data,
|
|
498
|
+
mimeType: "image/png",
|
|
499
|
+
});
|
|
500
|
+
if (this.#lastMessage) {
|
|
501
|
+
this.updateContent(this.#lastMessage, { transient: this.#lastUpdateTransient });
|
|
502
|
+
}
|
|
503
|
+
this.onImageUpdate?.();
|
|
504
|
+
})
|
|
505
|
+
.catch(() => {
|
|
506
|
+
this.#kittyConversionsInFlight.delete(key);
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
#renderToolImages(): void {
|
|
512
|
+
const imageEntries = Array.from(this.#toolImagesByCallId.entries()).flatMap(([toolCallId, images]) =>
|
|
513
|
+
images.map((image, index) => ({ image, key: `${toolCallId}:${index}` })),
|
|
514
|
+
);
|
|
515
|
+
if (imageEntries.length === 0) return;
|
|
516
|
+
|
|
517
|
+
this.#contentContainer.addChild(new Spacer(1));
|
|
518
|
+
for (const { image, key } of imageEntries) {
|
|
519
|
+
const displayImage =
|
|
520
|
+
TERMINAL.imageProtocol === ImageProtocol.Kitty && image.mimeType !== "image/png"
|
|
521
|
+
? this.#convertedKittyImages.get(key)
|
|
522
|
+
: image;
|
|
523
|
+
if (TERMINAL.imageProtocol && displayImage) {
|
|
524
|
+
this.#contentContainer.addChild(
|
|
525
|
+
new Image(
|
|
526
|
+
displayImage.data,
|
|
527
|
+
displayImage.mimeType,
|
|
528
|
+
{ fallbackColor: (text: string) => theme.fg("toolOutput", text) },
|
|
529
|
+
{ ...resolveImageOptions(), budget: this.imageBudget, imageKey: key },
|
|
530
|
+
),
|
|
531
|
+
);
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
this.#contentContainer.addChild(new Text(theme.fg("toolOutput", `[Image: ${image.mimeType}]`), 1, 0));
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
#appendThinkingExtensions(contentIndex: number, thinkingIndex: number, text: string): void {
|
|
539
|
+
for (const renderer of this.thinkingRenderers) {
|
|
540
|
+
try {
|
|
541
|
+
const component = renderer(
|
|
542
|
+
{
|
|
543
|
+
contentIndex,
|
|
544
|
+
thinkingIndex,
|
|
545
|
+
text,
|
|
546
|
+
requestRender: () => this.onImageUpdate?.(),
|
|
547
|
+
},
|
|
548
|
+
theme,
|
|
549
|
+
);
|
|
550
|
+
if (component) {
|
|
551
|
+
this.#contentContainer.addChild(component);
|
|
552
|
+
}
|
|
553
|
+
} catch {
|
|
554
|
+
// Ignore extension renderer failures and keep the original thinking block visible.
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
#computeShapeKey(message: AssistantMessage): string {
|
|
560
|
+
const parts: string[] = [`htb:${this.hideThinkingBlock ? 1 : 0}|pot:${this.proseOnlyThinking ? 1 : 0}`];
|
|
561
|
+
for (const content of message.content) {
|
|
562
|
+
if (content.type === "text") {
|
|
563
|
+
parts.push(canonicalizeMessage(content.text) ? "T1" : "T0");
|
|
564
|
+
} else if (content.type === "thinking") {
|
|
565
|
+
const display = resolveThinkingDisplay(content, this.proseOnlyThinking);
|
|
566
|
+
if (!display.visible) parts.push("K0");
|
|
567
|
+
else if (this.hideThinkingBlock) parts.push("KH");
|
|
568
|
+
else parts.push("KV");
|
|
569
|
+
} else {
|
|
570
|
+
// Non-rendered blocks (toolCall, redactedThinking, …) still occupy a
|
|
571
|
+
// content index. Encode their position so an inserted/removed one shifts
|
|
572
|
+
// the key and forces the teardown path instead of mis-indexing children.
|
|
573
|
+
parts.push(`O:${content.type}`);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return parts.join("|");
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
#canFastPath(message: AssistantMessage): boolean {
|
|
580
|
+
for (const content of message.content) {
|
|
581
|
+
if (content.type === "toolCall") return false;
|
|
582
|
+
}
|
|
583
|
+
if (this.#toolImagesByCallId.size > 0) return false;
|
|
584
|
+
if (message.stopReason === "aborted" && shouldRenderAbortReason(message.errorMessage)) return false;
|
|
585
|
+
if (message.stopReason === "error" && !this.#errorPinned) return false;
|
|
586
|
+
if (
|
|
587
|
+
message.errorMessage &&
|
|
588
|
+
shouldRenderAbortReason(message.errorMessage) &&
|
|
589
|
+
message.stopReason !== "aborted" &&
|
|
590
|
+
message.stopReason !== "error"
|
|
591
|
+
)
|
|
592
|
+
return false;
|
|
593
|
+
// Extension stability: if thinking renderers exist and any tracked thinking
|
|
594
|
+
// block's text changed, extensions may produce a different child count.
|
|
595
|
+
if (this.thinkingRenderers.length > 0 && this.#fastPathItems) {
|
|
596
|
+
for (const item of this.#fastPathItems) {
|
|
597
|
+
if (item.blockType === "thinking") {
|
|
598
|
+
const content = message.content[item.contentIndex];
|
|
599
|
+
if (content?.type === "thinking") {
|
|
600
|
+
const display = resolveThinkingDisplay(content, this.proseOnlyThinking);
|
|
601
|
+
if (display.text !== item.lastText) return false;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
#tryFastPathUpdate(message: AssistantMessage, opts?: { transient?: boolean }): boolean {
|
|
610
|
+
if (!this.#fastPathKey || !this.#fastPathItems) return false;
|
|
611
|
+
if (!this.#canFastPath(message)) {
|
|
612
|
+
this.#fastPathKey = undefined;
|
|
613
|
+
this.#fastPathItems = undefined;
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
if (this.#computeShapeKey(message) !== this.#fastPathKey) {
|
|
617
|
+
this.#fastPathKey = undefined;
|
|
618
|
+
this.#fastPathItems = undefined;
|
|
619
|
+
return false;
|
|
620
|
+
}
|
|
621
|
+
const transient = opts?.transient === true;
|
|
622
|
+
// Shape is identical — setText only on Markdown children whose source changed.
|
|
623
|
+
for (const item of this.#fastPathItems) {
|
|
624
|
+
item.md.transientRenderCache = transient;
|
|
625
|
+
const content = message.content[item.contentIndex];
|
|
626
|
+
if (!content) {
|
|
627
|
+
this.#fastPathKey = undefined;
|
|
628
|
+
this.#fastPathItems = undefined;
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
let newText: string;
|
|
632
|
+
if (item.blockType === "text" && content.type === "text") {
|
|
633
|
+
newText = content.text.trim();
|
|
634
|
+
} else if (item.blockType === "thinking" && content.type === "thinking") {
|
|
635
|
+
newText = resolveThinkingDisplay(content, this.proseOnlyThinking).text;
|
|
636
|
+
} else {
|
|
637
|
+
this.#fastPathKey = undefined;
|
|
638
|
+
this.#fastPathItems = undefined;
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
if (newText !== item.lastText) {
|
|
642
|
+
item.md.setText(newText);
|
|
643
|
+
item.lastText = newText;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
if (this.#thinkingDots) {
|
|
647
|
+
if (this.#thinkingDots.setText(this.#thinkingDotsLabel())) {
|
|
648
|
+
this.onImageUpdate?.();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
updateContent(message: AssistantMessage, opts?: { transient?: boolean }): void {
|
|
655
|
+
this.#blockVersion++;
|
|
656
|
+
this.#lastMessage = message;
|
|
657
|
+
this.#lastUpdateTransient = opts?.transient === true;
|
|
658
|
+
|
|
659
|
+
// Streaming-speed gauge: only a live, in-flight render of the single
|
|
660
|
+
// animating hidden-thinking block feeds the shared session tracker. The
|
|
661
|
+
// token count is the provider's own cumulative output — reasoning tokens when
|
|
662
|
+
// reported (Gemini's thoughtsTokenCount, OpenAI's reasoning_tokens), else
|
|
663
|
+
// total output tokens — never a character estimate, which undercounts when
|
|
664
|
+
// the provider streams a summarized reasoning trace. An instantaneous tok/s
|
|
665
|
+
// is derived from this block's delta and handed to the windowed averager.
|
|
666
|
+
// Only transient renders count: the final non-transient render at
|
|
667
|
+
// message_end carries the turn's end-of-stream usage, whose jump would spike
|
|
668
|
+
// the gauge and pollute the next block. Providers that report usage only at
|
|
669
|
+
// turn end leave the live count flat, so the rate stays 0 and the badge
|
|
670
|
+
// self-suppresses (see #thinkingDotsLabel).
|
|
671
|
+
const isThinkingNow = this.#lastUpdateTransient && this.#shouldAnimateThinking(message);
|
|
672
|
+
if (isThinkingNow) {
|
|
673
|
+
const currentTokens = message.usage.reasoningTokens ?? message.usage.output;
|
|
674
|
+
this.#thinkingTokens = currentTokens;
|
|
675
|
+
const now = performance.now();
|
|
676
|
+
if (this.#lastTokenCount !== undefined) {
|
|
677
|
+
const tokenDelta = currentTokens - this.#lastTokenCount;
|
|
678
|
+
const elapsedMs = now - this.#lastTokenTime;
|
|
679
|
+
if (tokenDelta > 0 && elapsedMs > 0) {
|
|
680
|
+
// First live sample of this block: drop the session gauge's prior-turn
|
|
681
|
+
// observations so the windowed average reflects only this block.
|
|
682
|
+
if (!this.#thinkingRateLive) sharedSpeedTracker.reset();
|
|
683
|
+
sharedSpeedTracker.observe((tokenDelta / elapsedMs) * 1000, now);
|
|
684
|
+
this.#thinkingRateLive = true;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
this.#lastTokenCount = currentTokens;
|
|
688
|
+
this.#lastTokenTime = now;
|
|
689
|
+
} else {
|
|
690
|
+
this.#lastTokenCount = undefined;
|
|
691
|
+
this.#thinkingTokens = 0;
|
|
692
|
+
this.#thinkingRateLive = false;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
// Streaming reflowing Markdown (a mermaid diagram reshaping, a GFM table
|
|
696
|
+
// re-aligning columns) re-lays-out its body each frame; see
|
|
697
|
+
// isTranscriptBlockCommitStable. Detect it from raw text — a Markdown
|
|
698
|
+
// parser only resolves these once the closing fence / delimiter row
|
|
699
|
+
// arrives, but the stale native-scrollback commits happen mid-stream.
|
|
700
|
+
this.#hasLiveReflowingMarkdown = message.content.some(
|
|
701
|
+
content => content.type === "text" && detectLiveReflowingMarkdown(content.text),
|
|
702
|
+
);
|
|
703
|
+
|
|
704
|
+
// Fast path: reuse Markdown children when shape is stable during streaming
|
|
705
|
+
if (this.#tryFastPathUpdate(message)) return;
|
|
706
|
+
|
|
707
|
+
// Clear content container
|
|
708
|
+
this.#contentContainer.clear();
|
|
709
|
+
this.#thinkingDots = undefined;
|
|
710
|
+
|
|
711
|
+
// Determine if we should capture Markdown instances for next fast path
|
|
712
|
+
const shouldCapture = this.#canFastPath(message);
|
|
713
|
+
const captureItems:
|
|
714
|
+
| Array<{ md: Markdown; contentIndex: number; blockType: "text" | "thinking"; lastText: string }>
|
|
715
|
+
| undefined = shouldCapture ? [] : undefined;
|
|
716
|
+
|
|
717
|
+
const hasVisibleContent = message.content.some(
|
|
718
|
+
c =>
|
|
719
|
+
(c.type === "text" && canonicalizeMessage(c.text)) ||
|
|
720
|
+
(!this.hideThinkingBlock &&
|
|
721
|
+
c.type === "thinking" &&
|
|
722
|
+
resolveThinkingDisplay(c, this.proseOnlyThinking).visible),
|
|
723
|
+
);
|
|
724
|
+
|
|
725
|
+
// Render content in order
|
|
726
|
+
let thinkingIndex = 0;
|
|
727
|
+
for (let i = 0; i < message.content.length; i++) {
|
|
728
|
+
const content = message.content[i];
|
|
729
|
+
if (content.type === "text" && canonicalizeMessage(content.text)) {
|
|
730
|
+
// Set paddingY=0 to avoid extra spacing before tool executions
|
|
731
|
+
const trimmed = content.text.trim();
|
|
732
|
+
const md = new Markdown(trimmed, 1, 0, getMarkdownTheme());
|
|
733
|
+
md.transientRenderCache = this.#lastUpdateTransient;
|
|
734
|
+
this.#contentContainer.addChild(md);
|
|
735
|
+
captureItems?.push({ md, contentIndex: i, blockType: "text", lastText: trimmed });
|
|
736
|
+
} else if (content.type === "thinking" && resolveThinkingDisplay(content, this.proseOnlyThinking).visible) {
|
|
737
|
+
const thinkingText = resolveThinkingDisplay(content, this.proseOnlyThinking).text;
|
|
738
|
+
if (this.hideThinkingBlock) {
|
|
739
|
+
thinkingIndex += 1;
|
|
740
|
+
continue;
|
|
741
|
+
}
|
|
742
|
+
// Add spacing only when another visible assistant content block follows.
|
|
743
|
+
// This avoids a superfluous blank line before separately-rendered tool execution blocks.
|
|
744
|
+
const hasVisibleContentAfter = message.content
|
|
745
|
+
.slice(i + 1)
|
|
746
|
+
.some(
|
|
747
|
+
c =>
|
|
748
|
+
(c.type === "text" && canonicalizeMessage(c.text)) ||
|
|
749
|
+
(c.type === "thinking" && resolveThinkingDisplay(c, this.proseOnlyThinking).visible),
|
|
750
|
+
);
|
|
751
|
+
|
|
752
|
+
// Thinking traces in thinkingText color, italic
|
|
753
|
+
const md = new Markdown(thinkingText, 1, 0, getMarkdownTheme(), {
|
|
754
|
+
color: (text: string) => theme.fg("thinkingText", text),
|
|
755
|
+
italic: true,
|
|
756
|
+
});
|
|
757
|
+
md.transientRenderCache = this.#lastUpdateTransient;
|
|
758
|
+
this.#contentContainer.addChild(md);
|
|
759
|
+
captureItems?.push({ md, contentIndex: i, blockType: "thinking", lastText: thinkingText });
|
|
760
|
+
this.#appendThinkingExtensions(i, thinkingIndex, thinkingText);
|
|
761
|
+
thinkingIndex += 1;
|
|
762
|
+
if (hasVisibleContentAfter) {
|
|
763
|
+
this.#contentContainer.addChild(new Spacer(1));
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
if (this.#shouldAnimateThinking(message)) {
|
|
769
|
+
if (hasVisibleContent) this.#contentContainer.addChild(new Spacer(1));
|
|
770
|
+
this.#thinkingDots = new Text(this.#thinkingDotsLabel(), 1, 0);
|
|
771
|
+
this.#contentContainer.addChild(this.#thinkingDots);
|
|
772
|
+
this.#startThinkingAnimation();
|
|
773
|
+
} else {
|
|
774
|
+
this.#stopThinkingAnimation();
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
this.#renderToolImages();
|
|
778
|
+
// Check if aborted - show after partial content
|
|
779
|
+
// But only if there are no tool calls (tool execution components will show the error)
|
|
780
|
+
const hasToolCalls = message.content.some(c => c.type === "toolCall");
|
|
781
|
+
if (!hasToolCalls) {
|
|
782
|
+
if (message.stopReason === "aborted" && shouldRenderAbortReason(message.errorMessage)) {
|
|
783
|
+
const abortMessage = resolveAbortLabel(message.errorMessage);
|
|
784
|
+
if (hasVisibleContent) {
|
|
785
|
+
this.#contentContainer.addChild(new Spacer(1));
|
|
786
|
+
} else {
|
|
787
|
+
this.#contentContainer.addChild(new Spacer(1));
|
|
788
|
+
}
|
|
789
|
+
this.#contentContainer.addChild(new Text(theme.fg("error", abortMessage), 1, 0));
|
|
790
|
+
} else if (message.stopReason === "error" && !this.#errorPinned) {
|
|
791
|
+
this.#appendErrorBlock(message.errorMessage || "Unknown error");
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
if (
|
|
795
|
+
message.errorMessage &&
|
|
796
|
+
shouldRenderAbortReason(message.errorMessage) &&
|
|
797
|
+
message.stopReason !== "aborted" &&
|
|
798
|
+
message.stopReason !== "error"
|
|
799
|
+
) {
|
|
800
|
+
this.#appendErrorBlock(message.errorMessage);
|
|
801
|
+
}
|
|
802
|
+
// Store fast-path state for next call
|
|
803
|
+
if (shouldCapture) {
|
|
804
|
+
this.#fastPathItems = captureItems;
|
|
805
|
+
this.#fastPathKey = this.#computeShapeKey(message);
|
|
806
|
+
} else {
|
|
807
|
+
this.#fastPathKey = undefined;
|
|
808
|
+
this.#fastPathItems = undefined;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|