@greppleai/grip 0.1.5 → 0.1.6
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 +16 -0
- package/README.md +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/embedded-assets.d.ts.map +1 -1
- package/dist/bun/embedded-assets.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +27 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +117 -152
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -10
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +19 -23
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
- package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
- package/dist/core/compaction/compression-detector.d.ts +1 -0
- package/dist/core/compaction/compression-detector.d.ts.map +1 -1
- package/dist/core/compaction/compression-detector.js +10 -21
- package/dist/core/compaction/compression-detector.js.map +1 -1
- package/dist/core/compaction/compression-economics.d.ts.map +1 -1
- package/dist/core/compaction/compression-economics.js.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +18 -30
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +15 -16
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/grip-agent.d.ts.map +1 -1
- package/dist/core/grip-agent.js +7 -21
- package/dist/core/grip-agent.js.map +1 -1
- package/dist/core/grip-manifest.d.ts.map +1 -1
- package/dist/core/grip-manifest.js.map +1 -1
- package/dist/core/hooks/aggregate.d.ts.map +1 -1
- package/dist/core/hooks/aggregate.js.map +1 -1
- package/dist/core/hooks/config.d.ts.map +1 -1
- package/dist/core/hooks/config.js.map +1 -1
- package/dist/core/hooks/executor.d.ts.map +1 -1
- package/dist/core/hooks/executor.js.map +1 -1
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js.map +1 -1
- package/dist/core/hooks/matcher.d.ts.map +1 -1
- package/dist/core/hooks/matcher.js.map +1 -1
- package/dist/core/hooks/trust-store.d.ts.map +1 -1
- package/dist/core/hooks/trust-store.js +0 -3
- package/dist/core/hooks/trust-store.js.map +1 -1
- package/dist/core/hooks/types.d.ts.map +1 -1
- package/dist/core/hooks/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/instruction-resource-loader.d.ts.map +1 -1
- package/dist/core/instruction-resource-loader.js +0 -3
- package/dist/core/instruction-resource-loader.js.map +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lsp/abort.d.ts.map +1 -1
- package/dist/core/lsp/abort.js.map +1 -1
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +8 -22
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/config-loader.d.ts.map +1 -1
- package/dist/core/lsp/config-loader.js.map +1 -1
- package/dist/core/lsp/config.d.ts.map +1 -1
- package/dist/core/lsp/config.js.map +1 -1
- package/dist/core/lsp/diagnostics.d.ts.map +1 -1
- package/dist/core/lsp/diagnostics.js.map +1 -1
- package/dist/core/lsp/file-sync.d.ts.map +1 -1
- package/dist/core/lsp/file-sync.js +7 -9
- package/dist/core/lsp/file-sync.js.map +1 -1
- package/dist/core/lsp/integration.d.ts.map +1 -1
- package/dist/core/lsp/integration.js.map +1 -1
- package/dist/core/lsp/language-map.d.ts.map +1 -1
- package/dist/core/lsp/language-map.js +2 -7
- package/dist/core/lsp/language-map.js.map +1 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +18 -29
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/navigation.d.ts.map +1 -1
- package/dist/core/lsp/navigation.js.map +1 -1
- package/dist/core/lsp/portable-path.d.ts.map +1 -1
- package/dist/core/lsp/portable-path.js.map +1 -1
- package/dist/core/lsp/refactor.d.ts.map +1 -1
- package/dist/core/lsp/refactor.js.map +1 -1
- package/dist/core/lsp/transport.d.ts.map +1 -1
- package/dist/core/lsp/transport.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -7
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +0 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/contract.js +4 -2
- package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
- package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
- package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/session.js +27 -65
- package/dist/core/remote-workspace-protocol/session.js.map +1 -1
- package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
- package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +0 -48
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js.map +1 -1
- package/dist/core/sandbox/command.d.ts.map +1 -1
- package/dist/core/sandbox/command.js.map +1 -1
- package/dist/core/sandbox/config.d.ts.map +1 -1
- package/dist/core/sandbox/config.js.map +1 -1
- package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
- package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
- package/dist/core/sandbox/lima.d.ts +2 -0
- package/dist/core/sandbox/lima.d.ts.map +1 -1
- package/dist/core/sandbox/lima.js +3 -9
- package/dist/core/sandbox/lima.js.map +1 -1
- package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
- package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
- package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
- package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
- package/dist/core/session/constants.d.ts.map +1 -1
- package/dist/core/session/context-metadata.d.ts.map +1 -1
- package/dist/core/session/context-metadata.js.map +1 -1
- package/dist/core/session/context.d.ts.map +1 -1
- package/dist/core/session/context.js.map +1 -1
- package/dist/core/session/ids.d.ts.map +1 -1
- package/dist/core/session/ids.js.map +1 -1
- package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
- package/dist/core/session/in-memory-session-manager.js +0 -1
- package/dist/core/session/in-memory-session-manager.js.map +1 -1
- package/dist/core/session/in-memory-session.d.ts.map +1 -1
- package/dist/core/session/in-memory-session.js.map +1 -1
- package/dist/core/session/jsonl-errors.d.ts.map +1 -1
- package/dist/core/session/jsonl-errors.js +0 -11
- package/dist/core/session/jsonl-errors.js.map +1 -1
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
- package/dist/core/session/jsonl-helpers.js.map +1 -1
- package/dist/core/session/local-session-manager.d.ts.map +1 -1
- package/dist/core/session/local-session-manager.js +4 -6
- package/dist/core/session/local-session-manager.js.map +1 -1
- package/dist/core/session/local-session.d.ts.map +1 -1
- package/dist/core/session/local-session.js.map +1 -1
- package/dist/core/session/migrations.d.ts.map +1 -1
- package/dist/core/session/migrations.js.map +1 -1
- package/dist/core/session/remote-session-client.d.ts.map +1 -1
- package/dist/core/session/remote-session-client.js +0 -6
- package/dist/core/session/remote-session-client.js.map +1 -1
- package/dist/core/session/remote-session-manager.d.ts.map +1 -1
- package/dist/core/session/remote-session-manager.js +0 -3
- package/dist/core/session/remote-session-manager.js.map +1 -1
- package/dist/core/session/remote-session.d.ts.map +1 -1
- package/dist/core/session/remote-session.js +0 -1
- package/dist/core/session/remote-session.js.map +1 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session.d.ts.map +1 -1
- package/dist/core/session/session.js +1 -5
- package/dist/core/session/session.js.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.js +7 -6
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.js +6 -14
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/remote-session-store.js +3 -8
- package/dist/core/session/stores/remote-session-store.js.map +1 -1
- package/dist/core/session/stores/session-store.d.ts.map +1 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/usage-ledger.d.ts.map +1 -1
- package/dist/core/session/usage-ledger.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +9 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +8 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/compress-context.d.ts.map +1 -1
- package/dist/core/tools/compress-context.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/hash-store.d.ts.map +1 -1
- package/dist/core/tools/hash-store.js.map +1 -1
- package/dist/core/tools/hashline/apply.d.ts.map +1 -1
- package/dist/core/tools/hashline/apply.js.map +1 -1
- package/dist/core/tools/hashline/hash.d.ts.map +1 -1
- package/dist/core/tools/hashline/hash.js.map +1 -1
- package/dist/core/tools/hashline/parse.d.ts.map +1 -1
- package/dist/core/tools/hashline/parse.js.map +1 -1
- package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
- package/dist/core/tools/hashline/resolve.js.map +1 -1
- package/dist/core/tools/hashline-utils.d.ts.map +1 -1
- package/dist/core/tools/hashline-utils.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/operations.d.ts +5 -0
- package/dist/core/tools/operations.d.ts.map +1 -1
- package/dist/core/tools/operations.js +26 -24
- package/dist/core/tools/operations.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +12 -18
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/replace-diff.d.ts.map +1 -1
- package/dist/core/tools/replace-diff.js.map +1 -1
- package/dist/core/tools/replace-normalize.d.ts.map +1 -1
- package/dist/core/tools/replace-normalize.js.map +1 -1
- package/dist/core/tools/replace-render.d.ts +1 -1
- package/dist/core/tools/replace-render.d.ts.map +1 -1
- package/dist/core/tools/replace-render.js.map +1 -1
- package/dist/core/tools/runtime.d.ts.map +1 -1
- package/dist/core/tools/runtime.js.map +1 -1
- package/dist/core/tools/session-history.d.ts.map +1 -1
- package/dist/core/tools/session-history.js.map +1 -1
- package/dist/core/tools/subagent-agents.d.ts.map +1 -1
- package/dist/core/tools/subagent-agents.js.map +1 -1
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/core/tools/workspace-tool-host.d.ts +1 -0
- package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
- package/dist/core/tools/workspace-tool-host.js +36 -22
- package/dist/core/tools/workspace-tool-host.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +0 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/workspace-identity.d.ts.map +1 -1
- package/dist/daemon/activity-budget.d.ts.map +1 -1
- package/dist/daemon/activity-budget.js +2 -3
- package/dist/daemon/activity-budget.js.map +1 -1
- package/dist/daemon/command.d.ts.map +1 -1
- package/dist/daemon/command.js.map +1 -1
- package/dist/daemon/config.d.ts +2 -0
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +4 -0
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/help.d.ts.map +1 -1
- package/dist/daemon/help.js +4 -3
- package/dist/daemon/help.js.map +1 -1
- package/dist/daemon/lsp-config.d.ts.map +1 -1
- package/dist/daemon/lsp-config.js.map +1 -1
- package/dist/daemon/outbound-budget.d.ts.map +1 -1
- package/dist/daemon/outbound-budget.js +2 -4
- package/dist/daemon/outbound-budget.js.map +1 -1
- package/dist/daemon/security.d.ts.map +1 -1
- package/dist/daemon/security.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/shared-connection.d.ts.map +1 -1
- package/dist/daemon/shared-connection.js +10 -15
- package/dist/daemon/shared-connection.js.map +1 -1
- package/dist/daemon/shared-revision.d.ts.map +1 -1
- package/dist/daemon/shared-revision.js +2 -1
- package/dist/daemon/shared-revision.js.map +1 -1
- package/dist/daemon/shared-roots.d.ts.map +1 -1
- package/dist/daemon/shared-roots.js +0 -1
- package/dist/daemon/shared-roots.js.map +1 -1
- package/dist/daemon/workspace-runtime.d.ts +2 -0
- package/dist/daemon/workspace-runtime.d.ts.map +1 -1
- package/dist/daemon/workspace-runtime.js +43 -15
- package/dist/daemon/workspace-runtime.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +3 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +6 -16
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -5
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -6
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -7
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -9
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/hook-execution.js +2 -5
- package/dist/modes/interactive/components/hook-execution.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
- package/dist/modes/interactive/components/message-card.js +0 -1
- package/dist/modes/interactive/components/message-card.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -28
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -12
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -58
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +0 -4
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -24
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +18 -34
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +0 -4
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +14 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +159 -135
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +0 -7
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +10 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/directory-completions.d.ts.map +1 -1
- package/dist/utils/directory-completions.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/grip-user-agent.d.ts.map +1 -1
- package/dist/utils/grip-user-agent.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-process.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +10 -5
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/sandbox.md +6 -0
- package/docs/sessions.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +601 -833
- package/package.json +20 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refactor.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/refactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAU5C,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAaxD,QAAA,MAAM,YAAY;;;;;EAGhB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;EASrB,CAAC;AAcH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACvB;AAifD,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAmGvD;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,iBAAiB,EAAE,qBAAqB,CAAC,CAqEjE","sourcesContent":["import { Text } from \"@greppleai/grip-tui\";\nimport { type Static, Type } from \"typebox\";\nimport type {\n\tCodeAction,\n\tCommand,\n\tDiagnostic,\n\tPosition,\n\tRange,\n\tTextEdit,\n\tWorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"../tools/operations.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\nimport type { LspRuntimeState } from \"./integration.ts\";\nimport type { LspClientRoute, LspClientRouteCollection, LspClientRouteFailure, LspToolFeature } from \"./manager.ts\";\nimport { relativePortablePath } from \"./portable-path.ts\";\n\nconst MAX_ACTIONS = 40;\nconst MAX_EDIT_LINES = 80;\n\nconst positionFields = {\n\tpath: Type.String({ description: \"File path\" }),\n\tline: Type.Integer({ minimum: 1, description: \"Line number, 1-indexed\" }),\n\tcharacter: Type.Integer({ minimum: 1, description: \"Column number, 1-indexed\" }),\n};\n\nconst renameSchema = Type.Object({\n\t...positionFields,\n\tnewName: Type.String({ description: \"New name for the symbol\" }),\n});\n\nconst codeActionsSchema = Type.Object({\n\t...positionFields,\n\tendLine: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End line for a range selection, 1-indexed. Defaults to line.\" }),\n\t),\n\tendCharacter: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End column for a range selection, 1-indexed. Defaults to character.\" }),\n\t),\n\tkind: Type.Optional(Type.String({ description: \"Optional action kind filter, e.g. quickfix, refactor, source.\" })),\n});\n\ntype RenameInput = Static<typeof renameSchema>;\ntype CodeActionsInput = Static<typeof codeActionsSchema>;\n\ninterface OneBasedPosition {\n\tline: number;\n\tcharacter: number;\n}\n\ninterface LspFileInput {\n\tpath: string;\n}\n\nexport interface LspRenameDetails {\n\tfileCount: number;\n\teditCount: number;\n\ttruncated?: boolean;\n\tconflict?: boolean;\n}\n\nexport interface LspCodeActionsDetails {\n\tcount: number;\n\tpreferredCount: number;\n}\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\ninterface TextDocumentEditReference {\n\turi: string;\n\tversion?: number | null;\n}\n\ntype TextDocumentEditLike = {\n\ttextDocument: TextDocumentEditReference;\n\tedits: TextEdit[];\n};\n\ninterface WorkspaceEditEntry {\n\tpath: string;\n\tedit: TextEdit;\n\tversion?: number | null;\n}\n\ninterface WorkspaceEditCollection {\n\tentries: WorkspaceEditEntry[];\n\tresourceOperations: ResourceOperationPreview[];\n\tversionErrors: string[];\n}\n\ninterface WorkspaceEditCollectionContext {\n\tstate: LspRuntimeState;\n\troute: LspClientRoute;\n\tvalidateDocumentVersions: boolean;\n}\n\ninterface WorkspaceEditPreview {\n\tlines: string[];\n\tfileCount: number;\n\teditCount: number;\n\ttruncated: boolean;\n\tsignature: string;\n\tversionErrors: string[];\n}\n\ninterface RenamePreviewResult {\n\tserverId: string;\n\tpreview: WorkspaceEditPreview;\n}\n\ninterface AggregatedAction {\n\titem: CodeAction | Command;\n\troute: LspClientRoute;\n\tserverIds: string[];\n\tpreferred: boolean;\n}\n\ninterface CodeActionRouteOutcome {\n\troute: LspClientRoute;\n\titems: (CodeAction | Command)[];\n\tfailure?: LspClientRouteFailure;\n}\n\nfunction toPosition(input: OneBasedPosition): Position {\n\treturn { line: input.line - 1, character: input.character - 1 };\n}\n\nfunction relativeUriPath(state: LspRuntimeState, route: LspClientRoute, uri: string): string {\n\tconst mapped = route.target.mapper.serverUriToAgentPath(uri);\n\treturn mapped.ok ? relativePortablePath(state.manager.cwd, mapped.value) : `[unmapped URI: ${mapped.reason}]`;\n}\n\nfunction formatTextEdit(edit: TextEdit): string {\n\tconst startLine = edit.range.start.line + 1;\n\tconst startColumn = edit.range.start.character + 1;\n\tconst endLine = edit.range.end.line + 1;\n\tconst endColumn = edit.range.end.character + 1;\n\tconst replacement = edit.newText.replace(/\\n/g, \"\\\\n\");\n\tconst clipped = replacement.length > 120 ? `${replacement.slice(0, 117)}...` : replacement;\n\treturn `${startLine}:${startColumn}-${endLine}:${endColumn} -> ${JSON.stringify(clipped)}`;\n}\n\nfunction isTextDocumentEditLike(value: unknown): value is TextDocumentEditLike {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"textDocument\" in value &&\n\t\t\"edits\" in value &&\n\t\tArray.isArray((value as { edits?: unknown }).edits)\n\t);\n}\n\nfunction stableSerialize(value: unknown, ancestors = new Set<object>()): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? String(value);\n\tif (ancestors.has(value)) return '\"[circular]\"';\n\tancestors.add(value);\n\tlet output: string;\n\tif (Array.isArray(value)) {\n\t\toutput = `[${value.map((item) => stableSerialize(item, ancestors)).join(\",\")}]`;\n\t} else {\n\t\tconst entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));\n\t\toutput = `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, ancestors)}`).join(\",\")}}`;\n\t}\n\tancestors.delete(value);\n\treturn output;\n}\n\ninterface ResourceOperationPreview {\n\tline: string;\n\tpaths: string[];\n\tsignature: string;\n}\n\nfunction normalizeResourceOperation(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tvalue: unknown,\n): ResourceOperationPreview {\n\tif (typeof value !== \"object\" || value === null || !(\"kind\" in value) || typeof value.kind !== \"string\") {\n\t\tconst signature = stableSerialize(value);\n\t\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n\t}\n\tif ((value.kind === \"create\" || value.kind === \"delete\") && \"uri\" in value && typeof value.uri === \"string\") {\n\t\tconst path = relativeUriPath(state, route, value.uri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, path, options });\n\t\treturn { line: `[workspace ${value.kind}: ${path}]`, paths: [path], signature };\n\t}\n\tif (\n\t\tvalue.kind === \"rename\" &&\n\t\t\"oldUri\" in value &&\n\t\ttypeof value.oldUri === \"string\" &&\n\t\t\"newUri\" in value &&\n\t\ttypeof value.newUri === \"string\"\n\t) {\n\t\tconst oldPath = relativeUriPath(state, route, value.oldUri);\n\t\tconst newPath = relativeUriPath(state, route, value.newUri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, oldPath, newPath, options });\n\t\treturn { line: `[workspace rename: ${oldPath} -> ${newPath}]`, paths: [oldPath, newPath], signature };\n\t}\n\tconst signature = stableSerialize(value);\n\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n}\n\nfunction documentVersionError(\n\tcontext: WorkspaceEditCollectionContext,\n\turi: string,\n\tpath: string,\n\tversion: number | null | undefined,\n): string | undefined {\n\tif (!context.validateDocumentVersions || typeof version !== \"number\") return undefined;\n\tconst trackedVersion = context.state.fileSync.getTrackedVersion(uri, context.route.target.instanceKey);\n\tif (trackedVersion === undefined) {\n\t\treturn `unknown tracked version for ${path}; response requires document version ${version}`;\n\t}\n\tif (trackedVersion !== version) {\n\t\treturn `stale document version ${version}; tracked version is ${trackedVersion} for ${path}`;\n\t}\n\treturn undefined;\n}\n\nfunction collectDocumentChanges(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const change of edit.documentChanges ?? []) {\n\t\tif (!isTextDocumentEditLike(change)) {\n\t\t\tcollection.resourceOperations.push(normalizeResourceOperation(context.state, context.route, change));\n\t\t\tcontinue;\n\t\t}\n\t\tconst path = relativeUriPath(context.state, context.route, change.textDocument.uri);\n\t\tconst version = change.textDocument.version;\n\t\tconst versionError = documentVersionError(context, change.textDocument.uri, path, version);\n\t\tif (versionError) collection.versionErrors.push(versionError);\n\t\tfor (const textEdit of change.edits) collection.entries.push({ path, edit: textEdit, version });\n\t}\n}\n\nfunction collectUriTextEdits(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n\t\tconst path = relativeUriPath(context.state, context.route, uri);\n\t\tfor (const textEdit of edits) collection.entries.push({ path, edit: textEdit });\n\t}\n}\n\nfunction sortWorkspaceEditCollection(collection: WorkspaceEditCollection): void {\n\tcollection.entries.sort(\n\t\t(left, right) =>\n\t\t\tleft.path.localeCompare(right.path) ||\n\t\t\tleft.edit.range.start.line - right.edit.range.start.line ||\n\t\t\tleft.edit.range.start.character - right.edit.range.start.character ||\n\t\t\tleft.edit.range.end.line - right.edit.range.end.line ||\n\t\t\tleft.edit.range.end.character - right.edit.range.end.character ||\n\t\t\tleft.edit.newText.localeCompare(right.edit.newText),\n\t);\n\tcollection.resourceOperations.sort((left, right) => left.signature.localeCompare(right.signature));\n}\n\nfunction renderWorkspaceEditLines(collection: WorkspaceEditCollection): string[] {\n\tconst lines: string[] = [];\n\tlet previousDocument: string | undefined;\n\tfor (const entry of collection.entries) {\n\t\tconst versionLabel =\n\t\t\tentry.version === undefined\n\t\t\t\t? \"\"\n\t\t\t\t: entry.version === null\n\t\t\t\t\t? \" (document version: unversioned)\"\n\t\t\t\t\t: ` (document version ${entry.version})`;\n\t\tconst document = `${entry.path}\\u0000${versionLabel}`;\n\t\tif (document !== previousDocument) {\n\t\t\tlines.push(`${entry.path}${versionLabel}:`);\n\t\t\tpreviousDocument = document;\n\t\t}\n\t\tlines.push(` ${formatTextEdit(entry.edit)}`);\n\t}\n\tfor (const operation of collection.resourceOperations) lines.push(operation.line);\n\treturn lines;\n}\n\nfunction workspaceEditSignature(collection: WorkspaceEditCollection): string {\n\tif (collection.entries.length === 0 && collection.resourceOperations.length === 0) return \"[]\";\n\treturn stableSerialize({\n\t\tentries: collection.entries.map((entry) => ({\n\t\t\tpath: entry.path,\n\t\t\trange: entry.edit.range,\n\t\t\tnewText: entry.edit.newText,\n\t\t})),\n\t\tresourceOperations: collection.resourceOperations.map((operation) => operation.signature),\n\t});\n}\n\nfunction collectWorkspaceEditPreview(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tedit: WorkspaceEdit | undefined,\n\tvalidateDocumentVersions = false,\n): WorkspaceEditPreview {\n\tif (!edit) {\n\t\treturn { lines: [], fileCount: 0, editCount: 0, truncated: false, signature: \"[]\", versionErrors: [] };\n\t}\n\tconst context: WorkspaceEditCollectionContext = { state, route, validateDocumentVersions };\n\tconst collection: WorkspaceEditCollection = { entries: [], resourceOperations: [], versionErrors: [] };\n\tcollectDocumentChanges(context, edit, collection);\n\tcollectUriTextEdits(context, edit, collection);\n\tsortWorkspaceEditCollection(collection);\n\tconst lines = renderWorkspaceEditLines(collection);\n\tconst shown = lines.slice(0, MAX_EDIT_LINES);\n\treturn {\n\t\tlines: shown,\n\t\tfileCount: new Set([\n\t\t\t...collection.entries.map((entry) => entry.path),\n\t\t\t...collection.resourceOperations.flatMap((operation) => operation.paths),\n\t\t]).size,\n\t\teditCount: collection.entries.length + collection.resourceOperations.length,\n\t\ttruncated: shown.length < lines.length,\n\t\tsignature: workspaceEditSignature(collection),\n\t\tversionErrors: collection.versionErrors,\n\t};\n}\n\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n\treturn typeof item.command !== \"string\";\n}\n\nfunction comparePosition(left: Position, right: Position): number {\n\treturn left.line - right.line || left.character - right.character;\n}\n\nfunction rangesOverlap(left: Range, right: Range): boolean {\n\treturn comparePosition(left.end, right.start) >= 0 && comparePosition(right.end, left.start) >= 0;\n}\n\nfunction failureText(failures: readonly LspClientRouteFailure[]): string {\n\tconst unique = [\n\t\t...new Map(failures.map((failure) => [`${failure.serverId}\\u0000${failure.reason}`, failure])).values(),\n\t];\n\treturn unique.length === 0\n\t\t? \"\"\n\t\t: `\\n\\nUnavailable or unsupported servers:\\n${unique.map((failure) => `- ${failure.serverId}: ${failure.reason}`).join(\"\\n\")}`;\n}\n\nasync function getClientsAndSync(\n\tstate: LspRuntimeState,\n\tinput: LspFileInput,\n\toperations: ToolOperations,\n\tfeature: LspToolFeature,\n\tsignal?: AbortSignal,\n): Promise<LspClientRouteCollection> {\n\tawait state.manager.setToolOperations(operations, signal);\n\tconst collection = await state.manager.getClientRoutesForFeature(input.path, feature, signal);\n\tif (collection.routes.length > 0) {\n\t\tconst result = await state.fileSync.synchronizeFileRead(input.path, operations, signal);\n\t\tif (result.lifecycleCancelled) {\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: [],\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...collection.routes.map((route) => ({\n\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\treason: \"synchronization was cancelled by an LSP lifecycle change\",\n\t\t\t\t\t})),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tif (result.failures.length > 0) {\n\t\t\tconst failedInstances = new Set(result.failures.map((failure) => failure.instanceKey));\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: collection.routes.filter((route) => !failedInstances.has(route.target.instanceKey)),\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...result.failures.map((failure) => ({ serverId: failure.serverId, reason: failure.reason })),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\treturn collection;\n}\n\nasync function noCapableResult(\n\tstate: LspRuntimeState,\n\tpath: string,\n\tfeature: LspToolFeature,\n\tcollection: LspClientRouteCollection,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tif (collection.matchedServerCount === 0) return state.manager.getUnavailableReason(path, signal);\n\treturn `No capable LSP server is available for ${feature}.${failureText(collection.failures)}`;\n}\n\nfunction rethrowIfAborted(signal: AbortSignal | undefined): void {\n\tthrowIfAborted(signal);\n}\n\nfunction actionKey(item: CodeAction | Command, preview: WorkspaceEditPreview): string {\n\tif (isCodeAction(item)) {\n\t\treturn stableSerialize({\n\t\t\ttitle: item.title,\n\t\t\tkind: item.kind,\n\t\t\tcommand: item.command,\n\t\t\tdata: item.data,\n\t\t\tedit: preview.signature,\n\t\t});\n\t}\n\treturn stableSerialize({ title: item.title, command: item.command, arguments: item.arguments });\n}\n\nasync function requestCodeActions(\n\troute: LspClientRoute,\n\tinput: CodeActionsInput,\n\trange: Range,\n\tsignal: AbortSignal | undefined,\n): Promise<CodeActionRouteOutcome> {\n\ttry {\n\t\tconst uri = route.target.serverUri;\n\t\tconst diagnostics = route.client\n\n\t\t\t.getDiagnostics(uri)\n\n\t\t\t.filter((diagnostic: Diagnostic) => rangesOverlap(diagnostic.range, range));\n\t\tconst response = await route.client.sendRequest<CodeActionResponse>(\n\t\t\t\"textDocument/codeAction\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\trange,\n\t\t\t\tcontext: { diagnostics, only: input.kind ? [input.kind] : undefined },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn { route, items: response ?? [] };\n\t} catch (error) {\n\t\trethrowIfAborted(signal);\n\t\treturn {\n\t\t\troute,\n\t\t\titems: [],\n\t\t\tfailure: {\n\t\t\t\tserverId: route.target.serverId,\n\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction aggregateCodeActions(state: LspRuntimeState, outcomes: readonly CodeActionRouteOutcome[]): AggregatedAction[] {\n\tconst aggregated = new Map<string, AggregatedAction>();\n\tfor (const outcome of outcomes) {\n\t\tfor (const item of outcome.items) {\n\t\t\tconst preview = collectWorkspaceEditPreview(state, outcome.route, isCodeAction(item) ? item.edit : undefined);\n\t\t\tconst key = actionKey(item, preview);\n\t\t\tconst existing = aggregated.get(key);\n\t\t\tif (existing) {\n\t\t\t\tif (!existing.serverIds.includes(outcome.route.target.serverId)) {\n\t\t\t\t\texisting.serverIds.push(outcome.route.target.serverId);\n\t\t\t\t}\n\t\t\t\texisting.preferred ||= isCodeAction(item) && item.isPreferred === true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\taggregated.set(key, {\n\t\t\t\titem,\n\t\t\t\troute: outcome.route,\n\t\t\t\tserverIds: [outcome.route.target.serverId],\n\t\t\t\tpreferred: isCodeAction(item) && item.isPreferred === true,\n\t\t\t});\n\t\t}\n\t}\n\treturn [...aggregated.values()];\n}\n\nfunction renderCodeActionLines(\n\tstate: LspRuntimeState,\n\tactions: readonly AggregatedAction[],\n\tattribute: boolean,\n): string[] {\n\tconst lines: string[] = [];\n\tfor (const [index, action] of actions.slice(0, MAX_ACTIONS).entries()) {\n\t\tconst provider = attribute ? `[${action.serverIds.join(\", \")}] ` : \"\";\n\t\tif (!isCodeAction(action.item)) {\n\t\t\tlines.push(`${index + 1}. ${provider}${action.item.title} [command-only: ${action.item.command}]`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst kind = action.item.kind ? ` [${action.item.kind}]` : \"\";\n\t\tconst preferred = action.preferred ? \" preferred\" : \"\";\n\t\tlines.push(`${index + 1}. ${provider}${action.item.title}${kind}${preferred}`);\n\t\tconst preview = collectWorkspaceEditPreview(state, action.route, action.item.edit);\n\t\tfor (const line of preview.lines.slice(0, 8)) lines.push(` ${line}`);\n\t\tif (preview.truncated) lines.push(\" [edit preview truncated]\");\n\t}\n\tif (actions.length > MAX_ACTIONS) lines.push(`[Showing ${MAX_ACTIONS} of ${actions.length} actions.]`);\n\treturn lines;\n}\n\nfunction consensusRenamePreview(\n\tnewName: string,\n\tpreviews: RenamePreviewResult[],\n\tfailures: readonly LspClientRouteFailure[],\n\tmatchedServerCount: number,\n): AgentToolResult<LspRenameDetails> {\n\tconst bySignature = new Map<string, RenamePreviewResult[]>();\n\tfor (const preview of previews) {\n\t\tbySignature.set(preview.preview.signature, [...(bySignature.get(preview.preview.signature) ?? []), preview]);\n\t}\n\tif (bySignature.size > 1) {\n\t\tconst sections = [...bySignature.values()].map((group) => {\n\t\t\tconst first = group[0];\n\t\t\treturn first.preview.editCount === 0\n\t\t\t\t? `[${group.map((entry) => entry.serverId).join(\", \")}] no edits`\n\t\t\t\t: `[${group.map((entry) => entry.serverId).join(\", \")}] ${first.preview.editCount} edit(s):\\n${first.preview.lines.join(\"\\n\")}`;\n\t\t});\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Conflicting rename previews for ${JSON.stringify(newName)}. No preview was selected and no changes were applied.\\n\\n${sections.join(\"\\n\\n\")}${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: {\n\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\tconflict: true,\n\t\t\t},\n\t\t};\n\t}\n\tconst matching = [...bySignature.values()][0];\n\tconst selected = matching[0];\n\tif (selected.preview.editCount === 0) {\n\t\tconst providers = matching.map((entry) => entry.serverId).join(\", \");\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Rename preview: no edits. Successful provider(s): ${providers}. No changes were applied.${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t};\n\t}\n\tconst attribution =\n\t\tmatchedServerCount > 1 ? ` Selected provider(s): ${matching.map((entry) => entry.serverId).join(\", \")}.` : \"\";\n\tconst suffix = selected.preview.truncated ? `\\n[Showing ${selected.preview.lines.length} edit preview lines.]` : \"\";\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Rename preview for ${JSON.stringify(newName)}: ${selected.preview.editCount} edit(s) across ${selected.preview.fileCount} file(s).${attribution} No changes were applied.\\n\\n${selected.preview.lines.join(\"\\n\")}${suffix}${failureText(failures)}`,\n\t\t\t},\n\t\t],\n\t\tdetails: {\n\t\t\tfileCount: selected.preview.fileCount,\n\t\t\teditCount: selected.preview.editCount,\n\t\t\t...(selected.preview.truncated ? { truncated: true } : {}),\n\t\t},\n\t};\n}\n\nexport function createLspRenameTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof renameSchema, LspRenameDetails> {\n\treturn {\n\t\tname: \"lsp_rename\",\n\t\tlabel: \"lsp_rename\",\n\t\tdescription:\n\t\t\t\"Preview a rename from all capable matching LSP servers. A preview is selected only when every successful response agrees, including empty responses, and document versions are current. Conflicting or stale edits are reported without choosing one. No changes are applied.\",\n\t\tpromptSnippet: \"Preview a symbol rename via LSP without applying changes\",\n\t\tpromptGuidelines: [\"lsp_rename is preview-only. Apply reviewed changes with read/edit using hashline anchors.\"],\n\t\tparameters: renameSchema,\n\t\tasync execute(_toolCallId, input: RenameInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"rename\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"rename\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map(async (route) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await route.client.sendRequest<WorkspaceEdit | null>(\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri: route.target.serverUri },\n\t\t\t\t\t\t\t\tposition: toPosition(input),\n\t\t\t\t\t\t\t\tnewName: input.newName,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\tpreview: collectWorkspaceEditPreview(state, route, result ?? undefined, true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\trethrowIfAborted(signal);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfailure: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t} satisfies LspClientRouteFailure,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst previews = outcomes.flatMap((outcome) => (outcome.result ? [outcome.result] : []));\n\t\t\tif (previews.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `No LSP server returned a rename preview. No changes were applied.${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst unsafeVersions = previews.flatMap((entry) =>\n\t\t\t\tentry.preview.versionErrors.map((reason) => `[${entry.serverId}] ${reason}`),\n\t\t\t);\n\t\t\tif (unsafeVersions.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Unsafe rename preview for ${JSON.stringify(input.newName)} due to stale or unknown document versions. No preview was selected and no changes were applied.\\n\\n${unsafeVersions.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\t\t\tconflict: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn consensusRenamePreview(input.newName, previews, failures, collection.matchedServerCount);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_rename\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)} -> ${theme.fg(\"muted\", args.newName)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function createLspCodeActionsTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof codeActionsSchema, LspCodeActionsDetails> {\n\treturn {\n\t\tname: \"lsp_code_actions\",\n\t\tlabel: \"lsp_code_actions\",\n\t\tdescription:\n\t\t\t\"List code actions from all capable matching LSP servers. Identical actions are deduplicated, distinct actions are attributed, and edit previews are never applied.\",\n\t\tpromptSnippet: \"List available LSP code actions and refactorings\",\n\t\tpromptGuidelines: [\n\t\t\t\"lsp_code_actions is preview-only. Apply reviewed edits with read/edit using hashline anchors.\",\n\t\t],\n\t\tparameters: codeActionsSchema,\n\t\tasync execute(_toolCallId, input: CodeActionsInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"codeActions\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"codeActions\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst range: Range = {\n\t\t\t\tstart: toPosition(input),\n\t\t\t\tend: {\n\t\t\t\t\tline: (input.endLine ?? input.line) - 1,\n\t\t\t\t\tcharacter: (input.endCharacter ?? input.character) - 1,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map((route) => requestCodeActions(route, input, range, signal)),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst actions = aggregateCodeActions(state, outcomes);\n\t\t\tif (actions.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `No code actions available.${failureText(failures)}` }],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst preferredCount = actions.filter((action) => action.preferred).length;\n\t\t\tconst lines = renderCodeActionLines(state, actions, collection.matchedServerCount > 1);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${actions.length} code action(s). No changes were applied.\\n\\n${lines.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { count: actions.length, preferredCount },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"refactor.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/refactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAU5C,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAaxD,QAAA,MAAM,YAAY;;;;;EAGhB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;EASrB,CAAC;AAcH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACvB;AAifD,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAmGvD;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,iBAAiB,EAAE,qBAAqB,CAAC,CAqEjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refactor.js","sourceRoot":"","sources":["../../../src/core/lsp/refactor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@greppleai/grip-tui\";\nimport { type Static, Type } from \"typebox\";\nimport type {\n\tCodeAction,\n\tCommand,\n\tDiagnostic,\n\tPosition,\n\tRange,\n\tTextEdit,\n\tWorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"../tools/operations.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\nimport type { LspRuntimeState } from \"./integration.ts\";\nimport type { LspClientRoute, LspClientRouteCollection, LspClientRouteFailure, LspToolFeature } from \"./manager.ts\";\nimport { relativePortablePath } from \"./portable-path.ts\";\n\nconst MAX_ACTIONS = 40;\nconst MAX_EDIT_LINES = 80;\n\nconst positionFields = {\n\tpath: Type.String({ description: \"File path\" }),\n\tline: Type.Integer({ minimum: 1, description: \"Line number, 1-indexed\" }),\n\tcharacter: Type.Integer({ minimum: 1, description: \"Column number, 1-indexed\" }),\n};\n\nconst renameSchema = Type.Object({\n\t...positionFields,\n\tnewName: Type.String({ description: \"New name for the symbol\" }),\n});\n\nconst codeActionsSchema = Type.Object({\n\t...positionFields,\n\tendLine: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End line for a range selection, 1-indexed. Defaults to line.\" }),\n\t),\n\tendCharacter: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End column for a range selection, 1-indexed. Defaults to character.\" }),\n\t),\n\tkind: Type.Optional(Type.String({ description: \"Optional action kind filter, e.g. quickfix, refactor, source.\" })),\n});\n\ntype RenameInput = Static<typeof renameSchema>;\ntype CodeActionsInput = Static<typeof codeActionsSchema>;\n\ninterface OneBasedPosition {\n\tline: number;\n\tcharacter: number;\n}\n\ninterface LspFileInput {\n\tpath: string;\n}\n\nexport interface LspRenameDetails {\n\tfileCount: number;\n\teditCount: number;\n\ttruncated?: boolean;\n\tconflict?: boolean;\n}\n\nexport interface LspCodeActionsDetails {\n\tcount: number;\n\tpreferredCount: number;\n}\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\ninterface TextDocumentEditReference {\n\turi: string;\n\tversion?: number | null;\n}\n\ntype TextDocumentEditLike = {\n\ttextDocument: TextDocumentEditReference;\n\tedits: TextEdit[];\n};\n\ninterface WorkspaceEditEntry {\n\tpath: string;\n\tedit: TextEdit;\n\tversion?: number | null;\n}\n\ninterface WorkspaceEditCollection {\n\tentries: WorkspaceEditEntry[];\n\tresourceOperations: ResourceOperationPreview[];\n\tversionErrors: string[];\n}\n\ninterface WorkspaceEditCollectionContext {\n\tstate: LspRuntimeState;\n\troute: LspClientRoute;\n\tvalidateDocumentVersions: boolean;\n}\n\ninterface WorkspaceEditPreview {\n\tlines: string[];\n\tfileCount: number;\n\teditCount: number;\n\ttruncated: boolean;\n\tsignature: string;\n\tversionErrors: string[];\n}\n\ninterface RenamePreviewResult {\n\tserverId: string;\n\tpreview: WorkspaceEditPreview;\n}\n\ninterface AggregatedAction {\n\titem: CodeAction | Command;\n\troute: LspClientRoute;\n\tserverIds: string[];\n\tpreferred: boolean;\n}\n\ninterface CodeActionRouteOutcome {\n\troute: LspClientRoute;\n\titems: (CodeAction | Command)[];\n\tfailure?: LspClientRouteFailure;\n}\n\nfunction toPosition(input: OneBasedPosition): Position {\n\treturn { line: input.line - 1, character: input.character - 1 };\n}\n\nfunction relativeUriPath(state: LspRuntimeState, route: LspClientRoute, uri: string): string {\n\tconst mapped = route.target.mapper.serverUriToAgentPath(uri);\n\treturn mapped.ok ? relativePortablePath(state.manager.cwd, mapped.value) : `[unmapped URI: ${mapped.reason}]`;\n}\n\nfunction formatTextEdit(edit: TextEdit): string {\n\tconst startLine = edit.range.start.line + 1;\n\tconst startColumn = edit.range.start.character + 1;\n\tconst endLine = edit.range.end.line + 1;\n\tconst endColumn = edit.range.end.character + 1;\n\tconst replacement = edit.newText.replace(/\\n/g, \"\\\\n\");\n\tconst clipped = replacement.length > 120 ? `${replacement.slice(0, 117)}...` : replacement;\n\treturn `${startLine}:${startColumn}-${endLine}:${endColumn} -> ${JSON.stringify(clipped)}`;\n}\n\nfunction isTextDocumentEditLike(value: unknown): value is TextDocumentEditLike {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"textDocument\" in value &&\n\t\t\"edits\" in value &&\n\t\tArray.isArray((value as { edits?: unknown }).edits)\n\t);\n}\n\nfunction stableSerialize(value: unknown, ancestors = new Set<object>()): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? String(value);\n\tif (ancestors.has(value)) return '\"[circular]\"';\n\tancestors.add(value);\n\tlet output: string;\n\tif (Array.isArray(value)) {\n\t\toutput = `[${value.map((item) => stableSerialize(item, ancestors)).join(\",\")}]`;\n\t} else {\n\t\tconst entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));\n\t\toutput = `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, ancestors)}`).join(\",\")}}`;\n\t}\n\tancestors.delete(value);\n\treturn output;\n}\n\ninterface ResourceOperationPreview {\n\tline: string;\n\tpaths: string[];\n\tsignature: string;\n}\n\nfunction normalizeResourceOperation(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tvalue: unknown,\n): ResourceOperationPreview {\n\tif (typeof value !== \"object\" || value === null || !(\"kind\" in value) || typeof value.kind !== \"string\") {\n\t\tconst signature = stableSerialize(value);\n\t\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n\t}\n\tif ((value.kind === \"create\" || value.kind === \"delete\") && \"uri\" in value && typeof value.uri === \"string\") {\n\t\tconst path = relativeUriPath(state, route, value.uri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, path, options });\n\t\treturn { line: `[workspace ${value.kind}: ${path}]`, paths: [path], signature };\n\t}\n\tif (\n\t\tvalue.kind === \"rename\" &&\n\t\t\"oldUri\" in value &&\n\t\ttypeof value.oldUri === \"string\" &&\n\t\t\"newUri\" in value &&\n\t\ttypeof value.newUri === \"string\"\n\t) {\n\t\tconst oldPath = relativeUriPath(state, route, value.oldUri);\n\t\tconst newPath = relativeUriPath(state, route, value.newUri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, oldPath, newPath, options });\n\t\treturn { line: `[workspace rename: ${oldPath} -> ${newPath}]`, paths: [oldPath, newPath], signature };\n\t}\n\tconst signature = stableSerialize(value);\n\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n}\n\nfunction documentVersionError(\n\tcontext: WorkspaceEditCollectionContext,\n\turi: string,\n\tpath: string,\n\tversion: number | null | undefined,\n): string | undefined {\n\tif (!context.validateDocumentVersions || typeof version !== \"number\") return undefined;\n\tconst trackedVersion = context.state.fileSync.getTrackedVersion(uri, context.route.target.instanceKey);\n\tif (trackedVersion === undefined) {\n\t\treturn `unknown tracked version for ${path}; response requires document version ${version}`;\n\t}\n\tif (trackedVersion !== version) {\n\t\treturn `stale document version ${version}; tracked version is ${trackedVersion} for ${path}`;\n\t}\n\treturn undefined;\n}\n\nfunction collectDocumentChanges(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const change of edit.documentChanges ?? []) {\n\t\tif (!isTextDocumentEditLike(change)) {\n\t\t\tcollection.resourceOperations.push(normalizeResourceOperation(context.state, context.route, change));\n\t\t\tcontinue;\n\t\t}\n\t\tconst path = relativeUriPath(context.state, context.route, change.textDocument.uri);\n\t\tconst version = change.textDocument.version;\n\t\tconst versionError = documentVersionError(context, change.textDocument.uri, path, version);\n\t\tif (versionError) collection.versionErrors.push(versionError);\n\t\tfor (const textEdit of change.edits) collection.entries.push({ path, edit: textEdit, version });\n\t}\n}\n\nfunction collectUriTextEdits(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n\t\tconst path = relativeUriPath(context.state, context.route, uri);\n\t\tfor (const textEdit of edits) collection.entries.push({ path, edit: textEdit });\n\t}\n}\n\nfunction sortWorkspaceEditCollection(collection: WorkspaceEditCollection): void {\n\tcollection.entries.sort(\n\t\t(left, right) =>\n\t\t\tleft.path.localeCompare(right.path) ||\n\t\t\tleft.edit.range.start.line - right.edit.range.start.line ||\n\t\t\tleft.edit.range.start.character - right.edit.range.start.character ||\n\t\t\tleft.edit.range.end.line - right.edit.range.end.line ||\n\t\t\tleft.edit.range.end.character - right.edit.range.end.character ||\n\t\t\tleft.edit.newText.localeCompare(right.edit.newText),\n\t);\n\tcollection.resourceOperations.sort((left, right) => left.signature.localeCompare(right.signature));\n}\n\nfunction renderWorkspaceEditLines(collection: WorkspaceEditCollection): string[] {\n\tconst lines: string[] = [];\n\tlet previousDocument: string | undefined;\n\tfor (const entry of collection.entries) {\n\t\tconst versionLabel =\n\t\t\tentry.version === undefined\n\t\t\t\t? \"\"\n\t\t\t\t: entry.version === null\n\t\t\t\t\t? \" (document version: unversioned)\"\n\t\t\t\t\t: ` (document version ${entry.version})`;\n\t\tconst document = `${entry.path}\\u0000${versionLabel}`;\n\t\tif (document !== previousDocument) {\n\t\t\tlines.push(`${entry.path}${versionLabel}:`);\n\t\t\tpreviousDocument = document;\n\t\t}\n\t\tlines.push(` ${formatTextEdit(entry.edit)}`);\n\t}\n\tfor (const operation of collection.resourceOperations) lines.push(operation.line);\n\treturn lines;\n}\n\nfunction workspaceEditSignature(collection: WorkspaceEditCollection): string {\n\tif (collection.entries.length === 0 && collection.resourceOperations.length === 0) return \"[]\";\n\treturn stableSerialize({\n\t\tentries: collection.entries.map((entry) => ({\n\t\t\tpath: entry.path,\n\t\t\trange: entry.edit.range,\n\t\t\tnewText: entry.edit.newText,\n\t\t})),\n\t\tresourceOperations: collection.resourceOperations.map((operation) => operation.signature),\n\t});\n}\n\nfunction collectWorkspaceEditPreview(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tedit: WorkspaceEdit | undefined,\n\tvalidateDocumentVersions = false,\n): WorkspaceEditPreview {\n\tif (!edit) {\n\t\treturn { lines: [], fileCount: 0, editCount: 0, truncated: false, signature: \"[]\", versionErrors: [] };\n\t}\n\tconst context: WorkspaceEditCollectionContext = { state, route, validateDocumentVersions };\n\tconst collection: WorkspaceEditCollection = { entries: [], resourceOperations: [], versionErrors: [] };\n\tcollectDocumentChanges(context, edit, collection);\n\tcollectUriTextEdits(context, edit, collection);\n\tsortWorkspaceEditCollection(collection);\n\tconst lines = renderWorkspaceEditLines(collection);\n\tconst shown = lines.slice(0, MAX_EDIT_LINES);\n\treturn {\n\t\tlines: shown,\n\t\tfileCount: new Set([\n\t\t\t...collection.entries.map((entry) => entry.path),\n\t\t\t...collection.resourceOperations.flatMap((operation) => operation.paths),\n\t\t]).size,\n\t\teditCount: collection.entries.length + collection.resourceOperations.length,\n\t\ttruncated: shown.length < lines.length,\n\t\tsignature: workspaceEditSignature(collection),\n\t\tversionErrors: collection.versionErrors,\n\t};\n}\n\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n\treturn typeof item.command !== \"string\";\n}\n\nfunction comparePosition(left: Position, right: Position): number {\n\treturn left.line - right.line || left.character - right.character;\n}\n\nfunction rangesOverlap(left: Range, right: Range): boolean {\n\treturn comparePosition(left.end, right.start) >= 0 && comparePosition(right.end, left.start) >= 0;\n}\n\nfunction failureText(failures: readonly LspClientRouteFailure[]): string {\n\tconst unique = [\n\t\t...new Map(failures.map((failure) => [`${failure.serverId}\\u0000${failure.reason}`, failure])).values(),\n\t];\n\treturn unique.length === 0\n\t\t? \"\"\n\t\t: `\\n\\nUnavailable or unsupported servers:\\n${unique.map((failure) => `- ${failure.serverId}: ${failure.reason}`).join(\"\\n\")}`;\n}\n\nasync function getClientsAndSync(\n\tstate: LspRuntimeState,\n\tinput: LspFileInput,\n\toperations: ToolOperations,\n\tfeature: LspToolFeature,\n\tsignal?: AbortSignal,\n): Promise<LspClientRouteCollection> {\n\tawait state.manager.setToolOperations(operations, signal);\n\tconst collection = await state.manager.getClientRoutesForFeature(input.path, feature, signal);\n\tif (collection.routes.length > 0) {\n\t\tconst result = await state.fileSync.synchronizeFileRead(input.path, operations, signal);\n\t\tif (result.lifecycleCancelled) {\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: [],\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...collection.routes.map((route) => ({\n\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\treason: \"synchronization was cancelled by an LSP lifecycle change\",\n\t\t\t\t\t})),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tif (result.failures.length > 0) {\n\t\t\tconst failedInstances = new Set(result.failures.map((failure) => failure.instanceKey));\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: collection.routes.filter((route) => !failedInstances.has(route.target.instanceKey)),\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...result.failures.map((failure) => ({ serverId: failure.serverId, reason: failure.reason })),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\treturn collection;\n}\n\nasync function noCapableResult(\n\tstate: LspRuntimeState,\n\tpath: string,\n\tfeature: LspToolFeature,\n\tcollection: LspClientRouteCollection,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tif (collection.matchedServerCount === 0) return state.manager.getUnavailableReason(path, signal);\n\treturn `No capable LSP server is available for ${feature}.${failureText(collection.failures)}`;\n}\n\nfunction rethrowIfAborted(signal: AbortSignal | undefined): void {\n\tthrowIfAborted(signal);\n}\n\nfunction actionKey(item: CodeAction | Command, preview: WorkspaceEditPreview): string {\n\tif (isCodeAction(item)) {\n\t\treturn stableSerialize({\n\t\t\ttitle: item.title,\n\t\t\tkind: item.kind,\n\t\t\tcommand: item.command,\n\t\t\tdata: item.data,\n\t\t\tedit: preview.signature,\n\t\t});\n\t}\n\treturn stableSerialize({ title: item.title, command: item.command, arguments: item.arguments });\n}\n\nasync function requestCodeActions(\n\troute: LspClientRoute,\n\tinput: CodeActionsInput,\n\trange: Range,\n\tsignal: AbortSignal | undefined,\n): Promise<CodeActionRouteOutcome> {\n\ttry {\n\t\tconst uri = route.target.serverUri;\n\t\tconst diagnostics = route.client\n\n\t\t\t.getDiagnostics(uri)\n\n\t\t\t.filter((diagnostic: Diagnostic) => rangesOverlap(diagnostic.range, range));\n\t\tconst response = await route.client.sendRequest<CodeActionResponse>(\n\t\t\t\"textDocument/codeAction\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\trange,\n\t\t\t\tcontext: { diagnostics, only: input.kind ? [input.kind] : undefined },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn { route, items: response ?? [] };\n\t} catch (error) {\n\t\trethrowIfAborted(signal);\n\t\treturn {\n\t\t\troute,\n\t\t\titems: [],\n\t\t\tfailure: {\n\t\t\t\tserverId: route.target.serverId,\n\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction aggregateCodeActions(state: LspRuntimeState, outcomes: readonly CodeActionRouteOutcome[]): AggregatedAction[] {\n\tconst aggregated = new Map<string, AggregatedAction>();\n\tfor (const outcome of outcomes) {\n\t\tfor (const item of outcome.items) {\n\t\t\tconst preview = collectWorkspaceEditPreview(state, outcome.route, isCodeAction(item) ? item.edit : undefined);\n\t\t\tconst key = actionKey(item, preview);\n\t\t\tconst existing = aggregated.get(key);\n\t\t\tif (existing) {\n\t\t\t\tif (!existing.serverIds.includes(outcome.route.target.serverId)) {\n\t\t\t\t\texisting.serverIds.push(outcome.route.target.serverId);\n\t\t\t\t}\n\t\t\t\texisting.preferred ||= isCodeAction(item) && item.isPreferred === true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\taggregated.set(key, {\n\t\t\t\titem,\n\t\t\t\troute: outcome.route,\n\t\t\t\tserverIds: [outcome.route.target.serverId],\n\t\t\t\tpreferred: isCodeAction(item) && item.isPreferred === true,\n\t\t\t});\n\t\t}\n\t}\n\treturn [...aggregated.values()];\n}\n\nfunction renderCodeActionLines(\n\tstate: LspRuntimeState,\n\tactions: readonly AggregatedAction[],\n\tattribute: boolean,\n): string[] {\n\tconst lines: string[] = [];\n\tfor (const [index, action] of actions.slice(0, MAX_ACTIONS).entries()) {\n\t\tconst provider = attribute ? `[${action.serverIds.join(\", \")}] ` : \"\";\n\t\tif (!isCodeAction(action.item)) {\n\t\t\tlines.push(`${index + 1}. ${provider}${action.item.title} [command-only: ${action.item.command}]`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst kind = action.item.kind ? ` [${action.item.kind}]` : \"\";\n\t\tconst preferred = action.preferred ? \" preferred\" : \"\";\n\t\tlines.push(`${index + 1}. ${provider}${action.item.title}${kind}${preferred}`);\n\t\tconst preview = collectWorkspaceEditPreview(state, action.route, action.item.edit);\n\t\tfor (const line of preview.lines.slice(0, 8)) lines.push(` ${line}`);\n\t\tif (preview.truncated) lines.push(\" [edit preview truncated]\");\n\t}\n\tif (actions.length > MAX_ACTIONS) lines.push(`[Showing ${MAX_ACTIONS} of ${actions.length} actions.]`);\n\treturn lines;\n}\n\nfunction consensusRenamePreview(\n\tnewName: string,\n\tpreviews: RenamePreviewResult[],\n\tfailures: readonly LspClientRouteFailure[],\n\tmatchedServerCount: number,\n): AgentToolResult<LspRenameDetails> {\n\tconst bySignature = new Map<string, RenamePreviewResult[]>();\n\tfor (const preview of previews) {\n\t\tbySignature.set(preview.preview.signature, [...(bySignature.get(preview.preview.signature) ?? []), preview]);\n\t}\n\tif (bySignature.size > 1) {\n\t\tconst sections = [...bySignature.values()].map((group) => {\n\t\t\tconst first = group[0];\n\t\t\treturn first.preview.editCount === 0\n\t\t\t\t? `[${group.map((entry) => entry.serverId).join(\", \")}] no edits`\n\t\t\t\t: `[${group.map((entry) => entry.serverId).join(\", \")}] ${first.preview.editCount} edit(s):\\n${first.preview.lines.join(\"\\n\")}`;\n\t\t});\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Conflicting rename previews for ${JSON.stringify(newName)}. No preview was selected and no changes were applied.\\n\\n${sections.join(\"\\n\\n\")}${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: {\n\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\tconflict: true,\n\t\t\t},\n\t\t};\n\t}\n\tconst matching = [...bySignature.values()][0];\n\tconst selected = matching[0];\n\tif (selected.preview.editCount === 0) {\n\t\tconst providers = matching.map((entry) => entry.serverId).join(\", \");\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Rename preview: no edits. Successful provider(s): ${providers}. No changes were applied.${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t};\n\t}\n\tconst attribution =\n\t\tmatchedServerCount > 1 ? ` Selected provider(s): ${matching.map((entry) => entry.serverId).join(\", \")}.` : \"\";\n\tconst suffix = selected.preview.truncated ? `\\n[Showing ${selected.preview.lines.length} edit preview lines.]` : \"\";\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Rename preview for ${JSON.stringify(newName)}: ${selected.preview.editCount} edit(s) across ${selected.preview.fileCount} file(s).${attribution} No changes were applied.\\n\\n${selected.preview.lines.join(\"\\n\")}${suffix}${failureText(failures)}`,\n\t\t\t},\n\t\t],\n\t\tdetails: {\n\t\t\tfileCount: selected.preview.fileCount,\n\t\t\teditCount: selected.preview.editCount,\n\t\t\t...(selected.preview.truncated ? { truncated: true } : {}),\n\t\t},\n\t};\n}\n\nexport function createLspRenameTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof renameSchema, LspRenameDetails> {\n\treturn {\n\t\tname: \"lsp_rename\",\n\t\tlabel: \"lsp_rename\",\n\t\tdescription:\n\t\t\t\"Preview a rename from all capable matching LSP servers. A preview is selected only when every successful response agrees, including empty responses, and document versions are current. Conflicting or stale edits are reported without choosing one. No changes are applied.\",\n\t\tpromptSnippet: \"Preview a symbol rename via LSP without applying changes\",\n\t\tpromptGuidelines: [\"lsp_rename is preview-only. Apply reviewed changes with read/edit using hashline anchors.\"],\n\t\tparameters: renameSchema,\n\t\tasync execute(_toolCallId, input: RenameInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"rename\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"rename\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map(async (route) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await route.client.sendRequest<WorkspaceEdit | null>(\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri: route.target.serverUri },\n\t\t\t\t\t\t\t\tposition: toPosition(input),\n\t\t\t\t\t\t\t\tnewName: input.newName,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\tpreview: collectWorkspaceEditPreview(state, route, result ?? undefined, true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\trethrowIfAborted(signal);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfailure: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t} satisfies LspClientRouteFailure,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst previews = outcomes.flatMap((outcome) => (outcome.result ? [outcome.result] : []));\n\t\t\tif (previews.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `No LSP server returned a rename preview. No changes were applied.${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst unsafeVersions = previews.flatMap((entry) =>\n\t\t\t\tentry.preview.versionErrors.map((reason) => `[${entry.serverId}] ${reason}`),\n\t\t\t);\n\t\t\tif (unsafeVersions.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Unsafe rename preview for ${JSON.stringify(input.newName)} due to stale or unknown document versions. No preview was selected and no changes were applied.\\n\\n${unsafeVersions.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\t\t\tconflict: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn consensusRenamePreview(input.newName, previews, failures, collection.matchedServerCount);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_rename\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)} -> ${theme.fg(\"muted\", args.newName)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function createLspCodeActionsTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof codeActionsSchema, LspCodeActionsDetails> {\n\treturn {\n\t\tname: \"lsp_code_actions\",\n\t\tlabel: \"lsp_code_actions\",\n\t\tdescription:\n\t\t\t\"List code actions from all capable matching LSP servers. Identical actions are deduplicated, distinct actions are attributed, and edit previews are never applied.\",\n\t\tpromptSnippet: \"List available LSP code actions and refactorings\",\n\t\tpromptGuidelines: [\n\t\t\t\"lsp_code_actions is preview-only. Apply reviewed edits with read/edit using hashline anchors.\",\n\t\t],\n\t\tparameters: codeActionsSchema,\n\t\tasync execute(_toolCallId, input: CodeActionsInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"codeActions\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"codeActions\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst range: Range = {\n\t\t\t\tstart: toPosition(input),\n\t\t\t\tend: {\n\t\t\t\t\tline: (input.endLine ?? input.line) - 1,\n\t\t\t\t\tcharacter: (input.endCharacter ?? input.character) - 1,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map((route) => requestCodeActions(route, input, range, signal)),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst actions = aggregateCodeActions(state, outcomes);\n\t\t\tif (actions.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `No code actions available.${failureText(failures)}` }],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst preferredCount = actions.filter((action) => action.preferred).length;\n\t\t\tconst lines = renderCodeActionLines(state, actions, collection.matchedServerCount > 1);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${actions.length} code action(s). No changes were applied.\\n\\n${lines.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { count: actions.length, preferredCount },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"refactor.js","sourceRoot":"","sources":["../../../src/core/lsp/refactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAY5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,cAAc,GAAG;IACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAC/C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACzE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;CAChF,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,GAAG,cAAc;IACjB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;CAChE,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,GAAG,cAAc;IACjB,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC,CACzG;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,qEAAqE,EAAE,CAAC,CAChH;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC,CAAC;CAClH,CAAC,CAAC;AAmFH,SAAS,UAAU,CAAC,KAAuB;IAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,KAAsB,EAAE,KAAqB,EAAE,GAAW;IAClF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,MAAM,GAAG,CAAC;AAC/G,CAAC;AAED,SAAS,cAAc,CAAC,IAAc;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3F,OAAO,GAAG,SAAS,IAAI,WAAW,IAAI,OAAO,IAAI,SAAS,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC7C,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,cAAc,IAAI,KAAK;QACvB,OAAO,IAAI,KAAK;QAChB,KAAK,CAAC,OAAO,CAAE,KAA6B,CAAC,KAAK,CAAC,CACnD,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,SAAS,GAAG,IAAI,GAAG,EAAU;IACrE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/F,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAChD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,MAAc,CAAC;IACnB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACjF,CAAC;SAAM,CAAC;QACP,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtH,CAAC;IACD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AACf,CAAC;AAQD,SAAS,0BAA0B,CAClC,KAAsB,EACtB,KAAqB,EACrB,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzG,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,iCAAiC,SAAS,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7G,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,IAAI,EAAE,cAAc,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;IACjF,CAAC;IACD,IACC,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAC/B,CAAC;QACF,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,sBAAsB,OAAO,OAAO,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,iCAAiC,SAAS,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,oBAAoB,CAC5B,OAAuC,EACvC,GAAW,EACX,IAAY,EACZ,OAAkC;IAElC,IAAI,CAAC,OAAO,CAAC,wBAAwB,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACvF,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvG,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,+BAA+B,IAAI,wCAAwC,OAAO,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,0BAA0B,OAAO,wBAAwB,cAAc,QAAQ,IAAI,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAC9B,OAAuC,EACvC,IAAmB,EACnB,UAAmC;IAEnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YACrG,SAAS;QACV,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;QAC5C,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3F,IAAI,YAAY;YAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACjG,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAC3B,OAAuC,EACvC,IAAmB,EACnB,UAAmC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,KAAK;YAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;AACF,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAmC;IACvE,UAAU,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;QACxD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS;QAClE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS;QAC9D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CACpD,CAAC;IACF,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAmC;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,gBAAoC,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,YAAY,GACjB,KAAK,CAAC,OAAO,KAAK,SAAS;YAC1B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI;gBACvB,CAAC,CAAC,kCAAkC;gBACpC,CAAC,CAAC,sBAAsB,KAAK,CAAC,OAAO,GAAG,CAAC;QAC5C,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,SAAS,YAAY,EAAE,CAAC;QACtD,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,YAAY,GAAG,CAAC,CAAC;YAC5C,gBAAgB,GAAG,QAAQ,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,kBAAkB;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAmC;IAClE,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,eAAe,CAAC;QACtB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;YACvB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;SAC3B,CAAC,CAAC;QACH,kBAAkB,EAAE,UAAU,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC;KACzF,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CACnC,KAAsB,EACtB,KAAqB,EACrB,IAA+B,EAC/B,wBAAwB,GAAG,KAAK;IAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACxG,CAAC;IACD,MAAM,OAAO,GAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAC3F,MAAM,UAAU,GAA4B,EAAE,OAAO,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACvG,sBAAsB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC7C,OAAO;QACN,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI,GAAG,CAAC;YAClB,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAChD,GAAG,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;SACxE,CAAC,CAAC,IAAI;QACP,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,MAAM;QAC3E,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QACtC,SAAS,EAAE,sBAAsB,CAAC,UAAU,CAAC;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;KACvC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAA0B;IAC/C,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,IAAc,EAAE,KAAe;IACvD,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,SAAS,aAAa,CAAC,IAAW,EAAE,KAAY;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,WAAW,CAAC,QAA0C;IAC9D,MAAM,MAAM,GAAG;QACd,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;KACvG,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,4CAA4C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACjI,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,KAAmB,EACnB,UAA0B,EAC1B,OAAuB,EACvB,MAAoB;IAEpB,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9F,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACxF,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC/B,OAAO;gBACN,GAAG,UAAU;gBACb,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE;oBACT,GAAG,UAAU,CAAC,QAAQ;oBACtB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACpC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;wBAC/B,MAAM,EAAE,0DAA0D;qBAClE,CAAC,CAAC;iBACH;aACD,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACvF,OAAO;gBACN,GAAG,UAAU;gBACb,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3F,QAAQ,EAAE;oBACT,GAAG,UAAU,CAAC,QAAQ;oBACtB,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;iBAC7F;aACD,CAAC;QACH,CAAC;IACF,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAC7B,KAAsB,EACtB,IAAY,EACZ,OAAuB,EACvB,UAAoC,EACpC,MAAoB;IAEpB,IAAI,UAAU,CAAC,kBAAkB,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjG,OAAO,0CAA0C,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA+B;IACxD,cAAc,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,IAA0B,EAAE,OAA6B;IAC3E,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,OAAO,CAAC,SAAS;SACvB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,KAAqB,EACrB,KAAuB,EACvB,KAAY,EACZ,MAA+B;IAE/B,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM;aAE9B,cAAc,CAAC,GAAG,CAAC;aAEnB,MAAM,CAAC,CAAC,UAAsB,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,CAC9C,yBAAyB,EACzB;YACC,YAAY,EAAE,EAAE,GAAG,EAAE;YACrB,KAAK;YACL,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;SACrE,EACD,MAAM,CACN,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;YACN,KAAK;YACL,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;gBAC/B,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D;SACD,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAsB,EAAE,QAA2C;IAChG,MAAM,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACvD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9G,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxD,CAAC;gBACD,QAAQ,CAAC,SAAS,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;gBACvE,SAAS;YACV,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC1C,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;aAC1D,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAsB,EACtB,OAAoC,EACpC,SAAkB;IAElB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,mBAAmB,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACnG,SAAS;QACV,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,OAAO,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAC9B,OAAe,EACf,QAA+B,EAC/B,QAA0C,EAC1C,kBAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC;gBACnC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;gBACjE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,cAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClI,CAAC,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6DAA6D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE;iBAC5K;aACD;YACD,OAAO,EAAE;gBACR,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACxE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACxE,QAAQ,EAAE,IAAI;aACd;SACD,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,QAAQ,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO;YACN,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qDAAqD,SAAS,6BAA6B,WAAW,CAAC,QAAQ,CAAC,EAAE;iBACxH;aACD;YACD,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SACvC,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAChB,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,OAAO;QACN,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,sBAAsB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,SAAS,mBAAmB,QAAQ,CAAC,OAAO,CAAC,SAAS,YAAY,WAAW,gCAAgC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE;aAC1P;SACD;QACD,OAAO,EAAE;YACR,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;YACrC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;YACrC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,QAA+B,EAC/B,aAAoC;IAEpC,OAAO;QACN,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;QACnB,WAAW,EACV,+QAA+Q;QAChR,aAAa,EAAE,0DAA0D;QACzE,gBAAgB,EAAE,CAAC,2FAA2F,CAAC;QAC/G,UAAU,EAAE,YAAY;QACxB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;YACpE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACzC,KAAK,EACL,KAAK,EACL,aAAa,EAAE,EAAE,IAAI,GAAG,CAAC,cAAc,EACvC,QAAQ,EACR,MAAM,CACN,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;qBAC9F;oBACD,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;iBACvC,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrC,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,CAC5C,qBAAqB,EACrB;wBACC,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE;wBAC7C,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC;wBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;qBACtB,EACD,MAAM,CACN,CAAC;oBACF,OAAO;wBACN,MAAM,EAAE;4BACP,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;4BAC/B,OAAO,EAAE,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,IAAI,CAAC;yBAC7E;qBACD,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBACzB,OAAO;wBACN,OAAO,EAAE;4BACR,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;4BAC/B,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9B;qBACjC,CAAC;gBACH,CAAC;YACF,CAAC,CAAC,CACF,CAAC;YACF,MAAM,QAAQ,GAAG;gBAChB,GAAG,UAAU,CAAC,QAAQ;gBACtB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC5E,CAAC;YACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,oEAAoE,WAAW,CAAC,QAAQ,CAAC,EAAE;yBACjG;qBACD;oBACD,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;iBACvC,CAAC;YACH,CAAC;YACD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACjD,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC,CAC5E,CAAC;YACF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,6BAA6B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,uGAAuG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE;yBAC1N;qBACD;oBACD,OAAO,EAAE;wBACR,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBACxE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBACxE,QAAQ,EAAE,IAAI;qBACd;iBACD,CAAC;YACH,CAAC;YACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACjG,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK;YACrB,OAAO,IAAI,IAAI,CACd,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAC/J,CAAC,EACD,CAAC,CACD,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,QAA+B,EAC/B,aAAoC;IAEpC,OAAO;QACN,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACV,oKAAoK;QACrK,aAAa,EAAE,kDAAkD;QACjE,gBAAgB,EAAE;YACjB,+FAA+F;SAC/F;QACD,UAAU,EAAE,iBAAiB;QAC7B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAuB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;YACzE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACzC,KAAK,EACL,KAAK,EACL,aAAa,EAAE,EAAE,IAAI,GAAG,CAAC,cAAc,EACvC,aAAa,EACb,MAAM,CACN,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;qBACnG;oBACD,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;iBACxC,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAU;gBACpB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;gBACxB,GAAG,EAAE;oBACJ,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;oBACvC,SAAS,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;iBACtD;aACD,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CACjF,CAAC;YACF,MAAM,QAAQ,GAAG;gBAChB,GAAG,UAAU,CAAC,QAAQ;gBACtB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC5E,CAAC;YACF,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACvF,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;iBACxC,CAAC;YACH,CAAC;YACD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC3E,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;YACvF,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,gDAAgD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE;qBACjH;iBACD;gBACD,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE;aAClD,CAAC;QACH,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK;YACrB,OAAO,IAAI,IAAI,CACd,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAC/H,CAAC,EACD,CAAC,CACD,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import { Text } from \"@greppleai/grip-tui\";\nimport { type Static, Type } from \"typebox\";\nimport type {\n\tCodeAction,\n\tCommand,\n\tDiagnostic,\n\tPosition,\n\tRange,\n\tTextEdit,\n\tWorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"../tools/operations.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\nimport type { LspRuntimeState } from \"./integration.ts\";\nimport type { LspClientRoute, LspClientRouteCollection, LspClientRouteFailure, LspToolFeature } from \"./manager.ts\";\nimport { relativePortablePath } from \"./portable-path.ts\";\n\nconst MAX_ACTIONS = 40;\nconst MAX_EDIT_LINES = 80;\n\nconst positionFields = {\n\tpath: Type.String({ description: \"File path\" }),\n\tline: Type.Integer({ minimum: 1, description: \"Line number, 1-indexed\" }),\n\tcharacter: Type.Integer({ minimum: 1, description: \"Column number, 1-indexed\" }),\n};\n\nconst renameSchema = Type.Object({\n\t...positionFields,\n\tnewName: Type.String({ description: \"New name for the symbol\" }),\n});\n\nconst codeActionsSchema = Type.Object({\n\t...positionFields,\n\tendLine: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End line for a range selection, 1-indexed. Defaults to line.\" }),\n\t),\n\tendCharacter: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"End column for a range selection, 1-indexed. Defaults to character.\" }),\n\t),\n\tkind: Type.Optional(Type.String({ description: \"Optional action kind filter, e.g. quickfix, refactor, source.\" })),\n});\n\ntype RenameInput = Static<typeof renameSchema>;\ntype CodeActionsInput = Static<typeof codeActionsSchema>;\n\ninterface OneBasedPosition {\n\tline: number;\n\tcharacter: number;\n}\n\ninterface LspFileInput {\n\tpath: string;\n}\n\nexport interface LspRenameDetails {\n\tfileCount: number;\n\teditCount: number;\n\ttruncated?: boolean;\n\tconflict?: boolean;\n}\n\nexport interface LspCodeActionsDetails {\n\tcount: number;\n\tpreferredCount: number;\n}\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\ninterface TextDocumentEditReference {\n\turi: string;\n\tversion?: number | null;\n}\n\ntype TextDocumentEditLike = {\n\ttextDocument: TextDocumentEditReference;\n\tedits: TextEdit[];\n};\n\ninterface WorkspaceEditEntry {\n\tpath: string;\n\tedit: TextEdit;\n\tversion?: number | null;\n}\n\ninterface WorkspaceEditCollection {\n\tentries: WorkspaceEditEntry[];\n\tresourceOperations: ResourceOperationPreview[];\n\tversionErrors: string[];\n}\n\ninterface WorkspaceEditCollectionContext {\n\tstate: LspRuntimeState;\n\troute: LspClientRoute;\n\tvalidateDocumentVersions: boolean;\n}\n\ninterface WorkspaceEditPreview {\n\tlines: string[];\n\tfileCount: number;\n\teditCount: number;\n\ttruncated: boolean;\n\tsignature: string;\n\tversionErrors: string[];\n}\n\ninterface RenamePreviewResult {\n\tserverId: string;\n\tpreview: WorkspaceEditPreview;\n}\n\ninterface AggregatedAction {\n\titem: CodeAction | Command;\n\troute: LspClientRoute;\n\tserverIds: string[];\n\tpreferred: boolean;\n}\n\ninterface CodeActionRouteOutcome {\n\troute: LspClientRoute;\n\titems: (CodeAction | Command)[];\n\tfailure?: LspClientRouteFailure;\n}\n\nfunction toPosition(input: OneBasedPosition): Position {\n\treturn { line: input.line - 1, character: input.character - 1 };\n}\n\nfunction relativeUriPath(state: LspRuntimeState, route: LspClientRoute, uri: string): string {\n\tconst mapped = route.target.mapper.serverUriToAgentPath(uri);\n\treturn mapped.ok ? relativePortablePath(state.manager.cwd, mapped.value) : `[unmapped URI: ${mapped.reason}]`;\n}\n\nfunction formatTextEdit(edit: TextEdit): string {\n\tconst startLine = edit.range.start.line + 1;\n\tconst startColumn = edit.range.start.character + 1;\n\tconst endLine = edit.range.end.line + 1;\n\tconst endColumn = edit.range.end.character + 1;\n\tconst replacement = edit.newText.replace(/\\n/g, \"\\\\n\");\n\tconst clipped = replacement.length > 120 ? `${replacement.slice(0, 117)}...` : replacement;\n\treturn `${startLine}:${startColumn}-${endLine}:${endColumn} -> ${JSON.stringify(clipped)}`;\n}\n\nfunction isTextDocumentEditLike(value: unknown): value is TextDocumentEditLike {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"textDocument\" in value &&\n\t\t\"edits\" in value &&\n\t\tArray.isArray((value as { edits?: unknown }).edits)\n\t);\n}\n\nfunction stableSerialize(value: unknown, ancestors = new Set<object>()): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? String(value);\n\tif (ancestors.has(value)) return '\"[circular]\"';\n\tancestors.add(value);\n\tlet output: string;\n\tif (Array.isArray(value)) {\n\t\toutput = `[${value.map((item) => stableSerialize(item, ancestors)).join(\",\")}]`;\n\t} else {\n\t\tconst entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));\n\t\toutput = `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, ancestors)}`).join(\",\")}}`;\n\t}\n\tancestors.delete(value);\n\treturn output;\n}\n\ninterface ResourceOperationPreview {\n\tline: string;\n\tpaths: string[];\n\tsignature: string;\n}\n\nfunction normalizeResourceOperation(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tvalue: unknown,\n): ResourceOperationPreview {\n\tif (typeof value !== \"object\" || value === null || !(\"kind\" in value) || typeof value.kind !== \"string\") {\n\t\tconst signature = stableSerialize(value);\n\t\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n\t}\n\tif ((value.kind === \"create\" || value.kind === \"delete\") && \"uri\" in value && typeof value.uri === \"string\") {\n\t\tconst path = relativeUriPath(state, route, value.uri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, path, options });\n\t\treturn { line: `[workspace ${value.kind}: ${path}]`, paths: [path], signature };\n\t}\n\tif (\n\t\tvalue.kind === \"rename\" &&\n\t\t\"oldUri\" in value &&\n\t\ttypeof value.oldUri === \"string\" &&\n\t\t\"newUri\" in value &&\n\t\ttypeof value.newUri === \"string\"\n\t) {\n\t\tconst oldPath = relativeUriPath(state, route, value.oldUri);\n\t\tconst newPath = relativeUriPath(state, route, value.newUri);\n\t\tconst options = \"options\" in value ? value.options : undefined;\n\t\tconst signature = stableSerialize({ kind: value.kind, oldPath, newPath, options });\n\t\treturn { line: `[workspace rename: ${oldPath} -> ${newPath}]`, paths: [oldPath, newPath], signature };\n\t}\n\tconst signature = stableSerialize(value);\n\treturn { line: `[unknown workspace operation: ${signature}]`, paths: [], signature };\n}\n\nfunction documentVersionError(\n\tcontext: WorkspaceEditCollectionContext,\n\turi: string,\n\tpath: string,\n\tversion: number | null | undefined,\n): string | undefined {\n\tif (!context.validateDocumentVersions || typeof version !== \"number\") return undefined;\n\tconst trackedVersion = context.state.fileSync.getTrackedVersion(uri, context.route.target.instanceKey);\n\tif (trackedVersion === undefined) {\n\t\treturn `unknown tracked version for ${path}; response requires document version ${version}`;\n\t}\n\tif (trackedVersion !== version) {\n\t\treturn `stale document version ${version}; tracked version is ${trackedVersion} for ${path}`;\n\t}\n\treturn undefined;\n}\n\nfunction collectDocumentChanges(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const change of edit.documentChanges ?? []) {\n\t\tif (!isTextDocumentEditLike(change)) {\n\t\t\tcollection.resourceOperations.push(normalizeResourceOperation(context.state, context.route, change));\n\t\t\tcontinue;\n\t\t}\n\t\tconst path = relativeUriPath(context.state, context.route, change.textDocument.uri);\n\t\tconst version = change.textDocument.version;\n\t\tconst versionError = documentVersionError(context, change.textDocument.uri, path, version);\n\t\tif (versionError) collection.versionErrors.push(versionError);\n\t\tfor (const textEdit of change.edits) collection.entries.push({ path, edit: textEdit, version });\n\t}\n}\n\nfunction collectUriTextEdits(\n\tcontext: WorkspaceEditCollectionContext,\n\tedit: WorkspaceEdit,\n\tcollection: WorkspaceEditCollection,\n): void {\n\tfor (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n\t\tconst path = relativeUriPath(context.state, context.route, uri);\n\t\tfor (const textEdit of edits) collection.entries.push({ path, edit: textEdit });\n\t}\n}\n\nfunction sortWorkspaceEditCollection(collection: WorkspaceEditCollection): void {\n\tcollection.entries.sort(\n\t\t(left, right) =>\n\t\t\tleft.path.localeCompare(right.path) ||\n\t\t\tleft.edit.range.start.line - right.edit.range.start.line ||\n\t\t\tleft.edit.range.start.character - right.edit.range.start.character ||\n\t\t\tleft.edit.range.end.line - right.edit.range.end.line ||\n\t\t\tleft.edit.range.end.character - right.edit.range.end.character ||\n\t\t\tleft.edit.newText.localeCompare(right.edit.newText),\n\t);\n\tcollection.resourceOperations.sort((left, right) => left.signature.localeCompare(right.signature));\n}\n\nfunction renderWorkspaceEditLines(collection: WorkspaceEditCollection): string[] {\n\tconst lines: string[] = [];\n\tlet previousDocument: string | undefined;\n\tfor (const entry of collection.entries) {\n\t\tconst versionLabel =\n\t\t\tentry.version === undefined\n\t\t\t\t? \"\"\n\t\t\t\t: entry.version === null\n\t\t\t\t\t? \" (document version: unversioned)\"\n\t\t\t\t\t: ` (document version ${entry.version})`;\n\t\tconst document = `${entry.path}\\u0000${versionLabel}`;\n\t\tif (document !== previousDocument) {\n\t\t\tlines.push(`${entry.path}${versionLabel}:`);\n\t\t\tpreviousDocument = document;\n\t\t}\n\t\tlines.push(` ${formatTextEdit(entry.edit)}`);\n\t}\n\tfor (const operation of collection.resourceOperations) lines.push(operation.line);\n\treturn lines;\n}\n\nfunction workspaceEditSignature(collection: WorkspaceEditCollection): string {\n\tif (collection.entries.length === 0 && collection.resourceOperations.length === 0) return \"[]\";\n\treturn stableSerialize({\n\t\tentries: collection.entries.map((entry) => ({\n\t\t\tpath: entry.path,\n\t\t\trange: entry.edit.range,\n\t\t\tnewText: entry.edit.newText,\n\t\t})),\n\t\tresourceOperations: collection.resourceOperations.map((operation) => operation.signature),\n\t});\n}\n\nfunction collectWorkspaceEditPreview(\n\tstate: LspRuntimeState,\n\troute: LspClientRoute,\n\tedit: WorkspaceEdit | undefined,\n\tvalidateDocumentVersions = false,\n): WorkspaceEditPreview {\n\tif (!edit) {\n\t\treturn { lines: [], fileCount: 0, editCount: 0, truncated: false, signature: \"[]\", versionErrors: [] };\n\t}\n\tconst context: WorkspaceEditCollectionContext = { state, route, validateDocumentVersions };\n\tconst collection: WorkspaceEditCollection = { entries: [], resourceOperations: [], versionErrors: [] };\n\tcollectDocumentChanges(context, edit, collection);\n\tcollectUriTextEdits(context, edit, collection);\n\tsortWorkspaceEditCollection(collection);\n\tconst lines = renderWorkspaceEditLines(collection);\n\tconst shown = lines.slice(0, MAX_EDIT_LINES);\n\treturn {\n\t\tlines: shown,\n\t\tfileCount: new Set([\n\t\t\t...collection.entries.map((entry) => entry.path),\n\t\t\t...collection.resourceOperations.flatMap((operation) => operation.paths),\n\t\t]).size,\n\t\teditCount: collection.entries.length + collection.resourceOperations.length,\n\t\ttruncated: shown.length < lines.length,\n\t\tsignature: workspaceEditSignature(collection),\n\t\tversionErrors: collection.versionErrors,\n\t};\n}\n\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n\treturn typeof item.command !== \"string\";\n}\n\nfunction comparePosition(left: Position, right: Position): number {\n\treturn left.line - right.line || left.character - right.character;\n}\n\nfunction rangesOverlap(left: Range, right: Range): boolean {\n\treturn comparePosition(left.end, right.start) >= 0 && comparePosition(right.end, left.start) >= 0;\n}\n\nfunction failureText(failures: readonly LspClientRouteFailure[]): string {\n\tconst unique = [\n\t\t...new Map(failures.map((failure) => [`${failure.serverId}\\u0000${failure.reason}`, failure])).values(),\n\t];\n\treturn unique.length === 0\n\t\t? \"\"\n\t\t: `\\n\\nUnavailable or unsupported servers:\\n${unique.map((failure) => `- ${failure.serverId}: ${failure.reason}`).join(\"\\n\")}`;\n}\n\nasync function getClientsAndSync(\n\tstate: LspRuntimeState,\n\tinput: LspFileInput,\n\toperations: ToolOperations,\n\tfeature: LspToolFeature,\n\tsignal?: AbortSignal,\n): Promise<LspClientRouteCollection> {\n\tawait state.manager.setToolOperations(operations, signal);\n\tconst collection = await state.manager.getClientRoutesForFeature(input.path, feature, signal);\n\tif (collection.routes.length > 0) {\n\t\tconst result = await state.fileSync.synchronizeFileRead(input.path, operations, signal);\n\t\tif (result.lifecycleCancelled) {\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: [],\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...collection.routes.map((route) => ({\n\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\treason: \"synchronization was cancelled by an LSP lifecycle change\",\n\t\t\t\t\t})),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tif (result.failures.length > 0) {\n\t\t\tconst failedInstances = new Set(result.failures.map((failure) => failure.instanceKey));\n\t\t\treturn {\n\t\t\t\t...collection,\n\t\t\t\troutes: collection.routes.filter((route) => !failedInstances.has(route.target.instanceKey)),\n\t\t\t\tfailures: [\n\t\t\t\t\t...collection.failures,\n\t\t\t\t\t...result.failures.map((failure) => ({ serverId: failure.serverId, reason: failure.reason })),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\treturn collection;\n}\n\nasync function noCapableResult(\n\tstate: LspRuntimeState,\n\tpath: string,\n\tfeature: LspToolFeature,\n\tcollection: LspClientRouteCollection,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tif (collection.matchedServerCount === 0) return state.manager.getUnavailableReason(path, signal);\n\treturn `No capable LSP server is available for ${feature}.${failureText(collection.failures)}`;\n}\n\nfunction rethrowIfAborted(signal: AbortSignal | undefined): void {\n\tthrowIfAborted(signal);\n}\n\nfunction actionKey(item: CodeAction | Command, preview: WorkspaceEditPreview): string {\n\tif (isCodeAction(item)) {\n\t\treturn stableSerialize({\n\t\t\ttitle: item.title,\n\t\t\tkind: item.kind,\n\t\t\tcommand: item.command,\n\t\t\tdata: item.data,\n\t\t\tedit: preview.signature,\n\t\t});\n\t}\n\treturn stableSerialize({ title: item.title, command: item.command, arguments: item.arguments });\n}\n\nasync function requestCodeActions(\n\troute: LspClientRoute,\n\tinput: CodeActionsInput,\n\trange: Range,\n\tsignal: AbortSignal | undefined,\n): Promise<CodeActionRouteOutcome> {\n\ttry {\n\t\tconst uri = route.target.serverUri;\n\t\tconst diagnostics = route.client\n\n\t\t\t.getDiagnostics(uri)\n\n\t\t\t.filter((diagnostic: Diagnostic) => rangesOverlap(diagnostic.range, range));\n\t\tconst response = await route.client.sendRequest<CodeActionResponse>(\n\t\t\t\"textDocument/codeAction\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\trange,\n\t\t\t\tcontext: { diagnostics, only: input.kind ? [input.kind] : undefined },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn { route, items: response ?? [] };\n\t} catch (error) {\n\t\trethrowIfAborted(signal);\n\t\treturn {\n\t\t\troute,\n\t\t\titems: [],\n\t\t\tfailure: {\n\t\t\t\tserverId: route.target.serverId,\n\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction aggregateCodeActions(state: LspRuntimeState, outcomes: readonly CodeActionRouteOutcome[]): AggregatedAction[] {\n\tconst aggregated = new Map<string, AggregatedAction>();\n\tfor (const outcome of outcomes) {\n\t\tfor (const item of outcome.items) {\n\t\t\tconst preview = collectWorkspaceEditPreview(state, outcome.route, isCodeAction(item) ? item.edit : undefined);\n\t\t\tconst key = actionKey(item, preview);\n\t\t\tconst existing = aggregated.get(key);\n\t\t\tif (existing) {\n\t\t\t\tif (!existing.serverIds.includes(outcome.route.target.serverId)) {\n\t\t\t\t\texisting.serverIds.push(outcome.route.target.serverId);\n\t\t\t\t}\n\t\t\t\texisting.preferred ||= isCodeAction(item) && item.isPreferred === true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\taggregated.set(key, {\n\t\t\t\titem,\n\t\t\t\troute: outcome.route,\n\t\t\t\tserverIds: [outcome.route.target.serverId],\n\t\t\t\tpreferred: isCodeAction(item) && item.isPreferred === true,\n\t\t\t});\n\t\t}\n\t}\n\treturn [...aggregated.values()];\n}\n\nfunction renderCodeActionLines(\n\tstate: LspRuntimeState,\n\tactions: readonly AggregatedAction[],\n\tattribute: boolean,\n): string[] {\n\tconst lines: string[] = [];\n\tfor (const [index, action] of actions.slice(0, MAX_ACTIONS).entries()) {\n\t\tconst provider = attribute ? `[${action.serverIds.join(\", \")}] ` : \"\";\n\t\tif (!isCodeAction(action.item)) {\n\t\t\tlines.push(`${index + 1}. ${provider}${action.item.title} [command-only: ${action.item.command}]`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst kind = action.item.kind ? ` [${action.item.kind}]` : \"\";\n\t\tconst preferred = action.preferred ? \" preferred\" : \"\";\n\t\tlines.push(`${index + 1}. ${provider}${action.item.title}${kind}${preferred}`);\n\t\tconst preview = collectWorkspaceEditPreview(state, action.route, action.item.edit);\n\t\tfor (const line of preview.lines.slice(0, 8)) lines.push(` ${line}`);\n\t\tif (preview.truncated) lines.push(\" [edit preview truncated]\");\n\t}\n\tif (actions.length > MAX_ACTIONS) lines.push(`[Showing ${MAX_ACTIONS} of ${actions.length} actions.]`);\n\treturn lines;\n}\n\nfunction consensusRenamePreview(\n\tnewName: string,\n\tpreviews: RenamePreviewResult[],\n\tfailures: readonly LspClientRouteFailure[],\n\tmatchedServerCount: number,\n): AgentToolResult<LspRenameDetails> {\n\tconst bySignature = new Map<string, RenamePreviewResult[]>();\n\tfor (const preview of previews) {\n\t\tbySignature.set(preview.preview.signature, [...(bySignature.get(preview.preview.signature) ?? []), preview]);\n\t}\n\tif (bySignature.size > 1) {\n\t\tconst sections = [...bySignature.values()].map((group) => {\n\t\t\tconst first = group[0];\n\t\t\treturn first.preview.editCount === 0\n\t\t\t\t? `[${group.map((entry) => entry.serverId).join(\", \")}] no edits`\n\t\t\t\t: `[${group.map((entry) => entry.serverId).join(\", \")}] ${first.preview.editCount} edit(s):\\n${first.preview.lines.join(\"\\n\")}`;\n\t\t});\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Conflicting rename previews for ${JSON.stringify(newName)}. No preview was selected and no changes were applied.\\n\\n${sections.join(\"\\n\\n\")}${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: {\n\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\tconflict: true,\n\t\t\t},\n\t\t};\n\t}\n\tconst matching = [...bySignature.values()][0];\n\tconst selected = matching[0];\n\tif (selected.preview.editCount === 0) {\n\t\tconst providers = matching.map((entry) => entry.serverId).join(\", \");\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `Rename preview: no edits. Successful provider(s): ${providers}. No changes were applied.${failureText(failures)}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t};\n\t}\n\tconst attribution =\n\t\tmatchedServerCount > 1 ? ` Selected provider(s): ${matching.map((entry) => entry.serverId).join(\", \")}.` : \"\";\n\tconst suffix = selected.preview.truncated ? `\\n[Showing ${selected.preview.lines.length} edit preview lines.]` : \"\";\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Rename preview for ${JSON.stringify(newName)}: ${selected.preview.editCount} edit(s) across ${selected.preview.fileCount} file(s).${attribution} No changes were applied.\\n\\n${selected.preview.lines.join(\"\\n\")}${suffix}${failureText(failures)}`,\n\t\t\t},\n\t\t],\n\t\tdetails: {\n\t\t\tfileCount: selected.preview.fileCount,\n\t\t\teditCount: selected.preview.editCount,\n\t\t\t...(selected.preview.truncated ? { truncated: true } : {}),\n\t\t},\n\t};\n}\n\nexport function createLspRenameTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof renameSchema, LspRenameDetails> {\n\treturn {\n\t\tname: \"lsp_rename\",\n\t\tlabel: \"lsp_rename\",\n\t\tdescription:\n\t\t\t\"Preview a rename from all capable matching LSP servers. A preview is selected only when every successful response agrees, including empty responses, and document versions are current. Conflicting or stale edits are reported without choosing one. No changes are applied.\",\n\t\tpromptSnippet: \"Preview a symbol rename via LSP without applying changes\",\n\t\tpromptGuidelines: [\"lsp_rename is preview-only. Apply reviewed changes with read/edit using hashline anchors.\"],\n\t\tparameters: renameSchema,\n\t\tasync execute(_toolCallId, input: RenameInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"rename\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"rename\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map(async (route) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await route.client.sendRequest<WorkspaceEdit | null>(\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri: route.target.serverUri },\n\t\t\t\t\t\t\t\tposition: toPosition(input),\n\t\t\t\t\t\t\t\tnewName: input.newName,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\tpreview: collectWorkspaceEditPreview(state, route, result ?? undefined, true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\trethrowIfAborted(signal);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfailure: {\n\t\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t} satisfies LspClientRouteFailure,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst previews = outcomes.flatMap((outcome) => (outcome.result ? [outcome.result] : []));\n\t\t\tif (previews.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `No LSP server returned a rename preview. No changes were applied.${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { fileCount: 0, editCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst unsafeVersions = previews.flatMap((entry) =>\n\t\t\t\tentry.preview.versionErrors.map((reason) => `[${entry.serverId}] ${reason}`),\n\t\t\t);\n\t\t\tif (unsafeVersions.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Unsafe rename preview for ${JSON.stringify(input.newName)} due to stale or unknown document versions. No preview was selected and no changes were applied.\\n\\n${unsafeVersions.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tfileCount: Math.max(...previews.map((entry) => entry.preview.fileCount)),\n\t\t\t\t\t\teditCount: Math.max(...previews.map((entry) => entry.preview.editCount)),\n\t\t\t\t\t\tconflict: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn consensusRenamePreview(input.newName, previews, failures, collection.matchedServerCount);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_rename\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)} -> ${theme.fg(\"muted\", args.newName)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function createLspCodeActionsTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof codeActionsSchema, LspCodeActionsDetails> {\n\treturn {\n\t\tname: \"lsp_code_actions\",\n\t\tlabel: \"lsp_code_actions\",\n\t\tdescription:\n\t\t\t\"List code actions from all capable matching LSP servers. Identical actions are deduplicated, distinct actions are attributed, and edit previews are never applied.\",\n\t\tpromptSnippet: \"List available LSP code actions and refactorings\",\n\t\tpromptGuidelines: [\n\t\t\t\"lsp_code_actions is preview-only. Apply reviewed edits with read/edit using hashline anchors.\",\n\t\t],\n\t\tparameters: codeActionsSchema,\n\t\tasync execute(_toolCallId, input: CodeActionsInput, signal, _onUpdate, ctx) {\n\t\t\tconst state = getState();\n\t\t\tconst collection = await getClientsAndSync(\n\t\t\t\tstate,\n\t\t\t\tinput,\n\t\t\t\tgetOperations?.() ?? ctx.toolOperations,\n\t\t\t\t\"codeActions\",\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: await noCapableResult(state, input.path, \"codeActions\", collection, signal) },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst range: Range = {\n\t\t\t\tstart: toPosition(input),\n\t\t\t\tend: {\n\t\t\t\t\tline: (input.endLine ?? input.line) - 1,\n\t\t\t\t\tcharacter: (input.endCharacter ?? input.character) - 1,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst outcomes = await Promise.all(\n\t\t\t\tcollection.routes.map((route) => requestCodeActions(route, input, range, signal)),\n\t\t\t);\n\t\t\tconst failures = [\n\t\t\t\t...collection.failures,\n\t\t\t\t...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : [])),\n\t\t\t];\n\t\t\tconst actions = aggregateCodeActions(state, outcomes);\n\t\t\tif (actions.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `No code actions available.${failureText(failures)}` }],\n\t\t\t\t\tdetails: { count: 0, preferredCount: 0 },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst preferredCount = actions.filter((action) => action.preferred).length;\n\t\t\tconst lines = renderCodeActionLines(state, actions, collection.matchedServerCount > 1);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${actions.length} code action(s). No changes were applied.\\n\\n${lines.join(\"\\n\")}${failureText(failures)}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { count: actions.length, preferredCount },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions\"))} ${theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/transport.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,aAAa,EAKlB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,yBAAyB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1G,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;AA0I1F,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,6BAA6B,GAAG,oBAAoB,CAoDhH;AA+CD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAG3F;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAEpF;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAEnF;AAED,wBAAgB,2BAA2B,CAC1C,SAAS,EAAE,YAAY,EACvB,qBAAqB,GAAE,4BAAiC,GACtD,oBAAoB,CAkBtB","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { createConnection, type Socket } from \"node:net\";\nimport {\n\ttype MessageReader,\n\ttype MessageWriter,\n\tSocketMessageReader,\n\tSocketMessageWriter,\n\tStreamMessageReader,\n\tStreamMessageWriter,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { killProcessTree } from \"../../utils/shell.ts\";\nimport type { LspTransport } from \"./config.ts\";\n\nexport type LspConnectionDisposalMode = \"terminate-process\" | \"disconnect\";\ntype LspSocketEndpointType = \"tcp\" | \"unix\" | \"pipe\";\n\nexport interface LspConnectionEndpoint {\n\ttype: LspTransport[\"type\"];\n\tdescription: string;\n\tdisposalMode: LspConnectionDisposalMode;\n}\n\nexport interface LspConnectionHandle {\n\treader: MessageReader;\n\twriter: MessageWriter;\n\tendpoint: LspConnectionEndpoint;\n\tclose(): Promise<void>;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nexport interface LspConnectionFactoryContext {\n\tserverId: string;\n\tworkspaceRoot: string;\n\tworkspaceUri: string;\n\tsignal: AbortSignal;\n\tconnectTimeoutMs?: number;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionFactory = (context: LspConnectionFactoryContext) => Promise<LspConnectionHandle>;\n\nexport interface ManagedStdioConnectionOptions {\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n\tinheritEnvironment?: boolean;\n}\nexport type LspConnectionFactoryRegistry = Readonly<Record<string, LspConnectionFactory>>;\n\ninterface ConnectionEvents {\n\temitClose(): void;\n\temitError(error: Error): void;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nfunction createConnectionEvents(): ConnectionEvents {\n\tconst closeListeners = new Set<() => void>();\n\tconst errorListeners = new Set<(error: Error) => void>();\n\treturn {\n\t\temitClose: () => {\n\t\t\tfor (const listener of closeListeners) listener();\n\t\t},\n\t\temitError: (error) => {\n\t\t\tfor (const listener of errorListeners) listener(error);\n\t\t},\n\t\tonClose: (listener) => {\n\t\t\tcloseListeners.add(listener);\n\t\t\treturn () => closeListeners.delete(listener);\n\t\t},\n\t\tonError: (listener) => {\n\t\t\terrorListeners.add(listener);\n\t\t\treturn () => errorListeners.delete(listener);\n\t\t},\n\t};\n}\n\nfunction abortError(description: string): Error {\n\treturn new Error(`Aborted while connecting to ${description}`);\n}\n\nasync function waitForConnection(\n\tdescription: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number | undefined,\n\tsubscribe: (resolve: () => void, reject: (error: Error) => void) => () => void,\n): Promise<void> {\n\tif (signal.aborted) throw abortError(description);\n\tawait new Promise<void>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tlet actualUnsubscribe: (() => void) | undefined;\n\t\tlet unsubscribeRequested = false;\n\t\tconst unsubscribe = (): void => {\n\t\t\tif (actualUnsubscribe) actualUnsubscribe();\n\t\t\telse unsubscribeRequested = true;\n\t\t};\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tunsubscribe();\n\t\t};\n\t\tconst succeed = (): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst fail = (error: Error): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = (): void => fail(abortError(description));\n\t\tactualUnsubscribe = subscribe(succeed, fail);\n\t\tif (unsubscribeRequested) actualUnsubscribe();\n\t\tif (settled) return;\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tif (timeoutMs !== undefined && timeoutMs > 0) {\n\t\t\ttimer = setTimeout(\n\t\t\t\t() => fail(new Error(`Timed out connecting to ${description} after ${timeoutMs}ms`)),\n\t\t\t\ttimeoutMs,\n\t\t\t);\n\t\t}\n\t});\n}\n\nfunction mergeEnvironment(extra: Record<string, string> | undefined, inheritEnvironment: boolean): NodeJS.ProcessEnv {\n\treturn inheritEnvironment ? (extra ? { ...process.env, ...extra } : process.env) : { ...extra };\n}\n\nfunction processGroupIsAlive(pid: number): boolean {\n\tif (process.platform === \"win32\") return false;\n\ttry {\n\t\tprocess.kill(-pid, 0);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function waitForChildExit(exited: Promise<void>, timeoutMs: number): Promise<boolean> {\n\tlet timer: NodeJS.Timeout | undefined;\n\tconst didExit = await Promise.race([\n\t\texited.then(() => true),\n\t\tnew Promise<false>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(false), timeoutMs);\n\t\t\ttimer.unref();\n\t\t}),\n\t]);\n\tif (timer) clearTimeout(timer);\n\treturn didExit;\n}\n\nasync function terminateChild(child: ChildProcessWithoutNullStreams): Promise<void> {\n\tif (child.pid === undefined) return;\n\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\treturn;\n\t}\n\tconst exited = new Promise<void>((resolve) => child.once(\"exit\", () => resolve()));\n\tif (child.pid !== undefined && process.platform !== \"win32\") {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, \"SIGTERM\");\n\t\t} catch {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}\n\t} else {\n\t\tchild.kill(\"SIGTERM\");\n\t}\n\tconst exitedGracefully = await waitForChildExit(exited, 2000);\n\tif (exitedGracefully) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\treturn;\n\t}\n\tif (child.exitCode === null && child.signalCode === null && child.pid !== undefined) killProcessTree(child.pid);\n\tawait waitForChildExit(exited, 2000);\n}\n\nexport function createManagedStdioConnectionFactory(options: ManagedStdioConnectionOptions): LspConnectionFactory {\n\treturn async (context) => {\n\t\tconst cwd = options.cwd ?? context.workspaceRoot;\n\t\tconst description = `managed LSP process ${JSON.stringify(options.command)}`;\n\t\tconst child = spawn(options.command, options.args ?? [], {\n\t\t\tcwd,\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tenv: mergeEnvironment(options.env, options.inheritEnvironment !== false),\n\t\t\tstdio: \"pipe\",\n\t\t});\n\t\ttry {\n\t\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\t\tconst onError = (error: Error): void =>\n\t\t\t\t\treject(new Error(`Failed to spawn ${description}: ${error.message}`, { cause: error }));\n\t\t\t\tchild.once(\"spawn\", resolve);\n\t\t\t\tchild.once(\"error\", onError);\n\t\t\t\treturn () => {\n\t\t\t\t\tchild.off(\"spawn\", resolve);\n\t\t\t\t\tchild.off(\"error\", onError);\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tawait terminateChild(child);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst events = createConnectionEvents();\n\t\tlet closed = false;\n\t\tchild.stderr.setEncoding(\"utf8\");\n\t\tchild.stderr.on(\"data\", (chunk: string) => context.onStderr?.(chunk));\n\t\tchild.stdin.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code !== \"EPIPE\" && error.code !== \"ERR_STREAM_DESTROYED\") events.emitError(error);\n\t\t});\n\t\tchild.on(\"error\", (error) => events.emitError(error));\n\t\tchild.on(\"exit\", () => events.emitClose());\n\t\treturn {\n\t\t\treader: new StreamMessageReader(child.stdout),\n\t\t\twriter: new StreamMessageWriter(child.stdin),\n\t\t\tendpoint: {\n\t\t\t\ttype: \"spawn\",\n\t\t\t\tdescription: `${description} (pid ${child.pid ?? \"unknown\"})`,\n\t\t\t\tdisposalMode: \"terminate-process\",\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tawait terminateChild(child);\n\t\t\t},\n\t\t\tonClose: events.onClose,\n\t\t\tonError: events.onError,\n\t\t};\n\t};\n}\n\nasync function connectSocket(\n\tdescription: string,\n\tendpointType: LspSocketEndpointType,\n\tcontext: LspConnectionFactoryContext,\n\tcreateSocket: () => Socket,\n): Promise<LspConnectionHandle> {\n\tconst socket = createSocket();\n\ttry {\n\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\tconst onError = (error: Error): void =>\n\t\t\t\treject(new Error(`Failed to connect to ${description}: ${error.message}`, { cause: error }));\n\t\t\tsocket.once(\"connect\", resolve);\n\t\t\tsocket.once(\"error\", onError);\n\t\t\treturn () => {\n\t\t\t\tsocket.off(\"connect\", resolve);\n\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tsocket.destroy();\n\t\tthrow error;\n\t}\n\n\tconst events = createConnectionEvents();\n\tlet closed = false;\n\tsocket.on(\"error\", (error) => events.emitError(error));\n\tsocket.on(\"close\", () => events.emitClose());\n\treturn {\n\t\treader: new SocketMessageReader(socket),\n\t\twriter: new SocketMessageWriter(socket),\n\t\tendpoint: { type: endpointType, description, disposalMode: \"disconnect\" },\n\t\tclose: async () => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tif (socket.destroyed) return;\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tsocket.once(\"close\", resolve);\n\t\t\t\tsocket.destroy();\n\t\t\t});\n\t\t},\n\t\tonClose: events.onClose,\n\t\tonError: events.onError,\n\t};\n}\n\nexport function createTcpConnectionFactory(host: string, port: number): LspConnectionFactory {\n\treturn (context) =>\n\t\tconnectSocket(`TCP LSP endpoint ${host}:${port}`, \"tcp\", context, () => createConnection({ host, port }));\n}\n\nexport function createUnixSocketConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`Unix LSP socket ${path}`, \"unix\", context, () => createConnection(path));\n}\n\nexport function createNamedPipeConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`LSP named pipe ${path}`, \"pipe\", context, () => createConnection(path));\n}\n\nexport function resolveLspConnectionFactory(\n\ttransport: LspTransport,\n\tprogrammaticFactories: LspConnectionFactoryRegistry = {},\n): LspConnectionFactory {\n\tswitch (transport.type) {\n\t\tcase \"spawn\":\n\t\t\treturn createManagedStdioConnectionFactory(transport);\n\t\tcase \"tcp\":\n\t\t\treturn createTcpConnectionFactory(transport.host, transport.port);\n\t\tcase \"unix\":\n\t\t\treturn createUnixSocketConnectionFactory(transport.path);\n\t\tcase \"pipe\":\n\t\t\treturn createNamedPipeConnectionFactory(transport.path);\n\t\tcase \"connection\": {\n\t\t\tconst factory = Object.hasOwn(programmaticFactories, transport.id)\n\t\t\t\t? programmaticFactories[transport.id]\n\t\t\t\t: undefined;\n\t\t\tif (!factory) throw new Error(`No LSP connection factory is registered for ${JSON.stringify(transport.id)}`);\n\t\t\treturn factory;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/transport.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,aAAa,EAKlB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,yBAAyB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1G,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;AA0I1F,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,6BAA6B,GAAG,oBAAoB,CAoDhH;AA+CD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAG3F;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAEpF;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAEnF;AAED,wBAAgB,2BAA2B,CAC1C,SAAS,EAAE,YAAY,EACvB,qBAAqB,GAAE,4BAAiC,GACtD,oBAAoB,CAkBtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/core/lsp/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { createConnection, type Socket } from \"node:net\";\nimport {\n\ttype MessageReader,\n\ttype MessageWriter,\n\tSocketMessageReader,\n\tSocketMessageWriter,\n\tStreamMessageReader,\n\tStreamMessageWriter,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { killProcessTree } from \"../../utils/shell.ts\";\nimport type { LspTransport } from \"./config.ts\";\n\nexport type LspConnectionDisposalMode = \"terminate-process\" | \"disconnect\";\ntype LspSocketEndpointType = \"tcp\" | \"unix\" | \"pipe\";\n\nexport interface LspConnectionEndpoint {\n\ttype: LspTransport[\"type\"];\n\tdescription: string;\n\tdisposalMode: LspConnectionDisposalMode;\n}\n\nexport interface LspConnectionHandle {\n\treader: MessageReader;\n\twriter: MessageWriter;\n\tendpoint: LspConnectionEndpoint;\n\tclose(): Promise<void>;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nexport interface LspConnectionFactoryContext {\n\tserverId: string;\n\tworkspaceRoot: string;\n\tworkspaceUri: string;\n\tsignal: AbortSignal;\n\tconnectTimeoutMs?: number;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionFactory = (context: LspConnectionFactoryContext) => Promise<LspConnectionHandle>;\n\nexport interface ManagedStdioConnectionOptions {\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n\tinheritEnvironment?: boolean;\n}\nexport type LspConnectionFactoryRegistry = Readonly<Record<string, LspConnectionFactory>>;\n\ninterface ConnectionEvents {\n\temitClose(): void;\n\temitError(error: Error): void;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nfunction createConnectionEvents(): ConnectionEvents {\n\tconst closeListeners = new Set<() => void>();\n\tconst errorListeners = new Set<(error: Error) => void>();\n\treturn {\n\t\temitClose: () => {\n\t\t\tfor (const listener of closeListeners) listener();\n\t\t},\n\t\temitError: (error) => {\n\t\t\tfor (const listener of errorListeners) listener(error);\n\t\t},\n\t\tonClose: (listener) => {\n\t\t\tcloseListeners.add(listener);\n\t\t\treturn () => closeListeners.delete(listener);\n\t\t},\n\t\tonError: (listener) => {\n\t\t\terrorListeners.add(listener);\n\t\t\treturn () => errorListeners.delete(listener);\n\t\t},\n\t};\n}\n\nfunction abortError(description: string): Error {\n\treturn new Error(`Aborted while connecting to ${description}`);\n}\n\nasync function waitForConnection(\n\tdescription: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number | undefined,\n\tsubscribe: (resolve: () => void, reject: (error: Error) => void) => () => void,\n): Promise<void> {\n\tif (signal.aborted) throw abortError(description);\n\tawait new Promise<void>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tlet actualUnsubscribe: (() => void) | undefined;\n\t\tlet unsubscribeRequested = false;\n\t\tconst unsubscribe = (): void => {\n\t\t\tif (actualUnsubscribe) actualUnsubscribe();\n\t\t\telse unsubscribeRequested = true;\n\t\t};\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tunsubscribe();\n\t\t};\n\t\tconst succeed = (): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst fail = (error: Error): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = (): void => fail(abortError(description));\n\t\tactualUnsubscribe = subscribe(succeed, fail);\n\t\tif (unsubscribeRequested) actualUnsubscribe();\n\t\tif (settled) return;\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tif (timeoutMs !== undefined && timeoutMs > 0) {\n\t\t\ttimer = setTimeout(\n\t\t\t\t() => fail(new Error(`Timed out connecting to ${description} after ${timeoutMs}ms`)),\n\t\t\t\ttimeoutMs,\n\t\t\t);\n\t\t}\n\t});\n}\n\nfunction mergeEnvironment(extra: Record<string, string> | undefined, inheritEnvironment: boolean): NodeJS.ProcessEnv {\n\treturn inheritEnvironment ? (extra ? { ...process.env, ...extra } : process.env) : { ...extra };\n}\n\nfunction processGroupIsAlive(pid: number): boolean {\n\tif (process.platform === \"win32\") return false;\n\ttry {\n\t\tprocess.kill(-pid, 0);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function waitForChildExit(exited: Promise<void>, timeoutMs: number): Promise<boolean> {\n\tlet timer: NodeJS.Timeout | undefined;\n\tconst didExit = await Promise.race([\n\t\texited.then(() => true),\n\t\tnew Promise<false>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(false), timeoutMs);\n\t\t\ttimer.unref();\n\t\t}),\n\t]);\n\tif (timer) clearTimeout(timer);\n\treturn didExit;\n}\n\nasync function terminateChild(child: ChildProcessWithoutNullStreams): Promise<void> {\n\tif (child.pid === undefined) return;\n\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\treturn;\n\t}\n\tconst exited = new Promise<void>((resolve) => child.once(\"exit\", () => resolve()));\n\tif (child.pid !== undefined && process.platform !== \"win32\") {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, \"SIGTERM\");\n\t\t} catch {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}\n\t} else {\n\t\tchild.kill(\"SIGTERM\");\n\t}\n\tconst exitedGracefully = await waitForChildExit(exited, 2000);\n\tif (exitedGracefully) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\treturn;\n\t}\n\tif (child.exitCode === null && child.signalCode === null && child.pid !== undefined) killProcessTree(child.pid);\n\tawait waitForChildExit(exited, 2000);\n}\n\nexport function createManagedStdioConnectionFactory(options: ManagedStdioConnectionOptions): LspConnectionFactory {\n\treturn async (context) => {\n\t\tconst cwd = options.cwd ?? context.workspaceRoot;\n\t\tconst description = `managed LSP process ${JSON.stringify(options.command)}`;\n\t\tconst child = spawn(options.command, options.args ?? [], {\n\t\t\tcwd,\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tenv: mergeEnvironment(options.env, options.inheritEnvironment !== false),\n\t\t\tstdio: \"pipe\",\n\t\t});\n\t\ttry {\n\t\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\t\tconst onError = (error: Error): void =>\n\t\t\t\t\treject(new Error(`Failed to spawn ${description}: ${error.message}`, { cause: error }));\n\t\t\t\tchild.once(\"spawn\", resolve);\n\t\t\t\tchild.once(\"error\", onError);\n\t\t\t\treturn () => {\n\t\t\t\t\tchild.off(\"spawn\", resolve);\n\t\t\t\t\tchild.off(\"error\", onError);\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tawait terminateChild(child);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst events = createConnectionEvents();\n\t\tlet closed = false;\n\t\tchild.stderr.setEncoding(\"utf8\");\n\t\tchild.stderr.on(\"data\", (chunk: string) => context.onStderr?.(chunk));\n\t\tchild.stdin.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code !== \"EPIPE\" && error.code !== \"ERR_STREAM_DESTROYED\") events.emitError(error);\n\t\t});\n\t\tchild.on(\"error\", (error) => events.emitError(error));\n\t\tchild.on(\"exit\", () => events.emitClose());\n\t\treturn {\n\t\t\treader: new StreamMessageReader(child.stdout),\n\t\t\twriter: new StreamMessageWriter(child.stdin),\n\t\t\tendpoint: {\n\t\t\t\ttype: \"spawn\",\n\t\t\t\tdescription: `${description} (pid ${child.pid ?? \"unknown\"})`,\n\t\t\t\tdisposalMode: \"terminate-process\",\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tawait terminateChild(child);\n\t\t\t},\n\t\t\tonClose: events.onClose,\n\t\t\tonError: events.onError,\n\t\t};\n\t};\n}\n\nasync function connectSocket(\n\tdescription: string,\n\tendpointType: LspSocketEndpointType,\n\tcontext: LspConnectionFactoryContext,\n\tcreateSocket: () => Socket,\n): Promise<LspConnectionHandle> {\n\tconst socket = createSocket();\n\ttry {\n\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\tconst onError = (error: Error): void =>\n\t\t\t\treject(new Error(`Failed to connect to ${description}: ${error.message}`, { cause: error }));\n\t\t\tsocket.once(\"connect\", resolve);\n\t\t\tsocket.once(\"error\", onError);\n\t\t\treturn () => {\n\t\t\t\tsocket.off(\"connect\", resolve);\n\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tsocket.destroy();\n\t\tthrow error;\n\t}\n\n\tconst events = createConnectionEvents();\n\tlet closed = false;\n\tsocket.on(\"error\", (error) => events.emitError(error));\n\tsocket.on(\"close\", () => events.emitClose());\n\treturn {\n\t\treader: new SocketMessageReader(socket),\n\t\twriter: new SocketMessageWriter(socket),\n\t\tendpoint: { type: endpointType, description, disposalMode: \"disconnect\" },\n\t\tclose: async () => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tif (socket.destroyed) return;\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tsocket.once(\"close\", resolve);\n\t\t\t\tsocket.destroy();\n\t\t\t});\n\t\t},\n\t\tonClose: events.onClose,\n\t\tonError: events.onError,\n\t};\n}\n\nexport function createTcpConnectionFactory(host: string, port: number): LspConnectionFactory {\n\treturn (context) =>\n\t\tconnectSocket(`TCP LSP endpoint ${host}:${port}`, \"tcp\", context, () => createConnection({ host, port }));\n}\n\nexport function createUnixSocketConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`Unix LSP socket ${path}`, \"unix\", context, () => createConnection(path));\n}\n\nexport function createNamedPipeConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`LSP named pipe ${path}`, \"pipe\", context, () => createConnection(path));\n}\n\nexport function resolveLspConnectionFactory(\n\ttransport: LspTransport,\n\tprogrammaticFactories: LspConnectionFactoryRegistry = {},\n): LspConnectionFactory {\n\tswitch (transport.type) {\n\t\tcase \"spawn\":\n\t\t\treturn createManagedStdioConnectionFactory(transport);\n\t\tcase \"tcp\":\n\t\t\treturn createTcpConnectionFactory(transport.host, transport.port);\n\t\tcase \"unix\":\n\t\t\treturn createUnixSocketConnectionFactory(transport.path);\n\t\tcase \"pipe\":\n\t\t\treturn createNamedPipeConnectionFactory(transport.path);\n\t\tcase \"connection\": {\n\t\t\tconst factory = Object.hasOwn(programmaticFactories, transport.id)\n\t\t\t\t? programmaticFactories[transport.id]\n\t\t\t\t: undefined;\n\t\t\tif (!factory) throw new Error(`No LSP connection factory is registered for ${JSON.stringify(transport.id)}`);\n\t\t\treturn factory;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/core/lsp/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { createConnection, type Socket } from \"node:net\";\nimport {\n\ttype MessageReader,\n\ttype MessageWriter,\n\tSocketMessageReader,\n\tSocketMessageWriter,\n\tStreamMessageReader,\n\tStreamMessageWriter,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { killProcessTree } from \"../../utils/shell.ts\";\nimport type { LspTransport } from \"./config.ts\";\n\nexport type LspConnectionDisposalMode = \"terminate-process\" | \"disconnect\";\ntype LspSocketEndpointType = \"tcp\" | \"unix\" | \"pipe\";\n\nexport interface LspConnectionEndpoint {\n\ttype: LspTransport[\"type\"];\n\tdescription: string;\n\tdisposalMode: LspConnectionDisposalMode;\n}\n\nexport interface LspConnectionHandle {\n\treader: MessageReader;\n\twriter: MessageWriter;\n\tendpoint: LspConnectionEndpoint;\n\tclose(): Promise<void>;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nexport interface LspConnectionFactoryContext {\n\tserverId: string;\n\tworkspaceRoot: string;\n\tworkspaceUri: string;\n\tsignal: AbortSignal;\n\tconnectTimeoutMs?: number;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionFactory = (context: LspConnectionFactoryContext) => Promise<LspConnectionHandle>;\n\nexport interface ManagedStdioConnectionOptions {\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n\tinheritEnvironment?: boolean;\n}\nexport type LspConnectionFactoryRegistry = Readonly<Record<string, LspConnectionFactory>>;\n\ninterface ConnectionEvents {\n\temitClose(): void;\n\temitError(error: Error): void;\n\tonClose(listener: () => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n}\n\nfunction createConnectionEvents(): ConnectionEvents {\n\tconst closeListeners = new Set<() => void>();\n\tconst errorListeners = new Set<(error: Error) => void>();\n\treturn {\n\t\temitClose: () => {\n\t\t\tfor (const listener of closeListeners) listener();\n\t\t},\n\t\temitError: (error) => {\n\t\t\tfor (const listener of errorListeners) listener(error);\n\t\t},\n\t\tonClose: (listener) => {\n\t\t\tcloseListeners.add(listener);\n\t\t\treturn () => closeListeners.delete(listener);\n\t\t},\n\t\tonError: (listener) => {\n\t\t\terrorListeners.add(listener);\n\t\t\treturn () => errorListeners.delete(listener);\n\t\t},\n\t};\n}\n\nfunction abortError(description: string): Error {\n\treturn new Error(`Aborted while connecting to ${description}`);\n}\n\nasync function waitForConnection(\n\tdescription: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number | undefined,\n\tsubscribe: (resolve: () => void, reject: (error: Error) => void) => () => void,\n): Promise<void> {\n\tif (signal.aborted) throw abortError(description);\n\tawait new Promise<void>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tlet actualUnsubscribe: (() => void) | undefined;\n\t\tlet unsubscribeRequested = false;\n\t\tconst unsubscribe = (): void => {\n\t\t\tif (actualUnsubscribe) actualUnsubscribe();\n\t\t\telse unsubscribeRequested = true;\n\t\t};\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tunsubscribe();\n\t\t};\n\t\tconst succeed = (): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst fail = (error: Error): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = (): void => fail(abortError(description));\n\t\tactualUnsubscribe = subscribe(succeed, fail);\n\t\tif (unsubscribeRequested) actualUnsubscribe();\n\t\tif (settled) return;\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tif (timeoutMs !== undefined && timeoutMs > 0) {\n\t\t\ttimer = setTimeout(\n\t\t\t\t() => fail(new Error(`Timed out connecting to ${description} after ${timeoutMs}ms`)),\n\t\t\t\ttimeoutMs,\n\t\t\t);\n\t\t}\n\t});\n}\n\nfunction mergeEnvironment(extra: Record<string, string> | undefined, inheritEnvironment: boolean): NodeJS.ProcessEnv {\n\treturn inheritEnvironment ? (extra ? { ...process.env, ...extra } : process.env) : { ...extra };\n}\n\nfunction processGroupIsAlive(pid: number): boolean {\n\tif (process.platform === \"win32\") return false;\n\ttry {\n\t\tprocess.kill(-pid, 0);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function waitForChildExit(exited: Promise<void>, timeoutMs: number): Promise<boolean> {\n\tlet timer: NodeJS.Timeout | undefined;\n\tconst didExit = await Promise.race([\n\t\texited.then(() => true),\n\t\tnew Promise<false>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(false), timeoutMs);\n\t\t\ttimer.unref();\n\t\t}),\n\t]);\n\tif (timer) clearTimeout(timer);\n\treturn didExit;\n}\n\nasync function terminateChild(child: ChildProcessWithoutNullStreams): Promise<void> {\n\tif (child.pid === undefined) return;\n\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\treturn;\n\t}\n\tconst exited = new Promise<void>((resolve) => child.once(\"exit\", () => resolve()));\n\tif (child.pid !== undefined && process.platform !== \"win32\") {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, \"SIGTERM\");\n\t\t} catch {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}\n\t} else {\n\t\tchild.kill(\"SIGTERM\");\n\t}\n\tconst exitedGracefully = await waitForChildExit(exited, 2000);\n\tif (exitedGracefully) {\n\t\tif (processGroupIsAlive(child.pid)) killProcessTree(child.pid);\n\t\treturn;\n\t}\n\tif (child.exitCode === null && child.signalCode === null && child.pid !== undefined) killProcessTree(child.pid);\n\tawait waitForChildExit(exited, 2000);\n}\n\nexport function createManagedStdioConnectionFactory(options: ManagedStdioConnectionOptions): LspConnectionFactory {\n\treturn async (context) => {\n\t\tconst cwd = options.cwd ?? context.workspaceRoot;\n\t\tconst description = `managed LSP process ${JSON.stringify(options.command)}`;\n\t\tconst child = spawn(options.command, options.args ?? [], {\n\t\t\tcwd,\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tenv: mergeEnvironment(options.env, options.inheritEnvironment !== false),\n\t\t\tstdio: \"pipe\",\n\t\t});\n\t\ttry {\n\t\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\t\tconst onError = (error: Error): void =>\n\t\t\t\t\treject(new Error(`Failed to spawn ${description}: ${error.message}`, { cause: error }));\n\t\t\t\tchild.once(\"spawn\", resolve);\n\t\t\t\tchild.once(\"error\", onError);\n\t\t\t\treturn () => {\n\t\t\t\t\tchild.off(\"spawn\", resolve);\n\t\t\t\t\tchild.off(\"error\", onError);\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tawait terminateChild(child);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst events = createConnectionEvents();\n\t\tlet closed = false;\n\t\tchild.stderr.setEncoding(\"utf8\");\n\t\tchild.stderr.on(\"data\", (chunk: string) => context.onStderr?.(chunk));\n\t\tchild.stdin.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code !== \"EPIPE\" && error.code !== \"ERR_STREAM_DESTROYED\") events.emitError(error);\n\t\t});\n\t\tchild.on(\"error\", (error) => events.emitError(error));\n\t\tchild.on(\"exit\", () => events.emitClose());\n\t\treturn {\n\t\t\treader: new StreamMessageReader(child.stdout),\n\t\t\twriter: new StreamMessageWriter(child.stdin),\n\t\t\tendpoint: {\n\t\t\t\ttype: \"spawn\",\n\t\t\t\tdescription: `${description} (pid ${child.pid ?? \"unknown\"})`,\n\t\t\t\tdisposalMode: \"terminate-process\",\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tawait terminateChild(child);\n\t\t\t},\n\t\t\tonClose: events.onClose,\n\t\t\tonError: events.onError,\n\t\t};\n\t};\n}\n\nasync function connectSocket(\n\tdescription: string,\n\tendpointType: LspSocketEndpointType,\n\tcontext: LspConnectionFactoryContext,\n\tcreateSocket: () => Socket,\n): Promise<LspConnectionHandle> {\n\tconst socket = createSocket();\n\ttry {\n\t\tawait waitForConnection(description, context.signal, context.connectTimeoutMs, (resolve, reject) => {\n\t\t\tconst onError = (error: Error): void =>\n\t\t\t\treject(new Error(`Failed to connect to ${description}: ${error.message}`, { cause: error }));\n\t\t\tsocket.once(\"connect\", resolve);\n\t\t\tsocket.once(\"error\", onError);\n\t\t\treturn () => {\n\t\t\t\tsocket.off(\"connect\", resolve);\n\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tsocket.destroy();\n\t\tthrow error;\n\t}\n\n\tconst events = createConnectionEvents();\n\tlet closed = false;\n\tsocket.on(\"error\", (error) => events.emitError(error));\n\tsocket.on(\"close\", () => events.emitClose());\n\treturn {\n\t\treader: new SocketMessageReader(socket),\n\t\twriter: new SocketMessageWriter(socket),\n\t\tendpoint: { type: endpointType, description, disposalMode: \"disconnect\" },\n\t\tclose: async () => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tif (socket.destroyed) return;\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tsocket.once(\"close\", resolve);\n\t\t\t\tsocket.destroy();\n\t\t\t});\n\t\t},\n\t\tonClose: events.onClose,\n\t\tonError: events.onError,\n\t};\n}\n\nexport function createTcpConnectionFactory(host: string, port: number): LspConnectionFactory {\n\treturn (context) =>\n\t\tconnectSocket(`TCP LSP endpoint ${host}:${port}`, \"tcp\", context, () => createConnection({ host, port }));\n}\n\nexport function createUnixSocketConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`Unix LSP socket ${path}`, \"unix\", context, () => createConnection(path));\n}\n\nexport function createNamedPipeConnectionFactory(path: string): LspConnectionFactory {\n\treturn (context) => connectSocket(`LSP named pipe ${path}`, \"pipe\", context, () => createConnection(path));\n}\n\nexport function resolveLspConnectionFactory(\n\ttransport: LspTransport,\n\tprogrammaticFactories: LspConnectionFactoryRegistry = {},\n): LspConnectionFactory {\n\tswitch (transport.type) {\n\t\tcase \"spawn\":\n\t\t\treturn createManagedStdioConnectionFactory(transport);\n\t\tcase \"tcp\":\n\t\t\treturn createTcpConnectionFactory(transport.host, transport.port);\n\t\tcase \"unix\":\n\t\t\treturn createUnixSocketConnectionFactory(transport.path);\n\t\tcase \"pipe\":\n\t\t\treturn createNamedPipeConnectionFactory(transport.path);\n\t\tcase \"connection\": {\n\t\t\tconst factory = Object.hasOwn(programmaticFactories, transport.id)\n\t\t\t\t? programmaticFactories[transport.id]\n\t\t\t\t: undefined;\n\t\t\tif (!factory) throw new Error(`No LSP connection factory is registered for ${JSON.stringify(transport.id)}`);\n\t\t\treturn factory;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,MAAM,4BAA4B,CAAC;AAIpC,YAAY,EACX,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,GACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7E,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,eAAO,MAAM,wCAAwC,iCAAiC,CAAC;AAEvF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAW3E;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAqDhE"
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,MAAM,4BAA4B,CAAC;AAIpC,YAAY,EACX,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,GACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7E,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,eAAO,MAAM,wCAAwC,iCAAiC,CAAC;AAEvF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAW3E;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAqDhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAW9D,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;CAGxC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;WAC9B,CAAC;AAEZ,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;CAGpC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,MAAM,CAAC,MAAM,wCAAwC,GAAG,8BAA8B,CAAC;AAEvF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAyB
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AgentMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type {\n\tAgentMessage,\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport { HOOK_EXECUTION_CUSTOM_TYPE } from \"./hooks/types.ts\";\n\nexport type {\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport type { ImageContent, Message, TextContent } from \"@greppleai/grip-ai\";\n\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nexport const COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\nexport const STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE = \"structured_response_internal\";\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary: summary,\n\t\ttokensBefore,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/** Normalize content-bearing messages received from untyped extension and session boundaries. */\nexport function normalizeMessageContent(message: AgentMessage): AgentMessage {\n\tif (\n\t\t(message.role === \"user\" ||\n\t\t\tmessage.role === \"assistant\" ||\n\t\t\tmessage.role === \"toolResult\" ||\n\t\t\tmessage.role === \"custom\") &&\n\t\tmessage.content == null\n\t) {\n\t\treturn { ...message, content: [] } as AgentMessage;\n\t}\n\treturn message;\n}\n\n/** Convert CustomMessageEntry to AgentMessage format */\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent: content ?? [],\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/**\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's transormToLlm option (for prompt calls and queued messages)\n * - Compaction's generateSummary (for summarization)\n * - Custom extensions and tools\n */\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\tm.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE ||\n\t\t\t\t\t\tm.customType === HOOK_EXECUTION_CUSTOM_TYPE\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m) => m !== undefined);\n}\n"]}
|