@prometheus-ai/agent 0.5.3 → 0.5.8
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 +39 -0
- package/dist/cli.js +25110 -0
- package/dist/types/async/index.d.ts +0 -1
- package/dist/types/async/job-manager.d.ts +33 -0
- package/dist/types/autolearn/controller.d.ts +25 -0
- package/dist/types/autolearn/managed-skills.d.ts +45 -0
- package/dist/types/autoresearch/state.d.ts +1 -1
- package/dist/types/autoresearch/tools/init-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
- package/dist/types/autoresearch/types.d.ts +1 -1
- package/dist/types/capability/context-file.d.ts +0 -13
- package/dist/types/capability/mcp.d.ts +1 -0
- package/dist/types/capability/rule-buckets.d.ts +1 -1
- package/dist/types/capability/rule.d.ts +6 -1
- package/dist/types/capability/types.d.ts +0 -4
- package/dist/types/cli/args.d.ts +23 -3
- package/dist/types/cli/bench-cli.d.ts +78 -0
- package/dist/types/cli/claude-trace-cli.d.ts +7 -0
- package/dist/types/cli/dry-balance-cli.d.ts +16 -2
- package/dist/types/cli/gallery-cli.d.ts +43 -0
- package/dist/types/cli/gallery-fixtures/agentic.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/codeintel.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/edit.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/fs.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/index.d.ts +4 -0
- package/dist/types/cli/gallery-fixtures/interaction.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/memory.d.ts +2 -0
- package/dist/types/cli/gallery-fixtures/misc.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/search.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/shell.d.ts +3 -0
- package/dist/types/cli/gallery-fixtures/types.d.ts +55 -0
- package/dist/types/cli/gallery-fixtures/web.d.ts +2 -0
- package/dist/types/cli/gallery-screenshot.d.ts +35 -0
- package/dist/types/cli/gateway-cli.d.ts +4 -0
- package/dist/types/cli/grievances-cli.d.ts +1 -1
- package/dist/types/cli/list-models.d.ts +6 -14
- package/dist/types/cli/models-cli.d.ts +49 -0
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -1
- package/dist/types/cli/setup-model-picker.d.ts +14 -0
- package/dist/types/cli/startup-cwd.d.ts +2 -0
- package/dist/types/cli/update-cli.d.ts +13 -40
- package/dist/types/cli/usage-cli.d.ts +81 -0
- package/dist/types/cli-commands.d.ts +12 -0
- package/dist/types/collab/crypto.d.ts +7 -0
- package/dist/types/collab/guest.d.ts +37 -0
- package/dist/types/collab/host.d.ts +29 -0
- package/dist/types/collab/protocol.d.ts +119 -0
- package/dist/types/collab/relay-client.d.ts +22 -0
- package/dist/types/commands/bench.d.ts +29 -0
- package/dist/types/commands/gallery.d.ts +47 -0
- package/dist/types/commands/gateway.d.ts +3 -0
- package/dist/types/commands/install.d.ts +1 -1
- package/dist/types/commands/join.d.ts +12 -0
- package/dist/types/commands/launch.d.ts +8 -4
- package/dist/types/commands/models.d.ts +33 -0
- package/dist/types/commands/read.d.ts +1 -1
- package/dist/types/commands/say.d.ts +24 -0
- package/dist/types/commands/token.d.ts +25 -0
- package/dist/types/commands/usage.d.ts +34 -0
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
- package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
- package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
- package/dist/types/commit/analysis/conventional.d.ts +2 -2
- package/dist/types/commit/analysis/summary.d.ts +2 -2
- package/dist/types/commit/changelog/generate.d.ts +3 -3
- package/dist/types/commit/changelog/index.d.ts +2 -2
- package/dist/types/commit/map-reduce/index.d.ts +3 -3
- package/dist/types/commit/map-reduce/map-phase.d.ts +2 -2
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +2 -2
- package/dist/types/commit/model-selection.d.ts +10 -4
- package/dist/types/commit/shared-llm.d.ts +1 -1
- package/dist/types/config/api-key-resolver.d.ts +43 -0
- package/dist/types/config/append-only-context-mode.d.ts +2 -1
- package/dist/types/config/keybindings.d.ts +12 -7
- package/dist/types/config/model-discovery.d.ts +57 -0
- package/dist/types/config/model-equivalence.d.ts +1 -1
- package/dist/types/config/model-registry.d.ts +86 -222
- package/dist/types/config/model-resolver.d.ts +43 -12
- package/dist/types/config/model-roles.d.ts +29 -0
- package/dist/types/config/models-config-schema.d.ts +536 -43
- package/dist/types/config/models-config.d.ts +391 -0
- package/dist/types/config/settings-schema.d.ts +1211 -324
- package/dist/types/config/settings.d.ts +15 -3
- package/dist/types/dap/config.d.ts +14 -1
- package/dist/types/dap/types.d.ts +10 -0
- package/dist/types/debug/log-viewer.d.ts +1 -1
- package/dist/types/debug/raw-sse.d.ts +1 -1
- package/dist/types/debug/report-bundle.d.ts +3 -0
- package/dist/types/debug/terminal-info.d.ts +0 -1
- package/dist/types/discovery/at-imports.d.ts +15 -0
- package/dist/types/discovery/prometheus-extension-roots.d.ts +7 -7
- package/dist/types/edit/diff.d.ts +3 -2
- package/dist/types/edit/file-snapshot-store.d.ts +18 -0
- package/dist/types/edit/hashline/noop-loop-guard.d.ts +72 -0
- package/dist/types/edit/hashline/params.d.ts +1 -1
- package/dist/types/edit/index.d.ts +0 -1
- package/dist/types/edit/modes/apply-patch.d.ts +1 -1
- package/dist/types/edit/modes/patch.d.ts +1 -1
- package/dist/types/edit/modes/replace.d.ts +1 -1
- package/dist/types/edit/renderer.d.ts +1 -0
- package/dist/types/eval/__tests__/completion-bridge.test.d.ts +1 -0
- package/dist/types/eval/__tests__/helpers-local-roots.test.d.ts +1 -0
- package/dist/types/eval/__tests__/js-context-manager.test.d.ts +1 -0
- package/dist/types/eval/backend.d.ts +7 -2
- package/dist/types/eval/bridge-timeout.d.ts +1 -1
- package/dist/types/eval/completion-bridge.d.ts +25 -0
- package/dist/types/eval/idle-timeout.d.ts +1 -5
- package/dist/types/eval/js/context-manager.d.ts +1 -0
- package/dist/types/eval/js/executor.d.ts +2 -0
- package/dist/types/eval/js/index.d.ts +1 -1
- package/dist/types/eval/js/shared/helpers.d.ts +7 -1
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -6
- package/dist/types/eval/js/shared/runtime.d.ts +6 -1
- package/dist/types/eval/js/worker-protocol.d.ts +6 -0
- package/dist/types/eval/py/__tests__/prelude.test.d.ts +1 -0
- package/dist/types/eval/py/executor.d.ts +12 -0
- package/dist/types/eval/py/index.d.ts +1 -1
- package/dist/types/eval/py/kernel.d.ts +6 -1
- package/dist/types/eval/py/runtime.d.ts +9 -0
- package/dist/types/exa/index.d.ts +1 -19
- package/dist/types/exa/mcp-client.d.ts +10 -3
- package/dist/types/exa/types.d.ts +0 -83
- package/dist/types/exec/bash-executor.d.ts +7 -0
- package/dist/types/export/custom-share.d.ts +1 -2
- package/dist/types/export/html/index.d.ts +39 -0
- package/dist/types/export/html/template-js.d.ts +2 -0
- package/dist/types/export/share.d.ts +61 -0
- package/dist/types/export/ttsr.d.ts +14 -0
- package/dist/types/extensibility/custom-commands/types.d.ts +9 -4
- package/dist/types/extensibility/custom-tools/loader.d.ts +30 -4
- package/dist/types/extensibility/custom-tools/types.d.ts +16 -8
- package/dist/types/extensibility/extensions/index.d.ts +1 -1
- package/dist/types/extensibility/extensions/loader.d.ts +20 -1
- package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
- package/dist/types/extensibility/extensions/runner.d.ts +5 -2
- package/dist/types/extensibility/extensions/types.d.ts +72 -11
- package/dist/types/extensibility/hooks/index.d.ts +2 -1
- package/dist/types/extensibility/hooks/loader.d.ts +1 -1
- package/dist/types/extensibility/hooks/types.d.ts +11 -5
- package/dist/types/extensibility/{legacy-pi-ai-shim.d.ts → legacy-package-ai-shim.d.ts} +2 -2
- package/dist/types/extensibility/plugins/{legacy-pi-compat.d.ts → legacy-package-compat.d.ts} +20 -3
- package/dist/types/extensibility/plugins/loader.d.ts +11 -0
- package/dist/types/extensibility/plugins/marketplace-auto-update.d.ts +8 -0
- package/dist/types/extensibility/plugins/types.d.ts +2 -2
- package/dist/types/extensibility/shared-events.d.ts +3 -3
- package/dist/types/extensibility/skills.d.ts +10 -0
- package/dist/types/extensibility/slash-commands.d.ts +1 -11
- package/dist/types/gateway/adapters/telegram/access.d.ts +4 -1
- package/dist/types/gateway/adapters/telegram/setup-api.d.ts +1 -1
- package/dist/types/gateway/adapters/telegram/webhook.d.ts +1 -1
- package/dist/types/gateway/types.d.ts +1 -1
- package/dist/types/goals/guided-setup.d.ts +18 -0
- package/dist/types/goals/state.d.ts +1 -1
- package/dist/types/goals/tools/goal-tool.d.ts +1 -1
- package/dist/types/hindsight/mental-models.d.ts +17 -8
- package/dist/types/hindsight/transcript.d.ts +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal-urls/artifact-protocol.d.ts +2 -2
- package/dist/types/internal-urls/history-protocol.d.ts +14 -0
- package/dist/types/internal-urls/index.d.ts +1 -0
- package/dist/types/internal-urls/local-protocol.d.ts +14 -2
- package/dist/types/internal-urls/types.d.ts +1 -1
- package/dist/types/irc/bus.d.ts +79 -0
- package/dist/types/lib/xai-http.d.ts +1 -1
- package/dist/types/lsp/client.d.ts +10 -0
- package/dist/types/lsp/config.d.ts +2 -2
- package/dist/types/lsp/edits.d.ts +9 -0
- package/dist/types/lsp/format-options.d.ts +32 -0
- package/dist/types/lsp/index.d.ts +2 -7
- package/dist/types/lsp/types.d.ts +13 -1
- package/dist/types/lsp/utils.d.ts +6 -2
- package/dist/types/main.d.ts +23 -8
- package/dist/types/mcp/json-rpc.d.ts +5 -0
- package/dist/types/mcp/manager.d.ts +8 -0
- package/dist/types/mcp/oauth-discovery.d.ts +6 -1
- package/dist/types/mcp/oauth-flow.d.ts +13 -3
- package/dist/types/mcp/startup-events.d.ts +11 -0
- package/dist/types/mcp/tool-bridge.d.ts +2 -0
- package/dist/types/mcp/transports/stdio.d.ts +13 -0
- package/dist/types/mcp/types.d.ts +2 -0
- package/dist/types/memories/index.d.ts +7 -15
- package/dist/types/memories/storage.d.ts +0 -10
- package/dist/types/memory-backend/index.d.ts +3 -1
- package/dist/types/memory-backend/local-backend.d.ts +4 -3
- package/dist/types/memory-backend/resolve.d.ts +2 -2
- package/dist/types/memory-backend/runtime.d.ts +4 -0
- package/dist/types/memory-backend/types.d.ts +67 -2
- package/dist/types/mnemopi/config.d.ts +31 -1
- package/dist/types/mnemopi/state.d.ts +40 -2
- package/dist/types/modes/acp/acp-agent.d.ts +1 -2
- package/dist/types/modes/components/agent-dashboard.d.ts +17 -1
- package/dist/types/modes/components/agent-hub.d.ts +82 -0
- package/dist/types/modes/components/assistant-message.d.ts +5 -12
- package/dist/types/modes/components/bash-execution.d.ts +1 -1
- package/dist/types/modes/components/chat-block.d.ts +64 -0
- package/dist/types/modes/components/collab-prompt-message.d.ts +10 -0
- package/dist/types/modes/components/compaction-summary-message.d.ts +25 -5
- package/dist/types/modes/components/copy-selector.d.ts +1 -1
- package/dist/types/modes/components/custom-editor.d.ts +49 -2
- package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
- package/dist/types/modes/components/dynamic-border.d.ts +1 -1
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +1 -1
- package/dist/types/modes/components/extensions/extension-list.d.ts +1 -1
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +1 -1
- package/dist/types/modes/components/footer.d.ts +1 -1
- package/dist/types/modes/components/hook-editor.d.ts +5 -0
- package/dist/types/modes/components/hook-input.d.ts +4 -0
- package/dist/types/modes/components/hook-selector.d.ts +5 -7
- package/dist/types/modes/components/index.d.ts +1 -0
- package/dist/types/modes/components/late-diagnostics-message.d.ts +20 -0
- package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
- package/dist/types/modes/components/mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/model-selector.d.ts +1 -1
- package/dist/types/modes/components/oauth-selector.d.ts +10 -1
- package/dist/types/modes/components/overlay-box.d.ts +17 -0
- package/dist/types/modes/components/plan-review-overlay.d.ts +61 -0
- package/dist/types/modes/components/plan-toc.d.ts +41 -0
- package/dist/types/modes/components/read-tool-group.d.ts +8 -0
- package/dist/types/modes/components/reset-usage-selector.d.ts +12 -0
- package/dist/types/modes/components/segment-track.d.ts +11 -6
- package/dist/types/modes/components/session-selector.d.ts +18 -9
- package/dist/types/modes/components/settings-defs.d.ts +9 -2
- package/dist/types/modes/components/settings-selector.d.ts +17 -4
- package/dist/types/modes/components/snapcompact-shape-preview.d.ts +31 -0
- package/dist/types/modes/components/status-line/component.d.ts +61 -0
- package/dist/types/modes/components/status-line/index.d.ts +1 -0
- package/dist/types/modes/components/status-line/types.d.ts +47 -3
- package/dist/types/modes/components/tiny-title-download-progress.d.ts +1 -1
- package/dist/types/modes/components/tool-execution.d.ts +49 -2
- package/dist/types/modes/components/transcript-container.d.ts +76 -26
- package/dist/types/modes/components/tree-selector.d.ts +2 -2
- package/dist/types/modes/components/ttsr-notification.d.ts +5 -1
- package/dist/types/modes/components/usage-row.d.ts +3 -0
- package/dist/types/modes/components/user-message-selector.d.ts +1 -1
- package/dist/types/modes/components/user-message.d.ts +2 -1
- package/dist/types/modes/components/visual-truncate.d.ts +1 -1
- package/dist/types/modes/components/welcome.d.ts +12 -2
- package/dist/types/modes/controllers/command-controller.d.ts +3 -2
- package/dist/types/modes/controllers/event-controller.d.ts +7 -1
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -1
- package/dist/types/modes/controllers/input-controller.d.ts +25 -3
- package/dist/types/modes/controllers/mcp-command-controller.d.ts +8 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +5 -2
- package/dist/types/modes/controllers/session-focus-controller.d.ts +31 -0
- package/dist/types/modes/controllers/streaming-reveal.d.ts +22 -0
- package/dist/types/modes/controllers/tan-command-controller.d.ts +6 -0
- package/dist/types/modes/controllers/tool-args-reveal.d.ts +43 -0
- package/dist/types/modes/gradient-highlight.d.ts +9 -4
- package/dist/types/modes/image-references.d.ts +14 -3
- package/dist/types/modes/index.d.ts +8 -7
- package/dist/types/modes/interactive-mode.d.ts +92 -16
- package/dist/types/modes/magic-keywords.d.ts +14 -2
- package/dist/types/modes/markdown-prose.d.ts +1 -1
- package/dist/types/modes/oauth-manual-input.d.ts +7 -0
- package/dist/types/modes/rpc/rpc-client.d.ts +48 -2
- package/dist/types/modes/rpc/rpc-mode.d.ts +67 -2
- package/dist/types/modes/rpc/rpc-subagents.d.ts +24 -0
- package/dist/types/modes/rpc/rpc-types.d.ts +113 -1
- package/dist/types/modes/runtime-init.d.ts +4 -0
- package/dist/types/modes/session-observer-registry.d.ts +9 -0
- package/dist/types/modes/setup-version.d.ts +11 -0
- package/dist/types/modes/setup-wizard/index.d.ts +7 -2
- package/dist/types/modes/setup-wizard/lazy.d.ts +2 -0
- package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +4 -1
- package/dist/types/modes/setup-wizard/scenes/types.d.ts +11 -2
- package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +6 -2
- package/dist/types/modes/setup-wizard/wizard-overlay.d.ts +1 -1
- package/dist/types/modes/theme/theme.d.ts +42 -7
- package/dist/types/modes/types.d.ts +62 -13
- package/dist/types/modes/utils/context-usage.d.ts +6 -1
- package/dist/types/modes/utils/copy-targets.d.ts +21 -1
- package/dist/types/modes/utils/ui-helpers.d.ts +4 -4
- package/dist/types/modes/workflow.d.ts +3 -3
- package/dist/types/plan-mode/approved-plan.d.ts +27 -8
- package/dist/types/plan-mode/plan-protection.d.ts +4 -4
- package/dist/types/registry/agent-lifecycle.d.ts +51 -0
- package/dist/types/registry/agent-registry.d.ts +33 -5
- package/dist/types/sdk.d.ts +46 -4
- package/dist/types/secrets/index.d.ts +1 -1
- package/dist/types/secrets/obfuscator.d.ts +9 -3
- package/dist/types/session/agent-session.d.ts +136 -66
- package/dist/types/session/agent-storage.d.ts +2 -1
- package/dist/types/session/auth-broker-config.d.ts +4 -0
- package/dist/types/session/auth-storage.d.ts +1 -1
- package/dist/types/session/codex-auto-reset.d.ts +111 -0
- package/dist/types/session/indexed-session-storage.d.ts +3 -3
- package/dist/types/session/messages.d.ts +26 -15
- package/dist/types/session/session-context.d.ts +39 -0
- package/dist/types/session/session-entries.d.ts +159 -0
- package/dist/types/session/session-history-format.d.ts +12 -0
- package/dist/types/session/session-listing.d.ts +69 -0
- package/dist/types/session/session-loader.d.ts +16 -0
- package/dist/types/session/session-manager.d.ts +107 -440
- package/dist/types/session/session-migrations.d.ts +12 -0
- package/dist/types/session/session-paths.d.ts +25 -0
- package/dist/types/session/session-persistence.d.ts +8 -0
- package/dist/types/session/session-storage.d.ts +11 -7
- package/dist/types/session/snapcompact-inline.d.ts +145 -0
- package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
- package/dist/types/session/streaming-output.d.ts +46 -0
- package/dist/types/session/tool-choice-queue.d.ts +6 -6
- package/dist/types/session/yield-queue.d.ts +10 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +16 -0
- package/dist/types/slash-commands/available-commands.d.ts +34 -0
- package/dist/types/slash-commands/builtin-registry.d.ts +10 -0
- package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
- package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
- package/dist/types/slash-commands/helpers/reset-usage.d.ts +27 -0
- package/dist/types/slash-commands/helpers/stats-dashboard.d.ts +13 -0
- package/dist/types/slash-commands/types.d.ts +5 -9
- package/dist/types/ssh/connection-manager.d.ts +8 -0
- package/dist/types/stt/asr-client.d.ts +90 -0
- package/dist/types/stt/asr-protocol.d.ts +97 -0
- package/dist/types/stt/asr-worker.d.ts +2 -0
- package/dist/types/stt/downloader.d.ts +38 -0
- package/dist/types/stt/endpointer.d.ts +59 -0
- package/dist/types/stt/index.d.ts +5 -1
- package/dist/types/stt/models.d.ts +120 -0
- package/dist/types/stt/recorder.d.ts +17 -0
- package/dist/types/stt/stt-controller.d.ts +6 -0
- package/dist/types/stt/transcriber.d.ts +5 -7
- package/dist/types/stt/wav.d.ts +29 -0
- package/dist/types/system-prompt.d.ts +9 -1
- package/dist/types/task/commands.d.ts +1 -1
- package/dist/types/task/discovery.d.ts +1 -2
- package/dist/types/task/executor.d.ts +61 -2
- package/dist/types/task/index.d.ts +37 -6
- package/dist/types/task/output-manager.d.ts +0 -7
- package/dist/types/task/parallel.d.ts +2 -2
- package/dist/types/task/prometheus-command.d.ts +2 -2
- package/dist/types/task/render.d.ts +20 -7
- package/dist/types/task/repair-args.d.ts +8 -7
- package/dist/types/task/types.d.ts +109 -52
- package/dist/types/task/worktree.d.ts +2 -0
- package/dist/types/telemetry-export.d.ts +2 -2
- package/dist/types/thinking.d.ts +4 -0
- package/dist/types/tiny/models.d.ts +1 -1
- package/dist/types/tiny/title-client.d.ts +12 -1
- package/dist/types/tiny/title-protocol.d.ts +1 -0
- package/dist/types/tools/archive-reader.d.ts +5 -0
- package/dist/types/tools/ask.d.ts +6 -1
- package/dist/types/tools/ast-edit.d.ts +4 -1
- package/dist/types/tools/ast-grep.d.ts +4 -1
- package/dist/types/tools/bash.d.ts +5 -2
- package/dist/types/tools/browser/attach.d.ts +4 -4
- package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
- package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
- package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
- package/dist/types/tools/browser/registry.d.ts +17 -3
- package/dist/types/tools/browser/render.d.ts +2 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
- package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
- package/dist/types/tools/browser/tab-worker.d.ts +18 -1
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/checkpoint.d.ts +1 -1
- package/dist/types/tools/conflict-detect.d.ts +16 -0
- package/dist/types/tools/debug.d.ts +1 -1
- package/dist/types/tools/eval-render.d.ts +1 -8
- package/dist/types/tools/eval.d.ts +9 -1
- package/dist/types/tools/fetch.d.ts +17 -8
- package/dist/types/tools/find.d.ts +1 -8
- package/dist/types/tools/gh-cache-invalidation.d.ts +6 -0
- package/dist/types/tools/gh.d.ts +4 -1
- package/dist/types/tools/github-cache.d.ts +19 -0
- package/dist/types/tools/grouped-file-output.d.ts +46 -12
- package/dist/types/tools/image-gen.d.ts +1 -1
- package/dist/types/tools/index.d.ts +89 -8
- package/dist/types/tools/inspect-image.d.ts +1 -1
- package/dist/types/tools/irc.d.ts +79 -39
- package/dist/types/tools/job.d.ts +8 -2
- package/dist/types/tools/learn.d.ts +51 -0
- package/dist/types/tools/manage-skill.d.ts +40 -0
- package/dist/types/tools/memory-edit.d.ts +2 -2
- package/dist/types/tools/memory-recall.d.ts +1 -1
- package/dist/types/tools/memory-reflect.d.ts +1 -1
- package/dist/types/tools/memory-render.d.ts +4 -1
- package/dist/types/tools/memory-retain.d.ts +1 -1
- package/dist/types/tools/path-utils.d.ts +17 -5
- package/dist/types/tools/plan-mode-guard.d.ts +18 -9
- package/dist/types/tools/read.d.ts +3 -2
- package/dist/types/tools/render-mermaid.d.ts +1 -1
- package/dist/types/tools/render-utils.d.ts +47 -27
- package/dist/types/tools/renderers.d.ts +10 -2
- package/dist/types/tools/report-tool-issue.d.ts +6 -1
- package/dist/types/tools/resolve.d.ts +1 -1
- package/dist/types/tools/review.d.ts +1 -1
- package/dist/types/tools/search-tool-bm25.d.ts +1 -1
- package/dist/types/tools/search.d.ts +7 -3
- package/dist/types/tools/sqlite-reader.d.ts +4 -0
- package/dist/types/tools/ssh.d.ts +2 -1
- package/dist/types/tools/todo.d.ts +7 -15
- package/dist/types/tools/tool-result.d.ts +2 -0
- package/dist/types/tools/tool-timeouts.d.ts +1 -1
- package/dist/types/tools/tts.d.ts +26 -1
- package/dist/types/tools/write.d.ts +6 -3
- package/dist/types/tools/yield.d.ts +8 -0
- package/dist/types/tts/downloader.d.ts +20 -0
- package/dist/types/tts/index.d.ts +8 -0
- package/dist/types/tts/models.d.ts +82 -0
- package/dist/types/tts/player.d.ts +32 -0
- package/dist/types/tts/runtime.d.ts +6 -0
- package/dist/types/tts/streaming-player.d.ts +41 -0
- package/dist/types/tts/tts-client.d.ts +93 -0
- package/dist/types/tts/tts-protocol.d.ts +95 -0
- package/dist/types/tts/tts-worker.d.ts +2 -0
- package/dist/types/tts/vocalizer.d.ts +41 -0
- package/dist/types/tts/wav.d.ts +8 -0
- package/dist/types/tui/code-cell.d.ts +0 -2
- package/dist/types/tui/hyperlink.d.ts +13 -7
- package/dist/types/tui/output-block.d.ts +16 -22
- package/dist/types/tui/status-line.d.ts +3 -0
- package/dist/types/utils/block-context.d.ts +35 -0
- package/dist/types/utils/changelog.d.ts +8 -0
- package/dist/types/utils/clipboard.d.ts +4 -3
- package/dist/types/utils/enhanced-paste.d.ts +20 -0
- package/dist/types/utils/file-mentions.d.ts +7 -0
- package/dist/types/utils/git.d.ts +22 -3
- package/dist/types/utils/image-loading.d.ts +30 -1
- package/dist/types/utils/session-color.d.ts +15 -3
- package/dist/types/utils/thinking-display.d.ts +17 -0
- package/dist/types/utils/title-generator.d.ts +3 -2
- package/dist/types/utils/tool-choice.d.ts +8 -0
- package/dist/types/utils/tools-manager.d.ts +2 -1
- package/dist/types/web/kagi.d.ts +2 -2
- package/dist/types/web/parallel.d.ts +3 -0
- package/dist/types/web/scrapers/github.d.ts +22 -0
- package/dist/types/web/scrapers/readthedocs.d.ts +3 -0
- package/dist/types/web/scrapers/types.d.ts +12 -0
- package/dist/types/web/search/index.d.ts +1 -1
- package/dist/types/web/search/providers/anthropic.d.ts +2 -1
- package/dist/types/web/search/providers/base.d.ts +2 -1
- package/dist/types/web/search/providers/brave.d.ts +2 -1
- package/dist/types/web/search/providers/codex.d.ts +2 -1
- package/dist/types/web/search/providers/exa.d.ts +2 -1
- package/dist/types/web/search/providers/gemini.d.ts +10 -6
- package/dist/types/web/search/providers/jina.d.ts +7 -2
- package/dist/types/web/search/providers/kagi.d.ts +7 -2
- package/dist/types/web/search/providers/kimi.d.ts +7 -2
- package/dist/types/web/search/providers/parallel.d.ts +2 -1
- package/dist/types/web/search/providers/perplexity.d.ts +10 -2
- package/dist/types/web/search/providers/searxng.d.ts +2 -1
- package/dist/types/web/search/providers/synthetic.d.ts +7 -3
- package/dist/types/web/search/providers/tavily.d.ts +2 -1
- package/dist/types/web/search/providers/zai.d.ts +2 -1
- package/dist/types/web/search/types.d.ts +1 -1
- package/examples/extensions/api-demo.ts +2 -2
- package/package.json +41 -15
- package/scripts/bench-guard.ts +71 -0
- package/scripts/build-binary.ts +24 -25
- package/scripts/bundle-dist.ts +97 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/prometheus +42 -0
- package/scripts/prometheus.ts +20 -0
- package/src/async/index.ts +0 -1
- package/src/async/job-manager.ts +106 -3
- package/src/auto-thinking/classifier.ts +2 -1
- package/src/autolearn/controller.ts +139 -0
- package/src/autolearn/managed-skills.ts +257 -0
- package/src/autoresearch/dashboard.ts +1 -1
- package/src/autoresearch/prompt-setup.md +6 -6
- package/src/autoresearch/prompt.md +6 -6
- package/src/autoresearch/state.ts +1 -1
- package/src/autoresearch/storage.ts +2 -1
- package/src/autoresearch/tools/init-experiment.ts +1 -1
- package/src/autoresearch/tools/log-experiment.ts +1 -1
- package/src/autoresearch/tools/run-experiment.ts +1 -1
- package/src/autoresearch/tools/update-notes.ts +1 -1
- package/src/autoresearch/types.ts +1 -1
- package/src/capability/context-file.ts +0 -14
- package/src/capability/fs.ts +10 -0
- package/src/capability/index.ts +1 -6
- package/src/capability/mcp.ts +1 -0
- package/src/capability/rule-buckets.ts +4 -2
- package/src/capability/rule.ts +10 -1
- package/src/capability/types.ts +0 -4
- package/src/cli/args.ts +66 -13
- package/src/cli/auth-broker-cli.ts +6 -7
- package/src/cli/auth-gateway-cli.ts +8 -9
- package/src/cli/bench-cli.ts +437 -0
- package/src/cli/claude-trace-cli.ts +28 -50
- package/src/cli/completion-gen.ts +28 -28
- package/src/cli/dry-balance-cli.ts +56 -23
- 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/gateway-cli.ts +32 -2
- package/src/cli/grievances-cli.ts +1 -1
- package/src/cli/list-models.ts +16 -174
- package/src/cli/models-cli.ts +429 -0
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +148 -47
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/startup-cwd.ts +68 -0
- package/src/cli/update-cli.ts +144 -272
- package/src/cli/usage-cli.ts +774 -0
- package/src/cli-commands.ts +36 -0
- package/src/cli.ts +141 -32
- package/src/collab/crypto.ts +63 -0
- package/src/collab/guest.ts +451 -0
- package/src/collab/host.ts +565 -0
- package/src/collab/protocol.ts +241 -0
- package/src/collab/relay-client.ts +216 -0
- package/src/commands/bench.ts +42 -0
- package/src/commands/complete.ts +1 -1
- package/src/commands/gallery.ts +52 -0
- package/src/commands/gateway.ts +4 -0
- package/src/commands/install.ts +1 -1
- package/src/commands/join.ts +39 -0
- package/src/commands/launch.ts +8 -4
- package/src/commands/models.ts +61 -0
- package/src/commands/read.ts +6 -3
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +1 -1
- package/src/commands/token.ts +89 -0
- package/src/commands/usage.ts +43 -0
- package/src/commit/agentic/agent.ts +2 -1
- package/src/commit/agentic/tools/analyze-file.ts +42 -20
- package/src/commit/agentic/tools/git-file-diff.ts +1 -1
- package/src/commit/agentic/tools/git-hunk.ts +1 -1
- package/src/commit/agentic/tools/git-overview.ts +1 -1
- package/src/commit/agentic/tools/propose-changelog.ts +1 -1
- package/src/commit/agentic/tools/propose-commit.ts +1 -1
- package/src/commit/agentic/tools/recent-commits.ts +1 -1
- package/src/commit/agentic/tools/schemas.ts +1 -1
- package/src/commit/agentic/tools/split-commit.ts +9 -2
- package/src/commit/analysis/conventional.ts +2 -2
- package/src/commit/analysis/summary.ts +3 -3
- package/src/commit/changelog/generate.ts +3 -3
- package/src/commit/changelog/index.ts +2 -2
- package/src/commit/map-reduce/index.ts +3 -3
- package/src/commit/map-reduce/map-phase.ts +2 -2
- package/src/commit/map-reduce/reduce-phase.ts +2 -2
- package/src/commit/model-selection.ts +35 -12
- package/src/commit/pipeline.ts +4 -4
- package/src/commit/shared-llm.ts +1 -1
- package/src/config/api-key-resolver.ts +67 -0
- package/src/config/append-only-context-mode.ts +6 -12
- package/src/config/keybindings.ts +9 -4
- package/src/config/mcp-schema.json +4 -0
- package/src/config/model-discovery.ts +574 -0
- package/src/config/model-equivalence.ts +5 -4
- package/src/config/model-registry.ts +659 -1093
- package/src/config/model-resolver.ts +374 -174
- package/src/config/model-roles.ts +88 -0
- package/src/config/models-config-schema.ts +61 -9
- package/src/config/models-config.ts +130 -0
- package/src/config/settings-schema.ts +1445 -382
- package/src/config/settings.ts +261 -69
- package/src/dap/client.ts +138 -53
- package/src/dap/config.ts +41 -2
- package/src/dap/defaults.json +1 -0
- package/src/dap/session.ts +263 -161
- package/src/dap/types.ts +10 -0
- package/src/debug/index.ts +50 -60
- package/src/debug/log-viewer.ts +1 -1
- package/src/debug/protocol-probe.ts +1 -1
- package/src/debug/raw-sse-buffer.ts +7 -4
- package/src/debug/raw-sse.ts +1 -1
- package/src/debug/report-bundle.ts +9 -0
- package/src/debug/terminal-info.ts +0 -3
- package/src/discovery/agents-md.ts +25 -21
- package/src/discovery/agents.ts +9 -15
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-rules/index.ts +4 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin.ts +45 -23
- package/src/discovery/claude-plugins.ts +44 -5
- package/src/discovery/helpers.ts +50 -9
- package/src/discovery/prometheus-extension-roots.ts +10 -10
- package/src/discovery/prometheus-plugins.ts +10 -10
- package/src/edit/diff.ts +191 -4
- package/src/edit/file-snapshot-store.ts +34 -1
- package/src/edit/hashline/block-resolver.ts +20 -1
- package/src/edit/hashline/diff.ts +123 -2
- package/src/edit/hashline/execute.ts +60 -4
- package/src/edit/hashline/filesystem.ts +2 -1
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +1 -1
- package/src/edit/index.ts +47 -18
- package/src/edit/modes/apply-patch.ts +1 -1
- package/src/edit/modes/patch.ts +59 -3
- package/src/edit/modes/replace.ts +58 -24
- package/src/edit/notebook.ts +22 -2
- package/src/edit/renderer.ts +315 -151
- package/src/eval/__tests__/agent-bridge.test.ts +105 -39
- package/src/eval/__tests__/budget-bridge.test.ts +1 -1
- 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__/js-context-manager.test.ts +241 -0
- package/src/eval/__tests__/llm-bridge.test.ts +6 -4
- package/src/eval/__tests__/shared-executors.test.ts +34 -92
- package/src/eval/agent-bridge.ts +39 -23
- package/src/eval/backend.ts +15 -2
- package/src/eval/bridge-timeout.ts +1 -1
- package/src/eval/completion-bridge.ts +203 -0
- package/src/eval/idle-timeout.ts +3 -10
- package/src/eval/js/context-manager.ts +108 -31
- package/src/eval/js/executor.ts +9 -2
- package/src/eval/js/index.ts +7 -3
- package/src/eval/js/shared/helpers.ts +59 -13
- package/src/eval/js/shared/local-module-loader.ts +2 -2
- package/src/eval/js/shared/prelude.txt +167 -30
- package/src/eval/js/shared/rewrite-imports.ts +58 -34
- package/src/eval/js/shared/runtime.ts +24 -16
- package/src/eval/js/tool-bridge.ts +4 -0
- package/src/eval/js/worker-core.ts +1 -0
- package/src/eval/js/worker-entry.ts +6 -0
- package/src/eval/js/worker-protocol.ts +6 -0
- package/src/eval/llm-bridge.ts +2 -1
- package/src/eval/py/__tests__/prelude.test.ts +19 -0
- package/src/eval/py/executor.ts +70 -26
- package/src/eval/py/index.ts +13 -4
- package/src/eval/py/kernel.ts +48 -9
- package/src/eval/py/prelude.py +73 -24
- package/src/eval/py/runner.py +133 -28
- package/src/eval/py/runtime.ts +38 -1
- package/src/exa/index.ts +1 -26
- package/src/exa/mcp-client.ts +10 -10
- package/src/exa/types.ts +0 -97
- package/src/exec/bash-executor.ts +104 -7
- package/src/export/custom-share.ts +1 -1
- package/src/export/html/index.ts +119 -17
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template-js.ts +6 -0
- package/src/export/html/template.css +745 -459
- package/src/export/html/template.css.d.ts +2 -0
- package/src/export/html/template.html +6 -3
- package/src/export/html/template.js +277 -891
- package/src/export/html/tool-views.generated.d.ts +2 -0
- package/src/export/html/tool-views.generated.js +38 -0
- package/src/export/share.ts +269 -0
- package/src/export/ttsr.ts +122 -1
- package/src/extensibility/custom-commands/loader.ts +7 -4
- package/src/extensibility/custom-commands/types.ts +9 -4
- package/src/extensibility/custom-tools/loader.ts +51 -23
- package/src/extensibility/custom-tools/types.ts +16 -8
- package/src/extensibility/extensions/get-commands-handler.ts +2 -1
- package/src/extensibility/extensions/index.ts +1 -0
- package/src/extensibility/extensions/loader.ts +70 -20
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +12 -2
- package/src/extensibility/extensions/types.ts +83 -11
- package/src/extensibility/extensions/wrapper.ts +41 -5
- package/src/extensibility/hooks/index.ts +2 -1
- package/src/extensibility/hooks/loader.ts +6 -3
- package/src/extensibility/hooks/types.ts +11 -5
- package/src/extensibility/{legacy-pi-ai-shim.ts → legacy-package-ai-shim.ts} +2 -2
- package/src/extensibility/plugins/doctor.ts +1 -2
- package/src/extensibility/plugins/installer.ts +2 -2
- package/src/extensibility/plugins/{legacy-pi-compat.ts → legacy-package-compat.ts} +165 -77
- package/src/extensibility/plugins/loader.ts +34 -23
- package/src/extensibility/plugins/manager.ts +226 -95
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/types.ts +3 -3
- package/src/extensibility/shared-events.ts +3 -3
- package/src/extensibility/skills.ts +113 -9
- package/src/extensibility/slash-commands.ts +1 -97
- package/src/gateway/adapters/telegram/access.ts +39 -4
- package/src/gateway/adapters/telegram/normalize.ts +16 -1
- package/src/gateway/adapters/telegram/setup-api.ts +7 -1
- package/src/gateway/adapters/telegram/webhook.ts +26 -5
- package/src/gateway/context.ts +9 -1
- package/src/gateway/types.ts +1 -1
- package/src/goals/guided-setup.ts +133 -0
- package/src/goals/state.ts +1 -1
- package/src/goals/tools/goal-tool.ts +38 -28
- package/src/hindsight/bank.ts +17 -2
- package/src/hindsight/client.ts +27 -2
- package/src/hindsight/mental-models.ts +59 -12
- package/src/hindsight/state.ts +12 -3
- package/src/hindsight/transcript.ts +1 -1
- package/src/index.ts +5 -0
- package/src/internal-urls/artifact-protocol.ts +11 -2
- package/src/internal-urls/docs-index.generated.ts +11 -9
- package/src/internal-urls/history-protocol.ts +113 -0
- package/src/internal-urls/index.ts +1 -0
- package/src/internal-urls/issue-pr-protocol.ts +22 -9
- package/src/internal-urls/local-protocol.ts +42 -7
- package/src/internal-urls/memory-protocol.ts +4 -31
- package/src/internal-urls/router.ts +3 -1
- package/src/internal-urls/types.ts +1 -1
- package/src/irc/bus.ts +303 -0
- package/src/lib/xai-http.ts +3 -3
- package/src/lsp/client.ts +245 -104
- package/src/lsp/clients/biome-client.ts +101 -39
- package/src/lsp/clients/lsp-linter-client.ts +2 -10
- package/src/lsp/config.ts +15 -5
- package/src/lsp/defaults.json +6 -0
- package/src/lsp/edits.ts +143 -95
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +233 -93
- package/src/lsp/render.ts +11 -35
- package/src/lsp/types.ts +13 -1
- package/src/lsp/utils.ts +31 -12
- package/src/main.ts +396 -216
- package/src/mcp/config-writer.ts +7 -3
- package/src/mcp/json-rpc.ts +35 -5
- package/src/mcp/manager.ts +31 -16
- package/src/mcp/oauth-discovery.ts +34 -4
- package/src/mcp/oauth-flow.ts +61 -8
- package/src/mcp/render.ts +7 -1
- package/src/mcp/startup-events.ts +21 -0
- package/src/mcp/tool-bridge.ts +2 -0
- package/src/mcp/transports/stdio.ts +224 -4
- package/src/mcp/types.ts +2 -0
- package/src/memories/index.ts +174 -1128
- package/src/memories/storage.ts +2 -41
- package/src/memory-backend/index.ts +14 -1
- package/src/memory-backend/local-backend.ts +18 -3
- package/src/memory-backend/off-backend.ts +9 -0
- package/src/memory-backend/resolve.ts +4 -6
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/types.ts +82 -2
- package/src/mnemopi/backend.ts +220 -28
- package/src/mnemopi/config.ts +138 -33
- package/src/mnemopi/state.ts +91 -11
- package/src/modes/acp/acp-agent.ts +149 -142
- package/src/modes/acp/acp-event-mapper.ts +5 -1
- package/src/modes/components/agent-dashboard.ts +17 -11
- package/src/modes/components/agent-hub.ts +1346 -0
- package/src/modes/components/assistant-message.ts +190 -80
- package/src/modes/components/bash-execution.ts +1 -1
- package/src/modes/components/btw-panel.ts +5 -1
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/collab-prompt-message.ts +30 -0
- package/src/modes/components/compaction-summary-message.ts +168 -33
- package/src/modes/components/copy-selector.ts +2 -45
- package/src/modes/components/custom-editor.test.ts +96 -0
- package/src/modes/components/custom-editor.ts +405 -118
- package/src/modes/components/custom-message.ts +1 -3
- package/src/modes/components/diff.ts +13 -2
- package/src/modes/components/dynamic-border.ts +12 -3
- package/src/modes/components/execution-shared.ts +1 -2
- package/src/modes/components/extensions/extension-dashboard.ts +8 -5
- package/src/modes/components/extensions/extension-list.ts +1 -1
- package/src/modes/components/extensions/inspector-panel.ts +7 -3
- package/src/modes/components/extensions/state-manager.ts +36 -41
- package/src/modes/components/footer.ts +4 -2
- package/src/modes/components/history-search.ts +1 -1
- package/src/modes/components/hook-editor.ts +8 -0
- package/src/modes/components/hook-input.ts +8 -0
- package/src/modes/components/hook-message.ts +1 -3
- package/src/modes/components/hook-selector.ts +6 -7
- package/src/modes/components/index.ts +1 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +1 -1
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +14 -1
- package/src/modes/components/model-selector.ts +177 -75
- package/src/modes/components/oauth-selector.ts +102 -16
- package/src/modes/components/overlay-box.ts +108 -0
- package/src/modes/components/plan-review-overlay.ts +845 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-settings.ts +22 -5
- package/src/modes/components/read-tool-group.ts +442 -39
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +44 -7
- package/src/modes/components/session-selector.ts +97 -37
- package/src/modes/components/settings-defs.ts +28 -6
- package/src/modes/components/settings-selector.ts +541 -93
- package/src/modes/components/skill-message.ts +0 -1
- package/src/modes/components/snapcompact-shape-preview-doc.md +11 -0
- package/src/modes/components/snapcompact-shape-preview.ts +193 -0
- package/src/modes/components/{status-line.ts → status-line/component.ts} +205 -168
- package/src/modes/components/status-line/index.ts +1 -0
- package/src/modes/components/status-line/presets.ts +3 -3
- package/src/modes/components/status-line/segments.ts +26 -7
- package/src/modes/components/status-line/types.ts +40 -9
- package/src/modes/components/tiny-title-download-progress.ts +1 -1
- package/src/modes/components/tips.txt +7 -3
- package/src/modes/components/todo-reminder.ts +0 -2
- package/src/modes/components/tool-execution.ts +236 -103
- package/src/modes/components/transcript-container.ts +724 -99
- package/src/modes/components/tree-selector.ts +19 -4
- package/src/modes/components/ttsr-notification.ts +72 -30
- package/src/modes/components/usage-row.ts +18 -0
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +28 -12
- package/src/modes/components/visual-truncate.ts +1 -1
- package/src/modes/components/welcome.ts +80 -22
- package/src/modes/controllers/command-controller-shared.ts +7 -6
- package/src/modes/controllers/command-controller.ts +210 -180
- package/src/modes/controllers/event-controller.ts +352 -142
- package/src/modes/controllers/extension-ui-controller.ts +167 -208
- package/src/modes/controllers/input-controller.ts +778 -162
- package/src/modes/controllers/mcp-command-controller.ts +232 -80
- package/src/modes/controllers/selector-controller.ts +284 -145
- package/src/modes/controllers/session-focus-controller.ts +112 -0
- package/src/modes/controllers/ssh-command-controller.ts +2 -2
- package/src/modes/controllers/streaming-reveal.ts +295 -0
- package/src/modes/controllers/tan-command-controller.ts +173 -0
- package/src/modes/controllers/tool-args-reveal.ts +174 -0
- package/src/modes/gradient-highlight.ts +21 -9
- package/src/modes/image-references.ts +33 -7
- package/src/modes/index.ts +8 -25
- package/src/modes/interactive-mode.ts +840 -186
- package/src/modes/magic-keywords.ts +28 -6
- package/src/modes/markdown-prose.ts +1 -1
- package/src/modes/oauth-manual-input.ts +30 -3
- package/src/modes/rpc/rpc-client.ts +186 -3
- package/src/modes/rpc/rpc-mode.ts +318 -24
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +111 -2
- package/src/modes/runtime-init.ts +28 -3
- package/src/modes/session-observer-registry.ts +72 -3
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +16 -4
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +25 -7
- package/src/modes/setup-wizard/scenes/providers.ts +45 -12
- package/src/modes/setup-wizard/scenes/sign-in.ts +14 -13
- package/src/modes/setup-wizard/scenes/splash.ts +1 -1
- package/src/modes/setup-wizard/scenes/telegram.ts +77 -22
- package/src/modes/setup-wizard/scenes/theme.ts +29 -2
- package/src/modes/setup-wizard/scenes/types.ts +11 -2
- package/src/modes/setup-wizard/scenes/web-search.ts +26 -9
- package/src/modes/setup-wizard/wizard-overlay.ts +40 -3
- package/src/modes/shared.ts +2 -0
- package/src/modes/theme/defaults/dark-poimandres.json +1 -1
- package/src/modes/theme/defaults/light-poimandres.json +1 -1
- package/src/modes/theme/shimmer.ts +20 -9
- package/src/modes/theme/theme-schema.json +1 -1
- package/src/modes/theme/theme.ts +342 -82
- package/src/modes/types.ts +60 -18
- package/src/modes/utils/context-usage.ts +88 -8
- package/src/modes/utils/copy-targets.ts +133 -27
- package/src/modes/utils/hotkeys-markdown.ts +3 -2
- package/src/modes/utils/ui-helpers.ts +191 -110
- package/src/modes/workflow.ts +10 -10
- package/src/plan-mode/approved-plan.ts +66 -43
- package/src/plan-mode/plan-protection.ts +4 -4
- package/src/priority.json +5 -1
- package/src/prompts/agents/designer.md +1 -1
- package/src/prompts/agents/explore.md +3 -3
- package/src/prompts/agents/librarian.md +2 -3
- package/src/prompts/agents/oracle.md +2 -2
- package/src/prompts/agents/plan.md +6 -6
- package/src/prompts/agents/reviewer.md +1 -1
- package/src/prompts/agents/task.md +6 -5
- package/src/prompts/bench.md +12 -0
- package/src/prompts/ci-green-request.md +5 -7
- package/src/prompts/goals/goal-budget-limit.md +2 -2
- package/src/prompts/goals/goal-continuation.md +4 -4
- package/src/prompts/goals/goal-mode-active.md +1 -1
- 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 +2 -7
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/identity_review.md +2 -2
- package/src/prompts/memories/read-path.md +11 -10
- package/src/prompts/memories/stage_one_system.md +2 -2
- package/src/prompts/review-custom-request.md +1 -1
- package/src/prompts/system/agent-creation-architect.md +2 -2
- package/src/prompts/system/auto-continue.md +1 -1
- 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 +2 -2
- package/src/prompts/system/commit-message-system.md +13 -1
- package/src/prompts/system/custom-system-prompt.md +1 -1
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +11 -6
- package/src/prompts/system/empty-stop-retry.md +4 -6
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +3 -4
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/omfg-user.md +3 -4
- package/src/prompts/system/orchestrate-notice.md +10 -10
- package/src/prompts/system/personalities/default.md +26 -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 +70 -77
- package/src/prompts/system/plan-mode-approved.md +1 -1
- package/src/prompts/system/plan-mode-subagent.md +4 -5
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +1 -1
- package/src/prompts/system/project-prompt.md +2 -2
- 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 +7 -8
- package/src/prompts/system/system-prompt.md +28 -57
- package/src/prompts/system/tiny-title-system.md +1 -1
- 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 -3
- package/src/prompts/system/ttsr-tool-reminder.md +1 -1
- package/src/prompts/system/workflow-notice.md +4 -4
- package/src/prompts/tools/ast-edit.md +1 -1
- package/src/prompts/tools/ast-grep.md +2 -2
- package/src/prompts/tools/bash.md +16 -8
- package/src/prompts/tools/browser.md +33 -43
- package/src/prompts/tools/debug.md +1 -1
- package/src/prompts/tools/eval.md +31 -51
- package/src/prompts/tools/find.md +0 -1
- package/src/prompts/tools/github.md +8 -7
- package/src/prompts/tools/goal.md +1 -1
- package/src/prompts/tools/image-gen.md +1 -1
- package/src/prompts/tools/inspect-image-system.md +1 -1
- package/src/prompts/tools/irc.md +39 -31
- package/src/prompts/tools/job.md +2 -1
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +2 -2
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +1 -1
- package/src/prompts/tools/patch.md +2 -2
- package/src/prompts/tools/read.md +31 -39
- package/src/prompts/tools/recall.md +1 -1
- package/src/prompts/tools/reflect.md +1 -1
- package/src/prompts/tools/render-mermaid.md +2 -2
- package/src/prompts/tools/replace.md +4 -10
- package/src/prompts/tools/rewind.md +2 -2
- package/src/prompts/tools/search-tool-bm25.md +1 -9
- package/src/prompts/tools/search.md +0 -1
- package/src/prompts/tools/ssh.md +0 -4
- package/src/prompts/tools/task-summary.md +5 -16
- package/src/prompts/tools/task.md +47 -31
- package/src/prompts/tools/todo.md +6 -3
- package/src/registry/agent-lifecycle.ts +218 -0
- package/src/registry/agent-registry.ts +46 -5
- package/src/sdk.ts +692 -219
- package/src/secrets/index.ts +8 -1
- package/src/secrets/obfuscator.ts +40 -19
- package/src/session/agent-session.ts +1577 -806
- package/src/session/agent-storage.ts +18 -9
- package/src/session/auth-broker-config.ts +30 -1
- package/src/session/auth-storage.ts +6 -0
- package/src/session/codex-auto-reset.ts +202 -0
- package/src/session/history-storage.ts +3 -2
- package/src/session/indexed-session-storage.ts +7 -10
- package/src/session/messages.ts +59 -95
- package/src/session/session-context.ts +352 -0
- package/src/session/session-dump-format.ts +12 -3
- package/src/session/session-entries.ts +194 -0
- package/src/session/session-history-format.ts +246 -0
- package/src/session/session-listing.ts +588 -0
- package/src/session/session-loader.ts +106 -0
- package/src/session/session-manager.ts +1003 -2920
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +193 -0
- package/src/session/session-persistence.ts +131 -0
- package/src/session/session-storage.ts +91 -30
- package/src/session/snapcompact-inline.ts +542 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/streaming-output.ts +248 -11
- package/src/session/tool-choice-queue.ts +23 -11
- package/src/session/yield-queue.ts +20 -2
- package/src/slash-commands/acp-builtins.ts +25 -1
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +575 -49
- package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
- package/src/slash-commands/helpers/context-report.ts +28 -1
- package/src/slash-commands/helpers/logout.ts +88 -0
- package/src/slash-commands/helpers/reset-usage.ts +66 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
- package/src/slash-commands/helpers/usage-report.ts +38 -3
- package/src/slash-commands/types.ts +5 -9
- package/src/ssh/connection-manager.ts +27 -0
- package/src/ssh/ssh-executor.ts +60 -4
- package/src/stt/asr-client.ts +520 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +790 -0
- package/src/stt/downloader.ts +107 -47
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +5 -1
- package/src/stt/models.ts +150 -0
- package/src/stt/recorder.ts +254 -67
- package/src/stt/stt-controller.ts +201 -22
- package/src/stt/transcriber.ts +37 -68
- package/src/stt/wav.ts +173 -0
- package/src/system-prompt.ts +52 -10
- package/src/task/agents.ts +3 -4
- package/src/task/commands.ts +3 -2
- package/src/task/discovery.ts +17 -24
- package/src/task/executor.ts +1054 -529
- package/src/task/index.ts +862 -757
- package/src/task/output-manager.ts +0 -11
- package/src/task/parallel.ts +3 -3
- package/src/task/prometheus-command.ts +2 -2
- package/src/task/render.ts +529 -182
- package/src/task/repair-args.ts +21 -9
- package/src/task/types.ts +144 -66
- package/src/task/worktree.ts +64 -56
- package/src/telemetry-export.ts +27 -9
- package/src/thinking.ts +9 -7
- package/src/tiny/models.ts +2 -2
- package/src/tiny/text.ts +5 -1
- package/src/tiny/title-client.ts +72 -20
- package/src/tiny/title-protocol.ts +1 -1
- package/src/tiny/worker.ts +23 -99
- package/src/tool-discovery/tool-index.ts +2 -0
- package/src/tools/archive-reader.ts +94 -2
- package/src/tools/ask.ts +234 -177
- package/src/tools/ast-edit.ts +136 -80
- package/src/tools/ast-grep.ts +41 -45
- package/src/tools/auto-generated-guard.ts +20 -3
- package/src/tools/bash-interactive.ts +28 -8
- package/src/tools/bash.ts +198 -35
- package/src/tools/browser/attach.ts +26 -7
- package/src/tools/browser/cmux/cmux-tab.ts +1264 -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 +11 -2
- package/src/tools/browser/readable.ts +19 -2
- package/src/tools/browser/registry.ts +52 -5
- package/src/tools/browser/render.ts +13 -5
- package/src/tools/browser/tab-protocol.ts +2 -0
- package/src/tools/browser/tab-supervisor.ts +256 -34
- package/src/tools/browser/tab-worker.ts +259 -91
- package/src/tools/browser.ts +44 -2
- package/src/tools/checkpoint.ts +1 -1
- package/src/tools/conflict-detect.ts +50 -4
- package/src/tools/debug.ts +27 -12
- package/src/tools/eval-render.ts +32 -35
- package/src/tools/eval.ts +26 -12
- package/src/tools/fetch.ts +450 -99
- package/src/tools/find.ts +182 -142
- package/src/tools/gh-cache-invalidation.ts +255 -0
- package/src/tools/gh-renderer.ts +104 -51
- package/src/tools/gh.ts +232 -37
- package/src/tools/github-cache.ts +97 -7
- package/src/tools/grouped-file-output.ts +159 -52
- package/src/tools/image-gen.ts +237 -132
- package/src/tools/index.ts +147 -26
- package/src/tools/inspect-image-renderer.ts +74 -45
- package/src/tools/inspect-image.ts +12 -6
- package/src/tools/irc.ts +626 -173
- package/src/tools/job.ts +106 -29
- package/src/tools/learn.ts +144 -0
- package/src/tools/manage-skill.ts +104 -0
- package/src/tools/memory-edit.ts +4 -4
- package/src/tools/memory-recall.ts +7 -9
- package/src/tools/memory-reflect.ts +5 -9
- package/src/tools/memory-render.ts +23 -6
- package/src/tools/memory-retain.ts +4 -4
- package/src/tools/path-utils.ts +102 -48
- package/src/tools/plan-mode-guard.ts +101 -40
- package/src/tools/read.ts +475 -120
- package/src/tools/render-mermaid.ts +1 -1
- package/src/tools/render-utils.ts +132 -76
- package/src/tools/renderers.ts +12 -1
- package/src/tools/report-tool-issue.ts +14 -6
- package/src/tools/resolve.ts +20 -3
- package/src/tools/review.ts +2 -2
- package/src/tools/search-tool-bm25.ts +37 -24
- package/src/tools/search.ts +233 -115
- package/src/tools/sqlite-reader.ts +26 -17
- package/src/tools/ssh.ts +20 -14
- package/src/tools/todo.ts +197 -191
- package/src/tools/tool-result.ts +8 -0
- package/src/tools/tool-timeouts.ts +1 -1
- package/src/tools/tts.ts +205 -74
- package/src/tools/write.ts +291 -155
- package/src/tools/yield.ts +10 -1
- 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 +647 -0
- package/src/tts/tts-protocol.ts +60 -0
- package/src/tts/tts-worker.ts +505 -0
- package/src/tts/vocalizer.ts +162 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +2 -7
- package/src/tui/hyperlink.ts +40 -26
- package/src/tui/output-block.ts +60 -108
- package/src/tui/status-line.ts +5 -1
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +27 -1
- package/src/utils/clipboard.ts +91 -22
- package/src/utils/commit-message-generator.ts +8 -3
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/file-mentions.ts +3 -1
- package/src/utils/git.ts +315 -15
- package/src/utils/image-loading.ts +65 -4
- package/src/utils/session-color.ts +83 -9
- package/src/utils/thinking-display.ts +37 -0
- package/src/utils/title-generator.ts +73 -10
- package/src/utils/tool-choice.ts +16 -0
- package/src/utils/tools-manager.ts +19 -1
- package/src/web/kagi.ts +28 -26
- package/src/web/parallel.ts +7 -3
- package/src/web/scrapers/arxiv.ts +1 -1
- package/src/web/scrapers/github.ts +351 -3
- package/src/web/scrapers/go-pkg.ts +1 -1
- package/src/web/scrapers/iacr.ts +1 -1
- package/src/web/scrapers/readthedocs.ts +1 -1
- package/src/web/scrapers/twitter.ts +2 -1
- package/src/web/scrapers/types.ts +87 -8
- package/src/web/scrapers/wikipedia.ts +1 -1
- package/src/web/scrapers/youtube.ts +9 -3
- package/src/web/search/index.ts +15 -2
- package/src/web/search/providers/anthropic.ts +62 -21
- package/src/web/search/providers/base.ts +2 -1
- package/src/web/search/providers/brave.ts +5 -2
- package/src/web/search/providers/codex.ts +87 -51
- package/src/web/search/providers/exa.ts +101 -10
- package/src/web/search/providers/gemini.ts +49 -24
- package/src/web/search/providers/jina.ts +15 -5
- package/src/web/search/providers/kagi.ts +9 -2
- package/src/web/search/providers/kimi.ts +45 -20
- package/src/web/search/providers/parallel.ts +39 -24
- package/src/web/search/providers/perplexity.ts +226 -63
- package/src/web/search/providers/searxng.ts +19 -3
- package/src/web/search/providers/synthetic.ts +16 -11
- package/src/web/search/providers/tavily.ts +12 -9
- package/src/web/search/providers/zai.ts +22 -9
- package/src/web/search/render.ts +59 -64
- package/src/web/search/types.ts +5 -1
- package/dist/types/discovery/context-files.d.ts +0 -17
- package/dist/types/exa/factory.d.ts +0 -13
- package/dist/types/exa/render.d.ts +0 -19
- package/dist/types/exa/researcher.d.ts +0 -9
- package/dist/types/exa/search.d.ts +0 -9
- package/dist/types/exa/websets.d.ts +0 -9
- package/dist/types/export/html/template.generated.d.ts +0 -1
- package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
- package/dist/types/modes/components/status-line.d.ts +0 -77
- package/dist/types/slash-commands/headless-plan.d.ts +0 -3
- package/dist/types/stt/setup.d.ts +0 -18
- package/scripts/generate-template.ts +0 -33
- package/src/discovery/context-files.ts +0 -49
- package/src/exa/factory.ts +0 -60
- package/src/exa/render.ts +0 -244
- package/src/exa/researcher.ts +0 -36
- package/src/exa/search.ts +0 -47
- package/src/exa/websets.ts +0 -248
- package/src/export/html/template.generated.ts +0 -2
- package/src/modes/components/session-observer-overlay.ts +0 -852
- package/src/slash-commands/headless-plan.ts +0 -142
- package/src/stt/setup.ts +0 -52
- package/src/stt/transcribe.py +0 -70
- /package/dist/types/extensibility/{legacy-pi-coding-agent-shim.d.ts → legacy-package-agent-shim.d.ts} +0 -0
- /package/src/extensibility/{legacy-pi-coding-agent-shim.ts → legacy-package-agent-shim.ts} +0 -0
package/src/tools/write.ts
CHANGED
|
@@ -4,11 +4,10 @@ import * as path from "node:path";
|
|
|
4
4
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@prometheus-ai/agent-core";
|
|
5
5
|
import { formatHashlineHeader, stripHashlinePrefixes } from "@prometheus-ai/hashline";
|
|
6
6
|
import type { Component } from "@prometheus-ai/tui";
|
|
7
|
-
import { Text } from "@prometheus-ai/tui";
|
|
8
7
|
import { isEnoent, isRecord, prompt, untilAborted } from "@prometheus-ai/utils";
|
|
9
|
-
import
|
|
8
|
+
import { z } from "zod/v4";
|
|
10
9
|
|
|
11
|
-
import { getFileSnapshotStore } from "../edit/file-snapshot-store";
|
|
10
|
+
import { canonicalSnapshotKey, getFileSnapshotStore } from "../edit/file-snapshot-store";
|
|
12
11
|
import { normalizeToLF } from "../edit/normalize";
|
|
13
12
|
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
14
13
|
import { InternalUrlRouter } from "../internal-urls";
|
|
@@ -18,13 +17,15 @@ import { getDiagnosticsLedger } from "../lsp/diagnostics-ledger";
|
|
|
18
17
|
import { getLanguageFromPath, highlightCode, type Theme } from "../modes/theme/theme";
|
|
19
18
|
import writeDescription from "../prompts/tools/write.md" with { type: "text" };
|
|
20
19
|
import type { ToolSession } from "../sdk";
|
|
21
|
-
import {
|
|
20
|
+
import { fileHyperlink, framedBlock, renderStatusLine } from "../tui";
|
|
22
21
|
import { resolveFileDisplayMode } from "../utils/file-display-mode";
|
|
23
22
|
import { truncateForPrompt } from "./approval";
|
|
24
23
|
import { parseArchivePathCandidates } from "./archive-reader";
|
|
25
24
|
import { assertEditableFile } from "./auto-generated-guard";
|
|
26
25
|
import {
|
|
27
26
|
type ConflictEntry,
|
|
27
|
+
conflictRegionPresent,
|
|
28
|
+
conflictRegionsEqual,
|
|
28
29
|
expandContentTokens,
|
|
29
30
|
getConflictHistory,
|
|
30
31
|
parseConflictUri,
|
|
@@ -33,14 +34,17 @@ import {
|
|
|
33
34
|
import { invalidateFsScanAfterWrite } from "./fs-cache-invalidation";
|
|
34
35
|
import { type OutputMeta, outputMeta } from "./output-meta";
|
|
35
36
|
import { formatPathRelativeToCwd, isInternalUrlPath } from "./path-utils";
|
|
36
|
-
import { enforcePlanModeWrite, resolvePlanPath } from "./plan-mode-guard";
|
|
37
|
+
import { enforcePlanModeWrite, resolvePlanPath, unwrapHashlineHeaderPath } from "./plan-mode-guard";
|
|
37
38
|
import {
|
|
39
|
+
cachedRenderedString,
|
|
40
|
+
createRenderedStringCache,
|
|
38
41
|
formatDiagnostics,
|
|
42
|
+
formatErrorDetail,
|
|
39
43
|
formatExpandHint,
|
|
40
44
|
formatMoreItems,
|
|
41
45
|
formatStatusIcon,
|
|
42
|
-
formatTitle,
|
|
43
46
|
getLspBatchRequest,
|
|
47
|
+
type RenderedStringCache,
|
|
44
48
|
replaceTabs,
|
|
45
49
|
shortenPath,
|
|
46
50
|
} from "./render-utils";
|
|
@@ -58,6 +62,7 @@ import { ToolError } from "./tool-errors";
|
|
|
58
62
|
import { toolResult } from "./tool-result";
|
|
59
63
|
|
|
60
64
|
const LOOSE_HASHLINE_HEADER_RE = /^\s*\[[^#\r\n]+#[^ \t\r\n]*\]\s*$/;
|
|
65
|
+
const EXECUTABLE_NOTICE = "[Notice: Made executable via chmod +x]";
|
|
61
66
|
|
|
62
67
|
let fflateModulePromise: Promise<typeof import("fflate")> | undefined;
|
|
63
68
|
async function loadFflate(): Promise<typeof import("fflate")> {
|
|
@@ -78,6 +83,9 @@ export interface WriteToolDetails {
|
|
|
78
83
|
meta?: OutputMeta;
|
|
79
84
|
/** Set when the file was auto-chmod'd because content begins with a `#!` shebang. */
|
|
80
85
|
madeExecutable?: boolean;
|
|
86
|
+
/** Absolute filesystem path the write resolved to. Used by the renderer to wrap
|
|
87
|
+
* the (possibly cwd-relative) header path in an OSC 8 `file://` hyperlink. */
|
|
88
|
+
resolvedPath?: string;
|
|
81
89
|
}
|
|
82
90
|
|
|
83
91
|
/**
|
|
@@ -130,7 +138,7 @@ function stripWriteContent(session: ToolSession, content: string): { text: strin
|
|
|
130
138
|
function maybeWriteSnapshotHeader(session: ToolSession, absolutePath: string, content: string): string | undefined {
|
|
131
139
|
if (!resolveFileDisplayMode(session).hashLines) return undefined;
|
|
132
140
|
const normalized = normalizeToLF(content);
|
|
133
|
-
const tag = getFileSnapshotStore(session).record(absolutePath, normalized);
|
|
141
|
+
const tag = getFileSnapshotStore(session).record(canonicalSnapshotKey(absolutePath), normalized);
|
|
134
142
|
return formatHashlineHeader(formatPathRelativeToCwd(absolutePath, session.cwd), tag);
|
|
135
143
|
}
|
|
136
144
|
|
|
@@ -264,7 +272,14 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
264
272
|
readonly name = "write";
|
|
265
273
|
readonly approval = (args: unknown) => {
|
|
266
274
|
const rawPath = (args as Partial<WriteParams>).path;
|
|
267
|
-
|
|
275
|
+
if (typeof rawPath !== "string" || !isInternalUrlPath(rawPath)) return "write";
|
|
276
|
+
// Internal URLs are usually session-local artifacts (read tier), but a
|
|
277
|
+
// scheme whose handler exposes a `write` hook mutates handler-owned
|
|
278
|
+
// user data (e.g. vault:// notes, host-owned mcp:// URIs) and must take
|
|
279
|
+
// the write tier so always-ask mode actually prompts.
|
|
280
|
+
const match = /^([a-z][a-z0-9+.-]*):\/\//i.exec(rawPath.trim());
|
|
281
|
+
const handler = match ? InternalUrlRouter.instance().getHandler(match[1]!.toLowerCase()) : undefined;
|
|
282
|
+
return handler?.write ? "write" : "read";
|
|
268
283
|
};
|
|
269
284
|
readonly formatApprovalDetails = (args: unknown): string[] => {
|
|
270
285
|
const params = args as Partial<WriteParams>;
|
|
@@ -275,7 +290,6 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
275
290
|
readonly label = "Write";
|
|
276
291
|
readonly description: string;
|
|
277
292
|
readonly parameters = writeSchema;
|
|
278
|
-
readonly nonAbortable = true;
|
|
279
293
|
readonly strict = true;
|
|
280
294
|
readonly concurrency = "exclusive";
|
|
281
295
|
readonly loadMode = "discoverable";
|
|
@@ -348,7 +362,18 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
348
362
|
content: string,
|
|
349
363
|
resolvedArchivePath: ResolvedArchiveWritePath,
|
|
350
364
|
): Promise<AgentToolResult<WriteToolDetails>> {
|
|
351
|
-
|
|
365
|
+
// Resolve symlinks before the tmp+rename swap: renaming over a symlink
|
|
366
|
+
// replaces the link itself with a regular file instead of writing
|
|
367
|
+
// through to its target.
|
|
368
|
+
const finalPath = resolvedArchivePath.exists
|
|
369
|
+
? await fs.realpath(resolvedArchivePath.absolutePath).catch(() => resolvedArchivePath.absolutePath)
|
|
370
|
+
: resolvedArchivePath.absolutePath;
|
|
371
|
+
const lowerPath = finalPath.toLowerCase();
|
|
372
|
+
const isZip = lowerPath.endsWith(".zip");
|
|
373
|
+
const isGzip = lowerPath.endsWith(".tar.gz") || lowerPath.endsWith(".tgz");
|
|
374
|
+
// Rewrites are whole-archive: write to a temp file and rename so a
|
|
375
|
+
// crash/disk-full mid-write can't destroy the original archive.
|
|
376
|
+
const tmpPath = `${finalPath}.tmp-${process.pid}`;
|
|
352
377
|
|
|
353
378
|
const parentDir = path.dirname(resolvedArchivePath.absolutePath);
|
|
354
379
|
if (parentDir && parentDir !== ".") {
|
|
@@ -376,8 +401,10 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
376
401
|
try {
|
|
377
402
|
const { zipSync } = await loadFflate();
|
|
378
403
|
const zipBuffer = zipSync(zipEntries);
|
|
379
|
-
await Bun.write(
|
|
404
|
+
await Bun.write(tmpPath, zipBuffer);
|
|
405
|
+
await fs.rename(tmpPath, finalPath);
|
|
380
406
|
} catch (error) {
|
|
407
|
+
await fs.rm(tmpPath, { force: true }).catch(() => {});
|
|
381
408
|
throw new ToolError(error instanceof Error ? error.message : String(error));
|
|
382
409
|
}
|
|
383
410
|
} else {
|
|
@@ -405,8 +432,12 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
405
432
|
archiveEntries[resolvedArchivePath.archiveSubPath] = content;
|
|
406
433
|
|
|
407
434
|
try {
|
|
408
|
-
|
|
435
|
+
// `Bun.Archive.write` never infers compression from the extension;
|
|
436
|
+
// request gzip explicitly so `.tar.gz`/`.tgz` stay compressed.
|
|
437
|
+
await Bun.Archive.write(tmpPath, archiveEntries, isGzip ? { compress: "gzip" } : undefined);
|
|
438
|
+
await fs.rename(tmpPath, finalPath);
|
|
409
439
|
} catch (error) {
|
|
440
|
+
await fs.rm(tmpPath, { force: true }).catch(() => {});
|
|
410
441
|
throw new ToolError(error instanceof Error ? error.message : String(error));
|
|
411
442
|
}
|
|
412
443
|
}
|
|
@@ -417,7 +448,7 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
417
448
|
}`;
|
|
418
449
|
return {
|
|
419
450
|
content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${outputPath}` }],
|
|
420
|
-
details: {},
|
|
451
|
+
details: { resolvedPath: resolvedArchivePath.absolutePath },
|
|
421
452
|
};
|
|
422
453
|
}
|
|
423
454
|
|
|
@@ -533,7 +564,10 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
533
564
|
}
|
|
534
565
|
|
|
535
566
|
invalidateFsScanAfterWrite(resolvedSqlitePath.absolutePath);
|
|
536
|
-
return toolResult<WriteToolDetails>({
|
|
567
|
+
return toolResult<WriteToolDetails>({ resolvedPath: resolvedSqlitePath.absolutePath })
|
|
568
|
+
.text(resultText)
|
|
569
|
+
.sourcePath(resolvedSqlitePath.absolutePath)
|
|
570
|
+
.done();
|
|
537
571
|
} catch (error) {
|
|
538
572
|
if (isEnoent(error)) {
|
|
539
573
|
throw new ToolError(`SQLite database '${displayPath}' not found`);
|
|
@@ -549,9 +583,10 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
549
583
|
|
|
550
584
|
/**
|
|
551
585
|
* Resolve a single `conflict://<N>` write by splicing the recorded
|
|
552
|
-
* marker region in the registered file with `replacementContent
|
|
553
|
-
*
|
|
554
|
-
*
|
|
586
|
+
* marker region in the registered file with `replacementContent`.
|
|
587
|
+
* The write deliberately bypasses the LSP writethrough: the file may
|
|
588
|
+
* still hold other unresolved marker blocks, so formatting could
|
|
589
|
+
* corrupt them and diagnostics would be marker-noise anyway.
|
|
555
590
|
*
|
|
556
591
|
* Entry ids are session-stable: they keep working even after later
|
|
557
592
|
* writes resolve other blocks in the same file. The recorded range
|
|
@@ -563,7 +598,6 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
563
598
|
replacementContent: string,
|
|
564
599
|
stripped: boolean,
|
|
565
600
|
signal: AbortSignal | undefined,
|
|
566
|
-
context: AgentToolContext | undefined,
|
|
567
601
|
): Promise<AgentToolResult<WriteToolDetails>> {
|
|
568
602
|
const absolutePath = entry.absolutePath;
|
|
569
603
|
if (!(await fs.exists(absolutePath))) {
|
|
@@ -574,11 +608,28 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
574
608
|
const originalText = await Bun.file(absolutePath).text();
|
|
575
609
|
const newContent = spliceConflict(originalText, entry, expanded);
|
|
576
610
|
|
|
577
|
-
|
|
578
|
-
const diagnostics = await this.#writethrough(absolutePath, newContent, signal, undefined, batchRequest);
|
|
611
|
+
await writethroughNoop(absolutePath, newContent, signal);
|
|
579
612
|
invalidateFsScanAfterWrite(absolutePath);
|
|
613
|
+
this.session.bumpFileMutationVersion?.(absolutePath);
|
|
580
614
|
this.session.fileSnapshotStore?.invalidate(absolutePath);
|
|
581
|
-
this.session.conflictHistory
|
|
615
|
+
const history = this.session.conflictHistory;
|
|
616
|
+
history?.invalidate(entry.id);
|
|
617
|
+
if (history) {
|
|
618
|
+
// Drop stale duplicate registrations of the same region: a re-read
|
|
619
|
+
// after an out-of-band shift registers a fresh id at the new
|
|
620
|
+
// startLine while the stale twin persists at the old one. A DISTINCT
|
|
621
|
+
// conflict block that is merely byte-identical still occurs in the
|
|
622
|
+
// post-splice content and must stay addressable.
|
|
623
|
+
for (const other of history.entries()) {
|
|
624
|
+
if (
|
|
625
|
+
other.absolutePath === absolutePath &&
|
|
626
|
+
conflictRegionsEqual(other, entry) &&
|
|
627
|
+
!conflictRegionPresent(newContent, other)
|
|
628
|
+
) {
|
|
629
|
+
history.invalidate(other.id);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
582
633
|
|
|
583
634
|
const header = maybeWriteSnapshotHeader(this.session, absolutePath, newContent);
|
|
584
635
|
const range =
|
|
@@ -591,20 +642,9 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
591
642
|
resultText += `\nNote: auto-stripped hashline display prefixes from content before writing.`;
|
|
592
643
|
}
|
|
593
644
|
|
|
594
|
-
if (!diagnostics) {
|
|
595
|
-
return {
|
|
596
|
-
content: [{ type: "text", text: resultText }],
|
|
597
|
-
details: {},
|
|
598
|
-
};
|
|
599
|
-
}
|
|
600
645
|
return {
|
|
601
646
|
content: [{ type: "text", text: resultText }],
|
|
602
|
-
details: {
|
|
603
|
-
diagnostics,
|
|
604
|
-
meta: outputMeta()
|
|
605
|
-
.diagnostics(diagnostics.summary, diagnostics.messages ?? [])
|
|
606
|
-
.get(),
|
|
607
|
-
},
|
|
647
|
+
details: { resolvedPath: absolutePath },
|
|
608
648
|
};
|
|
609
649
|
}
|
|
610
650
|
|
|
@@ -617,7 +657,6 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
617
657
|
replacementContent: string,
|
|
618
658
|
stripped: boolean,
|
|
619
659
|
signal: AbortSignal | undefined,
|
|
620
|
-
context: AgentToolContext | undefined,
|
|
621
660
|
): Promise<AgentToolResult<WriteToolDetails>> {
|
|
622
661
|
const entry = getConflictHistory(this.session).get(id);
|
|
623
662
|
if (!entry) {
|
|
@@ -625,7 +664,7 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
625
664
|
`Conflict #${id} not found. Conflict ids are registered when \`read\` surfaces a marker block; re-read the file to get a current id.`,
|
|
626
665
|
);
|
|
627
666
|
}
|
|
628
|
-
return this.#resolveConflict(entry, replacementContent, stripped, signal
|
|
667
|
+
return this.#resolveConflict(entry, replacementContent, stripped, signal);
|
|
629
668
|
}
|
|
630
669
|
|
|
631
670
|
/**
|
|
@@ -647,7 +686,6 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
647
686
|
replacementContent: string,
|
|
648
687
|
stripped: boolean,
|
|
649
688
|
signal: AbortSignal | undefined,
|
|
650
|
-
context: AgentToolContext | undefined,
|
|
651
689
|
): Promise<AgentToolResult<WriteToolDetails>> {
|
|
652
690
|
const history = getConflictHistory(this.session);
|
|
653
691
|
const allEntries = history.entries();
|
|
@@ -664,8 +702,6 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
664
702
|
byFile.set(entry.absolutePath, bucket);
|
|
665
703
|
}
|
|
666
704
|
|
|
667
|
-
const batchRequest = getLspBatchRequest(context?.toolCall);
|
|
668
|
-
const allDiagnostics: FileDiagnosticsResult[] = [];
|
|
669
705
|
const succeededFiles: { displayPath: string; count: number; header?: string }[] = [];
|
|
670
706
|
const failedFiles: { displayPath: string; count: number; error: string }[] = [];
|
|
671
707
|
let totalResolvedIds = 0;
|
|
@@ -684,29 +720,54 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
684
720
|
fileEntries.sort((a, b) => b.startLine - a.startLine);
|
|
685
721
|
|
|
686
722
|
let text: string;
|
|
723
|
+
const resolvedEntries: ConflictEntry[] = [];
|
|
724
|
+
const staleEntries: ConflictEntry[] = [];
|
|
725
|
+
let failure: string | undefined;
|
|
687
726
|
try {
|
|
688
727
|
text = await Bun.file(absolutePath).text();
|
|
689
|
-
|
|
728
|
+
} catch (error) {
|
|
729
|
+
failedFiles.push({
|
|
730
|
+
displayPath: sample.displayPath,
|
|
731
|
+
count: fileEntries.length,
|
|
732
|
+
error: error instanceof Error ? error.message : String(error),
|
|
733
|
+
});
|
|
734
|
+
continue;
|
|
735
|
+
}
|
|
736
|
+
for (const entry of fileEntries) {
|
|
737
|
+
try {
|
|
690
738
|
const expanded = expandContentTokens(replacementContent, entry);
|
|
691
739
|
text = spliceConflict(text, entry, expanded);
|
|
740
|
+
resolvedEntries.push(entry);
|
|
741
|
+
} catch (error) {
|
|
742
|
+
// A locate-miss for a region an earlier entry already spliced
|
|
743
|
+
// in this pass is a stale duplicate registration (re-read after
|
|
744
|
+
// an out-of-band shift) — treat it as already resolved.
|
|
745
|
+
if (resolvedEntries.some(done => conflictRegionsEqual(done, entry))) {
|
|
746
|
+
staleEntries.push(entry);
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
750
|
+
break;
|
|
692
751
|
}
|
|
693
|
-
}
|
|
752
|
+
}
|
|
753
|
+
if (failure !== undefined) {
|
|
694
754
|
failedFiles.push({
|
|
695
755
|
displayPath: sample.displayPath,
|
|
696
756
|
count: fileEntries.length,
|
|
697
|
-
error:
|
|
757
|
+
error: failure,
|
|
698
758
|
});
|
|
699
759
|
continue;
|
|
700
760
|
}
|
|
701
761
|
|
|
702
|
-
|
|
762
|
+
await writethroughNoop(absolutePath, text, signal);
|
|
703
763
|
invalidateFsScanAfterWrite(absolutePath);
|
|
764
|
+
this.session.bumpFileMutationVersion?.(absolutePath);
|
|
704
765
|
this.session.fileSnapshotStore?.invalidate(absolutePath);
|
|
705
|
-
for (const entry of
|
|
766
|
+
for (const entry of resolvedEntries) history.invalidate(entry.id);
|
|
767
|
+
for (const entry of staleEntries) history.invalidate(entry.id);
|
|
706
768
|
const header = maybeWriteSnapshotHeader(this.session, absolutePath, text);
|
|
707
|
-
succeededFiles.push({ displayPath: sample.displayPath, count:
|
|
708
|
-
totalResolvedIds +=
|
|
709
|
-
if (diagnostics) allDiagnostics.push(diagnostics);
|
|
769
|
+
succeededFiles.push({ displayPath: sample.displayPath, count: resolvedEntries.length, header });
|
|
770
|
+
totalResolvedIds += resolvedEntries.length;
|
|
710
771
|
}
|
|
711
772
|
|
|
712
773
|
const summaryLines: string[] = [];
|
|
@@ -740,19 +801,13 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
740
801
|
}
|
|
741
802
|
const resultText = summaryLines.join("\n");
|
|
742
803
|
|
|
743
|
-
if (
|
|
744
|
-
|
|
745
|
-
throw new ToolError(resultText);
|
|
746
|
-
}
|
|
747
|
-
return { content: [{ type: "text", text: resultText }], details: {} };
|
|
804
|
+
if (failedFiles.length > 0 && succeededFiles.length === 0) {
|
|
805
|
+
throw new ToolError(resultText);
|
|
748
806
|
}
|
|
749
|
-
const mergedSummary = allDiagnostics.map(d => d.summary).join("\n");
|
|
750
|
-
const mergedMessages = allDiagnostics.flatMap(d => d.messages ?? []);
|
|
751
807
|
return {
|
|
752
808
|
content: [{ type: "text", text: resultText }],
|
|
753
|
-
details: {
|
|
754
|
-
|
|
755
|
-
},
|
|
809
|
+
details: {},
|
|
810
|
+
isError: failedFiles.length > 0 ? true : undefined,
|
|
756
811
|
};
|
|
757
812
|
}
|
|
758
813
|
|
|
@@ -763,11 +818,20 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
763
818
|
}
|
|
764
819
|
async execute(
|
|
765
820
|
_toolCallId: string,
|
|
766
|
-
{ path, content }: WriteParams,
|
|
821
|
+
{ path: rawPath, content }: WriteParams,
|
|
767
822
|
signal?: AbortSignal,
|
|
768
823
|
_onUpdate?: AgentToolUpdateCallback<WriteToolDetails>,
|
|
769
824
|
context?: AgentToolContext,
|
|
770
825
|
): Promise<AgentToolResult<WriteToolDetails>> {
|
|
826
|
+
// Strip a hashline `[path#TAG]` wrapper up front so every downstream
|
|
827
|
+
// decision (scheme routing, internal-URL handler dispatch, plan-mode
|
|
828
|
+
// guard, plan path resolution, ACP bridge routing) sees the same
|
|
829
|
+
// filesystem target. Without this, a model that pastes a `read`
|
|
830
|
+
// header as the `path` arg would slip past `isInternalUrlPath`
|
|
831
|
+
// (which fails on a leading `[`) and the bridge router would send a
|
|
832
|
+
// `[local://scratch.md#ABCD]` write to the editor instead of the
|
|
833
|
+
// session-local sandbox.
|
|
834
|
+
const path = unwrapHashlineHeaderPath(rawPath);
|
|
771
835
|
return untilAborted(signal, async () => {
|
|
772
836
|
// Strip hashline display prefixes ([PATH#HASH] + LINE:) if the model copied them from read output
|
|
773
837
|
const { text: cleanContent, stripped } = stripWriteContent(this.session, content);
|
|
@@ -777,6 +841,9 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
777
841
|
const scheme = parsed.protocol.replace(/:$/, "").toLowerCase();
|
|
778
842
|
const handler = internalRouter.getHandler(scheme);
|
|
779
843
|
if (handler?.write) {
|
|
844
|
+
// Handler-owned writes (vault:// notes, host URIs) mutate user
|
|
845
|
+
// data outside the local sandbox — plan mode must reject them.
|
|
846
|
+
enforcePlanModeWrite(this.session, path, { op: "update" });
|
|
780
847
|
await handler.write(parsed, cleanContent, { cwd: this.session.cwd, signal });
|
|
781
848
|
let resultText = `Successfully wrote ${cleanContent.length} bytes to ${path}`;
|
|
782
849
|
if (stripped) {
|
|
@@ -798,8 +865,8 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
798
865
|
}
|
|
799
866
|
const result =
|
|
800
867
|
conflictUri.id === "*"
|
|
801
|
-
? await this.#resolveAllConflicts(cleanContent, stripped, signal
|
|
802
|
-
: await this.#resolveSingleConflictById(conflictUri.id, cleanContent, stripped, signal
|
|
868
|
+
? await this.#resolveAllConflicts(cleanContent, stripped, signal)
|
|
869
|
+
: await this.#resolveSingleConflictById(conflictUri.id, cleanContent, stripped, signal);
|
|
803
870
|
if (conflictUri.recoveredPrefix !== undefined) {
|
|
804
871
|
appendNoteToResult(
|
|
805
872
|
result,
|
|
@@ -865,6 +932,8 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
865
932
|
throw new ToolError(error instanceof Error ? error.message : String(error));
|
|
866
933
|
}
|
|
867
934
|
invalidateFsScanAfterWrite(absolutePath);
|
|
935
|
+
this.session.bumpFileMutationVersion?.(absolutePath);
|
|
936
|
+
const madeExecutable = await maybeMarkExecutableForShebang(absolutePath, cleanContent);
|
|
868
937
|
const displayPath = formatPathRelativeToCwd(absolutePath, this.session.cwd);
|
|
869
938
|
const header = maybeWriteSnapshotHeader(this.session, absolutePath, cleanContent);
|
|
870
939
|
const writeLine = `Successfully wrote ${cleanContent.length} bytes to ${displayPath}`;
|
|
@@ -872,11 +941,18 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
872
941
|
if (stripped) {
|
|
873
942
|
resultText += `\nNote: auto-stripped hashline display prefixes from content before writing.`;
|
|
874
943
|
}
|
|
875
|
-
|
|
944
|
+
if (madeExecutable) {
|
|
945
|
+
resultText += `\n${EXECUTABLE_NOTICE}`;
|
|
946
|
+
}
|
|
947
|
+
return {
|
|
948
|
+
content: [{ type: "text", text: resultText }],
|
|
949
|
+
details: { resolvedPath: absolutePath, madeExecutable: madeExecutable || undefined },
|
|
950
|
+
};
|
|
876
951
|
}
|
|
877
952
|
|
|
878
953
|
const diagnostics = await this.#writethrough(absolutePath, cleanContent, signal, undefined, batchRequest);
|
|
879
954
|
invalidateFsScanAfterWrite(absolutePath);
|
|
955
|
+
this.session.bumpFileMutationVersion?.(absolutePath);
|
|
880
956
|
const madeExecutable = await maybeMarkExecutableForShebang(absolutePath, cleanContent);
|
|
881
957
|
|
|
882
958
|
const displayPath = formatPathRelativeToCwd(absolutePath, this.session.cwd);
|
|
@@ -886,16 +962,20 @@ export class WriteTool implements AgentTool<typeof writeSchema, WriteToolDetails
|
|
|
886
962
|
if (stripped) {
|
|
887
963
|
resultText += `\nNote: auto-stripped hashline display prefixes from content before writing.`;
|
|
888
964
|
}
|
|
965
|
+
if (madeExecutable) {
|
|
966
|
+
resultText += `\n${EXECUTABLE_NOTICE}`;
|
|
967
|
+
}
|
|
889
968
|
if (!diagnostics) {
|
|
890
969
|
return {
|
|
891
970
|
content: [{ type: "text", text: resultText }],
|
|
892
|
-
details: { madeExecutable: madeExecutable || undefined },
|
|
971
|
+
details: { resolvedPath: absolutePath, madeExecutable: madeExecutable || undefined },
|
|
893
972
|
};
|
|
894
973
|
}
|
|
895
974
|
|
|
896
975
|
return {
|
|
897
976
|
content: [{ type: "text", text: resultText }],
|
|
898
977
|
details: {
|
|
978
|
+
resolvedPath: absolutePath,
|
|
899
979
|
diagnostics,
|
|
900
980
|
madeExecutable: madeExecutable || undefined,
|
|
901
981
|
meta: outputMeta()
|
|
@@ -934,37 +1014,57 @@ function normalizeDisplayText(text: string): string {
|
|
|
934
1014
|
return text.replace(/\r/g, "");
|
|
935
1015
|
}
|
|
936
1016
|
|
|
1017
|
+
/**
|
|
1018
|
+
* Minimum line-number gutter width for write previews. The streaming preview's
|
|
1019
|
+
* gutter must stay byte-stable as the line count grows: a width derived purely
|
|
1020
|
+
* from `String(totalLines).length` widens at the 10/100/1000-line crossings,
|
|
1021
|
+
* rewriting every already-rendered row — which forces the transcript's commit
|
|
1022
|
+
* audit to recommit the block's committed prefix (a full duplicate in native
|
|
1023
|
+
* scrollback). Reserving 3 digits keeps the gutter constant through 999 lines
|
|
1024
|
+
* and keeps the streamed rows byte-identical to the final result render.
|
|
1025
|
+
*/
|
|
1026
|
+
const WRITE_GUTTER_MIN_WIDTH = 3;
|
|
1027
|
+
|
|
937
1028
|
function formatStreamingContent(
|
|
938
1029
|
content: string,
|
|
939
1030
|
expanded: boolean,
|
|
940
1031
|
language: string | undefined,
|
|
941
1032
|
uiTheme: Theme,
|
|
1033
|
+
spinnerFrame?: number,
|
|
1034
|
+
cache?: RenderedStringCache,
|
|
942
1035
|
): string {
|
|
943
1036
|
if (!content) return "";
|
|
944
|
-
const
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
1037
|
+
const bodyText = cachedRenderedString(cache, uiTheme, expanded, language ?? "", content, () => {
|
|
1038
|
+
const lines = normalizeDisplayText(content).split("\n");
|
|
1039
|
+
const totalLines = lines.length;
|
|
1040
|
+
// Collapsed: follow the streaming edge with a bounded tail window so the box
|
|
1041
|
+
// stays short enough not to strand its scrolled-off head above the viewport
|
|
1042
|
+
// while the block is volatile. `Ctrl+O` (expanded) lifts the cap for a
|
|
1043
|
+
// deliberate full view — matching the eval streaming preview.
|
|
1044
|
+
const startIndex = expanded ? 0 : Math.max(0, totalLines - WRITE_STREAMING_PREVIEW_LINES);
|
|
1045
|
+
const visibleLines = lines.slice(startIndex);
|
|
1046
|
+
const hidden = startIndex;
|
|
1047
|
+
const highlighted = highlightCode(visibleLines.join("\n"), language);
|
|
1048
|
+
const lineNumberWidth = Math.max(WRITE_GUTTER_MIN_WIDTH, String(totalLines).length);
|
|
1049
|
+
|
|
1050
|
+
let text = "\n\n";
|
|
1051
|
+
if (hidden > 0) {
|
|
1052
|
+
text += `${uiTheme.fg("dim", `… (${hidden} earlier line${hidden === 1 ? "" : "s"})`)}\n`;
|
|
1053
|
+
}
|
|
1054
|
+
for (let i = 0; i < highlighted.length; i++) {
|
|
1055
|
+
const lineNum = startIndex + i + 1;
|
|
1056
|
+
const gutter = uiTheme.fg("dim", `${String(lineNum).padStart(lineNumberWidth, " ")} `);
|
|
1057
|
+
const body = replaceTabs(highlighted[i] ?? "");
|
|
1058
|
+
text += `${gutter}${body}\n`;
|
|
1059
|
+
}
|
|
1060
|
+
return text;
|
|
1061
|
+
});
|
|
1062
|
+
// The animated glyph lives on this trailing line — inside the transcript's
|
|
1063
|
+
// volatile-tail holdback — never in the header: an animating head row pins
|
|
1064
|
+
// the native-scrollback commit boundary at the top of the block, so a long
|
|
1065
|
+
// expanded preview could never scroll-append mid-stream.
|
|
1066
|
+
const spinner = spinnerFrame !== undefined ? `${formatStatusIcon("running", uiTheme, spinnerFrame)} ` : "";
|
|
1067
|
+
return `${bodyText}${spinner}${uiTheme.fg("dim", `… (streaming)`)}`;
|
|
968
1068
|
}
|
|
969
1069
|
|
|
970
1070
|
function renderContentPreview(
|
|
@@ -972,29 +1072,32 @@ function renderContentPreview(
|
|
|
972
1072
|
expanded: boolean,
|
|
973
1073
|
language: string | undefined,
|
|
974
1074
|
uiTheme: Theme,
|
|
1075
|
+
cache?: RenderedStringCache,
|
|
975
1076
|
): string {
|
|
976
1077
|
if (!content) return "";
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1078
|
+
return cachedRenderedString(cache, uiTheme, expanded, language ?? "", content, () => {
|
|
1079
|
+
const rawLines = normalizeDisplayText(content).split("\n");
|
|
1080
|
+
const totalLines = rawLines.length;
|
|
1081
|
+
const maxLines = expanded ? totalLines : Math.min(totalLines, WRITE_PREVIEW_LINES);
|
|
1082
|
+
const visibleLines = rawLines.slice(0, maxLines);
|
|
1083
|
+
const highlighted = highlightCode(visibleLines.join("\n"), language);
|
|
1084
|
+
const lineNumberWidth = Math.max(WRITE_GUTTER_MIN_WIDTH, String(totalLines).length);
|
|
1085
|
+
const hidden = totalLines - maxLines;
|
|
1086
|
+
|
|
1087
|
+
let text = "\n\n";
|
|
1088
|
+
for (let i = 0; i < highlighted.length; i++) {
|
|
1089
|
+
const lineNum = i + 1;
|
|
1090
|
+
const gutter = uiTheme.fg("dim", `${String(lineNum).padStart(lineNumberWidth, " ")} `);
|
|
1091
|
+
const body = replaceTabs(highlighted[i] ?? "");
|
|
1092
|
+
text += `${gutter}${body}\n`;
|
|
1093
|
+
}
|
|
1094
|
+
if (!expanded && hidden > 0) {
|
|
1095
|
+
const hint = formatExpandHint(uiTheme, expanded, hidden > 0);
|
|
1096
|
+
const moreLine = `${formatMoreItems(hidden, "line")}${hint ? ` ${hint}` : ""}`;
|
|
1097
|
+
text += uiTheme.fg("dim", moreLine);
|
|
1098
|
+
}
|
|
1099
|
+
return text.trimEnd();
|
|
1100
|
+
});
|
|
998
1101
|
}
|
|
999
1102
|
|
|
1000
1103
|
export const writeToolRenderer = {
|
|
@@ -1004,23 +1107,45 @@ export const writeToolRenderer = {
|
|
|
1004
1107
|
const lang = getLanguageFromPath(rawPath) ?? "text";
|
|
1005
1108
|
const langIcon = uiTheme.fg("muted", uiTheme.getLangIcon(lang));
|
|
1006
1109
|
const pathDisplay = filePath ? uiTheme.fg("accent", filePath) : uiTheme.fg("toolOutput", "…");
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1110
|
+
// Static pending icon, never the animated glyph: the header is the head
|
|
1111
|
+
// row of the framed block, and native-scrollback commits are prefix-only
|
|
1112
|
+
// — an animating head row would pin the commit boundary at the top and
|
|
1113
|
+
// keep a tall expanded preview from scroll-appending mid-stream. The
|
|
1114
|
+
// liveness cue rides the trailing "(streaming)" line instead.
|
|
1115
|
+
const header = renderStatusLine(
|
|
1116
|
+
{
|
|
1117
|
+
icon: "pending",
|
|
1118
|
+
title: "Write",
|
|
1119
|
+
description: `${langIcon} ${pathDisplay}`,
|
|
1120
|
+
},
|
|
1121
|
+
uiTheme,
|
|
1122
|
+
);
|
|
1123
|
+
const streamingCache = createRenderedStringCache();
|
|
1124
|
+
return framedBlock(uiTheme, width => {
|
|
1125
|
+
const body = args.content
|
|
1126
|
+
? formatStreamingContent(
|
|
1127
|
+
args.content,
|
|
1128
|
+
Boolean(options?.expanded),
|
|
1129
|
+
lang,
|
|
1130
|
+
uiTheme,
|
|
1131
|
+
options?.spinnerFrame,
|
|
1132
|
+
streamingCache,
|
|
1133
|
+
)
|
|
1134
|
+
: "";
|
|
1135
|
+
const bodyLines = body ? body.split("\n") : [];
|
|
1136
|
+
while (bodyLines.length > 0 && bodyLines[0].trim() === "") bodyLines.shift();
|
|
1137
|
+
return {
|
|
1138
|
+
header,
|
|
1139
|
+
sections: bodyLines.length > 0 ? [{ lines: bodyLines }] : [],
|
|
1140
|
+
state: "pending",
|
|
1141
|
+
borderColor: "borderMuted",
|
|
1142
|
+
width,
|
|
1143
|
+
};
|
|
1144
|
+
});
|
|
1020
1145
|
},
|
|
1021
1146
|
|
|
1022
1147
|
renderResult(
|
|
1023
|
-
result: { content: Array<{ type: string; text?: string }>; details?: WriteToolDetails },
|
|
1148
|
+
result: { content: Array<{ type: string; text?: string }>; details?: WriteToolDetails; isError?: boolean },
|
|
1024
1149
|
options: RenderResultOptions,
|
|
1025
1150
|
uiTheme: Theme,
|
|
1026
1151
|
args?: WriteRenderArgs,
|
|
@@ -1030,17 +1155,36 @@ export const writeToolRenderer = {
|
|
|
1030
1155
|
const fileContent = args?.content || "";
|
|
1031
1156
|
const lang = getLanguageFromPath(rawPath);
|
|
1032
1157
|
const langIcon = uiTheme.fg("muted", uiTheme.getLangIcon(lang));
|
|
1033
|
-
|
|
1158
|
+
// The header shows the cwd-relative path but links to the absolute path the
|
|
1159
|
+
// write resolved to (args.path may be relative, which would yield a broken
|
|
1160
|
+
// `file://` URI). Falls back to plain text when the result lacks a path.
|
|
1161
|
+
const linkTarget = result.details?.resolvedPath;
|
|
1162
|
+
const styledPath = filePath ? uiTheme.fg("accent", filePath) : uiTheme.fg("toolOutput", "…");
|
|
1163
|
+
const pathDisplay = filePath && linkTarget ? fileHyperlink(linkTarget, styledPath) : styledPath;
|
|
1164
|
+
|
|
1165
|
+
if (result.isError) {
|
|
1166
|
+
const errorText = result.content?.find(c => c.type === "text")?.text ?? "";
|
|
1167
|
+
const header = renderStatusLine(
|
|
1168
|
+
{ icon: "error", title: "Write", description: `${langIcon} ${pathDisplay}` },
|
|
1169
|
+
uiTheme,
|
|
1170
|
+
);
|
|
1171
|
+
return framedBlock(uiTheme, width => ({
|
|
1172
|
+
header,
|
|
1173
|
+
sections: [{ lines: formatErrorDetail(errorText, uiTheme).split("\n") }],
|
|
1174
|
+
state: "error",
|
|
1175
|
+
borderColor: "error",
|
|
1176
|
+
width,
|
|
1177
|
+
}));
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1034
1180
|
const lineCount = countLines(fileContent);
|
|
1035
1181
|
const lineSuffix = formatLineCountSuffix(lineCount, uiTheme);
|
|
1036
1182
|
const execSuffix = result.details?.madeExecutable
|
|
1037
1183
|
? `${uiTheme.fg("dim", " · ")}${uiTheme.fg("success", "made executable!")}`
|
|
1038
1184
|
: "";
|
|
1039
|
-
|
|
1040
|
-
// Build header with status icon
|
|
1041
1185
|
const header = renderStatusLine(
|
|
1042
1186
|
{
|
|
1043
|
-
|
|
1187
|
+
iconOverride: uiTheme.styledSymbol("tool.write", "accent"),
|
|
1044
1188
|
title: "Write",
|
|
1045
1189
|
description: `${langIcon} ${pathDisplay}${lineSuffix}${execSuffix}`,
|
|
1046
1190
|
},
|
|
@@ -1048,38 +1192,30 @@ export const writeToolRenderer = {
|
|
|
1048
1192
|
);
|
|
1049
1193
|
const diagnostics = result.details?.diagnostics;
|
|
1050
1194
|
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
const
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
const diagText = formatDiagnostics(diagnostics, expanded, uiTheme, fp =>
|
|
1064
|
-
uiTheme.getLangIcon(getLanguageFromPath(fp)),
|
|
1065
|
-
);
|
|
1066
|
-
if (diagText.trim()) {
|
|
1067
|
-
const diagLines = diagText.split("\n");
|
|
1068
|
-
const firstNonEmpty = diagLines.findIndex(line => line.trim());
|
|
1069
|
-
if (firstNonEmpty >= 0) {
|
|
1070
|
-
text += `\n${diagLines.slice(firstNonEmpty).join("\n")}`;
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1195
|
+
const previewCache = createRenderedStringCache();
|
|
1196
|
+
return framedBlock(uiTheme, width => {
|
|
1197
|
+
const { expanded } = options;
|
|
1198
|
+
let body = renderContentPreview(fileContent, expanded, lang, uiTheme, previewCache);
|
|
1199
|
+
if (diagnostics) {
|
|
1200
|
+
const diagText = formatDiagnostics(diagnostics, expanded, uiTheme, fp =>
|
|
1201
|
+
uiTheme.getLangIcon(getLanguageFromPath(fp)),
|
|
1202
|
+
);
|
|
1203
|
+
if (diagText.trim()) {
|
|
1204
|
+
const diagLines = diagText.split("\n");
|
|
1205
|
+
const firstNonEmpty = diagLines.findIndex(line => line.trim());
|
|
1206
|
+
if (firstNonEmpty >= 0) body += `\n${diagLines.slice(firstNonEmpty).join("\n")}`;
|
|
1073
1207
|
}
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1208
|
+
}
|
|
1209
|
+
const bodyLines = body.split("\n");
|
|
1210
|
+
while (bodyLines.length > 0 && bodyLines[0].trim() === "") bodyLines.shift();
|
|
1211
|
+
return {
|
|
1212
|
+
header,
|
|
1213
|
+
sections: bodyLines.length > 0 ? [{ lines: bodyLines }] : [],
|
|
1214
|
+
state: "success",
|
|
1215
|
+
borderColor: "borderMuted",
|
|
1216
|
+
width,
|
|
1217
|
+
};
|
|
1218
|
+
});
|
|
1083
1219
|
},
|
|
1084
1220
|
mergeCallAndResult: true,
|
|
1085
1221
|
};
|