@askdkc/dsh-lsp-server 0.1.17 → 0.1.18
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 +6 -0
- package/README.md +2 -2
- package/docs/usage.md +8 -4
- package/lib/extra-tool.js +15 -11
- package/lib/extra-tool.js.map +1 -1
- package/lib/provider.js +69 -1
- package/lib/provider.js.map +1 -1
- package/lib/types/extra-tool.d.ts +2 -1
- package/lib/types/servers/typescript-diagnostics.d.ts +3 -0
- package/package.json +41 -30
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
- Wait for all TypeScript diagnostic passes via correlated tsserver responses instead of accepting an early empty push notification. Update TypeScript Language Server to 4.4.1 for its read-only tsserver request API.
|
|
6
|
+
- Update bundled LSP packages and development services to DSH `0.2.2-rc.1`, Cordis 4.1, and Schemastery 3.19; require Node.js 24.9+.
|
|
7
|
+
- Preserve patched Undici 8.12.3 and Zod 4.6.7 in this repository’s dependency resolution when upstream pins older versions.
|
|
8
|
+
- Follow DSH’s effective session working directory for diagnostics, completion, snapshots, structure, and semantic queries, including directory recovery.
|
|
9
|
+
- Exercise the current native tool executor, working-directory changes, and packed bundle against DSH `0.2.2-rc.1`; older host versions are no longer covered.
|
|
10
|
+
|
|
5
11
|
- Expand bundled Tree-sitter structure support from 4 grammars to 21: Bash, C, C#, C++, CSS, Go, Haskell,
|
|
6
12
|
HTML, Java, JSON, Julia, OCaml, OCaml interface, Python, QL DBScheme, Ruby, Rust, and Scala, alongside the
|
|
7
13
|
existing JavaScript, TypeScript, TSX, and PHP. Each grammar is pinned by version, upstream commit, ABI, and
|
package/README.md
CHANGED
|
@@ -20,8 +20,8 @@ extensions, ABI versions, and current availability.
|
|
|
20
20
|
|
|
21
21
|
## Requirements
|
|
22
22
|
|
|
23
|
-
- Node.js
|
|
24
|
-
- DSH providing
|
|
23
|
+
- Node.js 24.9+
|
|
24
|
+
- DSH `0.2.2-rc.1`, providing `fs`, `subprocess`, `tools`, `systemPrompt`, and `workingDirectory`, with a tool executor registered
|
|
25
25
|
- PHPantom for PHP/Blade support (`phpantom_lsp` must be in `PATH`)
|
|
26
26
|
|
|
27
27
|
This plugin imposes no DSH version range at startup: imports and initialization report actual failures. This does not guarantee compatibility with every future DSH API.
|
package/docs/usage.md
CHANGED
|
@@ -26,9 +26,9 @@ pnpm dsh plugin --profile web list @askdkc/dsh-lsp-server --depth 0
|
|
|
26
26
|
|
|
27
27
|
pnpm may warn about missing DSH peer packages because the profile has peer auto-installation disabled. DSH resolves those host services from its own installation; do not add duplicate host packages to the profile just to silence pnpm. Older releases with exact host peers may still be skipped; install the updated release to remove that version gate.
|
|
28
28
|
|
|
29
|
-
The bundle adds `lsp`, `lsp-webstack-provider`, `tool-lsp`, and `tool-lsp-extra` rows. Its `@deepseek-ai/dsh-lsp` and `@deepseek-ai/dsh-tool-lsp` dependencies are installed automatically; do not install them separately. The harness still provides the profile's `fs`, `subprocess`, `tools`, and `
|
|
29
|
+
The bundle adds `lsp`, `lsp-webstack-provider`, `tool-lsp`, and `tool-lsp-extra` rows. Its `@deepseek-ai/dsh-lsp` and `@deepseek-ai/dsh-tool-lsp` dependencies are installed automatically; do not install them separately. The harness still provides the profile's `fs`, `subprocess`, `tools`, `systemPrompt`, and `workingDirectory` services and the shared Cordis instance. Installing this package does not install the harness itself.
|
|
30
30
|
|
|
31
|
-
The
|
|
31
|
+
The five DSH host peers use `*`, including prereleases in DSH's compatibility evaluator. All four bundle rows resolve through this package's own entry points; `/lsp` and `/tool-lsp` re-export the upstream implementations without catching import or initialization errors. The LSP dependencies and development host packages are pinned to `0.2.2-rc.1` for reproducible builds and tests; those pins do not restrict the host version at startup. Cordis and Schemastery follow the current host (`~4.1.0` and `~3.19.0`). Node.js 24.9+ and a registered tool executor are required. Older DSH runtimes are no longer covered by this release; future API compatibility is not guaranteed.
|
|
32
32
|
|
|
33
33
|
DSH may stop `plugin add` with `ERR_PNPM_IGNORED_BUILDS` for `core-js`, a dependency of the bundled HTML/CSS server. Decide whether to allow its build script in DSH's plugin manager. To **deny** the script from the CLI, set `allowBuilds.core-js: false` in the selected profile's `pnpm-workspace.yaml` before adding this bundle:
|
|
34
34
|
|
|
@@ -62,10 +62,12 @@ Additional tool calls:
|
|
|
62
62
|
{"operation":"completion","file_path":"src/app.ts","line":12,"character":8}
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
Both tools obtain the workspace from the
|
|
65
|
+
Both tools obtain the effective workspace from DSH’s **workingDirectory service for the calling session**, including directory changes and recovery when the current directory disappears. Snapshot handles remain scoped to their owner, session, and workspace; they cannot be used from a different current workspace. Completion's line and character are **one-based UTF-16**; diagnostic/output ranges are **zero-based UTF-16**. The model cannot supply a different workspace root. The underlying service API uses zero-based positions.
|
|
66
66
|
|
|
67
67
|
Diagnostics on existing unsupported documents such as `PLAN.md` return `{"diagnostics":[],"skipped":{"reason":"unsupported_file_type","filePath":"PLAN.md"}}`. This means no static check was performed; use document content and structure checks instead. Missing files, workspace escapes, read-limit failures, and failures from a supported primary server remain errors. `status.supportedFileSuffixes` describes routing support, while `servers` separately describes enabled/available servers.
|
|
68
68
|
|
|
69
|
+
Bundled TypeScript diagnostics wait for the syntax, semantic, and suggestion passes through TypeScript Language Server's `typescript.tsserverRequest` command. An early empty push notification is not treated as a completed check. Failed, timed-out, or malformed diagnostic responses remain errors.
|
|
70
|
+
|
|
69
71
|
Hover and completion can include Tailwind results. Completion ranks the typed prefix before truncating large catalogs. Diagnostics report omitted auxiliary servers; no publication before the deadline is a failure, not a clean-file result. Unsupported navigation returns `LSP_UNSUPPORTED_OPERATION`.
|
|
70
72
|
|
|
71
73
|
For servers that publish diagnostics as notifications, each diagnostic query starts a fresh process if the previous process was already used. This prevents delayed notifications from an earlier document close from being mistaken for a clean result. It adds server startup and project indexing cost to repeated diagnostic queries. Servers supporting `textDocument/diagnostic` reuse their process because responses are associated with request IDs.
|
|
@@ -123,10 +125,12 @@ pnpm test:e2e # real TS/JS, HTML, CSS, Svelte, Tailwind v3/v4
|
|
|
123
125
|
PHPANTOM_E2E=1 pnpm test:e2e # additionally tests installed PHPantom with PHP and Blade
|
|
124
126
|
```
|
|
125
127
|
|
|
126
|
-
The packed-artifact test installs the archive into a fresh consumer with DSH's hoisted layout, peer auto-installation disabled, and dependency scripts disabled. It provides the host service packages but does not preinstall either LSP package, then verifies official profile composition and preflight, bundle imports, both tool registrations, and real TypeScript, HTML, and CSS queries on DSH `0.2.
|
|
128
|
+
The packed-artifact test installs the archive into a fresh consumer with DSH's hoisted layout, peer auto-installation disabled, and dependency scripts disabled. It provides the host service packages but does not preinstall either LSP package, then verifies official profile composition and preflight, bundle imports, both tool registrations, and real TypeScript, HTML, and CSS queries on DSH `0.2.2-rc.1` through its native tool executor. It also checks that import and initialization errors retain their original cause. It also checks declaration paths and the executable doctor. The consumer install prefers cached packages but needs registry access for uncached packages or metadata. E2E needs working OS file watchers; sandboxed macOS watchers may fail with `EMFILE`.
|
|
127
129
|
|
|
128
130
|
Integration tests run against the published DSH service/tool packages and Cordis versions recorded in the lockfile. The packed consumers use the published DSH runtimes named above. Future versions (`0.3.0-alpha.1` and `1.0.0`) are simulated only as version inputs to the official compatibility evaluator, not tested APIs. The full Web UI and a source-built upstream application are not exercised here.
|
|
129
131
|
|
|
132
|
+
Repository overrides retain patched Undici 8.12.3 and Zod 4.6.7 for local development and CI. Dependency overrides do not propagate from an installed plugin into its host; the packed-consumer test uses the official host dependency versions without these overrides.
|
|
133
|
+
|
|
130
134
|
### Dependency security
|
|
131
135
|
|
|
132
136
|
This repository pins Vite to 6.4.3 (which uses patched esbuild 0.25.x) and overrides the Svelte Language Server's fallback compiler to Svelte 5.55.7. These versions address [Vite's Windows path bypass](https://github.com/advisories/GHSA-fx2h-pf6j-xcff) and the [Svelte SSR](https://github.com/advisories/GHSA-pr6f-5x2q-rwfp) / [DOM clobbering](https://github.com/advisories/GHSA-rcqx-6q8c-2c42) advisories. Run `pnpm audit` from this repository root after dependency updates. The Svelte E2E tests exercise fallback compilation with both legacy and rune syntax, including diagnostics after edits.
|
package/lib/extra-tool.js
CHANGED
|
@@ -8,9 +8,10 @@ const inject = [
|
|
|
8
8
|
"tools",
|
|
9
9
|
"systemPrompt",
|
|
10
10
|
"webstackLsp",
|
|
11
|
-
"codeIntelligenceRuntime"
|
|
11
|
+
"codeIntelligenceRuntime",
|
|
12
|
+
"workingDirectory"
|
|
12
13
|
];
|
|
13
|
-
function createExtraTool(service, codeIntelligence, config = {}) {
|
|
14
|
+
function createExtraTool(service, codeIntelligence, config = {}, workingDirectory) {
|
|
14
15
|
const limits = {
|
|
15
16
|
maxDiagnostics: 200,
|
|
16
17
|
maxCompletions: 100,
|
|
@@ -107,16 +108,16 @@ function createExtraTool(service, codeIntelligence, config = {}) {
|
|
|
107
108
|
if (!codeIntelligence) throw new WebstackLspError("LSP_CODE_INTELLIGENCE_UNAVAILABLE", "code-intelligence service is unavailable");
|
|
108
109
|
if (args.operation === "snapshot") if (args.action === "capabilities") result = codeIntelligence.capabilities();
|
|
109
110
|
else if (args.action === "open") {
|
|
110
|
-
const scope = snapshotScope(exec.agent);
|
|
111
|
+
const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal));
|
|
111
112
|
if (typeof args.file_path !== "string") throw new TypeError("file_path is required for snapshot open");
|
|
112
113
|
result = await codeIntelligence.snapshot.open(scope, args.file_path, signal);
|
|
113
114
|
} else if (args.action === "release") {
|
|
114
|
-
const scope = snapshotScope(exec.agent);
|
|
115
|
+
const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal));
|
|
115
116
|
if (typeof args.handle !== "string") throw new TypeError("handle is required for snapshot release");
|
|
116
117
|
result = await codeIntelligence.snapshot.release(scope, args.handle);
|
|
117
118
|
} else throw new TypeError("snapshot action must be open, release, or capabilities");
|
|
118
119
|
else {
|
|
119
|
-
const scope = snapshotScope(exec.agent);
|
|
120
|
+
const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal));
|
|
120
121
|
if (args.operation === "structure") if (args.action === "outline") {
|
|
121
122
|
const range = readRange(args);
|
|
122
123
|
result = await codeIntelligence.structure.outline(scope, requiredString(args.handle, "handle"), {
|
|
@@ -151,8 +152,7 @@ function createExtraTool(service, codeIntelligence, config = {}) {
|
|
|
151
152
|
}
|
|
152
153
|
}
|
|
153
154
|
} else {
|
|
154
|
-
const workspaceRoot = exec.agent
|
|
155
|
-
if (!workspaceRoot) throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "lsp_extra requires a session workspace cwd");
|
|
155
|
+
const workspaceRoot = await resolveWorkspace(workingDirectory, exec.agent, signal);
|
|
156
156
|
if (!args.file_path) throw new TypeError("file_path is required");
|
|
157
157
|
if (args.operation === "diagnostics") {
|
|
158
158
|
const diagnostics = await service.diagnostics({
|
|
@@ -186,7 +186,7 @@ function createExtraTool(service, codeIntelligence, config = {}) {
|
|
|
186
186
|
});
|
|
187
187
|
}
|
|
188
188
|
function apply(ctx, config = {}) {
|
|
189
|
-
const tool = createExtraTool(ctx.webstackLsp, ctx.codeIntelligenceRuntime, config);
|
|
189
|
+
const tool = createExtraTool(ctx.webstackLsp, ctx.codeIntelligenceRuntime, config, ctx.workingDirectory);
|
|
190
190
|
ctx.tools.register(tool);
|
|
191
191
|
ctx.systemPrompt.section({
|
|
192
192
|
name: "tool:lsp_extra",
|
|
@@ -194,14 +194,18 @@ function apply(ctx, config = {}) {
|
|
|
194
194
|
text: "Use lsp_extra diagnostics after editing supported code files (PHP/Blade, TypeScript/JavaScript, JSX/TSX, Svelte, HTML, CSS/PCSS). Check status for supportedFileSuffixes, code-intelligence parser capabilities and server availability when uncertain. For Markdown and other unsupported documents, use content/structure checks instead. Open a snapshot before structure or semantic queries, pass its handle, and release it when finished. Structure/semantic positions and ranges are zero-based UTF-16; completion cursors remain one-based UTF-16. A skipped query is unverified, never a clean result; do not repeat an unsupported query unchanged. Query IDs are registered and cannot contain arbitrary Tree-sitter queries. The tool never applies edits."
|
|
195
195
|
});
|
|
196
196
|
}
|
|
197
|
-
function
|
|
197
|
+
async function resolveWorkspace(workingDirectory, agent, signal) {
|
|
198
|
+
if (!agent || !workingDirectory) throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "lsp_extra requires an active session and the workingDirectory service");
|
|
199
|
+
return workingDirectory.ensure(agent, signal);
|
|
200
|
+
}
|
|
201
|
+
function snapshotScope(agent, workspaceRoot) {
|
|
198
202
|
if (typeof agent !== "object" || agent === null) throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "snapshot operations require an active agent session");
|
|
199
203
|
const value = agent;
|
|
200
|
-
if (typeof value.id !== "string" || typeof value.session?.id !== "string"
|
|
204
|
+
if (typeof value.id !== "string" || typeof value.session?.id !== "string") throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "snapshot operations require trusted owner, session and workspace identity");
|
|
201
205
|
return {
|
|
202
206
|
ownerId: value.id,
|
|
203
207
|
sessionId: value.session.id,
|
|
204
|
-
workspaceRoot
|
|
208
|
+
workspaceRoot
|
|
205
209
|
};
|
|
206
210
|
}
|
|
207
211
|
function requiredString(value, name$1) {
|
package/lib/extra-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extra-tool.js","names":["result: unknown","name"],"sources":["../src/extra-tool.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis'\nimport { defineTool } from '@deepseek-ai/dsh-tools'\nimport type { ToolDefinition } from '@deepseek-ai/dsh-tools'\nimport type {} from '@deepseek-ai/dsh-system-prompt'\nimport type {} from './provider.js'\nimport type { WebstackLspService } from './service.js'\nimport { WebstackLspError } from './errors.js'\nimport { mergeDiagnostics } from './merge/diagnostics.js'\nimport { mergeCompletions } from './merge/completion.js'\nimport type { CodeIntelligenceToolServiceV1, SnapshotScope } from './structure/types.js'\n\nexport const name = 'lsp_extra'\nexport const inject = ['tools', 'systemPrompt', 'webstackLsp', 'codeIntelligenceRuntime']\nexport interface Config { maxDiagnostics?: number; maxCompletions?: number; maxResultChars?: number; timeoutMs?: number }\n\nexport function createExtraTool(service: WebstackLspService, codeIntelligence?: CodeIntelligenceToolServiceV1, config: Config = {}): ToolDefinition {\n const limits = { maxDiagnostics: 200, maxCompletions: 100, maxResultChars: 32000, timeoutMs: 60000, ...config }\n for (const [key, value] of Object.entries(limits)) if (!Number.isSafeInteger(value) || value < 1 || value > 2147483647) throw new TypeError(`${key} must be a positive integer no greater than 2147483647`)\n return defineTool({\n name,\n description: 'Read language-server status, diagnostics, or completion candidates for PHP/Blade, TypeScript/JavaScript, JSX/TSX, Svelte, HTML and CSS/PCSS. status reports supportedFileSuffixes and server availability. Unsupported document diagnostics return skipped (unverified). file_path is workspace-relative. Completion line and character are one-based UTF-16. No edits are applied.',\n parameters: {\n operation: { type: 'string', enum: ['status', 'diagnostics', 'completion', 'snapshot', 'structure', 'semantic'], required: true },\n action: { type: 'string', enum: ['open', 'release', 'capabilities', 'outline', 'enclosing', 'query', 'span', 'definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'] },\n file_path: { type: 'string' }, line: { type: 'integer' }, character: { type: 'integer' },\n handle: { type: 'string' }, node_handle: { type: 'string' }, query_id: { type: 'string' }, max_chars: { type: 'integer' }, limit: { type: 'integer' },\n position_line: { type: 'integer' }, position_character: { type: 'integer' },\n start_line: { type: 'integer' }, start_character: { type: 'integer' }, end_line: { type: 'integer' }, end_character: { type: 'integer' },\n kinds: { type: 'array', items: { type: 'string' } },\n severity: { type: 'string', enum: ['all', 'error', 'warning'] },\n servers: { type: 'array', items: { type: 'string' } },\n },\n output: {\n schema: { type: 'json' },\n render: (_args, value) => {\n const text = JSON.stringify(value)\n return [{ type: 'text', text: text.length <= limits.maxResultChars ? text : `${text.slice(0, Math.max(0, limits.maxResultChars - 14))}\\n[truncated]`.slice(0, limits.maxResultChars) }]\n },\n },\n timeoutMs: limits.timeoutMs,\n async execute(args, exec) {\n const signal = AbortSignal.any([exec.signal, AbortSignal.timeout(limits.timeoutMs)])\n signal.throwIfAborted()\n let result: unknown\n if (args.operation === 'status') result = { ...(await service.status()), ...(codeIntelligence ? { codeIntelligence: codeIntelligence.capabilities() } : {}) }\n else if (args.operation === 'snapshot' || args.operation === 'structure' || args.operation === 'semantic') {\n if (!codeIntelligence) throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'code-intelligence service is unavailable')\n if (args.operation === 'snapshot') {\n if (args.action === 'capabilities') result = codeIntelligence.capabilities()\n else if (args.action === 'open') {\n const scope = snapshotScope(exec.agent)\n if (typeof args.file_path !== 'string') throw new TypeError('file_path is required for snapshot open')\n result = await codeIntelligence.snapshot.open(scope, args.file_path, signal)\n } else if (args.action === 'release') {\n const scope = snapshotScope(exec.agent)\n if (typeof args.handle !== 'string') throw new TypeError('handle is required for snapshot release')\n result = await codeIntelligence.snapshot.release(scope, args.handle)\n } else throw new TypeError('snapshot action must be open, release, or capabilities')\n } else {\n const scope = snapshotScope(exec.agent)\n if (args.operation === 'structure') {\n if (args.action === 'outline') {\n const range = readRange(args)\n result = await codeIntelligence.structure.outline(scope, requiredString(args.handle, 'handle'), { ...(range ? { range } : {}), ...(args.limit === undefined ? {} : { limit: args.limit as number }) }, signal)\n }\n else if (args.action === 'enclosing') result = await codeIntelligence.structure.enclosing(scope, requiredString(args.handle, 'handle'), zeroBasedPosition(args), { ...(args.kinds === undefined ? {} : { kinds: args.kinds as string[] }) }, signal)\n else if (args.action === 'query') {\n const range = readRange(args)\n result = await codeIntelligence.structure.query(scope, requiredString(args.handle, 'handle'), requiredString(args.query_id, 'query_id'), { ...(range ? { range } : {}), ...(args.limit === undefined ? {} : { limit: args.limit as number }) }, signal)\n }\n else if (args.action === 'span') result = await codeIntelligence.structure.span(scope, requiredString(args.node_handle, 'node_handle'), args.max_chars as number | undefined, signal)\n else throw new TypeError('structure action must be outline, enclosing, query, or span')\n } else {\n const action = args.action\n if (!['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(String(action))) throw new TypeError('unsupported semantic action')\n result = await codeIntelligence.semantic.query(scope, requiredString(args.handle, 'handle'), {\n operation: action as 'definition' | 'references' | 'implementation' | 'hover' | 'diagnostics' | 'completion',\n ...(action === 'diagnostics' ? {} : { position: zeroBasedPosition(args) }),\n ...(args.severity ? { severity: args.severity as 'all' | 'error' | 'warning' } : {}),\n ...(args.servers ? { servers: args.servers as string[] } : {}),\n }, signal)\n }\n }\n }\n else {\n const workspaceRoot = exec.agent?.session.header.cwd\n if (!workspaceRoot) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'lsp_extra requires a session workspace cwd')\n if (!args.file_path) throw new TypeError('file_path is required')\n if (args.operation === 'diagnostics') {\n const diagnostics = await service.diagnostics({ workspaceRoot, filePath: args.file_path, ...(args.severity ? { severity: args.severity } : {}), ...(args.servers ? { servers: args.servers } : {}) }, signal)\n result = { ...diagnostics, ...mergeDiagnostics([diagnostics.diagnostics], limits) }\n } else {\n if (!args.line || args.line < 1 || !args.character || args.character < 1) throw new TypeError('completion requires positive one-based line and character')\n const completion = await service.completion({ workspaceRoot, filePath: args.file_path, position: { line: args.line - 1, character: args.character - 1 } }, signal)\n result = { ...completion, ...mergeCompletions([completion.items], limits) }\n }\n }\n // Strip undefined optionals and expose a lossless JSON result to DSH's schema validator.\n return JSON.parse(JSON.stringify(result))\n },\n })\n}\n\nexport function apply(ctx: Context, config: Config = {}): void {\n const tool = createExtraTool(ctx.webstackLsp, ctx.codeIntelligenceRuntime, config)\n ctx.tools.register(tool)\n ctx.systemPrompt.section({ name: 'tool:lsp_extra', order: 500, text: 'Use lsp_extra diagnostics after editing supported code files (PHP/Blade, TypeScript/JavaScript, JSX/TSX, Svelte, HTML, CSS/PCSS). Check status for supportedFileSuffixes, code-intelligence parser capabilities and server availability when uncertain. For Markdown and other unsupported documents, use content/structure checks instead. Open a snapshot before structure or semantic queries, pass its handle, and release it when finished. Structure/semantic positions and ranges are zero-based UTF-16; completion cursors remain one-based UTF-16. A skipped query is unverified, never a clean result; do not repeat an unsupported query unchanged. Query IDs are registered and cannot contain arbitrary Tree-sitter queries. The tool never applies edits.' })\n}\n\nfunction snapshotScope(agent: unknown): SnapshotScope {\n if (typeof agent !== 'object' || agent === null) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'snapshot operations require an active agent session')\n const value = agent as { id?: unknown; session?: { id?: unknown; header?: { cwd?: unknown } } }\n if (typeof value.id !== 'string' || typeof value.session?.id !== 'string' || typeof value.session.header?.cwd !== 'string')\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'snapshot operations require trusted owner, session and workspace identity')\n return { ownerId: value.id, sessionId: value.session.id, workspaceRoot: value.session.header.cwd }\n}\n\nfunction requiredString(value: unknown, name: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new TypeError(`${name} is required`)\n return value\n}\n\nfunction zeroBasedPosition(args: Record<string, unknown>): { line: number; character: number } {\n if (!Number.isSafeInteger(args.position_line) || !Number.isSafeInteger(args.position_character) || (args.position_line as number) < 0 || (args.position_character as number) < 0)\n throw new TypeError('position_line and position_character must be zero-based non-negative UTF-16 offsets')\n return { line: args.position_line as number, character: args.position_character as number }\n}\n\nfunction readRange(args: Record<string, unknown>): { start: { line: number; character: number }; end: { line: number; character: number } } | undefined {\n const fields = [args.start_line, args.start_character, args.end_line, args.end_character]\n if (fields.every(value => value === undefined)) return undefined\n if (fields.some(value => !Number.isSafeInteger(value) || (value as number) < 0)) throw new TypeError('range requires four zero-based non-negative coordinates')\n return { start: { line: args.start_line as number, character: args.start_character as number }, end: { line: args.end_line as number, character: args.end_character as number } }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extra-tool.js","names":["result: unknown","name"],"sources":["../src/extra-tool.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis'\nimport { defineTool } from '@deepseek-ai/dsh-tools'\nimport type { ToolDefinition, ToolExecutionInput } from '@deepseek-ai/dsh-tools'\nimport type { WorkingDirectoryService } from '@deepseek-ai/dsh-working-directory'\nimport type {} from '@deepseek-ai/dsh-system-prompt'\nimport type {} from './provider.js'\nimport type { WebstackLspService } from './service.js'\nimport { WebstackLspError } from './errors.js'\nimport { mergeDiagnostics } from './merge/diagnostics.js'\nimport { mergeCompletions } from './merge/completion.js'\nimport type { CodeIntelligenceToolServiceV1, SnapshotScope } from './structure/types.js'\n\nexport const name = 'lsp_extra'\nexport const inject = ['tools', 'systemPrompt', 'webstackLsp', 'codeIntelligenceRuntime', 'workingDirectory']\nexport interface Config { maxDiagnostics?: number; maxCompletions?: number; maxResultChars?: number; timeoutMs?: number }\n\nexport function createExtraTool(service: WebstackLspService, codeIntelligence?: CodeIntelligenceToolServiceV1, config: Config = {}, workingDirectory?: Pick<WorkingDirectoryService, 'ensure'>): ToolDefinition {\n const limits = { maxDiagnostics: 200, maxCompletions: 100, maxResultChars: 32000, timeoutMs: 60000, ...config }\n for (const [key, value] of Object.entries(limits)) if (!Number.isSafeInteger(value) || value < 1 || value > 2147483647) throw new TypeError(`${key} must be a positive integer no greater than 2147483647`)\n return defineTool({\n name,\n description: 'Read language-server status, diagnostics, or completion candidates for PHP/Blade, TypeScript/JavaScript, JSX/TSX, Svelte, HTML and CSS/PCSS. status reports supportedFileSuffixes and server availability. Unsupported document diagnostics return skipped (unverified). file_path is workspace-relative. Completion line and character are one-based UTF-16. No edits are applied.',\n parameters: {\n operation: { type: 'string', enum: ['status', 'diagnostics', 'completion', 'snapshot', 'structure', 'semantic'], required: true },\n action: { type: 'string', enum: ['open', 'release', 'capabilities', 'outline', 'enclosing', 'query', 'span', 'definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'] },\n file_path: { type: 'string' }, line: { type: 'integer' }, character: { type: 'integer' },\n handle: { type: 'string' }, node_handle: { type: 'string' }, query_id: { type: 'string' }, max_chars: { type: 'integer' }, limit: { type: 'integer' },\n position_line: { type: 'integer' }, position_character: { type: 'integer' },\n start_line: { type: 'integer' }, start_character: { type: 'integer' }, end_line: { type: 'integer' }, end_character: { type: 'integer' },\n kinds: { type: 'array', items: { type: 'string' } },\n severity: { type: 'string', enum: ['all', 'error', 'warning'] },\n servers: { type: 'array', items: { type: 'string' } },\n },\n output: {\n schema: { type: 'json' },\n render: (_args, value) => {\n const text = JSON.stringify(value)\n return [{ type: 'text', text: text.length <= limits.maxResultChars ? text : `${text.slice(0, Math.max(0, limits.maxResultChars - 14))}\\n[truncated]`.slice(0, limits.maxResultChars) }]\n },\n },\n timeoutMs: limits.timeoutMs,\n async execute(args, exec) {\n const signal = AbortSignal.any([exec.signal, AbortSignal.timeout(limits.timeoutMs)])\n signal.throwIfAborted()\n let result: unknown\n if (args.operation === 'status') result = { ...(await service.status()), ...(codeIntelligence ? { codeIntelligence: codeIntelligence.capabilities() } : {}) }\n else if (args.operation === 'snapshot' || args.operation === 'structure' || args.operation === 'semantic') {\n if (!codeIntelligence) throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'code-intelligence service is unavailable')\n if (args.operation === 'snapshot') {\n if (args.action === 'capabilities') result = codeIntelligence.capabilities()\n else if (args.action === 'open') {\n const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal))\n if (typeof args.file_path !== 'string') throw new TypeError('file_path is required for snapshot open')\n result = await codeIntelligence.snapshot.open(scope, args.file_path, signal)\n } else if (args.action === 'release') {\n const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal))\n if (typeof args.handle !== 'string') throw new TypeError('handle is required for snapshot release')\n result = await codeIntelligence.snapshot.release(scope, args.handle)\n } else throw new TypeError('snapshot action must be open, release, or capabilities')\n } else {\n const scope = snapshotScope(exec.agent, await resolveWorkspace(workingDirectory, exec.agent, signal))\n if (args.operation === 'structure') {\n if (args.action === 'outline') {\n const range = readRange(args)\n result = await codeIntelligence.structure.outline(scope, requiredString(args.handle, 'handle'), { ...(range ? { range } : {}), ...(args.limit === undefined ? {} : { limit: args.limit as number }) }, signal)\n }\n else if (args.action === 'enclosing') result = await codeIntelligence.structure.enclosing(scope, requiredString(args.handle, 'handle'), zeroBasedPosition(args), { ...(args.kinds === undefined ? {} : { kinds: args.kinds as string[] }) }, signal)\n else if (args.action === 'query') {\n const range = readRange(args)\n result = await codeIntelligence.structure.query(scope, requiredString(args.handle, 'handle'), requiredString(args.query_id, 'query_id'), { ...(range ? { range } : {}), ...(args.limit === undefined ? {} : { limit: args.limit as number }) }, signal)\n }\n else if (args.action === 'span') result = await codeIntelligence.structure.span(scope, requiredString(args.node_handle, 'node_handle'), args.max_chars as number | undefined, signal)\n else throw new TypeError('structure action must be outline, enclosing, query, or span')\n } else {\n const action = args.action\n if (!['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(String(action))) throw new TypeError('unsupported semantic action')\n result = await codeIntelligence.semantic.query(scope, requiredString(args.handle, 'handle'), {\n operation: action as 'definition' | 'references' | 'implementation' | 'hover' | 'diagnostics' | 'completion',\n ...(action === 'diagnostics' ? {} : { position: zeroBasedPosition(args) }),\n ...(args.severity ? { severity: args.severity as 'all' | 'error' | 'warning' } : {}),\n ...(args.servers ? { servers: args.servers as string[] } : {}),\n }, signal)\n }\n }\n }\n else {\n const workspaceRoot = await resolveWorkspace(workingDirectory, exec.agent, signal)\n if (!args.file_path) throw new TypeError('file_path is required')\n if (args.operation === 'diagnostics') {\n const diagnostics = await service.diagnostics({ workspaceRoot, filePath: args.file_path, ...(args.severity ? { severity: args.severity } : {}), ...(args.servers ? { servers: args.servers } : {}) }, signal)\n result = { ...diagnostics, ...mergeDiagnostics([diagnostics.diagnostics], limits) }\n } else {\n if (!args.line || args.line < 1 || !args.character || args.character < 1) throw new TypeError('completion requires positive one-based line and character')\n const completion = await service.completion({ workspaceRoot, filePath: args.file_path, position: { line: args.line - 1, character: args.character - 1 } }, signal)\n result = { ...completion, ...mergeCompletions([completion.items], limits) }\n }\n }\n // Strip undefined optionals and expose a lossless JSON result to DSH's schema validator.\n return JSON.parse(JSON.stringify(result))\n },\n })\n}\n\nexport function apply(ctx: Context, config: Config = {}): void {\n const tool = createExtraTool(ctx.webstackLsp, ctx.codeIntelligenceRuntime, config, ctx.workingDirectory)\n ctx.tools.register(tool)\n ctx.systemPrompt.section({ name: 'tool:lsp_extra', order: 500, text: 'Use lsp_extra diagnostics after editing supported code files (PHP/Blade, TypeScript/JavaScript, JSX/TSX, Svelte, HTML, CSS/PCSS). Check status for supportedFileSuffixes, code-intelligence parser capabilities and server availability when uncertain. For Markdown and other unsupported documents, use content/structure checks instead. Open a snapshot before structure or semantic queries, pass its handle, and release it when finished. Structure/semantic positions and ranges are zero-based UTF-16; completion cursors remain one-based UTF-16. A skipped query is unverified, never a clean result; do not repeat an unsupported query unchanged. Query IDs are registered and cannot contain arbitrary Tree-sitter queries. The tool never applies edits.' })\n}\n\nasync function resolveWorkspace(workingDirectory: Pick<WorkingDirectoryService, 'ensure'> | undefined, agent: ToolExecutionInput['agent'], signal: AbortSignal): Promise<string> {\n if (!agent || !workingDirectory) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'lsp_extra requires an active session and the workingDirectory service')\n return workingDirectory.ensure(agent, signal)\n}\n\nfunction snapshotScope(agent: unknown, workspaceRoot: string): SnapshotScope {\n if (typeof agent !== 'object' || agent === null) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'snapshot operations require an active agent session')\n const value = agent as { id?: unknown; session?: { id?: unknown } }\n if (typeof value.id !== 'string' || typeof value.session?.id !== 'string')\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'snapshot operations require trusted owner, session and workspace identity')\n return { ownerId: value.id, sessionId: value.session.id, workspaceRoot }\n}\n\nfunction requiredString(value: unknown, name: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new TypeError(`${name} is required`)\n return value\n}\n\nfunction zeroBasedPosition(args: Record<string, unknown>): { line: number; character: number } {\n if (!Number.isSafeInteger(args.position_line) || !Number.isSafeInteger(args.position_character) || (args.position_line as number) < 0 || (args.position_character as number) < 0)\n throw new TypeError('position_line and position_character must be zero-based non-negative UTF-16 offsets')\n return { line: args.position_line as number, character: args.position_character as number }\n}\n\nfunction readRange(args: Record<string, unknown>): { start: { line: number; character: number }; end: { line: number; character: number } } | undefined {\n const fields = [args.start_line, args.start_character, args.end_line, args.end_character]\n if (fields.every(value => value === undefined)) return undefined\n if (fields.some(value => !Number.isSafeInteger(value) || (value as number) < 0)) throw new TypeError('range requires four zero-based non-negative coordinates')\n return { start: { line: args.start_line as number, character: args.start_character as number }, end: { line: args.end_line as number, character: args.end_character as number } }\n}\n"],"mappings":"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"}
|
package/lib/provider.js
CHANGED
|
@@ -287,6 +287,70 @@ function hasTailwindCandidate(source, line, classRegex = [], character, classAtt
|
|
|
287
287
|
return [...DEFAULT_PATTERNS, ...configured].some((pattern) => pattern.test(context));
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
+
//#endregion
|
|
291
|
+
//#region src/servers/typescript-diagnostics.ts
|
|
292
|
+
const command = "typescript.tsserverRequest";
|
|
293
|
+
const diagnosticCommands = [
|
|
294
|
+
"syntacticDiagnosticsSync",
|
|
295
|
+
"semanticDiagnosticsSync",
|
|
296
|
+
"suggestionDiagnosticsSync"
|
|
297
|
+
];
|
|
298
|
+
const severities = {
|
|
299
|
+
error: 1,
|
|
300
|
+
warning: 2,
|
|
301
|
+
message: 3,
|
|
302
|
+
suggestion: 4
|
|
303
|
+
};
|
|
304
|
+
function supportsTypeScriptDiagnostics(capabilities) {
|
|
305
|
+
const provider = capabilities.executeCommandProvider;
|
|
306
|
+
return isRecord$6(provider) && Array.isArray(provider.commands) && provider.commands.includes(command);
|
|
307
|
+
}
|
|
308
|
+
async function requestTypeScriptDiagnostics(connection, uri, signal) {
|
|
309
|
+
const diagnostics = [];
|
|
310
|
+
for (const diagnosticCommand of diagnosticCommands) {
|
|
311
|
+
const response = await connection.request("workspace/executeCommand", {
|
|
312
|
+
command,
|
|
313
|
+
arguments: [
|
|
314
|
+
diagnosticCommand,
|
|
315
|
+
{ file: uri },
|
|
316
|
+
{
|
|
317
|
+
executionTarget: 0,
|
|
318
|
+
expectsResult: true
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
}, signal);
|
|
322
|
+
if (!isRecord$6(response) || response.type !== "response" || response.success !== true || !Array.isArray(response.body)) throw malformedResponse();
|
|
323
|
+
for (const item of response.body) diagnostics.push(toDiagnostic(item));
|
|
324
|
+
}
|
|
325
|
+
return diagnostics;
|
|
326
|
+
}
|
|
327
|
+
function toDiagnostic(value) {
|
|
328
|
+
if (!isRecord$6(value) || typeof value.text !== "string" || typeof value.category !== "string" || !Object.hasOwn(severities, value.category) || !Number.isSafeInteger(value.code)) throw malformedResponse();
|
|
329
|
+
return {
|
|
330
|
+
range: {
|
|
331
|
+
start: toPosition(value.start),
|
|
332
|
+
end: toPosition(value.end)
|
|
333
|
+
},
|
|
334
|
+
message: value.text,
|
|
335
|
+
severity: severities[value.category],
|
|
336
|
+
code: value.code,
|
|
337
|
+
source: typeof value.source === "string" ? value.source : "ts"
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function toPosition(value) {
|
|
341
|
+
if (!isRecord$6(value) || typeof value.line !== "number" || typeof value.offset !== "number" || !Number.isSafeInteger(value.line) || !Number.isSafeInteger(value.offset) || value.line < 1 || value.offset < 1) throw malformedResponse();
|
|
342
|
+
return {
|
|
343
|
+
line: value.line - 1,
|
|
344
|
+
character: value.offset - 1
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
function isRecord$6(value) {
|
|
348
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
349
|
+
}
|
|
350
|
+
function malformedResponse() {
|
|
351
|
+
return new WebstackLspError("LSP_MALFORMED_RESPONSE", "TypeScript server returned an invalid diagnostic response");
|
|
352
|
+
}
|
|
353
|
+
|
|
290
354
|
//#endregion
|
|
291
355
|
//#region src/protocol/initialize.ts
|
|
292
356
|
async function initializeServer(connection, params, signal) {
|
|
@@ -1493,6 +1557,10 @@ var WebstackLspRuntime = class {
|
|
|
1493
1557
|
await opened();
|
|
1494
1558
|
return (await connection.request("textDocument/diagnostic", { textDocument: { uri: source.uri } }, deadline))?.items ?? [];
|
|
1495
1559
|
}
|
|
1560
|
+
if (item.server === "typescript" && supportsTypeScriptDiagnostics(session.capabilities)) {
|
|
1561
|
+
await opened();
|
|
1562
|
+
return requestTypeScriptDiagnostics(connection, source.uri, deadline);
|
|
1563
|
+
}
|
|
1496
1564
|
let remove = () => {};
|
|
1497
1565
|
const published = new Promise((resolve$1) => {
|
|
1498
1566
|
remove = connection.onNotification((message) => {
|
|
@@ -1717,7 +1785,7 @@ var WebstackLspRuntime = class {
|
|
|
1717
1785
|
if (opened && connection.isOpen) await connection.notify("textDocument/didClose", { textDocument: { uri: source.uri } }).catch(() => {});
|
|
1718
1786
|
}
|
|
1719
1787
|
}, signal), signal, manualOpen ? (session) => {
|
|
1720
|
-
return !!session.capabilities.diagnosticProvider;
|
|
1788
|
+
return !!session.capabilities.diagnosticProvider || id === "typescript" && supportsTypeScriptDiagnostics(session.capabilities);
|
|
1721
1789
|
} : void 0);
|
|
1722
1790
|
}
|
|
1723
1791
|
};
|
package/lib/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","names":["CLASSIFIERS: ReadonlyArray<{ suffix: string; kind: FileKind }>","basename","ROUTES: Record<ClassifiedFile['kind'], Route>","maxMessageBytes: number","messages: unknown[]","text: string","length: number | undefined","input: Readable","output: Writable","messages: unknown[]","isRecord","resolve","options: ServerSessionOptions","factory: SessionFactory<S>","release!: () => void","resolve","isRange","isRecord","isPosition","isRecord","isRange","isPosition","isRecord","isRecord","options: CodeIntelligenceProtocolOptions","binding: CodeHostBindingV1","scope: { ownerId: string; sessionId: string; workspaceRoot: string }","backend: CodeIntelligenceToolServiceV1","capabilities: (signal: AbortSignal) => Promise<CodeCapabilitiesV1>","fsIdentity: unknown","subprocessIdentity: unknown","onDispose: () => void","response: CodeResponseV1","result: SemanticResult","shortened: CodeResponseV1","config: ResolvedConfig","fs: HostFileSystem","subprocess: HostSubprocess","executable: string","auxiliary: typeof primary","omittedServers: string[]","result: NavigationResult | DiagnosticsResult | CompletionResult"],"sources":["../src/runtime/cancellation.ts","../src/host/dsh.ts","../src/routing/classifier.ts","../src/routing/route-table.ts","../src/routing/tailwind-candidate.ts","../src/protocol/initialize.ts","../src/runtime/framing.ts","../src/runtime/connection.ts","../src/runtime/server-session.ts","../src/runtime/server-pool.ts","../src/protocol/capabilities.ts","../src/protocol/normalize-hover.ts","../src/protocol/normalize-location.ts","../src/protocol/normalize-diagnostic.ts","../src/protocol/normalize-completion.ts","../src/merge/hover.ts","../src/structure/protocol.ts","../src/runtime/webstack-runtime.ts","../src/provider.ts"],"sourcesContent":["export function abortError(): Error {\n const error = new Error('The operation was aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortError()\n}\n\nexport function onAbort(signal: AbortSignal | undefined, callback: () => void): () => void {\n if (!signal) return () => {}\n if (signal.aborted) {\n callback()\n return () => {}\n }\n signal.addEventListener('abort', callback, { once: true })\n return () => signal.removeEventListener('abort', callback)\n}\n\nexport async function withAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n throwIfAborted(signal)\n if (!signal) return promise\n return new Promise<T>((resolve, reject) => {\n const remove = onAbort(signal, () => reject(abortError()))\n promise.then((value) => { remove(); resolve(value) }, (error: unknown) => { remove(); reject(error) })\n })\n}\n","import type { FileSystem } from '@deepseek-ai/dsh-fs'\nimport { WebstackLspError } from '../errors.js'\nimport { throwIfAborted } from '../runtime/cancellation.js'\n\nexport type HostFileSystem = Pick<FileSystem, 'resolve' | 'stat' | 'processPath' | 'fileUrl' | 'contains' | 'streamText'>\nexport interface HostSource { workspace: string; workspaceUri: string; key: string; uri: string; text: string }\n\nexport async function readSource(fs: HostFileSystem, workspaceRoot: string, filePath: string, maxBytes: number, signal?: AbortSignal): Promise<HostSource> {\n if (!workspaceRoot?.trim() || !filePath?.trim()) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot and filePath are required')\n throwIfAborted(signal)\n const options = signal ? { signal } : {}\n const root = await fs.resolve(workspaceRoot, options)\n if ((await fs.stat(root, signal))?.type !== 'directory') throw new Error('workspace root is not a directory')\n const workspace = fs.processPath(root)\n const target = await fs.resolve(filePath, { cwd: workspace, ...options })\n if (!fs.contains(root, target)) throw new Error('source is outside workspace')\n if ((await fs.stat(target, signal))?.type !== 'file') throw new Error('source is not a regular file')\n let text = '', bytes = 0\n for await (const chunk of await fs.streamText(target, signal)) {\n throwIfAborted(signal)\n bytes += Buffer.byteLength(chunk)\n if (bytes > maxBytes) throw new Error('source exceeds document limit')\n text += chunk\n }\n throwIfAborted(signal)\n return { workspace, workspaceUri: fs.fileUrl(root), key: root.targetKey, uri: fs.fileUrl(target), text }\n}\n","export type FileKind = 'blade' | 'php' | 'typescript' | 'typescriptreact' | 'javascript' | 'javascriptreact' | 'svelte' | 'html' | 'css'\n\nexport interface ClassifiedFile {\n path: string\n basename: string\n suffix: string\n kind: FileKind\n}\n\nconst CLASSIFIERS: ReadonlyArray<{ suffix: string; kind: FileKind }> = [\n { suffix: '.blade.php', kind: 'blade' },\n { suffix: '.typescriptreact', kind: 'typescriptreact' },\n { suffix: '.javascriptreact', kind: 'javascriptreact' },\n { suffix: '.tsx', kind: 'typescriptreact' },\n { suffix: '.jsx', kind: 'javascriptreact' },\n { suffix: '.mts', kind: 'typescript' },\n { suffix: '.cts', kind: 'typescript' },\n { suffix: '.mjs', kind: 'javascript' },\n { suffix: '.cjs', kind: 'javascript' },\n { suffix: '.svelte', kind: 'svelte' },\n { suffix: '.html', kind: 'html' },\n { suffix: '.htm', kind: 'html' },\n { suffix: '.php', kind: 'php' },\n { suffix: '.ts', kind: 'typescript' },\n { suffix: '.js', kind: 'javascript' },\n { suffix: '.css', kind: 'css' },\n { suffix: '.pcss', kind: 'css' },\n]\n\nexport function classifyFile(filePath: string, bladeSuffixes: string[] = ['.blade.php']): ClassifiedFile | undefined {\n const normalizedPath = filePath.replaceAll('\\\\', '/')\n const basename = normalizedPath.slice(normalizedPath.lastIndexOf('/') + 1).toLowerCase()\n if (!basename || basename === '.' || basename === '..' || basename.startsWith('.')) return undefined\n const customBlade = bladeSuffixes.map((suffix) => suffix.toLowerCase()).sort((left, right) => right.length - left.length)\n const classifiers = [...customBlade.map((suffix) => ({ suffix, kind: 'blade' as const })), ...CLASSIFIERS.filter((item) => !customBlade.includes(item.suffix))]\n const match = classifiers.find((item) => basename.endsWith(item.suffix))\n if (!match) return undefined\n return { path: normalizedPath, basename, suffix: match.suffix, kind: match.kind }\n}\n\n/** Return the supported suffixes, including configured Blade suffixes. */\nexport function supportedFileSuffixes(bladeSuffixes: string[] = ['.blade.php']): string[] {\n return [...new Set([...bladeSuffixes.map(suffix => suffix.toLowerCase()), ...CLASSIFIERS.map(item => item.suffix)])]\n}\n","import type { ServerId } from '../config.js'\nimport type { ClassifiedFile } from './classifier.js'\n\nexport interface Route {\n primary: { server: ServerId; languageId: string }\n auxiliary?: { server: 'tailwind'; languageId: string }\n}\n\nconst ROUTES: Record<ClassifiedFile['kind'], Route> = {\n blade: { primary: { server: 'phpantom', languageId: 'blade' }, auxiliary: { server: 'tailwind', languageId: 'html' } },\n php: { primary: { server: 'phpantom', languageId: 'php' } },\n typescript: { primary: { server: 'typescript', languageId: 'typescript' }, auxiliary: { server: 'tailwind', languageId: 'typescript' } },\n typescriptreact: { primary: { server: 'typescript', languageId: 'typescriptreact' }, auxiliary: { server: 'tailwind', languageId: 'typescriptreact' } },\n javascript: { primary: { server: 'typescript', languageId: 'javascript' }, auxiliary: { server: 'tailwind', languageId: 'javascript' } },\n javascriptreact: { primary: { server: 'typescript', languageId: 'javascriptreact' }, auxiliary: { server: 'tailwind', languageId: 'javascriptreact' } },\n svelte: { primary: { server: 'svelte', languageId: 'svelte' }, auxiliary: { server: 'tailwind', languageId: 'svelte' } },\n html: { primary: { server: 'html', languageId: 'html' }, auxiliary: { server: 'tailwind', languageId: 'html' } },\n css: { primary: { server: 'css', languageId: 'css' }, auxiliary: { server: 'tailwind', languageId: 'css' } },\n}\n\nexport function routeFor(file: ClassifiedFile): Route {\n const route = ROUTES[file.kind]\n return { primary: { ...route.primary }, ...(route.auxiliary ? { auxiliary: { ...route.auxiliary } } : {}) }\n}\n","const DEFAULT_PATTERNS = [\n /\\bclass\\s*=\\s*[\"'][^\"']*$/i,\n /\\bclassName\\s*=\\s*[\"'][^\"']*$/i,\n /\\bclass:list\\s*=\\s*[\"'][^\"']*$/i,\n /@apply\\s+[\\w-]*$/i,\n /\\b(?:clsx|cva)\\s*\\([^)]*[\"'][^\"']*$/i,\n]\n\nexport function hasTailwindCandidate(source: string, line: number, classRegex: Array<string | [string, string]> = [], character?: number, classAttributes: string[] = ['class', 'className', 'class:list']): boolean {\n const lines = source.split(/\\r?\\n/)\n const context = [...lines.slice(Math.max(0, line - 2), line), (lines[line] ?? '').slice(0, character)].join('\\n')\n if (classAttributes.some(attribute => {\n const index = context.lastIndexOf(attribute + '=')\n return index >= 0 && /^[\\\"'][^\\\"']*$/.test(context.slice(index + attribute.length + 1).trimStart())\n })) return true\n const configured = classRegex.flatMap((item) => Array.isArray(item) ? item : [item]).map((pattern) => new RegExp(pattern))\n return [...DEFAULT_PATTERNS, ...configured].some((pattern) => pattern.test(context))\n}\n","import type { InitializeParams, InitializeResult } from './types.js'\nimport type { JsonRpcConnection } from '../runtime/connection.js'\nimport { throwIfAborted } from '../runtime/cancellation.js'\n\nexport async function initializeServer(connection: JsonRpcConnection, params: InitializeParams, signal?: AbortSignal): Promise<InitializeResult> {\n throwIfAborted(signal)\n const value = await connection.request('initialize', params, signal)\n if (!isInitializeResult(value)) throw new Error('malformed initialize response')\n await connection.notify('initialized', {})\n return value\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && typeof (value as { capabilities?: unknown }).capabilities === 'object' && (value as { capabilities?: unknown }).capabilities !== null\n}\n","import { TextDecoder } from 'node:util'\n\nexport class JsonRpcFrameError extends Error {\n readonly code = 'LSP_MALFORMED_RESPONSE'\n\n constructor(message: string) {\n super(message)\n this.name = 'JsonRpcFrameError'\n }\n}\n\nexport class ContentLengthDecoder {\n private buffer = Buffer.alloc(0)\n private readonly decoder = new TextDecoder('utf-8', { fatal: true })\n\n constructor(private readonly maxMessageBytes: number) {\n if (!Number.isSafeInteger(maxMessageBytes) || maxMessageBytes <= 0) throw new RangeError('maxMessageBytes must be positive')\n }\n\n feed(chunk: Uint8Array): unknown[] {\n this.buffer = Buffer.concat([this.buffer, Buffer.from(chunk)])\n const messages: unknown[] = []\n while (true) {\n const headerEnd = this.buffer.indexOf(Buffer.from('\\r\\n\\r\\n'))\n if (headerEnd < 0) {\n if (this.buffer.length > 8192) throw new JsonRpcFrameError('header exceeds limit')\n break\n }\n const header = this.buffer.subarray(0, headerEnd).toString('ascii')\n const length = this.parseLength(header)\n const bodyStart = headerEnd + 4\n if (length > this.maxMessageBytes) throw new JsonRpcFrameError('message exceeds configured limit')\n if (this.buffer.length < bodyStart + length) break\n const body = this.buffer.subarray(bodyStart, bodyStart + length)\n this.buffer = this.buffer.subarray(bodyStart + length)\n let text: string\n try {\n text = this.decoder.decode(body)\n } catch {\n throw new JsonRpcFrameError('message is not valid UTF-8')\n }\n try {\n messages.push(JSON.parse(text) as unknown)\n } catch {\n throw new JsonRpcFrameError('message body is not valid JSON')\n }\n }\n return messages\n }\n\n end(): void {\n if (this.buffer.length > 0) throw new JsonRpcFrameError('incomplete JSON-RPC frame')\n }\n\n private parseLength(header: string): number {\n const lines = header.split('\\r\\n')\n let length: number | undefined\n for (const line of lines) {\n const separator = line.indexOf(':')\n if (separator < 1) throw new JsonRpcFrameError('malformed header')\n const key = line.slice(0, separator).toLowerCase()\n const value = line.slice(separator + 1).trim()\n if (key === 'content-length') {\n if (length !== undefined || !/^\\d+$/.test(value)) throw new JsonRpcFrameError('invalid Content-Length')\n length = Number(value)\n }\n }\n if (length === undefined || !Number.isSafeInteger(length)) throw new JsonRpcFrameError('Content-Length is required')\n return length\n }\n}\n\nexport function encodeJsonRpc(message: object): Buffer {\n const body = Buffer.from(JSON.stringify(message), 'utf8')\n return Buffer.concat([Buffer.from(`Content-Length: ${body.length}\\r\\n\\r\\n`, 'ascii'), body])\n}\n","import type { Readable, Writable } from 'node:stream'\nimport { abortError, onAbort, throwIfAborted } from './cancellation.js'\nimport { ContentLengthDecoder, encodeJsonRpc, JsonRpcFrameError } from './framing.js'\nimport type { JsonRpcConnectionOptions, JsonRpcId, JsonRpcMessage, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse } from '../protocol/types.js'\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n method: string\n}\n\nexport class JsonRpcConnection {\n private readonly decoder: ContentLengthDecoder\n private readonly pending = new Map<JsonRpcId, PendingRequest>()\n private readonly notificationListeners = new Set<(notification: JsonRpcNotification) => void>()\n private nextId = 1\n private closed = false\n private requestHandler: NonNullable<JsonRpcConnectionOptions['onServerRequest']>\n\n constructor(private readonly input: Readable, private readonly output: Writable, options: JsonRpcConnectionOptions) {\n this.decoder = new ContentLengthDecoder(options.maxMessageBytes)\n this.requestHandler = options.onServerRequest ?? (() => null)\n if (options.onNotification) this.notificationListeners.add(options.onNotification)\n input.on('data', (chunk: Buffer) => this.receive(chunk))\n input.once('end', () => this.close(new Error('LSP process closed stdout')))\n input.once('error', (error) => this.close(error))\n output.on('error', (error) => this.close(error))\n }\n\n get isOpen(): boolean { return !this.closed }\n\n onNotification(listener: (notification: JsonRpcNotification) => void): () => void {\n this.notificationListeners.add(listener)\n return () => this.notificationListeners.delete(listener)\n }\n\n setRequestHandler(handler: NonNullable<JsonRpcConnectionOptions['onServerRequest']>): void {\n this.requestHandler = handler\n }\n\n async request(method: string, params?: unknown, signal?: AbortSignal): Promise<unknown> {\n throwIfAborted(signal)\n if (this.closed) throw new Error('connection is closed')\n const id = this.nextId++\n const promise = new Promise<unknown>((resolve, reject) => this.pending.set(id, { resolve, reject, method }))\n void promise.catch(() => {})\n const remove = onAbort(signal, () => {\n void this.notify('$/cancelRequest', { id }).catch(() => {})\n this.pending.get(id)?.reject(abortError())\n this.pending.delete(id)\n })\n try {\n void this.write({ jsonrpc: '2.0', id, method, ...(params === undefined ? {} : { params }) }).catch(error => this.close(error))\n return await promise\n } finally {\n remove()\n this.pending.delete(id)\n }\n }\n\n async notify(method: string, params?: unknown): Promise<void> {\n if (this.closed) throw new Error('connection is closed')\n await this.write({ jsonrpc: '2.0', method, ...(params === undefined ? {} : { params }) })\n }\n\n close(reason = new Error('connection closed')): void {\n if (this.closed) return\n this.closed = true\n for (const pending of this.pending.values()) pending.reject(reason)\n this.pending.clear()\n }\n\n private receive(chunk: Buffer): void {\n if (this.closed) return\n let messages: unknown[]\n try {\n messages = this.decoder.feed(chunk)\n } catch (error) {\n this.close(error instanceof Error ? error : new JsonRpcFrameError('invalid frame'))\n return\n }\n for (const message of messages) this.dispatch(message)\n }\n\n private dispatch(value: unknown): void {\n if (!isRecord(value) || value.jsonrpc !== '2.0') return this.close(new JsonRpcFrameError('invalid JSON-RPC message'))\n if ('method' in value && typeof value.method === 'string') {\n if ('id' in value) {\n const request = value as unknown as JsonRpcRequest\n Promise.resolve().then(() => this.requestHandler(request.method, request.params)).then(\n (result) => this.write({ jsonrpc: '2.0', id: request.id, result }),\n (error: unknown) => this.write({ jsonrpc: '2.0', id: request.id, error: { code: -32603, message: error instanceof Error ? error.message : 'server request failed' } }),\n ).catch(() => {})\n } else {\n for (const listener of this.notificationListeners) listener(value as unknown as JsonRpcNotification)\n }\n return\n }\n if ('id' in value) {\n const response = value as unknown as JsonRpcResponse\n const pending = this.pending.get(response.id)\n if (!pending) return\n if (response.error) pending.reject(new Error(`${response.error.code}: ${response.error.message}`))\n else pending.resolve(response.result)\n this.pending.delete(response.id)\n }\n }\n\n private write(message: JsonRpcMessage): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.output.write(encodeJsonRpc(message), (error?: Error | null) => error ? reject(error) : resolve())\n })\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { SubprocessHandle } from '@deepseek-ai/dsh-subprocess'\nimport type { InitializeParams, InitializeResult } from '../protocol/types.js'\nimport { initializeServer } from '../protocol/initialize.js'\nimport { JsonRpcConnection } from './connection.js'\nimport { withAbort, throwIfAborted } from './cancellation.js'\n\nexport type SessionState = 'NEW' | 'STARTING' | 'READY' | 'STOPPING' | 'STOPPED' | 'FAILED'\nexport interface ServerSessionOptions {\n spawn(): SubprocessHandle\n initialize: InitializeParams\n configuration: unknown\n maxMessageBytes: number\n shutdown: { shutdownMs: number; killGraceMs: number }\n}\n\nexport class ServerSession {\n state: SessionState = 'NEW'\n capabilities: Record<string, unknown> = {}\n private child?: SubprocessHandle\n private connection?: JsonRpcConnection\n private stopping?: Promise<void>\n private readonly lifetime = new AbortController()\n constructor(private readonly options: ServerSessionOptions) {}\n\n async start(signal?: AbortSignal): Promise<InitializeResult> {\n throwIfAborted(signal)\n this.state = 'STARTING'\n try {\n const child = this.options.spawn()\n this.child = child\n // Observe failed spawn even when stdio could not be allocated.\n void child.done.catch(() => {})\n if (!child.stdout || !child.stdin) throw new Error('server stdio is unavailable')\n const connection = new JsonRpcConnection(child.stdout, child.stdin, {\n maxMessageBytes: this.options.maxMessageBytes,\n onServerRequest: (method, params) => this.answer(method, params),\n })\n this.connection = connection\n void child.done.then(() => connection.close(new Error('LSP process exited')), error => connection.close(error instanceof Error ? error : new Error('LSP spawn failed'))).then(() => {\n if (this.state !== 'STOPPING' && this.state !== 'STOPPED') this.state = 'FAILED'\n })\n const result = await initializeServer(connection, this.options.initialize, this.signal(signal))\n if (result.capabilities.positionEncoding && result.capabilities.positionEncoding !== 'utf-16') throw new Error('server requires unsupported position encoding')\n const sync = result.capabilities.textDocumentSync\n if (sync === undefined || sync === 0 || (typeof sync === 'object' && sync !== null && !(sync as { openClose?: boolean }).openClose)) throw new Error('server does not support document open/close')\n this.capabilities = result.capabilities\n await connection.notify('workspace/didChangeConfiguration', { settings: this.options.configuration })\n throwIfAborted(this.signal(signal))\n this.state = 'READY'\n return result\n } catch (error) {\n this.state = 'FAILED'\n await this.stop()\n throw error\n }\n }\n\n get usable(): boolean { return this.state === 'READY' && !!this.connection?.isOpen }\n isUsable(): boolean { return this.usable }\n async run<T>(task: (connection: JsonRpcConnection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!this.usable || !this.connection) throw new Error('session is not ready')\n try { return await withAbort(task(this.connection), this.signal(signal)) }\n catch (error) {\n // Stop cancelled work before the next queued request can reuse this process.\n if (signal?.aborted || !this.connection.isOpen) await this.stop()\n throw error\n }\n }\n\n stop(): Promise<void> {\n return this.stopping ??= this.teardown()\n }\n private async teardown(): Promise<void> {\n this.state = 'STOPPING'\n this.lifetime.abort()\n const child = this.child, connection = this.connection\n const timeout = AbortSignal.timeout(this.options.shutdown.shutdownMs)\n if (connection?.isOpen) {\n try { await connection.request('shutdown', null, timeout); await connection.notify('exit') } catch {}\n }\n connection?.close(new Error('session stopped'))\n if (child) {\n child.terminate()\n if (!await child.waitForExit(AbortSignal.timeout(this.options.shutdown.killGraceMs + 1000))) throw new Error('language server process tree did not exit within the cleanup deadline')\n }\n this.state = 'STOPPED'\n }\n private signal(signal?: AbortSignal): AbortSignal { return signal ? AbortSignal.any([signal, this.lifetime.signal]) : this.lifetime.signal }\n private answer(method: string, params: unknown): unknown {\n if (method === 'workspace/applyEdit') return { applied: false, failureReason: 'read-only provider' }\n if (method === 'workspace/workspaceFolders') return this.options.initialize.workspaceFolders ?? []\n if (method === 'workspace/configuration') {\n const items = (params as { items?: Array<{ section?: string }> } | undefined)?.items ?? []\n return items.map(item => {\n let value = this.options.configuration\n for (const key of item.section?.split('.') ?? []) {\n value = typeof value === 'object' && value !== null ? (value as Record<string, unknown>)[key] : undefined\n }\n return value ?? null\n })\n }\n return null\n }\n}\n","import { throwIfAborted, withAbort } from './cancellation.js'\n\nexport interface PoolSession {\n readonly state: string\n start(signal?: AbortSignal): Promise<unknown>\n stop(): Promise<void>\n isUsable(): boolean\n}\nexport type SessionFactory<S extends PoolSession> = (serverId: string, workspace: string, signal?: AbortSignal) => Promise<S>\n\nexport class ServerPool<S extends PoolSession> {\n private readonly sessions = new Map<string, S>()\n private readonly creation = new Map<string, Promise<S>>()\n private readonly queues = new Map<string, Promise<void>>()\n private disposing = false\n constructor(private readonly factory: SessionFactory<S>) {}\n\n async getOrCreate(serverId: string, workspace: string, signal?: AbortSignal): Promise<S> {\n throwIfAborted(signal)\n if (this.disposing) throw new Error('server pool is disposing')\n const key = keyOf(serverId, workspace)\n const existing = this.sessions.get(key)\n if (existing?.isUsable()) return existing\n const pending = this.creation.get(key)\n if (pending) return withAbort(pending, signal)\n const creation = this.create(key, serverId, workspace, existing, signal)\n this.creation.set(key, creation)\n try { return await creation }\n finally { if (this.creation.get(key) === creation) this.creation.delete(key) }\n }\n\n run<T>(serverId: string, workspace: string, task: (session: S) => Promise<T>, signal?: AbortSignal): Promise<T> {\n return this.serialize(keyOf(serverId, workspace), async () => task(await this.getOrCreate(serverId, workspace, signal)), signal)\n }\n\n runWithRetry<T>(serverId: string, workspace: string, task: (session: S) => Promise<T>, signal?: AbortSignal, canReuse?: (session: S) => boolean): Promise<T> {\n // Keep failure eviction and the retry inside the same queue slot. A later query\n // must never enter a replacement process before the failed query finishes cleanup.\n return this.serialize(keyOf(serverId, workspace), async () => {\n const existing = this.sessions.get(keyOf(serverId, workspace))\n // Replacement belongs to this queue slot, after earlier work has completed.\n if (existing?.isUsable() && canReuse && !canReuse(existing)) await this.evict(serverId, workspace)\n for (let attempt = 0; ; attempt++) {\n const session = await this.getOrCreate(serverId, workspace, signal)\n try { return await task(session) }\n catch (error) {\n throwIfAborted(signal)\n if (attempt > 0 || session.isUsable()) throw error\n if (this.sessions.get(keyOf(serverId, workspace)) === session) await this.evict(serverId, workspace)\n }\n }\n }, signal)\n }\n\n async evict(serverId: string, workspace: string): Promise<void> {\n const key = keyOf(serverId, workspace)\n const session = this.sessions.get(key)\n this.sessions.delete(key)\n if (session) await session.stop()\n }\n\n async disposeAll(): Promise<void> {\n this.disposing = true\n const results = await Promise.allSettled([...this.sessions.values()].map(session => session.stop()))\n this.sessions.clear()\n await Promise.all([...this.creation.values()].map(creation => creation.then(session => session.stop(), () => {})))\n this.creation.clear()\n const failures = results.filter((result): result is PromiseRejectedResult => result.status === 'rejected')\n if (failures.length) throw new AggregateError(failures.map(result => result.reason), 'language server cleanup failed')\n }\n\n get size(): number { return this.sessions.size }\n\n private async serialize<T>(key: string, task: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const previous = this.queues.get(key) ?? Promise.resolve()\n let release!: () => void\n const current = new Promise<void>(resolve => { release = resolve })\n this.queues.set(key, current)\n try {\n await withAbort(previous, signal)\n throwIfAborted(signal)\n return await task()\n } finally {\n // A cancelled waiter cannot let its successor bypass still-running work.\n void previous.then(release, release)\n void current.then(() => { if (this.queues.get(key) === current) this.queues.delete(key) })\n }\n }\n\n private async create(key: string, serverId: string, workspace: string, previous?: S, signal?: AbortSignal): Promise<S> {\n if (previous) { this.sessions.delete(key); await previous.stop() }\n throwIfAborted(signal)\n const session = await this.factory(serverId, workspace, signal)\n try { await session.start(signal) } catch (error) { await session.stop(); throw error }\n if (this.disposing) { await session.stop(); throw new Error('server pool is disposing') }\n this.sessions.set(key, session)\n return session\n }\n}\n\nexport function keyOf(serverId: string, workspace: string): string { return `${serverId}\\u0000${workspace}` }\n","export type StandardOperation = 'goToDefinition' | 'findReferences' | 'goToImplementation' | 'hover'\n\nexport function supportsOperation(capabilities: Record<string, unknown>, operation: StandardOperation): boolean {\n if (operation === 'goToDefinition') return capabilities.definitionProvider === true || isProvider(capabilities.definitionProvider)\n if (operation === 'findReferences') return capabilities.referencesProvider === true || isProvider(capabilities.referencesProvider)\n if (operation === 'goToImplementation') return capabilities.implementationProvider === true || isProvider(capabilities.implementationProvider)\n return capabilities.hoverProvider === true || isProvider(capabilities.hoverProvider)\n}\n\nfunction isProvider(value: unknown): boolean {\n return typeof value === 'object' && value !== null || value === true\n}\n\nexport function defaultServerRequest(method: string, params: unknown): unknown {\n if (method === 'workspace/configuration') {\n return Array.isArray(params) ? params.map(() => null) : []\n }\n if (method === 'window/workDoneProgress/create' || method === 'client/registerCapability' || method === 'client/unregisterCapability') return null\n if (method === 'workspace/applyEdit') return { applied: false, failureReason: 'read-only provider' }\n return null\n}\n","import type { LspRange } from '../service.js'\n\nexport interface NormalizedHover {\n contents: string\n range?: LspRange\n}\n\nexport function normalizeHover(value: unknown): NormalizedHover | null | undefined {\n if (value === null || value === undefined) return null\n if (typeof value !== 'object' || value === null) return undefined\n const record = value as { contents?: unknown; range?: unknown }\n const contents = normalizeContents(record.contents)\n if (contents === undefined) return undefined\n return { contents, ...(isRange(record.range) ? { range: record.range } : {}) }\n}\n\nfunction normalizeContents(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) {\n const parts = value.map((item) => typeof item === 'string' ? item : isRecord(item) && typeof item.value === 'string' ? item.value : undefined)\n return parts.every((item): item is string => item !== undefined) ? parts.join('\\n') : undefined\n }\n if (isRecord(value) && typeof value.value === 'string') return value.value\n return undefined\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): boolean {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { LspPosition, LspRange } from '../service.js'\n\nexport interface NormalizedLocation {\n uri: string\n range: LspRange\n}\n\nexport function normalizeLocation(value: unknown): NormalizedLocation | undefined {\n if (isRecord(value) && typeof value.targetUri === 'string' && isRange(value.targetSelectionRange)) return { uri: value.targetUri, range: value.targetSelectionRange }\n if (!isRecord(value) || typeof value.uri !== 'string' || !isRange(value.range)) return undefined\n return { uri: value.uri, range: value.range }\n}\n\nexport function normalizeLocations(value: unknown): NormalizedLocation[] {\n const values = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n return values.map(normalizeLocation).filter((location): location is NormalizedLocation => location !== undefined)\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): value is LspPosition {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { LspRange, NormalizedDiagnostic } from '../service.js'\n\nexport function normalizeDiagnostic(value: unknown, server: string, fallbackUri: string): NormalizedDiagnostic | undefined {\n if (!isRecord(value) || !isRange(value.range) || typeof value.message !== 'string') return undefined\n const uri = typeof value.uri === 'string' ? value.uri : fallbackUri\n const severity = typeof value.severity === 'number' && value.severity >= 1 && value.severity <= 4 ? value.severity as 1 | 2 | 3 | 4 : undefined\n const code = typeof value.code === 'string' || typeof value.code === 'number' ? value.code : undefined\n return { server, uri, range: value.range, message: value.message, ...(severity === undefined ? {} : { severity }), ...(code === undefined ? {} : { code }), ...(typeof value.source === 'string' ? { source: value.source } : {}) }\n}\n\nexport function normalizeDiagnostics(value: unknown, server: string, fallbackUri: string): NormalizedDiagnostic[] {\n const values = Array.isArray(value) ? value : []\n return values.map((item) => normalizeDiagnostic(item, server, fallbackUri)).filter((item): item is NormalizedDiagnostic => item !== undefined)\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): boolean {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { NormalizedCompletionItem } from '../service.js'\n\nexport function normalizeCompletionItem(value: unknown, server: string): NormalizedCompletionItem | undefined {\n if (!isRecord(value) || typeof value.label !== 'string' || value.label.length === 0) return undefined\n return {\n server,\n label: value.label,\n ...(typeof value.kind === 'number' ? { kind: value.kind } : {}),\n ...(typeof value.detail === 'string' ? { detail: value.detail } : {}),\n ...(typeof value.documentation === 'string' ? { documentation: value.documentation } : {}),\n ...(typeof value.sortText === 'string' ? { sortText: value.sortText } : {}),\n ...(typeof value.filterText === 'string' ? { filterText: value.filterText } : {}),\n ...(typeof value.insertText === 'string' ? { insertText: value.insertText } : {}),\n ...(typeof value.insertTextFormat === 'number' ? { insertTextFormat: value.insertTextFormat } : {}),\n ...(typeof value.deprecated === 'boolean' ? { deprecated: value.deprecated } : {}),\n }\n}\n\nexport function normalizeCompletion(value: unknown, server: string): NormalizedCompletionItem[] {\n const items = isRecord(value) && Array.isArray(value.items) ? value.items : Array.isArray(value) ? value : []\n return items.map((item) => normalizeCompletionItem(item, server)).filter((item): item is NormalizedCompletionItem => item !== undefined)\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { NormalizedHover } from '../protocol/normalize-hover.js'\nimport type { LspRange } from '../service.js'\n\nexport interface ServerHover extends NormalizedHover {\n server: string\n}\n\nexport function mergeHover(primary: ServerHover | null | undefined, auxiliary: ServerHover | null | undefined): ServerHover | null {\n if (!primary && !auxiliary) return null\n if (!primary) return auxiliary ? { ...auxiliary } : null\n if (!auxiliary) return { ...primary }\n const contents = [primary.contents, auxiliary.contents].filter((value, index, values) => values.indexOf(value) === index)\n const range = sameRange(primary.range, auxiliary.range) ? primary.range : undefined\n return { server: primary.server, contents: contents.join('\\n\\n'), ...(range ? { range } : {}) }\n}\n\nfunction sameRange(left: LspRange | undefined, right: LspRange | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n","import { symbols } from '@deepseek-ai/cordis'\nimport { isAbsolute } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport { WebstackLspError } from '../errors.js'\nimport type { CodeCapabilitiesV1, CodeHostBindingV1, CodeIntelligenceServiceV1, CodeLeaseV1, CodeRequestV1, CodeResponseV1, CodeStatus } from '../code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1, SemanticResult, StructureNode } from './types.js'\n\nconst CAPABILITIES = ['snapshots', 'structure', 'semantic'] as const\nconst MAX_FILES = 100\nconst MAX_INPUT_BYTES = 16 * 1024 * 1024\nconst MAX_OUTPUT_BYTES = 64 * 1024\nconst MAX_CALLS = 100\nconst MAX_BATCH_MS = 30_000\nconst RESPONSE_BYTES = 32 * 1024\n\nexport interface CodeIntelligenceProtocolOptions {\n backend: CodeIntelligenceToolServiceV1\n fs: unknown\n subprocess: unknown\n capabilities(signal: AbortSignal): Promise<CodeCapabilitiesV1>\n}\n\n/** Host-bound V1 facade. Each lease owns its handles and cumulative evaluation budget. */\nexport class CodeIntelligenceProtocolService implements CodeIntelligenceServiceV1 {\n readonly version = 1 as const\n readonly capabilities = CAPABILITIES\n private readonly leases = new Set<CodeLease>()\n private closed = false\n\n constructor(private readonly options: CodeIntelligenceProtocolOptions) {}\n\n async bind(binding: CodeHostBindingV1, signal: AbortSignal): Promise<CodeLeaseV1> {\n if (this.closed) throw new WebstackLspError('LSP_DISPOSED', 'code-intelligence service is disposed')\n validateBinding(binding)\n signal.throwIfAborted()\n await binding.assertCurrent()\n const contextFs = binding.context.get('fs', false)\n const contextSubprocess = binding.context.get('subprocess', false)\n if (identity(contextFs) !== identity(this.options.fs) || identity(contextSubprocess) !== identity(this.options.subprocess))\n throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'host services do not match the provider scope')\n const scope = {\n ownerId: `${binding.owner.agentId}:code:${randomUUID()}`,\n sessionId: binding.owner.sessionId,\n workspaceRoot: binding.workspaceRoot,\n }\n const lease = new CodeLease(binding, scope, this.options.backend, this.options.capabilities, identity(this.options.fs), identity(this.options.subprocess), () => this.leases.delete(lease))\n this.leases.add(lease)\n try {\n await lease.assertCurrent(signal)\n if (this.closed) throw new WebstackLspError('LSP_DISPOSED', 'code-intelligence service is disposed')\n return lease\n } catch (error) {\n await lease.dispose()\n throw error\n }\n }\n\n async dispose(): Promise<void> {\n if (this.closed) return\n this.closed = true\n await Promise.all([...this.leases].map(lease => lease.dispose()))\n }\n}\n\nclass CodeLease implements CodeLeaseV1 {\n private readonly lifetime = new AbortController()\n private readonly snapshots = new Map<string, { version: string; path: string }>()\n private readonly nodes = new Map<string, string>()\n private calls = 0\n private files = 0\n private inputBytes = 0\n private outputBytes = 0\n private readonly started = performance.now()\n private disposed = false\n private disposal?: Promise<void>\n\n constructor(\n private readonly binding: CodeHostBindingV1,\n private readonly scope: { ownerId: string; sessionId: string; workspaceRoot: string },\n private readonly backend: CodeIntelligenceToolServiceV1,\n private readonly capabilities: (signal: AbortSignal) => Promise<CodeCapabilitiesV1>,\n private readonly fsIdentity: unknown,\n private readonly subprocessIdentity: unknown,\n private readonly onDispose: () => void,\n ) {}\n\n async assertCurrent(signal: AbortSignal): Promise<void> {\n signal.throwIfAborted()\n if (this.disposed) throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'code evaluation has ended')\n await this.binding.assertCurrent()\n if (identity(this.binding.context.get('fs', false)) !== this.fsIdentity || identity(this.binding.context.get('subprocess', false)) !== this.subprocessIdentity)\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'host service scope changed')\n signal.throwIfAborted()\n }\n\n async request(input: CodeRequestV1, caller: AbortSignal): Promise<CodeResponseV1> {\n const release = input?.method === 'snapshot.release'\n if (!release) this.calls++\n if (this.disposed) return this.account(outcome('stale', 'evaluation_closed'))\n if (!validCodeRequest(input)) return this.account(outcome('unsupported', 'invalid_request'))\n if (caller.aborted) return this.account(outcome(caller.reason?.name === 'TimeoutError' ? 'timeout' : 'cancelled', caller.reason?.name === 'TimeoutError' ? 'caller_deadline' : 'caller_cancelled'))\n\n if (release) return this.release(input.handle)\n if (this.calls > MAX_CALLS || this.outputBytes >= MAX_OUTPUT_BYTES || this.files >= MAX_FILES && input.method === 'snapshot.open' || this.inputBytes >= MAX_INPUT_BYTES && input.method === 'snapshot.open')\n return this.account(outcome('limit_exceeded', 'evaluation_budget'))\n const remaining = MAX_BATCH_MS - (performance.now() - this.started)\n if (remaining <= 0) return this.account(outcome('timeout', 'batch_deadline'))\n if ('handle' in input && !this.snapshots.has(input.handle) || 'nodeHandle' in input && !this.nodes.has(input.nodeHandle))\n return this.account(outcome('stale', 'unknown_handle'))\n\n const duration = input.method === 'semantic.query' ? 10_000 : 2_000\n const timeout = AbortSignal.timeout(Math.max(1, Math.floor(Math.min(remaining, duration))))\n const signal = AbortSignal.any([caller, this.lifetime.signal, timeout])\n try {\n await this.assertCurrent(signal)\n let response: CodeResponseV1\n if (input.method === 'capabilities') response = this.capabilitiesResponse(await this.capabilities(signal))\n else if (input.method === 'snapshot.open') response = await this.open(input, signal)\n else response = await this.query(input, signal)\n await this.assertCurrent(signal)\n return this.account(boundResponse(response))\n } catch (error) {\n if (signal.aborted) return this.account(outcome(this.lifetime.signal.aborted || caller.aborted && caller.reason?.name !== 'TimeoutError' ? 'cancelled' : 'timeout', caller.aborted ? caller.reason?.name === 'TimeoutError' ? 'caller_deadline' : 'caller_cancelled' : 'operation_deadline'))\n if (error instanceof WebstackLspError) return this.account(mapError(error))\n return this.account(outcome('unavailable', 'provider_operation_failed'))\n }\n }\n\n private async open(input: Extract<CodeRequestV1, { method: 'snapshot.open' }>, signal: AbortSignal): Promise<CodeResponseV1> {\n this.files++\n const opened = await this.backend.snapshot.open(this.scope, input.path, signal)\n const version = `${opened.version}:${opened.contentHash}`\n const response: CodeResponseV1 = {\n protocol: 'code-intelligence/v1',\n status: 'ok',\n sourceKind: 'disk',\n freshness: 'pinned',\n snapshotVersion: version,\n truncated: false,\n omitted: 0,\n inputBytes: opened.sourceBytes,\n data: { handle: opened.handle, path: opened.filePath, language: opened.language ?? 'unsupported', parseErrors: opened.parseErrors },\n }\n if (this.inputBytes + opened.sourceBytes > MAX_INPUT_BYTES) {\n await this.backend.snapshot.release(this.scope, opened.handle).catch(() => {})\n return outcome('limit_exceeded', 'input_budget')\n }\n this.inputBytes += opened.sourceBytes\n this.snapshots.set(opened.handle, { version, path: opened.filePath })\n return response\n }\n\n private async query(input: Exclude<CodeRequestV1, { method: 'capabilities' | 'snapshot.open' | 'snapshot.release' }>, signal: AbortSignal): Promise<CodeResponseV1> {\n const handle = 'handle' in input ? input.handle : this.nodes.get(input.nodeHandle)!\n const snapshot = this.snapshots.get(handle)\n if (!snapshot) return outcome('stale', 'unknown_handle')\n const metadata = { snapshotVersion: snapshot.version, freshness: 'current' as const }\n if (input.method === 'structure.outline') {\n const result = await this.backend.structure.outline(this.scope, input.handle, { ...(input.range ? { range: input.range } : {}), ...(input.limit ? { limit: input.limit } : {}) }, signal)\n const items = result.declarations.map(projectNode)\n this.rememberNodes(handle, items)\n const status = result.truncated && result.status === 'ok' ? 'partial' : result.status\n return responseFor(status, result.status === 'unsupported' ? 'grammar_missing' : result.errors.hasError ? 'parse_errors' : undefined, metadata, { items }, result.truncated, result.truncated ? 1 : 0)\n }\n if (input.method === 'structure.enclosing') {\n const result = await this.backend.structure.enclosing(this.scope, input.handle, input.position, input.kinds ? { kinds: input.kinds } : undefined, signal)\n const items = [...(result.node ? [result.node] : []), ...result.ancestors].map(projectNode)\n this.rememberNodes(handle, items)\n return responseFor(result.status, result.status === 'unsupported' ? 'grammar_missing' : result.errors?.hasError ? 'parse_errors' : undefined, metadata, { items })\n }\n if (input.method === 'structure.query') {\n const result = await this.backend.structure.query(this.scope, input.handle, input.queryId, { ...(input.range ? { range: input.range } : {}), ...(input.limit ? { limit: input.limit } : {}) }, signal)\n const items = result.captures.map(capture => ({ handle: capture.nodeHandle, kind: capture.kind, range: capture.range, ...(capture.name ? { name: capture.name } : {}) }))\n this.rememberNodes(handle, items)\n return responseFor(result.truncated && result.status === 'ok' ? 'partial' : result.status, undefined, metadata, { items, queryId: result.queryId }, result.truncated, result.truncated ? 1 : 0)\n }\n if (input.method === 'structure.span') {\n const result = await this.backend.structure.span(this.scope, input.nodeHandle, input.maxChars, signal)\n return responseFor(result.status, undefined, metadata, { text: result.text, range: result.range }, result.truncated, result.truncated ? 1 : 0)\n }\n return this.semantic(input, metadata, signal)\n }\n\n private async semantic(input: Extract<CodeRequestV1, { method: 'semantic.query' }>, metadata: { snapshotVersion: string; freshness: 'current' }, signal: AbortSignal): Promise<CodeResponseV1> {\n const result: SemanticResult = await this.backend.semantic.query(this.scope, input.handle, {\n operation: input.kind,\n ...(input.position ? { position: input.position } : {}),\n ...(input.limit ? { maxResults: input.limit } : {}),\n }, signal)\n if (result.status === 'unsupported' || result.status === 'unavailable' || result.status === 'stale' || result.status === 'timeout' || result.status === 'cancelled' || result.status === 'limit_exceeded')\n return responseFor(result.status, `semantic_${result.status}`, metadata)\n const value = result.result\n if (input.kind === 'hover') {\n if (!isRecord(value) || value.kind !== 'hover') return outcome('unavailable', 'semantic_result_invalid')\n const hover = value.hover\n if (hover === null) return responseFor(result.status, undefined, metadata, { hover: null })\n if (!isRecord(hover) || typeof hover.contents !== 'string') return outcome('unavailable', 'semantic_result_invalid')\n const contents = trimUtf16(hover.contents, 16_000)\n const truncated = contents !== hover.contents\n return responseFor(result.status, undefined, metadata, { hover: { contents, ...(hover.range ? { range: hover.range } : {}) } }, truncated, truncated ? hover.contents.length - contents.length : 0)\n }\n if (input.kind === 'completion') {\n if (!isRecord(value) || !Array.isArray(value.items)) return outcome('unavailable', 'semantic_result_invalid')\n let truncated = Boolean(result.truncated)\n const items = value.items.map((item: any) => ({\n label: typeof item.label === 'string' ? item.label.slice(0, 1000) : '',\n ...(typeof item.detail === 'string' ? { detail: item.detail.slice(0, 4000) } : {}),\n ...(typeof item.documentation === 'string' ? { documentation: item.documentation.slice(0, 8000) } : {}),\n ...(Number.isInteger(item.kind) ? { kind: item.kind } : {}),\n ...(typeof item.insertText === 'string' ? { insertText: item.insertText.slice(0, 8000) } : {}),\n }))\n if (items.some((item, index) => item.label !== value.items[index]?.label || item.detail !== value.items[index]?.detail || item.documentation !== value.items[index]?.documentation || item.insertText !== value.items[index]?.insertText)) truncated = true\n const limit = input.limit ?? 200\n const omitted = (result.omitted ?? 0) + Math.max(0, items.length - limit)\n return responseFor(truncated || omitted ? 'partial' : result.status, undefined, metadata, { items: items.slice(0, limit) }, truncated || omitted > 0, omitted)\n }\n if (input.kind === 'diagnostics') {\n if (!isRecord(value) || !Array.isArray(value.diagnostics)) return outcome('unavailable', 'semantic_result_invalid')\n if (value.skipped) return responseFor('unsupported', 'unsupported_file_type', metadata)\n let truncated = Boolean(result.truncated)\n const items = value.diagnostics.map((item: any) => {\n const message = typeof item.message === 'string' ? item.message.slice(0, 8000) : ''\n if (message !== item.message) truncated = true\n return { uri: item.uri, range: item.range, message, ...(Number.isInteger(item.severity) ? { severity: item.severity } : {}) }\n })\n const limit = input.limit ?? 200\n const omitted = (result.omitted ?? 0) + Math.max(0, items.length - limit)\n return responseFor(truncated || omitted || result.status === 'partial' ? 'partial' : result.status, undefined, metadata, { items: items.slice(0, limit) }, truncated || omitted > 0, omitted)\n }\n if (!isRecord(value) || value.kind !== 'locations' || !Array.isArray(value.locations)) return outcome('unavailable', 'semantic_result_invalid')\n return responseFor(result.status, undefined, metadata, { items: value.locations }, Boolean(result.truncated), result.omitted ?? 0)\n }\n\n private async release(handle: string): Promise<CodeResponseV1> {\n const known = this.snapshots.delete(handle)\n for (const [node, snapshot] of this.nodes) if (snapshot === handle) this.nodes.delete(node)\n if (!known) return responseFor('ok', 'released', { sourceKind: 'disk', freshness: 'unknown' }, { released: false })\n const result = await this.backend.snapshot.release(this.scope, handle)\n return responseFor('ok', 'released', { sourceKind: 'disk', freshness: 'unknown' }, result)\n }\n\n private capabilitiesResponse(capabilities: CodeCapabilitiesV1): CodeResponseV1 {\n return responseFor('ok', 'capabilities', { sourceKind: 'disk', freshness: 'unknown' }, capabilities)\n }\n\n private rememberNodes(snapshotHandle: string, items: Array<{ handle: string }>): void {\n for (const item of items) this.nodes.set(item.handle, snapshotHandle)\n }\n\n private account(response: CodeResponseV1): CodeResponseV1 {\n const bytes = Buffer.byteLength(JSON.stringify(response))\n if (bytes > RESPONSE_BYTES) response = outcome('limit_exceeded', 'response_limit')\n this.outputBytes += Buffer.byteLength(JSON.stringify(response))\n if (this.outputBytes > MAX_OUTPUT_BYTES) return outcome('limit_exceeded', 'response_budget')\n return response\n }\n\n dispose(): Promise<void> {\n if (this.disposal) return this.disposal\n this.disposed = true\n this.lifetime.abort()\n this.snapshots.clear()\n this.nodes.clear()\n this.onDispose()\n this.disposal = Promise.resolve(this.backend.releaseOwner?.(this.scope)).then(() => undefined, () => undefined)\n return this.disposal\n }\n}\n\nfunction outcome(status: CodeStatus, reason: string): CodeResponseV1 {\n return { protocol: 'code-intelligence/v1', status, reason, sourceKind: 'disk', freshness: status === 'stale' ? 'stale' : 'unknown', truncated: false, omitted: 0 }\n}\n\nfunction responseFor(status: CodeStatus, reason: string | undefined, metadata: { snapshotVersion?: string; freshness: CodeResponseV1['freshness']; sourceKind?: 'disk' }, data?: unknown, truncated = false, omitted = 0): CodeResponseV1 {\n const successful = status === 'ok' || status === 'partial'\n return { protocol: 'code-intelligence/v1', status, ...(reason ? { reason } : {}), sourceKind: 'disk', freshness: metadata.freshness, ...(metadata.snapshotVersion ? { snapshotVersion: metadata.snapshotVersion } : {}), truncated, omitted, ...(successful && data !== undefined ? { data } : {}) }\n}\n\nfunction boundResponse(response: CodeResponseV1): CodeResponseV1 {\n if (Buffer.byteLength(JSON.stringify(response), 'utf8') <= RESPONSE_BYTES) return response\n if (isRecord(response.data) && Array.isArray(response.data.items)) {\n const items = [...response.data.items]\n let omitted = response.omitted\n while (items.length && Buffer.byteLength(JSON.stringify({ ...response, data: { ...response.data, items } }), 'utf8') > RESPONSE_BYTES) {\n items.pop()\n omitted++\n }\n const shortened: CodeResponseV1 = { ...response, status: 'partial', reason: response.reason ?? 'response_truncated', truncated: true, omitted, data: { ...response.data, items } }\n if (Buffer.byteLength(JSON.stringify(shortened), 'utf8') <= RESPONSE_BYTES) return shortened\n }\n return outcome('limit_exceeded', 'response_limit')\n}\n\nfunction mapError(error: WebstackLspError): CodeResponseV1 {\n if (error.code === 'LSP_STALE_SNAPSHOT') return outcome('stale', 'source_changed')\n if (error.code === 'LSP_STRUCTURE_TIMEOUT') return outcome('timeout', 'parser_deadline')\n if (error.code === 'LSP_STRUCTURE_LIMIT' || error.code === 'LSP_SNAPSHOT_LIMIT') return outcome('limit_exceeded', 'provider_limit')\n if (error.code === 'LSP_STRUCTURE_UNSUPPORTED' || error.code === 'LSP_UNSUPPORTED_OPERATION') return outcome('unsupported', 'capability_missing')\n if (error.code === 'LSP_STRUCTURE_BUSY') return outcome('unavailable', 'parser_busy')\n if (error.code === 'LSP_CODE_INTELLIGENCE_UNAVAILABLE' || error.code === 'LSP_STRUCTURE_UNAVAILABLE' || error.code === 'LSP_UNAVAILABLE') return outcome('unavailable', 'provider_unavailable')\n if (error.code === 'LSP_WORKSPACE_REQUIRED') return outcome('unavailable', 'invalid_path')\n return outcome('unavailable', 'provider_operation_failed')\n}\n\nfunction projectNode(node: StructureNode): { handle: string; kind: string; range: StructureNode['range']; name?: string } {\n return { handle: node.handle, kind: node.kind, range: node.range, ...(node.name ? { name: node.name } : {}) }\n}\n\nfunction trimUtf16(value: string, limit: number): string {\n if (value.length <= limit) return value\n const end = value.charCodeAt(limit - 1) >= 0xd800 && value.charCodeAt(limit - 1) <= 0xdbff ? limit - 1 : limit\n return value.slice(0, end)\n}\n\nfunction validCodeRequest(value: unknown): value is CodeRequestV1 {\n if (!isRecord(value) || typeof value.method !== 'string') return false\n const keys: Record<string, string[]> = {\n capabilities: ['method'], 'snapshot.open': ['method', 'path'], 'snapshot.release': ['method', 'handle'],\n 'structure.outline': ['method', 'handle', 'range', 'limit'], 'structure.enclosing': ['method', 'handle', 'position', 'kinds'],\n 'structure.query': ['method', 'handle', 'queryId', 'range', 'limit'], 'structure.span': ['method', 'nodeHandle', 'maxChars'],\n 'semantic.query': ['method', 'handle', 'kind', 'position', 'limit'],\n }\n const allowed = keys[value.method]\n if (!allowed || Object.keys(value).some(key => !allowed.includes(key))) return false\n const handle = 'handle' in value ? value.handle : 'nodeHandle' in value ? value.nodeHandle : undefined\n if (handle !== undefined && (typeof handle !== 'string' || !handle.length || handle.length > 256)) return false\n if (value.method === 'snapshot.open') return typeof value.path === 'string' && value.path.length > 0 && value.path.length <= 4096\n if (value.method === 'capabilities' || value.method === 'snapshot.release') return true\n if ('limit' in value && value.limit !== undefined && (!Number.isSafeInteger(value.limit) || value.limit < 1 || value.limit > 200)) return false\n if ('range' in value && value.range !== undefined && !validRange(value.range)) return false\n if (value.method === 'structure.outline') return value.limit === undefined || value.limit <= 100\n if (value.method === 'structure.enclosing') return validPosition(value.position) && (value.kinds === undefined || Array.isArray(value.kinds) && value.kinds.length <= 30 && value.kinds.every(kind => typeof kind === 'string' && kind.length <= 100))\n if (value.method === 'structure.query') return ['declarations', 'calls', 'imports'].includes(String(value.queryId))\n if (value.method === 'structure.span') return value.maxChars === undefined || Number.isSafeInteger(value.maxChars) && value.maxChars >= 1 && value.maxChars <= 8000\n if (value.method === 'semantic.query') return ['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(String(value.kind)) && (value.kind === 'diagnostics' || validPosition(value.position))\n return false\n}\n\nfunction validRange(value: unknown): value is { start: { line: number; character: number }; end: { line: number; character: number } } {\n if (!isRecord(value) || !validPosition(value.start) || !validPosition(value.end)) return false\n return value.end.line > value.start.line || value.end.line === value.start.line && value.end.character >= value.start.character\n}\nfunction validPosition(value: unknown): value is { line: number; character: number } { return isRecord(value) && Number.isSafeInteger(value.line) && Number.isSafeInteger(value.character) && value.line >= 0 && value.character >= 0 }\nfunction isRecord(value: unknown): value is Record<string, any> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\nfunction identity(value: unknown): unknown { return value && typeof value === 'object' ? (value as Record<symbol, unknown>)[symbols.original] ?? value : value }\nfunction validateBinding(binding: CodeHostBindingV1): void {\n if (!binding || !binding.owner || typeof binding.owner.agentId !== 'string' || typeof binding.owner.sessionId !== 'string' || typeof binding.workspaceRoot !== 'string' || !isAbsolute(binding.workspaceRoot) || !binding.scope || typeof binding.assertCurrent !== 'function' || !binding.context || typeof binding.context.get !== 'function')\n throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'invalid trusted code host binding')\n}\n","import type { LspProviderQuery, LspQueryResult } from '@deepseek-ai/dsh-lsp'\nimport type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport type { ResolvedConfig, ServerId } from '../config.js'\nimport { SERVER_IDS } from '../config.js'\nimport { readSource, type HostFileSystem, type HostSource } from '../host/dsh.js'\nimport { classifyFile, supportedFileSuffixes } from '../routing/classifier.js'\nimport { routeFor, type Route } from '../routing/route-table.js'\nimport { hasTailwindCandidate } from '../routing/tailwind-candidate.js'\nimport { resolveLaunch, initializationOptions, serverConfiguration } from '../servers/launch.js'\nimport { ServerSession } from './server-session.js'\nimport { ServerPool } from './server-pool.js'\nimport { throwIfAborted, withAbort } from './cancellation.js'\nimport { WebstackLspError } from '../errors.js'\nimport { supportsOperation } from '../protocol/capabilities.js'\nimport { normalizeHover } from '../protocol/normalize-hover.js'\nimport { normalizeLocations } from '../protocol/normalize-location.js'\nimport { normalizeDiagnostics } from '../protocol/normalize-diagnostic.js'\nimport { normalizeCompletion } from '../protocol/normalize-completion.js'\nimport { mergeHover } from '../merge/hover.js'\nimport { mergeDiagnostics } from '../merge/diagnostics.js'\nimport { mergeCompletions } from '../merge/completion.js'\nimport type { CompletionRequest, CompletionResult, DiagnosticsRequest, DiagnosticsResult, LspPosition, NavigationResult, WebstackLspStatus } from '../service.js'\nimport { createCodeIntelligenceToolServiceV1 } from '../structure/code-intelligence.js'\nimport { DocumentSnapshotStore } from '../structure/snapshots.js'\nimport type { SnapshotRecord } from '../structure/snapshots.js'\nimport { CodeIntelligenceProtocolService } from '../structure/protocol.js'\nimport type { CodeIntelligenceServiceV1, CodeCapabilitiesV1, CodeSemanticKind } from '../code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1, SemanticQuery, SnapshotScope } from '../structure/types.js'\nimport type { JsonRpcConnection } from './connection.js'\n\nexport type HostSubprocess = Pick<SubprocessRuntime, 'spawn' | 'resolveExecutable'>\nconst methods = { hover: 'textDocument/hover', goToDefinition: 'textDocument/definition', findReferences: 'textDocument/references', goToImplementation: 'textDocument/implementation' } as const\nconst clientCapabilities = {\n general: { positionEncodings: ['utf-16'] },\n workspace: { configuration: true, workspaceFolders: true, applyEdit: false },\n textDocument: {\n synchronization: { dynamicRegistration: false, didSave: false },\n hover: { contentFormat: ['markdown', 'plaintext'] },\n completion: { completionItem: { snippetSupport: true, documentationFormat: ['markdown', 'plaintext'] } },\n publishDiagnostics: { versionSupport: true }, diagnostic: {},\n },\n}\n\nexport class WebstackLspRuntime {\n private readonly pool: ServerPool<ServerSession>\n private readonly snapshots: DocumentSnapshotStore\n readonly codeIntelligence: CodeIntelligenceServiceV1\n readonly codeIntelligenceRuntime: CodeIntelligenceToolServiceV1\n private readonly semanticOperations = new Map<string, Set<CodeSemanticKind>>()\n private readonly workspaces = new Map<string, HostSource>()\n private readonly lifetime = new AbortController()\n private readonly live = new Map<ServerSession, ServerId>()\n private readonly starts = new Map<string, number>()\n private readonly restarts = new Map<ServerId, number>()\n constructor(private readonly config: ResolvedConfig, private readonly fs: HostFileSystem, private readonly subprocess: HostSubprocess) {\n this.snapshots = new DocumentSnapshotStore((workspaceRoot, filePath, maxBytes, signal) => readSource(this.fs, workspaceRoot, filePath, maxBytes, signal), config.limits.maxDocumentBytes)\n this.codeIntelligenceRuntime = createCodeIntelligenceToolServiceV1({\n snapshots: this.snapshots,\n semanticQuery: (scope, snapshot, request, signal) => this.semanticFromSnapshot(scope, snapshot, request, signal),\n })\n this.codeIntelligence = new CodeIntelligenceProtocolService({\n backend: this.codeIntelligenceRuntime,\n fs: this.fs,\n subprocess: this.subprocess,\n capabilities: signal => this.codeCapabilities(signal),\n })\n this.pool = new ServerPool(async (rawId, key, signal) => {\n const id = rawId as ServerId, source = this.workspaces.get(key)!\n const spec = await resolveLaunch(id, config, source.workspace)\n let executable: string\n try { executable = await subprocess.resolveExecutable(spec.command, spec.env, signal) }\n catch { throwIfAborted(signal); throw new WebstackLspError('LSP_UNAVAILABLE', `${id} executable is unavailable; run dsh-lsp-webstack --json`) }\n const session = new ServerSession({\n spawn: () => subprocess.spawn({ argv: [executable, ...spec.args], cwd: source.workspace, env: spec.env, stdio: { stdin: 'pipe', stdout: 'pipe', stderr: { maxBytes: config.limits.maxStderrBytes } }, graceMs: config.timeouts.killGraceMs }),\n initialize: { processId: null, rootUri: source.workspaceUri, workspaceFolders: [{ uri: source.workspaceUri, name: 'workspace' }], capabilities: clientCapabilities, initializationOptions: initializationOptions(id, config) },\n configuration: serverConfiguration(id, config), maxMessageBytes: config.limits.maxMessageBytes,\n shutdown: { shutdownMs: config.timeouts.shutdownMs, killGraceMs: config.timeouts.killGraceMs },\n })\n const slot = `${id}\\u0000${key}`\n if (this.starts.has(slot)) this.restarts.set(id, (this.restarts.get(id) ?? 0) + 1)\n this.starts.set(slot, (this.starts.get(slot) ?? 0) + 1)\n for (const [old] of this.live) if (old.state === 'STOPPED' || old.state === 'FAILED') this.live.delete(old)\n this.live.set(session, id)\n return session\n })\n }\n\n async navigation(request: LspProviderQuery, signal?: AbortSignal): Promise<LspQueryResult> {\n const deadline = this.signal(request.operation === 'hover' ? this.config.timeouts.primaryHoverMs : this.config.timeouts.navigationMs, signal)\n const [source, route] = await this.prepare(request, deadline)\n return this.navigationFromSource(request, source, route, deadline, signal)\n }\n\n private async navigationFromSource(request: LspProviderQuery, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<LspQueryResult> {\n this.validatePosition(source.text, request.position)\n const result = await this.document(route.primary.server, source, route.primary.languageId, deadline, async (session, connection) => {\n if (!supportsOperation(session.capabilities, request.operation)) throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', `${route.primary.server} does not support ${request.operation}`)\n return connection.request(methods[request.operation], { textDocument: { uri: source.uri }, position: request.position, ...(request.operation === 'findReferences' ? { context: { includeDeclaration: true } } : {}) }, deadline)\n })\n if (request.operation !== 'hover') return { kind: 'locations', locations: normalizeLocations(result), resolvedWorkspaceUri: source.workspaceUri }\n const primary = normalizeHover(result)\n if (primary === undefined) throw new WebstackLspError('LSP_MALFORMED_RESPONSE', 'invalid hover result')\n let auxiliary = null\n if (this.useTailwind(route, source, request.position)) {\n const auxSignal = this.signal(this.config.timeouts.auxiliaryHoverMs, signal)\n try {\n const value = await this.document('tailwind', source, route.auxiliary!.languageId, auxSignal, (_session, connection) => connection.request('textDocument/hover', { textDocument: { uri: source.uri }, position: request.position }, auxSignal))\n auxiliary = normalizeHover(value) ?? null\n } catch { throwIfAborted(signal); throwIfAborted(this.lifetime.signal) }\n }\n const hover = mergeHover(primary && { ...primary, server: route.primary.server }, auxiliary && { ...auxiliary, server: 'tailwind' })\n return { kind: 'hover', hover: hover ? { contents: hover.contents, ...(hover.range ? { range: hover.range } : {}) } : null }\n }\n\n async completion(request: CompletionRequest, signal?: AbortSignal): Promise<CompletionResult> {\n const deadline = this.signal(this.config.timeouts.completionMs, signal)\n const [source, route] = await this.prepare(request, deadline)\n return this.completionFromSource(request, source, route, deadline, signal)\n }\n\n private async completionFromSource(request: CompletionRequest, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<CompletionResult> {\n this.validatePosition(source.text, request.position)\n const query = (id: ServerId, language: string) => this.document(id, source, language, deadline, (session, connection) => {\n if (!session.capabilities.completionProvider) throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', `${id} does not support completion`)\n return connection.request('textDocument/completion', { textDocument: { uri: source.uri }, position: request.position, context: { triggerKind: request.triggerKind ?? 1, ...(request.triggerCharacter ? { triggerCharacter: request.triggerCharacter } : {}) } }, deadline)\n }).then(value => {\n const prefix = source.text.split(/\\r?\\n/)[request.position.line]!.slice(0, request.position.character).match(/[\\w$:@/!\\[\\]-]+$/)?.[0]?.toLowerCase() ?? ''\n // Servers such as Tailwind return the whole catalog; the client must rank the typed prefix before applying a result cap.\n return normalizeCompletion(value, id).sort((a, b) => Number((b.filterText ?? b.label).toLowerCase().startsWith(prefix)) - Number((a.filterText ?? a.label).toLowerCase().startsWith(prefix)))\n })\n const primary = await query(route.primary.server, route.primary.languageId)\n let auxiliary: typeof primary = []\n if (this.useTailwind(route, source, request.position)) {\n try { auxiliary = await query('tailwind', route.auxiliary!.languageId) } catch { throwIfAborted(signal); throwIfAborted(this.lifetime.signal) }\n }\n return mergeCompletions([primary, auxiliary], { maxCompletions: Number.MAX_SAFE_INTEGER, maxResultChars: Number.MAX_SAFE_INTEGER })\n }\n\n async diagnostics(request: DiagnosticsRequest, signal?: AbortSignal): Promise<DiagnosticsResult> {\n const deadline = this.signal(this.config.timeouts.diagnosticsMs, signal)\n if (!classifyFile(request.filePath, this.config.routing.bladeSuffixes)) {\n // Validate workspace containment, existence and read limits even for unsupported files.\n await this.snapshots.readFresh(providerScope(request.workspaceRoot), request.filePath, deadline)\n return { diagnostics: [], skipped: { reason: 'unsupported_file_type', filePath: request.filePath } }\n }\n const [source, route] = await this.prepare(request, deadline)\n return this.diagnosticsFromSource(request, source, route, deadline, signal)\n }\n\n private async diagnosticsFromSource(request: DiagnosticsRequest, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<DiagnosticsResult> {\n const selected = [route.primary, ...(route.auxiliary && this.config.tailwind.enabled ? [route.auxiliary] : [])].filter(item => this.config.servers[item.server].enabled && (!request.servers || request.servers.includes(item.server)))\n if (!selected.length) throw new WebstackLspError('LSP_UNAVAILABLE', 'no selected diagnostic server supports this file')\n const omittedServers: string[] = []\n const groups = await Promise.all(selected.map(async item => {\n try {\n const value = await this.document(item.server, source, item.languageId, deadline, async (session, connection, opened) => {\n if (session.capabilities.diagnosticProvider) {\n await opened()\n const report = await connection.request('textDocument/diagnostic', { textDocument: { uri: source.uri } }, deadline) as { items?: unknown }\n return report?.items ?? []\n }\n // Subscribe before didOpen; do not confuse a missing publication with a clean file.\n let remove = () => {}\n const published = new Promise<unknown>(resolve => {\n remove = connection.onNotification(message => {\n const p = message.params as { uri?: string; diagnostics?: unknown; version?: number } | undefined\n if (message.method === 'textDocument/publishDiagnostics' && p?.uri === source.uri && (p.version === undefined || p.version === 1)) resolve(p.diagnostics)\n })\n })\n try { await opened(); return await withAbort(published, deadline) } finally { remove() }\n }, true)\n return normalizeDiagnostics(value, item.server, source.uri).filter(d => !request.severity || request.severity === 'all' || d.severity === (request.severity === 'error' ? 1 : 2))\n } catch (error) {\n throwIfAborted(signal); throwIfAborted(this.lifetime.signal)\n if (item.server === route.primary.server || this.config.missingServerPolicy === 'error') throw error\n omittedServers.push(item.server)\n return []\n }\n }))\n return { ...mergeDiagnostics(groups, { maxDiagnostics: Number.MAX_SAFE_INTEGER, maxResultChars: Number.MAX_SAFE_INTEGER }), ...(omittedServers.length ? { omittedServers: omittedServers.sort() } : {}) }\n }\n\n private async semanticFromSnapshot(scope: SnapshotScope, snapshot: SnapshotRecord, request: SemanticQuery, signal: AbortSignal): Promise<NavigationResult | DiagnosticsResult | CompletionResult> {\n const source = snapshot.source\n this.rememberWorkspace(source)\n const file = classifyFile(snapshot.descriptor.filePath, this.config.routing.bladeSuffixes)\n if (!file) {\n if (request.operation === 'diagnostics') return { diagnostics: [], skipped: { reason: 'unsupported_file_type', filePath: snapshot.descriptor.filePath } }\n throw new WebstackLspError('LSP_UNAVAILABLE', 'unsupported file extension')\n }\n const route = routeFor(file)\n let result: NavigationResult | DiagnosticsResult | CompletionResult\n if (request.operation === 'diagnostics') {\n const deadline = this.signal(this.config.timeouts.diagnosticsMs, signal)\n result = await this.diagnosticsFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, ...(request.severity ? { severity: request.severity } : {}), ...(request.servers ? { servers: request.servers } : {}) }, source, route, deadline, signal)\n } else if (request.operation === 'completion') {\n const deadline = this.signal(this.config.timeouts.completionMs, signal)\n result = await this.completionFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, position: request.position! }, source, route, deadline, signal)\n } else {\n const operation = ({ definition: 'goToDefinition', references: 'findReferences', implementation: 'goToImplementation', hover: 'hover' } as const)[request.operation]\n const position = request.position!\n const deadline = this.signal(request.operation === 'hover' ? this.config.timeouts.primaryHoverMs : this.config.timeouts.navigationMs, signal)\n result = await this.navigationFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, languageId: route.primary.languageId, operation, position }, source, route, deadline, signal)\n }\n if (!('skipped' in result && result.skipped)) {\n const operations = this.semanticOperations.get(route.primary.languageId) ?? new Set<CodeSemanticKind>()\n operations.add(request.operation)\n this.semanticOperations.set(route.primary.languageId, operations)\n }\n return result\n }\n\n async status(signal?: AbortSignal): Promise<WebstackLspStatus> {\n return { providerId: this.config.providerId, supportedFileSuffixes: supportedFileSuffixes(this.config.routing.bladeSuffixes), servers: await Promise.all(SERVER_IDS.map(async id => {\n const config = this.config.servers[id]\n let available = false\n try {\n const launch = await resolveLaunch(id, this.config, '.')\n await this.subprocess.resolveExecutable(launch.command, launch.env, this.signal(5000, signal))\n available = true\n } catch {}\n return { id, enabled: config.enabled && (id !== 'tailwind' || this.config.tailwind.enabled), available, source: config.mode, liveWorkspaces: [...this.live].filter(([s, server]) => server === id && s.isUsable()).length, restarts: this.restarts.get(id) ?? 0 }\n })) }\n }\n\n private async codeCapabilities(signal: AbortSignal): Promise<CodeCapabilitiesV1> {\n signal.throwIfAborted()\n const [provider, lsp] = await Promise.all([Promise.resolve(this.codeIntelligenceRuntime.capabilities()), this.status(signal)])\n const server = lsp.servers.find(item => item.id === 'typescript')\n const languageCapabilities = provider.parsers.map(parser => {\n const semanticIds = parser.language === 'javascript' ? ['javascript', 'javascriptreact'] : parser.language === 'tsx' ? ['typescriptreact'] : ['typescript']\n const semantic = [...new Set(semanticIds.flatMap(id => [...(this.semanticOperations.get(id) ?? [])]))]\n const semanticReady = semantic.length > 0 && Boolean(server?.enabled && server.available)\n const reason = !parser.available ? 'grammar_unavailable' : !server?.enabled || !server.available ? 'server_unavailable' : !semanticReady ? 'not_yet_verified' : undefined\n return { language: parser.language, structure: parser.available, semantic, semanticReady, ...(reason ? { reason } : {}) }\n })\n signal.throwIfAborted()\n return {\n version: 1,\n capabilities: ['snapshots', 'structure', 'semantic'],\n languages: provider.parsers.filter(parser => parser.available).map(parser => parser.language),\n queryIds: ['declarations', 'calls', 'imports'],\n semanticReady: languageCapabilities.some(language => language.semanticReady),\n sourceKinds: ['disk'],\n languageCapabilities,\n limits: {\n documentBytes: provider.limits.maxDocumentBytes,\n captureItems: provider.limits.maxCaptures,\n outlineItems: provider.limits.maxOutline,\n spanChars: provider.limits.maxSpanChars,\n responseBytes: provider.limits.maxResponseBytes,\n files: 100, inputBytes: 16_777_216, outputBytes: 65_536, calls: 100, batchMs: 30_000, structureMs: 2_000, semanticMs: 10_000,\n },\n }\n }\n\n async dispose(): Promise<void> {\n this.lifetime.abort()\n try { await this.codeIntelligence.dispose?.() }\n finally {\n try { await this.pool.disposeAll() }\n finally { await this.codeIntelligenceRuntime.dispose?.(); this.workspaces.clear(); this.live.clear() }\n }\n }\n\n private signal(ms: number, signal?: AbortSignal): AbortSignal { return AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(ms), ...(signal ? [signal] : [])]) }\n private async prepare(request: { workspaceRoot: string; filePath: string }, signal: AbortSignal): Promise<[HostSource, Route]> {\n throwIfAborted(signal)\n const file = classifyFile(request.filePath, this.config.routing.bladeSuffixes)\n if (!file) throw new WebstackLspError('LSP_UNAVAILABLE', 'unsupported file extension')\n const source = await this.snapshots.readFresh(providerScope(request.workspaceRoot), request.filePath, signal).catch(error => { throwIfAborted(signal); throw error })\n this.rememberWorkspace(source)\n return [source, routeFor(file)]\n }\n private rememberWorkspace(source: HostSource): void { this.workspaces.set(source.key, { ...source, text: '' }) }\n private validatePosition(text: string, position: LspPosition): void {\n const line = text.split(/\\r?\\n/)[position.line]\n if (!Number.isSafeInteger(position.line) || !Number.isSafeInteger(position.character) || position.line < 0 || position.character < 0 || line === undefined || position.character > line.length) throw new RangeError('position is outside document (zero-based UTF-16 required)')\n }\n private useTailwind(route: Route, source: HostSource, position: LspPosition): boolean {\n return !!route.auxiliary && this.config.tailwind.enabled && this.config.servers.tailwind.enabled && (route.primary.languageId === 'blade' || this.config.routing.tailwindLanguages.includes(route.primary.languageId) || route.primary.languageId === 'css') && (this.config.tailwind.queryStrategy === 'always' || hasTailwindCandidate(source.text, position.line, this.config.tailwind.classRegex, position.character, this.config.tailwind.classAttributes))\n }\n private async document<T>(id: ServerId, source: HostSource, language: string, signal: AbortSignal, task: (session: ServerSession, connection: JsonRpcConnection, open: () => Promise<void>) => Promise<T>, manualOpen = false): Promise<T> {\n if (!this.config.servers[id].enabled) throw new WebstackLspError('LSP_UNAVAILABLE', `${id} is disabled`)\n return this.pool.runWithRetry(id, source.key, session => session.run(async connection => {\n let opened = false\n const open = async () => { opened = true; await connection.notify('textDocument/didOpen', { textDocument: { uri: source.uri, languageId: language, version: 1, text: source.text } }) }\n try { if (!manualOpen) await open(); return await task(session, connection, open) }\n finally { if (opened && connection.isOpen) await connection.notify('textDocument/didClose', { textDocument: { uri: source.uri } }).catch(() => {}) }\n }, signal), signal, manualOpen ? session => {\n // Push notifications can omit document versions. A delayed didClose clear\n // from a previous operation is indistinguishable from a fresh clean result.\n // Use a fresh process for push diagnostics; pull responses have request IDs.\n return !!session.capabilities.diagnosticProvider\n } : undefined)\n }\n}\n\nfunction providerScope(workspaceRoot: string): SnapshotScope {\n return { ownerId: 'lsp-provider', sessionId: 'lsp-provider', workspaceRoot }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { LspProviderId } from '@deepseek-ai/dsh-lsp'\nimport type { LspProvider, LspProviderQuery, LspQueryResult } from '@deepseek-ai/dsh-lsp'\nimport type { Config as PluginConfig, ResolvedConfig } from './config.js'\nimport { resolveConfig } from './config.js'\nimport type { WebstackLspService } from './service.js'\nimport type { CodeIntelligenceServiceV1 } from './code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1 } from './structure/types.js'\nimport { createWebstackLspService } from './service.js'\nimport { WebstackLspRuntime } from './runtime/webstack-runtime.js'\nimport type {} from '@deepseek-ai/dsh-fs'\nimport type {} from '@deepseek-ai/dsh-subprocess'\n\nexport type { LspProvider, LspProviderQuery, LspQueryResult }\nexport type Config = PluginConfig\nexport const name = 'lsp-webstack-provider'\nexport const inject = ['fs', 'lsp', 'subprocess']\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context { webstackLsp: WebstackLspService; codeIntelligence: CodeIntelligenceServiceV1; codeIntelligenceRuntime: CodeIntelligenceToolServiceV1 }\n}\n\nexport const OUTER_EXTENSION_MAP = {\n '.php': 'php', '.ts': 'typescript', '.tsx': 'typescriptreact', '.mts': 'typescript', '.cts': 'typescript',\n '.js': 'javascript', '.jsx': 'javascriptreact', '.mjs': 'javascript', '.cjs': 'javascript',\n '.svelte': 'svelte', '.html': 'html', '.htm': 'html', '.css': 'css', '.pcss': 'css',\n} as const\n\nexport interface CompositeRuntime {\n navigation(request: LspProviderQuery, signal?: AbortSignal): Promise<LspQueryResult>\n dispose?(): Promise<void>\n}\n\nexport function createCompositeProvider(runtime: CompositeRuntime, config: Pick<ResolvedConfig, 'providerId'> = { providerId: 'webstack' }): LspProvider {\n return { id: LspProviderId(config.providerId), extensionToLanguage: { ...OUTER_EXTENSION_MAP }, query: (request, signal) => runtime.navigation(request, signal) }\n}\n\nexport async function apply(ctx: Context, config: unknown = {}): Promise<void> {\n const resolved = resolveConfig(config)\n const runtime = new WebstackLspRuntime(resolved, ctx.fs, ctx.subprocess)\n await ctx.effect(async function* () {\n yield () => runtime.dispose()\n if (resolved.missingServerPolicy === 'error') {\n const missing = (await runtime.status()).servers.filter(server => server.enabled && !server.available)\n if (missing.length) throw new Error(`unavailable language servers: ${missing.map(server => server.id).join(', ')}`)\n }\n yield ctx.lsp.registerProvider(createCompositeProvider(runtime, resolved))\n yield ctx.provide('webstackLsp', createWebstackLspService(runtime))\n yield ctx.provide('codeIntelligence', runtime.codeIntelligence)\n yield ctx.provide('codeIntelligenceRuntime', runtime.codeIntelligenceRuntime)\n }, 'webstack LSP provider')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.js","names":["CLASSIFIERS: ReadonlyArray<{ suffix: string; kind: FileKind }>","basename","ROUTES: Record<ClassifiedFile['kind'], Route>","isRecord","diagnostics: unknown[]","maxMessageBytes: number","messages: unknown[]","text: string","length: number | undefined","input: Readable","output: Writable","messages: unknown[]","isRecord","resolve","options: ServerSessionOptions","factory: SessionFactory<S>","release!: () => void","resolve","isRange","isRecord","isPosition","isRecord","isRange","isPosition","isRecord","isRecord","options: CodeIntelligenceProtocolOptions","binding: CodeHostBindingV1","scope: { ownerId: string; sessionId: string; workspaceRoot: string }","backend: CodeIntelligenceToolServiceV1","capabilities: (signal: AbortSignal) => Promise<CodeCapabilitiesV1>","fsIdentity: unknown","subprocessIdentity: unknown","onDispose: () => void","response: CodeResponseV1","result: SemanticResult","shortened: CodeResponseV1","config: ResolvedConfig","fs: HostFileSystem","subprocess: HostSubprocess","executable: string","auxiliary: typeof primary","omittedServers: string[]","result: NavigationResult | DiagnosticsResult | CompletionResult"],"sources":["../src/runtime/cancellation.ts","../src/host/dsh.ts","../src/routing/classifier.ts","../src/routing/route-table.ts","../src/routing/tailwind-candidate.ts","../src/servers/typescript-diagnostics.ts","../src/protocol/initialize.ts","../src/runtime/framing.ts","../src/runtime/connection.ts","../src/runtime/server-session.ts","../src/runtime/server-pool.ts","../src/protocol/capabilities.ts","../src/protocol/normalize-hover.ts","../src/protocol/normalize-location.ts","../src/protocol/normalize-diagnostic.ts","../src/protocol/normalize-completion.ts","../src/merge/hover.ts","../src/structure/protocol.ts","../src/runtime/webstack-runtime.ts","../src/provider.ts"],"sourcesContent":["export function abortError(): Error {\n const error = new Error('The operation was aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortError()\n}\n\nexport function onAbort(signal: AbortSignal | undefined, callback: () => void): () => void {\n if (!signal) return () => {}\n if (signal.aborted) {\n callback()\n return () => {}\n }\n signal.addEventListener('abort', callback, { once: true })\n return () => signal.removeEventListener('abort', callback)\n}\n\nexport async function withAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n throwIfAborted(signal)\n if (!signal) return promise\n return new Promise<T>((resolve, reject) => {\n const remove = onAbort(signal, () => reject(abortError()))\n promise.then((value) => { remove(); resolve(value) }, (error: unknown) => { remove(); reject(error) })\n })\n}\n","import type { FileSystem } from '@deepseek-ai/dsh-fs'\nimport { WebstackLspError } from '../errors.js'\nimport { throwIfAborted } from '../runtime/cancellation.js'\n\nexport type HostFileSystem = Pick<FileSystem, 'resolve' | 'stat' | 'processPath' | 'fileUrl' | 'contains' | 'streamText'>\nexport interface HostSource { workspace: string; workspaceUri: string; key: string; uri: string; text: string }\n\nexport async function readSource(fs: HostFileSystem, workspaceRoot: string, filePath: string, maxBytes: number, signal?: AbortSignal): Promise<HostSource> {\n if (!workspaceRoot?.trim() || !filePath?.trim()) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot and filePath are required')\n throwIfAborted(signal)\n const options = signal ? { signal } : {}\n const root = await fs.resolve(workspaceRoot, options)\n if ((await fs.stat(root, signal))?.type !== 'directory') throw new Error('workspace root is not a directory')\n const workspace = fs.processPath(root)\n const target = await fs.resolve(filePath, { cwd: workspace, ...options })\n if (!fs.contains(root, target)) throw new Error('source is outside workspace')\n if ((await fs.stat(target, signal))?.type !== 'file') throw new Error('source is not a regular file')\n let text = '', bytes = 0\n for await (const chunk of await fs.streamText(target, signal)) {\n throwIfAborted(signal)\n bytes += Buffer.byteLength(chunk)\n if (bytes > maxBytes) throw new Error('source exceeds document limit')\n text += chunk\n }\n throwIfAborted(signal)\n return { workspace, workspaceUri: fs.fileUrl(root), key: root.targetKey, uri: fs.fileUrl(target), text }\n}\n","export type FileKind = 'blade' | 'php' | 'typescript' | 'typescriptreact' | 'javascript' | 'javascriptreact' | 'svelte' | 'html' | 'css'\n\nexport interface ClassifiedFile {\n path: string\n basename: string\n suffix: string\n kind: FileKind\n}\n\nconst CLASSIFIERS: ReadonlyArray<{ suffix: string; kind: FileKind }> = [\n { suffix: '.blade.php', kind: 'blade' },\n { suffix: '.typescriptreact', kind: 'typescriptreact' },\n { suffix: '.javascriptreact', kind: 'javascriptreact' },\n { suffix: '.tsx', kind: 'typescriptreact' },\n { suffix: '.jsx', kind: 'javascriptreact' },\n { suffix: '.mts', kind: 'typescript' },\n { suffix: '.cts', kind: 'typescript' },\n { suffix: '.mjs', kind: 'javascript' },\n { suffix: '.cjs', kind: 'javascript' },\n { suffix: '.svelte', kind: 'svelte' },\n { suffix: '.html', kind: 'html' },\n { suffix: '.htm', kind: 'html' },\n { suffix: '.php', kind: 'php' },\n { suffix: '.ts', kind: 'typescript' },\n { suffix: '.js', kind: 'javascript' },\n { suffix: '.css', kind: 'css' },\n { suffix: '.pcss', kind: 'css' },\n]\n\nexport function classifyFile(filePath: string, bladeSuffixes: string[] = ['.blade.php']): ClassifiedFile | undefined {\n const normalizedPath = filePath.replaceAll('\\\\', '/')\n const basename = normalizedPath.slice(normalizedPath.lastIndexOf('/') + 1).toLowerCase()\n if (!basename || basename === '.' || basename === '..' || basename.startsWith('.')) return undefined\n const customBlade = bladeSuffixes.map((suffix) => suffix.toLowerCase()).sort((left, right) => right.length - left.length)\n const classifiers = [...customBlade.map((suffix) => ({ suffix, kind: 'blade' as const })), ...CLASSIFIERS.filter((item) => !customBlade.includes(item.suffix))]\n const match = classifiers.find((item) => basename.endsWith(item.suffix))\n if (!match) return undefined\n return { path: normalizedPath, basename, suffix: match.suffix, kind: match.kind }\n}\n\n/** Return the supported suffixes, including configured Blade suffixes. */\nexport function supportedFileSuffixes(bladeSuffixes: string[] = ['.blade.php']): string[] {\n return [...new Set([...bladeSuffixes.map(suffix => suffix.toLowerCase()), ...CLASSIFIERS.map(item => item.suffix)])]\n}\n","import type { ServerId } from '../config.js'\nimport type { ClassifiedFile } from './classifier.js'\n\nexport interface Route {\n primary: { server: ServerId; languageId: string }\n auxiliary?: { server: 'tailwind'; languageId: string }\n}\n\nconst ROUTES: Record<ClassifiedFile['kind'], Route> = {\n blade: { primary: { server: 'phpantom', languageId: 'blade' }, auxiliary: { server: 'tailwind', languageId: 'html' } },\n php: { primary: { server: 'phpantom', languageId: 'php' } },\n typescript: { primary: { server: 'typescript', languageId: 'typescript' }, auxiliary: { server: 'tailwind', languageId: 'typescript' } },\n typescriptreact: { primary: { server: 'typescript', languageId: 'typescriptreact' }, auxiliary: { server: 'tailwind', languageId: 'typescriptreact' } },\n javascript: { primary: { server: 'typescript', languageId: 'javascript' }, auxiliary: { server: 'tailwind', languageId: 'javascript' } },\n javascriptreact: { primary: { server: 'typescript', languageId: 'javascriptreact' }, auxiliary: { server: 'tailwind', languageId: 'javascriptreact' } },\n svelte: { primary: { server: 'svelte', languageId: 'svelte' }, auxiliary: { server: 'tailwind', languageId: 'svelte' } },\n html: { primary: { server: 'html', languageId: 'html' }, auxiliary: { server: 'tailwind', languageId: 'html' } },\n css: { primary: { server: 'css', languageId: 'css' }, auxiliary: { server: 'tailwind', languageId: 'css' } },\n}\n\nexport function routeFor(file: ClassifiedFile): Route {\n const route = ROUTES[file.kind]\n return { primary: { ...route.primary }, ...(route.auxiliary ? { auxiliary: { ...route.auxiliary } } : {}) }\n}\n","const DEFAULT_PATTERNS = [\n /\\bclass\\s*=\\s*[\"'][^\"']*$/i,\n /\\bclassName\\s*=\\s*[\"'][^\"']*$/i,\n /\\bclass:list\\s*=\\s*[\"'][^\"']*$/i,\n /@apply\\s+[\\w-]*$/i,\n /\\b(?:clsx|cva)\\s*\\([^)]*[\"'][^\"']*$/i,\n]\n\nexport function hasTailwindCandidate(source: string, line: number, classRegex: Array<string | [string, string]> = [], character?: number, classAttributes: string[] = ['class', 'className', 'class:list']): boolean {\n const lines = source.split(/\\r?\\n/)\n const context = [...lines.slice(Math.max(0, line - 2), line), (lines[line] ?? '').slice(0, character)].join('\\n')\n if (classAttributes.some(attribute => {\n const index = context.lastIndexOf(attribute + '=')\n return index >= 0 && /^[\\\"'][^\\\"']*$/.test(context.slice(index + attribute.length + 1).trimStart())\n })) return true\n const configured = classRegex.flatMap((item) => Array.isArray(item) ? item : [item]).map((pattern) => new RegExp(pattern))\n return [...DEFAULT_PATTERNS, ...configured].some((pattern) => pattern.test(context))\n}\n","import { WebstackLspError } from '../errors.js'\nimport type { JsonRpcConnection } from '../runtime/connection.js'\nimport type { LspPosition } from '../service.js'\n\nconst command = 'typescript.tsserverRequest'\nconst diagnosticCommands = ['syntacticDiagnosticsSync', 'semanticDiagnosticsSync', 'suggestionDiagnosticsSync'] as const\nconst severities = { error: 1, warning: 2, message: 3, suggestion: 4 } as const\n\nexport function supportsTypeScriptDiagnostics(capabilities: Record<string, unknown>): boolean {\n const provider = capabilities.executeCommandProvider\n return isRecord(provider) && Array.isArray(provider.commands) && provider.commands.includes(command)\n}\n\n// Push diagnostics can publish syntax results before semantic checking finishes.\n// Request each read-only diagnostic pass and use its correlated response instead.\nexport async function requestTypeScriptDiagnostics(connection: JsonRpcConnection, uri: string, signal: AbortSignal): Promise<unknown[]> {\n const diagnostics: unknown[] = []\n for (const diagnosticCommand of diagnosticCommands) {\n const response = await connection.request('workspace/executeCommand', {\n command,\n arguments: [diagnosticCommand, { file: uri }, { executionTarget: 0, expectsResult: true }],\n }, signal)\n if (!isRecord(response) || response.type !== 'response' || response.success !== true || !Array.isArray(response.body)) throw malformedResponse()\n for (const item of response.body) diagnostics.push(toDiagnostic(item))\n }\n return diagnostics\n}\n\nfunction toDiagnostic(value: unknown): unknown {\n if (!isRecord(value) || typeof value.text !== 'string' || typeof value.category !== 'string' || !Object.hasOwn(severities, value.category) || !Number.isSafeInteger(value.code)) throw malformedResponse()\n return {\n range: { start: toPosition(value.start), end: toPosition(value.end) },\n message: value.text,\n severity: severities[value.category as keyof typeof severities],\n code: value.code,\n source: typeof value.source === 'string' ? value.source : 'ts',\n }\n}\n\nfunction toPosition(value: unknown): LspPosition {\n if (!isRecord(value) || typeof value.line !== 'number' || typeof value.offset !== 'number' || !Number.isSafeInteger(value.line) || !Number.isSafeInteger(value.offset) || value.line < 1 || value.offset < 1) throw malformedResponse()\n return { line: value.line - 1, character: value.offset - 1 }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction malformedResponse(): WebstackLspError {\n return new WebstackLspError('LSP_MALFORMED_RESPONSE', 'TypeScript server returned an invalid diagnostic response')\n}\n","import type { InitializeParams, InitializeResult } from './types.js'\nimport type { JsonRpcConnection } from '../runtime/connection.js'\nimport { throwIfAborted } from '../runtime/cancellation.js'\n\nexport async function initializeServer(connection: JsonRpcConnection, params: InitializeParams, signal?: AbortSignal): Promise<InitializeResult> {\n throwIfAborted(signal)\n const value = await connection.request('initialize', params, signal)\n if (!isInitializeResult(value)) throw new Error('malformed initialize response')\n await connection.notify('initialized', {})\n return value\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && typeof (value as { capabilities?: unknown }).capabilities === 'object' && (value as { capabilities?: unknown }).capabilities !== null\n}\n","import { TextDecoder } from 'node:util'\n\nexport class JsonRpcFrameError extends Error {\n readonly code = 'LSP_MALFORMED_RESPONSE'\n\n constructor(message: string) {\n super(message)\n this.name = 'JsonRpcFrameError'\n }\n}\n\nexport class ContentLengthDecoder {\n private buffer = Buffer.alloc(0)\n private readonly decoder = new TextDecoder('utf-8', { fatal: true })\n\n constructor(private readonly maxMessageBytes: number) {\n if (!Number.isSafeInteger(maxMessageBytes) || maxMessageBytes <= 0) throw new RangeError('maxMessageBytes must be positive')\n }\n\n feed(chunk: Uint8Array): unknown[] {\n this.buffer = Buffer.concat([this.buffer, Buffer.from(chunk)])\n const messages: unknown[] = []\n while (true) {\n const headerEnd = this.buffer.indexOf(Buffer.from('\\r\\n\\r\\n'))\n if (headerEnd < 0) {\n if (this.buffer.length > 8192) throw new JsonRpcFrameError('header exceeds limit')\n break\n }\n const header = this.buffer.subarray(0, headerEnd).toString('ascii')\n const length = this.parseLength(header)\n const bodyStart = headerEnd + 4\n if (length > this.maxMessageBytes) throw new JsonRpcFrameError('message exceeds configured limit')\n if (this.buffer.length < bodyStart + length) break\n const body = this.buffer.subarray(bodyStart, bodyStart + length)\n this.buffer = this.buffer.subarray(bodyStart + length)\n let text: string\n try {\n text = this.decoder.decode(body)\n } catch {\n throw new JsonRpcFrameError('message is not valid UTF-8')\n }\n try {\n messages.push(JSON.parse(text) as unknown)\n } catch {\n throw new JsonRpcFrameError('message body is not valid JSON')\n }\n }\n return messages\n }\n\n end(): void {\n if (this.buffer.length > 0) throw new JsonRpcFrameError('incomplete JSON-RPC frame')\n }\n\n private parseLength(header: string): number {\n const lines = header.split('\\r\\n')\n let length: number | undefined\n for (const line of lines) {\n const separator = line.indexOf(':')\n if (separator < 1) throw new JsonRpcFrameError('malformed header')\n const key = line.slice(0, separator).toLowerCase()\n const value = line.slice(separator + 1).trim()\n if (key === 'content-length') {\n if (length !== undefined || !/^\\d+$/.test(value)) throw new JsonRpcFrameError('invalid Content-Length')\n length = Number(value)\n }\n }\n if (length === undefined || !Number.isSafeInteger(length)) throw new JsonRpcFrameError('Content-Length is required')\n return length\n }\n}\n\nexport function encodeJsonRpc(message: object): Buffer {\n const body = Buffer.from(JSON.stringify(message), 'utf8')\n return Buffer.concat([Buffer.from(`Content-Length: ${body.length}\\r\\n\\r\\n`, 'ascii'), body])\n}\n","import type { Readable, Writable } from 'node:stream'\nimport { abortError, onAbort, throwIfAborted } from './cancellation.js'\nimport { ContentLengthDecoder, encodeJsonRpc, JsonRpcFrameError } from './framing.js'\nimport type { JsonRpcConnectionOptions, JsonRpcId, JsonRpcMessage, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse } from '../protocol/types.js'\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n method: string\n}\n\nexport class JsonRpcConnection {\n private readonly decoder: ContentLengthDecoder\n private readonly pending = new Map<JsonRpcId, PendingRequest>()\n private readonly notificationListeners = new Set<(notification: JsonRpcNotification) => void>()\n private nextId = 1\n private closed = false\n private requestHandler: NonNullable<JsonRpcConnectionOptions['onServerRequest']>\n\n constructor(private readonly input: Readable, private readonly output: Writable, options: JsonRpcConnectionOptions) {\n this.decoder = new ContentLengthDecoder(options.maxMessageBytes)\n this.requestHandler = options.onServerRequest ?? (() => null)\n if (options.onNotification) this.notificationListeners.add(options.onNotification)\n input.on('data', (chunk: Buffer) => this.receive(chunk))\n input.once('end', () => this.close(new Error('LSP process closed stdout')))\n input.once('error', (error) => this.close(error))\n output.on('error', (error) => this.close(error))\n }\n\n get isOpen(): boolean { return !this.closed }\n\n onNotification(listener: (notification: JsonRpcNotification) => void): () => void {\n this.notificationListeners.add(listener)\n return () => this.notificationListeners.delete(listener)\n }\n\n setRequestHandler(handler: NonNullable<JsonRpcConnectionOptions['onServerRequest']>): void {\n this.requestHandler = handler\n }\n\n async request(method: string, params?: unknown, signal?: AbortSignal): Promise<unknown> {\n throwIfAborted(signal)\n if (this.closed) throw new Error('connection is closed')\n const id = this.nextId++\n const promise = new Promise<unknown>((resolve, reject) => this.pending.set(id, { resolve, reject, method }))\n void promise.catch(() => {})\n const remove = onAbort(signal, () => {\n void this.notify('$/cancelRequest', { id }).catch(() => {})\n this.pending.get(id)?.reject(abortError())\n this.pending.delete(id)\n })\n try {\n void this.write({ jsonrpc: '2.0', id, method, ...(params === undefined ? {} : { params }) }).catch(error => this.close(error))\n return await promise\n } finally {\n remove()\n this.pending.delete(id)\n }\n }\n\n async notify(method: string, params?: unknown): Promise<void> {\n if (this.closed) throw new Error('connection is closed')\n await this.write({ jsonrpc: '2.0', method, ...(params === undefined ? {} : { params }) })\n }\n\n close(reason = new Error('connection closed')): void {\n if (this.closed) return\n this.closed = true\n for (const pending of this.pending.values()) pending.reject(reason)\n this.pending.clear()\n }\n\n private receive(chunk: Buffer): void {\n if (this.closed) return\n let messages: unknown[]\n try {\n messages = this.decoder.feed(chunk)\n } catch (error) {\n this.close(error instanceof Error ? error : new JsonRpcFrameError('invalid frame'))\n return\n }\n for (const message of messages) this.dispatch(message)\n }\n\n private dispatch(value: unknown): void {\n if (!isRecord(value) || value.jsonrpc !== '2.0') return this.close(new JsonRpcFrameError('invalid JSON-RPC message'))\n if ('method' in value && typeof value.method === 'string') {\n if ('id' in value) {\n const request = value as unknown as JsonRpcRequest\n Promise.resolve().then(() => this.requestHandler(request.method, request.params)).then(\n (result) => this.write({ jsonrpc: '2.0', id: request.id, result }),\n (error: unknown) => this.write({ jsonrpc: '2.0', id: request.id, error: { code: -32603, message: error instanceof Error ? error.message : 'server request failed' } }),\n ).catch(() => {})\n } else {\n for (const listener of this.notificationListeners) listener(value as unknown as JsonRpcNotification)\n }\n return\n }\n if ('id' in value) {\n const response = value as unknown as JsonRpcResponse\n const pending = this.pending.get(response.id)\n if (!pending) return\n if (response.error) pending.reject(new Error(`${response.error.code}: ${response.error.message}`))\n else pending.resolve(response.result)\n this.pending.delete(response.id)\n }\n }\n\n private write(message: JsonRpcMessage): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.output.write(encodeJsonRpc(message), (error?: Error | null) => error ? reject(error) : resolve())\n })\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { SubprocessHandle } from '@deepseek-ai/dsh-subprocess'\nimport type { InitializeParams, InitializeResult } from '../protocol/types.js'\nimport { initializeServer } from '../protocol/initialize.js'\nimport { JsonRpcConnection } from './connection.js'\nimport { withAbort, throwIfAborted } from './cancellation.js'\n\nexport type SessionState = 'NEW' | 'STARTING' | 'READY' | 'STOPPING' | 'STOPPED' | 'FAILED'\nexport interface ServerSessionOptions {\n spawn(): SubprocessHandle\n initialize: InitializeParams\n configuration: unknown\n maxMessageBytes: number\n shutdown: { shutdownMs: number; killGraceMs: number }\n}\n\nexport class ServerSession {\n state: SessionState = 'NEW'\n capabilities: Record<string, unknown> = {}\n private child?: SubprocessHandle\n private connection?: JsonRpcConnection\n private stopping?: Promise<void>\n private readonly lifetime = new AbortController()\n constructor(private readonly options: ServerSessionOptions) {}\n\n async start(signal?: AbortSignal): Promise<InitializeResult> {\n throwIfAborted(signal)\n this.state = 'STARTING'\n try {\n const child = this.options.spawn()\n this.child = child\n // Observe failed spawn even when stdio could not be allocated.\n void child.done.catch(() => {})\n if (!child.stdout || !child.stdin) throw new Error('server stdio is unavailable')\n const connection = new JsonRpcConnection(child.stdout, child.stdin, {\n maxMessageBytes: this.options.maxMessageBytes,\n onServerRequest: (method, params) => this.answer(method, params),\n })\n this.connection = connection\n void child.done.then(() => connection.close(new Error('LSP process exited')), error => connection.close(error instanceof Error ? error : new Error('LSP spawn failed'))).then(() => {\n if (this.state !== 'STOPPING' && this.state !== 'STOPPED') this.state = 'FAILED'\n })\n const result = await initializeServer(connection, this.options.initialize, this.signal(signal))\n if (result.capabilities.positionEncoding && result.capabilities.positionEncoding !== 'utf-16') throw new Error('server requires unsupported position encoding')\n const sync = result.capabilities.textDocumentSync\n if (sync === undefined || sync === 0 || (typeof sync === 'object' && sync !== null && !(sync as { openClose?: boolean }).openClose)) throw new Error('server does not support document open/close')\n this.capabilities = result.capabilities\n await connection.notify('workspace/didChangeConfiguration', { settings: this.options.configuration })\n throwIfAborted(this.signal(signal))\n this.state = 'READY'\n return result\n } catch (error) {\n this.state = 'FAILED'\n await this.stop()\n throw error\n }\n }\n\n get usable(): boolean { return this.state === 'READY' && !!this.connection?.isOpen }\n isUsable(): boolean { return this.usable }\n async run<T>(task: (connection: JsonRpcConnection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!this.usable || !this.connection) throw new Error('session is not ready')\n try { return await withAbort(task(this.connection), this.signal(signal)) }\n catch (error) {\n // Stop cancelled work before the next queued request can reuse this process.\n if (signal?.aborted || !this.connection.isOpen) await this.stop()\n throw error\n }\n }\n\n stop(): Promise<void> {\n return this.stopping ??= this.teardown()\n }\n private async teardown(): Promise<void> {\n this.state = 'STOPPING'\n this.lifetime.abort()\n const child = this.child, connection = this.connection\n const timeout = AbortSignal.timeout(this.options.shutdown.shutdownMs)\n if (connection?.isOpen) {\n try { await connection.request('shutdown', null, timeout); await connection.notify('exit') } catch {}\n }\n connection?.close(new Error('session stopped'))\n if (child) {\n child.terminate()\n if (!await child.waitForExit(AbortSignal.timeout(this.options.shutdown.killGraceMs + 1000))) throw new Error('language server process tree did not exit within the cleanup deadline')\n }\n this.state = 'STOPPED'\n }\n private signal(signal?: AbortSignal): AbortSignal { return signal ? AbortSignal.any([signal, this.lifetime.signal]) : this.lifetime.signal }\n private answer(method: string, params: unknown): unknown {\n if (method === 'workspace/applyEdit') return { applied: false, failureReason: 'read-only provider' }\n if (method === 'workspace/workspaceFolders') return this.options.initialize.workspaceFolders ?? []\n if (method === 'workspace/configuration') {\n const items = (params as { items?: Array<{ section?: string }> } | undefined)?.items ?? []\n return items.map(item => {\n let value = this.options.configuration\n for (const key of item.section?.split('.') ?? []) {\n value = typeof value === 'object' && value !== null ? (value as Record<string, unknown>)[key] : undefined\n }\n return value ?? null\n })\n }\n return null\n }\n}\n","import { throwIfAborted, withAbort } from './cancellation.js'\n\nexport interface PoolSession {\n readonly state: string\n start(signal?: AbortSignal): Promise<unknown>\n stop(): Promise<void>\n isUsable(): boolean\n}\nexport type SessionFactory<S extends PoolSession> = (serverId: string, workspace: string, signal?: AbortSignal) => Promise<S>\n\nexport class ServerPool<S extends PoolSession> {\n private readonly sessions = new Map<string, S>()\n private readonly creation = new Map<string, Promise<S>>()\n private readonly queues = new Map<string, Promise<void>>()\n private disposing = false\n constructor(private readonly factory: SessionFactory<S>) {}\n\n async getOrCreate(serverId: string, workspace: string, signal?: AbortSignal): Promise<S> {\n throwIfAborted(signal)\n if (this.disposing) throw new Error('server pool is disposing')\n const key = keyOf(serverId, workspace)\n const existing = this.sessions.get(key)\n if (existing?.isUsable()) return existing\n const pending = this.creation.get(key)\n if (pending) return withAbort(pending, signal)\n const creation = this.create(key, serverId, workspace, existing, signal)\n this.creation.set(key, creation)\n try { return await creation }\n finally { if (this.creation.get(key) === creation) this.creation.delete(key) }\n }\n\n run<T>(serverId: string, workspace: string, task: (session: S) => Promise<T>, signal?: AbortSignal): Promise<T> {\n return this.serialize(keyOf(serverId, workspace), async () => task(await this.getOrCreate(serverId, workspace, signal)), signal)\n }\n\n runWithRetry<T>(serverId: string, workspace: string, task: (session: S) => Promise<T>, signal?: AbortSignal, canReuse?: (session: S) => boolean): Promise<T> {\n // Keep failure eviction and the retry inside the same queue slot. A later query\n // must never enter a replacement process before the failed query finishes cleanup.\n return this.serialize(keyOf(serverId, workspace), async () => {\n const existing = this.sessions.get(keyOf(serverId, workspace))\n // Replacement belongs to this queue slot, after earlier work has completed.\n if (existing?.isUsable() && canReuse && !canReuse(existing)) await this.evict(serverId, workspace)\n for (let attempt = 0; ; attempt++) {\n const session = await this.getOrCreate(serverId, workspace, signal)\n try { return await task(session) }\n catch (error) {\n throwIfAborted(signal)\n if (attempt > 0 || session.isUsable()) throw error\n if (this.sessions.get(keyOf(serverId, workspace)) === session) await this.evict(serverId, workspace)\n }\n }\n }, signal)\n }\n\n async evict(serverId: string, workspace: string): Promise<void> {\n const key = keyOf(serverId, workspace)\n const session = this.sessions.get(key)\n this.sessions.delete(key)\n if (session) await session.stop()\n }\n\n async disposeAll(): Promise<void> {\n this.disposing = true\n const results = await Promise.allSettled([...this.sessions.values()].map(session => session.stop()))\n this.sessions.clear()\n await Promise.all([...this.creation.values()].map(creation => creation.then(session => session.stop(), () => {})))\n this.creation.clear()\n const failures = results.filter((result): result is PromiseRejectedResult => result.status === 'rejected')\n if (failures.length) throw new AggregateError(failures.map(result => result.reason), 'language server cleanup failed')\n }\n\n get size(): number { return this.sessions.size }\n\n private async serialize<T>(key: string, task: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const previous = this.queues.get(key) ?? Promise.resolve()\n let release!: () => void\n const current = new Promise<void>(resolve => { release = resolve })\n this.queues.set(key, current)\n try {\n await withAbort(previous, signal)\n throwIfAborted(signal)\n return await task()\n } finally {\n // A cancelled waiter cannot let its successor bypass still-running work.\n void previous.then(release, release)\n void current.then(() => { if (this.queues.get(key) === current) this.queues.delete(key) })\n }\n }\n\n private async create(key: string, serverId: string, workspace: string, previous?: S, signal?: AbortSignal): Promise<S> {\n if (previous) { this.sessions.delete(key); await previous.stop() }\n throwIfAborted(signal)\n const session = await this.factory(serverId, workspace, signal)\n try { await session.start(signal) } catch (error) { await session.stop(); throw error }\n if (this.disposing) { await session.stop(); throw new Error('server pool is disposing') }\n this.sessions.set(key, session)\n return session\n }\n}\n\nexport function keyOf(serverId: string, workspace: string): string { return `${serverId}\\u0000${workspace}` }\n","export type StandardOperation = 'goToDefinition' | 'findReferences' | 'goToImplementation' | 'hover'\n\nexport function supportsOperation(capabilities: Record<string, unknown>, operation: StandardOperation): boolean {\n if (operation === 'goToDefinition') return capabilities.definitionProvider === true || isProvider(capabilities.definitionProvider)\n if (operation === 'findReferences') return capabilities.referencesProvider === true || isProvider(capabilities.referencesProvider)\n if (operation === 'goToImplementation') return capabilities.implementationProvider === true || isProvider(capabilities.implementationProvider)\n return capabilities.hoverProvider === true || isProvider(capabilities.hoverProvider)\n}\n\nfunction isProvider(value: unknown): boolean {\n return typeof value === 'object' && value !== null || value === true\n}\n\nexport function defaultServerRequest(method: string, params: unknown): unknown {\n if (method === 'workspace/configuration') {\n return Array.isArray(params) ? params.map(() => null) : []\n }\n if (method === 'window/workDoneProgress/create' || method === 'client/registerCapability' || method === 'client/unregisterCapability') return null\n if (method === 'workspace/applyEdit') return { applied: false, failureReason: 'read-only provider' }\n return null\n}\n","import type { LspRange } from '../service.js'\n\nexport interface NormalizedHover {\n contents: string\n range?: LspRange\n}\n\nexport function normalizeHover(value: unknown): NormalizedHover | null | undefined {\n if (value === null || value === undefined) return null\n if (typeof value !== 'object' || value === null) return undefined\n const record = value as { contents?: unknown; range?: unknown }\n const contents = normalizeContents(record.contents)\n if (contents === undefined) return undefined\n return { contents, ...(isRange(record.range) ? { range: record.range } : {}) }\n}\n\nfunction normalizeContents(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) {\n const parts = value.map((item) => typeof item === 'string' ? item : isRecord(item) && typeof item.value === 'string' ? item.value : undefined)\n return parts.every((item): item is string => item !== undefined) ? parts.join('\\n') : undefined\n }\n if (isRecord(value) && typeof value.value === 'string') return value.value\n return undefined\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): boolean {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { LspPosition, LspRange } from '../service.js'\n\nexport interface NormalizedLocation {\n uri: string\n range: LspRange\n}\n\nexport function normalizeLocation(value: unknown): NormalizedLocation | undefined {\n if (isRecord(value) && typeof value.targetUri === 'string' && isRange(value.targetSelectionRange)) return { uri: value.targetUri, range: value.targetSelectionRange }\n if (!isRecord(value) || typeof value.uri !== 'string' || !isRange(value.range)) return undefined\n return { uri: value.uri, range: value.range }\n}\n\nexport function normalizeLocations(value: unknown): NormalizedLocation[] {\n const values = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n return values.map(normalizeLocation).filter((location): location is NormalizedLocation => location !== undefined)\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): value is LspPosition {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { LspRange, NormalizedDiagnostic } from '../service.js'\n\nexport function normalizeDiagnostic(value: unknown, server: string, fallbackUri: string): NormalizedDiagnostic | undefined {\n if (!isRecord(value) || !isRange(value.range) || typeof value.message !== 'string') return undefined\n const uri = typeof value.uri === 'string' ? value.uri : fallbackUri\n const severity = typeof value.severity === 'number' && value.severity >= 1 && value.severity <= 4 ? value.severity as 1 | 2 | 3 | 4 : undefined\n const code = typeof value.code === 'string' || typeof value.code === 'number' ? value.code : undefined\n return { server, uri, range: value.range, message: value.message, ...(severity === undefined ? {} : { severity }), ...(code === undefined ? {} : { code }), ...(typeof value.source === 'string' ? { source: value.source } : {}) }\n}\n\nexport function normalizeDiagnostics(value: unknown, server: string, fallbackUri: string): NormalizedDiagnostic[] {\n const values = Array.isArray(value) ? value : []\n return values.map((item) => normalizeDiagnostic(item, server, fallbackUri)).filter((item): item is NormalizedDiagnostic => item !== undefined)\n}\n\nfunction isRange(value: unknown): value is LspRange {\n return isRecord(value) && isPosition(value.start) && isPosition(value.end)\n}\n\nfunction isPosition(value: unknown): boolean {\n return isRecord(value) && Number.isInteger(value.line) && Number.isInteger(value.character) && value.line >= 0 && value.character >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { NormalizedCompletionItem } from '../service.js'\n\nexport function normalizeCompletionItem(value: unknown, server: string): NormalizedCompletionItem | undefined {\n if (!isRecord(value) || typeof value.label !== 'string' || value.label.length === 0) return undefined\n return {\n server,\n label: value.label,\n ...(typeof value.kind === 'number' ? { kind: value.kind } : {}),\n ...(typeof value.detail === 'string' ? { detail: value.detail } : {}),\n ...(typeof value.documentation === 'string' ? { documentation: value.documentation } : {}),\n ...(typeof value.sortText === 'string' ? { sortText: value.sortText } : {}),\n ...(typeof value.filterText === 'string' ? { filterText: value.filterText } : {}),\n ...(typeof value.insertText === 'string' ? { insertText: value.insertText } : {}),\n ...(typeof value.insertTextFormat === 'number' ? { insertTextFormat: value.insertTextFormat } : {}),\n ...(typeof value.deprecated === 'boolean' ? { deprecated: value.deprecated } : {}),\n }\n}\n\nexport function normalizeCompletion(value: unknown, server: string): NormalizedCompletionItem[] {\n const items = isRecord(value) && Array.isArray(value.items) ? value.items : Array.isArray(value) ? value : []\n return items.map((item) => normalizeCompletionItem(item, server)).filter((item): item is NormalizedCompletionItem => item !== undefined)\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { NormalizedHover } from '../protocol/normalize-hover.js'\nimport type { LspRange } from '../service.js'\n\nexport interface ServerHover extends NormalizedHover {\n server: string\n}\n\nexport function mergeHover(primary: ServerHover | null | undefined, auxiliary: ServerHover | null | undefined): ServerHover | null {\n if (!primary && !auxiliary) return null\n if (!primary) return auxiliary ? { ...auxiliary } : null\n if (!auxiliary) return { ...primary }\n const contents = [primary.contents, auxiliary.contents].filter((value, index, values) => values.indexOf(value) === index)\n const range = sameRange(primary.range, auxiliary.range) ? primary.range : undefined\n return { server: primary.server, contents: contents.join('\\n\\n'), ...(range ? { range } : {}) }\n}\n\nfunction sameRange(left: LspRange | undefined, right: LspRange | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n","import { symbols } from '@deepseek-ai/cordis'\nimport { isAbsolute } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport { WebstackLspError } from '../errors.js'\nimport type { CodeCapabilitiesV1, CodeHostBindingV1, CodeIntelligenceServiceV1, CodeLeaseV1, CodeRequestV1, CodeResponseV1, CodeStatus } from '../code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1, SemanticResult, StructureNode } from './types.js'\n\nconst CAPABILITIES = ['snapshots', 'structure', 'semantic'] as const\nconst MAX_FILES = 100\nconst MAX_INPUT_BYTES = 16 * 1024 * 1024\nconst MAX_OUTPUT_BYTES = 64 * 1024\nconst MAX_CALLS = 100\nconst MAX_BATCH_MS = 30_000\nconst RESPONSE_BYTES = 32 * 1024\n\nexport interface CodeIntelligenceProtocolOptions {\n backend: CodeIntelligenceToolServiceV1\n fs: unknown\n subprocess: unknown\n capabilities(signal: AbortSignal): Promise<CodeCapabilitiesV1>\n}\n\n/** Host-bound V1 facade. Each lease owns its handles and cumulative evaluation budget. */\nexport class CodeIntelligenceProtocolService implements CodeIntelligenceServiceV1 {\n readonly version = 1 as const\n readonly capabilities = CAPABILITIES\n private readonly leases = new Set<CodeLease>()\n private closed = false\n\n constructor(private readonly options: CodeIntelligenceProtocolOptions) {}\n\n async bind(binding: CodeHostBindingV1, signal: AbortSignal): Promise<CodeLeaseV1> {\n if (this.closed) throw new WebstackLspError('LSP_DISPOSED', 'code-intelligence service is disposed')\n validateBinding(binding)\n signal.throwIfAborted()\n await binding.assertCurrent()\n const contextFs = binding.context.get('fs', false)\n const contextSubprocess = binding.context.get('subprocess', false)\n if (identity(contextFs) !== identity(this.options.fs) || identity(contextSubprocess) !== identity(this.options.subprocess))\n throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'host services do not match the provider scope')\n const scope = {\n ownerId: `${binding.owner.agentId}:code:${randomUUID()}`,\n sessionId: binding.owner.sessionId,\n workspaceRoot: binding.workspaceRoot,\n }\n const lease = new CodeLease(binding, scope, this.options.backend, this.options.capabilities, identity(this.options.fs), identity(this.options.subprocess), () => this.leases.delete(lease))\n this.leases.add(lease)\n try {\n await lease.assertCurrent(signal)\n if (this.closed) throw new WebstackLspError('LSP_DISPOSED', 'code-intelligence service is disposed')\n return lease\n } catch (error) {\n await lease.dispose()\n throw error\n }\n }\n\n async dispose(): Promise<void> {\n if (this.closed) return\n this.closed = true\n await Promise.all([...this.leases].map(lease => lease.dispose()))\n }\n}\n\nclass CodeLease implements CodeLeaseV1 {\n private readonly lifetime = new AbortController()\n private readonly snapshots = new Map<string, { version: string; path: string }>()\n private readonly nodes = new Map<string, string>()\n private calls = 0\n private files = 0\n private inputBytes = 0\n private outputBytes = 0\n private readonly started = performance.now()\n private disposed = false\n private disposal?: Promise<void>\n\n constructor(\n private readonly binding: CodeHostBindingV1,\n private readonly scope: { ownerId: string; sessionId: string; workspaceRoot: string },\n private readonly backend: CodeIntelligenceToolServiceV1,\n private readonly capabilities: (signal: AbortSignal) => Promise<CodeCapabilitiesV1>,\n private readonly fsIdentity: unknown,\n private readonly subprocessIdentity: unknown,\n private readonly onDispose: () => void,\n ) {}\n\n async assertCurrent(signal: AbortSignal): Promise<void> {\n signal.throwIfAborted()\n if (this.disposed) throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'code evaluation has ended')\n await this.binding.assertCurrent()\n if (identity(this.binding.context.get('fs', false)) !== this.fsIdentity || identity(this.binding.context.get('subprocess', false)) !== this.subprocessIdentity)\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'host service scope changed')\n signal.throwIfAborted()\n }\n\n async request(input: CodeRequestV1, caller: AbortSignal): Promise<CodeResponseV1> {\n const release = input?.method === 'snapshot.release'\n if (!release) this.calls++\n if (this.disposed) return this.account(outcome('stale', 'evaluation_closed'))\n if (!validCodeRequest(input)) return this.account(outcome('unsupported', 'invalid_request'))\n if (caller.aborted) return this.account(outcome(caller.reason?.name === 'TimeoutError' ? 'timeout' : 'cancelled', caller.reason?.name === 'TimeoutError' ? 'caller_deadline' : 'caller_cancelled'))\n\n if (release) return this.release(input.handle)\n if (this.calls > MAX_CALLS || this.outputBytes >= MAX_OUTPUT_BYTES || this.files >= MAX_FILES && input.method === 'snapshot.open' || this.inputBytes >= MAX_INPUT_BYTES && input.method === 'snapshot.open')\n return this.account(outcome('limit_exceeded', 'evaluation_budget'))\n const remaining = MAX_BATCH_MS - (performance.now() - this.started)\n if (remaining <= 0) return this.account(outcome('timeout', 'batch_deadline'))\n if ('handle' in input && !this.snapshots.has(input.handle) || 'nodeHandle' in input && !this.nodes.has(input.nodeHandle))\n return this.account(outcome('stale', 'unknown_handle'))\n\n const duration = input.method === 'semantic.query' ? 10_000 : 2_000\n const timeout = AbortSignal.timeout(Math.max(1, Math.floor(Math.min(remaining, duration))))\n const signal = AbortSignal.any([caller, this.lifetime.signal, timeout])\n try {\n await this.assertCurrent(signal)\n let response: CodeResponseV1\n if (input.method === 'capabilities') response = this.capabilitiesResponse(await this.capabilities(signal))\n else if (input.method === 'snapshot.open') response = await this.open(input, signal)\n else response = await this.query(input, signal)\n await this.assertCurrent(signal)\n return this.account(boundResponse(response))\n } catch (error) {\n if (signal.aborted) return this.account(outcome(this.lifetime.signal.aborted || caller.aborted && caller.reason?.name !== 'TimeoutError' ? 'cancelled' : 'timeout', caller.aborted ? caller.reason?.name === 'TimeoutError' ? 'caller_deadline' : 'caller_cancelled' : 'operation_deadline'))\n if (error instanceof WebstackLspError) return this.account(mapError(error))\n return this.account(outcome('unavailable', 'provider_operation_failed'))\n }\n }\n\n private async open(input: Extract<CodeRequestV1, { method: 'snapshot.open' }>, signal: AbortSignal): Promise<CodeResponseV1> {\n this.files++\n const opened = await this.backend.snapshot.open(this.scope, input.path, signal)\n const version = `${opened.version}:${opened.contentHash}`\n const response: CodeResponseV1 = {\n protocol: 'code-intelligence/v1',\n status: 'ok',\n sourceKind: 'disk',\n freshness: 'pinned',\n snapshotVersion: version,\n truncated: false,\n omitted: 0,\n inputBytes: opened.sourceBytes,\n data: { handle: opened.handle, path: opened.filePath, language: opened.language ?? 'unsupported', parseErrors: opened.parseErrors },\n }\n if (this.inputBytes + opened.sourceBytes > MAX_INPUT_BYTES) {\n await this.backend.snapshot.release(this.scope, opened.handle).catch(() => {})\n return outcome('limit_exceeded', 'input_budget')\n }\n this.inputBytes += opened.sourceBytes\n this.snapshots.set(opened.handle, { version, path: opened.filePath })\n return response\n }\n\n private async query(input: Exclude<CodeRequestV1, { method: 'capabilities' | 'snapshot.open' | 'snapshot.release' }>, signal: AbortSignal): Promise<CodeResponseV1> {\n const handle = 'handle' in input ? input.handle : this.nodes.get(input.nodeHandle)!\n const snapshot = this.snapshots.get(handle)\n if (!snapshot) return outcome('stale', 'unknown_handle')\n const metadata = { snapshotVersion: snapshot.version, freshness: 'current' as const }\n if (input.method === 'structure.outline') {\n const result = await this.backend.structure.outline(this.scope, input.handle, { ...(input.range ? { range: input.range } : {}), ...(input.limit ? { limit: input.limit } : {}) }, signal)\n const items = result.declarations.map(projectNode)\n this.rememberNodes(handle, items)\n const status = result.truncated && result.status === 'ok' ? 'partial' : result.status\n return responseFor(status, result.status === 'unsupported' ? 'grammar_missing' : result.errors.hasError ? 'parse_errors' : undefined, metadata, { items }, result.truncated, result.truncated ? 1 : 0)\n }\n if (input.method === 'structure.enclosing') {\n const result = await this.backend.structure.enclosing(this.scope, input.handle, input.position, input.kinds ? { kinds: input.kinds } : undefined, signal)\n const items = [...(result.node ? [result.node] : []), ...result.ancestors].map(projectNode)\n this.rememberNodes(handle, items)\n return responseFor(result.status, result.status === 'unsupported' ? 'grammar_missing' : result.errors?.hasError ? 'parse_errors' : undefined, metadata, { items })\n }\n if (input.method === 'structure.query') {\n const result = await this.backend.structure.query(this.scope, input.handle, input.queryId, { ...(input.range ? { range: input.range } : {}), ...(input.limit ? { limit: input.limit } : {}) }, signal)\n const items = result.captures.map(capture => ({ handle: capture.nodeHandle, kind: capture.kind, range: capture.range, ...(capture.name ? { name: capture.name } : {}) }))\n this.rememberNodes(handle, items)\n return responseFor(result.truncated && result.status === 'ok' ? 'partial' : result.status, undefined, metadata, { items, queryId: result.queryId }, result.truncated, result.truncated ? 1 : 0)\n }\n if (input.method === 'structure.span') {\n const result = await this.backend.structure.span(this.scope, input.nodeHandle, input.maxChars, signal)\n return responseFor(result.status, undefined, metadata, { text: result.text, range: result.range }, result.truncated, result.truncated ? 1 : 0)\n }\n return this.semantic(input, metadata, signal)\n }\n\n private async semantic(input: Extract<CodeRequestV1, { method: 'semantic.query' }>, metadata: { snapshotVersion: string; freshness: 'current' }, signal: AbortSignal): Promise<CodeResponseV1> {\n const result: SemanticResult = await this.backend.semantic.query(this.scope, input.handle, {\n operation: input.kind,\n ...(input.position ? { position: input.position } : {}),\n ...(input.limit ? { maxResults: input.limit } : {}),\n }, signal)\n if (result.status === 'unsupported' || result.status === 'unavailable' || result.status === 'stale' || result.status === 'timeout' || result.status === 'cancelled' || result.status === 'limit_exceeded')\n return responseFor(result.status, `semantic_${result.status}`, metadata)\n const value = result.result\n if (input.kind === 'hover') {\n if (!isRecord(value) || value.kind !== 'hover') return outcome('unavailable', 'semantic_result_invalid')\n const hover = value.hover\n if (hover === null) return responseFor(result.status, undefined, metadata, { hover: null })\n if (!isRecord(hover) || typeof hover.contents !== 'string') return outcome('unavailable', 'semantic_result_invalid')\n const contents = trimUtf16(hover.contents, 16_000)\n const truncated = contents !== hover.contents\n return responseFor(result.status, undefined, metadata, { hover: { contents, ...(hover.range ? { range: hover.range } : {}) } }, truncated, truncated ? hover.contents.length - contents.length : 0)\n }\n if (input.kind === 'completion') {\n if (!isRecord(value) || !Array.isArray(value.items)) return outcome('unavailable', 'semantic_result_invalid')\n let truncated = Boolean(result.truncated)\n const items = value.items.map((item: any) => ({\n label: typeof item.label === 'string' ? item.label.slice(0, 1000) : '',\n ...(typeof item.detail === 'string' ? { detail: item.detail.slice(0, 4000) } : {}),\n ...(typeof item.documentation === 'string' ? { documentation: item.documentation.slice(0, 8000) } : {}),\n ...(Number.isInteger(item.kind) ? { kind: item.kind } : {}),\n ...(typeof item.insertText === 'string' ? { insertText: item.insertText.slice(0, 8000) } : {}),\n }))\n if (items.some((item, index) => item.label !== value.items[index]?.label || item.detail !== value.items[index]?.detail || item.documentation !== value.items[index]?.documentation || item.insertText !== value.items[index]?.insertText)) truncated = true\n const limit = input.limit ?? 200\n const omitted = (result.omitted ?? 0) + Math.max(0, items.length - limit)\n return responseFor(truncated || omitted ? 'partial' : result.status, undefined, metadata, { items: items.slice(0, limit) }, truncated || omitted > 0, omitted)\n }\n if (input.kind === 'diagnostics') {\n if (!isRecord(value) || !Array.isArray(value.diagnostics)) return outcome('unavailable', 'semantic_result_invalid')\n if (value.skipped) return responseFor('unsupported', 'unsupported_file_type', metadata)\n let truncated = Boolean(result.truncated)\n const items = value.diagnostics.map((item: any) => {\n const message = typeof item.message === 'string' ? item.message.slice(0, 8000) : ''\n if (message !== item.message) truncated = true\n return { uri: item.uri, range: item.range, message, ...(Number.isInteger(item.severity) ? { severity: item.severity } : {}) }\n })\n const limit = input.limit ?? 200\n const omitted = (result.omitted ?? 0) + Math.max(0, items.length - limit)\n return responseFor(truncated || omitted || result.status === 'partial' ? 'partial' : result.status, undefined, metadata, { items: items.slice(0, limit) }, truncated || omitted > 0, omitted)\n }\n if (!isRecord(value) || value.kind !== 'locations' || !Array.isArray(value.locations)) return outcome('unavailable', 'semantic_result_invalid')\n return responseFor(result.status, undefined, metadata, { items: value.locations }, Boolean(result.truncated), result.omitted ?? 0)\n }\n\n private async release(handle: string): Promise<CodeResponseV1> {\n const known = this.snapshots.delete(handle)\n for (const [node, snapshot] of this.nodes) if (snapshot === handle) this.nodes.delete(node)\n if (!known) return responseFor('ok', 'released', { sourceKind: 'disk', freshness: 'unknown' }, { released: false })\n const result = await this.backend.snapshot.release(this.scope, handle)\n return responseFor('ok', 'released', { sourceKind: 'disk', freshness: 'unknown' }, result)\n }\n\n private capabilitiesResponse(capabilities: CodeCapabilitiesV1): CodeResponseV1 {\n return responseFor('ok', 'capabilities', { sourceKind: 'disk', freshness: 'unknown' }, capabilities)\n }\n\n private rememberNodes(snapshotHandle: string, items: Array<{ handle: string }>): void {\n for (const item of items) this.nodes.set(item.handle, snapshotHandle)\n }\n\n private account(response: CodeResponseV1): CodeResponseV1 {\n const bytes = Buffer.byteLength(JSON.stringify(response))\n if (bytes > RESPONSE_BYTES) response = outcome('limit_exceeded', 'response_limit')\n this.outputBytes += Buffer.byteLength(JSON.stringify(response))\n if (this.outputBytes > MAX_OUTPUT_BYTES) return outcome('limit_exceeded', 'response_budget')\n return response\n }\n\n dispose(): Promise<void> {\n if (this.disposal) return this.disposal\n this.disposed = true\n this.lifetime.abort()\n this.snapshots.clear()\n this.nodes.clear()\n this.onDispose()\n this.disposal = Promise.resolve(this.backend.releaseOwner?.(this.scope)).then(() => undefined, () => undefined)\n return this.disposal\n }\n}\n\nfunction outcome(status: CodeStatus, reason: string): CodeResponseV1 {\n return { protocol: 'code-intelligence/v1', status, reason, sourceKind: 'disk', freshness: status === 'stale' ? 'stale' : 'unknown', truncated: false, omitted: 0 }\n}\n\nfunction responseFor(status: CodeStatus, reason: string | undefined, metadata: { snapshotVersion?: string; freshness: CodeResponseV1['freshness']; sourceKind?: 'disk' }, data?: unknown, truncated = false, omitted = 0): CodeResponseV1 {\n const successful = status === 'ok' || status === 'partial'\n return { protocol: 'code-intelligence/v1', status, ...(reason ? { reason } : {}), sourceKind: 'disk', freshness: metadata.freshness, ...(metadata.snapshotVersion ? { snapshotVersion: metadata.snapshotVersion } : {}), truncated, omitted, ...(successful && data !== undefined ? { data } : {}) }\n}\n\nfunction boundResponse(response: CodeResponseV1): CodeResponseV1 {\n if (Buffer.byteLength(JSON.stringify(response), 'utf8') <= RESPONSE_BYTES) return response\n if (isRecord(response.data) && Array.isArray(response.data.items)) {\n const items = [...response.data.items]\n let omitted = response.omitted\n while (items.length && Buffer.byteLength(JSON.stringify({ ...response, data: { ...response.data, items } }), 'utf8') > RESPONSE_BYTES) {\n items.pop()\n omitted++\n }\n const shortened: CodeResponseV1 = { ...response, status: 'partial', reason: response.reason ?? 'response_truncated', truncated: true, omitted, data: { ...response.data, items } }\n if (Buffer.byteLength(JSON.stringify(shortened), 'utf8') <= RESPONSE_BYTES) return shortened\n }\n return outcome('limit_exceeded', 'response_limit')\n}\n\nfunction mapError(error: WebstackLspError): CodeResponseV1 {\n if (error.code === 'LSP_STALE_SNAPSHOT') return outcome('stale', 'source_changed')\n if (error.code === 'LSP_STRUCTURE_TIMEOUT') return outcome('timeout', 'parser_deadline')\n if (error.code === 'LSP_STRUCTURE_LIMIT' || error.code === 'LSP_SNAPSHOT_LIMIT') return outcome('limit_exceeded', 'provider_limit')\n if (error.code === 'LSP_STRUCTURE_UNSUPPORTED' || error.code === 'LSP_UNSUPPORTED_OPERATION') return outcome('unsupported', 'capability_missing')\n if (error.code === 'LSP_STRUCTURE_BUSY') return outcome('unavailable', 'parser_busy')\n if (error.code === 'LSP_CODE_INTELLIGENCE_UNAVAILABLE' || error.code === 'LSP_STRUCTURE_UNAVAILABLE' || error.code === 'LSP_UNAVAILABLE') return outcome('unavailable', 'provider_unavailable')\n if (error.code === 'LSP_WORKSPACE_REQUIRED') return outcome('unavailable', 'invalid_path')\n return outcome('unavailable', 'provider_operation_failed')\n}\n\nfunction projectNode(node: StructureNode): { handle: string; kind: string; range: StructureNode['range']; name?: string } {\n return { handle: node.handle, kind: node.kind, range: node.range, ...(node.name ? { name: node.name } : {}) }\n}\n\nfunction trimUtf16(value: string, limit: number): string {\n if (value.length <= limit) return value\n const end = value.charCodeAt(limit - 1) >= 0xd800 && value.charCodeAt(limit - 1) <= 0xdbff ? limit - 1 : limit\n return value.slice(0, end)\n}\n\nfunction validCodeRequest(value: unknown): value is CodeRequestV1 {\n if (!isRecord(value) || typeof value.method !== 'string') return false\n const keys: Record<string, string[]> = {\n capabilities: ['method'], 'snapshot.open': ['method', 'path'], 'snapshot.release': ['method', 'handle'],\n 'structure.outline': ['method', 'handle', 'range', 'limit'], 'structure.enclosing': ['method', 'handle', 'position', 'kinds'],\n 'structure.query': ['method', 'handle', 'queryId', 'range', 'limit'], 'structure.span': ['method', 'nodeHandle', 'maxChars'],\n 'semantic.query': ['method', 'handle', 'kind', 'position', 'limit'],\n }\n const allowed = keys[value.method]\n if (!allowed || Object.keys(value).some(key => !allowed.includes(key))) return false\n const handle = 'handle' in value ? value.handle : 'nodeHandle' in value ? value.nodeHandle : undefined\n if (handle !== undefined && (typeof handle !== 'string' || !handle.length || handle.length > 256)) return false\n if (value.method === 'snapshot.open') return typeof value.path === 'string' && value.path.length > 0 && value.path.length <= 4096\n if (value.method === 'capabilities' || value.method === 'snapshot.release') return true\n if ('limit' in value && value.limit !== undefined && (!Number.isSafeInteger(value.limit) || value.limit < 1 || value.limit > 200)) return false\n if ('range' in value && value.range !== undefined && !validRange(value.range)) return false\n if (value.method === 'structure.outline') return value.limit === undefined || value.limit <= 100\n if (value.method === 'structure.enclosing') return validPosition(value.position) && (value.kinds === undefined || Array.isArray(value.kinds) && value.kinds.length <= 30 && value.kinds.every(kind => typeof kind === 'string' && kind.length <= 100))\n if (value.method === 'structure.query') return ['declarations', 'calls', 'imports'].includes(String(value.queryId))\n if (value.method === 'structure.span') return value.maxChars === undefined || Number.isSafeInteger(value.maxChars) && value.maxChars >= 1 && value.maxChars <= 8000\n if (value.method === 'semantic.query') return ['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(String(value.kind)) && (value.kind === 'diagnostics' || validPosition(value.position))\n return false\n}\n\nfunction validRange(value: unknown): value is { start: { line: number; character: number }; end: { line: number; character: number } } {\n if (!isRecord(value) || !validPosition(value.start) || !validPosition(value.end)) return false\n return value.end.line > value.start.line || value.end.line === value.start.line && value.end.character >= value.start.character\n}\nfunction validPosition(value: unknown): value is { line: number; character: number } { return isRecord(value) && Number.isSafeInteger(value.line) && Number.isSafeInteger(value.character) && value.line >= 0 && value.character >= 0 }\nfunction isRecord(value: unknown): value is Record<string, any> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\nfunction identity(value: unknown): unknown { return value && typeof value === 'object' ? (value as Record<symbol, unknown>)[symbols.original] ?? value : value }\nfunction validateBinding(binding: CodeHostBindingV1): void {\n if (!binding || !binding.owner || typeof binding.owner.agentId !== 'string' || typeof binding.owner.sessionId !== 'string' || typeof binding.workspaceRoot !== 'string' || !isAbsolute(binding.workspaceRoot) || !binding.scope || typeof binding.assertCurrent !== 'function' || !binding.context || typeof binding.context.get !== 'function')\n throw new WebstackLspError('LSP_CODE_INTELLIGENCE_UNAVAILABLE', 'invalid trusted code host binding')\n}\n","import type { LspProviderQuery, LspQueryResult } from '@deepseek-ai/dsh-lsp'\nimport type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport type { ResolvedConfig, ServerId } from '../config.js'\nimport { SERVER_IDS } from '../config.js'\nimport { readSource, type HostFileSystem, type HostSource } from '../host/dsh.js'\nimport { classifyFile, supportedFileSuffixes } from '../routing/classifier.js'\nimport { routeFor, type Route } from '../routing/route-table.js'\nimport { hasTailwindCandidate } from '../routing/tailwind-candidate.js'\nimport { resolveLaunch, initializationOptions, serverConfiguration } from '../servers/launch.js'\nimport { supportsTypeScriptDiagnostics, requestTypeScriptDiagnostics } from '../servers/typescript-diagnostics.js'\nimport { ServerSession } from './server-session.js'\nimport { ServerPool } from './server-pool.js'\nimport { throwIfAborted, withAbort } from './cancellation.js'\nimport { WebstackLspError } from '../errors.js'\nimport { supportsOperation } from '../protocol/capabilities.js'\nimport { normalizeHover } from '../protocol/normalize-hover.js'\nimport { normalizeLocations } from '../protocol/normalize-location.js'\nimport { normalizeDiagnostics } from '../protocol/normalize-diagnostic.js'\nimport { normalizeCompletion } from '../protocol/normalize-completion.js'\nimport { mergeHover } from '../merge/hover.js'\nimport { mergeDiagnostics } from '../merge/diagnostics.js'\nimport { mergeCompletions } from '../merge/completion.js'\nimport type { CompletionRequest, CompletionResult, DiagnosticsRequest, DiagnosticsResult, LspPosition, NavigationResult, WebstackLspStatus } from '../service.js'\nimport { createCodeIntelligenceToolServiceV1 } from '../structure/code-intelligence.js'\nimport { DocumentSnapshotStore } from '../structure/snapshots.js'\nimport type { SnapshotRecord } from '../structure/snapshots.js'\nimport { CodeIntelligenceProtocolService } from '../structure/protocol.js'\nimport type { CodeIntelligenceServiceV1, CodeCapabilitiesV1, CodeSemanticKind } from '../code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1, SemanticQuery, SnapshotScope } from '../structure/types.js'\nimport type { JsonRpcConnection } from './connection.js'\n\nexport type HostSubprocess = Pick<SubprocessRuntime, 'spawn' | 'resolveExecutable'>\nconst methods = { hover: 'textDocument/hover', goToDefinition: 'textDocument/definition', findReferences: 'textDocument/references', goToImplementation: 'textDocument/implementation' } as const\nconst clientCapabilities = {\n general: { positionEncodings: ['utf-16'] },\n workspace: { configuration: true, workspaceFolders: true, applyEdit: false },\n textDocument: {\n synchronization: { dynamicRegistration: false, didSave: false },\n hover: { contentFormat: ['markdown', 'plaintext'] },\n completion: { completionItem: { snippetSupport: true, documentationFormat: ['markdown', 'plaintext'] } },\n publishDiagnostics: { versionSupport: true }, diagnostic: {},\n },\n}\n\nexport class WebstackLspRuntime {\n private readonly pool: ServerPool<ServerSession>\n private readonly snapshots: DocumentSnapshotStore\n readonly codeIntelligence: CodeIntelligenceServiceV1\n readonly codeIntelligenceRuntime: CodeIntelligenceToolServiceV1\n private readonly semanticOperations = new Map<string, Set<CodeSemanticKind>>()\n private readonly workspaces = new Map<string, HostSource>()\n private readonly lifetime = new AbortController()\n private readonly live = new Map<ServerSession, ServerId>()\n private readonly starts = new Map<string, number>()\n private readonly restarts = new Map<ServerId, number>()\n constructor(private readonly config: ResolvedConfig, private readonly fs: HostFileSystem, private readonly subprocess: HostSubprocess) {\n this.snapshots = new DocumentSnapshotStore((workspaceRoot, filePath, maxBytes, signal) => readSource(this.fs, workspaceRoot, filePath, maxBytes, signal), config.limits.maxDocumentBytes)\n this.codeIntelligenceRuntime = createCodeIntelligenceToolServiceV1({\n snapshots: this.snapshots,\n semanticQuery: (scope, snapshot, request, signal) => this.semanticFromSnapshot(scope, snapshot, request, signal),\n })\n this.codeIntelligence = new CodeIntelligenceProtocolService({\n backend: this.codeIntelligenceRuntime,\n fs: this.fs,\n subprocess: this.subprocess,\n capabilities: signal => this.codeCapabilities(signal),\n })\n this.pool = new ServerPool(async (rawId, key, signal) => {\n const id = rawId as ServerId, source = this.workspaces.get(key)!\n const spec = await resolveLaunch(id, config, source.workspace)\n let executable: string\n try { executable = await subprocess.resolveExecutable(spec.command, spec.env, signal) }\n catch { throwIfAborted(signal); throw new WebstackLspError('LSP_UNAVAILABLE', `${id} executable is unavailable; run dsh-lsp-webstack --json`) }\n const session = new ServerSession({\n spawn: () => subprocess.spawn({ argv: [executable, ...spec.args], cwd: source.workspace, env: spec.env, stdio: { stdin: 'pipe', stdout: 'pipe', stderr: { maxBytes: config.limits.maxStderrBytes } }, graceMs: config.timeouts.killGraceMs }),\n initialize: { processId: null, rootUri: source.workspaceUri, workspaceFolders: [{ uri: source.workspaceUri, name: 'workspace' }], capabilities: clientCapabilities, initializationOptions: initializationOptions(id, config) },\n configuration: serverConfiguration(id, config), maxMessageBytes: config.limits.maxMessageBytes,\n shutdown: { shutdownMs: config.timeouts.shutdownMs, killGraceMs: config.timeouts.killGraceMs },\n })\n const slot = `${id}\\u0000${key}`\n if (this.starts.has(slot)) this.restarts.set(id, (this.restarts.get(id) ?? 0) + 1)\n this.starts.set(slot, (this.starts.get(slot) ?? 0) + 1)\n for (const [old] of this.live) if (old.state === 'STOPPED' || old.state === 'FAILED') this.live.delete(old)\n this.live.set(session, id)\n return session\n })\n }\n\n async navigation(request: LspProviderQuery, signal?: AbortSignal): Promise<LspQueryResult> {\n const deadline = this.signal(request.operation === 'hover' ? this.config.timeouts.primaryHoverMs : this.config.timeouts.navigationMs, signal)\n const [source, route] = await this.prepare(request, deadline)\n return this.navigationFromSource(request, source, route, deadline, signal)\n }\n\n private async navigationFromSource(request: LspProviderQuery, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<LspQueryResult> {\n this.validatePosition(source.text, request.position)\n const result = await this.document(route.primary.server, source, route.primary.languageId, deadline, async (session, connection) => {\n if (!supportsOperation(session.capabilities, request.operation)) throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', `${route.primary.server} does not support ${request.operation}`)\n return connection.request(methods[request.operation], { textDocument: { uri: source.uri }, position: request.position, ...(request.operation === 'findReferences' ? { context: { includeDeclaration: true } } : {}) }, deadline)\n })\n if (request.operation !== 'hover') return { kind: 'locations', locations: normalizeLocations(result), resolvedWorkspaceUri: source.workspaceUri }\n const primary = normalizeHover(result)\n if (primary === undefined) throw new WebstackLspError('LSP_MALFORMED_RESPONSE', 'invalid hover result')\n let auxiliary = null\n if (this.useTailwind(route, source, request.position)) {\n const auxSignal = this.signal(this.config.timeouts.auxiliaryHoverMs, signal)\n try {\n const value = await this.document('tailwind', source, route.auxiliary!.languageId, auxSignal, (_session, connection) => connection.request('textDocument/hover', { textDocument: { uri: source.uri }, position: request.position }, auxSignal))\n auxiliary = normalizeHover(value) ?? null\n } catch { throwIfAborted(signal); throwIfAborted(this.lifetime.signal) }\n }\n const hover = mergeHover(primary && { ...primary, server: route.primary.server }, auxiliary && { ...auxiliary, server: 'tailwind' })\n return { kind: 'hover', hover: hover ? { contents: hover.contents, ...(hover.range ? { range: hover.range } : {}) } : null }\n }\n\n async completion(request: CompletionRequest, signal?: AbortSignal): Promise<CompletionResult> {\n const deadline = this.signal(this.config.timeouts.completionMs, signal)\n const [source, route] = await this.prepare(request, deadline)\n return this.completionFromSource(request, source, route, deadline, signal)\n }\n\n private async completionFromSource(request: CompletionRequest, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<CompletionResult> {\n this.validatePosition(source.text, request.position)\n const query = (id: ServerId, language: string) => this.document(id, source, language, deadline, (session, connection) => {\n if (!session.capabilities.completionProvider) throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', `${id} does not support completion`)\n return connection.request('textDocument/completion', { textDocument: { uri: source.uri }, position: request.position, context: { triggerKind: request.triggerKind ?? 1, ...(request.triggerCharacter ? { triggerCharacter: request.triggerCharacter } : {}) } }, deadline)\n }).then(value => {\n const prefix = source.text.split(/\\r?\\n/)[request.position.line]!.slice(0, request.position.character).match(/[\\w$:@/!\\[\\]-]+$/)?.[0]?.toLowerCase() ?? ''\n // Servers such as Tailwind return the whole catalog; the client must rank the typed prefix before applying a result cap.\n return normalizeCompletion(value, id).sort((a, b) => Number((b.filterText ?? b.label).toLowerCase().startsWith(prefix)) - Number((a.filterText ?? a.label).toLowerCase().startsWith(prefix)))\n })\n const primary = await query(route.primary.server, route.primary.languageId)\n let auxiliary: typeof primary = []\n if (this.useTailwind(route, source, request.position)) {\n try { auxiliary = await query('tailwind', route.auxiliary!.languageId) } catch { throwIfAborted(signal); throwIfAborted(this.lifetime.signal) }\n }\n return mergeCompletions([primary, auxiliary], { maxCompletions: Number.MAX_SAFE_INTEGER, maxResultChars: Number.MAX_SAFE_INTEGER })\n }\n\n async diagnostics(request: DiagnosticsRequest, signal?: AbortSignal): Promise<DiagnosticsResult> {\n const deadline = this.signal(this.config.timeouts.diagnosticsMs, signal)\n if (!classifyFile(request.filePath, this.config.routing.bladeSuffixes)) {\n // Validate workspace containment, existence and read limits even for unsupported files.\n await this.snapshots.readFresh(providerScope(request.workspaceRoot), request.filePath, deadline)\n return { diagnostics: [], skipped: { reason: 'unsupported_file_type', filePath: request.filePath } }\n }\n const [source, route] = await this.prepare(request, deadline)\n return this.diagnosticsFromSource(request, source, route, deadline, signal)\n }\n\n private async diagnosticsFromSource(request: DiagnosticsRequest, source: HostSource, route: Route, deadline: AbortSignal, signal?: AbortSignal): Promise<DiagnosticsResult> {\n const selected = [route.primary, ...(route.auxiliary && this.config.tailwind.enabled ? [route.auxiliary] : [])].filter(item => this.config.servers[item.server].enabled && (!request.servers || request.servers.includes(item.server)))\n if (!selected.length) throw new WebstackLspError('LSP_UNAVAILABLE', 'no selected diagnostic server supports this file')\n const omittedServers: string[] = []\n const groups = await Promise.all(selected.map(async item => {\n try {\n const value = await this.document(item.server, source, item.languageId, deadline, async (session, connection, opened) => {\n if (session.capabilities.diagnosticProvider) {\n await opened()\n const report = await connection.request('textDocument/diagnostic', { textDocument: { uri: source.uri } }, deadline) as { items?: unknown }\n return report?.items ?? []\n }\n if (item.server === 'typescript' && supportsTypeScriptDiagnostics(session.capabilities)) {\n await opened()\n return requestTypeScriptDiagnostics(connection, source.uri, deadline)\n }\n // Subscribe before didOpen; do not confuse a missing publication with a clean file.\n let remove = () => {}\n const published = new Promise<unknown>(resolve => {\n remove = connection.onNotification(message => {\n const p = message.params as { uri?: string; diagnostics?: unknown; version?: number } | undefined\n if (message.method === 'textDocument/publishDiagnostics' && p?.uri === source.uri && (p.version === undefined || p.version === 1)) resolve(p.diagnostics)\n })\n })\n try { await opened(); return await withAbort(published, deadline) } finally { remove() }\n }, true)\n return normalizeDiagnostics(value, item.server, source.uri).filter(d => !request.severity || request.severity === 'all' || d.severity === (request.severity === 'error' ? 1 : 2))\n } catch (error) {\n throwIfAborted(signal); throwIfAborted(this.lifetime.signal)\n if (item.server === route.primary.server || this.config.missingServerPolicy === 'error') throw error\n omittedServers.push(item.server)\n return []\n }\n }))\n return { ...mergeDiagnostics(groups, { maxDiagnostics: Number.MAX_SAFE_INTEGER, maxResultChars: Number.MAX_SAFE_INTEGER }), ...(omittedServers.length ? { omittedServers: omittedServers.sort() } : {}) }\n }\n\n private async semanticFromSnapshot(scope: SnapshotScope, snapshot: SnapshotRecord, request: SemanticQuery, signal: AbortSignal): Promise<NavigationResult | DiagnosticsResult | CompletionResult> {\n const source = snapshot.source\n this.rememberWorkspace(source)\n const file = classifyFile(snapshot.descriptor.filePath, this.config.routing.bladeSuffixes)\n if (!file) {\n if (request.operation === 'diagnostics') return { diagnostics: [], skipped: { reason: 'unsupported_file_type', filePath: snapshot.descriptor.filePath } }\n throw new WebstackLspError('LSP_UNAVAILABLE', 'unsupported file extension')\n }\n const route = routeFor(file)\n let result: NavigationResult | DiagnosticsResult | CompletionResult\n if (request.operation === 'diagnostics') {\n const deadline = this.signal(this.config.timeouts.diagnosticsMs, signal)\n result = await this.diagnosticsFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, ...(request.severity ? { severity: request.severity } : {}), ...(request.servers ? { servers: request.servers } : {}) }, source, route, deadline, signal)\n } else if (request.operation === 'completion') {\n const deadline = this.signal(this.config.timeouts.completionMs, signal)\n result = await this.completionFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, position: request.position! }, source, route, deadline, signal)\n } else {\n const operation = ({ definition: 'goToDefinition', references: 'findReferences', implementation: 'goToImplementation', hover: 'hover' } as const)[request.operation]\n const position = request.position!\n const deadline = this.signal(request.operation === 'hover' ? this.config.timeouts.primaryHoverMs : this.config.timeouts.navigationMs, signal)\n result = await this.navigationFromSource({ workspaceRoot: scope.workspaceRoot, filePath: snapshot.descriptor.filePath, languageId: route.primary.languageId, operation, position }, source, route, deadline, signal)\n }\n if (!('skipped' in result && result.skipped)) {\n const operations = this.semanticOperations.get(route.primary.languageId) ?? new Set<CodeSemanticKind>()\n operations.add(request.operation)\n this.semanticOperations.set(route.primary.languageId, operations)\n }\n return result\n }\n\n async status(signal?: AbortSignal): Promise<WebstackLspStatus> {\n return { providerId: this.config.providerId, supportedFileSuffixes: supportedFileSuffixes(this.config.routing.bladeSuffixes), servers: await Promise.all(SERVER_IDS.map(async id => {\n const config = this.config.servers[id]\n let available = false\n try {\n const launch = await resolveLaunch(id, this.config, '.')\n await this.subprocess.resolveExecutable(launch.command, launch.env, this.signal(5000, signal))\n available = true\n } catch {}\n return { id, enabled: config.enabled && (id !== 'tailwind' || this.config.tailwind.enabled), available, source: config.mode, liveWorkspaces: [...this.live].filter(([s, server]) => server === id && s.isUsable()).length, restarts: this.restarts.get(id) ?? 0 }\n })) }\n }\n\n private async codeCapabilities(signal: AbortSignal): Promise<CodeCapabilitiesV1> {\n signal.throwIfAborted()\n const [provider, lsp] = await Promise.all([Promise.resolve(this.codeIntelligenceRuntime.capabilities()), this.status(signal)])\n const server = lsp.servers.find(item => item.id === 'typescript')\n const languageCapabilities = provider.parsers.map(parser => {\n const semanticIds = parser.language === 'javascript' ? ['javascript', 'javascriptreact'] : parser.language === 'tsx' ? ['typescriptreact'] : ['typescript']\n const semantic = [...new Set(semanticIds.flatMap(id => [...(this.semanticOperations.get(id) ?? [])]))]\n const semanticReady = semantic.length > 0 && Boolean(server?.enabled && server.available)\n const reason = !parser.available ? 'grammar_unavailable' : !server?.enabled || !server.available ? 'server_unavailable' : !semanticReady ? 'not_yet_verified' : undefined\n return { language: parser.language, structure: parser.available, semantic, semanticReady, ...(reason ? { reason } : {}) }\n })\n signal.throwIfAborted()\n return {\n version: 1,\n capabilities: ['snapshots', 'structure', 'semantic'],\n languages: provider.parsers.filter(parser => parser.available).map(parser => parser.language),\n queryIds: ['declarations', 'calls', 'imports'],\n semanticReady: languageCapabilities.some(language => language.semanticReady),\n sourceKinds: ['disk'],\n languageCapabilities,\n limits: {\n documentBytes: provider.limits.maxDocumentBytes,\n captureItems: provider.limits.maxCaptures,\n outlineItems: provider.limits.maxOutline,\n spanChars: provider.limits.maxSpanChars,\n responseBytes: provider.limits.maxResponseBytes,\n files: 100, inputBytes: 16_777_216, outputBytes: 65_536, calls: 100, batchMs: 30_000, structureMs: 2_000, semanticMs: 10_000,\n },\n }\n }\n\n async dispose(): Promise<void> {\n this.lifetime.abort()\n try { await this.codeIntelligence.dispose?.() }\n finally {\n try { await this.pool.disposeAll() }\n finally { await this.codeIntelligenceRuntime.dispose?.(); this.workspaces.clear(); this.live.clear() }\n }\n }\n\n private signal(ms: number, signal?: AbortSignal): AbortSignal { return AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(ms), ...(signal ? [signal] : [])]) }\n private async prepare(request: { workspaceRoot: string; filePath: string }, signal: AbortSignal): Promise<[HostSource, Route]> {\n throwIfAborted(signal)\n const file = classifyFile(request.filePath, this.config.routing.bladeSuffixes)\n if (!file) throw new WebstackLspError('LSP_UNAVAILABLE', 'unsupported file extension')\n const source = await this.snapshots.readFresh(providerScope(request.workspaceRoot), request.filePath, signal).catch(error => { throwIfAborted(signal); throw error })\n this.rememberWorkspace(source)\n return [source, routeFor(file)]\n }\n private rememberWorkspace(source: HostSource): void { this.workspaces.set(source.key, { ...source, text: '' }) }\n private validatePosition(text: string, position: LspPosition): void {\n const line = text.split(/\\r?\\n/)[position.line]\n if (!Number.isSafeInteger(position.line) || !Number.isSafeInteger(position.character) || position.line < 0 || position.character < 0 || line === undefined || position.character > line.length) throw new RangeError('position is outside document (zero-based UTF-16 required)')\n }\n private useTailwind(route: Route, source: HostSource, position: LspPosition): boolean {\n return !!route.auxiliary && this.config.tailwind.enabled && this.config.servers.tailwind.enabled && (route.primary.languageId === 'blade' || this.config.routing.tailwindLanguages.includes(route.primary.languageId) || route.primary.languageId === 'css') && (this.config.tailwind.queryStrategy === 'always' || hasTailwindCandidate(source.text, position.line, this.config.tailwind.classRegex, position.character, this.config.tailwind.classAttributes))\n }\n private async document<T>(id: ServerId, source: HostSource, language: string, signal: AbortSignal, task: (session: ServerSession, connection: JsonRpcConnection, open: () => Promise<void>) => Promise<T>, manualOpen = false): Promise<T> {\n if (!this.config.servers[id].enabled) throw new WebstackLspError('LSP_UNAVAILABLE', `${id} is disabled`)\n return this.pool.runWithRetry(id, source.key, session => session.run(async connection => {\n let opened = false\n const open = async () => { opened = true; await connection.notify('textDocument/didOpen', { textDocument: { uri: source.uri, languageId: language, version: 1, text: source.text } }) }\n try { if (!manualOpen) await open(); return await task(session, connection, open) }\n finally { if (opened && connection.isOpen) await connection.notify('textDocument/didClose', { textDocument: { uri: source.uri } }).catch(() => {}) }\n }, signal), signal, manualOpen ? session => {\n // Push notifications can omit document versions. A delayed didClose clear\n // from a previous operation is indistinguishable from a fresh clean result.\n // Use a fresh process for push diagnostics; pull and tsserver diagnostic\n // responses have request IDs and can safely reuse the session.\n return !!session.capabilities.diagnosticProvider || (id === 'typescript' && supportsTypeScriptDiagnostics(session.capabilities))\n } : undefined)\n }\n}\n\nfunction providerScope(workspaceRoot: string): SnapshotScope {\n return { ownerId: 'lsp-provider', sessionId: 'lsp-provider', workspaceRoot }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { LspProviderId } from '@deepseek-ai/dsh-lsp'\nimport type { LspProvider, LspProviderQuery, LspQueryResult } from '@deepseek-ai/dsh-lsp'\nimport type { Config as PluginConfig, ResolvedConfig } from './config.js'\nimport { resolveConfig } from './config.js'\nimport type { WebstackLspService } from './service.js'\nimport type { CodeIntelligenceServiceV1 } from './code-intelligence-contracts.js'\nimport type { CodeIntelligenceToolServiceV1 } from './structure/types.js'\nimport { createWebstackLspService } from './service.js'\nimport { WebstackLspRuntime } from './runtime/webstack-runtime.js'\nimport type {} from '@deepseek-ai/dsh-fs'\nimport type {} from '@deepseek-ai/dsh-subprocess'\n\nexport type { LspProvider, LspProviderQuery, LspQueryResult }\nexport type Config = PluginConfig\nexport const name = 'lsp-webstack-provider'\nexport const inject = ['fs', 'lsp', 'subprocess']\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context { webstackLsp: WebstackLspService; codeIntelligence: CodeIntelligenceServiceV1; codeIntelligenceRuntime: CodeIntelligenceToolServiceV1 }\n}\n\nexport const OUTER_EXTENSION_MAP = {\n '.php': 'php', '.ts': 'typescript', '.tsx': 'typescriptreact', '.mts': 'typescript', '.cts': 'typescript',\n '.js': 'javascript', '.jsx': 'javascriptreact', '.mjs': 'javascript', '.cjs': 'javascript',\n '.svelte': 'svelte', '.html': 'html', '.htm': 'html', '.css': 'css', '.pcss': 'css',\n} as const\n\nexport interface CompositeRuntime {\n navigation(request: LspProviderQuery, signal?: AbortSignal): Promise<LspQueryResult>\n dispose?(): Promise<void>\n}\n\nexport function createCompositeProvider(runtime: CompositeRuntime, config: Pick<ResolvedConfig, 'providerId'> = { providerId: 'webstack' }): LspProvider {\n return { id: LspProviderId(config.providerId), extensionToLanguage: { ...OUTER_EXTENSION_MAP }, query: (request, signal) => runtime.navigation(request, signal) }\n}\n\nexport async function apply(ctx: Context, config: unknown = {}): Promise<void> {\n const resolved = resolveConfig(config)\n const runtime = new WebstackLspRuntime(resolved, ctx.fs, ctx.subprocess)\n await ctx.effect(async function* () {\n yield () => runtime.dispose()\n if (resolved.missingServerPolicy === 'error') {\n const missing = (await runtime.status()).servers.filter(server => server.enabled && !server.available)\n if (missing.length) throw new Error(`unavailable language servers: ${missing.map(server => server.id).join(', ')}`)\n }\n yield ctx.lsp.registerProvider(createCompositeProvider(runtime, resolved))\n yield ctx.provide('webstackLsp', createWebstackLspService(runtime))\n yield ctx.provide('codeIntelligence', runtime.codeIntelligence)\n yield ctx.provide('codeIntelligenceRuntime', runtime.codeIntelligenceRuntime)\n }, 'webstack LSP provider')\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
2
|
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
3
|
+
import type { WorkingDirectoryService } from '@deepseek-ai/dsh-working-directory';
|
|
3
4
|
import type { WebstackLspService } from './service.js';
|
|
4
5
|
import type { CodeIntelligenceToolServiceV1 } from './structure/types.js';
|
|
5
6
|
export declare const name = "lsp_extra";
|
|
@@ -10,5 +11,5 @@ export interface Config {
|
|
|
10
11
|
maxResultChars?: number;
|
|
11
12
|
timeoutMs?: number;
|
|
12
13
|
}
|
|
13
|
-
export declare function createExtraTool(service: WebstackLspService, codeIntelligence?: CodeIntelligenceToolServiceV1, config?: Config): ToolDefinition;
|
|
14
|
+
export declare function createExtraTool(service: WebstackLspService, codeIntelligence?: CodeIntelligenceToolServiceV1, config?: Config, workingDirectory?: Pick<WorkingDirectoryService, 'ensure'>): ToolDefinition;
|
|
14
15
|
export declare function apply(ctx: Context, config?: Config): void;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { JsonRpcConnection } from '../runtime/connection.js';
|
|
2
|
+
export declare function supportsTypeScriptDiagnostics(capabilities: Record<string, unknown>): boolean;
|
|
3
|
+
export declare function requestTypeScriptDiagnostics(connection: JsonRpcConnection, uri: string, signal: AbortSignal): Promise<unknown[]>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askdkc/dsh-lsp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Composite read-only LSP provider for DeepSeek Harness web stacks",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/provider.js",
|
|
@@ -63,46 +63,50 @@
|
|
|
63
63
|
"prepublishOnly": "pnpm install --frozen-lockfile --ignore-scripts --prod=false --optional=true && npm run check"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@deepseek-ai/dsh-lsp": "0.2.
|
|
67
|
-
"@deepseek-ai/dsh-tool-lsp": "0.2.
|
|
66
|
+
"@deepseek-ai/dsh-lsp": "0.2.2-rc.1",
|
|
67
|
+
"@deepseek-ai/dsh-tool-lsp": "0.2.2-rc.1",
|
|
68
68
|
"@tailwindcss/language-server": "0.16.0",
|
|
69
69
|
"svelte": "5.55.7",
|
|
70
70
|
"svelte-language-server": "0.17.15",
|
|
71
71
|
"typescript": "5.7.3",
|
|
72
|
-
"typescript-language-server": "4.
|
|
72
|
+
"typescript-language-server": "4.4.1",
|
|
73
73
|
"vscode-langservers-extracted": "4.10.0",
|
|
74
74
|
"web-tree-sitter": "0.27.1"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
|
-
"@deepseek-ai/cordis": "~4.0
|
|
77
|
+
"@deepseek-ai/cordis": "~4.1.0",
|
|
78
78
|
"@deepseek-ai/dsh-fs": "*",
|
|
79
79
|
"@deepseek-ai/dsh-subprocess": "*",
|
|
80
80
|
"@deepseek-ai/dsh-system-prompt": "*",
|
|
81
81
|
"@deepseek-ai/dsh-tools": "*",
|
|
82
|
-
"@deepseek-ai/
|
|
82
|
+
"@deepseek-ai/dsh-working-directory": "*",
|
|
83
|
+
"@deepseek-ai/schemastery": "~3.19.0"
|
|
83
84
|
},
|
|
84
85
|
"devDependencies": {
|
|
85
|
-
"@deepseek-ai/cordis": "~4.0
|
|
86
|
-
"@deepseek-ai/dsh-agent": "0.2.
|
|
87
|
-
"@deepseek-ai/dsh-brand": "0.2.
|
|
88
|
-
"@deepseek-ai/dsh-fs": "0.2.
|
|
89
|
-
"@deepseek-ai/dsh-fs-local": "0.2.
|
|
90
|
-
"@deepseek-ai/dsh-http-proxy": "0.2.
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-sandbox": "0.2.
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
96
|
-
"@deepseek-ai/dsh-
|
|
97
|
-
"@deepseek-ai/dsh-session": "0.2.
|
|
98
|
-
"@deepseek-ai/dsh-
|
|
99
|
-
"@deepseek-ai/dsh-subprocess": "0.2.
|
|
100
|
-
"@deepseek-ai/dsh-
|
|
101
|
-
"@deepseek-ai/dsh-
|
|
102
|
-
"@deepseek-ai/dsh-
|
|
103
|
-
"@deepseek-ai/dsh-tools": "0.2.
|
|
104
|
-
"@deepseek-ai/dsh-
|
|
105
|
-
"@deepseek-ai/
|
|
86
|
+
"@deepseek-ai/cordis": "~4.1.0",
|
|
87
|
+
"@deepseek-ai/dsh-agent": "0.2.2-rc.1",
|
|
88
|
+
"@deepseek-ai/dsh-brand": "0.2.2-rc.1",
|
|
89
|
+
"@deepseek-ai/dsh-fs": "0.2.2-rc.1",
|
|
90
|
+
"@deepseek-ai/dsh-fs-local": "0.2.2-rc.1",
|
|
91
|
+
"@deepseek-ai/dsh-http-proxy": "0.2.2-rc.1",
|
|
92
|
+
"@deepseek-ai/dsh-llm": "0.2.2-rc.1",
|
|
93
|
+
"@deepseek-ai/dsh-ptc-runtime": "0.2.2-rc.1",
|
|
94
|
+
"@deepseek-ai/dsh-sandbox": "0.2.2-rc.1",
|
|
95
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.2-rc.1",
|
|
96
|
+
"@deepseek-ai/dsh-scope": "0.2.2-rc.1",
|
|
97
|
+
"@deepseek-ai/dsh-session": "0.2.2-rc.1",
|
|
98
|
+
"@deepseek-ai/dsh-session-projection": "0.2.2-rc.1",
|
|
99
|
+
"@deepseek-ai/dsh-subprocess": "0.2.2-rc.1",
|
|
100
|
+
"@deepseek-ai/dsh-subprocess-local": "0.2.2-rc.1",
|
|
101
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.2-rc.1",
|
|
102
|
+
"@deepseek-ai/dsh-timeout": "0.2.2-rc.1",
|
|
103
|
+
"@deepseek-ai/dsh-tool-executor-native": "0.2.2-rc.1",
|
|
104
|
+
"@deepseek-ai/dsh-tools": "0.2.2-rc.1",
|
|
105
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.2-rc.1",
|
|
106
|
+
"@deepseek-ai/dsh-user-approval": "0.2.2-rc.1",
|
|
107
|
+
"@deepseek-ai/dsh-working-directory": "0.2.2-rc.1",
|
|
108
|
+
"@deepseek-ai/dsh-workspace": "0.2.2-rc.1",
|
|
109
|
+
"@deepseek-ai/schemastery": "~3.19.0",
|
|
106
110
|
"@types/node": "22.10.5",
|
|
107
111
|
"tailwindcss-v3": "npm:tailwindcss@3.4.17",
|
|
108
112
|
"tailwindcss-v4": "npm:tailwindcss@4.1.13",
|
|
@@ -131,7 +135,7 @@
|
|
|
131
135
|
"vitest": "4.1.12"
|
|
132
136
|
},
|
|
133
137
|
"engines": {
|
|
134
|
-
"node": "
|
|
138
|
+
"node": ">=24.9.0"
|
|
135
139
|
},
|
|
136
140
|
"publishConfig": {
|
|
137
141
|
"access": "public"
|
|
@@ -143,7 +147,9 @@
|
|
|
143
147
|
"svelte-language-server>svelte": "5.55.7",
|
|
144
148
|
"vite": "6.4.5",
|
|
145
149
|
"source-map-js": "1.2.2",
|
|
146
|
-
"postcss-selector-parser": "7.1.6"
|
|
150
|
+
"postcss-selector-parser": "7.1.6",
|
|
151
|
+
"undici@8.11.2": "8.12.3",
|
|
152
|
+
"zod@>=4.0.0 <4.6.6": "4.6.7"
|
|
147
153
|
}
|
|
148
154
|
},
|
|
149
155
|
"license": "MIT",
|
|
@@ -158,7 +164,9 @@
|
|
|
158
164
|
"svelte-language-server": {
|
|
159
165
|
"svelte": "5.55.7"
|
|
160
166
|
},
|
|
161
|
-
"vite": "6.4.5"
|
|
167
|
+
"vite": "6.4.5",
|
|
168
|
+
"undici@8.11.2": "8.12.3",
|
|
169
|
+
"zod@>=4.0.0 <4.6.6": "4.6.7"
|
|
162
170
|
},
|
|
163
171
|
"peerDependenciesMeta": {
|
|
164
172
|
"@deepseek-ai/cordis": {
|
|
@@ -178,6 +186,9 @@
|
|
|
178
186
|
},
|
|
179
187
|
"@deepseek-ai/dsh-system-prompt": {
|
|
180
188
|
"optional": true
|
|
189
|
+
},
|
|
190
|
+
"@deepseek-ai/dsh-working-directory": {
|
|
191
|
+
"optional": true
|
|
181
192
|
}
|
|
182
193
|
}
|
|
183
194
|
}
|