@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
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import {
|
|
13
13
|
type ApplyResult,
|
|
14
14
|
applyEdits,
|
|
15
|
+
type Cursor,
|
|
15
16
|
computeFileHash,
|
|
16
17
|
type Edit,
|
|
17
18
|
Patch as HashlinePatch,
|
|
@@ -56,6 +57,39 @@ async function readSectionText(absolutePath: string, sectionPath: string): Promi
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Streaming previews recompute on every streamed chunk; re-reading the target
|
|
62
|
+
* file from disk each tick dominates the cost on large files. Cache the raw
|
|
63
|
+
* section text keyed by mtime+size so any on-disk change invalidates
|
|
64
|
+
* naturally. Used by the streaming path only — the args-complete pass always
|
|
65
|
+
* reads fresh.
|
|
66
|
+
*/
|
|
67
|
+
const streamingTextCache = new Map<string, { mtimeMs: number; size: number; rawContent: string }>();
|
|
68
|
+
const STREAMING_TEXT_CACHE_MAX = 8;
|
|
69
|
+
|
|
70
|
+
async function readSectionTextCached(absolutePath: string, sectionPath: string): Promise<string> {
|
|
71
|
+
let stamp: { mtimeMs: number; size: number } | undefined;
|
|
72
|
+
try {
|
|
73
|
+
const stat = await Bun.file(absolutePath).stat();
|
|
74
|
+
stamp = { mtimeMs: stat.mtimeMs, size: stat.size };
|
|
75
|
+
} catch {
|
|
76
|
+
stamp = undefined;
|
|
77
|
+
}
|
|
78
|
+
if (stamp) {
|
|
79
|
+
const cached = streamingTextCache.get(absolutePath);
|
|
80
|
+
if (cached && cached.mtimeMs === stamp.mtimeMs && cached.size === stamp.size) return cached.rawContent;
|
|
81
|
+
}
|
|
82
|
+
const rawContent = await readSectionText(absolutePath, sectionPath);
|
|
83
|
+
if (stamp) {
|
|
84
|
+
if (streamingTextCache.size >= STREAMING_TEXT_CACHE_MAX && !streamingTextCache.has(absolutePath)) {
|
|
85
|
+
const oldest = streamingTextCache.keys().next().value;
|
|
86
|
+
if (oldest !== undefined) streamingTextCache.delete(oldest);
|
|
87
|
+
}
|
|
88
|
+
streamingTextCache.set(absolutePath, { mtimeMs: stamp.mtimeMs, size: stamp.size, rawContent });
|
|
89
|
+
}
|
|
90
|
+
return rawContent;
|
|
91
|
+
}
|
|
92
|
+
|
|
59
93
|
function hasAnchorScopedEdit(edits: readonly Edit[]): boolean {
|
|
60
94
|
return edits.some(edit => {
|
|
61
95
|
if (edit.kind === "delete") return true;
|
|
@@ -131,6 +165,86 @@ function applyPreviewEdits(args: {
|
|
|
131
165
|
throw createMismatchError(section, absolutePath, normalized, snapshots, expected);
|
|
132
166
|
}
|
|
133
167
|
|
|
168
|
+
/**
|
|
169
|
+
* Map an insert cursor to the 1-indexed line where its payload lands, used to
|
|
170
|
+
* number the `+` rows of a streaming preview. Deliberately approximate: it
|
|
171
|
+
* ignores line shifts introduced by sibling ops, because the args-complete
|
|
172
|
+
* pass renumbers everything through the real unified diff.
|
|
173
|
+
*/
|
|
174
|
+
function insertCursorLine(cursor: Cursor, fileLineCount: number): number {
|
|
175
|
+
switch (cursor.kind) {
|
|
176
|
+
case "bof":
|
|
177
|
+
return 1;
|
|
178
|
+
case "eof":
|
|
179
|
+
return fileLineCount + 1;
|
|
180
|
+
case "before_anchor":
|
|
181
|
+
return cursor.anchor.line;
|
|
182
|
+
case "after_anchor":
|
|
183
|
+
return cursor.anchor.line + 1;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Build a streaming diff preview by emitting, per op in patch order, the
|
|
189
|
+
* removed file lines followed by the op's `+` payload rows — never a whole-file
|
|
190
|
+
* Myers re-diff. {@link generateDiffString} re-aligns the in-flight payload
|
|
191
|
+
* against the removed block on every streamed chunk (it greedily matches shared
|
|
192
|
+
* `}`/blank/`return` rows), so additions jump between hunks and the tail window
|
|
193
|
+
* the renderer pins stutters tick to tick. Natural order keeps the removed
|
|
194
|
+
* block fixed and grows the payload monotonically at the bottom so the streamed
|
|
195
|
+
* cursor stays put. Mirrors the apply_patch streaming strategy; the
|
|
196
|
+
* args-complete pass still produces the real unified diff.
|
|
197
|
+
*/
|
|
198
|
+
function buildStreamingSectionDiff(
|
|
199
|
+
section: PatchSection,
|
|
200
|
+
normalized: string,
|
|
201
|
+
): { diff: string; firstChangedLine: number | undefined } | { error: string } {
|
|
202
|
+
const { edits } = parsePatchStreaming(section.diff);
|
|
203
|
+
const resolved = resolveBlockEdits(edits, normalized, section.path, nativeBlockResolver, { onUnresolved: "drop" });
|
|
204
|
+
if (resolved.length === 0) return { error: `No changes would be made to ${section.path}.` };
|
|
205
|
+
|
|
206
|
+
const fileLines = normalized.split("\n");
|
|
207
|
+
const rows: string[] = [];
|
|
208
|
+
let firstChangedLine: number | undefined;
|
|
209
|
+
|
|
210
|
+
// Every edit emitted from one op header carries that header's patch line
|
|
211
|
+
// number and the edits sit contiguously (a replace lays down its replacement
|
|
212
|
+
// inserts then its range deletes; block ops expand to the same shape). Group
|
|
213
|
+
// on that boundary so each op stays intact and ordered.
|
|
214
|
+
for (let i = 0; i < resolved.length; ) {
|
|
215
|
+
const opLine = resolved[i].lineNum;
|
|
216
|
+
const deletes: number[] = [];
|
|
217
|
+
const inserts: string[] = [];
|
|
218
|
+
let insertBase: number | undefined;
|
|
219
|
+
while (i < resolved.length && resolved[i].lineNum === opLine) {
|
|
220
|
+
const edit = resolved[i];
|
|
221
|
+
if (edit.kind === "delete") deletes.push(edit.anchor.line);
|
|
222
|
+
else if (edit.kind === "insert") {
|
|
223
|
+
insertBase ??= insertCursorLine(edit.cursor, fileLines.length);
|
|
224
|
+
inserts.push(edit.text);
|
|
225
|
+
}
|
|
226
|
+
i++;
|
|
227
|
+
}
|
|
228
|
+
// Removed lines first (a fixed block), payload second (grows at the
|
|
229
|
+
// bottom = the streamed cursor).
|
|
230
|
+
deletes.sort((a, b) => a - b);
|
|
231
|
+
for (const line of deletes) {
|
|
232
|
+
firstChangedLine ??= line;
|
|
233
|
+
const content = line >= 1 && line <= fileLines.length ? fileLines[line - 1] : "";
|
|
234
|
+
rows.push(`-${line}|${content}`);
|
|
235
|
+
}
|
|
236
|
+
let newLine = insertBase ?? deletes[0] ?? 1;
|
|
237
|
+
for (const text of inserts) {
|
|
238
|
+
firstChangedLine ??= newLine;
|
|
239
|
+
rows.push(`+${newLine}|${text}`);
|
|
240
|
+
newLine++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (rows.length === 0) return { error: `No changes would be made to ${section.path}.` };
|
|
245
|
+
return { diff: rows.join("\n"), firstChangedLine };
|
|
246
|
+
}
|
|
247
|
+
|
|
134
248
|
export async function computeHashlineSectionDiff(
|
|
135
249
|
section: PatchSection,
|
|
136
250
|
cwd: string,
|
|
@@ -139,12 +253,19 @@ export async function computeHashlineSectionDiff(
|
|
|
139
253
|
): Promise<{ diff: string; firstChangedLine: number | undefined } | { error: string }> {
|
|
140
254
|
try {
|
|
141
255
|
const absolutePath = resolveToCwd(section.path, cwd);
|
|
142
|
-
const rawContent =
|
|
256
|
+
const rawContent = options.streaming
|
|
257
|
+
? await readSectionTextCached(absolutePath, section.path)
|
|
258
|
+
: await readSectionText(absolutePath, section.path);
|
|
143
259
|
const { text: content } = stripBom(rawContent);
|
|
144
260
|
const normalized = normalizeToLF(content);
|
|
261
|
+
// Streaming favors a stable, monotonic preview over an exact unified
|
|
262
|
+
// diff: feed the in-flight ops through the natural-order builder so the
|
|
263
|
+
// streamed cursor stays pinned to the bottom. The args-complete pass
|
|
264
|
+
// (`streaming` unset) falls through to the real Myers diff below.
|
|
265
|
+
if (options.streaming) return buildStreamingSectionDiff(section, normalized);
|
|
145
266
|
const result = applyPreviewEdits({ section, absolutePath, normalized, snapshots, options });
|
|
146
267
|
if (normalized === result.text) return { error: `No changes would be made to ${section.path}.` };
|
|
147
|
-
return generateDiffString(normalized, result.text);
|
|
268
|
+
return generateDiffString(normalized, result.text, undefined, { path: section.path });
|
|
148
269
|
} catch (err) {
|
|
149
270
|
return { error: err instanceof Error ? err.message : String(err) };
|
|
150
271
|
}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
import type { AgentToolResult } from "@prometheus-ai/agent-core";
|
|
15
15
|
import {
|
|
16
|
+
type BlockResolution,
|
|
16
17
|
buildCompactDiffPreview,
|
|
17
18
|
MismatchError as HashlineMismatchError,
|
|
18
19
|
Patch,
|
|
@@ -23,11 +24,13 @@ import {
|
|
|
23
24
|
import type { FileDiagnosticsResult, WritethroughCallback, WritethroughDeferredHandle } from "../../lsp";
|
|
24
25
|
import type { ToolSession } from "../../tools";
|
|
25
26
|
import { outputMeta } from "../../tools/output-meta";
|
|
27
|
+
import { ToolError } from "../../tools/tool-errors";
|
|
26
28
|
import { generateDiffString } from "../diff";
|
|
27
29
|
import { getFileSnapshotStore } from "../file-snapshot-store";
|
|
28
30
|
import type { EditToolDetails, EditToolPerFileResult, LspBatchRequest } from "../renderer";
|
|
29
31
|
import { nativeBlockResolver } from "./block-resolver";
|
|
30
32
|
import { HashlineFilesystem } from "./filesystem";
|
|
33
|
+
import { hashPatchInput, NOOP_HARD_LIMIT, recordNoopEdit, resetNoopEdit } from "./noop-loop-guard";
|
|
31
34
|
import { type HashlineParams, hashlineEditParamsSchema } from "./params";
|
|
32
35
|
|
|
33
36
|
export interface ExecuteHashlineSingleOptions {
|
|
@@ -54,6 +57,24 @@ function noChangeDiagnostic(path: string): string {
|
|
|
54
57
|
);
|
|
55
58
|
}
|
|
56
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Escalated diagnostic surfaced once the same payload has no-op'd
|
|
62
|
+
* {@link NOOP_HARD_LIMIT} times in a row on the same canonical path. Thrown as
|
|
63
|
+
* a {@link ToolError} so the agent loop sees a tool *failure* — empirically
|
|
64
|
+
* far more effective at breaking a no-op edit loop than the soft hint alone
|
|
65
|
+
* (issue #2081 saw 182 byte-identical no-op results in 205 calls before the
|
|
66
|
+
* user aborted).
|
|
67
|
+
*/
|
|
68
|
+
function noChangeLoopDiagnostic(path: string, count: number): string {
|
|
69
|
+
return (
|
|
70
|
+
`STOP. Edits to ${path} have been a byte-identical no-op ${count} times in a row — ` +
|
|
71
|
+
`the patch body matches the file at the targeted lines and the soft hint did not break the cycle. ` +
|
|
72
|
+
`Cease re-issuing this payload. Either the intended change is already on disk (move on), ` +
|
|
73
|
+
`or your anchor is wrong (re-read the file with \`read\` to observe the current line numbers and ` +
|
|
74
|
+
`tag, then author a different edit). This exact payload will keep being rejected until it changes.`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
57
78
|
function assertUniqueCanonicalPaths(prepared: readonly PreparedSection[]): void {
|
|
58
79
|
const seen = new Map<string, string>();
|
|
59
80
|
for (const entry of prepared) {
|
|
@@ -77,6 +98,20 @@ interface RenderedSection {
|
|
|
77
98
|
perFileResult: EditToolPerFileResult;
|
|
78
99
|
}
|
|
79
100
|
|
|
101
|
+
function formatBlockResolution(resolution: BlockResolution): string {
|
|
102
|
+
const op =
|
|
103
|
+
resolution.op === "delete"
|
|
104
|
+
? "delete block"
|
|
105
|
+
: resolution.op === "insert_after"
|
|
106
|
+
? "insert after block"
|
|
107
|
+
: "replace block";
|
|
108
|
+
const lines = resolution.end - resolution.start + 1;
|
|
109
|
+
const span =
|
|
110
|
+
resolution.start === resolution.end ? `line ${resolution.start}` : `lines ${resolution.start}-${resolution.end}`;
|
|
111
|
+
const suffix = resolution.op === "insert_after" ? `; body lands after line ${resolution.end}` : "";
|
|
112
|
+
return `${op} ${resolution.anchorLine} → resolved ${span} (${lines} line${lines === 1 ? "" : "s"})${suffix}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
80
115
|
function renderSection(result: PatchSectionResult, diagnostics: FileDiagnosticsResult | undefined): RenderedSection {
|
|
81
116
|
if (result.op === "noop") {
|
|
82
117
|
const toolResult: AgentToolResult<EditToolDetails, typeof hashlineEditParamsSchema> = {
|
|
@@ -89,7 +124,7 @@ function renderSection(result: PatchSectionResult, diagnostics: FileDiagnosticsR
|
|
|
89
124
|
};
|
|
90
125
|
}
|
|
91
126
|
|
|
92
|
-
const diff = generateDiffString(result.before, result.after);
|
|
127
|
+
const diff = generateDiffString(result.before, result.after, undefined, { path: result.path });
|
|
93
128
|
const preview = buildCompactDiffPreview(diff.diff);
|
|
94
129
|
const meta = outputMeta()
|
|
95
130
|
.diagnostics(diagnostics?.summary ?? "", diagnostics?.messages ?? [])
|
|
@@ -97,10 +132,14 @@ function renderSection(result: PatchSectionResult, diagnostics: FileDiagnosticsR
|
|
|
97
132
|
|
|
98
133
|
const warningsBlock = result.warnings.length > 0 ? `\n\nWarnings:\n${result.warnings.join("\n")}` : "";
|
|
99
134
|
const previewBlock = preview.preview ? `\n${preview.preview}` : "";
|
|
135
|
+
const blockBlock =
|
|
136
|
+
result.blockResolutions && result.blockResolutions.length > 0
|
|
137
|
+
? `\n${result.blockResolutions.map(formatBlockResolution).join("\n")}`
|
|
138
|
+
: "";
|
|
100
139
|
const firstChangedLine = result.firstChangedLine ?? diff.firstChangedLine;
|
|
101
140
|
return {
|
|
102
141
|
toolResult: {
|
|
103
|
-
content: [{ type: "text", text: `${result.header}${previewBlock}${warningsBlock}` }],
|
|
142
|
+
content: [{ type: "text", text: `${result.header}${blockBlock}${previewBlock}${warningsBlock}` }],
|
|
104
143
|
details: {
|
|
105
144
|
diff: diff.diff,
|
|
106
145
|
firstChangedLine,
|
|
@@ -138,13 +177,19 @@ export async function executeHashlineSingle(
|
|
|
138
177
|
const patcher = new Patcher({ fs, snapshots, blockResolver: nativeBlockResolver });
|
|
139
178
|
|
|
140
179
|
// Single-section fast path: prepare, commit, render.
|
|
180
|
+
const inputHash = hashPatchInput(options.input);
|
|
141
181
|
if (patch.sections.length === 1) {
|
|
142
182
|
fs.setBatchRequest(narrowBatchRequest(options.batchRequest, true));
|
|
143
183
|
const prepared = await patcher.prepare(patch.sections[0]);
|
|
144
184
|
const sectionResult = await patcher.commit(prepared);
|
|
145
185
|
if (sectionResult.op === "noop") {
|
|
186
|
+
const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash);
|
|
187
|
+
if (escalate) {
|
|
188
|
+
throw new ToolError(noChangeLoopDiagnostic(sectionResult.path, count));
|
|
189
|
+
}
|
|
146
190
|
return renderSection(sectionResult, undefined).toolResult;
|
|
147
191
|
}
|
|
192
|
+
resetNoopEdit(options.session, sectionResult.canonicalPath);
|
|
148
193
|
return renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path)).toolResult;
|
|
149
194
|
}
|
|
150
195
|
|
|
@@ -154,7 +199,12 @@ export async function executeHashlineSingle(
|
|
|
154
199
|
for (const section of patch.sections) prepared.push(await patcher.prepare(section));
|
|
155
200
|
assertUniqueCanonicalPaths(prepared);
|
|
156
201
|
for (const entry of prepared) {
|
|
157
|
-
if (entry.isNoop)
|
|
202
|
+
if (entry.isNoop) {
|
|
203
|
+
const { count, escalate } = recordNoopEdit(options.session, entry.canonicalPath, inputHash);
|
|
204
|
+
throw escalate
|
|
205
|
+
? new ToolError(noChangeLoopDiagnostic(entry.section.path, count))
|
|
206
|
+
: new ToolError(noChangeDiagnostic(entry.section.path));
|
|
207
|
+
}
|
|
158
208
|
}
|
|
159
209
|
// Then commit each one, narrowing the LSP batch flush flag to the final
|
|
160
210
|
// section only. A no-op apply mid-batch is treated as a hard failure —
|
|
@@ -164,7 +214,13 @@ export async function executeHashlineSingle(
|
|
|
164
214
|
const isLast = i === prepared.length - 1;
|
|
165
215
|
fs.setBatchRequest(narrowBatchRequest(options.batchRequest, isLast));
|
|
166
216
|
const sectionResult = await patcher.commit(prepared[i]);
|
|
167
|
-
if (sectionResult.op === "noop")
|
|
217
|
+
if (sectionResult.op === "noop") {
|
|
218
|
+
const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash);
|
|
219
|
+
throw escalate
|
|
220
|
+
? new ToolError(noChangeLoopDiagnostic(sectionResult.path, count))
|
|
221
|
+
: new ToolError(noChangeDiagnostic(sectionResult.path));
|
|
222
|
+
}
|
|
223
|
+
resetNoopEdit(options.session, sectionResult.canonicalPath);
|
|
168
224
|
rendered.push(renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path)));
|
|
169
225
|
}
|
|
170
226
|
|
|
@@ -23,6 +23,7 @@ import type { ToolSession } from "../../tools";
|
|
|
23
23
|
import { assertEditableFileContent } from "../../tools/auto-generated-guard";
|
|
24
24
|
import { invalidateFsScanAfterWrite } from "../../tools/fs-cache-invalidation";
|
|
25
25
|
import { enforcePlanModeWrite, resolvePlanPath } from "../../tools/plan-mode-guard";
|
|
26
|
+
import { canonicalSnapshotKey } from "../file-snapshot-store";
|
|
26
27
|
import { readEditFileText, serializeEditFileText } from "../read-file";
|
|
27
28
|
import type { LspBatchRequest } from "../renderer";
|
|
28
29
|
|
|
@@ -81,7 +82,7 @@ export class HashlineFilesystem extends Filesystem {
|
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
canonicalPath(relativePath: string): string {
|
|
84
|
-
return this.resolveAbsolute(relativePath);
|
|
85
|
+
return canonicalSnapshotKey(this.resolveAbsolute(relativePath));
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
async readText(relativePath: string): Promise<string> {
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session guard against subagents looping on byte-identical no-op edits.
|
|
3
|
+
*
|
|
4
|
+
* A hashline patch can apply cleanly yet produce no change when the body rows
|
|
5
|
+
* are already byte-identical to the targeted lines. {@link executeHashlineSingle}
|
|
6
|
+
* surfaces a soft hint ("re-read the file before issuing another edit"), but in
|
|
7
|
+
* the wild some models ignore the hint and keep re-issuing the same bytes
|
|
8
|
+
* (issue #2081 captured 182 such repeats in 205 calls before the user aborted).
|
|
9
|
+
*
|
|
10
|
+
* This module tracks consecutive byte-identical no-op edits per canonical file
|
|
11
|
+
* path within a single session. Once the same payload no-ops {@link NOOP_HARD_LIMIT}
|
|
12
|
+
* times in a row the caller is expected to escalate from a soft text result to
|
|
13
|
+
* a thrown {@link ToolError} so the agent loop sees a tool *failure* — empirically
|
|
14
|
+
* far more effective at breaking the cycle than the soft hint alone.
|
|
15
|
+
*
|
|
16
|
+
* A successful (non-noop) commit for a path resets that path's counter; a
|
|
17
|
+
* different payload on the same path also resets it because the body hash
|
|
18
|
+
* changed, which is a sign of model progress and deserves another soft hint.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
interface NoopLoopEntry {
|
|
22
|
+
/** Hash of the most recent input that no-op'd on this canonical path. */
|
|
23
|
+
hash: string;
|
|
24
|
+
/** Consecutive no-op count for the same `hash` on this path. */
|
|
25
|
+
count: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Cross-session-safe state slot held on the `ToolSession`. */
|
|
29
|
+
export interface NoopLoopGuard {
|
|
30
|
+
entries: Map<string, NoopLoopEntry>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* After this many consecutive byte-identical no-op edits on the same path,
|
|
35
|
+
* {@link recordNoopEdit} returns `escalate: true`. Picked deliberately small
|
|
36
|
+
* so the soft hint still fires once or twice before we escalate — the model
|
|
37
|
+
* deserves a chance to recover, but a tight bound is what actually breaks
|
|
38
|
+
* loops in practice.
|
|
39
|
+
*/
|
|
40
|
+
export const NOOP_HARD_LIMIT = 3;
|
|
41
|
+
|
|
42
|
+
interface NoopLoopGuardOwner {
|
|
43
|
+
noopLoopGuard?: NoopLoopGuard;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Lazily create the per-session guard, mirroring `getFileSnapshotStore`. */
|
|
47
|
+
export function getNoopLoopGuard(session: NoopLoopGuardOwner): NoopLoopGuard {
|
|
48
|
+
if (!session.noopLoopGuard) session.noopLoopGuard = { entries: new Map() };
|
|
49
|
+
return session.noopLoopGuard;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Result of recording one no-op against the guard. */
|
|
53
|
+
export interface NoopRecordResult {
|
|
54
|
+
/** Consecutive identical no-op count, including the current one. */
|
|
55
|
+
count: number;
|
|
56
|
+
/** True once `count >= NOOP_HARD_LIMIT` and the caller MUST escalate. */
|
|
57
|
+
escalate: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Record a no-op edit for `canonicalPath` keyed by `inputHash` (a stable hash
|
|
62
|
+
* of the raw patch input bytes). Returns the running consecutive-no-op count
|
|
63
|
+
* and whether the caller should escalate from a soft text result to a thrown
|
|
64
|
+
* error.
|
|
65
|
+
*
|
|
66
|
+
* `inputHash` is intentionally derived from the raw model-authored bytes
|
|
67
|
+
* rather than from file content: when the model emits a different payload
|
|
68
|
+
* (even whitespace-only) that's progress and earns a fresh soft hint, but
|
|
69
|
+
* re-issuing the same bytes after being warned is what we want to break.
|
|
70
|
+
*/
|
|
71
|
+
export function recordNoopEdit(
|
|
72
|
+
session: NoopLoopGuardOwner,
|
|
73
|
+
canonicalPath: string,
|
|
74
|
+
inputHash: string,
|
|
75
|
+
): NoopRecordResult {
|
|
76
|
+
const guard = getNoopLoopGuard(session);
|
|
77
|
+
const prev = guard.entries.get(canonicalPath);
|
|
78
|
+
const count = prev && prev.hash === inputHash ? prev.count + 1 : 1;
|
|
79
|
+
guard.entries.set(canonicalPath, { hash: inputHash, count });
|
|
80
|
+
return { count, escalate: count >= NOOP_HARD_LIMIT };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Clear the no-op counter for `canonicalPath`. Call after a non-noop commit
|
|
85
|
+
* for the same path so a future no-op starts fresh from the soft hint.
|
|
86
|
+
*/
|
|
87
|
+
export function resetNoopEdit(session: NoopLoopGuardOwner, canonicalPath: string): void {
|
|
88
|
+
const guard = session.noopLoopGuard;
|
|
89
|
+
if (!guard) return;
|
|
90
|
+
guard.entries.delete(canonicalPath);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Stable hash of the raw patch input. Bun's `Bun.hash` is xxHash64 — fast,
|
|
95
|
+
* non-cryptographic, more than adequate for "is this the same payload?".
|
|
96
|
+
*/
|
|
97
|
+
export function hashPatchInput(input: string): string {
|
|
98
|
+
return Bun.hash(input).toString(16);
|
|
99
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* keys without rejection; only `input` is required. `_input` is accepted as a
|
|
5
5
|
* provider-emitted alias for `input`.
|
|
6
6
|
*/
|
|
7
|
-
import
|
|
7
|
+
import { z } from "zod/v4";
|
|
8
8
|
|
|
9
9
|
export const hashlineEditParamsSchema = z.preprocess(raw => {
|
|
10
10
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return raw;
|
package/src/edit/index.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { getDiagnosticsLedger } from "../lsp/diagnostics-ledger";
|
|
|
14
14
|
import applyPatchDescription from "../prompts/tools/apply-patch.md" with { type: "text" };
|
|
15
15
|
import patchDescription from "../prompts/tools/patch.md" with { type: "text" };
|
|
16
16
|
import replaceDescription from "../prompts/tools/replace.md" with { type: "text" };
|
|
17
|
-
import type { ToolSession } from "../tools";
|
|
17
|
+
import type { DeferredDiagnosticsEntry, ToolSession } from "../tools";
|
|
18
18
|
import { truncateForPrompt } from "../tools/approval";
|
|
19
19
|
import { isInternalUrlPath } from "../tools/path-utils";
|
|
20
20
|
import { type EditMode, normalizeEditMode, resolveEditMode } from "../utils/edit-mode";
|
|
@@ -238,8 +238,23 @@ async function executeSinglePathEntries(
|
|
|
238
238
|
if (text) contentTexts.push(text);
|
|
239
239
|
} catch (err) {
|
|
240
240
|
const errorText = err instanceof Error ? err.message : String(err);
|
|
241
|
-
contentTexts.push(`Error editing ${path}: ${errorText}`);
|
|
241
|
+
contentTexts.push(`Error editing ${path} (entry ${i + 1} of ${runs.length}): ${errorText}`);
|
|
242
|
+
if (i > 0) {
|
|
243
|
+
contentTexts.push(i === 1 ? `Entry 1 was already applied.` : `Entries 1-${i} were already applied.`);
|
|
244
|
+
}
|
|
245
|
+
if (i + 1 < runs.length) {
|
|
246
|
+
contentTexts.push(
|
|
247
|
+
(i + 2 === runs.length
|
|
248
|
+
? `Entry ${runs.length} was NOT applied`
|
|
249
|
+
: `Entries ${i + 2}-${runs.length} were NOT applied`) +
|
|
250
|
+
`; re-read the file and re-issue only the failed and unapplied entries.`,
|
|
251
|
+
);
|
|
252
|
+
}
|
|
242
253
|
errorCount++;
|
|
254
|
+
// Stop at the first failure: later entries were authored against
|
|
255
|
+
// line numbers/content that assumed this entry succeeded, and
|
|
256
|
+
// applying them after a failure compounds the damage.
|
|
257
|
+
break;
|
|
243
258
|
}
|
|
244
259
|
|
|
245
260
|
if (!isLast && onUpdate) {
|
|
@@ -297,7 +312,6 @@ export class EditTool implements AgentTool<TInput> {
|
|
|
297
312
|
readonly name = "edit";
|
|
298
313
|
readonly label = "Edit";
|
|
299
314
|
readonly loadMode = "essential";
|
|
300
|
-
readonly nonAbortable = true;
|
|
301
315
|
readonly concurrency = "exclusive";
|
|
302
316
|
readonly strict = true;
|
|
303
317
|
|
|
@@ -307,6 +321,10 @@ export class EditTool implements AgentTool<TInput> {
|
|
|
307
321
|
readonly #editMode?: EditMode;
|
|
308
322
|
readonly #dedupDiagnostics: boolean;
|
|
309
323
|
readonly #pendingDeferredFetches = new Map<string, AbortController>();
|
|
324
|
+
/** Fallback per-path mutation counter used only when the session does not expose
|
|
325
|
+
* a shared one. Prefer `session.bumpFileMutationVersion` so write (and any other
|
|
326
|
+
* tool) mutating the same file also invalidates pending late-diagnostics. */
|
|
327
|
+
readonly #editVersionByPath = new Map<string, number>();
|
|
310
328
|
|
|
311
329
|
constructor(private readonly session: ToolSession) {
|
|
312
330
|
const {
|
|
@@ -503,10 +521,11 @@ export class EditTool implements AgentTool<TInput> {
|
|
|
503
521
|
}
|
|
504
522
|
|
|
505
523
|
const deferredController = new AbortController();
|
|
524
|
+
const editVersion = this.#bumpFileVersion(path);
|
|
506
525
|
return {
|
|
507
526
|
onDeferredDiagnostics: (lateDiagnostics: FileDiagnosticsResult) => {
|
|
508
527
|
this.#pendingDeferredFetches.delete(path);
|
|
509
|
-
this.#injectLateDiagnostics(path, lateDiagnostics);
|
|
528
|
+
this.#injectLateDiagnostics(path, lateDiagnostics, editVersion);
|
|
510
529
|
},
|
|
511
530
|
signal: deferredController.signal,
|
|
512
531
|
finalize: (diagnostics: FileDiagnosticsResult | undefined) => {
|
|
@@ -519,24 +538,34 @@ export class EditTool implements AgentTool<TInput> {
|
|
|
519
538
|
};
|
|
520
539
|
}
|
|
521
540
|
|
|
522
|
-
#injectLateDiagnostics(path: string, diagnostics: FileDiagnosticsResult): void {
|
|
541
|
+
#injectLateDiagnostics(path: string, diagnostics: FileDiagnosticsResult, editVersion: number): void {
|
|
523
542
|
const effective = this.#dedupDiagnostics
|
|
524
543
|
? getDiagnosticsLedger(this.session).reduce(path, diagnostics)
|
|
525
544
|
: diagnostics;
|
|
526
545
|
if (this.#dedupDiagnostics && effective.messages.length === 0) return;
|
|
527
546
|
|
|
528
|
-
const
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
.
|
|
532
|
-
.
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
547
|
+
const entry: DeferredDiagnosticsEntry = {
|
|
548
|
+
path,
|
|
549
|
+
summary: effective.summary ?? "",
|
|
550
|
+
messages: effective.messages ?? [],
|
|
551
|
+
errored: effective.errored,
|
|
552
|
+
// Drop at flush time if a later edit to the same file superseded this fetch.
|
|
553
|
+
isStale: () => this.#fileVersion(path) !== editVersion,
|
|
554
|
+
};
|
|
555
|
+
this.session.queueDeferredDiagnostics?.(entry);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/** Bump the file's mutation counter (session-global when available). */
|
|
559
|
+
#bumpFileVersion(path: string): number {
|
|
560
|
+
if (this.session.bumpFileMutationVersion) return this.session.bumpFileMutationVersion(path);
|
|
561
|
+
const next = (this.#editVersionByPath.get(path) ?? 0) + 1;
|
|
562
|
+
this.#editVersionByPath.set(path, next);
|
|
563
|
+
return next;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/** Read the file's current mutation counter (session-global when available). */
|
|
567
|
+
#fileVersion(path: string): number {
|
|
568
|
+
if (this.session.getFileMutationVersion) return this.session.getFileMutationVersion(path);
|
|
569
|
+
return this.#editVersionByPath.get(path) ?? 0;
|
|
541
570
|
}
|
|
542
571
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* the `patch` mode.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import
|
|
11
|
+
import { z } from "zod/v4";
|
|
12
12
|
import { parseApplyPatch, parseApplyPatchStreaming } from "../apply-patch/parser";
|
|
13
13
|
import { ApplyPatchError } from "../diff";
|
|
14
14
|
import type { PatchEditEntry } from "./patch";
|
package/src/edit/modes/patch.ts
CHANGED
|
@@ -9,7 +9,7 @@ import * as fs from "node:fs";
|
|
|
9
9
|
import * as path from "node:path";
|
|
10
10
|
import type { AgentToolResult } from "@prometheus-ai/agent-core";
|
|
11
11
|
import { isEnoent } from "@prometheus-ai/utils";
|
|
12
|
-
import
|
|
12
|
+
import { z } from "zod/v4";
|
|
13
13
|
import {
|
|
14
14
|
type FileDiagnosticsResult,
|
|
15
15
|
flushLspWritethroughBatch,
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
countLeadingWhitespace,
|
|
41
41
|
detectLineEnding,
|
|
42
42
|
getLeadingWhitespace,
|
|
43
|
+
normalizeForFuzzy,
|
|
43
44
|
normalizeToLF,
|
|
44
45
|
restoreLineEndings,
|
|
45
46
|
stripBom,
|
|
@@ -1007,6 +1008,41 @@ async function readExistingPatchFile(fileSystem: FileSystem, absolutePath: strin
|
|
|
1007
1008
|
}
|
|
1008
1009
|
}
|
|
1009
1010
|
|
|
1011
|
+
/**
|
|
1012
|
+
* A prefix/substring strategy matched pattern lines that cover only part of
|
|
1013
|
+
* the corresponding file lines; replacing whole lines would silently drop the
|
|
1014
|
+
* uncovered text the model never saw. Allow the replacement only when every
|
|
1015
|
+
* discarded piece (normalized) survives somewhere in the hunk's new lines.
|
|
1016
|
+
*/
|
|
1017
|
+
function assertPartialMatchPreservesDiscardedText(
|
|
1018
|
+
path: string,
|
|
1019
|
+
pattern: string[],
|
|
1020
|
+
matchedLines: string[],
|
|
1021
|
+
newLines: string[],
|
|
1022
|
+
matchStartIndex: number,
|
|
1023
|
+
): void {
|
|
1024
|
+
let newLinesNorm: string | undefined;
|
|
1025
|
+
for (let j = 0; j < pattern.length; j++) {
|
|
1026
|
+
const lineNorm = normalizeForFuzzy(matchedLines[j]);
|
|
1027
|
+
const patternNorm = normalizeForFuzzy(pattern[j]);
|
|
1028
|
+
if (lineNorm === patternNorm) continue;
|
|
1029
|
+
const at = lineNorm.indexOf(patternNorm);
|
|
1030
|
+
if (at === -1) continue;
|
|
1031
|
+
const discardedParts = [lineNorm.slice(0, at).trim(), lineNorm.slice(at + patternNorm.length).trim()];
|
|
1032
|
+
for (const part of discardedParts) {
|
|
1033
|
+
if (part.length === 0) continue;
|
|
1034
|
+
newLinesNorm ??= newLines.map(normalizeForFuzzy).join("\n");
|
|
1035
|
+
if (!newLinesNorm.includes(part)) {
|
|
1036
|
+
throw new ApplyPatchError(
|
|
1037
|
+
`Refusing partial-line match in ${path} at line ${matchStartIndex + j + 1}: ` +
|
|
1038
|
+
`the file line also contains ${JSON.stringify(part)}, which the replacement would silently drop. ` +
|
|
1039
|
+
`Provide the complete line in the hunk.`,
|
|
1040
|
+
);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1010
1046
|
/**
|
|
1011
1047
|
* Compute replacements needed to transform originalLines using the diff hunks.
|
|
1012
1048
|
*/
|
|
@@ -1253,6 +1289,18 @@ function computeReplacements(
|
|
|
1253
1289
|
if (searchResult.strategy === "fuzzy-dominant") {
|
|
1254
1290
|
const similarity = Math.round(searchResult.confidence * 100);
|
|
1255
1291
|
warnings.push(`Dominant fuzzy match selected in ${path} near line ${found + 1} (${similarity}% similar).`);
|
|
1292
|
+
} else if (
|
|
1293
|
+
searchResult.strategy === "comment-prefix" ||
|
|
1294
|
+
searchResult.strategy === "prefix" ||
|
|
1295
|
+
searchResult.strategy === "substring" ||
|
|
1296
|
+
searchResult.strategy === "fuzzy" ||
|
|
1297
|
+
searchResult.strategy === "character"
|
|
1298
|
+
) {
|
|
1299
|
+
const similarity = Math.round(searchResult.confidence * 100);
|
|
1300
|
+
warnings.push(
|
|
1301
|
+
`Inexact match in ${path} near line ${found + 1}: matched via ${searchResult.strategy} strategy ` +
|
|
1302
|
+
`(${similarity}% similar). Re-read the file if the result is not what you intended.`,
|
|
1303
|
+
);
|
|
1256
1304
|
}
|
|
1257
1305
|
|
|
1258
1306
|
// Reject if match is ambiguous (prefix/substring matching found multiple matches)
|
|
@@ -1305,6 +1353,10 @@ function computeReplacements(
|
|
|
1305
1353
|
continue;
|
|
1306
1354
|
}
|
|
1307
1355
|
|
|
1356
|
+
if (searchResult.strategy === "prefix" || searchResult.strategy === "substring") {
|
|
1357
|
+
assertPartialMatchPreservesDiscardedText(path, pattern, actualMatchedLines, newSlice, found);
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1308
1360
|
const adjustedNewLines = adjustLinesIndentation(pattern, actualMatchedLines, newSlice);
|
|
1309
1361
|
replacements.push({ startIndex: found, oldLen: pattern.length, newLines: adjustedNewLines });
|
|
1310
1362
|
lineIndex = found + pattern.length;
|
|
@@ -1571,7 +1623,9 @@ export async function computePatchDiff(
|
|
|
1571
1623
|
if (!normalizedOld && !normalizedNew) {
|
|
1572
1624
|
return { diff: "", firstChangedLine: undefined };
|
|
1573
1625
|
}
|
|
1574
|
-
return generateUnifiedDiffString(normalizedOld, normalizedNew
|
|
1626
|
+
return generateUnifiedDiffString(normalizedOld, normalizedNew, undefined, {
|
|
1627
|
+
path: result.change.newPath ?? result.change.path,
|
|
1628
|
+
});
|
|
1575
1629
|
} catch (err) {
|
|
1576
1630
|
return { error: err instanceof Error ? err.message : String(err) };
|
|
1577
1631
|
}
|
|
@@ -1785,7 +1839,9 @@ export async function executePatchSingle(
|
|
|
1785
1839
|
if (result.change.type === "update" && result.change.oldContent && result.change.newContent) {
|
|
1786
1840
|
const normalizedOld = normalizeToLF(stripBom(result.change.oldContent).text);
|
|
1787
1841
|
const normalizedNew = normalizeToLF(stripBom(result.change.newContent).text);
|
|
1788
|
-
diffResult = generateUnifiedDiffString(normalizedOld, normalizedNew
|
|
1842
|
+
diffResult = generateUnifiedDiffString(normalizedOld, normalizedNew, undefined, {
|
|
1843
|
+
path: result.change.newPath ?? result.change.path,
|
|
1844
|
+
});
|
|
1789
1845
|
}
|
|
1790
1846
|
|
|
1791
1847
|
let resultText: string;
|