@chances-ai/engine 24.0.0
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/dist/agents/discover.d.ts +30 -0
- package/dist/agents/discover.d.ts.map +1 -0
- package/dist/agents/discover.js +183 -0
- package/dist/agents/discover.js.map +1 -0
- package/dist/agents/index.d.ts +20 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +52 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/parse.d.ts +61 -0
- package/dist/agents/parse.d.ts.map +1 -0
- package/dist/agents/parse.js +527 -0
- package/dist/agents/parse.js.map +1 -0
- package/dist/agents/types.d.ts +52 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.js +125 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
- package/dist/ai/adapters/ai-sdk.d.ts +56 -0
- package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk.js +112 -0
- package/dist/ai/adapters/ai-sdk.js.map +1 -0
- package/dist/ai/adapters/mock.d.ts +13 -0
- package/dist/ai/adapters/mock.d.ts.map +1 -0
- package/dist/ai/adapters/mock.js +54 -0
- package/dist/ai/adapters/mock.js.map +1 -0
- package/dist/ai/adapters/openai-compatible.d.ts +23 -0
- package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/ai/adapters/openai-compatible.js +45 -0
- package/dist/ai/adapters/openai-compatible.js.map +1 -0
- package/dist/ai/cost.d.ts +3 -0
- package/dist/ai/cost.d.ts.map +1 -0
- package/dist/ai/cost.js +5 -0
- package/dist/ai/cost.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/known-models.d.ts +20 -0
- package/dist/ai/known-models.d.ts.map +1 -0
- package/dist/ai/known-models.js +129 -0
- package/dist/ai/known-models.js.map +1 -0
- package/dist/ai/registry.d.ts +12 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/registry.js +24 -0
- package/dist/ai/registry.js.map +1 -0
- package/dist/ai/retry.d.ts +11 -0
- package/dist/ai/retry.d.ts.map +1 -0
- package/dist/ai/retry.js +14 -0
- package/dist/ai/retry.js.map +1 -0
- package/dist/ai/router.d.ts +25 -0
- package/dist/ai/router.d.ts.map +1 -0
- package/dist/ai/router.js +36 -0
- package/dist/ai/router.js.map +1 -0
- package/dist/ai/setup.d.ts +23 -0
- package/dist/ai/setup.d.ts.map +1 -0
- package/dist/ai/setup.js +47 -0
- package/dist/ai/setup.js.map +1 -0
- package/dist/ai/summarizer.d.ts +24 -0
- package/dist/ai/summarizer.d.ts.map +1 -0
- package/dist/ai/summarizer.js +56 -0
- package/dist/ai/summarizer.js.map +1 -0
- package/dist/ai/types.d.ts +83 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/core/compaction/circuit-breaker.d.ts +32 -0
- package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
- package/dist/core/compaction/circuit-breaker.js +42 -0
- package/dist/core/compaction/circuit-breaker.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +75 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +261 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/estimate.d.ts +39 -0
- package/dist/core/compaction/estimate.d.ts.map +1 -0
- package/dist/core/compaction/estimate.js +74 -0
- package/dist/core/compaction/estimate.js.map +1 -0
- package/dist/core/compaction/index.d.ts +5 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +5 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/prune.d.ts +43 -0
- package/dist/core/compaction/prune.d.ts.map +1 -0
- package/dist/core/compaction/prune.js +51 -0
- package/dist/core/compaction/prune.js.map +1 -0
- package/dist/core/engine.d.ts +268 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +767 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/task-tool.d.ts +175 -0
- package/dist/core/task-tool.d.ts.map +1 -0
- package/dist/core/task-tool.js +901 -0
- package/dist/core/task-tool.js.map +1 -0
- package/dist/core/workspace-query.d.ts +83 -0
- package/dist/core/workspace-query.d.ts.map +1 -0
- package/dist/core/workspace-query.js +217 -0
- package/dist/core/workspace-query.js.map +1 -0
- package/dist/core/worktree/active-marker.d.ts +31 -0
- package/dist/core/worktree/active-marker.d.ts.map +1 -0
- package/dist/core/worktree/active-marker.js +109 -0
- package/dist/core/worktree/active-marker.js.map +1 -0
- package/dist/core/worktree/create.d.ts +40 -0
- package/dist/core/worktree/create.d.ts.map +1 -0
- package/dist/core/worktree/create.js +121 -0
- package/dist/core/worktree/create.js.map +1 -0
- package/dist/core/worktree/errors.d.ts +7 -0
- package/dist/core/worktree/errors.d.ts.map +1 -0
- package/dist/core/worktree/errors.js +11 -0
- package/dist/core/worktree/errors.js.map +1 -0
- package/dist/core/worktree/gc.d.ts +39 -0
- package/dist/core/worktree/gc.d.ts.map +1 -0
- package/dist/core/worktree/gc.js +146 -0
- package/dist/core/worktree/gc.js.map +1 -0
- package/dist/core/worktree/git.d.ts +53 -0
- package/dist/core/worktree/git.d.ts.map +1 -0
- package/dist/core/worktree/git.js +166 -0
- package/dist/core/worktree/git.js.map +1 -0
- package/dist/core/worktree/index.d.ts +8 -0
- package/dist/core/worktree/index.d.ts.map +1 -0
- package/dist/core/worktree/index.js +8 -0
- package/dist/core/worktree/index.js.map +1 -0
- package/dist/core/worktree/paths.d.ts +26 -0
- package/dist/core/worktree/paths.d.ts.map +1 -0
- package/dist/core/worktree/paths.js +57 -0
- package/dist/core/worktree/paths.js.map +1 -0
- package/dist/core/worktree/slug.d.ts +6 -0
- package/dist/core/worktree/slug.d.ts.map +1 -0
- package/dist/core/worktree/slug.js +21 -0
- package/dist/core/worktree/slug.js.map +1 -0
- package/dist/local-vault/file-store.d.ts +64 -0
- package/dist/local-vault/file-store.d.ts.map +1 -0
- package/dist/local-vault/file-store.js +225 -0
- package/dist/local-vault/file-store.js.map +1 -0
- package/dist/local-vault/index.d.ts +57 -0
- package/dist/local-vault/index.d.ts.map +1 -0
- package/dist/local-vault/index.js +68 -0
- package/dist/local-vault/index.js.map +1 -0
- package/dist/local-vault/keychain.d.ts +58 -0
- package/dist/local-vault/keychain.d.ts.map +1 -0
- package/dist/local-vault/keychain.js +200 -0
- package/dist/local-vault/keychain.js.map +1 -0
- package/dist/local-vault/mutex.d.ts +20 -0
- package/dist/local-vault/mutex.d.ts.map +1 -0
- package/dist/local-vault/mutex.js +44 -0
- package/dist/local-vault/mutex.js.map +1 -0
- package/dist/local-vault/passphrase.d.ts +30 -0
- package/dist/local-vault/passphrase.d.ts.map +1 -0
- package/dist/local-vault/passphrase.js +72 -0
- package/dist/local-vault/passphrase.js.map +1 -0
- package/dist/lsp/config.d.ts +34 -0
- package/dist/lsp/config.d.ts.map +1 -0
- package/dist/lsp/config.js +68 -0
- package/dist/lsp/config.js.map +1 -0
- package/dist/lsp/detect.d.ts +7 -0
- package/dist/lsp/detect.d.ts.map +1 -0
- package/dist/lsp/detect.js +78 -0
- package/dist/lsp/detect.js.map +1 -0
- package/dist/lsp/errors.d.ts +11 -0
- package/dist/lsp/errors.d.ts.map +1 -0
- package/dist/lsp/errors.js +11 -0
- package/dist/lsp/errors.js.map +1 -0
- package/dist/lsp/formatters.d.ts +147 -0
- package/dist/lsp/formatters.d.ts.map +1 -0
- package/dist/lsp/formatters.js +259 -0
- package/dist/lsp/formatters.js.map +1 -0
- package/dist/lsp/index.d.ts +31 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +31 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/instance.d.ts +72 -0
- package/dist/lsp/instance.d.ts.map +1 -0
- package/dist/lsp/instance.js +489 -0
- package/dist/lsp/instance.js.map +1 -0
- package/dist/lsp/lazy-load.d.ts +27 -0
- package/dist/lsp/lazy-load.d.ts.map +1 -0
- package/dist/lsp/lazy-load.js +57 -0
- package/dist/lsp/lazy-load.js.map +1 -0
- package/dist/lsp/manager.d.ts +59 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +242 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/ops.d.ts +13 -0
- package/dist/lsp/ops.d.ts.map +1 -0
- package/dist/lsp/ops.js +225 -0
- package/dist/lsp/ops.js.map +1 -0
- package/dist/lsp/rpc.d.ts +47 -0
- package/dist/lsp/rpc.d.ts.map +1 -0
- package/dist/lsp/rpc.js +134 -0
- package/dist/lsp/rpc.js.map +1 -0
- package/dist/lsp/safe-uri.d.ts +18 -0
- package/dist/lsp/safe-uri.d.ts.map +1 -0
- package/dist/lsp/safe-uri.js +96 -0
- package/dist/lsp/safe-uri.js.map +1 -0
- package/dist/lsp/types.d.ts +70 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +57 -0
- package/dist/mcp/bridge.d.ts.map +1 -0
- package/dist/mcp/bridge.js +98 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/category.d.ts +22 -0
- package/dist/mcp/category.d.ts.map +1 -0
- package/dist/mcp/category.js +11 -0
- package/dist/mcp/category.js.map +1 -0
- package/dist/mcp/client.d.ts +228 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +352 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/content.d.ts +86 -0
- package/dist/mcp/content.d.ts.map +1 -0
- package/dist/mcp/content.js +147 -0
- package/dist/mcp/content.js.map +1 -0
- package/dist/mcp/env.d.ts +19 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +50 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/host.d.ts +199 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +530 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/index.d.ts +18 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/load-mcp-host.d.ts +32 -0
- package/dist/mcp/load-mcp-host.d.ts.map +1 -0
- package/dist/mcp/load-mcp-host.js +49 -0
- package/dist/mcp/load-mcp-host.js.map +1 -0
- package/dist/mcp/oauth/callback-server.d.ts +73 -0
- package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
- package/dist/mcp/oauth/callback-server.js +280 -0
- package/dist/mcp/oauth/callback-server.js.map +1 -0
- package/dist/mcp/oauth/config-hash.d.ts +24 -0
- package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
- package/dist/mcp/oauth/config-hash.js +55 -0
- package/dist/mcp/oauth/config-hash.js.map +1 -0
- package/dist/mcp/oauth/error-normalize.d.ts +39 -0
- package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
- package/dist/mcp/oauth/error-normalize.js +91 -0
- package/dist/mcp/oauth/error-normalize.js.map +1 -0
- package/dist/mcp/oauth/provider.d.ts +190 -0
- package/dist/mcp/oauth/provider.d.ts.map +1 -0
- package/dist/mcp/oauth/provider.js +305 -0
- package/dist/mcp/oauth/provider.js.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.js +77 -0
- package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.js +21 -0
- package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
- package/dist/mcp/parse.d.ts +28 -0
- package/dist/mcp/parse.d.ts.map +1 -0
- package/dist/mcp/parse.js +209 -0
- package/dist/mcp/parse.js.map +1 -0
- package/dist/mcp/prompts.d.ts +31 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +71 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/redact.d.ts +62 -0
- package/dist/mcp/redact.d.ts.map +1 -0
- package/dist/mcp/redact.js +87 -0
- package/dist/mcp/redact.js.map +1 -0
- package/dist/mcp/resources.d.ts +70 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +170 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/types.d.ts +123 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/frontmatter.d.ts +18 -0
- package/dist/memory/frontmatter.d.ts.map +1 -0
- package/dist/memory/frontmatter.js +81 -0
- package/dist/memory/frontmatter.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +44 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +237 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/tools.d.ts +11 -0
- package/dist/memory/tools.d.ts.map +1 -0
- package/dist/memory/tools.js +159 -0
- package/dist/memory/tools.js.map +1 -0
- package/dist/memory/types.d.ts +32 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugin-api/index.d.ts +167 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +151 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-logger/index.d.ts +21 -0
- package/dist/plugin-logger/index.d.ts.map +1 -0
- package/dist/plugin-logger/index.js +59 -0
- package/dist/plugin-logger/index.js.map +1 -0
- package/dist/session/index.d.ts +125 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +202 -0
- package/dist/session/index.js.map +1 -0
- package/dist/tools/approval.d.ts +33 -0
- package/dist/tools/approval.d.ts.map +1 -0
- package/dist/tools/approval.js +53 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +94 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -0
- package/dist/tools/builtins/_shared.js +246 -0
- package/dist/tools/builtins/_shared.js.map +1 -0
- package/dist/tools/builtins/ask-user-question.d.ts +27 -0
- package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
- package/dist/tools/builtins/ask-user-question.js +191 -0
- package/dist/tools/builtins/ask-user-question.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +3 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -0
- package/dist/tools/builtins/bash.js +158 -0
- package/dist/tools/builtins/bash.js.map +1 -0
- package/dist/tools/builtins/diff.d.ts +3 -0
- package/dist/tools/builtins/diff.d.ts.map +1 -0
- package/dist/tools/builtins/diff.js +83 -0
- package/dist/tools/builtins/diff.js.map +1 -0
- package/dist/tools/builtins/edit.d.ts +3 -0
- package/dist/tools/builtins/edit.d.ts.map +1 -0
- package/dist/tools/builtins/edit.js +40 -0
- package/dist/tools/builtins/edit.js.map +1 -0
- package/dist/tools/builtins/glob.d.ts +3 -0
- package/dist/tools/builtins/glob.d.ts.map +1 -0
- package/dist/tools/builtins/glob.js +37 -0
- package/dist/tools/builtins/glob.js.map +1 -0
- package/dist/tools/builtins/grep.d.ts +3 -0
- package/dist/tools/builtins/grep.d.ts.map +1 -0
- package/dist/tools/builtins/grep.js +81 -0
- package/dist/tools/builtins/grep.js.map +1 -0
- package/dist/tools/builtins/lsp.d.ts +3 -0
- package/dist/tools/builtins/lsp.d.ts.map +1 -0
- package/dist/tools/builtins/lsp.js +102 -0
- package/dist/tools/builtins/lsp.js.map +1 -0
- package/dist/tools/builtins/pty.d.ts +64 -0
- package/dist/tools/builtins/pty.d.ts.map +1 -0
- package/dist/tools/builtins/pty.js +536 -0
- package/dist/tools/builtins/pty.js.map +1 -0
- package/dist/tools/builtins/read.d.ts +3 -0
- package/dist/tools/builtins/read.d.ts.map +1 -0
- package/dist/tools/builtins/read.js +18 -0
- package/dist/tools/builtins/read.js.map +1 -0
- package/dist/tools/builtins/web-fetch.d.ts +4 -0
- package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtins/web-fetch.js +353 -0
- package/dist/tools/builtins/web-fetch.js.map +1 -0
- package/dist/tools/builtins/write.d.ts +3 -0
- package/dist/tools/builtins/write.d.ts.map +1 -0
- package/dist/tools/builtins/write.js +48 -0
- package/dist/tools/builtins/write.js.map +1 -0
- package/dist/tools/builtins.d.ts +9 -0
- package/dist/tools/builtins.d.ts.map +1 -0
- package/dist/tools/builtins.js +29 -0
- package/dist/tools/builtins.js.map +1 -0
- package/dist/tools/diff.d.ts +18 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +57 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +120 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +208 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +19 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +244 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +15 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (4.2) LspServerInstance — one process + connection + open-doc LRU
|
|
3
|
+
* per `(command, cwd)` cache slot.
|
|
4
|
+
*
|
|
5
|
+
* State machine: 'stopped' → 'starting' → 'running' → ('stopping' |
|
|
6
|
+
* 'error' → 'starting' (up to maxRestarts) → 'failed').
|
|
7
|
+
*
|
|
8
|
+
* Folded codex Round-1 findings:
|
|
9
|
+
* - MUST-FIX #5: PendingRegistry; crash settles all pending before
|
|
10
|
+
* any restart; cancellation throws AppError(Cancelled).
|
|
11
|
+
* - SHOULD-FIX #1: -32801 content-modified → 3 retries 500/1000/
|
|
12
|
+
* 2000 ms exp backoff; signal-aware between sleeps.
|
|
13
|
+
* - SHOULD-FIX #2: bounded open-doc LRU per instance; didClose on
|
|
14
|
+
* evict and on dispose.
|
|
15
|
+
* - NICE #2: capabilities.workspace.workspaceFolders = false; still
|
|
16
|
+
* pass workspaceFolders array in initialize params.
|
|
17
|
+
*/
|
|
18
|
+
import { spawn } from "node:child_process";
|
|
19
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
20
|
+
import { basename } from "node:path";
|
|
21
|
+
import { pathToFileURL } from "node:url";
|
|
22
|
+
import { AppError, ErrorCode } from "@chances-ai/runtime";
|
|
23
|
+
import { LspError } from "./errors.js";
|
|
24
|
+
import { PendingRegistry } from "./rpc.js";
|
|
25
|
+
import { loadVscodeJsonRpc } from "./lazy-load.js";
|
|
26
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 15_000;
|
|
27
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
28
|
+
const DEFAULT_MAX_RESTARTS = 3;
|
|
29
|
+
const DEFAULT_MAX_OPEN_DOCS = 64;
|
|
30
|
+
const TRANSIENT_BACKOFF_MS = [500, 1000, 2000];
|
|
31
|
+
const SHUTDOWN_DEADLINE_MS = 2_000;
|
|
32
|
+
const SIGKILL_DEADLINE_MS = 100;
|
|
33
|
+
/** LSP-defined error code for "content was modified between request
|
|
34
|
+
* and response". rust-analyzer sends this during indexing; matches
|
|
35
|
+
* claude-code's retry list. */
|
|
36
|
+
const CONTENT_MODIFIED_CODE = -32801;
|
|
37
|
+
export class LspServerInstance {
|
|
38
|
+
opts;
|
|
39
|
+
state = "stopped";
|
|
40
|
+
restartCount = 0;
|
|
41
|
+
lastActivityAt = Date.now();
|
|
42
|
+
child;
|
|
43
|
+
conn;
|
|
44
|
+
startPromise;
|
|
45
|
+
pending = new PendingRegistry();
|
|
46
|
+
openDocs = new Map(); // path → openedAt
|
|
47
|
+
disposed = false;
|
|
48
|
+
constructor(opts) {
|
|
49
|
+
this.opts = opts;
|
|
50
|
+
}
|
|
51
|
+
get activeRequests() {
|
|
52
|
+
return this.pending.activeRequests;
|
|
53
|
+
}
|
|
54
|
+
isIdle() {
|
|
55
|
+
return this.activeRequests === 0 && this.state === "running";
|
|
56
|
+
}
|
|
57
|
+
/** Ensures the server is `running`. Idempotent — concurrent callers
|
|
58
|
+
* share the in-flight startup promise. */
|
|
59
|
+
async ensureStarted(signal) {
|
|
60
|
+
if (this.disposed)
|
|
61
|
+
throw new LspError("SERVER_STICKY_FAILED", `${this.opts.name}: instance disposed`);
|
|
62
|
+
if (this.state === "running")
|
|
63
|
+
return;
|
|
64
|
+
if (this.state === "failed") {
|
|
65
|
+
throw new LspError("SERVER_STICKY_FAILED", `${this.opts.name}: failed after ${this.restartCount} restarts; run /mcp restart or fix the binary and reload`);
|
|
66
|
+
}
|
|
67
|
+
if (this.startPromise)
|
|
68
|
+
return this.startPromise;
|
|
69
|
+
this.startPromise = this.start(signal).finally(() => {
|
|
70
|
+
this.startPromise = undefined;
|
|
71
|
+
});
|
|
72
|
+
return this.startPromise;
|
|
73
|
+
}
|
|
74
|
+
async start(signal) {
|
|
75
|
+
this.state = "starting";
|
|
76
|
+
const startupTimeoutMs = this.opts.config.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
77
|
+
// Real connection: require vscode-jsonrpc. If absent, fail before spawn.
|
|
78
|
+
let buildConn = this.opts.connectionFactory;
|
|
79
|
+
if (!buildConn) {
|
|
80
|
+
const mod = await loadVscodeJsonRpc();
|
|
81
|
+
if (!mod) {
|
|
82
|
+
this.state = "failed";
|
|
83
|
+
throw new LspError("SERVER_STICKY_FAILED", "vscode-jsonrpc peer dep not installed");
|
|
84
|
+
}
|
|
85
|
+
buildConn = async (child) => {
|
|
86
|
+
const reader = new mod.StreamMessageReader(child.stdout);
|
|
87
|
+
const writer = new mod.StreamMessageWriter(child.stdin);
|
|
88
|
+
const conn = mod.createMessageConnection(reader, writer);
|
|
89
|
+
conn.listen();
|
|
90
|
+
return conn;
|
|
91
|
+
};
|
|
92
|
+
// (codex Round-2 MUST-FIX #2) Wire vscode-jsonrpc's native
|
|
93
|
+
// CancellationTokenSource so `pending.send` cancels through the
|
|
94
|
+
// library — which knows the wire-level id and emits the correct
|
|
95
|
+
// `$/cancelRequest`. We snake this through the dynamic import
|
|
96
|
+
// because vscode-jsonrpc owns the type and the lazy-load module
|
|
97
|
+
// only re-exports the three transport pieces.
|
|
98
|
+
try {
|
|
99
|
+
const ctsCtor = await loadCancellationTokenSource();
|
|
100
|
+
if (ctsCtor)
|
|
101
|
+
this.pending.setCancellationFactory(() => new ctsCtor());
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* fall back to abort-only; the synthetic-id bug is what we cared about */
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const spawnImpl = this.opts.spawnFn ?? spawn;
|
|
108
|
+
let child;
|
|
109
|
+
try {
|
|
110
|
+
child = spawnImpl(this.opts.command, [...this.opts.args], {
|
|
111
|
+
cwd: this.opts.cwd,
|
|
112
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
113
|
+
env: { ...process.env, ...(this.opts.config.env ?? {}) },
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
this.state = "error";
|
|
118
|
+
throw new LspError("BINARY_MISSING", `spawn failed for ${this.opts.command}`, e);
|
|
119
|
+
}
|
|
120
|
+
// ENOENT from the spawn itself only surfaces via the 'error'
|
|
121
|
+
// event; we await either 'spawn' (success) or 'error' (fail).
|
|
122
|
+
await new Promise((resolve, reject) => {
|
|
123
|
+
const onSpawn = () => {
|
|
124
|
+
child.off("error", onErr);
|
|
125
|
+
resolve();
|
|
126
|
+
};
|
|
127
|
+
const onErr = (err) => {
|
|
128
|
+
child.off("spawn", onSpawn);
|
|
129
|
+
if (err.code === "ENOENT") {
|
|
130
|
+
reject(new LspError("BINARY_MISSING", `${this.opts.command} not found on PATH`, err));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
reject(new LspError("BINARY_MISSING", `spawn failed for ${this.opts.command}: ${err.message}`, err));
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
child.once("spawn", onSpawn);
|
|
137
|
+
child.once("error", onErr);
|
|
138
|
+
}).catch((e) => {
|
|
139
|
+
this.state = "error";
|
|
140
|
+
throw e;
|
|
141
|
+
});
|
|
142
|
+
this.child = child;
|
|
143
|
+
child.stderr?.setEncoding("utf8");
|
|
144
|
+
child.stderr?.on("data", (chunk) => {
|
|
145
|
+
this.opts.logger.debug(`[lsp ${this.opts.name}] ${chunk.trim()}`);
|
|
146
|
+
});
|
|
147
|
+
child.on("close", (code, sigName) => this.onChildClose(code, sigName));
|
|
148
|
+
// Build the JSON-RPC connection over the child's pipes.
|
|
149
|
+
let conn;
|
|
150
|
+
try {
|
|
151
|
+
conn = await buildConn(child);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
this.state = "error";
|
|
155
|
+
try {
|
|
156
|
+
child.kill("SIGTERM");
|
|
157
|
+
}
|
|
158
|
+
catch { /* ignore */ }
|
|
159
|
+
throw new LspError("BINARY_MISSING", "vscode-jsonrpc connection setup failed", e);
|
|
160
|
+
}
|
|
161
|
+
this.conn = conn;
|
|
162
|
+
// Initialize handshake — bounded by startupTimeoutMs.
|
|
163
|
+
const initSignal = AbortSignal.timeout(startupTimeoutMs);
|
|
164
|
+
if (signal) {
|
|
165
|
+
// Propagate caller's cancellation too.
|
|
166
|
+
const composite = new AbortController();
|
|
167
|
+
const onTimeout = () => composite.abort(new LspError("START_TIMEOUT", "initialize timed out"));
|
|
168
|
+
const onSignal = () => composite.abort(new AppError(ErrorCode.Cancelled, "initialize cancelled"));
|
|
169
|
+
initSignal.addEventListener("abort", onTimeout, { once: true });
|
|
170
|
+
signal.addEventListener("abort", onSignal, { once: true });
|
|
171
|
+
try {
|
|
172
|
+
await this.initialize(conn, composite.signal);
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
this.state = "error";
|
|
176
|
+
try {
|
|
177
|
+
child.kill("SIGTERM");
|
|
178
|
+
}
|
|
179
|
+
catch { /* ignore */ }
|
|
180
|
+
if (e instanceof AppError)
|
|
181
|
+
throw e;
|
|
182
|
+
if (e instanceof LspError)
|
|
183
|
+
throw e;
|
|
184
|
+
throw new LspError("START_TIMEOUT", `initialize failed: ${e.message}`, e);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
try {
|
|
189
|
+
await this.initialize(conn, initSignal);
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
this.state = "error";
|
|
193
|
+
try {
|
|
194
|
+
child.kill("SIGTERM");
|
|
195
|
+
}
|
|
196
|
+
catch { /* ignore */ }
|
|
197
|
+
if (e instanceof LspError)
|
|
198
|
+
throw e;
|
|
199
|
+
throw new LspError("START_TIMEOUT", `initialize failed: ${e.message}`, e);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.state = "running";
|
|
203
|
+
}
|
|
204
|
+
async initialize(conn, signal) {
|
|
205
|
+
const realCwd = (() => {
|
|
206
|
+
try {
|
|
207
|
+
return realpathSync(this.opts.cwd);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return this.opts.cwd;
|
|
211
|
+
}
|
|
212
|
+
})();
|
|
213
|
+
const rootUri = pathToFileURL(realCwd).toString();
|
|
214
|
+
const initParams = {
|
|
215
|
+
processId: process.pid,
|
|
216
|
+
workspaceFolders: [{ uri: rootUri, name: basename(realCwd) }],
|
|
217
|
+
rootUri,
|
|
218
|
+
rootPath: realCwd,
|
|
219
|
+
initializationOptions: this.opts.config.initializationOptions ?? {},
|
|
220
|
+
capabilities: {
|
|
221
|
+
general: { positionEncodings: ["utf-16"] },
|
|
222
|
+
workspace: {
|
|
223
|
+
// codex Round-1 NICE #2 — false because v1 does NOT implement
|
|
224
|
+
// didChangeWorkspaceFolders or related dynamics.
|
|
225
|
+
workspaceFolders: false,
|
|
226
|
+
configuration: false,
|
|
227
|
+
},
|
|
228
|
+
textDocument: {
|
|
229
|
+
synchronization: { didSave: true },
|
|
230
|
+
definition: { linkSupport: true },
|
|
231
|
+
references: { dynamicRegistration: false },
|
|
232
|
+
hover: { contentFormat: ["markdown", "plaintext"] },
|
|
233
|
+
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
234
|
+
callHierarchy: { dynamicRegistration: false },
|
|
235
|
+
implementation: { linkSupport: true },
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
await this.pending.send({
|
|
240
|
+
connection: conn,
|
|
241
|
+
method: "initialize",
|
|
242
|
+
params: initParams,
|
|
243
|
+
signal,
|
|
244
|
+
requestTimeoutMs: this.opts.config.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS,
|
|
245
|
+
});
|
|
246
|
+
conn.sendNotification("initialized", {});
|
|
247
|
+
}
|
|
248
|
+
onChildClose(code, signalName) {
|
|
249
|
+
if (this.state === "stopping") {
|
|
250
|
+
this.state = "stopped";
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (this.state === "failed" || this.state === "stopped")
|
|
254
|
+
return;
|
|
255
|
+
// Crash path. Reject every pending request BEFORE we touch state
|
|
256
|
+
// so a concurrent caller can't trigger a restart that resurrects
|
|
257
|
+
// a stale id (codex Round-1 MUST-FIX #5).
|
|
258
|
+
const cause = new LspError("SERVER_CRASHED", `${this.opts.name} exited (code=${code ?? "null"}, signal=${signalName ?? "null"})`);
|
|
259
|
+
this.pending.rejectAll(cause);
|
|
260
|
+
this.openDocs.clear(); // server forgets every doc on restart
|
|
261
|
+
this.conn = undefined;
|
|
262
|
+
this.child = undefined;
|
|
263
|
+
this.restartCount++;
|
|
264
|
+
const maxRestarts = this.opts.config.maxRestarts ?? DEFAULT_MAX_RESTARTS;
|
|
265
|
+
if (this.restartCount > maxRestarts) {
|
|
266
|
+
this.state = "failed";
|
|
267
|
+
this.opts.logger.warn(`[lsp ${this.opts.name}] sticky-failed after ${this.restartCount} restarts`);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
this.state = "error";
|
|
271
|
+
this.opts.logger.warn(`[lsp ${this.opts.name}] crashed; will retry on next call (${this.restartCount}/${maxRestarts})`);
|
|
272
|
+
}
|
|
273
|
+
/** Sends a request. Handles the `-32801 content modified` retry
|
|
274
|
+
* loop with exponential backoff (codex Round-1 SHOULD-FIX #1).
|
|
275
|
+
* The total wallclock is bounded by the request-timeout budget
|
|
276
|
+
* (codex Round-2 SHOULD-FIX #1 — without the bound, three retries
|
|
277
|
+
* with fresh 30 s each can spend ~93 s on one request). */
|
|
278
|
+
async request(method, params, signal) {
|
|
279
|
+
await this.ensureStarted(signal);
|
|
280
|
+
if (!this.conn)
|
|
281
|
+
throw new LspError("SERVER_CRASHED", `${this.opts.name}: no live connection`);
|
|
282
|
+
const deadline = Date.now() + DEFAULT_REQUEST_TIMEOUT_MS;
|
|
283
|
+
this.lastActivityAt = Date.now();
|
|
284
|
+
for (let attempt = 0;; attempt++) {
|
|
285
|
+
const remaining = deadline - Date.now();
|
|
286
|
+
if (remaining <= 0) {
|
|
287
|
+
throw new LspError("REQUEST_TIMEOUT", `lsp ${method} timed out (retry budget exhausted)`);
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
return await this.pending.send({
|
|
291
|
+
connection: this.conn,
|
|
292
|
+
method,
|
|
293
|
+
params,
|
|
294
|
+
signal,
|
|
295
|
+
requestTimeoutMs: remaining,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
if (signal.aborted)
|
|
300
|
+
throw e;
|
|
301
|
+
if (isContentModified(e) && attempt < TRANSIENT_BACKOFF_MS.length) {
|
|
302
|
+
const delay = TRANSIENT_BACKOFF_MS[attempt];
|
|
303
|
+
if (Date.now() + delay >= deadline) {
|
|
304
|
+
// Backoff would itself overrun the deadline — give up now.
|
|
305
|
+
throw new LspError("REQUEST_TIMEOUT", `lsp ${method} timed out (next retry would overrun)`);
|
|
306
|
+
}
|
|
307
|
+
this.opts.logger.debug(`[lsp ${this.opts.name}] -32801 retry ${attempt + 1} in ${delay}ms`);
|
|
308
|
+
await sleepUnlessAborted(delay, signal);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
throw e;
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
this.lastActivityAt = Date.now();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** Opens `path` on the server if not already open. Evicts the oldest
|
|
319
|
+
* open doc when the LRU is full (codex Round-1 SHOULD-FIX #2;
|
|
320
|
+
* Round-2 SHOULD-FIX #2 — Map#set on an existing key keeps the
|
|
321
|
+
* ORIGINAL insertion position, so we must `delete`-then-`set` to
|
|
322
|
+
* bring the hit to the end of the access order). */
|
|
323
|
+
async ensureDocOpen(absPath, signal) {
|
|
324
|
+
if (this.openDocs.has(absPath)) {
|
|
325
|
+
this.openDocs.delete(absPath);
|
|
326
|
+
this.openDocs.set(absPath, Date.now());
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const maxOpen = this.opts.config.maxOpenDocs ?? DEFAULT_MAX_OPEN_DOCS;
|
|
330
|
+
if (this.openDocs.size >= maxOpen) {
|
|
331
|
+
// Evict oldest. Map's insertion order is access order because we
|
|
332
|
+
// delete-and-reinsert on refresh.
|
|
333
|
+
const oldest = this.openDocs.keys().next().value;
|
|
334
|
+
if (oldest && this.conn) {
|
|
335
|
+
try {
|
|
336
|
+
this.conn.sendNotification("textDocument/didClose", {
|
|
337
|
+
textDocument: { uri: pathToFileURL(oldest).toString() },
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
/* server may be dying; harmless */
|
|
342
|
+
}
|
|
343
|
+
this.openDocs.delete(oldest);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
await this.ensureStarted(signal);
|
|
347
|
+
if (!this.conn)
|
|
348
|
+
throw new LspError("SERVER_CRASHED", `${this.opts.name}: no live connection`);
|
|
349
|
+
let content;
|
|
350
|
+
try {
|
|
351
|
+
content = readFileSync(absPath, "utf8");
|
|
352
|
+
}
|
|
353
|
+
catch (e) {
|
|
354
|
+
throw new LspError("REQUEST_FAILED", `could not read ${absPath}`, e);
|
|
355
|
+
}
|
|
356
|
+
const languageId = guessLanguageId(absPath);
|
|
357
|
+
this.conn.sendNotification("textDocument/didOpen", {
|
|
358
|
+
textDocument: {
|
|
359
|
+
uri: pathToFileURL(absPath).toString(),
|
|
360
|
+
languageId,
|
|
361
|
+
version: 1,
|
|
362
|
+
text: content,
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
this.openDocs.set(absPath, Date.now());
|
|
366
|
+
}
|
|
367
|
+
/** Graceful shutdown: `shutdown` request, `exit` notification, 2 s
|
|
368
|
+
* deadline, SIGTERM, 100 ms, SIGKILL. Idempotent. */
|
|
369
|
+
async dispose() {
|
|
370
|
+
if (this.disposed)
|
|
371
|
+
return;
|
|
372
|
+
this.disposed = true;
|
|
373
|
+
if (this.state === "running" || this.state === "starting") {
|
|
374
|
+
this.state = "stopping";
|
|
375
|
+
// Close every open doc — best effort.
|
|
376
|
+
if (this.conn) {
|
|
377
|
+
for (const p of this.openDocs.keys()) {
|
|
378
|
+
try {
|
|
379
|
+
this.conn.sendNotification("textDocument/didClose", {
|
|
380
|
+
textDocument: { uri: pathToFileURL(p).toString() },
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
catch { /* ignore */ }
|
|
384
|
+
}
|
|
385
|
+
this.openDocs.clear();
|
|
386
|
+
try {
|
|
387
|
+
const ac = new AbortController();
|
|
388
|
+
const t = setTimeout(() => ac.abort(), SHUTDOWN_DEADLINE_MS);
|
|
389
|
+
await this.pending.send({
|
|
390
|
+
connection: this.conn,
|
|
391
|
+
method: "shutdown",
|
|
392
|
+
params: null,
|
|
393
|
+
signal: ac.signal,
|
|
394
|
+
requestTimeoutMs: SHUTDOWN_DEADLINE_MS,
|
|
395
|
+
}).catch(() => undefined);
|
|
396
|
+
clearTimeout(t);
|
|
397
|
+
try {
|
|
398
|
+
this.conn.sendNotification("exit", null);
|
|
399
|
+
}
|
|
400
|
+
catch { /* ignore */ }
|
|
401
|
+
}
|
|
402
|
+
catch { /* ignore */ }
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
this.pending.rejectAll(new LspError("SERVER_CRASHED", `${this.opts.name}: disposed`));
|
|
406
|
+
const child = this.child;
|
|
407
|
+
if (child && child.exitCode === null) {
|
|
408
|
+
try {
|
|
409
|
+
child.kill("SIGTERM");
|
|
410
|
+
}
|
|
411
|
+
catch { /* ignore */ }
|
|
412
|
+
await new Promise((resolve) => {
|
|
413
|
+
const t = setTimeout(() => {
|
|
414
|
+
try {
|
|
415
|
+
child.kill("SIGKILL");
|
|
416
|
+
}
|
|
417
|
+
catch { /* ignore */ }
|
|
418
|
+
resolve();
|
|
419
|
+
}, SIGKILL_DEADLINE_MS);
|
|
420
|
+
child.once("close", () => {
|
|
421
|
+
clearTimeout(t);
|
|
422
|
+
resolve();
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
try {
|
|
427
|
+
this.conn?.dispose();
|
|
428
|
+
}
|
|
429
|
+
catch { /* ignore */ }
|
|
430
|
+
this.conn = undefined;
|
|
431
|
+
this.child = undefined;
|
|
432
|
+
this.state = "stopped";
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
/** Dynamic load of vscode-jsonrpc's `CancellationTokenSource`. Lives
|
|
436
|
+
* alongside `loadVscodeJsonRpc` but pulls a different export. */
|
|
437
|
+
async function loadCancellationTokenSource() {
|
|
438
|
+
try {
|
|
439
|
+
const specifier = ["vscode-jsonrpc", "node.js"].join("/");
|
|
440
|
+
const mod = (await import(specifier));
|
|
441
|
+
return mod.CancellationTokenSource ?? null;
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
function isContentModified(e) {
|
|
448
|
+
if (!e || typeof e !== "object")
|
|
449
|
+
return false;
|
|
450
|
+
const code = e.code;
|
|
451
|
+
return code === CONTENT_MODIFIED_CODE;
|
|
452
|
+
}
|
|
453
|
+
async function sleepUnlessAborted(ms, signal) {
|
|
454
|
+
if (signal.aborted)
|
|
455
|
+
throw new AppError(ErrorCode.Cancelled, "lsp retry cancelled");
|
|
456
|
+
await new Promise((resolve, reject) => {
|
|
457
|
+
const t = setTimeout(() => {
|
|
458
|
+
signal.removeEventListener("abort", onAbort);
|
|
459
|
+
resolve();
|
|
460
|
+
}, ms);
|
|
461
|
+
const onAbort = () => {
|
|
462
|
+
clearTimeout(t);
|
|
463
|
+
reject(new AppError(ErrorCode.Cancelled, "lsp retry cancelled"));
|
|
464
|
+
};
|
|
465
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
/** Best-effort languageId mapping. LSP servers tolerate "plaintext"
|
|
469
|
+
* for unknown extensions; we use the well-known names for the four
|
|
470
|
+
* built-in defaults so the server picks the right grammar. */
|
|
471
|
+
function guessLanguageId(path) {
|
|
472
|
+
const lower = path.toLowerCase();
|
|
473
|
+
if (lower.endsWith(".ts") || lower.endsWith(".cts") || lower.endsWith(".mts"))
|
|
474
|
+
return "typescript";
|
|
475
|
+
if (lower.endsWith(".tsx"))
|
|
476
|
+
return "typescriptreact";
|
|
477
|
+
if (lower.endsWith(".js") || lower.endsWith(".cjs") || lower.endsWith(".mjs"))
|
|
478
|
+
return "javascript";
|
|
479
|
+
if (lower.endsWith(".jsx"))
|
|
480
|
+
return "javascriptreact";
|
|
481
|
+
if (lower.endsWith(".rs"))
|
|
482
|
+
return "rust";
|
|
483
|
+
if (lower.endsWith(".py") || lower.endsWith(".pyi"))
|
|
484
|
+
return "python";
|
|
485
|
+
if (lower.endsWith(".go"))
|
|
486
|
+
return "go";
|
|
487
|
+
return "plaintext";
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/lsp/instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (4.2) Lazy load `vscode-jsonrpc/node` via a COMPUTED specifier so
|
|
3
|
+
* `bun build --compile` doesn't try to statically resolve the optional
|
|
4
|
+
* peer dep (codex Round-1 SHOULD-FIX #4 — verified on 3.6/4.0 the
|
|
5
|
+
* hard way).
|
|
6
|
+
*
|
|
7
|
+
* Two seams:
|
|
8
|
+
* - `loadVscodeJsonRpc()` — production path; cached after first call
|
|
9
|
+
* - `__setLoaderForTest()` — replaces the loader for unit tests
|
|
10
|
+
*/
|
|
11
|
+
import type { createMessageConnection as createMessageConnectionType, StreamMessageReader as StreamMessageReaderType, StreamMessageWriter as StreamMessageWriterType } from "vscode-jsonrpc/node.js";
|
|
12
|
+
export interface VscodeJsonRpcModule {
|
|
13
|
+
createMessageConnection: typeof createMessageConnectionType;
|
|
14
|
+
StreamMessageReader: typeof StreamMessageReaderType;
|
|
15
|
+
StreamMessageWriter: typeof StreamMessageWriterType;
|
|
16
|
+
}
|
|
17
|
+
/** Returns the loaded module on success, or `null` when the peer is
|
|
18
|
+
* absent / broken. Result is memoised; pass `force: true` to re-probe
|
|
19
|
+
* (used by `host.restart`). Always swallows loader errors so a thrown
|
|
20
|
+
* `ERR_MODULE_NOT_FOUND` is indistinguishable from a returned-null
|
|
21
|
+
* (callers only need to know "available or not"). */
|
|
22
|
+
export declare function loadVscodeJsonRpc(force?: boolean): Promise<VscodeJsonRpcModule | null>;
|
|
23
|
+
/** Test seam — swap the loader and reset the cache. */
|
|
24
|
+
export declare function __setLoaderForTest(fn: () => Promise<VscodeJsonRpcModule | null>): void;
|
|
25
|
+
/** Test seam — restore default loader. */
|
|
26
|
+
export declare function __resetLoaderForTest(): void;
|
|
27
|
+
//# sourceMappingURL=lazy-load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-load.d.ts","sourceRoot":"","sources":["../../src/lsp/lazy-load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,uBAAuB,IAAI,2BAA2B,EACtD,mBAAmB,IAAI,uBAAuB,EAC9C,mBAAmB,IAAI,uBAAuB,EAC/C,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,EAAE,OAAO,2BAA2B,CAAC;IAC5D,mBAAmB,EAAE,OAAO,uBAAuB,CAAC;IACpD,mBAAmB,EAAE,OAAO,uBAAuB,CAAC;CACrD;AAyBD;;;;sDAIsD;AACtD,wBAAsB,iBAAiB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAQ1F;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,IAAI,CAGtF;AAED,0CAA0C;AAC1C,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (4.2) Lazy load `vscode-jsonrpc/node` via a COMPUTED specifier so
|
|
3
|
+
* `bun build --compile` doesn't try to statically resolve the optional
|
|
4
|
+
* peer dep (codex Round-1 SHOULD-FIX #4 — verified on 3.6/4.0 the
|
|
5
|
+
* hard way).
|
|
6
|
+
*
|
|
7
|
+
* Two seams:
|
|
8
|
+
* - `loadVscodeJsonRpc()` — production path; cached after first call
|
|
9
|
+
* - `__setLoaderForTest()` — replaces the loader for unit tests
|
|
10
|
+
*/
|
|
11
|
+
let cached = undefined;
|
|
12
|
+
let loader = defaultLoader;
|
|
13
|
+
async function defaultLoader() {
|
|
14
|
+
// Computed specifier — string concatenated at runtime so the bundler
|
|
15
|
+
// can't see the literal import path. Matches the 3.6 OTel and 3.7
|
|
16
|
+
// OAuth patterns.
|
|
17
|
+
const specifier = ["vscode-jsonrpc", "node.js"].join("/");
|
|
18
|
+
try {
|
|
19
|
+
const mod = (await import(specifier));
|
|
20
|
+
if (typeof mod?.createMessageConnection !== "function" ||
|
|
21
|
+
typeof mod?.StreamMessageReader !== "function" ||
|
|
22
|
+
typeof mod?.StreamMessageWriter !== "function") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return mod;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Returns the loaded module on success, or `null` when the peer is
|
|
32
|
+
* absent / broken. Result is memoised; pass `force: true` to re-probe
|
|
33
|
+
* (used by `host.restart`). Always swallows loader errors so a thrown
|
|
34
|
+
* `ERR_MODULE_NOT_FOUND` is indistinguishable from a returned-null
|
|
35
|
+
* (callers only need to know "available or not"). */
|
|
36
|
+
export async function loadVscodeJsonRpc(force = false) {
|
|
37
|
+
if (cached !== undefined && !force)
|
|
38
|
+
return cached;
|
|
39
|
+
try {
|
|
40
|
+
cached = await loader();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
cached = null;
|
|
44
|
+
}
|
|
45
|
+
return cached;
|
|
46
|
+
}
|
|
47
|
+
/** Test seam — swap the loader and reset the cache. */
|
|
48
|
+
export function __setLoaderForTest(fn) {
|
|
49
|
+
loader = fn;
|
|
50
|
+
cached = undefined;
|
|
51
|
+
}
|
|
52
|
+
/** Test seam — restore default loader. */
|
|
53
|
+
export function __resetLoaderForTest() {
|
|
54
|
+
loader = defaultLoader;
|
|
55
|
+
cached = undefined;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lazy-load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-load.js","sourceRoot":"","sources":["../../src/lsp/lazy-load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,IAAI,MAAM,GAA2C,SAAS,CAAC;AAC/D,IAAI,MAAM,GAA8C,aAAa,CAAC;AAEtE,KAAK,UAAU,aAAa;IAC1B,qEAAqE;IACrE,kEAAkE;IAClE,kBAAkB;IAClB,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAwB,CAAC;QAC7D,IACE,OAAO,GAAG,EAAE,uBAAuB,KAAK,UAAU;YAClD,OAAO,GAAG,EAAE,mBAAmB,KAAK,UAAU;YAC9C,OAAO,GAAG,EAAE,mBAAmB,KAAK,UAAU,EAC9C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;sDAIsD;AACtD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAK,GAAG,KAAK;IACnD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,EAA6C;IAC9E,MAAM,GAAG,EAAE,CAAC;IACZ,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,aAAa,CAAC;IACvB,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC"}
|