@prometheus-ai/agent 0.5.4 → 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 +30 -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/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/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 +1202 -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/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/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/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 +1441 -387
- 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/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 +9 -7
- 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/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
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Uses Biome's CLI with JSON output instead of LSP (which has stale diagnostics issues).
|
|
4
4
|
*/
|
|
5
5
|
import path from "node:path";
|
|
6
|
+
import { logger } from "@prometheus-ai/utils";
|
|
6
7
|
import type { Diagnostic, DiagnosticSeverity, LinterClient, ServerConfig } from "../../lsp/types";
|
|
7
8
|
|
|
8
9
|
// =============================================================================
|
|
@@ -29,17 +30,23 @@ interface BiomeDiagnostic {
|
|
|
29
30
|
// =============================================================================
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
|
-
* Convert byte
|
|
33
|
+
* Convert byte offsets to line:column positions in a single pass over the source.
|
|
33
34
|
*/
|
|
34
|
-
function
|
|
35
|
+
function offsetsToPositions(source: string, offsets: number[]): Map<number, { line: number; column: number }> {
|
|
36
|
+
const sorted = [...new Set(offsets)].sort((a, b) => a - b);
|
|
37
|
+
const result = new Map<number, { line: number; column: number }>();
|
|
35
38
|
let line = 1;
|
|
36
39
|
let column = 1;
|
|
37
40
|
let byteIndex = 0;
|
|
41
|
+
let next = 0;
|
|
38
42
|
|
|
39
43
|
for (const ch of source) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
if (next >= sorted.length) break;
|
|
45
|
+
const cp = ch.codePointAt(0) as number;
|
|
46
|
+
const byteLen = cp < 0x80 ? 1 : cp < 0x800 ? 2 : cp < 0x10000 ? 3 : 4;
|
|
47
|
+
while (next < sorted.length && byteIndex + byteLen > sorted[next]) {
|
|
48
|
+
result.set(sorted[next], { line, column });
|
|
49
|
+
next++;
|
|
43
50
|
}
|
|
44
51
|
if (ch === "\n") {
|
|
45
52
|
line++;
|
|
@@ -50,7 +57,13 @@ function offsetToPosition(source: string, offset: number): { line: number; colum
|
|
|
50
57
|
byteIndex += byteLen;
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
|
|
60
|
+
// Offsets at or past end-of-file map to the final position.
|
|
61
|
+
while (next < sorted.length) {
|
|
62
|
+
result.set(sorted[next], { line, column });
|
|
63
|
+
next++;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return result;
|
|
54
67
|
}
|
|
55
68
|
|
|
56
69
|
/**
|
|
@@ -98,6 +111,16 @@ async function runBiome(
|
|
|
98
111
|
}
|
|
99
112
|
}
|
|
100
113
|
|
|
114
|
+
// Surface broken-binary / CLI failures once instead of silently reporting
|
|
115
|
+
// "no diagnostics" forever (and instead of spamming every writethrough).
|
|
116
|
+
const reportedBiomeFailures = new Set<string>();
|
|
117
|
+
|
|
118
|
+
function warnBiomeOnce(key: string, message: string, meta: Record<string, unknown>): void {
|
|
119
|
+
if (reportedBiomeFailures.has(key)) return;
|
|
120
|
+
reportedBiomeFailures.add(key);
|
|
121
|
+
logger.warn(message, meta);
|
|
122
|
+
}
|
|
123
|
+
|
|
101
124
|
// =============================================================================
|
|
102
125
|
// Biome Client
|
|
103
126
|
// =============================================================================
|
|
@@ -137,6 +160,16 @@ export class BiomeClient implements LinterClient {
|
|
|
137
160
|
// Run biome lint with JSON reporter
|
|
138
161
|
const result = await runBiome(["lint", "--reporter=json", filePath], this.cwd, this.config.resolvedCommand);
|
|
139
162
|
|
|
163
|
+
// Biome exits non-zero when diagnostics are found, so only an empty
|
|
164
|
+
// stdout signals an actual run failure (missing binary, CLI error).
|
|
165
|
+
if (!result.success && result.stdout.trim().length === 0) {
|
|
166
|
+
warnBiomeOnce(`run:${this.cwd}`, "Biome lint failed; reporting no diagnostics", {
|
|
167
|
+
cwd: this.cwd,
|
|
168
|
+
stderr: result.stderr.slice(0, 500),
|
|
169
|
+
});
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
|
|
140
173
|
return this.#parseJsonOutput(result.stdout, filePath);
|
|
141
174
|
}
|
|
142
175
|
|
|
@@ -146,51 +179,80 @@ export class BiomeClient implements LinterClient {
|
|
|
146
179
|
#parseJsonOutput(jsonOutput: string, targetFile: string): Diagnostic[] {
|
|
147
180
|
const diagnostics: Diagnostic[] = [];
|
|
148
181
|
|
|
182
|
+
let parsed: BiomeJsonOutput;
|
|
149
183
|
try {
|
|
150
|
-
|
|
184
|
+
parsed = JSON.parse(jsonOutput);
|
|
185
|
+
} catch {
|
|
186
|
+
warnBiomeOnce(`parse:${this.cwd}`, "Failed to parse Biome JSON output; reporting no diagnostics", {
|
|
187
|
+
cwd: this.cwd,
|
|
188
|
+
file: targetFile,
|
|
189
|
+
});
|
|
190
|
+
return diagnostics;
|
|
191
|
+
}
|
|
151
192
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
193
|
+
const target = path.resolve(targetFile);
|
|
194
|
+
const relevant: BiomeDiagnostic[] = [];
|
|
195
|
+
// Batch all span offsets per source text so each source is scanned once
|
|
196
|
+
// instead of twice per diagnostic.
|
|
197
|
+
const offsetsBySource = new Map<string, number[]>();
|
|
198
|
+
for (const diag of parsed.diagnostics ?? []) {
|
|
199
|
+
const location = diag.location;
|
|
200
|
+
if (!location?.path?.file) continue;
|
|
155
201
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
202
|
+
// Resolve file path
|
|
203
|
+
const diagFile = path.isAbsolute(location.path.file)
|
|
204
|
+
? location.path.file
|
|
205
|
+
: path.join(this.cwd, location.path.file);
|
|
160
206
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
207
|
+
// Only include diagnostics for the target file
|
|
208
|
+
if (path.resolve(diagFile) !== target) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
relevant.push(diag);
|
|
213
|
+
if (location.span && location.sourceCode) {
|
|
214
|
+
const offsets = offsetsBySource.get(location.sourceCode);
|
|
215
|
+
if (offsets) offsets.push(location.span[0], location.span[1]);
|
|
216
|
+
else offsetsBySource.set(location.sourceCode, [location.span[0], location.span[1]]);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const positionsBySource = new Map<string, Map<number, { line: number; column: number }>>();
|
|
221
|
+
for (const [source, offsets] of offsetsBySource) {
|
|
222
|
+
positionsBySource.set(source, offsetsToPositions(source, offsets));
|
|
223
|
+
}
|
|
165
224
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
225
|
+
for (const diag of relevant) {
|
|
226
|
+
const location = diag.location;
|
|
227
|
+
let startLine = 1;
|
|
228
|
+
let startColumn = 1;
|
|
229
|
+
let endLine = 1;
|
|
230
|
+
let endColumn = 1;
|
|
171
231
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
232
|
+
if (location?.span && location.sourceCode) {
|
|
233
|
+
const positions = positionsBySource.get(location.sourceCode);
|
|
234
|
+
const startPos = positions?.get(location.span[0]);
|
|
235
|
+
const endPos = positions?.get(location.span[1]);
|
|
236
|
+
if (startPos) {
|
|
175
237
|
startLine = startPos.line;
|
|
176
238
|
startColumn = startPos.column;
|
|
239
|
+
}
|
|
240
|
+
if (endPos) {
|
|
177
241
|
endLine = endPos.line;
|
|
178
242
|
endColumn = endPos.column;
|
|
179
243
|
}
|
|
180
|
-
|
|
181
|
-
diagnostics.push({
|
|
182
|
-
range: {
|
|
183
|
-
start: { line: startLine - 1, character: startColumn - 1 },
|
|
184
|
-
end: { line: endLine - 1, character: endColumn - 1 },
|
|
185
|
-
},
|
|
186
|
-
severity: parseSeverity(diag.severity),
|
|
187
|
-
message: diag.description,
|
|
188
|
-
source: "biome",
|
|
189
|
-
code: diag.category,
|
|
190
|
-
});
|
|
191
244
|
}
|
|
192
|
-
|
|
193
|
-
|
|
245
|
+
|
|
246
|
+
diagnostics.push({
|
|
247
|
+
range: {
|
|
248
|
+
start: { line: startLine - 1, character: startColumn - 1 },
|
|
249
|
+
end: { line: endLine - 1, character: endColumn - 1 },
|
|
250
|
+
},
|
|
251
|
+
severity: parseSeverity(diag.severity),
|
|
252
|
+
message: diag.description,
|
|
253
|
+
source: "biome",
|
|
254
|
+
code: diag.category,
|
|
255
|
+
});
|
|
194
256
|
}
|
|
195
257
|
|
|
196
258
|
return diagnostics;
|
|
@@ -4,18 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { getOrCreateClient, notifySaved, sendRequest, syncContent } from "../../lsp/client";
|
|
6
6
|
import { applyTextEditsToString } from "../../lsp/edits";
|
|
7
|
+
import { resolveFormatOptions } from "../../lsp/format-options";
|
|
7
8
|
import type { Diagnostic, LinterClient, LspClient, ServerConfig, TextEdit } from "../../lsp/types";
|
|
8
9
|
import { fileToUri } from "../../lsp/utils";
|
|
9
10
|
|
|
10
|
-
/** Default formatting options for LSP */
|
|
11
|
-
const DEFAULT_FORMAT_OPTIONS = {
|
|
12
|
-
tabSize: 3,
|
|
13
|
-
insertSpaces: true,
|
|
14
|
-
trimTrailingWhitespace: true,
|
|
15
|
-
insertFinalNewline: true,
|
|
16
|
-
trimFinalNewlines: true,
|
|
17
|
-
};
|
|
18
|
-
|
|
19
11
|
/**
|
|
20
12
|
* LSP-based linter client implementation.
|
|
21
13
|
* Wraps the existing LSP client infrastructure.
|
|
@@ -56,7 +48,7 @@ export class LspLinterClient implements LinterClient {
|
|
|
56
48
|
// Request formatting
|
|
57
49
|
const edits = (await sendRequest(client, "textDocument/formatting", {
|
|
58
50
|
textDocument: { uri },
|
|
59
|
-
options:
|
|
51
|
+
options: resolveFormatOptions(filePath, content),
|
|
60
52
|
})) as TextEdit[] | null;
|
|
61
53
|
|
|
62
54
|
if (!edits || edits.length === 0) {
|
package/src/lsp/config.ts
CHANGED
|
@@ -322,7 +322,7 @@ function getConfigSources(cwd: string): ConfigSource[] {
|
|
|
322
322
|
sources.push(fileConfigSource(path.join(cwd, filename)));
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
// Project config directories (.prometheus/, .claude
|
|
325
|
+
// Project config directories (.prometheus/, .claude/)
|
|
326
326
|
const projectDirs = getConfigDirPaths("", { user: false, project: true, cwd });
|
|
327
327
|
for (const dir of projectDirs) {
|
|
328
328
|
for (const filename of filenames) {
|
|
@@ -330,7 +330,7 @@ function getConfigSources(cwd: string): ConfigSource[] {
|
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
// User config directories (~/.prometheus/agent/, ~/.claude
|
|
333
|
+
// User config directories (~/.prometheus/agent/, ~/.claude/)
|
|
334
334
|
const userDirs = getConfigDirPaths("", { user: true, project: false });
|
|
335
335
|
for (const dir of userDirs) {
|
|
336
336
|
for (const filename of filenames) {
|
|
@@ -360,8 +360,8 @@ function getConfigSources(cwd: string): ConfigSource[] {
|
|
|
360
360
|
*
|
|
361
361
|
* Priority (highest to lowest):
|
|
362
362
|
* 1. Project root: lsp.json/.lsp.json/lsp.yml/.lsp.yml/lsp.yaml/.lsp.yaml
|
|
363
|
-
* 2. Project config dirs: .prometheus
|
|
364
|
-
* 3. User config dirs: ~/.prometheus/agent
|
|
363
|
+
* 2. Project config dirs: .prometheus and .claude LSP config files (+ hidden variants)
|
|
364
|
+
* 3. User config dirs: ~/.prometheus/agent and ~/.claude LSP config files (+ hidden variants)
|
|
365
365
|
* 4. User home root: ~/lsp.*, ~/.lsp.*
|
|
366
366
|
* 5. Auto-detect from project markers + available binaries
|
|
367
367
|
*
|
|
@@ -450,13 +450,23 @@ export function loadConfig(cwd: string): LspConfig {
|
|
|
450
450
|
*/
|
|
451
451
|
export function getServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {
|
|
452
452
|
const ext = path.extname(filePath).toLowerCase();
|
|
453
|
+
const extNoDot = ext.startsWith(".") ? ext.slice(1) : ext;
|
|
453
454
|
const fileName = path.basename(filePath).toLowerCase();
|
|
454
455
|
const matches: Array<[string, ServerConfig]> = [];
|
|
455
456
|
|
|
456
457
|
for (const [name, serverConfig] of Object.entries(config.servers)) {
|
|
457
458
|
const supportsFile = serverConfig.fileTypes.some(fileType => {
|
|
459
|
+
// Accept both `.ts` and `ts` forms in user config / fixtures so a
|
|
460
|
+
// missing dot in `fileTypes` doesn't silently exclude the server
|
|
461
|
+
// from extension-based routing (e.g. rename_file's relevance filter).
|
|
458
462
|
const normalized = fileType.toLowerCase();
|
|
459
|
-
|
|
463
|
+
const normalizedNoDot = normalized.startsWith(".") ? normalized.slice(1) : normalized;
|
|
464
|
+
return (
|
|
465
|
+
normalized === ext ||
|
|
466
|
+
normalized === fileName ||
|
|
467
|
+
normalizedNoDot === extNoDot ||
|
|
468
|
+
normalizedNoDot === fileName
|
|
469
|
+
);
|
|
460
470
|
});
|
|
461
471
|
|
|
462
472
|
if (supportsFile) {
|
package/src/lsp/defaults.json
CHANGED
|
@@ -248,6 +248,12 @@
|
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
250
|
},
|
|
251
|
+
"expert": {
|
|
252
|
+
"command": "expert",
|
|
253
|
+
"args": ["--stdio"],
|
|
254
|
+
"fileTypes": [".ex", ".exs", ".heex", ".eex"],
|
|
255
|
+
"rootMarkers": ["mix.exs", "mix.lock"]
|
|
256
|
+
},
|
|
251
257
|
"erlangls": {
|
|
252
258
|
"command": "erlang_ls",
|
|
253
259
|
"args": [],
|
package/src/lsp/edits.ts
CHANGED
|
@@ -24,27 +24,7 @@ import { uriToFile } from "./utils";
|
|
|
24
24
|
*/
|
|
25
25
|
export function applyTextEditsToString(content: string, edits: TextEdit[]): string {
|
|
26
26
|
const lines = content.split("\n");
|
|
27
|
-
|
|
28
|
-
// Sort edits in reverse order (bottom-to-top, right-to-left)
|
|
29
|
-
const sortedEdits = [...edits].sort((a, b) => {
|
|
30
|
-
if (a.range.start.line !== b.range.start.line) {
|
|
31
|
-
return b.range.start.line - a.range.start.line;
|
|
32
|
-
}
|
|
33
|
-
return b.range.start.character - a.range.start.character;
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Detect overlapping ranges: in reverse-sorted order, each edit's start
|
|
37
|
-
// must be >= the next edit's end. If not, the edits would clobber each other
|
|
38
|
-
// once applied bottom-up (typically a multi-server rename with stale positions).
|
|
39
|
-
for (let i = 0; i < sortedEdits.length - 1; i++) {
|
|
40
|
-
const later = sortedEdits[i].range;
|
|
41
|
-
const earlier = sortedEdits[i + 1].range;
|
|
42
|
-
if (comparePosition(earlier.end, later.start) > 0) {
|
|
43
|
-
throw new ToolError(
|
|
44
|
-
`overlapping LSP edits: ${formatRange(earlier)} conflicts with ${formatRange(later)}; multi-server rename produced inconsistent edits`,
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
27
|
+
const sortedEdits = sortAndValidateTextEdits(edits);
|
|
48
28
|
|
|
49
29
|
for (const edit of sortedEdits) {
|
|
50
30
|
const { start, end } = edit.range;
|
|
@@ -78,6 +58,42 @@ export function rangesOverlap(a: Range, b: Range): boolean {
|
|
|
78
58
|
return comparePosition(a.start, b.end) < 0 && comparePosition(b.start, a.end) < 0;
|
|
79
59
|
}
|
|
80
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Sort edits bottom-to-top for in-place application and reject overlaps.
|
|
63
|
+
* Equal start positions tiebreak by original array index descending so that,
|
|
64
|
+
* applied bottom-up, inserts at the same position land in array order
|
|
65
|
+
* (LSP spec: the order of edits in the array defines the order in the result).
|
|
66
|
+
*/
|
|
67
|
+
export function sortAndValidateTextEdits(edits: TextEdit[]): TextEdit[] {
|
|
68
|
+
const sorted = edits
|
|
69
|
+
.map((edit, index) => ({ edit, index }))
|
|
70
|
+
.sort((a, b) => {
|
|
71
|
+
if (a.edit.range.start.line !== b.edit.range.start.line) {
|
|
72
|
+
return b.edit.range.start.line - a.edit.range.start.line;
|
|
73
|
+
}
|
|
74
|
+
if (a.edit.range.start.character !== b.edit.range.start.character) {
|
|
75
|
+
return b.edit.range.start.character - a.edit.range.start.character;
|
|
76
|
+
}
|
|
77
|
+
return b.index - a.index;
|
|
78
|
+
})
|
|
79
|
+
.map(entry => entry.edit);
|
|
80
|
+
|
|
81
|
+
// Detect overlapping ranges: in reverse-sorted order, each edit's start
|
|
82
|
+
// must be >= the next edit's end. If not, the edits would clobber each other
|
|
83
|
+
// once applied bottom-up (typically a multi-server rename with stale positions).
|
|
84
|
+
for (let i = 0; i < sorted.length - 1; i++) {
|
|
85
|
+
const later = sorted[i].range;
|
|
86
|
+
const earlier = sorted[i + 1].range;
|
|
87
|
+
if (comparePosition(earlier.end, later.start) > 0) {
|
|
88
|
+
throw new ToolError(
|
|
89
|
+
`overlapping LSP edits: ${formatRange(earlier)} conflicts with ${formatRange(later)}; multi-server rename produced inconsistent edits`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return sorted;
|
|
95
|
+
}
|
|
96
|
+
|
|
81
97
|
/**
|
|
82
98
|
* Flatten a WorkspaceEdit's text edits into a Map<uri, TextEdit[]>.
|
|
83
99
|
* Resource operations (create/rename/delete) are ignored — callers handle them separately.
|
|
@@ -120,92 +136,124 @@ export async function applyTextEdits(filePath: string, edits: TextEdit[]): Promi
|
|
|
120
136
|
// Workspace Edit Application
|
|
121
137
|
// =============================================================================
|
|
122
138
|
|
|
139
|
+
type WorkspaceEditOp =
|
|
140
|
+
| { kind: "text"; uri: string; edits: TextEdit[] }
|
|
141
|
+
| { kind: "create"; uri: string }
|
|
142
|
+
| { kind: "rename"; oldUri: string; newUri: string }
|
|
143
|
+
| { kind: "delete"; uri: string };
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Flatten documentChanges into an ordered op list. Text edits are accumulated
|
|
147
|
+
* per-URI and flushed before any resource op that touches the same URI (or,
|
|
148
|
+
* for folder rename/delete, any descendant URI) so that renames, creates, and
|
|
149
|
+
* deletes always see the correct prior file state.
|
|
150
|
+
*/
|
|
151
|
+
function planDocumentChanges(documentChanges: NonNullable<WorkspaceEdit["documentChanges"]>): WorkspaceEditOp[] {
|
|
152
|
+
const ops: WorkspaceEditOp[] = [];
|
|
153
|
+
const pending = new Map<string, TextEdit[]>();
|
|
154
|
+
|
|
155
|
+
const flushUri = (uri: string) => {
|
|
156
|
+
const edits = pending.get(uri);
|
|
157
|
+
if (!edits) return;
|
|
158
|
+
pending.delete(uri);
|
|
159
|
+
ops.push({ kind: "text", uri, edits });
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// Flush the exact URI plus every pending descendant (for folder-level
|
|
163
|
+
// resource ops where the queued edits target child files of the target).
|
|
164
|
+
const flushSubtree = (uri: string) => {
|
|
165
|
+
const prefix = uri.endsWith("/") ? uri : `${uri}/`;
|
|
166
|
+
const matches: string[] = [];
|
|
167
|
+
for (const candidate of pending.keys()) {
|
|
168
|
+
if (candidate === uri || candidate.startsWith(prefix)) matches.push(candidate);
|
|
169
|
+
}
|
|
170
|
+
for (const target of matches) {
|
|
171
|
+
flushUri(target);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
for (const change of documentChanges) {
|
|
176
|
+
if ("textDocument" in change && change.textDocument && "edits" in change && change.edits) {
|
|
177
|
+
const tdc = change as TextDocumentEdit;
|
|
178
|
+
const uri = tdc.textDocument.uri;
|
|
179
|
+
const textEdits = tdc.edits.filter((e): e is TextEdit => "range" in e && "newText" in e);
|
|
180
|
+
if (textEdits.length > 0) {
|
|
181
|
+
const prev = pending.get(uri);
|
|
182
|
+
if (prev) prev.push(...textEdits);
|
|
183
|
+
else pending.set(uri, [...textEdits]);
|
|
184
|
+
}
|
|
185
|
+
} else if ("kind" in change && change.kind) {
|
|
186
|
+
if (change.kind === "create") {
|
|
187
|
+
const createOp = change as CreateFile;
|
|
188
|
+
flushUri(createOp.uri);
|
|
189
|
+
ops.push({ kind: "create", uri: createOp.uri });
|
|
190
|
+
} else if (change.kind === "rename") {
|
|
191
|
+
const renameOp = change as RenameFile;
|
|
192
|
+
// Per LSP §3.16.2 documentChanges are applied in declared order.
|
|
193
|
+
// Flush both the source subtree (so prior edits land before the move)
|
|
194
|
+
// AND the destination subtree (so prior edits land on whatever exists
|
|
195
|
+
// at newUri before the rename overwrites/replaces it — relevant under
|
|
196
|
+
// `options.overwrite` and `options.ignoreIfExists`).
|
|
197
|
+
flushSubtree(renameOp.oldUri);
|
|
198
|
+
flushSubtree(renameOp.newUri);
|
|
199
|
+
ops.push({ kind: "rename", oldUri: renameOp.oldUri, newUri: renameOp.newUri });
|
|
200
|
+
} else if (change.kind === "delete") {
|
|
201
|
+
const deleteOp = change as DeleteFile;
|
|
202
|
+
flushSubtree(deleteOp.uri);
|
|
203
|
+
ops.push({ kind: "delete", uri: deleteOp.uri });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Flush text edits not followed by a resource op.
|
|
209
|
+
for (const uri of [...pending.keys()]) {
|
|
210
|
+
flushUri(uri);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return ops;
|
|
214
|
+
}
|
|
215
|
+
|
|
123
216
|
/**
|
|
124
217
|
* Apply a workspace edit (collection of file changes).
|
|
218
|
+
* All text-edit batches are overlap-validated before anything is written so a
|
|
219
|
+
* conflict throws without leaving the workspace half-applied.
|
|
125
220
|
* Returns array of applied change descriptions.
|
|
126
221
|
*/
|
|
127
222
|
export async function applyWorkspaceEdit(edit: WorkspaceEdit, cwd: string): Promise<string[]> {
|
|
128
223
|
const applied: string[] = [];
|
|
129
224
|
|
|
130
225
|
if (edit.documentChanges) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// always see the correct prior file state.
|
|
135
|
-
const pending = new Map<string, TextEdit[]>();
|
|
136
|
-
|
|
137
|
-
const flushUri = async (uri: string) => {
|
|
138
|
-
const edits = pending.get(uri);
|
|
139
|
-
if (!edits) return;
|
|
140
|
-
pending.delete(uri);
|
|
141
|
-
const filePath = uriToFile(uri);
|
|
142
|
-
await applyTextEdits(filePath, edits);
|
|
143
|
-
applied.push(`Applied ${edits.length} edit(s) to ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
// Flush the exact URI plus every pending descendant (for folder-level
|
|
147
|
-
// resource ops where the queued edits target child files of the target).
|
|
148
|
-
const flushSubtree = async (uri: string) => {
|
|
149
|
-
const prefix = uri.endsWith("/") ? uri : `${uri}/`;
|
|
150
|
-
const matches: string[] = [];
|
|
151
|
-
for (const candidate of pending.keys()) {
|
|
152
|
-
if (candidate === uri || candidate.startsWith(prefix)) matches.push(candidate);
|
|
153
|
-
}
|
|
154
|
-
for (const target of matches) {
|
|
155
|
-
await flushUri(target);
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
for (const change of edit.documentChanges) {
|
|
160
|
-
if ("textDocument" in change && change.textDocument && "edits" in change && change.edits) {
|
|
161
|
-
const tdc = change as TextDocumentEdit;
|
|
162
|
-
const uri = tdc.textDocument.uri;
|
|
163
|
-
const textEdits = tdc.edits.filter((e): e is TextEdit => "range" in e && "newText" in e);
|
|
164
|
-
if (textEdits.length > 0) {
|
|
165
|
-
const prev = pending.get(uri);
|
|
166
|
-
if (prev) prev.push(...textEdits);
|
|
167
|
-
else pending.set(uri, [...textEdits]);
|
|
168
|
-
}
|
|
169
|
-
} else if ("kind" in change && change.kind) {
|
|
170
|
-
if (change.kind === "create") {
|
|
171
|
-
const createOp = change as CreateFile;
|
|
172
|
-
await flushUri(createOp.uri);
|
|
173
|
-
const filePath = uriToFile(createOp.uri);
|
|
174
|
-
await Bun.write(filePath, "");
|
|
175
|
-
applied.push(`Created ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
176
|
-
} else if (change.kind === "rename") {
|
|
177
|
-
const renameOp = change as RenameFile;
|
|
178
|
-
// Per LSP §3.16.2 documentChanges are applied in declared order.
|
|
179
|
-
// Flush both the source subtree (so prior edits land before the move)
|
|
180
|
-
// AND the destination subtree (so prior edits land on whatever exists
|
|
181
|
-
// at newUri before the rename overwrites/replaces it — relevant under
|
|
182
|
-
// `options.overwrite` and `options.ignoreIfExists`).
|
|
183
|
-
await flushSubtree(renameOp.oldUri);
|
|
184
|
-
await flushSubtree(renameOp.newUri);
|
|
185
|
-
const oldPath = uriToFile(renameOp.oldUri);
|
|
186
|
-
const newPath = uriToFile(renameOp.newUri);
|
|
187
|
-
await fs.mkdir(path.dirname(newPath), { recursive: true });
|
|
188
|
-
await fs.rename(oldPath, newPath);
|
|
189
|
-
applied.push(
|
|
190
|
-
`Renamed ${formatPathRelativeToCwd(oldPath, cwd)} → ${formatPathRelativeToCwd(newPath, cwd)}`,
|
|
191
|
-
);
|
|
192
|
-
} else if (change.kind === "delete") {
|
|
193
|
-
const deleteOp = change as DeleteFile;
|
|
194
|
-
await flushSubtree(deleteOp.uri);
|
|
195
|
-
const filePath = uriToFile(deleteOp.uri);
|
|
196
|
-
await fs.rm(filePath, { recursive: true });
|
|
197
|
-
applied.push(`Deleted ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
226
|
+
const ops = planDocumentChanges(edit.documentChanges);
|
|
227
|
+
for (const op of ops) {
|
|
228
|
+
if (op.kind === "text") sortAndValidateTextEdits(op.edits);
|
|
200
229
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
230
|
+
for (const op of ops) {
|
|
231
|
+
if (op.kind === "text") {
|
|
232
|
+
const filePath = uriToFile(op.uri);
|
|
233
|
+
await applyTextEdits(filePath, op.edits);
|
|
234
|
+
applied.push(`Applied ${op.edits.length} edit(s) to ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
235
|
+
} else if (op.kind === "create") {
|
|
236
|
+
const filePath = uriToFile(op.uri);
|
|
237
|
+
await Bun.write(filePath, "");
|
|
238
|
+
applied.push(`Created ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
239
|
+
} else if (op.kind === "rename") {
|
|
240
|
+
const oldPath = uriToFile(op.oldUri);
|
|
241
|
+
const newPath = uriToFile(op.newUri);
|
|
242
|
+
await fs.mkdir(path.dirname(newPath), { recursive: true });
|
|
243
|
+
await fs.rename(oldPath, newPath);
|
|
244
|
+
applied.push(`Renamed ${formatPathRelativeToCwd(oldPath, cwd)} → ${formatPathRelativeToCwd(newPath, cwd)}`);
|
|
245
|
+
} else {
|
|
246
|
+
const filePath = uriToFile(op.uri);
|
|
247
|
+
await fs.rm(filePath, { recursive: true });
|
|
248
|
+
applied.push(`Deleted ${formatPathRelativeToCwd(filePath, cwd)}`);
|
|
249
|
+
}
|
|
205
250
|
}
|
|
206
251
|
} else if (edit.changes) {
|
|
207
|
-
// Legacy changes-map path:
|
|
252
|
+
// Legacy changes-map path: validate every file's edits before writing any.
|
|
208
253
|
const changes = edit.changes;
|
|
254
|
+
for (const uri in changes) {
|
|
255
|
+
sortAndValidateTextEdits(changes[uri]);
|
|
256
|
+
}
|
|
209
257
|
for (const uri in changes) {
|
|
210
258
|
const textEdits = changes[uri];
|
|
211
259
|
if (textEdits.length === 0) continue;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-file LSP `FormattingOptions` resolution.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the historical hardcoded `{ tabSize: 3, insertSpaces: true }` default
|
|
5
|
+
* that fed every `textDocument/formatting` request — it silently re-indented
|
|
6
|
+
* 2-space YAML (and any LSP-formatted file) on every write/edit (issue #2329).
|
|
7
|
+
*
|
|
8
|
+
* Precedence, highest to lowest:
|
|
9
|
+
* 1. `.editorconfig` in the file's chain (`indent_style`, `indent_size`, `tab_width`).
|
|
10
|
+
* 2. Indent detected from the file content the agent is about to write.
|
|
11
|
+
* 3. Hardcoded fallback — 2 spaces, matching the dominant convention for YAML,
|
|
12
|
+
* JSON, JS/TS, Python (PEP 8 is 4 but most LSP servers honour their own
|
|
13
|
+
* defaults when ours don't disagree), and most config formats. The previous
|
|
14
|
+
* `3` default was an unusual stride that actively damaged every file with
|
|
15
|
+
* a 2/4-space convention.
|
|
16
|
+
*/
|
|
17
|
+
import { getEditorConfigFormatting } from "@prometheus-ai/utils";
|
|
18
|
+
|
|
19
|
+
/** Subset of the LSP `FormattingOptions` we send. */
|
|
20
|
+
export interface LspFormattingOptions {
|
|
21
|
+
tabSize: number;
|
|
22
|
+
insertSpaces: boolean;
|
|
23
|
+
trimTrailingWhitespace: boolean;
|
|
24
|
+
insertFinalNewline: boolean;
|
|
25
|
+
trimFinalNewlines: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Sensible fallback when neither `.editorconfig` nor file content pins the indent. */
|
|
29
|
+
const FALLBACK_TAB_SIZE = 2;
|
|
30
|
+
const FALLBACK_INSERT_SPACES = true;
|
|
31
|
+
|
|
32
|
+
/** Static flags we always pass — these have no per-file analogue and match common formatter expectations. */
|
|
33
|
+
const TRIM_OPTIONS = {
|
|
34
|
+
trimTrailingWhitespace: true,
|
|
35
|
+
insertFinalNewline: true,
|
|
36
|
+
trimFinalNewlines: true,
|
|
37
|
+
} as const;
|
|
38
|
+
|
|
39
|
+
interface DetectedIndent {
|
|
40
|
+
tabSize?: number;
|
|
41
|
+
insertSpaces?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Sniff `insertSpaces` and the indent unit from `content`.
|
|
46
|
+
*
|
|
47
|
+
* Walks the buffer once: the first indented line decides spaces vs tabs; for
|
|
48
|
+
* space indents, the GCD of all space-indent widths gives the stride (so a
|
|
49
|
+
* 2/4/6 file reports `2`, a 4/8 file reports `4`). Returns `undefined` for any
|
|
50
|
+
* field the content does not pin so a higher-precedence override (editorconfig)
|
|
51
|
+
* can win without being overwritten by sniffing noise.
|
|
52
|
+
*/
|
|
53
|
+
export function detectIndentFromContent(content: string): DetectedIndent {
|
|
54
|
+
if (content.length === 0) return {};
|
|
55
|
+
|
|
56
|
+
let insertSpaces: boolean | undefined;
|
|
57
|
+
let unit = 0;
|
|
58
|
+
|
|
59
|
+
// Split is the cheapest reliable line walk on arbitrary text; the
|
|
60
|
+
// per-line regex matches are O(leading whitespace) so total cost is
|
|
61
|
+
// linear in the file's indented prefix bytes.
|
|
62
|
+
for (const line of content.split("\n")) {
|
|
63
|
+
// Skip blank/whitespace-only lines — they carry no indent signal.
|
|
64
|
+
if (line.length === 0 || line.trim().length === 0) continue;
|
|
65
|
+
|
|
66
|
+
const first = line[0];
|
|
67
|
+
if (first !== " " && first !== "\t") continue;
|
|
68
|
+
|
|
69
|
+
if (insertSpaces === undefined) {
|
|
70
|
+
insertSpaces = first === " ";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Tab-indented file: the unit is one tab per level; tabSize is a
|
|
74
|
+
// display concern, leave it to caller defaults / editorconfig.
|
|
75
|
+
if (first === "\t") continue;
|
|
76
|
+
|
|
77
|
+
// Space-indented: count the leading spaces (stop at first tab to avoid
|
|
78
|
+
// mixing). GCD across non-zero widths converges on the stride.
|
|
79
|
+
let n = 0;
|
|
80
|
+
while (n < line.length && line[n] === " ") n++;
|
|
81
|
+
if (n === 0) continue;
|
|
82
|
+
unit = unit === 0 ? n : gcd(unit, n);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const result: DetectedIndent = {};
|
|
86
|
+
if (insertSpaces !== undefined) result.insertSpaces = insertSpaces;
|
|
87
|
+
if (unit > 0 && insertSpaces === true) result.tabSize = unit;
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function gcd(a: number, b: number): number {
|
|
92
|
+
let x = a;
|
|
93
|
+
let y = b;
|
|
94
|
+
while (y !== 0) {
|
|
95
|
+
const t = y;
|
|
96
|
+
y = x % y;
|
|
97
|
+
x = t;
|
|
98
|
+
}
|
|
99
|
+
return x;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Resolve the `FormattingOptions` payload for a `textDocument/formatting` request
|
|
104
|
+
* targeting `filePath` with `content`.
|
|
105
|
+
*
|
|
106
|
+
* The two fields that actually affect on-disk bytes (`tabSize`, `insertSpaces`)
|
|
107
|
+
* are layered: editorconfig wins, then content sniffing, then the fallback.
|
|
108
|
+
* Trim/final-newline flags are static.
|
|
109
|
+
*/
|
|
110
|
+
export function resolveFormatOptions(filePath: string, content: string): LspFormattingOptions {
|
|
111
|
+
const fromConfig = getEditorConfigFormatting(filePath);
|
|
112
|
+
const detected = detectIndentFromContent(content);
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
tabSize: fromConfig.tabSize ?? detected.tabSize ?? FALLBACK_TAB_SIZE,
|
|
116
|
+
insertSpaces: fromConfig.insertSpaces ?? detected.insertSpaces ?? FALLBACK_INSERT_SPACES,
|
|
117
|
+
...TRIM_OPTIONS,
|
|
118
|
+
};
|
|
119
|
+
}
|