@greppleai/grip 0.1.5 → 0.1.7
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 +35 -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 +2 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +38 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +289 -154
- 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 +9 -2
- 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 +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +40 -30
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -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 +1 -0
- package/dist/core/instruction-resource-loader.d.ts.map +1 -1
- package/dist/core/instruction-resource-loader.js +2 -4
- 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 +30 -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 +3 -2
- 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 +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +3 -2
- 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 +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +34 -28
- 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 +11 -0
- package/dist/core/tools/operations.d.ts.map +1 -1
- package/dist/core/tools/operations.js +54 -28
- 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 +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -3
- 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 +8 -4
- 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 +13 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +162 -136
- 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 +33 -2
- 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/binary-self-update.d.ts +25 -0
- package/dist/utils/binary-self-update.d.ts.map +1 -0
- package/dist/utils/binary-self-update.js +159 -0
- package/dist/utils/binary-self-update.js.map +1 -0
- 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 +8 -0
- package/dist/utils/directory-completions.d.ts.map +1 -1
- package/dist/utils/directory-completions.js +42 -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/extensions.md +31 -1
- package/docs/sandbox.md +6 -0
- package/docs/sessions.md +1 -1
- package/docs/skills.md +4 -4
- 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 +602 -834
- package/package.json +20 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/core/lsp/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAGN,qBAAqB,EAErB,uBAAuB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA+ChG,MAAM,gBAAgB,GAAgC;IACrD,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACP,CAAC;AAqBF,SAAS,yBAAyB,CACjC,UAAyC,EACzC,MAAkC,EAC3B;IACP,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAAA,CACtE;AAED,SAAS,mCAAmC,CAAC,OAAoC,EAAiC;IACjH,MAAM,UAAU,GAAkC;QACjD,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,CAAC;QACZ,kBAAkB,EAAE,KAAK;KACzB,CAAC;IACF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5F,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,yBAAyB,EAAE,CAAC;IAChF,MAAM,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,0BAA0B,EAAE,CAAC;IAClF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI;QAC7B,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAC9B,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACvB,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACrC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,SAAS;YACnB,MAAM;YACN,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,qFAAqF,KAAK,CAAC,OAAO,EAAE;SAC7G,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACvC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,mBAAmB,CAAC,kBAAkB,CAAC;YAChD,KAAK,EAAE,mBAAmB;SAC1B,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACxC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,mBAAmB,CAAC,mBAAmB,CAAC;YACjD,KAAK,EAAE,oBAAoB;SAC3B,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AAAA,CAClB;AAED,KAAK,UAAU,qBAAqB,CACnC,QAAgB,EAChB,WAA+C,EACR;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzF,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAClF,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AAAA,CACD;AAED,KAAK,UAAU,wBAAwB,CACtC,KAA4B,EAC5B,OAAoC,EACpC,UAAyC,EACzB;IAChB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC5E,OAAO,EAAE,OAAO,CAAC,GAAG;YACpB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACzB,CAAC,CAAC;QACH,OAAO;IACR,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,CAAC;YAC9F,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC;YAC/D,KAAK,EAAE,KAAK,CAAC,aAAa;SAC1B,CAAC,CAAC;QACH,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO;IAC3B,yBAAyB,CAAC,UAAU,EAAE;QACrC,KAAK;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC,KAAK;KACnB,CAAC,CAAC;AAAA,CACH;AAED,SAAS,0BAA0B,CAClC,MAA2B,EAC3B,yBAA8C,EAC9C,WAA+C,EACX;IACpC,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,aAAa,GAAG,iCAAiC,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,IAAI,CAAC,QAAQ,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,yBAAyB;QAC9D,CAAC,CAAC,+BAA+B,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;QACrF,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;AAAA,CAC1B;AACD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAoC,EAAuC;IACrH,MAAM,UAAU,GAAG,mCAAmC,CAAC,OAAO,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;QAAE,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACrG,UAAU,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CACzG,CAAC;IAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5G,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC/F,MAAM,aAAa,GAClB,UAAU,CAAC,kBAAkB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAAA,CAC9D;AAED,MAAM,UAAU,iCAAiC,CAChD,KAA4B,EAC5B,OAAe,EACS;IACxB,OAAO;QACN,GAAG,KAAK;QACR,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;gBAAE,OAAO,MAAM,CAAC;YAC5C,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAA,CAC3C,CAAC;KACF,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,MAA2B,EAAE,OAAe,EAAuB;IAC9F,MAAM,SAAS,GACd,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO;QAChC,CAAC,CAAC;YACA,GAAG,MAAM,CAAC,SAAS;YACnB,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;gBACxD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;YAC3B,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1F;QACF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;YACjC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAClF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACtB,MAAM,SAAS,GACd,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO;QAChC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAClF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;YAC/D,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACtF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAEtB,OAAO;QACN,GAAG,MAAM;QACT,SAAS;QACT,SAAS;QACT,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpD,GAAG,OAAO;YACV,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC;SACxD,CAAC,CAAC;KACH,CAAC;AAAA,CACF;AAED,SAAS,+BAA+B,CACvC,KAA4B,EAC5B,MAAc,EACd,WAA+C,EACvB;IACxB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,SAAS;YACnB,MAAM;YACN,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,yFAAyF;SAClG,CAAC,CAAC;IACJ,CAAC;IACD,OAAO;QACN,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;oBAChD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC;oBAC1C,WAAW,CAAC,IAAI,CAAC;wBAChB,QAAQ,EAAE,SAAS;wBACnB,MAAM;wBACN,IAAI,EAAE,aAAa,KAAK,aAAa;wBACrC,OAAO,EAAE,uBAAuB,MAAM,CAAC,SAAS,CAAC,IAAI,yBAAyB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,2DAA2D;qBAClK,CAAC,CAAC;oBACH,OAAO,KAAK,CAAC;gBAAA,CACb,CAAC;aACF,CAAC;KACJ,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAa,EAAU;IAClE,OAAO,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAAA,CAC3C;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAW;IACpD,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAA,CAClF","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\nimport type { SettingsManager } from \"../settings-manager.ts\";\nimport {\n\ttype LspConfigurationLayer,\n\ttype LspConfiguredServer,\n\tparseLspConfiguration,\n\ttype ResolvedLspConfiguration,\n\tresolveLspConfiguration,\n} from \"./config.ts\";\nimport { dirnamePortablePath, joinPortablePath, resolvePortablePath } from \"./portable-path.ts\";\n\nexport type LspConfigurationInputScope = \"cli\" | \"host\";\nexport type LspConfigurationSourceDiagnosticSeverity = \"warning\" | \"error\";\n\nexport type LspConfigurationInput =\n\t| {\n\t\t\ttype: \"configuration\";\n\t\t\tconfiguration: LspConfigurationLayer;\n\t\t\tbaseDir?: string;\n\t\t\tsource?: string;\n\t\t\tscope?: LspConfigurationInputScope;\n\t }\n\t| { type: \"file\"; path: string; scope?: LspConfigurationInputScope }\n\t| { type: \"disabled\"; source?: string; scope?: LspConfigurationInputScope };\n\nexport interface LspConfigurationSourceDiagnostic {\n\tseverity: LspConfigurationSourceDiagnosticSeverity;\n\tsource: string;\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface LoadLspConfigurationOptions {\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\tagentDir: string;\n\tinputs?: readonly LspConfigurationInput[];\n\t/** Host-controlled grant. Project settings cannot grant trust to active LSP transports. */\n\ttrustProjectLspTransports?: boolean;\n}\n\nexport interface LoadLspConfigurationResult {\n\tconfiguration: ResolvedLspConfiguration;\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n}\n\ntype SourceScope = \"global\" | \"project\" | LspConfigurationInputScope;\n\ninterface ConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n\torder: number;\n}\n\nconst SCOPE_PRECEDENCE: Record<SourceScope, number> = {\n\tglobal: 0,\n\tproject: 1,\n\tcli: 2,\n\thost: 3,\n};\n\ninterface PendingConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n}\n\ninterface ConfigurationSourceCollection {\n\tsources: ConfigurationSource[];\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n\tnextOrder: number;\n\tsettingsLoadFailed: boolean;\n}\n\ninterface ConfigurationFileLoadResult {\n\tloaded: boolean;\n\tvalue?: unknown;\n}\n\nfunction appendConfigurationSource(\n\tcollection: ConfigurationSourceCollection,\n\tsource: PendingConfigurationSource,\n): void {\n\tcollection.sources.push({ ...source, order: collection.nextOrder++ });\n}\n\nfunction collectSettingsConfigurationSources(options: LoadLspConfigurationOptions): ConfigurationSourceCollection {\n\tconst collection: ConfigurationSourceCollection = {\n\t\tsources: [],\n\t\tdiagnostics: [],\n\t\tnextOrder: 0,\n\t\tsettingsLoadFailed: false,\n\t};\n\tconst globalSettingsPath = joinPortablePath(options.agentDir, \"settings.json\");\n\tconst projectSettingsPath = joinPortablePath(options.cwd, CONFIG_DIR_NAME, \"settings.json\");\n\tconst globalConfiguration = options.settingsManager.getGlobalLspConfiguration();\n\tconst projectConfiguration = options.settingsManager.getProjectLspConfiguration();\n\tfor (const [scope, source] of [\n\t\t[\"global\", globalSettingsPath],\n\t\t[\"project\", projectSettingsPath],\n\t] as const) {\n\t\tconst error = options.settingsManager.getLoadError(scope);\n\t\tif (!error) continue;\n\t\tcollection.settingsLoadFailed = true;\n\t\tcollection.diagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `settings could not be loaded; LSP is disabled to avoid using stale configuration: ${error.message}`,\n\t\t});\n\t}\n\n\tif (globalConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"global\",\n\t\t\tsource: globalSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(globalSettingsPath),\n\t\t\tvalue: globalConfiguration,\n\t\t});\n\t}\n\tif (projectConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"project\",\n\t\t\tsource: projectSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(projectSettingsPath),\n\t\t\tvalue: projectConfiguration,\n\t\t});\n\t}\n\treturn collection;\n}\n\nasync function loadConfigurationFile(\n\tfilePath: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): Promise<ConfigurationFileLoadResult> {\n\tlet content: string;\n\ttry {\n\t\tcontent = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n\ttry {\n\t\treturn { loaded: true, value: JSON.parse(content) as unknown };\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n}\n\nasync function appendConfigurationInput(\n\tinput: LspConfigurationInput,\n\toptions: LoadLspConfigurationOptions,\n\tcollection: ConfigurationSourceCollection,\n): Promise<void> {\n\tconst scope = input.scope ?? \"host\";\n\tif (input.type === \"disabled\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"--no-lsp\" : \"host LSP override\"),\n\t\t\tbaseDir: options.cwd,\n\t\t\tvalue: { enabled: false },\n\t\t});\n\t\treturn;\n\t}\n\tif (input.type === \"configuration\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"CLI LSP configuration\" : \"host LSP configuration\"),\n\t\t\tbaseDir: resolvePortablePath(options.cwd, input.baseDir ?? \".\"),\n\t\t\tvalue: input.configuration,\n\t\t});\n\t\treturn;\n\t}\n\n\tconst filePath = resolvePortablePath(options.cwd, input.path);\n\tconst loaded = await loadConfigurationFile(filePath, collection.diagnostics);\n\tif (!loaded.loaded) return;\n\tappendConfigurationSource(collection, {\n\t\tscope,\n\t\tsource: filePath,\n\t\tbaseDir: dirnamePortablePath(filePath),\n\t\tvalue: loaded.value,\n\t});\n}\n\nfunction resolveConfigurationSource(\n\tsource: ConfigurationSource,\n\ttrustProjectLspTransports: boolean | undefined,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer | undefined {\n\tconst parsed = parseLspConfiguration(source.value);\n\tfor (const diagnostic of parsed.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!parsed.configuration) return undefined;\n\tconst resolvedLayer = resolveLspConfigurationLayerPaths(parsed.configuration, source.baseDir);\n\tconst resolved = parseLspConfiguration(resolvedLayer);\n\tfor (const diagnostic of resolved.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!resolved.configuration) return undefined;\n\treturn source.scope === \"project\" && !trustProjectLspTransports\n\t\t? blockUntrustedProjectTransports(resolved.configuration, source.source, diagnostics)\n\t\t: resolved.configuration;\n}\n/**\n * Load and resolve LSP configuration in deterministic order:\n * global settings < project settings < CLI inputs < SDK/host inputs.\n */\nexport async function loadLspConfiguration(options: LoadLspConfigurationOptions): Promise<LoadLspConfigurationResult> {\n\tconst collection = collectSettingsConfigurationSources(options);\n\tfor (const input of options.inputs ?? []) await appendConfigurationInput(input, options, collection);\n\tcollection.sources.sort(\n\t\t(left, right) => SCOPE_PRECEDENCE[left.scope] - SCOPE_PRECEDENCE[right.scope] || left.order - right.order,\n\t);\n\n\tconst layers: LspConfigurationLayer[] = [];\n\tfor (const source of collection.sources) {\n\t\tconst layer = resolveConfigurationSource(source, options.trustProjectLspTransports, collection.diagnostics);\n\t\tif (layer) layers.push(layer);\n\t}\n\tconst hasErrors = collection.diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n\tconst configuration =\n\t\tcollection.settingsLoadFailed || hasErrors ? { enabled: false, servers: [] } : resolveLspConfiguration(layers);\n\treturn { configuration, diagnostics: collection.diagnostics };\n}\n\nexport function resolveLspConfigurationLayerPaths(\n\tlayer: LspConfigurationLayer,\n\tbaseDir: string,\n): LspConfigurationLayer {\n\treturn {\n\t\t...layer,\n\t\tservers: layer.servers?.map((server) => {\n\t\t\tif (server.enabled === false) return server;\n\t\t\treturn resolveServerPaths(server, baseDir);\n\t\t}),\n\t};\n}\n\nfunction resolveServerPaths(server: LspConfiguredServer, baseDir: string): LspConfiguredServer {\n\tconst transport =\n\t\tserver.transport.type === \"spawn\"\n\t\t\t? {\n\t\t\t\t\t...server.transport,\n\t\t\t\t\tcommand: isPathLikeCommand(server.transport.command)\n\t\t\t\t\t\t? resolvePortablePath(baseDir, server.transport.command)\n\t\t\t\t\t\t: server.transport.command,\n\t\t\t\t\t...(server.transport.cwd ? { cwd: resolveIfRelative(baseDir, server.transport.cwd) } : {}),\n\t\t\t\t}\n\t\t\t: server.transport.type === \"unix\"\n\t\t\t\t? { ...server.transport, path: resolveIfRelative(baseDir, server.transport.path) }\n\t\t\t\t: server.transport;\n\tconst workspace =\n\t\tserver.workspace.type === \"fixed\"\n\t\t\t? { ...server.workspace, path: resolveIfRelative(baseDir, server.workspace.path) }\n\t\t\t: server.workspace.type === \"markers\" && server.workspace.stopAt\n\t\t\t\t? { ...server.workspace, stopAt: resolveIfRelative(baseDir, server.workspace.stopAt) }\n\t\t\t\t: server.workspace;\n\n\treturn {\n\t\t...server,\n\t\ttransport,\n\t\tworkspace,\n\t\tpathMappings: server.pathMappings?.map((mapping) => ({\n\t\t\t...mapping,\n\t\t\tagentRoot: resolveIfRelative(baseDir, mapping.agentRoot),\n\t\t})),\n\t};\n}\n\nfunction blockUntrustedProjectTransports(\n\tlayer: LspConfigurationLayer,\n\tsource: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer {\n\tif (layer.enabled === true) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$.enabled\",\n\t\t\tmessage: \"blocked project LSP activation; the host must set trustProjectLspTransports to allow it\",\n\t\t});\n\t}\n\treturn {\n\t\t...(layer.enabled === false ? { enabled: false } : {}),\n\t\t...(layer.mode === undefined ? {} : { mode: layer.mode }),\n\t\t...(layer.servers === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tservers: layer.servers.filter((server, index) => {\n\t\t\t\t\t\tif (server.enabled === false) return true;\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tpath: `$.servers[${index}].transport`,\n\t\t\t\t\t\t\tmessage: `blocked project LSP ${server.transport.type} transport for server ${JSON.stringify(server.id)}; the host must set trustProjectLspTransports to allow it`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t};\n}\n\nfunction resolveIfRelative(baseDir: string, value: string): string {\n\treturn resolvePortablePath(baseDir, value);\n}\n\nfunction isPathLikeCommand(command: string): boolean {\n\treturn command.startsWith(\".\") || command.includes(\"/\") || command.includes(\"\\\\\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/core/lsp/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAGN,qBAAqB,EAErB,uBAAuB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA+ChG,MAAM,gBAAgB,GAAgC;IACrD,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACP,CAAC;AAqBF,SAAS,yBAAyB,CACjC,UAAyC,EACzC,MAAkC;IAElC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,mCAAmC,CAAC,OAAoC;IAChF,MAAM,UAAU,GAAkC;QACjD,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,CAAC;QACZ,kBAAkB,EAAE,KAAK;KACzB,CAAC;IACF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5F,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,yBAAyB,EAAE,CAAC;IAChF,MAAM,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,0BAA0B,EAAE,CAAC;IAClF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI;QAC7B,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAC9B,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACvB,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACrC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,SAAS;YACnB,MAAM;YACN,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,qFAAqF,KAAK,CAAC,OAAO,EAAE;SAC7G,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACvC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,mBAAmB,CAAC,kBAAkB,CAAC;YAChD,KAAK,EAAE,mBAAmB;SAC1B,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACxC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,mBAAmB,CAAC,mBAAmB,CAAC;YACjD,KAAK,EAAE,oBAAoB;SAC3B,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,QAAgB,EAChB,WAA+C;IAE/C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzF,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAClF,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACF,CAAC;AAED,KAAK,UAAU,wBAAwB,CACtC,KAA4B,EAC5B,OAAoC,EACpC,UAAyC;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC5E,OAAO,EAAE,OAAO,CAAC,GAAG;YACpB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACzB,CAAC,CAAC;QACH,OAAO;IACR,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,yBAAyB,CAAC,UAAU,EAAE;YACrC,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,CAAC;YAC9F,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC;YAC/D,KAAK,EAAE,KAAK,CAAC,aAAa;SAC1B,CAAC,CAAC;QACH,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO;IAC3B,yBAAyB,CAAC,UAAU,EAAE;QACrC,KAAK;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC,KAAK;KACnB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAClC,MAA2B,EAC3B,yBAA8C,EAC9C,WAA+C;IAE/C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,aAAa,GAAG,iCAAiC,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,IAAI,CAAC,QAAQ,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,yBAAyB;QAC9D,CAAC,CAAC,+BAA+B,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;QACrF,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC3B,CAAC;AACD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAoC;IAC9E,MAAM,UAAU,GAAG,mCAAmC,CAAC,OAAO,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;QAAE,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACrG,UAAU,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CACzG,CAAC;IAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5G,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC/F,MAAM,aAAa,GAClB,UAAU,CAAC,kBAAkB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAChD,KAA4B,EAC5B,OAAe;IAEf,OAAO;QACN,GAAG,KAAK;QACR,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACtC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;gBAAE,OAAO,MAAM,CAAC;YAC5C,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC;KACF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA2B,EAAE,OAAe;IACvE,MAAM,SAAS,GACd,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO;QAChC,CAAC,CAAC;YACA,GAAG,MAAM,CAAC,SAAS;YACnB,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;gBACxD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;YAC3B,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1F;QACF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;YACjC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAClF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACtB,MAAM,SAAS,GACd,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO;QAChC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAClF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;YAC/D,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACtF,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAEtB,OAAO;QACN,GAAG,MAAM;QACT,SAAS;QACT,SAAS;QACT,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpD,GAAG,OAAO;YACV,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC;SACxD,CAAC,CAAC;KACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CACvC,KAA4B,EAC5B,MAAc,EACd,WAA+C;IAE/C,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,SAAS;YACnB,MAAM;YACN,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,yFAAyF;SAClG,CAAC,CAAC;IACJ,CAAC;IACD,OAAO;QACN,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC;oBAC1C,WAAW,CAAC,IAAI,CAAC;wBAChB,QAAQ,EAAE,SAAS;wBACnB,MAAM;wBACN,IAAI,EAAE,aAAa,KAAK,aAAa;wBACrC,OAAO,EAAE,uBAAuB,MAAM,CAAC,SAAS,CAAC,IAAI,yBAAyB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,2DAA2D;qBAClK,CAAC,CAAC;oBACH,OAAO,KAAK,CAAC;gBACd,CAAC,CAAC;aACF,CAAC;KACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAa;IACxD,OAAO,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\nimport type { SettingsManager } from \"../settings-manager.ts\";\nimport {\n\ttype LspConfigurationLayer,\n\ttype LspConfiguredServer,\n\tparseLspConfiguration,\n\ttype ResolvedLspConfiguration,\n\tresolveLspConfiguration,\n} from \"./config.ts\";\nimport { dirnamePortablePath, joinPortablePath, resolvePortablePath } from \"./portable-path.ts\";\n\nexport type LspConfigurationInputScope = \"cli\" | \"host\";\nexport type LspConfigurationSourceDiagnosticSeverity = \"warning\" | \"error\";\n\nexport type LspConfigurationInput =\n\t| {\n\t\t\ttype: \"configuration\";\n\t\t\tconfiguration: LspConfigurationLayer;\n\t\t\tbaseDir?: string;\n\t\t\tsource?: string;\n\t\t\tscope?: LspConfigurationInputScope;\n\t }\n\t| { type: \"file\"; path: string; scope?: LspConfigurationInputScope }\n\t| { type: \"disabled\"; source?: string; scope?: LspConfigurationInputScope };\n\nexport interface LspConfigurationSourceDiagnostic {\n\tseverity: LspConfigurationSourceDiagnosticSeverity;\n\tsource: string;\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface LoadLspConfigurationOptions {\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\tagentDir: string;\n\tinputs?: readonly LspConfigurationInput[];\n\t/** Host-controlled grant. Project settings cannot grant trust to active LSP transports. */\n\ttrustProjectLspTransports?: boolean;\n}\n\nexport interface LoadLspConfigurationResult {\n\tconfiguration: ResolvedLspConfiguration;\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n}\n\ntype SourceScope = \"global\" | \"project\" | LspConfigurationInputScope;\n\ninterface ConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n\torder: number;\n}\n\nconst SCOPE_PRECEDENCE: Record<SourceScope, number> = {\n\tglobal: 0,\n\tproject: 1,\n\tcli: 2,\n\thost: 3,\n};\n\ninterface PendingConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n}\n\ninterface ConfigurationSourceCollection {\n\tsources: ConfigurationSource[];\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n\tnextOrder: number;\n\tsettingsLoadFailed: boolean;\n}\n\ninterface ConfigurationFileLoadResult {\n\tloaded: boolean;\n\tvalue?: unknown;\n}\n\nfunction appendConfigurationSource(\n\tcollection: ConfigurationSourceCollection,\n\tsource: PendingConfigurationSource,\n): void {\n\tcollection.sources.push({ ...source, order: collection.nextOrder++ });\n}\n\nfunction collectSettingsConfigurationSources(options: LoadLspConfigurationOptions): ConfigurationSourceCollection {\n\tconst collection: ConfigurationSourceCollection = {\n\t\tsources: [],\n\t\tdiagnostics: [],\n\t\tnextOrder: 0,\n\t\tsettingsLoadFailed: false,\n\t};\n\tconst globalSettingsPath = joinPortablePath(options.agentDir, \"settings.json\");\n\tconst projectSettingsPath = joinPortablePath(options.cwd, CONFIG_DIR_NAME, \"settings.json\");\n\tconst globalConfiguration = options.settingsManager.getGlobalLspConfiguration();\n\tconst projectConfiguration = options.settingsManager.getProjectLspConfiguration();\n\tfor (const [scope, source] of [\n\t\t[\"global\", globalSettingsPath],\n\t\t[\"project\", projectSettingsPath],\n\t] as const) {\n\t\tconst error = options.settingsManager.getLoadError(scope);\n\t\tif (!error) continue;\n\t\tcollection.settingsLoadFailed = true;\n\t\tcollection.diagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `settings could not be loaded; LSP is disabled to avoid using stale configuration: ${error.message}`,\n\t\t});\n\t}\n\n\tif (globalConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"global\",\n\t\t\tsource: globalSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(globalSettingsPath),\n\t\t\tvalue: globalConfiguration,\n\t\t});\n\t}\n\tif (projectConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"project\",\n\t\t\tsource: projectSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(projectSettingsPath),\n\t\t\tvalue: projectConfiguration,\n\t\t});\n\t}\n\treturn collection;\n}\n\nasync function loadConfigurationFile(\n\tfilePath: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): Promise<ConfigurationFileLoadResult> {\n\tlet content: string;\n\ttry {\n\t\tcontent = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n\ttry {\n\t\treturn { loaded: true, value: JSON.parse(content) as unknown };\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n}\n\nasync function appendConfigurationInput(\n\tinput: LspConfigurationInput,\n\toptions: LoadLspConfigurationOptions,\n\tcollection: ConfigurationSourceCollection,\n): Promise<void> {\n\tconst scope = input.scope ?? \"host\";\n\tif (input.type === \"disabled\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"--no-lsp\" : \"host LSP override\"),\n\t\t\tbaseDir: options.cwd,\n\t\t\tvalue: { enabled: false },\n\t\t});\n\t\treturn;\n\t}\n\tif (input.type === \"configuration\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"CLI LSP configuration\" : \"host LSP configuration\"),\n\t\t\tbaseDir: resolvePortablePath(options.cwd, input.baseDir ?? \".\"),\n\t\t\tvalue: input.configuration,\n\t\t});\n\t\treturn;\n\t}\n\n\tconst filePath = resolvePortablePath(options.cwd, input.path);\n\tconst loaded = await loadConfigurationFile(filePath, collection.diagnostics);\n\tif (!loaded.loaded) return;\n\tappendConfigurationSource(collection, {\n\t\tscope,\n\t\tsource: filePath,\n\t\tbaseDir: dirnamePortablePath(filePath),\n\t\tvalue: loaded.value,\n\t});\n}\n\nfunction resolveConfigurationSource(\n\tsource: ConfigurationSource,\n\ttrustProjectLspTransports: boolean | undefined,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer | undefined {\n\tconst parsed = parseLspConfiguration(source.value);\n\tfor (const diagnostic of parsed.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!parsed.configuration) return undefined;\n\tconst resolvedLayer = resolveLspConfigurationLayerPaths(parsed.configuration, source.baseDir);\n\tconst resolved = parseLspConfiguration(resolvedLayer);\n\tfor (const diagnostic of resolved.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!resolved.configuration) return undefined;\n\treturn source.scope === \"project\" && !trustProjectLspTransports\n\t\t? blockUntrustedProjectTransports(resolved.configuration, source.source, diagnostics)\n\t\t: resolved.configuration;\n}\n/**\n * Load and resolve LSP configuration in deterministic order:\n * global settings < project settings < CLI inputs < SDK/host inputs.\n */\nexport async function loadLspConfiguration(options: LoadLspConfigurationOptions): Promise<LoadLspConfigurationResult> {\n\tconst collection = collectSettingsConfigurationSources(options);\n\tfor (const input of options.inputs ?? []) await appendConfigurationInput(input, options, collection);\n\tcollection.sources.sort(\n\t\t(left, right) => SCOPE_PRECEDENCE[left.scope] - SCOPE_PRECEDENCE[right.scope] || left.order - right.order,\n\t);\n\n\tconst layers: LspConfigurationLayer[] = [];\n\tfor (const source of collection.sources) {\n\t\tconst layer = resolveConfigurationSource(source, options.trustProjectLspTransports, collection.diagnostics);\n\t\tif (layer) layers.push(layer);\n\t}\n\tconst hasErrors = collection.diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n\tconst configuration =\n\t\tcollection.settingsLoadFailed || hasErrors ? { enabled: false, servers: [] } : resolveLspConfiguration(layers);\n\treturn { configuration, diagnostics: collection.diagnostics };\n}\n\nexport function resolveLspConfigurationLayerPaths(\n\tlayer: LspConfigurationLayer,\n\tbaseDir: string,\n): LspConfigurationLayer {\n\treturn {\n\t\t...layer,\n\t\tservers: layer.servers?.map((server) => {\n\t\t\tif (server.enabled === false) return server;\n\t\t\treturn resolveServerPaths(server, baseDir);\n\t\t}),\n\t};\n}\n\nfunction resolveServerPaths(server: LspConfiguredServer, baseDir: string): LspConfiguredServer {\n\tconst transport =\n\t\tserver.transport.type === \"spawn\"\n\t\t\t? {\n\t\t\t\t\t...server.transport,\n\t\t\t\t\tcommand: isPathLikeCommand(server.transport.command)\n\t\t\t\t\t\t? resolvePortablePath(baseDir, server.transport.command)\n\t\t\t\t\t\t: server.transport.command,\n\t\t\t\t\t...(server.transport.cwd ? { cwd: resolveIfRelative(baseDir, server.transport.cwd) } : {}),\n\t\t\t\t}\n\t\t\t: server.transport.type === \"unix\"\n\t\t\t\t? { ...server.transport, path: resolveIfRelative(baseDir, server.transport.path) }\n\t\t\t\t: server.transport;\n\tconst workspace =\n\t\tserver.workspace.type === \"fixed\"\n\t\t\t? { ...server.workspace, path: resolveIfRelative(baseDir, server.workspace.path) }\n\t\t\t: server.workspace.type === \"markers\" && server.workspace.stopAt\n\t\t\t\t? { ...server.workspace, stopAt: resolveIfRelative(baseDir, server.workspace.stopAt) }\n\t\t\t\t: server.workspace;\n\n\treturn {\n\t\t...server,\n\t\ttransport,\n\t\tworkspace,\n\t\tpathMappings: server.pathMappings?.map((mapping) => ({\n\t\t\t...mapping,\n\t\t\tagentRoot: resolveIfRelative(baseDir, mapping.agentRoot),\n\t\t})),\n\t};\n}\n\nfunction blockUntrustedProjectTransports(\n\tlayer: LspConfigurationLayer,\n\tsource: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer {\n\tif (layer.enabled === true) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$.enabled\",\n\t\t\tmessage: \"blocked project LSP activation; the host must set trustProjectLspTransports to allow it\",\n\t\t});\n\t}\n\treturn {\n\t\t...(layer.enabled === false ? { enabled: false } : {}),\n\t\t...(layer.mode === undefined ? {} : { mode: layer.mode }),\n\t\t...(layer.servers === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tservers: layer.servers.filter((server, index) => {\n\t\t\t\t\t\tif (server.enabled === false) return true;\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tpath: `$.servers[${index}].transport`,\n\t\t\t\t\t\t\tmessage: `blocked project LSP ${server.transport.type} transport for server ${JSON.stringify(server.id)}; the host must set trustProjectLspTransports to allow it`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t};\n}\n\nfunction resolveIfRelative(baseDir: string, value: string): string {\n\treturn resolvePortablePath(baseDir, value);\n}\n\nfunction isPathLikeCommand(command: string): boolean {\n\treturn command.startsWith(\".\") || command.includes(\"/\") || command.includes(\"\\\\\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAE/G,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IACnC,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,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;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,mFAAmF;IACnF,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,MAAM,YAAY,GACrB,iBAAiB,GACjB,eAAe,GACf,sBAAsB,GACtB,qBAAqB,GACrB,wBAAwB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEL,MAAM,WAAW,cAAc;IAC9B,mGAAmG;IACnG,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;CAAE,CAAC;AAElH,MAAM,WAAW,iBAAiB;IACjC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,SAAS,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC,qBAAqB,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC3C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,WAAW,EAAE,0BAA0B,EAAE,CAAC;CAC1C;AAsBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,2BAA2B,CAmBjF;AAUD,0EAA0E;AAC1E,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,CAAC,qBAAqB,GAAG,SAAS,CAAC,EAAE,GACpD,wBAAwB,CAc1B","sourcesContent":["import { posix, win32 } from \"node:path\";\nimport { normalizePortablePath, pathApi, pathFlavor, relativeWithin } from \"./portable-path.ts\";\n\nexport type LspJsonValue = null | boolean | number | string | LspJsonValue[] | { [key: string]: LspJsonValue };\n\nexport type LspConfigurationMode = \"merge\" | \"replace\";\n\nexport interface LspDocumentSelector {\n\t/** Language ID sent to the server in textDocument/didOpen. */\n\tlanguageId: string;\n\t/** Workspace-relative glob pattern used to select documents. */\n\tpattern: string;\n\t/** URI scheme to match. Defaults to file. */\n\tscheme?: string;\n}\n\nexport interface LspSpawnTransport {\n\ttype: \"spawn\";\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n}\n\nexport interface LspTcpTransport {\n\ttype: \"tcp\";\n\thost: string;\n\tport: number;\n}\n\nexport interface LspUnixSocketTransport {\n\ttype: \"unix\";\n\tpath: string;\n}\n\nexport interface LspNamedPipeTransport {\n\ttype: \"pipe\";\n\tpath: string;\n}\n\nexport interface LspProgrammaticTransport {\n\ttype: \"connection\";\n\t/** Host-registered connection factory ID. Functions are never loaded from JSON. */\n\tid: string;\n}\n\nexport type LspTransport =\n\t| LspSpawnTransport\n\t| LspTcpTransport\n\t| LspUnixSocketTransport\n\t| LspNamedPipeTransport\n\t| LspProgrammaticTransport;\n\nexport type LspWorkspaceRoot =\n\t| { type: \"session\" }\n\t| { type: \"fixed\"; path: string }\n\t| {\n\t\t\ttype: \"markers\";\n\t\t\tmarkers: string[];\n\t\t\tfallback?: \"session\" | \"none\";\n\t\t\tstopAt?: string;\n\t };\n\nexport interface LspPathMapping {\n\t/** Agent-visible filesystem root. Relative roots are resolved against the configuration source. */\n\tagentRoot: string;\n\t/** Absolute file URI for the same root as observed by the language server. */\n\tserverRootUri: string;\n}\n\nexport type LspServerLifecycle = { type: \"managed\" } | { type: \"attached\"; shutdown?: \"disconnect\" | \"protocol\" };\n\nexport interface LspServerTimeouts {\n\t/** Zero disables the corresponding timeout. */\n\tconnectMs?: number;\n\tinitializeMs?: number;\n\trequestMs?: number;\n\tshutdownMs?: number;\n}\n\nexport interface LspClientInfo {\n\tname: string;\n\tversion?: string;\n}\n\nexport type LspTraceValue = \"off\" | \"messages\" | \"verbose\";\n\nexport interface LspServerFeatures {\n\tdiagnostics?: boolean;\n\thover?: boolean;\n\tdefinition?: boolean;\n\treferences?: boolean;\n\trename?: boolean;\n\tcodeActions?: boolean;\n}\n\nexport interface LspConfiguredServer {\n\tid: string;\n\tenabled?: true;\n\tselectors: LspDocumentSelector[];\n\ttransport: LspTransport;\n\tlifecycle: LspServerLifecycle;\n\tworkspace: LspWorkspaceRoot;\n\tpathMappings?: LspPathMapping[];\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tfeatures?: LspServerFeatures;\n\tpriority?: number;\n\ttimeouts?: LspServerTimeouts;\n}\n\nexport interface LspDisabledServer {\n\tid: string;\n\tenabled: false;\n}\n\nexport type LspServerEntry = LspConfiguredServer | LspDisabledServer;\n\n/**\n * One externally supplied configuration layer.\n *\n * - An absent layer leaves lower-precedence configuration unchanged.\n * - `merge` (the default) replaces complete server definitions by ID.\n * - `replace` clears lower-precedence servers before applying this layer.\n * - `{ id, enabled: false }` removes a server inherited from a lower layer.\n * - `enabled: false` disables the resolved runtime without discarding server definitions.\n */\nexport interface LspConfigurationLayer {\n\tenabled?: boolean;\n\tmode?: LspConfigurationMode;\n\tservers?: LspServerEntry[];\n}\n\nexport interface ResolvedLspConfiguration {\n\tenabled: boolean;\n\tservers: LspConfiguredServer[];\n}\n\nexport interface LspConfigurationDiagnostic {\n\tseverity: \"error\";\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface ParseLspConfigurationResult {\n\tconfiguration?: LspConfigurationLayer;\n\tdiagnostics: LspConfigurationDiagnostic[];\n}\n\nconst SERVER_KEYS = new Set([\n\t\"id\",\n\t\"enabled\",\n\t\"selectors\",\n\t\"transport\",\n\t\"lifecycle\",\n\t\"workspace\",\n\t\"pathMappings\",\n\t\"initializationOptions\",\n\t\"settings\",\n\t\"clientInfo\",\n\t\"locale\",\n\t\"trace\",\n\t\"features\",\n\t\"priority\",\n\t\"timeouts\",\n]);\nconst FEATURE_KEYS = [\"diagnostics\", \"hover\", \"definition\", \"references\", \"rename\", \"codeActions\"] as const;\nconst TIMEOUT_KEYS = [\"connectMs\", \"initializeMs\", \"requestMs\", \"shutdownMs\"] as const;\n\nexport function parseLspConfiguration(value: unknown): ParseLspConfigurationResult {\n\tconst diagnostics: LspConfigurationDiagnostic[] = [];\n\tconst object = parseObject(value, \"$\", diagnostics);\n\tif (!object) return { diagnostics };\n\trejectUnknownKeys(object, new Set([\"enabled\", \"mode\", \"servers\"]), \"$\", diagnostics);\n\n\tconst enabled = parseOptionalBoolean(object.enabled, \"$.enabled\", diagnostics);\n\tconst mode = parseOptionalEnum(object.mode, [\"merge\", \"replace\"], \"$.mode\", diagnostics);\n\tconst servers = parseServers(object.servers, diagnostics);\n\tif (diagnostics.length > 0) return { diagnostics };\n\n\treturn {\n\t\tconfiguration: {\n\t\t\t...(enabled === undefined ? {} : { enabled }),\n\t\t\t...(mode === undefined ? {} : { mode }),\n\t\t\t...(servers === undefined ? {} : { servers }),\n\t\t},\n\t\tdiagnostics,\n\t};\n}\n\nfunction applyLspServerLayer(servers: Map<string, LspConfiguredServer>, layer: LspConfigurationLayer): void {\n\tif (layer.mode === \"replace\") servers.clear();\n\tfor (const server of layer.servers ?? []) {\n\t\tif (server.enabled === false) servers.delete(server.id);\n\t\telse servers.set(server.id, server);\n\t}\n}\n\n/** Resolve already validated layers from lowest to highest precedence. */\nexport function resolveLspConfiguration(\n\tlayers: readonly (LspConfigurationLayer | undefined)[],\n): ResolvedLspConfiguration {\n\tconst servers = new Map<string, LspConfiguredServer>();\n\tlet enabled = false;\n\tlet hasLayer = false;\n\n\tfor (const layer of layers) {\n\t\tif (!layer) continue;\n\t\tif (!hasLayer) enabled = layer.enabled ?? true;\n\t\thasLayer = true;\n\t\tif (layer.enabled !== undefined) enabled = layer.enabled;\n\t\tapplyLspServerLayer(servers, layer);\n\t}\n\n\treturn { enabled: hasLayer && enabled, servers: [...servers.values()] };\n}\n\nfunction parseServers(value: unknown, diagnostics: LspConfigurationDiagnostic[]): LspServerEntry[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, \"$.servers\", \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst servers: LspServerEntry[] = [];\n\tconst ids = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst path = `$.servers[${index}]`;\n\t\tconst server = parseServer(entry, path, diagnostics);\n\t\tif (!server) continue;\n\t\tif (ids.has(server.id)) addError(diagnostics, `${path}.id`, `duplicates server ID ${JSON.stringify(server.id)}`);\n\t\telse ids.add(server.id);\n\t\tservers.push(server);\n\t}\n\treturn servers;\n}\nfunction validateTransportLifecycle(\n\ttransport: LspTransport | undefined,\n\tlifecycle: LspServerLifecycle | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (!transport || transport.type === \"connection\") return;\n\tconst expectedLifecycle = transport.type === \"spawn\" ? \"managed\" : \"attached\";\n\tif (lifecycle?.type === expectedLifecycle) return;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.lifecycle.type`,\n\t\t`must be '${expectedLifecycle}' when transport.type is '${transport.type}'`,\n\t);\n}\nfunction parseServerId(value: unknown, path: string, diagnostics: LspConfigurationDiagnostic[]): string | undefined {\n\tconst id = parseRequiredString(value, `${path}.id`, diagnostics);\n\tif (!id || /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) return id;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.id`,\n\t\t\"must start with an alphanumeric character and contain only letters, numbers, '.', '_' or '-'\",\n\t);\n\treturn id;\n}\nfunction createDisabledServerEntry(\n\tobject: Record<string, unknown>,\n\tid: string | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDisabledServer | undefined {\n\trejectUnknownKeys(object, new Set([\"id\", \"enabled\"]), path, diagnostics);\n\tif (!id) return undefined;\n\treturn { id, enabled: false };\n}\n\nfunction parseServer(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerEntry | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst id = parseServerId(object.id, path, diagnostics);\n\tconst enabled = parseOptionalBoolean(object.enabled, `${path}.enabled`, diagnostics);\n\tif (enabled === false) return createDisabledServerEntry(object, id, path, diagnostics);\n\trejectUnknownKeys(object, SERVER_KEYS, path, diagnostics);\n\n\tconst selectors = parseSelectors(object.selectors, `${path}.selectors`, diagnostics);\n\tconst transport = parseTransport(object.transport, `${path}.transport`, diagnostics);\n\tconst lifecycle = parseLifecycle(object.lifecycle, `${path}.lifecycle`, diagnostics);\n\tconst workspace = parseWorkspace(object.workspace, `${path}.workspace`, diagnostics);\n\tconst pathMappings = parsePathMappings(object.pathMappings, `${path}.pathMappings`, diagnostics);\n\tconst initializationOptions = parseOptionalJson(\n\t\tobject.initializationOptions,\n\t\t`${path}.initializationOptions`,\n\t\tdiagnostics,\n\t);\n\tconst settings = parseOptionalJson(object.settings, `${path}.settings`, diagnostics);\n\tconst clientInfo = parseClientInfo(object.clientInfo, `${path}.clientInfo`, diagnostics);\n\tconst locale = parseOptionalString(object.locale, `${path}.locale`, diagnostics);\n\tconst trace = parseOptionalEnum(object.trace, [\"off\", \"messages\", \"verbose\"], `${path}.trace`, diagnostics);\n\tconst features = parseFeatures(object.features, `${path}.features`, diagnostics);\n\tconst priority = parseOptionalInteger(object.priority, `${path}.priority`, diagnostics);\n\tconst timeouts = parseTimeouts(object.timeouts, `${path}.timeouts`, diagnostics);\n\n\tvalidateTransportLifecycle(transport, lifecycle, path, diagnostics);\n\tif (!id || !selectors || !transport || !lifecycle || !workspace) return undefined;\n\n\treturn {\n\t\tid,\n\t\t...(enabled === true ? { enabled: true as const } : {}),\n\t\tselectors,\n\t\ttransport,\n\t\tlifecycle,\n\t\tworkspace,\n\t\t...(pathMappings === undefined ? {} : { pathMappings }),\n\t\t...(initializationOptions === undefined ? {} : { initializationOptions }),\n\t\t...(settings === undefined ? {} : { settings }),\n\t\t...(clientInfo === undefined ? {} : { clientInfo }),\n\t\t...(locale === undefined ? {} : { locale }),\n\t\t...(trace === undefined ? {} : { trace }),\n\t\t...(features === undefined ? {} : { features }),\n\t\t...(priority === undefined ? {} : { priority }),\n\t\t...(timeouts === undefined ? {} : { timeouts }),\n\t};\n}\n\nfunction registerSelectorSignature(\n\tsignatures: Set<string>,\n\tsignature: string,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (signatures.has(signature)) {\n\t\taddError(diagnostics, path, \"is ambiguous because another selector has the same scheme and pattern\");\n\t}\n\tsignatures.add(signature);\n}\n\nfunction parseSelectors(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDocumentSelector[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array\");\n\t\treturn undefined;\n\t}\n\tconst selectors: LspDocumentSelector[] = [];\n\tconst signatures = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst object = parseObject(entry, itemPath, diagnostics);\n\t\tif (!object) continue;\n\t\trejectUnknownKeys(object, new Set([\"languageId\", \"pattern\", \"scheme\"]), itemPath, diagnostics);\n\t\tconst languageId = parseRequiredString(object.languageId, `${itemPath}.languageId`, diagnostics);\n\t\tconst pattern = parseRequiredString(object.pattern, `${itemPath}.pattern`, diagnostics);\n\t\tconst scheme = parseOptionalString(object.scheme, `${itemPath}.scheme`, diagnostics);\n\t\tif (pattern && !isSafeRelativePath(pattern)) {\n\t\t\taddError(diagnostics, `${itemPath}.pattern`, \"must be a workspace-relative pattern without '..' segments\");\n\t\t}\n\t\tif (!languageId || !pattern) continue;\n\t\tconst signature = `${scheme ?? \"file\"}\\u0000${pattern}`;\n\t\tregisterSelectorSignature(signatures, signature, itemPath, diagnostics);\n\t\tselectors.push({ languageId, pattern, ...(scheme === undefined ? {} : { scheme }) });\n\t}\n\treturn selectors;\n}\n\nfunction parseTransport(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTransport | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tswitch (type) {\n\t\tcase \"spawn\":\n\t\t\treturn parseSpawnTransport(object, path, diagnostics);\n\t\tcase \"tcp\":\n\t\t\treturn parseTcpTransport(object, path, diagnostics);\n\t\tcase \"unix\":\n\t\t\treturn parseUnixSocketTransport(object, path, diagnostics);\n\t\tcase \"pipe\":\n\t\t\treturn parseNamedPipeTransport(object, path, diagnostics);\n\t\tcase \"connection\":\n\t\t\treturn parseProgrammaticTransport(object, path, diagnostics);\n\t\tdefault:\n\t\t\tif (type)\n\t\t\t\taddError(diagnostics, `${path}.type`, \"must be one of 'spawn', 'tcp', 'unix', 'pipe', or 'connection'\");\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseSpawnTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspSpawnTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"command\", \"args\", \"env\", \"cwd\"]), path, diagnostics);\n\tconst command = parseRequiredString(object.command, `${path}.command`, diagnostics);\n\tconst args = parseOptionalStringArray(object.args, `${path}.args`, diagnostics);\n\tconst env = parseOptionalStringRecord(object.env, `${path}.env`, diagnostics);\n\tconst cwd = parseOptionalString(object.cwd, `${path}.cwd`, diagnostics);\n\treturn command\n\t\t? { type: \"spawn\", command, ...(args ? { args } : {}), ...(env ? { env } : {}), ...(cwd ? { cwd } : {}) }\n\t\t: undefined;\n}\n\nfunction parseTcpTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTcpTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"host\", \"port\"]), path, diagnostics);\n\tconst host = parseRequiredString(object.host, `${path}.host`, diagnostics);\n\tconst port = parseOptionalInteger(object.port, `${path}.port`, diagnostics);\n\tif (port === undefined) addError(diagnostics, `${path}.port`, \"is required and must be an integer\");\n\telse if (port < 1 || port > 65535) addError(diagnostics, `${path}.port`, \"must be between 1 and 65535\");\n\treturn host && port !== undefined ? { type: \"tcp\", host, port } : undefined;\n}\n\nfunction parseUnixSocketTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspUnixSocketTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !posix.isAbsolute(endpointPath) && !isSafeRelativePath(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be absolute or a safe source-relative Unix socket path\");\n\t}\n\treturn endpointPath ? { type: \"unix\", path: endpointPath } : undefined;\n}\n\nfunction parseNamedPipeTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspNamedPipeTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !isAbsoluteNamedPipe(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be an absolute Windows named-pipe path such as \\\\\\\\.\\\\pipe\\\\server\");\n\t}\n\treturn endpointPath ? { type: \"pipe\", path: endpointPath } : undefined;\n}\n\nfunction parseProgrammaticTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspProgrammaticTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"id\"]), path, diagnostics);\n\tconst id = parseRequiredString(object.id, `${path}.id`, diagnostics);\n\treturn id ? { type: \"connection\", id } : undefined;\n}\nfunction parseLifecycle(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerLifecycle | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"managed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"attached\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"shutdown\"]), path, diagnostics);\n\t\tconst shutdown = parseOptionalEnum(object.shutdown, [\"disconnect\", \"protocol\"], `${path}.shutdown`, diagnostics);\n\t\treturn { type, ...(shutdown === undefined ? {} : { shutdown }) };\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'managed' or 'attached'\");\n\treturn undefined;\n}\n\nfunction parseWorkspace(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspWorkspaceRoot | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"session\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"fixed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\t\tconst fixedPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\t\treturn fixedPath ? { type, path: fixedPath } : undefined;\n\t}\n\tif (type === \"markers\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"markers\", \"fallback\", \"stopAt\"]), path, diagnostics);\n\t\tconst markers = parseRequiredUniqueRelativePaths(object.markers, `${path}.markers`, diagnostics);\n\t\tconst fallback = parseOptionalEnum(object.fallback, [\"session\", \"none\"], `${path}.fallback`, diagnostics);\n\t\tconst stopAt = parseOptionalString(object.stopAt, `${path}.stopAt`, diagnostics);\n\t\treturn markers\n\t\t\t? {\n\t\t\t\t\ttype,\n\t\t\t\t\tmarkers,\n\t\t\t\t\t...(fallback === undefined ? {} : { fallback }),\n\t\t\t\t\t...(stopAt === undefined ? {} : { stopAt }),\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'session', 'fixed', or 'markers'\");\n\treturn undefined;\n}\n\ninterface PathMappingParseState {\n\tmappings: LspPathMapping[];\n\tagentRoots: Set<string>;\n\tserverRoots: Set<string>;\n}\n\nfunction parsePathMappingEntry(\n\tentry: unknown,\n\tindex: number,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tstate: PathMappingParseState,\n): void {\n\tconst itemPath = `${path}[${index}]`;\n\tconst object = parseObject(entry, itemPath, diagnostics);\n\tif (!object) return;\n\trejectUnknownKeys(object, new Set([\"agentRoot\", \"serverRootUri\"]), itemPath, diagnostics);\n\tconst agentRoot = parseRequiredString(object.agentRoot, `${itemPath}.agentRoot`, diagnostics);\n\tconst serverRootUri = parseRequiredString(object.serverRootUri, `${itemPath}.serverRootUri`, diagnostics);\n\tif (serverRootUri && !isAbsoluteFileUri(serverRootUri)) {\n\t\taddError(\n\t\t\tdiagnostics,\n\t\t\t`${itemPath}.serverRootUri`,\n\t\t\t\"must be an absolute file URI without query or fragment components\",\n\t\t);\n\t}\n\tif (!agentRoot || !serverRootUri) return;\n\n\tconst normalizedAgentRoot = normalizeAgentRoot(agentRoot);\n\tconst normalizedServerRoot = canonicalFileUri(serverRootUri);\n\tif (state.agentRoots.has(normalizedAgentRoot))\n\t\taddError(diagnostics, `${itemPath}.agentRoot`, \"duplicates another mapping root\");\n\tif (normalizedServerRoot && state.serverRoots.has(normalizedServerRoot)) {\n\t\taddError(diagnostics, `${itemPath}.serverRootUri`, \"duplicates another mapping root\");\n\t}\n\tstate.agentRoots.add(normalizedAgentRoot);\n\tif (normalizedServerRoot) state.serverRoots.add(normalizedServerRoot);\n\tstate.mappings.push({ agentRoot, serverRootUri });\n}\n\nfunction validatePathMappingReversibility(\n\tmappings: LspPathMapping[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (let index = 0; index < mappings.length; index++) {\n\t\tfor (let previous = 0; previous < index; previous++) {\n\t\t\tif (pathMappingsAreReversible(mappings[previous], mappings[index])) continue;\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].agentRoot`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent server URI relationship`,\n\t\t\t);\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].serverRootUri`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent agent path relationship`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction parsePathMappings(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspPathMapping[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst state: PathMappingParseState = {\n\t\tmappings: [],\n\t\tagentRoots: new Set<string>(),\n\t\tserverRoots: new Set<string>(),\n\t};\n\tfor (const [index, entry] of value.entries()) {\n\t\tparsePathMappingEntry(entry, index, path, diagnostics, state);\n\t}\n\tvalidatePathMappingReversibility(state.mappings, path, diagnostics);\n\treturn state.mappings;\n}\n\nfunction parseClientInfo(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspClientInfo | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set([\"name\", \"version\"]), path, diagnostics);\n\tconst name = parseRequiredString(object.name, `${path}.name`, diagnostics);\n\tconst version = parseOptionalString(object.version, `${path}.version`, diagnostics);\n\treturn name ? { name, ...(version === undefined ? {} : { version }) } : undefined;\n}\n\nfunction parseFeatures(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerFeatures | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(FEATURE_KEYS), path, diagnostics);\n\tconst features: LspServerFeatures = {};\n\tfor (const key of FEATURE_KEYS) {\n\t\tconst setting = parseOptionalBoolean(object[key], `${path}.${key}`, diagnostics);\n\t\tif (setting !== undefined) features[key] = setting;\n\t}\n\treturn features;\n}\n\nfunction parseTimeouts(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerTimeouts | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(TIMEOUT_KEYS), path, diagnostics);\n\tconst timeouts: LspServerTimeouts = {};\n\tfor (const key of TIMEOUT_KEYS) {\n\t\tconst timeout = parseOptionalInteger(object[key], `${path}.${key}`, diagnostics);\n\t\tif (timeout !== undefined) {\n\t\t\tif (timeout < 0) addError(diagnostics, `${path}.${key}`, \"must be zero or a positive integer\");\n\t\t\telse timeouts[key] = timeout;\n\t\t}\n\t}\n\treturn timeouts;\n}\n\ntype LspJsonParseResult = { ok: true; value: LspJsonValue } | { ok: false };\n\nfunction parseOptionalJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspJsonValue | undefined {\n\tif (value === undefined) return undefined;\n\tconst result = parseJson(value, path, diagnostics, new Set<object>());\n\treturn result.ok ? result.value : undefined;\n}\n\nfunction parseJsonArray(\n\tvalue: unknown[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: LspJsonValue[] = [];\n\tlet valid = true;\n\tfor (const [index, item] of value.entries()) {\n\t\tconst parsed = parseJson(item, `${path}[${index}]`, diagnostics, ancestors);\n\t\tif (parsed.ok) output.push(parsed.value);\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJsonObject(\n\tvalue: object,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: { [key: string]: LspJsonValue } = {};\n\tlet valid = true;\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst parsed = parseJson(item, `${path}.${key}`, diagnostics, ancestors);\n\t\tif (parsed.ok) output[key] = parsed.value;\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return { ok: true, value };\n\tif (typeof value === \"number\") {\n\t\tif (Number.isFinite(value)) return { ok: true, value };\n\t\taddError(diagnostics, path, \"must contain only finite JSON numbers\");\n\t\treturn { ok: false };\n\t}\n\tif (typeof value !== \"object\") {\n\t\taddError(diagnostics, path, \"must be valid JSON data\");\n\t\treturn { ok: false };\n\t}\n\tif (ancestors.has(value)) {\n\t\taddError(diagnostics, path, \"must not contain circular references\");\n\t\treturn { ok: false };\n\t}\n\treturn Array.isArray(value)\n\t\t? parseJsonArray(value, path, diagnostics, ancestors)\n\t\t: parseJsonObject(value, path, diagnostics, ancestors);\n}\n\nfunction parseObject(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, unknown> | undefined {\n\tif (typeof value === \"object\" && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;\n\taddError(diagnostics, path, \"must be an object\");\n\treturn undefined;\n}\n\nfunction parseRequiredString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\taddError(diagnostics, path, \"is required and must be a non-empty string\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (value === undefined) return undefined;\n\treturn parseRequiredString(value, path, diagnostics);\n}\n\nfunction parseOptionalBoolean(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"boolean\") {\n\t\taddError(diagnostics, path, \"must be a boolean\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalInteger(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Number.isSafeInteger(value)) {\n\t\taddError(diagnostics, path, \"must be a safe integer\");\n\t\treturn undefined;\n\t}\n\treturn value as number;\n}\n\nfunction parseOptionalEnum<const T extends string>(\n\tvalue: unknown,\n\tallowed: readonly T[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): T | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value === \"string\" && allowed.includes(value as T)) return value as T;\n\taddError(diagnostics, path, `must be one of ${allowed.map((item) => JSON.stringify(item)).join(\", \")}`);\n\treturn undefined;\n}\n\nfunction parseOptionalStringArray(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array of strings\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tfor (const [index, item] of value.entries()) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}[${index}]`, \"must be a string\");\n\t\telse output.push(item);\n\t}\n\treturn output;\n}\n\nfunction parseOptionalStringRecord(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst output: Record<string, string> = {};\n\tfor (const [key, item] of Object.entries(object)) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}.${key}`, \"must be a string\");\n\t\telse output[key] = item;\n\t}\n\treturn output;\n}\n\nfunction parseRequiredUniqueRelativePaths(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array of relative paths\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const [index, item] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst marker = parseRequiredString(item, itemPath, diagnostics);\n\t\tif (!marker) continue;\n\t\tif (!isSafeRelativePath(marker)) addError(diagnostics, itemPath, \"must be a relative path without '..' segments\");\n\t\tif (seen.has(marker)) addError(diagnostics, itemPath, \"duplicates another marker\");\n\t\telse seen.add(marker);\n\t\toutput.push(marker);\n\t}\n\treturn output;\n}\n\nfunction rejectUnknownKeys(\n\tobject: Record<string, unknown>,\n\tallowed: ReadonlySet<string>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (const key of Object.keys(object)) {\n\t\tif (!allowed.has(key)) addError(diagnostics, `${path}.${key}`, \"is not a recognized property\");\n\t}\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n\tif (posix.isAbsolute(value) || win32.isAbsolute(value)) return false;\n\treturn !value.split(/[\\\\/]/).includes(\"..\");\n}\n\ntype MappingRootDirection = \"left-parent\" | \"right-parent\" | \"equal\";\n\ninterface MappingRootRelation {\n\tdirection: MappingRootDirection;\n\trelative: string;\n\tcaseInsensitive: boolean;\n}\n\nfunction agentRootRelation(left: string, right: string): MappingRootRelation | undefined {\n\tconst leftFlavor = pathFlavor(left);\n\tconst rightFlavor = pathFlavor(right);\n\tif (leftFlavor !== rightFlavor) return undefined;\n\tconst normalizedLeft = normalizePortablePath(left, leftFlavor);\n\tconst normalizedRight = normalizePortablePath(right, rightFlavor);\n\tconst comparableLeft = leftFlavor === \"windows\" ? normalizedLeft.toLowerCase() : normalizedLeft;\n\tconst comparableRight = rightFlavor === \"windows\" ? normalizedRight.toLowerCase() : normalizedRight;\n\tif (comparableLeft === comparableRight) {\n\t\treturn { direction: \"equal\", relative: \"\", caseInsensitive: leftFlavor === \"windows\" };\n\t}\n\tconst fromLeft = relativeWithin(normalizedLeft, normalizedRight);\n\tif (fromLeft !== undefined) {\n\t\treturn {\n\t\t\tdirection: \"left-parent\",\n\t\t\trelative: fromLeft.replace(/\\\\/g, \"/\"),\n\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t};\n\t}\n\tconst fromRight = relativeWithin(normalizedRight, normalizedLeft);\n\treturn fromRight === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tdirection: \"right-parent\",\n\t\t\t\trelative: fromRight.replace(/\\\\/g, \"/\"),\n\t\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t\t};\n}\n\nfunction serverRootRelation(leftValue: string, rightValue: string): MappingRootRelation | undefined {\n\tif (!canonicalFileUri(leftValue) || !canonicalFileUri(rightValue)) return undefined;\n\tconst left = new URL(leftValue);\n\tconst right = new URL(rightValue);\n\tif (left.hostname.toLowerCase() !== right.hostname.toLowerCase()) return undefined;\n\tconst leftSegments = left.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst rightSegments = right.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst caseInsensitive =\n\t\tleft.hostname.length > 0 ||\n\t\tright.hostname.length > 0 ||\n\t\tleftSegments[0]?.endsWith(\":\") === true ||\n\t\trightSegments[0]?.endsWith(\":\") === true;\n\tconst comparable = (segment: string) => (caseInsensitive ? segment.toLowerCase() : segment);\n\tlet shared = 0;\n\twhile (\n\t\tshared < leftSegments.length &&\n\t\tshared < rightSegments.length &&\n\t\tcomparable(leftSegments[shared]) === comparable(rightSegments[shared])\n\t) {\n\t\tshared++;\n\t}\n\tif (shared < Math.min(leftSegments.length, rightSegments.length)) return undefined;\n\tif (leftSegments.length === rightSegments.length) return { direction: \"equal\", relative: \"\", caseInsensitive };\n\treturn leftSegments.length < rightSegments.length\n\t\t? { direction: \"left-parent\", relative: rightSegments.slice(shared).join(\"/\"), caseInsensitive }\n\t\t: { direction: \"right-parent\", relative: leftSegments.slice(shared).join(\"/\"), caseInsensitive };\n}\n\nfunction pathMappingsAreReversible(left: LspPathMapping, right: LspPathMapping): boolean {\n\tconst agent = agentRootRelation(left.agentRoot, right.agentRoot);\n\tconst server = serverRootRelation(left.serverRootUri, right.serverRootUri);\n\tif (!agent || !server) return agent === undefined && server === undefined;\n\tif (agent.direction !== server.direction) return false;\n\treturn agent.caseInsensitive && server.caseInsensitive\n\t\t? agent.relative.toLowerCase() === server.relative.toLowerCase()\n\t\t: agent.relative === server.relative;\n}\n\nfunction normalizeAgentRoot(value: string): string {\n\tconst flavor = pathFlavor(value);\n\tconst api = pathApi(flavor);\n\tconst normalized = normalizePortablePath(value, flavor);\n\tconst root = api.parse(normalized).root;\n\tconst trailingSeparator = flavor === \"windows\" ? /[\\\\/]+$/ : /\\/+$/;\n\tconst withoutTrailingSeparators = normalized === root ? normalized : normalized.replace(trailingSeparator, \"\");\n\treturn flavor === \"windows\" ? withoutTrailingSeparators.toLowerCase() : withoutTrailingSeparators;\n}\n\nfunction isAbsoluteNamedPipe(value: string): boolean {\n\tconst lower = value.toLowerCase();\n\tconst prefixes = [\"\\\\\\\\.\\\\pipe\\\\\", \"\\\\\\\\?\\\\pipe\\\\\"];\n\treturn prefixes.some((prefix) => lower.startsWith(prefix) && value.length > prefix.length);\n}\n\nfunction canonicalFileUri(value: string): string | undefined {\n\tif (!/^file:\\//i.test(value)) return undefined;\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (url.protocol !== \"file:\" || url.pathname.length === 0 || url.search !== \"\" || url.hash !== \"\")\n\t\t\treturn undefined;\n\t\tconst segments = url.pathname\n\t\t\t.split(\"/\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((segment) => decodeURIComponent(segment));\n\t\tif (segments.some((segment) => segment.includes(\"/\") || segment === \".\" || segment === \"..\")) return undefined;\n\t\tif (url.hostname && segments.length === 0) return undefined;\n\t\tif (segments[0]?.endsWith(\":\") && segments.length === 1 && !url.pathname.endsWith(\"/\")) return undefined;\n\t\tconst driveRoot = segments[0]?.endsWith(\":\") && segments.length === 1;\n\t\turl.pathname = `/${segments.map((segment) => encodeURIComponent(segment)).join(\"/\")}${driveRoot ? \"/\" : \"\"}`;\n\t\turl.hostname = url.hostname.toLowerCase();\n\t\treturn url.toString();\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isAbsoluteFileUri(value: string): boolean {\n\treturn canonicalFileUri(value) !== undefined;\n}\n\nfunction addError(diagnostics: LspConfigurationDiagnostic[], path: string, message: string): void {\n\tdiagnostics.push({ severity: \"error\", path, message });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { posix, win32 } from \"node:path\";\nimport { normalizePortablePath, pathApi, pathFlavor, relativeWithin } from \"./portable-path.ts\";\n\nexport type LspJsonValue = null | boolean | number | string | LspJsonValue[] | { [key: string]: LspJsonValue };\n\nexport type LspConfigurationMode = \"merge\" | \"replace\";\n\nexport interface LspDocumentSelector {\n\t/** Language ID sent to the server in textDocument/didOpen. */\n\tlanguageId: string;\n\t/** Workspace-relative glob pattern used to select documents. */\n\tpattern: string;\n\t/** URI scheme to match. Defaults to file. */\n\tscheme?: string;\n}\n\nexport interface LspSpawnTransport {\n\ttype: \"spawn\";\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n}\n\nexport interface LspTcpTransport {\n\ttype: \"tcp\";\n\thost: string;\n\tport: number;\n}\n\nexport interface LspUnixSocketTransport {\n\ttype: \"unix\";\n\tpath: string;\n}\n\nexport interface LspNamedPipeTransport {\n\ttype: \"pipe\";\n\tpath: string;\n}\n\nexport interface LspProgrammaticTransport {\n\ttype: \"connection\";\n\t/** Host-registered connection factory ID. Functions are never loaded from JSON. */\n\tid: string;\n}\n\nexport type LspTransport =\n\t| LspSpawnTransport\n\t| LspTcpTransport\n\t| LspUnixSocketTransport\n\t| LspNamedPipeTransport\n\t| LspProgrammaticTransport;\n\nexport type LspWorkspaceRoot =\n\t| { type: \"session\" }\n\t| { type: \"fixed\"; path: string }\n\t| {\n\t\t\ttype: \"markers\";\n\t\t\tmarkers: string[];\n\t\t\tfallback?: \"session\" | \"none\";\n\t\t\tstopAt?: string;\n\t };\n\nexport interface LspPathMapping {\n\t/** Agent-visible filesystem root. Relative roots are resolved against the configuration source. */\n\tagentRoot: string;\n\t/** Absolute file URI for the same root as observed by the language server. */\n\tserverRootUri: string;\n}\n\nexport type LspServerLifecycle = { type: \"managed\" } | { type: \"attached\"; shutdown?: \"disconnect\" | \"protocol\" };\n\nexport interface LspServerTimeouts {\n\t/** Zero disables the corresponding timeout. */\n\tconnectMs?: number;\n\tinitializeMs?: number;\n\trequestMs?: number;\n\tshutdownMs?: number;\n}\n\nexport interface LspClientInfo {\n\tname: string;\n\tversion?: string;\n}\n\nexport type LspTraceValue = \"off\" | \"messages\" | \"verbose\";\n\nexport interface LspServerFeatures {\n\tdiagnostics?: boolean;\n\thover?: boolean;\n\tdefinition?: boolean;\n\treferences?: boolean;\n\trename?: boolean;\n\tcodeActions?: boolean;\n}\n\nexport interface LspConfiguredServer {\n\tid: string;\n\tenabled?: true;\n\tselectors: LspDocumentSelector[];\n\ttransport: LspTransport;\n\tlifecycle: LspServerLifecycle;\n\tworkspace: LspWorkspaceRoot;\n\tpathMappings?: LspPathMapping[];\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tfeatures?: LspServerFeatures;\n\tpriority?: number;\n\ttimeouts?: LspServerTimeouts;\n}\n\nexport interface LspDisabledServer {\n\tid: string;\n\tenabled: false;\n}\n\nexport type LspServerEntry = LspConfiguredServer | LspDisabledServer;\n\n/**\n * One externally supplied configuration layer.\n *\n * - An absent layer leaves lower-precedence configuration unchanged.\n * - `merge` (the default) replaces complete server definitions by ID.\n * - `replace` clears lower-precedence servers before applying this layer.\n * - `{ id, enabled: false }` removes a server inherited from a lower layer.\n * - `enabled: false` disables the resolved runtime without discarding server definitions.\n */\nexport interface LspConfigurationLayer {\n\tenabled?: boolean;\n\tmode?: LspConfigurationMode;\n\tservers?: LspServerEntry[];\n}\n\nexport interface ResolvedLspConfiguration {\n\tenabled: boolean;\n\tservers: LspConfiguredServer[];\n}\n\nexport interface LspConfigurationDiagnostic {\n\tseverity: \"error\";\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface ParseLspConfigurationResult {\n\tconfiguration?: LspConfigurationLayer;\n\tdiagnostics: LspConfigurationDiagnostic[];\n}\n\nconst SERVER_KEYS = new Set([\n\t\"id\",\n\t\"enabled\",\n\t\"selectors\",\n\t\"transport\",\n\t\"lifecycle\",\n\t\"workspace\",\n\t\"pathMappings\",\n\t\"initializationOptions\",\n\t\"settings\",\n\t\"clientInfo\",\n\t\"locale\",\n\t\"trace\",\n\t\"features\",\n\t\"priority\",\n\t\"timeouts\",\n]);\nconst FEATURE_KEYS = [\"diagnostics\", \"hover\", \"definition\", \"references\", \"rename\", \"codeActions\"] as const;\nconst TIMEOUT_KEYS = [\"connectMs\", \"initializeMs\", \"requestMs\", \"shutdownMs\"] as const;\n\nexport function parseLspConfiguration(value: unknown): ParseLspConfigurationResult {\n\tconst diagnostics: LspConfigurationDiagnostic[] = [];\n\tconst object = parseObject(value, \"$\", diagnostics);\n\tif (!object) return { diagnostics };\n\trejectUnknownKeys(object, new Set([\"enabled\", \"mode\", \"servers\"]), \"$\", diagnostics);\n\n\tconst enabled = parseOptionalBoolean(object.enabled, \"$.enabled\", diagnostics);\n\tconst mode = parseOptionalEnum(object.mode, [\"merge\", \"replace\"], \"$.mode\", diagnostics);\n\tconst servers = parseServers(object.servers, diagnostics);\n\tif (diagnostics.length > 0) return { diagnostics };\n\n\treturn {\n\t\tconfiguration: {\n\t\t\t...(enabled === undefined ? {} : { enabled }),\n\t\t\t...(mode === undefined ? {} : { mode }),\n\t\t\t...(servers === undefined ? {} : { servers }),\n\t\t},\n\t\tdiagnostics,\n\t};\n}\n\nfunction applyLspServerLayer(servers: Map<string, LspConfiguredServer>, layer: LspConfigurationLayer): void {\n\tif (layer.mode === \"replace\") servers.clear();\n\tfor (const server of layer.servers ?? []) {\n\t\tif (server.enabled === false) servers.delete(server.id);\n\t\telse servers.set(server.id, server);\n\t}\n}\n\n/** Resolve already validated layers from lowest to highest precedence. */\nexport function resolveLspConfiguration(\n\tlayers: readonly (LspConfigurationLayer | undefined)[],\n): ResolvedLspConfiguration {\n\tconst servers = new Map<string, LspConfiguredServer>();\n\tlet enabled = false;\n\tlet hasLayer = false;\n\n\tfor (const layer of layers) {\n\t\tif (!layer) continue;\n\t\tif (!hasLayer) enabled = layer.enabled ?? true;\n\t\thasLayer = true;\n\t\tif (layer.enabled !== undefined) enabled = layer.enabled;\n\t\tapplyLspServerLayer(servers, layer);\n\t}\n\n\treturn { enabled: hasLayer && enabled, servers: [...servers.values()] };\n}\n\nfunction parseServers(value: unknown, diagnostics: LspConfigurationDiagnostic[]): LspServerEntry[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, \"$.servers\", \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst servers: LspServerEntry[] = [];\n\tconst ids = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst path = `$.servers[${index}]`;\n\t\tconst server = parseServer(entry, path, diagnostics);\n\t\tif (!server) continue;\n\t\tif (ids.has(server.id)) addError(diagnostics, `${path}.id`, `duplicates server ID ${JSON.stringify(server.id)}`);\n\t\telse ids.add(server.id);\n\t\tservers.push(server);\n\t}\n\treturn servers;\n}\nfunction validateTransportLifecycle(\n\ttransport: LspTransport | undefined,\n\tlifecycle: LspServerLifecycle | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (!transport || transport.type === \"connection\") return;\n\tconst expectedLifecycle = transport.type === \"spawn\" ? \"managed\" : \"attached\";\n\tif (lifecycle?.type === expectedLifecycle) return;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.lifecycle.type`,\n\t\t`must be '${expectedLifecycle}' when transport.type is '${transport.type}'`,\n\t);\n}\nfunction parseServerId(value: unknown, path: string, diagnostics: LspConfigurationDiagnostic[]): string | undefined {\n\tconst id = parseRequiredString(value, `${path}.id`, diagnostics);\n\tif (!id || /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) return id;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.id`,\n\t\t\"must start with an alphanumeric character and contain only letters, numbers, '.', '_' or '-'\",\n\t);\n\treturn id;\n}\nfunction createDisabledServerEntry(\n\tobject: Record<string, unknown>,\n\tid: string | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDisabledServer | undefined {\n\trejectUnknownKeys(object, new Set([\"id\", \"enabled\"]), path, diagnostics);\n\tif (!id) return undefined;\n\treturn { id, enabled: false };\n}\n\nfunction parseServer(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerEntry | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst id = parseServerId(object.id, path, diagnostics);\n\tconst enabled = parseOptionalBoolean(object.enabled, `${path}.enabled`, diagnostics);\n\tif (enabled === false) return createDisabledServerEntry(object, id, path, diagnostics);\n\trejectUnknownKeys(object, SERVER_KEYS, path, diagnostics);\n\n\tconst selectors = parseSelectors(object.selectors, `${path}.selectors`, diagnostics);\n\tconst transport = parseTransport(object.transport, `${path}.transport`, diagnostics);\n\tconst lifecycle = parseLifecycle(object.lifecycle, `${path}.lifecycle`, diagnostics);\n\tconst workspace = parseWorkspace(object.workspace, `${path}.workspace`, diagnostics);\n\tconst pathMappings = parsePathMappings(object.pathMappings, `${path}.pathMappings`, diagnostics);\n\tconst initializationOptions = parseOptionalJson(\n\t\tobject.initializationOptions,\n\t\t`${path}.initializationOptions`,\n\t\tdiagnostics,\n\t);\n\tconst settings = parseOptionalJson(object.settings, `${path}.settings`, diagnostics);\n\tconst clientInfo = parseClientInfo(object.clientInfo, `${path}.clientInfo`, diagnostics);\n\tconst locale = parseOptionalString(object.locale, `${path}.locale`, diagnostics);\n\tconst trace = parseOptionalEnum(object.trace, [\"off\", \"messages\", \"verbose\"], `${path}.trace`, diagnostics);\n\tconst features = parseFeatures(object.features, `${path}.features`, diagnostics);\n\tconst priority = parseOptionalInteger(object.priority, `${path}.priority`, diagnostics);\n\tconst timeouts = parseTimeouts(object.timeouts, `${path}.timeouts`, diagnostics);\n\n\tvalidateTransportLifecycle(transport, lifecycle, path, diagnostics);\n\tif (!id || !selectors || !transport || !lifecycle || !workspace) return undefined;\n\n\treturn {\n\t\tid,\n\t\t...(enabled === true ? { enabled: true as const } : {}),\n\t\tselectors,\n\t\ttransport,\n\t\tlifecycle,\n\t\tworkspace,\n\t\t...(pathMappings === undefined ? {} : { pathMappings }),\n\t\t...(initializationOptions === undefined ? {} : { initializationOptions }),\n\t\t...(settings === undefined ? {} : { settings }),\n\t\t...(clientInfo === undefined ? {} : { clientInfo }),\n\t\t...(locale === undefined ? {} : { locale }),\n\t\t...(trace === undefined ? {} : { trace }),\n\t\t...(features === undefined ? {} : { features }),\n\t\t...(priority === undefined ? {} : { priority }),\n\t\t...(timeouts === undefined ? {} : { timeouts }),\n\t};\n}\n\nfunction registerSelectorSignature(\n\tsignatures: Set<string>,\n\tsignature: string,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (signatures.has(signature)) {\n\t\taddError(diagnostics, path, \"is ambiguous because another selector has the same scheme and pattern\");\n\t}\n\tsignatures.add(signature);\n}\n\nfunction parseSelectors(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDocumentSelector[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array\");\n\t\treturn undefined;\n\t}\n\tconst selectors: LspDocumentSelector[] = [];\n\tconst signatures = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst object = parseObject(entry, itemPath, diagnostics);\n\t\tif (!object) continue;\n\t\trejectUnknownKeys(object, new Set([\"languageId\", \"pattern\", \"scheme\"]), itemPath, diagnostics);\n\t\tconst languageId = parseRequiredString(object.languageId, `${itemPath}.languageId`, diagnostics);\n\t\tconst pattern = parseRequiredString(object.pattern, `${itemPath}.pattern`, diagnostics);\n\t\tconst scheme = parseOptionalString(object.scheme, `${itemPath}.scheme`, diagnostics);\n\t\tif (pattern && !isSafeRelativePath(pattern)) {\n\t\t\taddError(diagnostics, `${itemPath}.pattern`, \"must be a workspace-relative pattern without '..' segments\");\n\t\t}\n\t\tif (!languageId || !pattern) continue;\n\t\tconst signature = `${scheme ?? \"file\"}\\u0000${pattern}`;\n\t\tregisterSelectorSignature(signatures, signature, itemPath, diagnostics);\n\t\tselectors.push({ languageId, pattern, ...(scheme === undefined ? {} : { scheme }) });\n\t}\n\treturn selectors;\n}\n\nfunction parseTransport(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTransport | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tswitch (type) {\n\t\tcase \"spawn\":\n\t\t\treturn parseSpawnTransport(object, path, diagnostics);\n\t\tcase \"tcp\":\n\t\t\treturn parseTcpTransport(object, path, diagnostics);\n\t\tcase \"unix\":\n\t\t\treturn parseUnixSocketTransport(object, path, diagnostics);\n\t\tcase \"pipe\":\n\t\t\treturn parseNamedPipeTransport(object, path, diagnostics);\n\t\tcase \"connection\":\n\t\t\treturn parseProgrammaticTransport(object, path, diagnostics);\n\t\tdefault:\n\t\t\tif (type)\n\t\t\t\taddError(diagnostics, `${path}.type`, \"must be one of 'spawn', 'tcp', 'unix', 'pipe', or 'connection'\");\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseSpawnTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspSpawnTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"command\", \"args\", \"env\", \"cwd\"]), path, diagnostics);\n\tconst command = parseRequiredString(object.command, `${path}.command`, diagnostics);\n\tconst args = parseOptionalStringArray(object.args, `${path}.args`, diagnostics);\n\tconst env = parseOptionalStringRecord(object.env, `${path}.env`, diagnostics);\n\tconst cwd = parseOptionalString(object.cwd, `${path}.cwd`, diagnostics);\n\treturn command\n\t\t? { type: \"spawn\", command, ...(args ? { args } : {}), ...(env ? { env } : {}), ...(cwd ? { cwd } : {}) }\n\t\t: undefined;\n}\n\nfunction parseTcpTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTcpTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"host\", \"port\"]), path, diagnostics);\n\tconst host = parseRequiredString(object.host, `${path}.host`, diagnostics);\n\tconst port = parseOptionalInteger(object.port, `${path}.port`, diagnostics);\n\tif (port === undefined) addError(diagnostics, `${path}.port`, \"is required and must be an integer\");\n\telse if (port < 1 || port > 65535) addError(diagnostics, `${path}.port`, \"must be between 1 and 65535\");\n\treturn host && port !== undefined ? { type: \"tcp\", host, port } : undefined;\n}\n\nfunction parseUnixSocketTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspUnixSocketTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !posix.isAbsolute(endpointPath) && !isSafeRelativePath(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be absolute or a safe source-relative Unix socket path\");\n\t}\n\treturn endpointPath ? { type: \"unix\", path: endpointPath } : undefined;\n}\n\nfunction parseNamedPipeTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspNamedPipeTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !isAbsoluteNamedPipe(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be an absolute Windows named-pipe path such as \\\\\\\\.\\\\pipe\\\\server\");\n\t}\n\treturn endpointPath ? { type: \"pipe\", path: endpointPath } : undefined;\n}\n\nfunction parseProgrammaticTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspProgrammaticTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"id\"]), path, diagnostics);\n\tconst id = parseRequiredString(object.id, `${path}.id`, diagnostics);\n\treturn id ? { type: \"connection\", id } : undefined;\n}\nfunction parseLifecycle(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerLifecycle | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"managed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"attached\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"shutdown\"]), path, diagnostics);\n\t\tconst shutdown = parseOptionalEnum(object.shutdown, [\"disconnect\", \"protocol\"], `${path}.shutdown`, diagnostics);\n\t\treturn { type, ...(shutdown === undefined ? {} : { shutdown }) };\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'managed' or 'attached'\");\n\treturn undefined;\n}\n\nfunction parseWorkspace(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspWorkspaceRoot | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"session\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"fixed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\t\tconst fixedPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\t\treturn fixedPath ? { type, path: fixedPath } : undefined;\n\t}\n\tif (type === \"markers\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"markers\", \"fallback\", \"stopAt\"]), path, diagnostics);\n\t\tconst markers = parseRequiredUniqueRelativePaths(object.markers, `${path}.markers`, diagnostics);\n\t\tconst fallback = parseOptionalEnum(object.fallback, [\"session\", \"none\"], `${path}.fallback`, diagnostics);\n\t\tconst stopAt = parseOptionalString(object.stopAt, `${path}.stopAt`, diagnostics);\n\t\treturn markers\n\t\t\t? {\n\t\t\t\t\ttype,\n\t\t\t\t\tmarkers,\n\t\t\t\t\t...(fallback === undefined ? {} : { fallback }),\n\t\t\t\t\t...(stopAt === undefined ? {} : { stopAt }),\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'session', 'fixed', or 'markers'\");\n\treturn undefined;\n}\n\ninterface PathMappingParseState {\n\tmappings: LspPathMapping[];\n\tagentRoots: Set<string>;\n\tserverRoots: Set<string>;\n}\n\nfunction parsePathMappingEntry(\n\tentry: unknown,\n\tindex: number,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tstate: PathMappingParseState,\n): void {\n\tconst itemPath = `${path}[${index}]`;\n\tconst object = parseObject(entry, itemPath, diagnostics);\n\tif (!object) return;\n\trejectUnknownKeys(object, new Set([\"agentRoot\", \"serverRootUri\"]), itemPath, diagnostics);\n\tconst agentRoot = parseRequiredString(object.agentRoot, `${itemPath}.agentRoot`, diagnostics);\n\tconst serverRootUri = parseRequiredString(object.serverRootUri, `${itemPath}.serverRootUri`, diagnostics);\n\tif (serverRootUri && !isAbsoluteFileUri(serverRootUri)) {\n\t\taddError(\n\t\t\tdiagnostics,\n\t\t\t`${itemPath}.serverRootUri`,\n\t\t\t\"must be an absolute file URI without query or fragment components\",\n\t\t);\n\t}\n\tif (!agentRoot || !serverRootUri) return;\n\n\tconst normalizedAgentRoot = normalizeAgentRoot(agentRoot);\n\tconst normalizedServerRoot = canonicalFileUri(serverRootUri);\n\tif (state.agentRoots.has(normalizedAgentRoot))\n\t\taddError(diagnostics, `${itemPath}.agentRoot`, \"duplicates another mapping root\");\n\tif (normalizedServerRoot && state.serverRoots.has(normalizedServerRoot)) {\n\t\taddError(diagnostics, `${itemPath}.serverRootUri`, \"duplicates another mapping root\");\n\t}\n\tstate.agentRoots.add(normalizedAgentRoot);\n\tif (normalizedServerRoot) state.serverRoots.add(normalizedServerRoot);\n\tstate.mappings.push({ agentRoot, serverRootUri });\n}\n\nfunction validatePathMappingReversibility(\n\tmappings: LspPathMapping[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (let index = 0; index < mappings.length; index++) {\n\t\tfor (let previous = 0; previous < index; previous++) {\n\t\t\tif (pathMappingsAreReversible(mappings[previous], mappings[index])) continue;\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].agentRoot`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent server URI relationship`,\n\t\t\t);\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].serverRootUri`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent agent path relationship`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction parsePathMappings(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspPathMapping[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst state: PathMappingParseState = {\n\t\tmappings: [],\n\t\tagentRoots: new Set<string>(),\n\t\tserverRoots: new Set<string>(),\n\t};\n\tfor (const [index, entry] of value.entries()) {\n\t\tparsePathMappingEntry(entry, index, path, diagnostics, state);\n\t}\n\tvalidatePathMappingReversibility(state.mappings, path, diagnostics);\n\treturn state.mappings;\n}\n\nfunction parseClientInfo(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspClientInfo | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set([\"name\", \"version\"]), path, diagnostics);\n\tconst name = parseRequiredString(object.name, `${path}.name`, diagnostics);\n\tconst version = parseOptionalString(object.version, `${path}.version`, diagnostics);\n\treturn name ? { name, ...(version === undefined ? {} : { version }) } : undefined;\n}\n\nfunction parseFeatures(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerFeatures | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(FEATURE_KEYS), path, diagnostics);\n\tconst features: LspServerFeatures = {};\n\tfor (const key of FEATURE_KEYS) {\n\t\tconst setting = parseOptionalBoolean(object[key], `${path}.${key}`, diagnostics);\n\t\tif (setting !== undefined) features[key] = setting;\n\t}\n\treturn features;\n}\n\nfunction parseTimeouts(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerTimeouts | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(TIMEOUT_KEYS), path, diagnostics);\n\tconst timeouts: LspServerTimeouts = {};\n\tfor (const key of TIMEOUT_KEYS) {\n\t\tconst timeout = parseOptionalInteger(object[key], `${path}.${key}`, diagnostics);\n\t\tif (timeout !== undefined) {\n\t\t\tif (timeout < 0) addError(diagnostics, `${path}.${key}`, \"must be zero or a positive integer\");\n\t\t\telse timeouts[key] = timeout;\n\t\t}\n\t}\n\treturn timeouts;\n}\n\ntype LspJsonParseResult = { ok: true; value: LspJsonValue } | { ok: false };\n\nfunction parseOptionalJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspJsonValue | undefined {\n\tif (value === undefined) return undefined;\n\tconst result = parseJson(value, path, diagnostics, new Set<object>());\n\treturn result.ok ? result.value : undefined;\n}\n\nfunction parseJsonArray(\n\tvalue: unknown[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: LspJsonValue[] = [];\n\tlet valid = true;\n\tfor (const [index, item] of value.entries()) {\n\t\tconst parsed = parseJson(item, `${path}[${index}]`, diagnostics, ancestors);\n\t\tif (parsed.ok) output.push(parsed.value);\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJsonObject(\n\tvalue: object,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: { [key: string]: LspJsonValue } = {};\n\tlet valid = true;\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst parsed = parseJson(item, `${path}.${key}`, diagnostics, ancestors);\n\t\tif (parsed.ok) output[key] = parsed.value;\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return { ok: true, value };\n\tif (typeof value === \"number\") {\n\t\tif (Number.isFinite(value)) return { ok: true, value };\n\t\taddError(diagnostics, path, \"must contain only finite JSON numbers\");\n\t\treturn { ok: false };\n\t}\n\tif (typeof value !== \"object\") {\n\t\taddError(diagnostics, path, \"must be valid JSON data\");\n\t\treturn { ok: false };\n\t}\n\tif (ancestors.has(value)) {\n\t\taddError(diagnostics, path, \"must not contain circular references\");\n\t\treturn { ok: false };\n\t}\n\treturn Array.isArray(value)\n\t\t? parseJsonArray(value, path, diagnostics, ancestors)\n\t\t: parseJsonObject(value, path, diagnostics, ancestors);\n}\n\nfunction parseObject(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, unknown> | undefined {\n\tif (typeof value === \"object\" && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;\n\taddError(diagnostics, path, \"must be an object\");\n\treturn undefined;\n}\n\nfunction parseRequiredString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\taddError(diagnostics, path, \"is required and must be a non-empty string\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (value === undefined) return undefined;\n\treturn parseRequiredString(value, path, diagnostics);\n}\n\nfunction parseOptionalBoolean(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"boolean\") {\n\t\taddError(diagnostics, path, \"must be a boolean\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalInteger(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Number.isSafeInteger(value)) {\n\t\taddError(diagnostics, path, \"must be a safe integer\");\n\t\treturn undefined;\n\t}\n\treturn value as number;\n}\n\nfunction parseOptionalEnum<const T extends string>(\n\tvalue: unknown,\n\tallowed: readonly T[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): T | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value === \"string\" && allowed.includes(value as T)) return value as T;\n\taddError(diagnostics, path, `must be one of ${allowed.map((item) => JSON.stringify(item)).join(\", \")}`);\n\treturn undefined;\n}\n\nfunction parseOptionalStringArray(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array of strings\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tfor (const [index, item] of value.entries()) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}[${index}]`, \"must be a string\");\n\t\telse output.push(item);\n\t}\n\treturn output;\n}\n\nfunction parseOptionalStringRecord(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst output: Record<string, string> = {};\n\tfor (const [key, item] of Object.entries(object)) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}.${key}`, \"must be a string\");\n\t\telse output[key] = item;\n\t}\n\treturn output;\n}\n\nfunction parseRequiredUniqueRelativePaths(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array of relative paths\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const [index, item] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst marker = parseRequiredString(item, itemPath, diagnostics);\n\t\tif (!marker) continue;\n\t\tif (!isSafeRelativePath(marker)) addError(diagnostics, itemPath, \"must be a relative path without '..' segments\");\n\t\tif (seen.has(marker)) addError(diagnostics, itemPath, \"duplicates another marker\");\n\t\telse seen.add(marker);\n\t\toutput.push(marker);\n\t}\n\treturn output;\n}\n\nfunction rejectUnknownKeys(\n\tobject: Record<string, unknown>,\n\tallowed: ReadonlySet<string>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (const key of Object.keys(object)) {\n\t\tif (!allowed.has(key)) addError(diagnostics, `${path}.${key}`, \"is not a recognized property\");\n\t}\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n\tif (posix.isAbsolute(value) || win32.isAbsolute(value)) return false;\n\treturn !value.split(/[\\\\/]/).includes(\"..\");\n}\n\ntype MappingRootDirection = \"left-parent\" | \"right-parent\" | \"equal\";\n\ninterface MappingRootRelation {\n\tdirection: MappingRootDirection;\n\trelative: string;\n\tcaseInsensitive: boolean;\n}\n\nfunction agentRootRelation(left: string, right: string): MappingRootRelation | undefined {\n\tconst leftFlavor = pathFlavor(left);\n\tconst rightFlavor = pathFlavor(right);\n\tif (leftFlavor !== rightFlavor) return undefined;\n\tconst normalizedLeft = normalizePortablePath(left, leftFlavor);\n\tconst normalizedRight = normalizePortablePath(right, rightFlavor);\n\tconst comparableLeft = leftFlavor === \"windows\" ? normalizedLeft.toLowerCase() : normalizedLeft;\n\tconst comparableRight = rightFlavor === \"windows\" ? normalizedRight.toLowerCase() : normalizedRight;\n\tif (comparableLeft === comparableRight) {\n\t\treturn { direction: \"equal\", relative: \"\", caseInsensitive: leftFlavor === \"windows\" };\n\t}\n\tconst fromLeft = relativeWithin(normalizedLeft, normalizedRight);\n\tif (fromLeft !== undefined) {\n\t\treturn {\n\t\t\tdirection: \"left-parent\",\n\t\t\trelative: fromLeft.replace(/\\\\/g, \"/\"),\n\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t};\n\t}\n\tconst fromRight = relativeWithin(normalizedRight, normalizedLeft);\n\treturn fromRight === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tdirection: \"right-parent\",\n\t\t\t\trelative: fromRight.replace(/\\\\/g, \"/\"),\n\t\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t\t};\n}\n\nfunction serverRootRelation(leftValue: string, rightValue: string): MappingRootRelation | undefined {\n\tif (!canonicalFileUri(leftValue) || !canonicalFileUri(rightValue)) return undefined;\n\tconst left = new URL(leftValue);\n\tconst right = new URL(rightValue);\n\tif (left.hostname.toLowerCase() !== right.hostname.toLowerCase()) return undefined;\n\tconst leftSegments = left.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst rightSegments = right.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst caseInsensitive =\n\t\tleft.hostname.length > 0 ||\n\t\tright.hostname.length > 0 ||\n\t\tleftSegments[0]?.endsWith(\":\") === true ||\n\t\trightSegments[0]?.endsWith(\":\") === true;\n\tconst comparable = (segment: string) => (caseInsensitive ? segment.toLowerCase() : segment);\n\tlet shared = 0;\n\twhile (\n\t\tshared < leftSegments.length &&\n\t\tshared < rightSegments.length &&\n\t\tcomparable(leftSegments[shared]) === comparable(rightSegments[shared])\n\t) {\n\t\tshared++;\n\t}\n\tif (shared < Math.min(leftSegments.length, rightSegments.length)) return undefined;\n\tif (leftSegments.length === rightSegments.length) return { direction: \"equal\", relative: \"\", caseInsensitive };\n\treturn leftSegments.length < rightSegments.length\n\t\t? { direction: \"left-parent\", relative: rightSegments.slice(shared).join(\"/\"), caseInsensitive }\n\t\t: { direction: \"right-parent\", relative: leftSegments.slice(shared).join(\"/\"), caseInsensitive };\n}\n\nfunction pathMappingsAreReversible(left: LspPathMapping, right: LspPathMapping): boolean {\n\tconst agent = agentRootRelation(left.agentRoot, right.agentRoot);\n\tconst server = serverRootRelation(left.serverRootUri, right.serverRootUri);\n\tif (!agent || !server) return agent === undefined && server === undefined;\n\tif (agent.direction !== server.direction) return false;\n\treturn agent.caseInsensitive && server.caseInsensitive\n\t\t? agent.relative.toLowerCase() === server.relative.toLowerCase()\n\t\t: agent.relative === server.relative;\n}\n\nfunction normalizeAgentRoot(value: string): string {\n\tconst flavor = pathFlavor(value);\n\tconst api = pathApi(flavor);\n\tconst normalized = normalizePortablePath(value, flavor);\n\tconst root = api.parse(normalized).root;\n\tconst trailingSeparator = flavor === \"windows\" ? /[\\\\/]+$/ : /\\/+$/;\n\tconst withoutTrailingSeparators = normalized === root ? normalized : normalized.replace(trailingSeparator, \"\");\n\treturn flavor === \"windows\" ? withoutTrailingSeparators.toLowerCase() : withoutTrailingSeparators;\n}\n\nfunction isAbsoluteNamedPipe(value: string): boolean {\n\tconst lower = value.toLowerCase();\n\tconst prefixes = [\"\\\\\\\\.\\\\pipe\\\\\", \"\\\\\\\\?\\\\pipe\\\\\"];\n\treturn prefixes.some((prefix) => lower.startsWith(prefix) && value.length > prefix.length);\n}\n\nfunction canonicalFileUri(value: string): string | undefined {\n\tif (!/^file:\\//i.test(value)) return undefined;\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (url.protocol !== \"file:\" || url.pathname.length === 0 || url.search !== \"\" || url.hash !== \"\")\n\t\t\treturn undefined;\n\t\tconst segments = url.pathname\n\t\t\t.split(\"/\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((segment) => decodeURIComponent(segment));\n\t\tif (segments.some((segment) => segment.includes(\"/\") || segment === \".\" || segment === \"..\")) return undefined;\n\t\tif (url.hostname && segments.length === 0) return undefined;\n\t\tif (segments[0]?.endsWith(\":\") && segments.length === 1 && !url.pathname.endsWith(\"/\")) return undefined;\n\t\tconst driveRoot = segments[0]?.endsWith(\":\") && segments.length === 1;\n\t\turl.pathname = `/${segments.map((segment) => encodeURIComponent(segment)).join(\"/\")}${driveRoot ? \"/\" : \"\"}`;\n\t\turl.hostname = url.hostname.toLowerCase();\n\t\treturn url.toString();\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isAbsoluteFileUri(value: string): boolean {\n\treturn canonicalFileUri(value) !== undefined;\n}\n\nfunction addError(diagnostics: LspConfigurationDiagnostic[], path: string, message: string): void {\n\tdiagnostics.push({ severity: \"error\", path, message });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { posix, win32 } from \"node:path\";\nimport { normalizePortablePath, pathApi, pathFlavor, relativeWithin } from \"./portable-path.ts\";\n\nexport type LspJsonValue = null | boolean | number | string | LspJsonValue[] | { [key: string]: LspJsonValue };\n\nexport type LspConfigurationMode = \"merge\" | \"replace\";\n\nexport interface LspDocumentSelector {\n\t/** Language ID sent to the server in textDocument/didOpen. */\n\tlanguageId: string;\n\t/** Workspace-relative glob pattern used to select documents. */\n\tpattern: string;\n\t/** URI scheme to match. Defaults to file. */\n\tscheme?: string;\n}\n\nexport interface LspSpawnTransport {\n\ttype: \"spawn\";\n\tcommand: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\tcwd?: string;\n}\n\nexport interface LspTcpTransport {\n\ttype: \"tcp\";\n\thost: string;\n\tport: number;\n}\n\nexport interface LspUnixSocketTransport {\n\ttype: \"unix\";\n\tpath: string;\n}\n\nexport interface LspNamedPipeTransport {\n\ttype: \"pipe\";\n\tpath: string;\n}\n\nexport interface LspProgrammaticTransport {\n\ttype: \"connection\";\n\t/** Host-registered connection factory ID. Functions are never loaded from JSON. */\n\tid: string;\n}\n\nexport type LspTransport =\n\t| LspSpawnTransport\n\t| LspTcpTransport\n\t| LspUnixSocketTransport\n\t| LspNamedPipeTransport\n\t| LspProgrammaticTransport;\n\nexport type LspWorkspaceRoot =\n\t| { type: \"session\" }\n\t| { type: \"fixed\"; path: string }\n\t| {\n\t\t\ttype: \"markers\";\n\t\t\tmarkers: string[];\n\t\t\tfallback?: \"session\" | \"none\";\n\t\t\tstopAt?: string;\n\t };\n\nexport interface LspPathMapping {\n\t/** Agent-visible filesystem root. Relative roots are resolved against the configuration source. */\n\tagentRoot: string;\n\t/** Absolute file URI for the same root as observed by the language server. */\n\tserverRootUri: string;\n}\n\nexport type LspServerLifecycle = { type: \"managed\" } | { type: \"attached\"; shutdown?: \"disconnect\" | \"protocol\" };\n\nexport interface LspServerTimeouts {\n\t/** Zero disables the corresponding timeout. */\n\tconnectMs?: number;\n\tinitializeMs?: number;\n\trequestMs?: number;\n\tshutdownMs?: number;\n}\n\nexport interface LspClientInfo {\n\tname: string;\n\tversion?: string;\n}\n\nexport type LspTraceValue = \"off\" | \"messages\" | \"verbose\";\n\nexport interface LspServerFeatures {\n\tdiagnostics?: boolean;\n\thover?: boolean;\n\tdefinition?: boolean;\n\treferences?: boolean;\n\trename?: boolean;\n\tcodeActions?: boolean;\n}\n\nexport interface LspConfiguredServer {\n\tid: string;\n\tenabled?: true;\n\tselectors: LspDocumentSelector[];\n\ttransport: LspTransport;\n\tlifecycle: LspServerLifecycle;\n\tworkspace: LspWorkspaceRoot;\n\tpathMappings?: LspPathMapping[];\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tfeatures?: LspServerFeatures;\n\tpriority?: number;\n\ttimeouts?: LspServerTimeouts;\n}\n\nexport interface LspDisabledServer {\n\tid: string;\n\tenabled: false;\n}\n\nexport type LspServerEntry = LspConfiguredServer | LspDisabledServer;\n\n/**\n * One externally supplied configuration layer.\n *\n * - An absent layer leaves lower-precedence configuration unchanged.\n * - `merge` (the default) replaces complete server definitions by ID.\n * - `replace` clears lower-precedence servers before applying this layer.\n * - `{ id, enabled: false }` removes a server inherited from a lower layer.\n * - `enabled: false` disables the resolved runtime without discarding server definitions.\n */\nexport interface LspConfigurationLayer {\n\tenabled?: boolean;\n\tmode?: LspConfigurationMode;\n\tservers?: LspServerEntry[];\n}\n\nexport interface ResolvedLspConfiguration {\n\tenabled: boolean;\n\tservers: LspConfiguredServer[];\n}\n\nexport interface LspConfigurationDiagnostic {\n\tseverity: \"error\";\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface ParseLspConfigurationResult {\n\tconfiguration?: LspConfigurationLayer;\n\tdiagnostics: LspConfigurationDiagnostic[];\n}\n\nconst SERVER_KEYS = new Set([\n\t\"id\",\n\t\"enabled\",\n\t\"selectors\",\n\t\"transport\",\n\t\"lifecycle\",\n\t\"workspace\",\n\t\"pathMappings\",\n\t\"initializationOptions\",\n\t\"settings\",\n\t\"clientInfo\",\n\t\"locale\",\n\t\"trace\",\n\t\"features\",\n\t\"priority\",\n\t\"timeouts\",\n]);\nconst FEATURE_KEYS = [\"diagnostics\", \"hover\", \"definition\", \"references\", \"rename\", \"codeActions\"] as const;\nconst TIMEOUT_KEYS = [\"connectMs\", \"initializeMs\", \"requestMs\", \"shutdownMs\"] as const;\n\nexport function parseLspConfiguration(value: unknown): ParseLspConfigurationResult {\n\tconst diagnostics: LspConfigurationDiagnostic[] = [];\n\tconst object = parseObject(value, \"$\", diagnostics);\n\tif (!object) return { diagnostics };\n\trejectUnknownKeys(object, new Set([\"enabled\", \"mode\", \"servers\"]), \"$\", diagnostics);\n\n\tconst enabled = parseOptionalBoolean(object.enabled, \"$.enabled\", diagnostics);\n\tconst mode = parseOptionalEnum(object.mode, [\"merge\", \"replace\"], \"$.mode\", diagnostics);\n\tconst servers = parseServers(object.servers, diagnostics);\n\tif (diagnostics.length > 0) return { diagnostics };\n\n\treturn {\n\t\tconfiguration: {\n\t\t\t...(enabled === undefined ? {} : { enabled }),\n\t\t\t...(mode === undefined ? {} : { mode }),\n\t\t\t...(servers === undefined ? {} : { servers }),\n\t\t},\n\t\tdiagnostics,\n\t};\n}\n\nfunction applyLspServerLayer(servers: Map<string, LspConfiguredServer>, layer: LspConfigurationLayer): void {\n\tif (layer.mode === \"replace\") servers.clear();\n\tfor (const server of layer.servers ?? []) {\n\t\tif (server.enabled === false) servers.delete(server.id);\n\t\telse servers.set(server.id, server);\n\t}\n}\n\n/** Resolve already validated layers from lowest to highest precedence. */\nexport function resolveLspConfiguration(\n\tlayers: readonly (LspConfigurationLayer | undefined)[],\n): ResolvedLspConfiguration {\n\tconst servers = new Map<string, LspConfiguredServer>();\n\tlet enabled = false;\n\tlet hasLayer = false;\n\n\tfor (const layer of layers) {\n\t\tif (!layer) continue;\n\t\tif (!hasLayer) enabled = layer.enabled ?? true;\n\t\thasLayer = true;\n\t\tif (layer.enabled !== undefined) enabled = layer.enabled;\n\t\tapplyLspServerLayer(servers, layer);\n\t}\n\n\treturn { enabled: hasLayer && enabled, servers: [...servers.values()] };\n}\n\nfunction parseServers(value: unknown, diagnostics: LspConfigurationDiagnostic[]): LspServerEntry[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, \"$.servers\", \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst servers: LspServerEntry[] = [];\n\tconst ids = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst path = `$.servers[${index}]`;\n\t\tconst server = parseServer(entry, path, diagnostics);\n\t\tif (!server) continue;\n\t\tif (ids.has(server.id)) addError(diagnostics, `${path}.id`, `duplicates server ID ${JSON.stringify(server.id)}`);\n\t\telse ids.add(server.id);\n\t\tservers.push(server);\n\t}\n\treturn servers;\n}\nfunction validateTransportLifecycle(\n\ttransport: LspTransport | undefined,\n\tlifecycle: LspServerLifecycle | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (!transport || transport.type === \"connection\") return;\n\tconst expectedLifecycle = transport.type === \"spawn\" ? \"managed\" : \"attached\";\n\tif (lifecycle?.type === expectedLifecycle) return;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.lifecycle.type`,\n\t\t`must be '${expectedLifecycle}' when transport.type is '${transport.type}'`,\n\t);\n}\nfunction parseServerId(value: unknown, path: string, diagnostics: LspConfigurationDiagnostic[]): string | undefined {\n\tconst id = parseRequiredString(value, `${path}.id`, diagnostics);\n\tif (!id || /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) return id;\n\taddError(\n\t\tdiagnostics,\n\t\t`${path}.id`,\n\t\t\"must start with an alphanumeric character and contain only letters, numbers, '.', '_' or '-'\",\n\t);\n\treturn id;\n}\nfunction createDisabledServerEntry(\n\tobject: Record<string, unknown>,\n\tid: string | undefined,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDisabledServer | undefined {\n\trejectUnknownKeys(object, new Set([\"id\", \"enabled\"]), path, diagnostics);\n\tif (!id) return undefined;\n\treturn { id, enabled: false };\n}\n\nfunction parseServer(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerEntry | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst id = parseServerId(object.id, path, diagnostics);\n\tconst enabled = parseOptionalBoolean(object.enabled, `${path}.enabled`, diagnostics);\n\tif (enabled === false) return createDisabledServerEntry(object, id, path, diagnostics);\n\trejectUnknownKeys(object, SERVER_KEYS, path, diagnostics);\n\n\tconst selectors = parseSelectors(object.selectors, `${path}.selectors`, diagnostics);\n\tconst transport = parseTransport(object.transport, `${path}.transport`, diagnostics);\n\tconst lifecycle = parseLifecycle(object.lifecycle, `${path}.lifecycle`, diagnostics);\n\tconst workspace = parseWorkspace(object.workspace, `${path}.workspace`, diagnostics);\n\tconst pathMappings = parsePathMappings(object.pathMappings, `${path}.pathMappings`, diagnostics);\n\tconst initializationOptions = parseOptionalJson(\n\t\tobject.initializationOptions,\n\t\t`${path}.initializationOptions`,\n\t\tdiagnostics,\n\t);\n\tconst settings = parseOptionalJson(object.settings, `${path}.settings`, diagnostics);\n\tconst clientInfo = parseClientInfo(object.clientInfo, `${path}.clientInfo`, diagnostics);\n\tconst locale = parseOptionalString(object.locale, `${path}.locale`, diagnostics);\n\tconst trace = parseOptionalEnum(object.trace, [\"off\", \"messages\", \"verbose\"], `${path}.trace`, diagnostics);\n\tconst features = parseFeatures(object.features, `${path}.features`, diagnostics);\n\tconst priority = parseOptionalInteger(object.priority, `${path}.priority`, diagnostics);\n\tconst timeouts = parseTimeouts(object.timeouts, `${path}.timeouts`, diagnostics);\n\n\tvalidateTransportLifecycle(transport, lifecycle, path, diagnostics);\n\tif (!id || !selectors || !transport || !lifecycle || !workspace) return undefined;\n\n\treturn {\n\t\tid,\n\t\t...(enabled === true ? { enabled: true as const } : {}),\n\t\tselectors,\n\t\ttransport,\n\t\tlifecycle,\n\t\tworkspace,\n\t\t...(pathMappings === undefined ? {} : { pathMappings }),\n\t\t...(initializationOptions === undefined ? {} : { initializationOptions }),\n\t\t...(settings === undefined ? {} : { settings }),\n\t\t...(clientInfo === undefined ? {} : { clientInfo }),\n\t\t...(locale === undefined ? {} : { locale }),\n\t\t...(trace === undefined ? {} : { trace }),\n\t\t...(features === undefined ? {} : { features }),\n\t\t...(priority === undefined ? {} : { priority }),\n\t\t...(timeouts === undefined ? {} : { timeouts }),\n\t};\n}\n\nfunction registerSelectorSignature(\n\tsignatures: Set<string>,\n\tsignature: string,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tif (signatures.has(signature)) {\n\t\taddError(diagnostics, path, \"is ambiguous because another selector has the same scheme and pattern\");\n\t}\n\tsignatures.add(signature);\n}\n\nfunction parseSelectors(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspDocumentSelector[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array\");\n\t\treturn undefined;\n\t}\n\tconst selectors: LspDocumentSelector[] = [];\n\tconst signatures = new Set<string>();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst object = parseObject(entry, itemPath, diagnostics);\n\t\tif (!object) continue;\n\t\trejectUnknownKeys(object, new Set([\"languageId\", \"pattern\", \"scheme\"]), itemPath, diagnostics);\n\t\tconst languageId = parseRequiredString(object.languageId, `${itemPath}.languageId`, diagnostics);\n\t\tconst pattern = parseRequiredString(object.pattern, `${itemPath}.pattern`, diagnostics);\n\t\tconst scheme = parseOptionalString(object.scheme, `${itemPath}.scheme`, diagnostics);\n\t\tif (pattern && !isSafeRelativePath(pattern)) {\n\t\t\taddError(diagnostics, `${itemPath}.pattern`, \"must be a workspace-relative pattern without '..' segments\");\n\t\t}\n\t\tif (!languageId || !pattern) continue;\n\t\tconst signature = `${scheme ?? \"file\"}\\u0000${pattern}`;\n\t\tregisterSelectorSignature(signatures, signature, itemPath, diagnostics);\n\t\tselectors.push({ languageId, pattern, ...(scheme === undefined ? {} : { scheme }) });\n\t}\n\treturn selectors;\n}\n\nfunction parseTransport(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTransport | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tswitch (type) {\n\t\tcase \"spawn\":\n\t\t\treturn parseSpawnTransport(object, path, diagnostics);\n\t\tcase \"tcp\":\n\t\t\treturn parseTcpTransport(object, path, diagnostics);\n\t\tcase \"unix\":\n\t\t\treturn parseUnixSocketTransport(object, path, diagnostics);\n\t\tcase \"pipe\":\n\t\t\treturn parseNamedPipeTransport(object, path, diagnostics);\n\t\tcase \"connection\":\n\t\t\treturn parseProgrammaticTransport(object, path, diagnostics);\n\t\tdefault:\n\t\t\tif (type)\n\t\t\t\taddError(diagnostics, `${path}.type`, \"must be one of 'spawn', 'tcp', 'unix', 'pipe', or 'connection'\");\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseSpawnTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspSpawnTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"command\", \"args\", \"env\", \"cwd\"]), path, diagnostics);\n\tconst command = parseRequiredString(object.command, `${path}.command`, diagnostics);\n\tconst args = parseOptionalStringArray(object.args, `${path}.args`, diagnostics);\n\tconst env = parseOptionalStringRecord(object.env, `${path}.env`, diagnostics);\n\tconst cwd = parseOptionalString(object.cwd, `${path}.cwd`, diagnostics);\n\treturn command\n\t\t? { type: \"spawn\", command, ...(args ? { args } : {}), ...(env ? { env } : {}), ...(cwd ? { cwd } : {}) }\n\t\t: undefined;\n}\n\nfunction parseTcpTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspTcpTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"host\", \"port\"]), path, diagnostics);\n\tconst host = parseRequiredString(object.host, `${path}.host`, diagnostics);\n\tconst port = parseOptionalInteger(object.port, `${path}.port`, diagnostics);\n\tif (port === undefined) addError(diagnostics, `${path}.port`, \"is required and must be an integer\");\n\telse if (port < 1 || port > 65535) addError(diagnostics, `${path}.port`, \"must be between 1 and 65535\");\n\treturn host && port !== undefined ? { type: \"tcp\", host, port } : undefined;\n}\n\nfunction parseUnixSocketTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspUnixSocketTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !posix.isAbsolute(endpointPath) && !isSafeRelativePath(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be absolute or a safe source-relative Unix socket path\");\n\t}\n\treturn endpointPath ? { type: \"unix\", path: endpointPath } : undefined;\n}\n\nfunction parseNamedPipeTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspNamedPipeTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\tconst endpointPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\tif (endpointPath && !isAbsoluteNamedPipe(endpointPath)) {\n\t\taddError(diagnostics, `${path}.path`, \"must be an absolute Windows named-pipe path such as \\\\\\\\.\\\\pipe\\\\server\");\n\t}\n\treturn endpointPath ? { type: \"pipe\", path: endpointPath } : undefined;\n}\n\nfunction parseProgrammaticTransport(\n\tobject: Record<string, unknown>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspProgrammaticTransport | undefined {\n\trejectUnknownKeys(object, new Set([\"type\", \"id\"]), path, diagnostics);\n\tconst id = parseRequiredString(object.id, `${path}.id`, diagnostics);\n\treturn id ? { type: \"connection\", id } : undefined;\n}\nfunction parseLifecycle(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerLifecycle | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"managed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"attached\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"shutdown\"]), path, diagnostics);\n\t\tconst shutdown = parseOptionalEnum(object.shutdown, [\"disconnect\", \"protocol\"], `${path}.shutdown`, diagnostics);\n\t\treturn { type, ...(shutdown === undefined ? {} : { shutdown }) };\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'managed' or 'attached'\");\n\treturn undefined;\n}\n\nfunction parseWorkspace(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspWorkspaceRoot | undefined {\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst type = parseRequiredString(object.type, `${path}.type`, diagnostics);\n\tif (type === \"session\") {\n\t\trejectUnknownKeys(object, new Set([\"type\"]), path, diagnostics);\n\t\treturn { type };\n\t}\n\tif (type === \"fixed\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"path\"]), path, diagnostics);\n\t\tconst fixedPath = parseRequiredString(object.path, `${path}.path`, diagnostics);\n\t\treturn fixedPath ? { type, path: fixedPath } : undefined;\n\t}\n\tif (type === \"markers\") {\n\t\trejectUnknownKeys(object, new Set([\"type\", \"markers\", \"fallback\", \"stopAt\"]), path, diagnostics);\n\t\tconst markers = parseRequiredUniqueRelativePaths(object.markers, `${path}.markers`, diagnostics);\n\t\tconst fallback = parseOptionalEnum(object.fallback, [\"session\", \"none\"], `${path}.fallback`, diagnostics);\n\t\tconst stopAt = parseOptionalString(object.stopAt, `${path}.stopAt`, diagnostics);\n\t\treturn markers\n\t\t\t? {\n\t\t\t\t\ttype,\n\t\t\t\t\tmarkers,\n\t\t\t\t\t...(fallback === undefined ? {} : { fallback }),\n\t\t\t\t\t...(stopAt === undefined ? {} : { stopAt }),\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (type) addError(diagnostics, `${path}.type`, \"must be 'session', 'fixed', or 'markers'\");\n\treturn undefined;\n}\n\ninterface PathMappingParseState {\n\tmappings: LspPathMapping[];\n\tagentRoots: Set<string>;\n\tserverRoots: Set<string>;\n}\n\nfunction parsePathMappingEntry(\n\tentry: unknown,\n\tindex: number,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tstate: PathMappingParseState,\n): void {\n\tconst itemPath = `${path}[${index}]`;\n\tconst object = parseObject(entry, itemPath, diagnostics);\n\tif (!object) return;\n\trejectUnknownKeys(object, new Set([\"agentRoot\", \"serverRootUri\"]), itemPath, diagnostics);\n\tconst agentRoot = parseRequiredString(object.agentRoot, `${itemPath}.agentRoot`, diagnostics);\n\tconst serverRootUri = parseRequiredString(object.serverRootUri, `${itemPath}.serverRootUri`, diagnostics);\n\tif (serverRootUri && !isAbsoluteFileUri(serverRootUri)) {\n\t\taddError(\n\t\t\tdiagnostics,\n\t\t\t`${itemPath}.serverRootUri`,\n\t\t\t\"must be an absolute file URI without query or fragment components\",\n\t\t);\n\t}\n\tif (!agentRoot || !serverRootUri) return;\n\n\tconst normalizedAgentRoot = normalizeAgentRoot(agentRoot);\n\tconst normalizedServerRoot = canonicalFileUri(serverRootUri);\n\tif (state.agentRoots.has(normalizedAgentRoot))\n\t\taddError(diagnostics, `${itemPath}.agentRoot`, \"duplicates another mapping root\");\n\tif (normalizedServerRoot && state.serverRoots.has(normalizedServerRoot)) {\n\t\taddError(diagnostics, `${itemPath}.serverRootUri`, \"duplicates another mapping root\");\n\t}\n\tstate.agentRoots.add(normalizedAgentRoot);\n\tif (normalizedServerRoot) state.serverRoots.add(normalizedServerRoot);\n\tstate.mappings.push({ agentRoot, serverRootUri });\n}\n\nfunction validatePathMappingReversibility(\n\tmappings: LspPathMapping[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (let index = 0; index < mappings.length; index++) {\n\t\tfor (let previous = 0; previous < index; previous++) {\n\t\t\tif (pathMappingsAreReversible(mappings[previous], mappings[index])) continue;\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].agentRoot`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent server URI relationship`,\n\t\t\t);\n\t\t\taddError(\n\t\t\t\tdiagnostics,\n\t\t\t\t`${path}[${index}].serverRootUri`,\n\t\t\t\t`overlaps mapping ${previous} without an equivalent agent path relationship`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction parsePathMappings(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspPathMapping[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array\");\n\t\treturn undefined;\n\t}\n\tconst state: PathMappingParseState = {\n\t\tmappings: [],\n\t\tagentRoots: new Set<string>(),\n\t\tserverRoots: new Set<string>(),\n\t};\n\tfor (const [index, entry] of value.entries()) {\n\t\tparsePathMappingEntry(entry, index, path, diagnostics, state);\n\t}\n\tvalidatePathMappingReversibility(state.mappings, path, diagnostics);\n\treturn state.mappings;\n}\n\nfunction parseClientInfo(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspClientInfo | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set([\"name\", \"version\"]), path, diagnostics);\n\tconst name = parseRequiredString(object.name, `${path}.name`, diagnostics);\n\tconst version = parseOptionalString(object.version, `${path}.version`, diagnostics);\n\treturn name ? { name, ...(version === undefined ? {} : { version }) } : undefined;\n}\n\nfunction parseFeatures(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerFeatures | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(FEATURE_KEYS), path, diagnostics);\n\tconst features: LspServerFeatures = {};\n\tfor (const key of FEATURE_KEYS) {\n\t\tconst setting = parseOptionalBoolean(object[key], `${path}.${key}`, diagnostics);\n\t\tif (setting !== undefined) features[key] = setting;\n\t}\n\treturn features;\n}\n\nfunction parseTimeouts(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspServerTimeouts | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\trejectUnknownKeys(object, new Set(TIMEOUT_KEYS), path, diagnostics);\n\tconst timeouts: LspServerTimeouts = {};\n\tfor (const key of TIMEOUT_KEYS) {\n\t\tconst timeout = parseOptionalInteger(object[key], `${path}.${key}`, diagnostics);\n\t\tif (timeout !== undefined) {\n\t\t\tif (timeout < 0) addError(diagnostics, `${path}.${key}`, \"must be zero or a positive integer\");\n\t\t\telse timeouts[key] = timeout;\n\t\t}\n\t}\n\treturn timeouts;\n}\n\ntype LspJsonParseResult = { ok: true; value: LspJsonValue } | { ok: false };\n\nfunction parseOptionalJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): LspJsonValue | undefined {\n\tif (value === undefined) return undefined;\n\tconst result = parseJson(value, path, diagnostics, new Set<object>());\n\treturn result.ok ? result.value : undefined;\n}\n\nfunction parseJsonArray(\n\tvalue: unknown[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: LspJsonValue[] = [];\n\tlet valid = true;\n\tfor (const [index, item] of value.entries()) {\n\t\tconst parsed = parseJson(item, `${path}[${index}]`, diagnostics, ancestors);\n\t\tif (parsed.ok) output.push(parsed.value);\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJsonObject(\n\tvalue: object,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tancestors.add(value);\n\tconst output: { [key: string]: LspJsonValue } = {};\n\tlet valid = true;\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst parsed = parseJson(item, `${path}.${key}`, diagnostics, ancestors);\n\t\tif (parsed.ok) output[key] = parsed.value;\n\t\telse valid = false;\n\t}\n\tancestors.delete(value);\n\treturn valid ? { ok: true, value: output } : { ok: false };\n}\n\nfunction parseJson(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n\tancestors: Set<object>,\n): LspJsonParseResult {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return { ok: true, value };\n\tif (typeof value === \"number\") {\n\t\tif (Number.isFinite(value)) return { ok: true, value };\n\t\taddError(diagnostics, path, \"must contain only finite JSON numbers\");\n\t\treturn { ok: false };\n\t}\n\tif (typeof value !== \"object\") {\n\t\taddError(diagnostics, path, \"must be valid JSON data\");\n\t\treturn { ok: false };\n\t}\n\tif (ancestors.has(value)) {\n\t\taddError(diagnostics, path, \"must not contain circular references\");\n\t\treturn { ok: false };\n\t}\n\treturn Array.isArray(value)\n\t\t? parseJsonArray(value, path, diagnostics, ancestors)\n\t\t: parseJsonObject(value, path, diagnostics, ancestors);\n}\n\nfunction parseObject(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, unknown> | undefined {\n\tif (typeof value === \"object\" && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;\n\taddError(diagnostics, path, \"must be an object\");\n\treturn undefined;\n}\n\nfunction parseRequiredString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\taddError(diagnostics, path, \"is required and must be a non-empty string\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalString(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string | undefined {\n\tif (value === undefined) return undefined;\n\treturn parseRequiredString(value, path, diagnostics);\n}\n\nfunction parseOptionalBoolean(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"boolean\") {\n\t\taddError(diagnostics, path, \"must be a boolean\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction parseOptionalInteger(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Number.isSafeInteger(value)) {\n\t\taddError(diagnostics, path, \"must be a safe integer\");\n\t\treturn undefined;\n\t}\n\treturn value as number;\n}\n\nfunction parseOptionalEnum<const T extends string>(\n\tvalue: unknown,\n\tallowed: readonly T[],\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): T | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value === \"string\" && allowed.includes(value as T)) return value as T;\n\taddError(diagnostics, path, `must be one of ${allowed.map((item) => JSON.stringify(item)).join(\", \")}`);\n\treturn undefined;\n}\n\nfunction parseOptionalStringArray(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\taddError(diagnostics, path, \"must be an array of strings\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tfor (const [index, item] of value.entries()) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}[${index}]`, \"must be a string\");\n\t\telse output.push(item);\n\t}\n\treturn output;\n}\n\nfunction parseOptionalStringRecord(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tconst object = parseObject(value, path, diagnostics);\n\tif (!object) return undefined;\n\tconst output: Record<string, string> = {};\n\tfor (const [key, item] of Object.entries(object)) {\n\t\tif (typeof item !== \"string\") addError(diagnostics, `${path}.${key}`, \"must be a string\");\n\t\telse output[key] = item;\n\t}\n\treturn output;\n}\n\nfunction parseRequiredUniqueRelativePaths(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): string[] | undefined {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\taddError(diagnostics, path, \"must be a non-empty array of relative paths\");\n\t\treturn undefined;\n\t}\n\tconst output: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const [index, item] of value.entries()) {\n\t\tconst itemPath = `${path}[${index}]`;\n\t\tconst marker = parseRequiredString(item, itemPath, diagnostics);\n\t\tif (!marker) continue;\n\t\tif (!isSafeRelativePath(marker)) addError(diagnostics, itemPath, \"must be a relative path without '..' segments\");\n\t\tif (seen.has(marker)) addError(diagnostics, itemPath, \"duplicates another marker\");\n\t\telse seen.add(marker);\n\t\toutput.push(marker);\n\t}\n\treturn output;\n}\n\nfunction rejectUnknownKeys(\n\tobject: Record<string, unknown>,\n\tallowed: ReadonlySet<string>,\n\tpath: string,\n\tdiagnostics: LspConfigurationDiagnostic[],\n): void {\n\tfor (const key of Object.keys(object)) {\n\t\tif (!allowed.has(key)) addError(diagnostics, `${path}.${key}`, \"is not a recognized property\");\n\t}\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n\tif (posix.isAbsolute(value) || win32.isAbsolute(value)) return false;\n\treturn !value.split(/[\\\\/]/).includes(\"..\");\n}\n\ntype MappingRootDirection = \"left-parent\" | \"right-parent\" | \"equal\";\n\ninterface MappingRootRelation {\n\tdirection: MappingRootDirection;\n\trelative: string;\n\tcaseInsensitive: boolean;\n}\n\nfunction agentRootRelation(left: string, right: string): MappingRootRelation | undefined {\n\tconst leftFlavor = pathFlavor(left);\n\tconst rightFlavor = pathFlavor(right);\n\tif (leftFlavor !== rightFlavor) return undefined;\n\tconst normalizedLeft = normalizePortablePath(left, leftFlavor);\n\tconst normalizedRight = normalizePortablePath(right, rightFlavor);\n\tconst comparableLeft = leftFlavor === \"windows\" ? normalizedLeft.toLowerCase() : normalizedLeft;\n\tconst comparableRight = rightFlavor === \"windows\" ? normalizedRight.toLowerCase() : normalizedRight;\n\tif (comparableLeft === comparableRight) {\n\t\treturn { direction: \"equal\", relative: \"\", caseInsensitive: leftFlavor === \"windows\" };\n\t}\n\tconst fromLeft = relativeWithin(normalizedLeft, normalizedRight);\n\tif (fromLeft !== undefined) {\n\t\treturn {\n\t\t\tdirection: \"left-parent\",\n\t\t\trelative: fromLeft.replace(/\\\\/g, \"/\"),\n\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t};\n\t}\n\tconst fromRight = relativeWithin(normalizedRight, normalizedLeft);\n\treturn fromRight === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tdirection: \"right-parent\",\n\t\t\t\trelative: fromRight.replace(/\\\\/g, \"/\"),\n\t\t\t\tcaseInsensitive: leftFlavor === \"windows\",\n\t\t\t};\n}\n\nfunction serverRootRelation(leftValue: string, rightValue: string): MappingRootRelation | undefined {\n\tif (!canonicalFileUri(leftValue) || !canonicalFileUri(rightValue)) return undefined;\n\tconst left = new URL(leftValue);\n\tconst right = new URL(rightValue);\n\tif (left.hostname.toLowerCase() !== right.hostname.toLowerCase()) return undefined;\n\tconst leftSegments = left.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst rightSegments = right.pathname\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => decodeURIComponent(segment));\n\tconst caseInsensitive =\n\t\tleft.hostname.length > 0 ||\n\t\tright.hostname.length > 0 ||\n\t\tleftSegments[0]?.endsWith(\":\") === true ||\n\t\trightSegments[0]?.endsWith(\":\") === true;\n\tconst comparable = (segment: string) => (caseInsensitive ? segment.toLowerCase() : segment);\n\tlet shared = 0;\n\twhile (\n\t\tshared < leftSegments.length &&\n\t\tshared < rightSegments.length &&\n\t\tcomparable(leftSegments[shared]) === comparable(rightSegments[shared])\n\t) {\n\t\tshared++;\n\t}\n\tif (shared < Math.min(leftSegments.length, rightSegments.length)) return undefined;\n\tif (leftSegments.length === rightSegments.length) return { direction: \"equal\", relative: \"\", caseInsensitive };\n\treturn leftSegments.length < rightSegments.length\n\t\t? { direction: \"left-parent\", relative: rightSegments.slice(shared).join(\"/\"), caseInsensitive }\n\t\t: { direction: \"right-parent\", relative: leftSegments.slice(shared).join(\"/\"), caseInsensitive };\n}\n\nfunction pathMappingsAreReversible(left: LspPathMapping, right: LspPathMapping): boolean {\n\tconst agent = agentRootRelation(left.agentRoot, right.agentRoot);\n\tconst server = serverRootRelation(left.serverRootUri, right.serverRootUri);\n\tif (!agent || !server) return agent === undefined && server === undefined;\n\tif (agent.direction !== server.direction) return false;\n\treturn agent.caseInsensitive && server.caseInsensitive\n\t\t? agent.relative.toLowerCase() === server.relative.toLowerCase()\n\t\t: agent.relative === server.relative;\n}\n\nfunction normalizeAgentRoot(value: string): string {\n\tconst flavor = pathFlavor(value);\n\tconst api = pathApi(flavor);\n\tconst normalized = normalizePortablePath(value, flavor);\n\tconst root = api.parse(normalized).root;\n\tconst trailingSeparator = flavor === \"windows\" ? /[\\\\/]+$/ : /\\/+$/;\n\tconst withoutTrailingSeparators = normalized === root ? normalized : normalized.replace(trailingSeparator, \"\");\n\treturn flavor === \"windows\" ? withoutTrailingSeparators.toLowerCase() : withoutTrailingSeparators;\n}\n\nfunction isAbsoluteNamedPipe(value: string): boolean {\n\tconst lower = value.toLowerCase();\n\tconst prefixes = [\"\\\\\\\\.\\\\pipe\\\\\", \"\\\\\\\\?\\\\pipe\\\\\"];\n\treturn prefixes.some((prefix) => lower.startsWith(prefix) && value.length > prefix.length);\n}\n\nfunction canonicalFileUri(value: string): string | undefined {\n\tif (!/^file:\\//i.test(value)) return undefined;\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (url.protocol !== \"file:\" || url.pathname.length === 0 || url.search !== \"\" || url.hash !== \"\")\n\t\t\treturn undefined;\n\t\tconst segments = url.pathname\n\t\t\t.split(\"/\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((segment) => decodeURIComponent(segment));\n\t\tif (segments.some((segment) => segment.includes(\"/\") || segment === \".\" || segment === \"..\")) return undefined;\n\t\tif (url.hostname && segments.length === 0) return undefined;\n\t\tif (segments[0]?.endsWith(\":\") && segments.length === 1 && !url.pathname.endsWith(\"/\")) return undefined;\n\t\tconst driveRoot = segments[0]?.endsWith(\":\") && segments.length === 1;\n\t\turl.pathname = `/${segments.map((segment) => encodeURIComponent(segment)).join(\"/\")}${driveRoot ? \"/\" : \"\"}`;\n\t\turl.hostname = url.hostname.toLowerCase();\n\t\treturn url.toString();\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isAbsoluteFileUri(value: string): boolean {\n\treturn canonicalFileUri(value) !== undefined;\n}\n\nfunction addError(diagnostics: LspConfigurationDiagnostic[], path: string, message: string): void {\n\tdiagnostics.push({ severity: \"error\", path, message });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,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;AAOxD,QAAA,MAAM,iBAAiB;;EAIrB,CAAC;AAIH,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;CACnB;AAkLD,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,iBAAiB,EAAE,qBAAqB,CAAC,CAgGjE;AAED,wBAAsB,mCAAmC,CACxD,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B","sourcesContent":["import { Text } from \"@greppleai/grip-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { type Diagnostic, DiagnosticSeverity } from \"vscode-languageserver-protocol\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\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, LspClientRouteFailure } from \"./manager.ts\";\nimport { relativePortablePath } from \"./portable-path.ts\";\n\nconst DIAGNOSTICS_SETTLE_DELAY_MS = 250;\nconst AUTO_DIAGNOSTICS_MAX_ERRORS = 10;\n\nconst diagnosticsSchema = Type.Object({\n\tpath: Type.String({\n\t\tdescription: \"File path to get diagnostics for. Use '*' for cached diagnostics from running servers.\",\n\t}),\n});\n\ntype DiagnosticsInput = Static<typeof diagnosticsSchema>;\n\nexport interface LspDiagnosticsDetails {\n\tcount: number;\n\terrors: number;\n\twarnings: number;\n\tfiles: number;\n\tunavailable?: true;\n}\n\ninterface DiagnosticEntry {\n\tfilePath: string;\n\tdiagnostic: Diagnostic;\n\tsources: string[];\n\tidentity: string;\n}\n\ninterface FormattedDiagnostics {\n\ttext: string;\n\tdetails: LspDiagnosticsDetails;\n}\n\nfunction diagnosticSeverityName(severity: number | undefined): string {\n\tswitch (severity) {\n\t\tcase DiagnosticSeverity.Error:\n\t\t\treturn \"error\";\n\t\tcase DiagnosticSeverity.Warning:\n\t\t\treturn \"warning\";\n\t\tcase DiagnosticSeverity.Information:\n\t\t\treturn \"info\";\n\t\tcase DiagnosticSeverity.Hint:\n\t\t\treturn \"hint\";\n\t\tdefault:\n\t\t\treturn \"unknown\";\n\t}\n}\n\nfunction diagnosticLine(entry: DiagnosticEntry, attribute: boolean): string {\n\tconst line = entry.diagnostic.range.start.line + 1;\n\tconst column = entry.diagnostic.range.start.character + 1;\n\tconst severity = diagnosticSeverityName(entry.diagnostic.severity);\n\tconst code = entry.diagnostic.code === undefined ? \"\" : ` (${String(entry.diagnostic.code)})`;\n\tconst source = entry.diagnostic.source ? ` [${entry.diagnostic.source}]` : \"\";\n\tconst providers = attribute ? ` {LSP: ${entry.sources.join(\", \")}}` : \"\";\n\treturn `${entry.filePath}:${line}:${column} ${severity}: ${entry.diagnostic.message}${code}${source}${providers}`;\n}\n\nfunction createDiagnosticEntry(\n\troute: LspClientRoute,\n\tfilePath: string,\n\tdiagnostic: Diagnostic,\n\tsource: string,\n): DiagnosticEntry {\n\tconst relatedInformation = diagnostic.relatedInformation?.map((information) => {\n\t\tconst mapped = route.target.mapper.serverUriToAgentPath(information.location.uri);\n\t\treturn {\n\t\t\tmessage: information.message,\n\t\t\tlocation: {\n\t\t\t\turi: mapped.ok ? mapped.value : `[unmapped URI: ${mapped.reason}]`,\n\t\t\t\trange: information.location.range,\n\t\t\t},\n\t\t};\n\t});\n\tconst identity = JSON.stringify({\n\t\tfilePath,\n\t\trange: diagnostic.range,\n\t\tseverity: diagnostic.severity,\n\t\tcode: diagnostic.code,\n\t\tcodeDescription: diagnostic.codeDescription,\n\t\tsource: diagnostic.source,\n\t\tmessage: diagnostic.message,\n\t\ttags: diagnostic.tags,\n\t\trelatedInformation,\n\t\tdata: diagnostic.data,\n\t});\n\treturn { filePath, diagnostic, sources: [source], identity };\n}\n\nfunction mergeDiagnosticEntries(entries: readonly DiagnosticEntry[]): DiagnosticEntry[] {\n\tconst merged = new Map<string, DiagnosticEntry>();\n\tfor (const entry of entries) {\n\t\tconst key = entry.identity;\n\t\tconst existing = merged.get(key);\n\t\tif (existing) {\n\t\t\tfor (const source of entry.sources) {\n\t\t\t\tif (!existing.sources.includes(source)) existing.sources.push(source);\n\t\t\t}\n\t\t} else {\n\t\t\tmerged.set(key, { ...entry, sources: [...entry.sources] });\n\t\t}\n\t}\n\treturn [...merged.values()];\n}\n\nfunction summarizeDiagnostics(entries: readonly DiagnosticEntry[]): LspDiagnosticsDetails {\n\tlet errors = 0;\n\tlet warnings = 0;\n\tfor (const entry of entries) {\n\t\tif (entry.diagnostic.severity === DiagnosticSeverity.Error) errors++;\n\t\telse if (entry.diagnostic.severity === DiagnosticSeverity.Warning) warnings++;\n\t}\n\treturn {\n\t\tcount: entries.length,\n\t\terrors,\n\t\twarnings,\n\t\tfiles: new Set(entries.map((entry) => entry.filePath)).size,\n\t};\n}\n\nfunction formatDiagnosticEntries(entries: DiagnosticEntry[], attribute: boolean): FormattedDiagnostics {\n\tconst details = summarizeDiagnostics(entries);\n\tif (entries.length === 0) return { text: \"No diagnostics.\", details };\n\tconst other = entries.length - details.errors - details.warnings;\n\tconst summary = [\n\t\t`${entries.length} diagnostic(s)`,\n\t\tdetails.errors > 0 ? `${details.errors} error(s)` : undefined,\n\t\tdetails.warnings > 0 ? `${details.warnings} warning(s)` : undefined,\n\t\tother > 0 ? `${other} other` : undefined,\n\t]\n\t\t.filter((part): part is string => part !== undefined)\n\t\t.join(\", \");\n\treturn {\n\t\ttext: `${summary}\\n\\n${entries.map((entry) => diagnosticLine(entry, attribute)).join(\"\\n\")}`,\n\t\tdetails,\n\t};\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 delay(ms: number, signal?: AbortSignal): Promise<void> {\n\tthrowIfAborted(signal);\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tclearTimeout(timer);\n\t\t\ttry {\n\t\t\t\tthrowIfAborted(signal);\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nfunction cachedWorkspaceDiagnostics(state: LspRuntimeState): AgentToolResult<LspDiagnosticsDetails> {\n\tconst routes = state.manager\n\t\t.getRunningClients()\n\t\t.filter((route) => route.target.server.features?.diagnostics !== false);\n\tif (routes.length === 0) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: \"No capable running LSP server is available for cached diagnostics.\" }],\n\t\t\tdetails: { count: 0, errors: 0, warnings: 0, files: 0, unavailable: true },\n\t\t};\n\t}\n\tconst formatted = formatWorkspaceDiagnostics(state, routes);\n\treturn { content: [{ type: \"text\", text: formatted.text }], details: formatted.details };\n}\n\nfunction renderCompactDiagnosticsResult(details: LspDiagnosticsDetails, theme: Theme): Text {\n\tif (details.count === 0) {\n\t\treturn new Text(\n\t\t\ttheme.fg(\n\t\t\t\tdetails.unavailable ? \"error\" : \"success\",\n\t\t\t\tdetails.unavailable ? \"LSP unavailable\" : \"No diagnostics\",\n\t\t\t),\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst parts = [`${details.count} diagnostic(s)`];\n\tif (details.errors > 0) parts.push(`${details.errors} error(s)`);\n\tif (details.warnings > 0) parts.push(`${details.warnings} warning(s)`);\n\treturn new Text(theme.fg(details.errors > 0 ? \"error\" : \"warning\", parts.join(\", \")), 0, 0);\n}\n\nexport function createLspDiagnosticsTool(\n\tgetState: () => LspRuntimeState,\n\tgetOperations?: () => ToolOperations,\n): ToolDefinition<typeof diagnosticsSchema, LspDiagnosticsDetails> {\n\treturn {\n\t\tname: \"lsp_diagnostics\",\n\t\tlabel: \"lsp_diagnostics\",\n\t\tdescription:\n\t\t\t\"Get diagnostics from all matching configured LSP servers for a file. Identical diagnostics are deduplicated and distinct providers are attributed. Use '*' for cached diagnostics from running instances.\",\n\t\tpromptSnippet: \"Get diagnostics for a source file from configured language servers\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use lsp_diagnostics after code edits when a matching language server is available.\",\n\t\t\t\"Use path='*' only to inspect cached diagnostics from already-running LSP servers.\",\n\t\t],\n\t\tparameters: diagnosticsSchema,\n\t\tasync execute(_toolCallId, params: DiagnosticsInput, signal, _onUpdate, ctx) {\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst state = getState();\n\t\t\tconst operations = getOperations?.() ?? ctx.toolOperations;\n\t\t\tawait state.manager.setToolOperations(operations, signal);\n\t\t\tif (params.path === \"*\") return cachedWorkspaceDiagnostics(state);\n\t\t\tlet collection = await state.manager.getClientRoutesForFeature(params.path, \"diagnostics\", signal);\n\t\t\tif (collection.routes.length === 0) {\n\t\t\t\tconst message =\n\t\t\t\t\tcollection.matchedServerCount === 0\n\t\t\t\t\t\t? await state.manager.getUnavailableReason(params.path, signal)\n\t\t\t\t\t\t: `No capable LSP server is available for diagnostics.${failureText(collection.failures)}`;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: message }],\n\t\t\t\t\tdetails: { count: 0, errors: 0, warnings: 0, files: 0, unavailable: true },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst synchronization = await state.fileSync.synchronizeFileRead(params.path, operations, signal);\n\t\t\tif (synchronization.lifecycleCancelled) {\n\t\t\t\tcollection = {\n\t\t\t\t\t...collection,\n\t\t\t\t\troutes: [],\n\t\t\t\t\tfailures: [\n\t\t\t\t\t\t...collection.failures,\n\t\t\t\t\t\t...collection.routes.map((route) => ({\n\t\t\t\t\t\t\tserverId: route.target.serverId,\n\t\t\t\t\t\t\treason: \"synchronization was cancelled by an LSP lifecycle change\",\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\tif (synchronization.failures.length > 0) {\n\t\t\t\tconst failedInstances = new Set(synchronization.failures.map((failure) => failure.instanceKey));\n\t\t\t\tcollection = {\n\t\t\t\t\t...collection,\n\t\t\t\t\troutes: collection.routes.filter((route) => !failedInstances.has(route.target.instanceKey)),\n\t\t\t\t\tfailures: [\n\t\t\t\t\t\t...collection.failures,\n\t\t\t\t\t\t...synchronization.failures.map((failure) => ({\n\t\t\t\t\t\t\tserverId: failure.serverId,\n\t\t\t\t\t\t\treason: failure.reason,\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\tif (collection.routes.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 capable LSP server is available for diagnostics.${failureText(collection.failures)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { count: 0, errors: 0, warnings: 0, files: 0, unavailable: true },\n\t\t\t\t};\n\t\t\t}\n\t\t\tawait delay(DIAGNOSTICS_SETTLE_DELAY_MS, signal);\n\t\t\tconst relativePath = relativePortablePath(state.manager.cwd, state.manager.resolvePath(params.path));\n\t\t\tconst entries = mergeDiagnosticEntries(\n\t\t\t\tcollection.routes.flatMap((route) =>\n\t\t\t\t\troute.client\n\t\t\t\t\t\t.getDiagnostics(route.target.serverUri)\n\t\t\t\t\t\t.map((diagnostic) => createDiagnosticEntry(route, relativePath, diagnostic, route.target.serverId)),\n\t\t\t\t),\n\t\t\t).sort(compareDiagnostics);\n\t\t\tconst formatted = formatDiagnosticEntries(entries, collection.matchedServerCount > 1);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `${formatted.text}${failureText(collection.failures)}` }],\n\t\t\t\tdetails: formatted.details,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\tconst path = args.path === \"*\" ? \"cached workspace\" : args.path;\n\t\t\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(\"lsp_diagnostics\"))} ${theme.fg(\"accent\", path)}`, 0, 0);\n\t\t},\n\t\trenderResult(result, { expanded }, theme) {\n\t\t\tconst details = result.details;\n\t\t\tif (expanded) {\n\t\t\t\tconst output = result.content.flatMap((part) => (part.type === \"text\" ? [part.text] : [])).join(\"\\n\");\n\t\t\t\treturn new Text(theme.fg(details.unavailable ? \"error\" : \"toolOutput\", output), 0, 0);\n\t\t\t}\n\t\t\treturn renderCompactDiagnosticsResult(details, theme);\n\t\t},\n\t};\n}\n\nexport async function formatAutoDiagnosticsForChangedFile(\n\tstate: LspRuntimeState,\n\tfilePath: string,\n): Promise<string | undefined> {\n\tconst targets = (await state.manager.resolveTargets(filePath)).targets;\n\tconst routes = targets.flatMap((target) => {\n\t\tif (target.server.features?.diagnostics === false) return [];\n\t\tconst client = state.manager.getRunningClient(target.instanceKey);\n\t\treturn client ? [{ client, target }] : [];\n\t});\n\tif (routes.length === 0) return undefined;\n\tawait delay(DIAGNOSTICS_SETTLE_DELAY_MS);\n\tconst relativePath = relativePortablePath(state.manager.cwd, state.manager.resolvePath(filePath));\n\tconst errors = mergeDiagnosticEntries(\n\t\troutes.flatMap((route) =>\n\t\t\troute.client\n\t\t\t\t.getDiagnostics(route.target.serverUri)\n\t\t\t\t.filter((diagnostic) => diagnostic.severity === DiagnosticSeverity.Error)\n\t\t\t\t.map((diagnostic) => createDiagnosticEntry(route, relativePath, diagnostic, route.target.serverId)),\n\t\t),\n\t).sort(compareDiagnostics);\n\tif (errors.length === 0) return undefined;\n\tconst shown = errors.slice(0, AUTO_DIAGNOSTICS_MAX_ERRORS);\n\tconst lines = shown.map((entry) => diagnosticLine(entry, routes.length > 1));\n\tif (errors.length > shown.length) lines.push(`... and ${errors.length - shown.length} more error(s)`);\n\treturn `LSP: ${errors.length} error(s) in ${relativePath}:\\n${lines.join(\"\\n\")}`;\n}\n\nfunction formatWorkspaceDiagnostics(state: LspRuntimeState, routes: readonly LspClientRoute[]): FormattedDiagnostics {\n\tconst entries: DiagnosticEntry[] = [];\n\tfor (const route of routes) {\n\t\tif (route.target.server.features?.diagnostics === false) continue;\n\t\tconst identity = `server=${route.target.serverId} root=${route.target.workspaceRoot}`;\n\t\tfor (const [uri, diagnostics] of route.client.getAllDiagnostics()) {\n\t\t\tconst mapped = route.target.mapper.serverUriToAgentPath(uri);\n\t\t\tconst filePath = mapped.ok\n\t\t\t\t? relativePortablePath(state.manager.cwd, mapped.value)\n\t\t\t\t: `[unmapped URI: ${mapped.reason}]`;\n\t\t\tfor (const diagnostic of diagnostics)\n\t\t\t\tentries.push(createDiagnosticEntry(route, filePath, diagnostic, identity));\n\t\t}\n\t}\n\treturn formatDiagnosticEntries(mergeDiagnosticEntries(entries).sort(compareDiagnostics), true);\n}\n\nfunction compareDiagnostics(left: DiagnosticEntry, right: DiagnosticEntry): number {\n\tconst severity = (left.diagnostic.severity ?? 99) - (right.diagnostic.severity ?? 99);\n\tif (severity !== 0) return severity;\n\tconst path = left.filePath.localeCompare(right.filePath);\n\tif (path !== 0) return path;\n\tconst line = left.diagnostic.range.start.line - right.diagnostic.range.start.line;\n\tif (line !== 0) return line;\n\tconst character = left.diagnostic.range.start.character - right.diagnostic.range.start.character;\n\tif (character !== 0) return character;\n\treturn left.diagnostic.message.localeCompare(right.diagnostic.message);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,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;AAOxD,QAAA,MAAM,iBAAiB;;EAIrB,CAAC;AAIH,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;CACnB;AAkLD,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,eAAe,EAC/B,aAAa,CAAC,EAAE,MAAM,cAAc,GAClC,cAAc,CAAC,OAAO,iBAAiB,EAAE,qBAAqB,CAAC,CAgGjE;AAED,wBAAsB,mCAAmC,CACxD,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B"}
|