@askdkc/dsh-lsp-server 0.1.11 → 0.1.13
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/README.md +37 -0
- package/docs/usage.md +2 -0
- package/lib/code-intelligence-DvhxPnpu.js +890 -0
- package/lib/code-intelligence-DvhxPnpu.js.map +1 -0
- package/lib/code-intelligence-contracts-CWXTofdI.js +8 -0
- package/lib/code-intelligence-contracts-CWXTofdI.js.map +1 -0
- package/lib/code-intelligence-contracts.js +3 -0
- package/lib/code-intelligence.js +5 -0
- package/lib/errors-DtyWAUi0.js.map +1 -1
- package/lib/extra-tool.js +136 -8
- package/lib/extra-tool.js.map +1 -1
- package/lib/launch-ByUvgkVv.js.map +1 -1
- package/lib/provider.js +653 -40
- package/lib/provider.js.map +1 -1
- package/lib/structure/grammars/manifest.json +40 -0
- package/lib/structure/grammars/tree-sitter-javascript.wasm +0 -0
- package/lib/structure/grammars/tree-sitter-tsx.wasm +0 -0
- package/lib/structure/grammars/tree-sitter-typescript.wasm +0 -0
- package/lib/structure/parser-worker.mjs +200 -0
- package/lib/types/code-intelligence-contracts.d.ts +113 -0
- package/lib/types/code-intelligence.d.ts +5 -0
- package/lib/types/errors.d.ts +1 -1
- package/lib/types/extra-tool.d.ts +2 -1
- package/lib/types/provider.d.ts +4 -0
- package/lib/types/routing/classifier.d.ts +2 -0
- package/lib/types/runtime/webstack-runtime.d.ts +13 -1
- package/lib/types/service.d.ts +23 -0
- package/lib/types/structure/code-intelligence.d.ts +23 -0
- package/lib/types/structure/coordinates.d.ts +14 -0
- package/lib/types/structure/engine.d.ts +49 -0
- package/lib/types/structure/protocol.d.ts +19 -0
- package/lib/types/structure/queries.d.ts +4 -0
- package/lib/types/structure/snapshots.d.ts +37 -0
- package/lib/types/structure/types.d.ts +147 -0
- package/lib/types/structure/worker-pool.d.ts +66 -0
- package/package.json +17 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intelligence-DvhxPnpu.js","names":["EXTENSION_LANGUAGE: Record<string, StructureLanguage>","readSource: SnapshotReader","maxDocumentBytes: number","descriptor: SnapshotDescriptor","record: SnapshotRecord","text: string","task: PendingTask","slot: WorkerSlot","declarations: StructureNode[]","declarations","captures: StructureCapture[]","value: SemanticResult","record: Awaited<ReturnType<DocumentSnapshotStore['current']>>"],"sources":["../src/structure/snapshots.ts","../src/structure/coordinates.ts","../src/structure/queries.ts","../src/structure/worker-pool.ts","../src/structure/engine.ts","../src/structure/code-intelligence.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { isAbsolute } from 'node:path'\nimport { WebstackLspError } from '../errors.js'\nimport type { HostSource } from '../host/dsh.js'\nimport type { SnapshotDescriptor, SnapshotScope, StructureLanguage } from './types.js'\n\nexport const SNAPSHOT_TTL_MS = 5 * 60_000\nexport const SNAPSHOT_MAX_DOCUMENTS = 32\nexport const SNAPSHOT_MAX_BYTES = 32 * 1024 * 1024\nexport const STRUCTURE_MAX_DOCUMENT_BYTES = 2 * 1024 * 1024\n\nexport interface SnapshotRecord {\n readonly descriptor: SnapshotDescriptor\n readonly scopeKey: string\n readonly source: HostSource\n readonly previousSnapshotHandle?: string\n readonly openedAt: number\n lastUsedAt: number\n}\n\ninterface VersionRecord { hash: string; version: number; scopeKey: string }\n\nexport type SnapshotReader = (workspaceRoot: string, filePath: string, maxBytes: number, signal?: AbortSignal) => Promise<HostSource>\n\nconst EXTENSION_LANGUAGE: Record<string, StructureLanguage> = {\n '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', '.cjs': 'javascript',\n '.ts': 'typescript', '.mts': 'typescript', '.cts': 'typescript',\n '.tsx': 'tsx',\n}\n\nexport class DocumentSnapshotStore {\n private readonly records = new Map<string, SnapshotRecord>()\n private readonly versions = new Map<string, VersionRecord>()\n\n constructor(private readonly readSource: SnapshotReader, private readonly maxDocumentBytes: number) {}\n\n async open(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n const normalizedPath = normalizeRelativePath(filePath)\n signal?.throwIfAborted()\n const first = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n const second = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n if (hashText(first.text) !== hashText(second.text) || first.uri !== second.uri || first.key !== second.key)\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'document changed while opening the snapshot')\n\n const ownerKey = scopeKey(scope)\n const hash = hashText(second.text)\n const fileKey = JSON.stringify([ownerKey, second.key, second.uri])\n const version = this.rememberVersion(fileKey, scope, hash)\n const sourceBytes = Buffer.byteLength(second.text, 'utf8')\n this.evictExpired()\n if (this.records.size >= SNAPSHOT_MAX_DOCUMENTS || this.totalBytes() + sourceBytes > SNAPSHOT_MAX_BYTES)\n throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'snapshot capacity is full; release an existing snapshot and retry')\n\n const descriptor: SnapshotDescriptor = {\n handle: randomUUID(), version, filePath: normalizedPath,\n language: languageForPath(normalizedPath), sourceKind: 'disk', contentHash: hash, sourceBytes,\n }\n const previous = [...this.records.values()]\n .filter(item => item.scopeKey === ownerKey && item.source.key === second.key && item.source.uri === second.uri)\n .sort((a, b) => b.openedAt - a.openedAt)[0]\n const record: SnapshotRecord = {\n descriptor, scopeKey: ownerKey, source: second, openedAt: Date.now(), lastUsedAt: Date.now(),\n ...(previous ? { previousSnapshotHandle: previous.descriptor.handle } : {}),\n }\n this.records.set(descriptor.handle, record)\n return record\n }\n\n async current(scope: SnapshotScope, handle: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n signal?.throwIfAborted()\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) throw staleSnapshot()\n if (Date.now() - record.openedAt > SNAPSHOT_TTL_MS) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n const current = await this.readSource(scope.workspaceRoot, record.descriptor.filePath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n if (current.uri !== record.source.uri || current.key !== record.source.key || hashText(current.text) !== record.descriptor.contentHash) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n record.lastUsedAt = Date.now()\n return record\n }\n\n async readFresh(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<HostSource> {\n validateScope(scope)\n signal?.throwIfAborted()\n const source = await this.readSource(scope.workspaceRoot, filePath, this.maxDocumentBytes, signal)\n signal?.throwIfAborted()\n const fileKey = JSON.stringify([scopeKey(scope), source.key, source.uri])\n this.rememberVersion(fileKey, scope, hashText(source.text))\n return source\n }\n\n release(scope: SnapshotScope, handle: string): boolean {\n validateScope(scope)\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) return false\n return this.records.delete(handle)\n }\n\n releaseOwner(scope: SnapshotScope): number {\n validateScope(scope)\n const owner = scopeKey(scope)\n let released = 0\n for (const [handle, record] of this.records) {\n if (record.scopeKey === owner) { this.records.delete(handle); released++ }\n }\n for (const [key, version] of this.versions) if (version.scopeKey === owner) this.versions.delete(key)\n return released\n }\n\n clear(): void { this.records.clear(); this.versions.clear() }\n get size(): number { return this.records.size }\n get documentByteLimit(): number { return this.maxDocumentBytes }\n\n private totalBytes(): number {\n let bytes = 0\n for (const record of this.records.values()) bytes += record.descriptor.sourceBytes\n return bytes\n }\n\n private rememberVersion(fileKey: string, scope: SnapshotScope, hash: string): number {\n const owner = scopeKey(scope), previous = this.versions.get(fileKey)\n const version = previous ? (previous.hash === hash ? previous.version : previous.version + 1) : 1\n this.versions.delete(fileKey)\n this.versions.set(fileKey, { hash, version, scopeKey: owner })\n while (this.versions.size > 4096) this.versions.delete(this.versions.keys().next().value!)\n return version\n }\n\n private evictExpired(): void {\n const now = Date.now()\n for (const [handle, record] of this.records) if (now - record.openedAt > SNAPSHOT_TTL_MS) this.records.delete(handle)\n }\n}\n\nexport function languageForPath(filePath: string): StructureLanguage | null {\n const suffix = filePath.slice(filePath.lastIndexOf('.')).toLowerCase()\n return EXTENSION_LANGUAGE[suffix] ?? null\n}\n\nexport function validateScope(scope: SnapshotScope): void {\n if (!scope || typeof scope !== 'object' || !scope.ownerId?.trim() || !scope.sessionId?.trim() || !scope.workspaceRoot?.trim() || !isAbsolute(scope.workspaceRoot) || /[\\u0000-\\u001f\\u007f]/u.test(`${scope.ownerId}${scope.sessionId}${scope.workspaceRoot}`))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'trusted owner, session and absolute workspace root are required')\n}\n\nexport function normalizeRelativePath(filePath: string): string {\n if (typeof filePath !== 'string' || !filePath.trim() || filePath.length > 4096 || /[\\u0000-\\u001f\\u007f]/u.test(filePath) || isAbsolute(filePath))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path must be a relative workspace path')\n const segments = filePath.replaceAll('\\\\', '/').split('/')\n if (segments.some(segment => segment === '..' || segment === '')) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path contains an invalid segment')\n return segments.filter(segment => segment !== '.').join('/')\n}\n\nexport function scopeIdentity(scope: SnapshotScope): string { return JSON.stringify([scope.ownerId, scope.sessionId, scope.workspaceRoot]) }\nfunction scopeKey(scope: SnapshotScope): string { return scopeIdentity(scope) }\nfunction hashText(text: string): string { return createHash('sha256').update(text, 'utf8').digest('hex') }\nfunction staleSnapshot(): WebstackLspError { return new WebstackLspError('LSP_STALE_SNAPSHOT', 'snapshot is stale, expired or belongs to another owner') }\n","import type { LspPosition, LspRange } from '../service.js'\n\ninterface Line { start: number; end: number }\n\n/** web-tree-sitter 0.27.1 exposes JS-string indices as UTF-16 code-unit offsets. */\nexport class Utf16Coordinates {\n private readonly lines: Line[]\n\n constructor(private readonly text: string) {\n this.lines = []\n let start = 0\n for (let index = 0; index < text.length;) {\n const char = text[index]!\n if (char !== '\\r' && char !== '\\n') { index++; continue }\n this.lines.push({ start, end: index })\n if (char === '\\r' && text[index + 1] === '\\n') index++\n index++\n start = index\n }\n this.lines.push({ start, end: text.length })\n }\n\n positionToIndex(position: LspPosition): number {\n if (!isPosition(position)) throw new RangeError('position must use non-negative zero-based UTF-16 coordinates')\n const line = this.lines[position.line]\n if (!line || position.character > line.end - line.start) throw new RangeError('position is outside document')\n const index = line.start + position.character\n if (isBetweenSurrogatePair(this.text, index)) throw new RangeError('position splits a UTF-16 surrogate pair')\n return index\n }\n\n indexToPosition(index: number): LspPosition {\n if (!Number.isSafeInteger(index) || index < 0 || index > this.text.length) throw new RangeError('Tree-sitter index is outside document')\n let low = 0, high = this.lines.length\n while (low < high) {\n const middle = (low + high) >>> 1\n if (this.lines[middle]!.start <= index) low = middle + 1\n else high = middle\n }\n const lineNumber = Math.max(0, low - 1)\n const line = this.lines[lineNumber]!\n return { line: lineNumber, character: Math.min(index, line.end) - line.start }\n }\n\n rangeToIndices(range: LspRange): { startIndex: number; endIndex: number } {\n const startIndex = this.positionToIndex(range.start)\n const endIndex = this.positionToIndex(range.end)\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { startIndex, endIndex }\n }\n\n indicesToRange(startIndex: number, endIndex: number): LspRange {\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { start: this.indexToPosition(startIndex), end: this.indexToPosition(endIndex) }\n }\n}\n\nfunction isPosition(value: unknown): value is LspPosition {\n if (typeof value !== 'object' || value === null) return false\n const position = value as { line?: unknown; character?: unknown }\n return Number.isSafeInteger(position.line) && Number.isSafeInteger(position.character) && (position.line as number) >= 0 && (position.character as number) >= 0\n}\n\nfunction isBetweenSurrogatePair(text: string, index: number): boolean {\n if (index <= 0 || index >= text.length) return false\n const previous = text.charCodeAt(index - 1), next = text.charCodeAt(index)\n return previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff\n}\n","import type { StructureLanguage } from './types.js'\n\nconst declarations = {\n javascript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n typescript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n tsx: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n} satisfies Record<StructureLanguage, string[]>\n\nconst imports = {\n javascript: ['(import_statement) @import', '(export_statement) @export'],\n typescript: ['(import_statement) @import', '(export_statement) @export'],\n tsx: ['(import_statement) @import', '(export_statement) @export'],\n} satisfies Record<StructureLanguage, string[]>\n\nconst calls = {\n javascript: ['(call_expression function: (_) @call) @callsite'],\n typescript: ['(call_expression function: (_) @call) @callsite'],\n tsx: ['(call_expression function: (_) @call) @callsite'],\n} satisfies Record<StructureLanguage, string[]>\n\nexport type RegisteredQueryId = 'declarations' | 'calls' | 'imports'\n\nexport function getRegisteredQuery(language: StructureLanguage, queryId: string): string | undefined {\n const patterns = queryId === 'declarations' ? declarations[language] : queryId === 'calls' ? calls[language] : queryId === 'imports' ? imports[language] : undefined\n return patterns?.join('\\n')\n}\n\nexport function isRegisteredQueryId(value: string): value is RegisteredQueryId {\n return value === 'declarations' || value === 'calls' || value === 'imports'\n}\n","import { randomUUID } from 'node:crypto'\nimport { Worker } from 'node:worker_threads'\nimport { WebstackLspError } from '../errors.js'\nimport type { StructureLanguage } from './types.js'\n\nexport interface StructureWorkerRequest {\n operation: 'matches' | 'enclosing' | 'inspect'\n language: StructureLanguage\n text: string\n querySource: string\n limit: number\n snapshotHandle?: string\n previousSnapshotHandle?: string\n startIndex?: number\n endIndex?: number\n index?: number\n kinds?: string[]\n}\n\nexport interface WorkerNodeSummary {\n kind: string\n startIndex: number\n endIndex: number\n startPosition: { row: number; column: number }\n endPosition: { row: number; column: number }\n nameStartIndex?: number\n nameEndIndex?: number\n childCount: number\n}\n\nexport interface WorkerErrorSummary { hasError: boolean; errorNodes: number; missingNodes: number; truncated: boolean }\nexport interface WorkerMatch { captures: Array<{ name: string } & WorkerNodeSummary> }\nexport interface StructureWorkerResult {\n status: 'ok' | 'partial'\n abiVersion?: number\n reusedTree?: boolean\n incremental?: boolean\n matches?: WorkerMatch[]\n nodes?: WorkerNodeSummary[]\n truncated?: boolean\n errors: WorkerErrorSummary\n}\n\ninterface WorkerReply { id: string; ok: boolean; value?: StructureWorkerResult; error?: string }\ninterface PendingTask {\n id: string\n request: StructureWorkerRequest\n signal?: AbortSignal\n resolve(value: StructureWorkerResult): void\n reject(error: unknown): void\n timer?: ReturnType<typeof setTimeout>\n removeAbort?: () => void\n}\ninterface WorkerSlot { worker: Worker; current: PendingTask | undefined; completed: number; failed: boolean }\n\nconst MAX_WORKERS = 2\nconst MAX_QUEUE = 16\nconst WORKER_TASK_LIMIT = 100\nconst PARSE_TIMEOUT_MS = 2_000\n\n/** CPU-bound parsing runs off the event loop; cancellation terminates the active worker. */\nexport class StructureWorkerPool {\n private readonly slots = new Set<WorkerSlot>()\n private readonly queue: PendingTask[] = []\n private disposed = false\n\n execute(request: StructureWorkerRequest, signal?: AbortSignal): Promise<StructureWorkerResult> {\n if (this.disposed) return Promise.reject(new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n if (signal?.aborted) return Promise.reject(abortError())\n if (this.queue.length >= MAX_QUEUE) return Promise.reject(new WebstackLspError('LSP_STRUCTURE_BUSY', 'structure worker queue is full'))\n return new Promise((resolve, reject) => {\n const task: PendingTask = { id: randomUUID(), request, ...(signal ? { signal } : {}), resolve, reject }\n if (signal) {\n const abort = () => {\n const index = this.queue.indexOf(task)\n if (index >= 0) { this.queue.splice(index, 1); this.finishTask(task, abortError()) }\n else {\n const slot = [...this.slots].find(candidate => candidate.current === task)\n if (slot) void this.retire(slot, abortError())\n }\n }\n signal.addEventListener('abort', abort, { once: true })\n task.removeAbort = () => signal.removeEventListener('abort', abort)\n }\n this.queue.push(task)\n this.pump()\n })\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n for (const task of this.queue.splice(0)) this.finishTask(task, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n await Promise.all([...this.slots].map(slot => this.retire(slot, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))))\n }\n\n releaseSnapshot(snapshotHandle: string): void {\n for (const slot of this.slots) {\n if (!slot.failed) {\n try { slot.worker.postMessage({ releaseSnapshotHandle: snapshotHandle }) }\n catch { void this.retire(slot, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker could not release a cached snapshot')) }\n }\n }\n }\n\n get queued(): number { return this.queue.length }\n get active(): number { return [...this.slots].filter(slot => slot.current !== undefined).length }\n\n private pump(): void {\n if (this.disposed) return\n while (this.queue.length) {\n let slot = [...this.slots].find(candidate => !candidate.current && !candidate.failed)\n if (!slot && this.slots.size < MAX_WORKERS) slot = this.createWorker()\n if (!slot) return\n const task = this.queue.shift()!\n if (task.signal?.aborted) { this.finishTask(task, abortError()); continue }\n slot.current = task\n task.timer = setTimeout(() => { void this.retire(slot!, new WebstackLspError('LSP_STRUCTURE_TIMEOUT', 'structure parsing exceeded its time limit')) }, PARSE_TIMEOUT_MS)\n try { slot.worker.postMessage({ id: task.id, ...task.request }) }\n catch (error) { void this.retire(slot, error) }\n }\n }\n\n private createWorker(): WorkerSlot {\n const worker = new Worker(new URL('./parser-worker.mjs', import.meta.url))\n const slot: WorkerSlot = { worker, current: undefined, completed: 0, failed: false }\n this.slots.add(slot)\n worker.on('message', (reply: WorkerReply) => {\n if (!slot.current || reply.id !== slot.current.id) { void this.retire(slot, new WebstackLspError('LSP_MALFORMED_RESPONSE', 'structure worker returned an unexpected task identity')); return }\n const task = slot.current\n slot.current = undefined\n slot.completed++\n if (!reply.ok || !reply.value) this.finishTask(task, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', reply.error ?? 'structure parsing failed'))\n else this.finishTask(task, undefined, reply.value)\n if (slot.completed >= WORKER_TASK_LIMIT) void this.retire(slot)\n this.pump()\n })\n worker.on('error', error => { void this.retire(slot, error) })\n worker.on('exit', code => {\n if (this.slots.has(slot) && !slot.failed) void this.retire(slot, code === 0 ? undefined : new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', `structure worker exited (${code})`))\n })\n return slot\n }\n\n private async retire(slot: WorkerSlot, error?: unknown): Promise<void> {\n if (slot.failed) return\n slot.failed = true\n this.slots.delete(slot)\n const task = slot.current\n slot.current = undefined\n if (task) this.finishTask(task, error ?? new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker was restarted'))\n await slot.worker.terminate().catch(() => 0)\n this.pump()\n }\n\n private finishTask(task: PendingTask, error?: unknown, value?: StructureWorkerResult): void {\n if (task.timer) clearTimeout(task.timer)\n task.removeAbort?.()\n if (error !== undefined) task.reject(error)\n else task.resolve(value!)\n }\n}\n\nfunction abortError(): DOMException { return new DOMException('The operation was aborted', 'AbortError') }\n","import { randomUUID } from 'node:crypto'\nimport { WebstackLspError } from '../errors.js'\nimport { Utf16Coordinates } from './coordinates.js'\nimport { getRegisteredQuery, isRegisteredQueryId } from './queries.js'\nimport { scopeIdentity, type SnapshotRecord } from './snapshots.js'\nimport { StructureWorkerPool } from './worker-pool.js'\nimport type { SnapshotScope, StructureCapture, StructureEnclosingResult, StructureErrorSummary, StructureLanguage, StructureNode, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\n\nexport const MAX_CAPTURES = 200\nexport const MAX_OUTLINE = 100\nexport const MAX_SPAN_CHARS = 8_000\nexport const MAX_STRUCTURE_RESPONSE_BYTES = 32 * 1024\nconst MAX_NODE_HANDLES = 10_000\n\ninterface NodeHandleRecord {\n scopeKey: string\n snapshotHandle: string\n startIndex: number\n endIndex: number\n kind: string\n range: StructureNode['range']\n}\n\nexport class StructureEngine {\n private readonly nodeHandles = new Map<string, NodeHandleRecord>()\n private readonly snapshotOwners = new Map<string, string>()\n private readonly parserFailures = new Map<StructureLanguage, string>()\n constructor(private readonly workers = new StructureWorkerPool()) {}\n\n async inspect(record: SnapshotRecord, signal?: AbortSignal): Promise<{ available: boolean; parseErrors: boolean; reason?: string }> {\n this.snapshotOwners.set(record.descriptor.handle, record.scopeKey)\n const language = record.descriptor.language\n if (!language) return { available: false, parseErrors: false, reason: 'grammar_missing' }\n try {\n const result = await this.runWorker(language, { operation: 'inspect', language, text: record.source.text, querySource: '', limit: 1, snapshotHandle: record.descriptor.handle, ...(record.previousSnapshotHandle ? { previousSnapshotHandle: record.previousSnapshotHandle } : {}) }, signal)\n this.parserFailures.delete(language)\n return { available: true, parseErrors: result.errors.hasError }\n } catch (error) {\n const reason = error instanceof Error ? error.message.slice(0, 128) : 'parser_unavailable'\n return { available: false, parseErrors: false, reason }\n }\n }\n\n async outline(record: SnapshotRecord, scope: SnapshotScope, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureOutlineResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, declarations: [], truncated: false, processed: 0, errors: { hasError: false, errorNodes: 0, missingNodes: 0, truncated: false } }\n const limit = positiveLimit(options.limit, MAX_OUTLINE, 'outline limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, 'declarations', limit, range, signal)\n const declarations: StructureNode[] = []\n for (const match of result.matches ?? []) {\n const declaration = match.captures.find(capture => capture.name === 'declaration')\n const nameCapture = match.captures.find(capture => capture.name === 'name')\n if (!declaration) continue\n const node = this.node(record, scope, declaration.kind, declaration.startIndex, declaration.endIndex, nameCapture ? record.source.text.slice(nameCapture.startIndex, nameCapture.endIndex).slice(0, 256) : undefined, declaration.childCount, coordinates)\n declarations.push(node)\n }\n return this.outlineResult(record, declarations, result)\n }\n\n async enclosing(record: SnapshotRecord, scope: SnapshotScope, position: { line: number; character: number }, kinds?: string[], signal?: AbortSignal): Promise<StructureEnclosingResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, ancestors: [] }\n const coordinates = new Utf16Coordinates(record.source.text)\n const index = coordinates.positionToIndex(position)\n if (kinds && (!Array.isArray(kinds) || kinds.length > 32 || kinds.some(kind => typeof kind !== 'string' || kind.length > 128 || !/^[a-z][a-z0-9_]*$/u.test(kind))))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'kinds must be a list of at most 32 node type names')\n const result = await this.runWorker(language, { operation: 'enclosing', language, text: record.source.text, querySource: '', limit: 16, snapshotHandle: record.descriptor.handle, index, ...(kinds ? { kinds: [...kinds] } : {}) }, signal)\n const nodes = result.nodes ?? []\n const summaries = nodes.map(item => this.node(record, scope, item.kind, item.startIndex, item.endIndex, undefined, item.childCount, coordinates))\n const [node, ...ancestors] = summaries\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, ...(node ? { node } : {}), ancestors, errors: publicErrors(result.errors) }\n }\n\n async query(record: SnapshotRecord, scope: SnapshotScope, queryId: string, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureQueryResult> {\n const language = record.descriptor.language\n if (!language) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'no bundled Tree-sitter grammar is available for this document')\n if (!isRegisteredQueryId(queryId)) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'queryId is not in the registered query allowlist')\n const limit = positiveLimit(options.limit, MAX_CAPTURES, 'capture limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, queryId, limit, range, signal)\n const captures: StructureCapture[] = []\n captureLoop: for (const match of result.matches ?? []) for (const capture of match.captures) {\n const node = this.node(record, scope, capture.kind, capture.startIndex, capture.endIndex, undefined, capture.childCount, coordinates)\n captures.push({ capture: capture.name, kind: capture.kind, range: node.range, nodeHandle: node.handle, ...(capture.name === 'name' ? { name: record.source.text.slice(capture.startIndex, capture.endIndex).slice(0, 256) } : {}) })\n if (captures.length >= limit) break captureLoop\n }\n if (Buffer.byteLength(JSON.stringify(captures), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'query result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, queryId, captures, truncated: Boolean(result.truncated || (result.matches?.length ?? 0) > limit), processed: captures.length, errors: publicErrors(result.errors) }\n }\n\n async span(record: SnapshotRecord, scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS): Promise<StructureSpanResult> {\n const handle = this.nodeHandles.get(nodeHandle)\n if (!handle || handle.snapshotHandle !== record.descriptor.handle || handle.scopeKey !== scopeIdentity(scope))\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n if (!Number.isSafeInteger(maxChars) || maxChars < 1 || maxChars > MAX_SPAN_CHARS)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `maxChars must be between 1 and ${MAX_SPAN_CHARS}`)\n const full = record.source.text.slice(handle.startIndex, handle.endIndex)\n const codePoints = Array.from(full)\n const truncated = codePoints.length > maxChars\n const text = codePoints.slice(0, maxChars).join('')\n if (Buffer.byteLength(text, 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'span result exceeds the response byte limit')\n return { status: truncated ? 'partial' : 'ok', text, truncated, range: handle.range }\n }\n\n releaseSnapshot(handle: string): void {\n for (const [nodeHandle, node] of this.nodeHandles) if (node.snapshotHandle === handle) this.nodeHandles.delete(nodeHandle)\n this.snapshotOwners.delete(handle)\n this.workers.releaseSnapshot(handle)\n }\n\n releaseSnapshotForOwner(scope: SnapshotScope, handle: string): void {\n if (this.snapshotOwners.get(handle) === scopeIdentity(scope)) this.releaseSnapshot(handle)\n }\n\n snapshotForNode(scope: SnapshotScope, nodeHandle: string): string {\n const record = this.nodeHandles.get(nodeHandle)\n if (!record || record.scopeKey !== scopeIdentity(scope)) throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n return record.snapshotHandle\n }\n\n releaseOwner(scope: SnapshotScope): void {\n const owner = scopeIdentity(scope)\n for (const [nodeHandle, node] of this.nodeHandles) if (node.scopeKey === owner) this.nodeHandles.delete(nodeHandle)\n for (const [snapshotHandle, snapshotOwner] of this.snapshotOwners) {\n if (snapshotOwner === owner) this.releaseSnapshot(snapshotHandle)\n }\n }\n\n capabilities(): Array<{ language: StructureLanguage; extensions: string[]; available: boolean; abiVersion: number | null; lastError?: string }> {\n return [\n this.capability('javascript', ['.js', '.jsx', '.mjs', '.cjs'], 15),\n this.capability('typescript', ['.ts', '.mts', '.cts'], 14),\n this.capability('tsx', ['.tsx'], 14),\n ]\n }\n\n async dispose(): Promise<void> { this.nodeHandles.clear(); this.snapshotOwners.clear(); await this.workers.dispose() }\n\n private async runMatches(language: StructureLanguage, record: SnapshotRecord, queryId: string, limit: number, range?: { startIndex: number; endIndex: number }, signal?: AbortSignal) {\n const querySource = getRegisteredQuery(language, queryId)\n if (!querySource) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', `query ${queryId} is not registered for ${language}`)\n return this.runWorker(language, { operation: 'matches', language, text: record.source.text, querySource, limit, snapshotHandle: record.descriptor.handle, ...(range ?? {}) }, signal)\n }\n\n private capability(language: StructureLanguage, extensions: string[], abiVersion: number) {\n const lastError = this.parserFailures.get(language)\n return { language, extensions, available: !lastError, abiVersion, ...(lastError ? { lastError } : {}) }\n }\n\n private async runWorker(language: StructureLanguage, request: Parameters<StructureWorkerPool['execute']>[0], signal?: AbortSignal) {\n try {\n const result = await this.workers.execute(request, signal)\n this.parserFailures.delete(language)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && ['LSP_STRUCTURE_TIMEOUT', 'LSP_STRUCTURE_UNAVAILABLE'].includes(error.code))\n this.parserFailures.set(language, error.message.slice(0, 128))\n throw error\n }\n }\n\n private outlineResult(record: SnapshotRecord, declarations: StructureNode[], result: Awaited<ReturnType<StructureWorkerPool['execute']>>): StructureOutlineResult {\n const truncated = Boolean(result.truncated || declarations.length > MAX_OUTLINE)\n const selected = declarations.slice(0, MAX_OUTLINE)\n const jsonBytes = Buffer.byteLength(JSON.stringify(selected), 'utf8')\n if (jsonBytes > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'outline result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, declarations: selected, truncated, processed: selected.length, errors: publicErrors(result.errors) }\n }\n\n private node(record: SnapshotRecord, scope: SnapshotScope, kind: string, startIndex: number, endIndex: number, name?: string, childCount?: number, coordinates = new Utf16Coordinates(record.source.text)): StructureNode {\n if (this.nodeHandles.size >= MAX_NODE_HANDLES) throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'node handle capacity is full; release a snapshot and retry')\n const handle = randomUUID()\n const range = coordinates.indicesToRange(startIndex, endIndex)\n this.nodeHandles.set(handle, { scopeKey: scopeIdentity(scope), snapshotHandle: record.descriptor.handle, startIndex, endIndex, kind, range })\n return { handle, kind: publicNodeKind(kind), range, ...(name ? { name } : {}), ...(childCount === undefined ? {} : { childCount }) }\n }\n}\n\nfunction positiveLimit(value: number | undefined, maximum: number, label: string): number {\n const limit = value ?? maximum\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > maximum) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `${label} must be between 1 and ${maximum}`)\n return limit\n}\n\nfunction publicErrors(errors: StructureErrorSummary): StructureErrorSummary { return { ...errors } }\n\nfunction publicNodeKind(kind: string): string {\n return ({ function_declaration: 'function', class_declaration: 'class', interface_declaration: 'interface', type_alias_declaration: 'type', enum_declaration: 'enum', method_definition: 'method', variable_declarator: 'variable' } as Record<string, string>)[kind] ?? kind\n}\n","import { WebstackLspError } from '../errors.js'\nimport { DocumentSnapshotStore } from './snapshots.js'\nimport type { SnapshotRecord } from './snapshots.js'\nimport { StructureEngine, MAX_CAPTURES, MAX_OUTLINE, MAX_SPAN_CHARS, MAX_STRUCTURE_RESPONSE_BYTES } from './engine.js'\nimport type { CodeIntelligenceCapabilities, CodeIntelligenceToolServiceV1, SemanticQuery, SemanticResult, SnapshotScope, StructureEnclosingResult, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\nimport type { CompletionResult, DiagnosticsResult, NavigationResult } from '../service.js'\n\nexport interface CodeIntelligenceServiceOptions {\n snapshots: DocumentSnapshotStore\n semanticQuery(scope: SnapshotScope, snapshot: SnapshotRecord, request: SemanticQuery, signal: AbortSignal): Promise<CompletionResult | DiagnosticsResult | NavigationResult>\n}\n\nexport class CodeIntelligenceRuntime implements CodeIntelligenceToolServiceV1 {\n readonly version = 1 as const\n readonly snapshot: CodeIntelligenceToolServiceV1['snapshot']\n readonly structure: CodeIntelligenceToolServiceV1['structure']\n readonly semantic: CodeIntelligenceToolServiceV1['semantic']\n private readonly store: DocumentSnapshotStore\n private readonly engine: StructureEngine\n\n constructor(options: CodeIntelligenceServiceOptions) {\n this.store = options.snapshots\n this.engine = new StructureEngine()\n\n this.snapshot = {\n open: async (scope, filePath, signal) => {\n const record = await this.store.open(scope, filePath, signal)\n try {\n const parser = await this.engine.inspect(record, signal)\n await this.store.current(scope, record.descriptor.handle, signal)\n return { status: 'ok', ...record.descriptor, parserAvailable: parser.available, parseErrors: parser.parseErrors }\n } catch (error) {\n this.store.release(scope, record.descriptor.handle)\n this.engine.releaseSnapshot(record.descriptor.handle)\n throw error\n }\n },\n release: async (scope, handle) => {\n const released = this.store.release(scope, handle)\n if (released) this.engine.releaseSnapshot(handle)\n return { released }\n },\n }\n\n this.structure = {\n outline: (scope, handle, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.outline(record, scope, request, signal)) as Promise<StructureOutlineResult>,\n enclosing: (scope, handle, position, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.enclosing(record, scope, position, request?.kinds, signal)) as Promise<StructureEnclosingResult>,\n query: (scope, handle, queryId, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.query(record, scope, queryId, request, signal)) as Promise<StructureQueryResult>,\n span: (scope, nodeHandle, maxChars, signal) => this.span(scope, nodeHandle, maxChars, signal),\n }\n\n this.semantic = {\n query: async (scope, handle, request, signal) => {\n validateSemanticQuery(request)\n return this.withSnapshot(scope, handle, signal, async record => {\n const raw = await options.semanticQuery(scope, record, request, signal ?? new AbortController().signal)\n await this.store.current(scope, handle, signal)\n const bounded = limitSemanticResult(raw, request.maxResults ?? 200)\n const truncated = 'truncated' in bounded && Boolean(bounded.truncated)\n const status = semanticIsPartial(bounded) || truncated ? 'partial' : 'ok'\n const value: SemanticResult = { status, operation: request.operation, result: bounded, ...(truncated ? { truncated: true, omitted: 'omitted' in bounded && typeof bounded.omitted === 'number' ? bounded.omitted : 0 } : {}) }\n if (Buffer.byteLength(JSON.stringify(value), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'semantic result exceeds the response byte limit')\n return value\n }) as Promise<SemanticResult>\n },\n }\n }\n\n capabilities(): CodeIntelligenceCapabilities {\n const parsers = this.engine.capabilities().map(parser => ({\n ...parser,\n runtimeAbi: { minimum: 13, current: 15 },\n }))\n return {\n version: 1,\n parsers,\n sourceKind: 'disk',\n overlay: 'unavailable',\n limits: {\n maxDocumentBytes: Math.min(this.store.documentByteLimit, 2 * 1024 * 1024),\n maxCaptures: MAX_CAPTURES,\n maxOutline: MAX_OUTLINE,\n maxSpanChars: MAX_SPAN_CHARS,\n maxResponseBytes: MAX_STRUCTURE_RESPONSE_BYTES,\n },\n incrementalParsing: true,\n }\n }\n\n async releaseOwner(scope: SnapshotScope): Promise<number> {\n this.engine.releaseOwner(scope)\n return this.store.releaseOwner(scope)\n }\n\n async dispose(): Promise<void> { this.store.clear(); await this.engine.dispose() }\n\n private async span(scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS, signal?: AbortSignal): Promise<StructureSpanResult> {\n const snapshotHandle = this.engine.snapshotForNode(scope, nodeHandle)\n return this.withSnapshot(scope, snapshotHandle, signal, record => this.engine.span(record, scope, nodeHandle, maxChars)) as Promise<StructureSpanResult>\n }\n\n private async withSnapshot<T>(scope: SnapshotScope, handle: string, signal: AbortSignal | undefined, execute: (record: Awaited<ReturnType<DocumentSnapshotStore['current']>>) => Promise<T>): Promise<T> {\n let record: Awaited<ReturnType<DocumentSnapshotStore['current']>>\n try { record = await this.store.current(scope, handle, signal) }\n catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n try {\n const result = await execute(record)\n await this.store.current(scope, handle, signal)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n }\n\n}\n\nexport function createCodeIntelligenceToolServiceV1(options: CodeIntelligenceServiceOptions): CodeIntelligenceToolServiceV1 {\n return new CodeIntelligenceRuntime(options)\n}\n\nfunction validateSemanticQuery(request: SemanticQuery): void {\n if (!request || !['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(request.operation))\n throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', 'semantic operation is not supported')\n if (request.operation !== 'diagnostics' && !request.position)\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position is required for this operation')\n if (request.position && (!Number.isSafeInteger(request.position.line) || !Number.isSafeInteger(request.position.character) || request.position.line < 0 || request.position.character < 0))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position must be a zero-based UTF-16 position')\n if (request.servers && (!Array.isArray(request.servers) || request.servers.length > 6 || request.servers.some(server => typeof server !== 'string' || server.length > 64)))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic server filter is invalid')\n if (request.maxResults !== undefined && (!Number.isSafeInteger(request.maxResults) || request.maxResults < 1 || request.maxResults > 200))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'maxResults must be between 1 and 200')\n}\n\nfunction semanticIsPartial(result: CompletionResult | DiagnosticsResult | NavigationResult): boolean {\n if ('diagnostics' in result) return Boolean(result.omittedServers?.length || result.truncated)\n if ('items' in result) return Boolean(result.truncated)\n if (result.kind === 'locations') return Boolean(result.truncated)\n return false\n}\n\nfunction limitSemanticResult(result: CompletionResult | DiagnosticsResult | NavigationResult, limit: number): CompletionResult | DiagnosticsResult | NavigationResult {\n if ('items' in result) {\n if (result.items.length <= limit) return result\n return { ...result, items: result.items.slice(0, limit), truncated: { items: result.items.length - limit, characters: 0 } }\n }\n if ('diagnostics' in result) {\n if (result.diagnostics.length <= limit) return result\n return { ...result, diagnostics: result.diagnostics.slice(0, limit), truncated: { diagnostics: result.diagnostics.length - limit, characters: 0 } }\n }\n if (result.kind === 'locations' && result.locations.length > limit)\n return { ...result, locations: result.locations.slice(0, limit), truncated: true, omitted: result.locations.length - limit }\n return result\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/code-intelligence-contracts.ts
|
|
2
|
+
/** Side-effect-free V1 protocol shared with protected Lisp adapters. */
|
|
3
|
+
const CODE_INTELLIGENCE_SERVICE = "codeIntelligence";
|
|
4
|
+
const CODE_INTELLIGENCE_VERSION = 1;
|
|
5
|
+
|
|
6
|
+
//#endregion
|
|
7
|
+
export { CODE_INTELLIGENCE_SERVICE, CODE_INTELLIGENCE_VERSION };
|
|
8
|
+
//# sourceMappingURL=code-intelligence-contracts-CWXTofdI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intelligence-contracts-CWXTofdI.js","names":[],"sources":["../src/code-intelligence-contracts.ts"],"sourcesContent":["/** Side-effect-free V1 protocol shared with protected Lisp adapters. */\nexport const CODE_INTELLIGENCE_SERVICE = 'codeIntelligence' as const\nexport const CODE_INTELLIGENCE_VERSION = 1 as const\n\nexport type CodeStatus = 'ok' | 'partial' | 'unsupported' | 'unavailable' | 'stale' | 'cancelled' | 'timeout' | 'limit_exceeded'\nexport interface CodePosition { line: number; character: number }\nexport interface CodeRange { start: CodePosition; end: CodePosition }\nexport type CodeSemanticKind = 'definition' | 'references' | 'implementation' | 'hover' | 'diagnostics' | 'completion'\nexport type CodeQueryId = 'declarations' | 'calls' | 'imports'\n\nexport type CodeRequestV1 =\n | { method: 'capabilities' }\n | { method: 'snapshot.open'; path: string }\n | { method: 'snapshot.release'; handle: string }\n | { method: 'structure.outline'; handle: string; range?: CodeRange; limit?: number }\n | { method: 'structure.enclosing'; handle: string; position: CodePosition; kinds?: string[] }\n | { method: 'structure.query'; handle: string; queryId: CodeQueryId; range?: CodeRange; limit?: number }\n | { method: 'structure.span'; nodeHandle: string; maxChars?: number }\n | { method: 'semantic.query'; handle: string; kind: CodeSemanticKind; position?: CodePosition; limit?: number }\n\nexport interface CodeCapabilitiesV1 {\n version: 1\n capabilities: Array<'snapshots' | 'structure' | 'semantic'>\n languages: string[]\n queryIds: CodeQueryId[]\n semanticReady: boolean\n sourceKinds: ['disk']\n languageCapabilities: Array<{\n language: string\n structure: boolean\n semantic: CodeSemanticKind[]\n semanticReady: boolean\n reason?: string\n }>\n limits: {\n documentBytes: number\n captureItems: number\n outlineItems: number\n spanChars: number\n responseBytes: number\n files: number\n inputBytes: number\n outputBytes: number\n calls: number\n batchMs: number\n structureMs: number\n semanticMs: number\n }\n}\n\nexport interface CodeResponseV1 {\n protocol: 'code-intelligence/v1'\n status: CodeStatus\n reason?: string\n sourceKind: 'disk'\n freshness: 'pinned' | 'current' | 'unknown' | 'stale'\n snapshotVersion?: string\n truncated: boolean\n omitted: number\n inputBytes?: number\n data?: unknown\n}\n\n/** Authority comes from the host binding, never from code primitive arguments. */\nexport interface CodeHostBindingV1 {\n owner: { agentId: string; sessionId: string }\n workspaceRoot: string\n scope: object\n context: { get(name: string, strict?: boolean): unknown }\n assertCurrent(): void | Promise<void>\n}\n\nexport interface CodeLeaseV1 {\n request(input: CodeRequestV1, signal: AbortSignal): Promise<CodeResponseV1>\n dispose(): Promise<void>\n}\n\nexport interface CodeIntelligenceServiceV1 {\n version: 1\n capabilities: readonly ('snapshots' | 'structure' | 'semantic')[]\n bind(binding: CodeHostBindingV1, signal: AbortSignal): Promise<CodeLeaseV1>\n dispose?(): Promise<void>\n}\n"],"mappings":";;AACA,MAAa,4BAA4B;AACzC,MAAa,4BAA4B"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import "./errors-DtyWAUi0.js";
|
|
2
|
+
import { createCodeIntelligenceToolServiceV1 } from "./code-intelligence-DvhxPnpu.js";
|
|
3
|
+
import { CODE_INTELLIGENCE_SERVICE, CODE_INTELLIGENCE_VERSION } from "./code-intelligence-contracts-CWXTofdI.js";
|
|
4
|
+
|
|
5
|
+
export { CODE_INTELLIGENCE_SERVICE, CODE_INTELLIGENCE_VERSION, createCodeIntelligenceToolServiceV1 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-DtyWAUi0.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { LspError } from '@deepseek-ai/dsh-lsp'\n\nexport type WebstackErrorCode =\n | 'LSP_UNAVAILABLE'\n | 'LSP_UNSUPPORTED_OPERATION'\n | 'LSP_DISPOSED'\n | 'LSP_MALFORMED_RESPONSE'\n | 'LSP_CONFLICT'\n | 'LSP_WORKSPACE_REQUIRED'\n | 'LSP_WEBSTACK_CONFIG_INVALID'\n\nexport class WebstackLspError extends LspError {\n declare readonly code: WebstackErrorCode\n\n constructor(code: WebstackErrorCode, message: string, options?: ErrorOptions) {\n super(message, code, options)\n this.name = 'WebstackLspError'\n }\n}\n\nexport function configError(message: string): WebstackLspError {\n return new WebstackLspError('LSP_WEBSTACK_CONFIG_INVALID', message)\n}\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"errors-DtyWAUi0.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { LspError } from '@deepseek-ai/dsh-lsp'\n\nexport type WebstackErrorCode =\n | 'LSP_UNAVAILABLE'\n | 'LSP_UNSUPPORTED_OPERATION'\n | 'LSP_DISPOSED'\n | 'LSP_MALFORMED_RESPONSE'\n | 'LSP_CONFLICT'\n | 'LSP_WORKSPACE_REQUIRED'\n | 'LSP_WEBSTACK_CONFIG_INVALID'\n | 'LSP_STALE_SNAPSHOT'\n | 'LSP_SNAPSHOT_LIMIT'\n | 'LSP_STRUCTURE_BUSY'\n | 'LSP_STRUCTURE_TIMEOUT'\n | 'LSP_STRUCTURE_LIMIT'\n | 'LSP_STRUCTURE_UNAVAILABLE'\n | 'LSP_STRUCTURE_UNSUPPORTED'\n | 'LSP_CODE_INTELLIGENCE_UNAVAILABLE'\n\nexport class WebstackLspError extends LspError {\n declare readonly code: WebstackErrorCode\n\n constructor(code: WebstackErrorCode, message: string, options?: ErrorOptions) {\n super(message, code, options)\n this.name = 'WebstackLspError'\n }\n}\n\nexport function configError(message: string): WebstackLspError {\n return new WebstackLspError('LSP_WEBSTACK_CONFIG_INVALID', message)\n}\n"],"mappings":";;;AAmBA,IAAa,mBAAb,cAAsC,SAAS;CAG7C,YAAY,MAAyB,SAAiB,SAAwB;AAC5E,QAAM,SAAS,MAAM,QAAQ;AAC7B,OAAK,OAAO;;;AAIhB,SAAgB,YAAY,SAAmC;AAC7D,QAAO,IAAI,iBAAiB,+BAA+B,QAAQ"}
|
package/lib/extra-tool.js
CHANGED
|
@@ -7,9 +7,10 @@ const name = "lsp_extra";
|
|
|
7
7
|
const inject = [
|
|
8
8
|
"tools",
|
|
9
9
|
"systemPrompt",
|
|
10
|
-
"webstackLsp"
|
|
10
|
+
"webstackLsp",
|
|
11
|
+
"codeIntelligenceRuntime"
|
|
11
12
|
];
|
|
12
|
-
function createExtraTool(service, config = {}) {
|
|
13
|
+
function createExtraTool(service, codeIntelligence, config = {}) {
|
|
13
14
|
const limits = {
|
|
14
15
|
maxDiagnostics: 200,
|
|
15
16
|
maxCompletions: 100,
|
|
@@ -20,20 +21,56 @@ function createExtraTool(service, config = {}) {
|
|
|
20
21
|
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`);
|
|
21
22
|
return defineTool({
|
|
22
23
|
name,
|
|
23
|
-
description: "Read language-server status, diagnostics, or completion candidates. file_path is workspace-relative. Completion line and character are one-based UTF-16. No edits are applied.",
|
|
24
|
+
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.",
|
|
24
25
|
parameters: {
|
|
25
26
|
operation: {
|
|
26
27
|
type: "string",
|
|
27
28
|
enum: [
|
|
28
29
|
"status",
|
|
29
30
|
"diagnostics",
|
|
30
|
-
"completion"
|
|
31
|
+
"completion",
|
|
32
|
+
"snapshot",
|
|
33
|
+
"structure",
|
|
34
|
+
"semantic"
|
|
31
35
|
],
|
|
32
36
|
required: true
|
|
33
37
|
},
|
|
38
|
+
action: {
|
|
39
|
+
type: "string",
|
|
40
|
+
enum: [
|
|
41
|
+
"open",
|
|
42
|
+
"release",
|
|
43
|
+
"capabilities",
|
|
44
|
+
"outline",
|
|
45
|
+
"enclosing",
|
|
46
|
+
"query",
|
|
47
|
+
"span",
|
|
48
|
+
"definition",
|
|
49
|
+
"references",
|
|
50
|
+
"implementation",
|
|
51
|
+
"hover",
|
|
52
|
+
"diagnostics",
|
|
53
|
+
"completion"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
34
56
|
file_path: { type: "string" },
|
|
35
57
|
line: { type: "integer" },
|
|
36
58
|
character: { type: "integer" },
|
|
59
|
+
handle: { type: "string" },
|
|
60
|
+
node_handle: { type: "string" },
|
|
61
|
+
query_id: { type: "string" },
|
|
62
|
+
max_chars: { type: "integer" },
|
|
63
|
+
limit: { type: "integer" },
|
|
64
|
+
position_line: { type: "integer" },
|
|
65
|
+
position_character: { type: "integer" },
|
|
66
|
+
start_line: { type: "integer" },
|
|
67
|
+
start_character: { type: "integer" },
|
|
68
|
+
end_line: { type: "integer" },
|
|
69
|
+
end_character: { type: "integer" },
|
|
70
|
+
kinds: {
|
|
71
|
+
type: "array",
|
|
72
|
+
items: { type: "string" }
|
|
73
|
+
},
|
|
37
74
|
severity: {
|
|
38
75
|
type: "string",
|
|
39
76
|
enum: [
|
|
@@ -62,8 +99,58 @@ function createExtraTool(service, config = {}) {
|
|
|
62
99
|
const signal = AbortSignal.any([exec.signal, AbortSignal.timeout(limits.timeoutMs)]);
|
|
63
100
|
signal.throwIfAborted();
|
|
64
101
|
let result;
|
|
65
|
-
if (args.operation === "status") result =
|
|
66
|
-
|
|
102
|
+
if (args.operation === "status") result = {
|
|
103
|
+
...await service.status(),
|
|
104
|
+
...codeIntelligence ? { codeIntelligence: codeIntelligence.capabilities() } : {}
|
|
105
|
+
};
|
|
106
|
+
else if (args.operation === "snapshot" || args.operation === "structure" || args.operation === "semantic") {
|
|
107
|
+
if (!codeIntelligence) throw new WebstackLspError("LSP_CODE_INTELLIGENCE_UNAVAILABLE", "code-intelligence service is unavailable");
|
|
108
|
+
if (args.operation === "snapshot") if (args.action === "capabilities") result = codeIntelligence.capabilities();
|
|
109
|
+
else if (args.action === "open") {
|
|
110
|
+
const scope = snapshotScope(exec.agent);
|
|
111
|
+
if (typeof args.file_path !== "string") throw new TypeError("file_path is required for snapshot open");
|
|
112
|
+
result = await codeIntelligence.snapshot.open(scope, args.file_path, signal);
|
|
113
|
+
} else if (args.action === "release") {
|
|
114
|
+
const scope = snapshotScope(exec.agent);
|
|
115
|
+
if (typeof args.handle !== "string") throw new TypeError("handle is required for snapshot release");
|
|
116
|
+
result = await codeIntelligence.snapshot.release(scope, args.handle);
|
|
117
|
+
} else throw new TypeError("snapshot action must be open, release, or capabilities");
|
|
118
|
+
else {
|
|
119
|
+
const scope = snapshotScope(exec.agent);
|
|
120
|
+
if (args.operation === "structure") if (args.action === "outline") {
|
|
121
|
+
const range = readRange(args);
|
|
122
|
+
result = await codeIntelligence.structure.outline(scope, requiredString(args.handle, "handle"), {
|
|
123
|
+
...range ? { range } : {},
|
|
124
|
+
...args.limit === void 0 ? {} : { limit: args.limit }
|
|
125
|
+
}, signal);
|
|
126
|
+
} else if (args.action === "enclosing") result = await codeIntelligence.structure.enclosing(scope, requiredString(args.handle, "handle"), zeroBasedPosition(args), { ...args.kinds === void 0 ? {} : { kinds: args.kinds } }, signal);
|
|
127
|
+
else if (args.action === "query") {
|
|
128
|
+
const range = readRange(args);
|
|
129
|
+
result = await codeIntelligence.structure.query(scope, requiredString(args.handle, "handle"), requiredString(args.query_id, "query_id"), {
|
|
130
|
+
...range ? { range } : {},
|
|
131
|
+
...args.limit === void 0 ? {} : { limit: args.limit }
|
|
132
|
+
}, signal);
|
|
133
|
+
} else if (args.action === "span") result = await codeIntelligence.structure.span(scope, requiredString(args.node_handle, "node_handle"), args.max_chars, signal);
|
|
134
|
+
else throw new TypeError("structure action must be outline, enclosing, query, or span");
|
|
135
|
+
else {
|
|
136
|
+
const action = args.action;
|
|
137
|
+
if (![
|
|
138
|
+
"definition",
|
|
139
|
+
"references",
|
|
140
|
+
"implementation",
|
|
141
|
+
"hover",
|
|
142
|
+
"diagnostics",
|
|
143
|
+
"completion"
|
|
144
|
+
].includes(String(action))) throw new TypeError("unsupported semantic action");
|
|
145
|
+
result = await codeIntelligence.semantic.query(scope, requiredString(args.handle, "handle"), {
|
|
146
|
+
operation: action,
|
|
147
|
+
...action === "diagnostics" ? {} : { position: zeroBasedPosition(args) },
|
|
148
|
+
...args.severity ? { severity: args.severity } : {},
|
|
149
|
+
...args.servers ? { servers: args.servers } : {}
|
|
150
|
+
}, signal);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
67
154
|
const workspaceRoot = exec.agent?.session.header.cwd;
|
|
68
155
|
if (!workspaceRoot) throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "lsp_extra requires a session workspace cwd");
|
|
69
156
|
if (!args.file_path) throw new TypeError("file_path is required");
|
|
@@ -99,14 +186,55 @@ function createExtraTool(service, config = {}) {
|
|
|
99
186
|
});
|
|
100
187
|
}
|
|
101
188
|
function apply(ctx, config = {}) {
|
|
102
|
-
const tool = createExtraTool(ctx.webstackLsp, config);
|
|
189
|
+
const tool = createExtraTool(ctx.webstackLsp, ctx.codeIntelligenceRuntime, config);
|
|
103
190
|
ctx.tools.register(tool);
|
|
104
191
|
ctx.systemPrompt.section({
|
|
105
192
|
name: "tool:lsp_extra",
|
|
106
193
|
order: 500,
|
|
107
|
-
text: "Use lsp_extra diagnostics after
|
|
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."
|
|
108
195
|
});
|
|
109
196
|
}
|
|
197
|
+
function snapshotScope(agent) {
|
|
198
|
+
if (typeof agent !== "object" || agent === null) throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "snapshot operations require an active agent session");
|
|
199
|
+
const value = agent;
|
|
200
|
+
if (typeof value.id !== "string" || typeof value.session?.id !== "string" || typeof value.session.header?.cwd !== "string") throw new WebstackLspError("LSP_WORKSPACE_REQUIRED", "snapshot operations require trusted owner, session and workspace identity");
|
|
201
|
+
return {
|
|
202
|
+
ownerId: value.id,
|
|
203
|
+
sessionId: value.session.id,
|
|
204
|
+
workspaceRoot: value.session.header.cwd
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function requiredString(value, name$1) {
|
|
208
|
+
if (typeof value !== "string" || !value.trim()) throw new TypeError(`${name$1} is required`);
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
function zeroBasedPosition(args) {
|
|
212
|
+
if (!Number.isSafeInteger(args.position_line) || !Number.isSafeInteger(args.position_character) || args.position_line < 0 || args.position_character < 0) throw new TypeError("position_line and position_character must be zero-based non-negative UTF-16 offsets");
|
|
213
|
+
return {
|
|
214
|
+
line: args.position_line,
|
|
215
|
+
character: args.position_character
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function readRange(args) {
|
|
219
|
+
const fields = [
|
|
220
|
+
args.start_line,
|
|
221
|
+
args.start_character,
|
|
222
|
+
args.end_line,
|
|
223
|
+
args.end_character
|
|
224
|
+
];
|
|
225
|
+
if (fields.every((value) => value === void 0)) return void 0;
|
|
226
|
+
if (fields.some((value) => !Number.isSafeInteger(value) || value < 0)) throw new TypeError("range requires four zero-based non-negative coordinates");
|
|
227
|
+
return {
|
|
228
|
+
start: {
|
|
229
|
+
line: args.start_line,
|
|
230
|
+
character: args.start_character
|
|
231
|
+
},
|
|
232
|
+
end: {
|
|
233
|
+
line: args.end_line,
|
|
234
|
+
character: args.end_character
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
110
238
|
|
|
111
239
|
//#endregion
|
|
112
240
|
export { apply, createExtraTool, inject, name };
|
package/lib/extra-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extra-tool.js","names":["result: unknown"],"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'\n\nexport const name = 'lsp_extra'\nexport const inject = ['tools', 'systemPrompt', 'webstackLsp']\nexport interface Config { maxDiagnostics?: number; maxCompletions?: number; maxResultChars?: number; timeoutMs?: number }\n\nexport function createExtraTool(service: WebstackLspService, 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. 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'], required: true },\n file_path: { type: 'string' }, line: { type: 'integer' }, character: { type: 'integer' },\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()\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, config)\n ctx.tools.register(tool)\n ctx.systemPrompt.section({ name: 'tool:lsp_extra', order: 500, text: 'Use lsp_extra diagnostics after edits to inspect static errors. Use completion for exact symbol or framework candidates. Completion cursors are one-based UTF-16; output ranges are zero-based. The tool never applies edits.' })\n}\n"],"mappings":";;;;;AAUA,MAAa,OAAO;AACpB,MAAa,SAAS;CAAC;CAAS;CAAgB;CAAc;AAG9D,SAAgB,gBAAgB,SAA6B,SAAiB,EAAE,EAAkB;CAChG,MAAM,SAAS;EAAE,gBAAgB;EAAK,gBAAgB;EAAK,gBAAgB;EAAO,WAAW;EAAO,GAAG;EAAQ;AAC/G,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAAE,KAAI,CAAC,OAAO,cAAc,MAAM,IAAI,QAAQ,KAAK,QAAQ,WAAY,OAAM,IAAI,UAAU,GAAG,IAAI,wDAAwD;AAC3M,QAAO,WAAW;EAChB;EACA,aAAa;EACb,YAAY;GACV,WAAW;IAAE,MAAM;IAAU,MAAM;KAAC;KAAU;KAAe;KAAa;IAAE,UAAU;IAAM;GAC5F,WAAW,EAAE,MAAM,UAAU;GAAE,MAAM,EAAE,MAAM,WAAW;GAAE,WAAW,EAAE,MAAM,WAAW;GACxF,UAAU;IAAE,MAAM;IAAU,MAAM;KAAC;KAAO;KAAS;KAAU;IAAE;GAC/D,SAAS;IAAE,MAAM;IAAS,OAAO,EAAE,MAAM,UAAU;IAAE;GACtD;EACD,QAAQ;GACN,QAAQ,EAAE,MAAM,QAAQ;GACxB,SAAS,OAAO,UAAU;IACxB,MAAM,OAAO,KAAK,UAAU,MAAM;AAClC,WAAO,CAAC;KAAE,MAAM;KAAQ,MAAM,KAAK,UAAU,OAAO,iBAAiB,OAAO,GAAG,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,iBAAiB,GAAG,CAAC,CAAC,eAAe,MAAM,GAAG,OAAO,eAAe;KAAE,CAAC;;GAE1L;EACD,WAAW,OAAO;EAClB,MAAM,QAAQ,MAAM,MAAM;GACxB,MAAM,SAAS,YAAY,IAAI,CAAC,KAAK,QAAQ,YAAY,QAAQ,OAAO,UAAU,CAAC,CAAC;AACpF,UAAO,gBAAgB;GACvB,IAAIA;AACJ,OAAI,KAAK,cAAc,SAAU,UAAS,MAAM,QAAQ,QAAQ;QAC3D;IACH,MAAM,gBAAgB,KAAK,OAAO,QAAQ,OAAO;AACjD,QAAI,CAAC,cAAe,OAAM,IAAI,iBAAiB,0BAA0B,6CAA6C;AACtH,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,UAAU,wBAAwB;AACjE,QAAI,KAAK,cAAc,eAAe;KACpC,MAAM,cAAc,MAAM,QAAQ,YAAY;MAAE;MAAe,UAAU,KAAK;MAAW,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,UAAU,GAAG,EAAE;MAAG,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,GAAG,EAAE;MAAG,EAAE,OAAO;AAC7M,cAAS;MAAE,GAAG;MAAa,GAAG,iBAAiB,CAAC,YAAY,YAAY,EAAE,OAAO;MAAE;WAC9E;AACL,SAAI,CAAC,KAAK,QAAQ,KAAK,OAAO,KAAK,CAAC,KAAK,aAAa,KAAK,YAAY,EAAG,OAAM,IAAI,UAAU,4DAA4D;KAC1J,MAAM,aAAa,MAAM,QAAQ,WAAW;MAAE;MAAe,UAAU,KAAK;MAAW,UAAU;OAAE,MAAM,KAAK,OAAO;OAAG,WAAW,KAAK,YAAY;OAAG;MAAE,EAAE,OAAO;AAClK,cAAS;MAAE,GAAG;MAAY,GAAG,iBAAiB,CAAC,WAAW,MAAM,EAAE,OAAO;MAAE;;;AAI/E,UAAO,KAAK,MAAM,KAAK,UAAU,OAAO,CAAC;;EAE5C,CAAC;;AAGJ,SAAgB,MAAM,KAAc,SAAiB,EAAE,EAAQ;CAC7D,MAAM,OAAO,gBAAgB,IAAI,aAAa,OAAO;AACrD,KAAI,MAAM,SAAS,KAAK;AACxB,KAAI,aAAa,QAAQ;EAAE,MAAM;EAAkB,OAAO;EAAK,MAAM;EAAiO,CAAC"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-ByUvgkVv.js","names":["SERVER_COMMANDS: Record<ServerId, string>","DEFAULT_SERVER_MODES: Record<ServerId, ServerMode>","SERVER_IDS: ServerId[]","DEFAULT_CONFIG: ResolvedConfig","packages: Record<Exclude<ServerId, 'phpantom'>, [string, string]>"],"sources":["../src/config.ts","../src/service.ts","../src/servers/package-bin.ts","../src/servers/launch.ts"],"sourcesContent":["import { configError } from './errors.js'\n\nexport type ServerId = 'phpantom' | 'typescript' | 'svelte' | 'html' | 'css' | 'tailwind'\nexport type ServerMode = 'bundled' | 'path'\n\nexport interface ServerConfig {\n enabled?: boolean\n mode?: ServerMode\n command?: string\n args?: string[]\n env?: Record<string, string>\n initializationOptions?: unknown\n configuration?: unknown\n}\n\nexport interface Config {\n providerId?: string\n missingServerPolicy?: 'warn' | 'error'\n limits?: {\n maxDocumentBytes?: number\n maxMessageBytes?: number\n maxStderrBytes?: number\n }\n timeouts?: {\n navigationMs?: number\n primaryHoverMs?: number\n auxiliaryHoverMs?: number\n diagnosticsMs?: number\n completionMs?: number\n shutdownMs?: number\n killGraceMs?: number\n }\n servers?: Partial<Record<ServerId, ServerConfig>>\n tailwind?: {\n enabled?: boolean\n queryStrategy?: 'candidate' | 'always'\n classAttributes?: string[]\n classRegex?: Array<string | [string, string]>\n includeLanguages?: Record<string, string>\n }\n routing?: {\n bladeSuffixes?: string[]\n tailwindLanguages?: string[]\n }\n}\n\nexport interface ResolvedServerConfig {\n enabled: boolean\n mode: ServerMode\n command: string\n args: string[]\n env: Record<string, string>\n initializationOptions?: unknown\n configuration?: unknown\n}\n\nexport interface ResolvedConfig {\n providerId: string\n missingServerPolicy: 'warn' | 'error'\n limits: {\n maxDocumentBytes: number\n maxMessageBytes: number\n maxStderrBytes: number\n }\n timeouts: {\n navigationMs: number\n primaryHoverMs: number\n auxiliaryHoverMs: number\n diagnosticsMs: number\n completionMs: number\n shutdownMs: number\n killGraceMs: number\n }\n servers: Record<ServerId, ResolvedServerConfig>\n tailwind: {\n enabled: boolean\n queryStrategy: 'candidate' | 'always'\n classAttributes: string[]\n classRegex: Array<string | [string, string]>\n includeLanguages: Record<string, string>\n }\n routing: {\n bladeSuffixes: string[]\n tailwindLanguages: string[]\n }\n}\n\nconst SERVER_COMMANDS: Record<ServerId, string> = {\n phpantom: 'phpantom_lsp',\n typescript: 'typescript-language-server',\n svelte: 'svelteserver',\n html: 'vscode-html-language-server',\n css: 'vscode-css-language-server',\n tailwind: 'tailwindcss-language-server',\n}\n\nconst DEFAULT_SERVER_MODES: Record<ServerId, ServerMode> = {\n phpantom: 'path',\n typescript: 'bundled',\n svelte: 'bundled',\n html: 'bundled',\n css: 'bundled',\n tailwind: 'bundled',\n}\n\nexport const SERVER_IDS: ServerId[] = ['phpantom', 'typescript', 'svelte', 'html', 'css', 'tailwind']\nconst DEFAULT_LIMITS = { maxDocumentBytes: 1_048_576, maxMessageBytes: 8_388_608, maxStderrBytes: 65_536 }\nconst DEFAULT_TIMEOUTS = { navigationMs: 60_000, primaryHoverMs: 30_000, auxiliaryHoverMs: 8_000, diagnosticsMs: 60_000, completionMs: 15_000, shutdownMs: 5_000, killGraceMs: 1_000 }\n\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n providerId: 'webstack',\n missingServerPolicy: 'warn',\n limits: { ...DEFAULT_LIMITS },\n timeouts: { ...DEFAULT_TIMEOUTS },\n servers: Object.fromEntries(SERVER_IDS.map((id) => [id, {\n enabled: true,\n mode: DEFAULT_SERVER_MODES[id],\n command: SERVER_COMMANDS[id],\n args: ['--stdio'],\n env: {},\n }])) as Record<ServerId, ResolvedServerConfig>,\n tailwind: { enabled: true, queryStrategy: 'candidate', classAttributes: ['class', 'className', 'class:list'], classRegex: [], includeLanguages: {} },\n routing: { bladeSuffixes: ['.blade.php'], tailwindLanguages: ['html', 'svelte', 'typescript', 'typescriptreact', 'javascript', 'javascriptreact'] },\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction readPositiveInteger(value: unknown, label: string, fallback: number): number {\n if (value === undefined) return fallback\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) throw configError(`${label} must be a positive integer no greater than 2147483647`)\n return value\n}\n\nfunction readBoolean(value: unknown, label: string, fallback: boolean): boolean {\n if (value === undefined) return fallback\n if (typeof value !== 'boolean') throw configError(`${label} must be a boolean`)\n return value\n}\n\nfunction readString(value: unknown, label: string, fallback: string): string {\n if (value === undefined) return fallback\n if (typeof value !== 'string' || value.trim().length === 0 || value.includes('\\u0000')) throw configError(`${label} must be a non-empty string without NUL`)\n return value\n}\n\nfunction cloneJson(value: unknown, label: string): unknown {\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value\n if (Array.isArray(value)) return value.map((item) => cloneJson(item, label))\n if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneJson(item, label)]))\n throw configError(`${label} must contain JSON-compatible values`)\n}\n\nfunction resolveSuffixes(value: unknown, label: string, fallback: string[]): string[] {\n if (value === undefined) return [...fallback]\n if (!Array.isArray(value) || value.length === 0) throw configError(`${label} must be a non-empty array`)\n const normalized = value.map((suffix, index) => {\n if (typeof suffix !== 'string' || suffix.length === 0 || suffix.includes('/') || suffix.includes('\\\\')) throw configError(`${label}[${index}] is not a valid suffix`)\n return suffix.toLowerCase()\n })\n if (new Set(normalized).size !== normalized.length) throw configError(`${label} contains duplicate suffixes`)\n return normalized\n}\n\nfunction resolveStringArray(value: unknown, label: string, fallback: string[]): string[] {\n if (value === undefined) return [...fallback]\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) throw configError(`${label} must be an array of strings`)\n return [...value]\n}\n\nfunction resolveEnv(value: unknown, label: string): Record<string, string> {\n if (value === undefined) return {}\n if (!isRecord(value) || Object.entries(value).some(([key, item]) => key.length === 0 || typeof item !== 'string')) throw configError(`${label} must be a string map`)\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, item as string]))\n}\n\nfunction resolveServer(id: ServerId, value: unknown): ResolvedServerConfig {\n if (value !== undefined && !isRecord(value)) throw configError(`servers.${id} must be an object`)\n const input = value as Record<string, unknown> | undefined\n const mode = input?.mode === undefined ? DEFAULT_SERVER_MODES[id] : input.mode\n if (mode !== 'bundled' && mode !== 'path') throw configError(`servers.${id}.mode must be bundled or path`)\n if (id === 'phpantom' && mode === 'bundled') throw configError('PHPantom must use path mode')\n const command = input?.command === undefined ? SERVER_COMMANDS[id] : readString(input.command, `servers.${id}.command`, SERVER_COMMANDS[id])\n if (mode === 'path' && input?.command === undefined && id !== 'phpantom') throw configError(`servers.${id}.command is required in path mode`)\n const argsValue = input?.args\n if (argsValue !== undefined && (!Array.isArray(argsValue) || argsValue.some((item) => typeof item !== 'string'))) throw configError(`servers.${id}.args must be an array of strings`)\n return {\n enabled: readBoolean(input?.enabled, `servers.${id}.enabled`, true),\n mode,\n command,\n args: argsValue === undefined ? ['--stdio'] : [...argsValue] as string[],\n env: resolveEnv(input?.env, `servers.${id}.env`),\n ...(input?.initializationOptions === undefined ? {} : { initializationOptions: cloneJson(input.initializationOptions, `servers.${id}.initializationOptions`) }),\n ...(input?.configuration === undefined ? {} : { configuration: cloneJson(input.configuration, `servers.${id}.configuration`) }),\n }\n}\n\nexport function resolveConfig(input: unknown = {}): ResolvedConfig {\n if (!isRecord(input)) throw configError('config must be an object')\n const limits = isRecord(input.limits) ? input.limits : input.limits === undefined ? {} : (() => { throw configError('limits must be an object') })()\n const timeouts = isRecord(input.timeouts) ? input.timeouts : input.timeouts === undefined ? {} : (() => { throw configError('timeouts must be an object') })()\n const tailwind = isRecord(input.tailwind) ? input.tailwind : input.tailwind === undefined ? {} : (() => { throw configError('tailwind must be an object') })()\n const routing = isRecord(input.routing) ? input.routing : input.routing === undefined ? {} : (() => { throw configError('routing must be an object') })()\n const serverInput = isRecord(input.servers) ? input.servers : input.servers === undefined ? {} : (() => { throw configError('servers must be an object') })()\n const providerId = readString(input.providerId, 'providerId', DEFAULT_CONFIG.providerId)\n const missingServerPolicy = input.missingServerPolicy === undefined ? 'warn' : input.missingServerPolicy\n if (missingServerPolicy !== 'warn' && missingServerPolicy !== 'error') throw configError('missingServerPolicy must be warn or error')\n const classRegex = tailwind.classRegex\n if (classRegex !== undefined && (!Array.isArray(classRegex) || classRegex.some((item) => typeof item !== 'string' && (!Array.isArray(item) || item.length !== 2 || item.some((part) => typeof part !== 'string'))))) throw configError('tailwind.classRegex must contain strings or string pairs')\n const queryStrategy = tailwind.queryStrategy === undefined ? 'candidate' : tailwind.queryStrategy\n for (const expression of (classRegex ?? []) as Array<string | [string, string]>) {\n for (const pattern of Array.isArray(expression) ? expression : [expression]) {\n try { new RegExp(pattern) } catch { throw configError('tailwind.classRegex contains an invalid regular expression') }\n }\n }\n if (queryStrategy !== 'candidate' && queryStrategy !== 'always') throw configError('tailwind.queryStrategy must be candidate or always')\n const includeLanguages = resolveEnv(tailwind.includeLanguages, 'tailwind.includeLanguages')\n return {\n providerId,\n missingServerPolicy,\n limits: {\n maxDocumentBytes: readPositiveInteger(limits.maxDocumentBytes, 'limits.maxDocumentBytes', DEFAULT_LIMITS.maxDocumentBytes),\n maxMessageBytes: readPositiveInteger(limits.maxMessageBytes, 'limits.maxMessageBytes', DEFAULT_LIMITS.maxMessageBytes),\n maxStderrBytes: readPositiveInteger(limits.maxStderrBytes, 'limits.maxStderrBytes', DEFAULT_LIMITS.maxStderrBytes),\n },\n timeouts: {\n navigationMs: readPositiveInteger(timeouts.navigationMs, 'timeouts.navigationMs', DEFAULT_TIMEOUTS.navigationMs),\n primaryHoverMs: readPositiveInteger(timeouts.primaryHoverMs, 'timeouts.primaryHoverMs', DEFAULT_TIMEOUTS.primaryHoverMs),\n auxiliaryHoverMs: readPositiveInteger(timeouts.auxiliaryHoverMs, 'timeouts.auxiliaryHoverMs', DEFAULT_TIMEOUTS.auxiliaryHoverMs),\n diagnosticsMs: readPositiveInteger(timeouts.diagnosticsMs, 'timeouts.diagnosticsMs', DEFAULT_TIMEOUTS.diagnosticsMs),\n completionMs: readPositiveInteger(timeouts.completionMs, 'timeouts.completionMs', DEFAULT_TIMEOUTS.completionMs),\n shutdownMs: readPositiveInteger(timeouts.shutdownMs, 'timeouts.shutdownMs', DEFAULT_TIMEOUTS.shutdownMs),\n killGraceMs: readPositiveInteger(timeouts.killGraceMs, 'timeouts.killGraceMs', DEFAULT_TIMEOUTS.killGraceMs),\n },\n servers: Object.fromEntries(SERVER_IDS.map((id) => [id, resolveServer(id, serverInput[id])])) as Record<ServerId, ResolvedServerConfig>,\n tailwind: {\n enabled: readBoolean(tailwind.enabled, 'tailwind.enabled', true),\n queryStrategy,\n classAttributes: resolveStringArray(tailwind.classAttributes, 'tailwind.classAttributes', DEFAULT_CONFIG.tailwind.classAttributes),\n classRegex: classRegex === undefined ? [] : (classRegex.map((item) => Array.isArray(item) ? [...item] as [string, string] : item)),\n includeLanguages,\n },\n routing: {\n bladeSuffixes: resolveSuffixes(routing.bladeSuffixes, 'routing.bladeSuffixes', DEFAULT_CONFIG.routing.bladeSuffixes),\n tailwindLanguages: resolveStringArray(routing.tailwindLanguages, 'routing.tailwindLanguages', DEFAULT_CONFIG.routing.tailwindLanguages),\n },\n }\n}\n\nif (DEFAULT_CONFIG.tailwind.queryStrategy !== 'candidate' && DEFAULT_CONFIG.tailwind.queryStrategy !== 'always') throw new Error('invalid internal default')\n\nexport const ConfigSchema = {\n parse: resolveConfig,\n validate: resolveConfig,\n} as const\n","import { WebstackLspError } from './errors.js'\nimport type { ResolvedConfig } from './config.js'\n\nexport interface LspPosition { line: number; character: number }\nexport interface LspRange { start: LspPosition; end: LspPosition }\n\nexport interface DiagnosticsRequest { workspaceRoot: string; filePath: string; severity?: 'all' | 'error' | 'warning'; servers?: string[] }\nexport interface CompletionRequest { workspaceRoot: string; filePath: string; position: LspPosition; triggerKind?: 1 | 2 | 3; triggerCharacter?: string }\n\nexport interface NormalizedDiagnostic {\n server: string\n uri: string\n range: LspRange\n severity?: 1 | 2 | 3 | 4\n code?: string | number\n source?: string\n message: string\n tags?: number[]\n servers?: string[]\n}\nexport interface NormalizedCompletionItem { server: string; label: string; kind?: number; detail?: string; documentation?: string; sortText?: string; filterText?: string; insertText?: string; insertTextFormat?: number; deprecated?: boolean }\nexport interface DiagnosticsResult { diagnostics: NormalizedDiagnostic[]; omittedServers?: string[]; truncated?: { diagnostics: number; characters: number } }\nexport interface CompletionResult { items: NormalizedCompletionItem[]; truncated?: { items: number; characters: number } }\n\nexport interface WebstackLspStatus {\n providerId: string\n servers: Array<{ id: import('./config.js').ServerId; enabled: boolean; available: boolean; source: 'bundled' | 'path'; command?: string; version?: string; lastError?: string; liveWorkspaces: number; restarts: number }>\n}\n\nexport interface WebstackLspService {\n status(): Promise<WebstackLspStatus>\n diagnostics(request: DiagnosticsRequest, signal?: AbortSignal): Promise<DiagnosticsResult>\n completion(request: CompletionRequest, signal?: AbortSignal): Promise<CompletionResult>\n}\n\nexport interface ExtendedRuntime extends WebstackLspService {}\n\nexport function createWebstackLspService(runtime: ExtendedRuntime, config: Pick<ResolvedConfig, 'limits'> = { limits: { maxDocumentBytes: 1_048_576, maxMessageBytes: 8_388_608, maxStderrBytes: 65_536 } }): WebstackLspService {\n return {\n status: () => runtime.status(),\n diagnostics: (request, signal) => runtime.diagnostics(validateDiagnosticsRequest(request), signal),\n completion: (request, signal) => runtime.completion(validateCompletionRequest(request), signal),\n }\n}\n\nfunction validateDiagnosticsRequest(request: DiagnosticsRequest): DiagnosticsRequest {\n if (!isRequest(request) || typeof request.workspaceRoot !== 'string' || request.workspaceRoot.length === 0 || typeof request.filePath !== 'string' || request.filePath.length === 0) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot and filePath are required')\n return { ...request, ...(request.servers ? { servers: [...request.servers] } : {}) }\n}\n\nfunction validateCompletionRequest(request: CompletionRequest): CompletionRequest {\n if (!isRequest(request) || typeof request.workspaceRoot !== 'string' || request.workspaceRoot.length === 0 || typeof request.filePath !== 'string' || request.filePath.length === 0 || !isPosition(request.position)) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot, filePath and position are required')\n return { ...request, position: { ...request.position } }\n}\n\nfunction isPosition(value: unknown): value is LspPosition { return typeof value === 'object' && value !== null && Number.isInteger((value as { line?: unknown }).line) && Number.isInteger((value as { character?: unknown }).character) && (value as LspPosition).line >= 0 && (value as LspPosition).character >= 0 }\nfunction isRequest(value: unknown): value is Record<string, unknown> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\n\nexport function createUnavailableService(providerId = 'webstack'): WebstackLspService {\n return { status: async () => ({ providerId, servers: [] }), diagnostics: async () => Promise.reject(new WebstackLspError('LSP_UNAVAILABLE', 'webstack runtime is unavailable')), completion: async () => Promise.reject(new WebstackLspError('LSP_UNAVAILABLE', 'webstack runtime is unavailable')) }\n}\n","import { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { readFile } from 'node:fs/promises'\nimport type { LaunchSpec } from './types.js'\n\nconst require = createRequire(import.meta.url)\n\nexport async function resolvePackageBinary(packageName: string, binName: string, cwd: string, args = ['--stdio']): Promise<LaunchSpec> {\n const packageJson = require.resolve(`${packageName}/package.json`)\n const metadata = JSON.parse(await readFile(packageJson, 'utf8')) as { bin?: string | Record<string, string> }\n const bin = typeof metadata.bin === 'string' ? metadata.bin : metadata.bin?.[binName] ?? metadata.bin?.[packageName]\n if (!bin) throw new Error(`binary ${binName} is not declared by ${packageName}`)\n return { command: process.execPath, args: [resolve(dirname(packageJson), bin), ...args], cwd }\n}\n","import { createRequire } from 'node:module'\nimport type { ResolvedConfig, ServerId } from '../config.js'\nimport { resolvePackageBinary } from './package-bin.js'\nimport type { LaunchSpec } from './types.js'\n\nconst packages: Record<Exclude<ServerId, 'phpantom'>, [string, string]> = {\n typescript: ['typescript-language-server', 'typescript-language-server'],\n svelte: ['svelte-language-server', 'svelteserver'],\n html: ['vscode-langservers-extracted', 'vscode-html-language-server'],\n css: ['vscode-langservers-extracted', 'vscode-css-language-server'],\n tailwind: ['@tailwindcss/language-server', 'tailwindcss-language-server'],\n}\n\nexport async function resolveLaunch(id: ServerId, config: ResolvedConfig, workspace: string): Promise<LaunchSpec> {\n const server = config.servers[id]\n if (server.mode === 'path' || id === 'phpantom') return { command: server.command, args: [...server.args], cwd: workspace, env: { ...server.env } }\n const [pkg, bin] = packages[id]\n return { ...await resolvePackageBinary(pkg, bin, workspace, server.args), env: { ...server.env } }\n}\n\nexport function initializationOptions(id: ServerId, config: ResolvedConfig): unknown {\n const configured = config.servers[id].initializationOptions\n if (configured !== undefined) return configured\n if (id === 'typescript' && config.servers[id].mode === 'bundled') {\n return { tsserver: { path: createRequire(import.meta.url).resolve('typescript/lib/tsserver.js') } }\n }\n if (id === 'tailwind') return { userLanguages: config.tailwind.includeLanguages }\n return null\n}\n\nexport function serverConfiguration(id: ServerId, config: ResolvedConfig): unknown {\n if (config.servers[id].configuration !== undefined) return config.servers[id].configuration\n if (id === 'tailwind') return { tailwindCSS: { classAttributes: config.tailwind.classAttributes, includeLanguages: config.tailwind.includeLanguages, experimental: { classRegex: config.tailwind.classRegex } } }\n return {}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"launch-ByUvgkVv.js","names":["SERVER_COMMANDS: Record<ServerId, string>","DEFAULT_SERVER_MODES: Record<ServerId, ServerMode>","SERVER_IDS: ServerId[]","DEFAULT_CONFIG: ResolvedConfig","packages: Record<Exclude<ServerId, 'phpantom'>, [string, string]>"],"sources":["../src/config.ts","../src/service.ts","../src/servers/package-bin.ts","../src/servers/launch.ts"],"sourcesContent":["import { configError } from './errors.js'\n\nexport type ServerId = 'phpantom' | 'typescript' | 'svelte' | 'html' | 'css' | 'tailwind'\nexport type ServerMode = 'bundled' | 'path'\n\nexport interface ServerConfig {\n enabled?: boolean\n mode?: ServerMode\n command?: string\n args?: string[]\n env?: Record<string, string>\n initializationOptions?: unknown\n configuration?: unknown\n}\n\nexport interface Config {\n providerId?: string\n missingServerPolicy?: 'warn' | 'error'\n limits?: {\n maxDocumentBytes?: number\n maxMessageBytes?: number\n maxStderrBytes?: number\n }\n timeouts?: {\n navigationMs?: number\n primaryHoverMs?: number\n auxiliaryHoverMs?: number\n diagnosticsMs?: number\n completionMs?: number\n shutdownMs?: number\n killGraceMs?: number\n }\n servers?: Partial<Record<ServerId, ServerConfig>>\n tailwind?: {\n enabled?: boolean\n queryStrategy?: 'candidate' | 'always'\n classAttributes?: string[]\n classRegex?: Array<string | [string, string]>\n includeLanguages?: Record<string, string>\n }\n routing?: {\n bladeSuffixes?: string[]\n tailwindLanguages?: string[]\n }\n}\n\nexport interface ResolvedServerConfig {\n enabled: boolean\n mode: ServerMode\n command: string\n args: string[]\n env: Record<string, string>\n initializationOptions?: unknown\n configuration?: unknown\n}\n\nexport interface ResolvedConfig {\n providerId: string\n missingServerPolicy: 'warn' | 'error'\n limits: {\n maxDocumentBytes: number\n maxMessageBytes: number\n maxStderrBytes: number\n }\n timeouts: {\n navigationMs: number\n primaryHoverMs: number\n auxiliaryHoverMs: number\n diagnosticsMs: number\n completionMs: number\n shutdownMs: number\n killGraceMs: number\n }\n servers: Record<ServerId, ResolvedServerConfig>\n tailwind: {\n enabled: boolean\n queryStrategy: 'candidate' | 'always'\n classAttributes: string[]\n classRegex: Array<string | [string, string]>\n includeLanguages: Record<string, string>\n }\n routing: {\n bladeSuffixes: string[]\n tailwindLanguages: string[]\n }\n}\n\nconst SERVER_COMMANDS: Record<ServerId, string> = {\n phpantom: 'phpantom_lsp',\n typescript: 'typescript-language-server',\n svelte: 'svelteserver',\n html: 'vscode-html-language-server',\n css: 'vscode-css-language-server',\n tailwind: 'tailwindcss-language-server',\n}\n\nconst DEFAULT_SERVER_MODES: Record<ServerId, ServerMode> = {\n phpantom: 'path',\n typescript: 'bundled',\n svelte: 'bundled',\n html: 'bundled',\n css: 'bundled',\n tailwind: 'bundled',\n}\n\nexport const SERVER_IDS: ServerId[] = ['phpantom', 'typescript', 'svelte', 'html', 'css', 'tailwind']\nconst DEFAULT_LIMITS = { maxDocumentBytes: 1_048_576, maxMessageBytes: 8_388_608, maxStderrBytes: 65_536 }\nconst DEFAULT_TIMEOUTS = { navigationMs: 60_000, primaryHoverMs: 30_000, auxiliaryHoverMs: 8_000, diagnosticsMs: 60_000, completionMs: 15_000, shutdownMs: 5_000, killGraceMs: 1_000 }\n\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n providerId: 'webstack',\n missingServerPolicy: 'warn',\n limits: { ...DEFAULT_LIMITS },\n timeouts: { ...DEFAULT_TIMEOUTS },\n servers: Object.fromEntries(SERVER_IDS.map((id) => [id, {\n enabled: true,\n mode: DEFAULT_SERVER_MODES[id],\n command: SERVER_COMMANDS[id],\n args: ['--stdio'],\n env: {},\n }])) as Record<ServerId, ResolvedServerConfig>,\n tailwind: { enabled: true, queryStrategy: 'candidate', classAttributes: ['class', 'className', 'class:list'], classRegex: [], includeLanguages: {} },\n routing: { bladeSuffixes: ['.blade.php'], tailwindLanguages: ['html', 'svelte', 'typescript', 'typescriptreact', 'javascript', 'javascriptreact'] },\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction readPositiveInteger(value: unknown, label: string, fallback: number): number {\n if (value === undefined) return fallback\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) throw configError(`${label} must be a positive integer no greater than 2147483647`)\n return value\n}\n\nfunction readBoolean(value: unknown, label: string, fallback: boolean): boolean {\n if (value === undefined) return fallback\n if (typeof value !== 'boolean') throw configError(`${label} must be a boolean`)\n return value\n}\n\nfunction readString(value: unknown, label: string, fallback: string): string {\n if (value === undefined) return fallback\n if (typeof value !== 'string' || value.trim().length === 0 || value.includes('\\u0000')) throw configError(`${label} must be a non-empty string without NUL`)\n return value\n}\n\nfunction cloneJson(value: unknown, label: string): unknown {\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value\n if (Array.isArray(value)) return value.map((item) => cloneJson(item, label))\n if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneJson(item, label)]))\n throw configError(`${label} must contain JSON-compatible values`)\n}\n\nfunction resolveSuffixes(value: unknown, label: string, fallback: string[]): string[] {\n if (value === undefined) return [...fallback]\n if (!Array.isArray(value) || value.length === 0) throw configError(`${label} must be a non-empty array`)\n const normalized = value.map((suffix, index) => {\n if (typeof suffix !== 'string' || suffix.length === 0 || suffix.includes('/') || suffix.includes('\\\\')) throw configError(`${label}[${index}] is not a valid suffix`)\n return suffix.toLowerCase()\n })\n if (new Set(normalized).size !== normalized.length) throw configError(`${label} contains duplicate suffixes`)\n return normalized\n}\n\nfunction resolveStringArray(value: unknown, label: string, fallback: string[]): string[] {\n if (value === undefined) return [...fallback]\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) throw configError(`${label} must be an array of strings`)\n return [...value]\n}\n\nfunction resolveEnv(value: unknown, label: string): Record<string, string> {\n if (value === undefined) return {}\n if (!isRecord(value) || Object.entries(value).some(([key, item]) => key.length === 0 || typeof item !== 'string')) throw configError(`${label} must be a string map`)\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, item as string]))\n}\n\nfunction resolveServer(id: ServerId, value: unknown): ResolvedServerConfig {\n if (value !== undefined && !isRecord(value)) throw configError(`servers.${id} must be an object`)\n const input = value as Record<string, unknown> | undefined\n const mode = input?.mode === undefined ? DEFAULT_SERVER_MODES[id] : input.mode\n if (mode !== 'bundled' && mode !== 'path') throw configError(`servers.${id}.mode must be bundled or path`)\n if (id === 'phpantom' && mode === 'bundled') throw configError('PHPantom must use path mode')\n const command = input?.command === undefined ? SERVER_COMMANDS[id] : readString(input.command, `servers.${id}.command`, SERVER_COMMANDS[id])\n if (mode === 'path' && input?.command === undefined && id !== 'phpantom') throw configError(`servers.${id}.command is required in path mode`)\n const argsValue = input?.args\n if (argsValue !== undefined && (!Array.isArray(argsValue) || argsValue.some((item) => typeof item !== 'string'))) throw configError(`servers.${id}.args must be an array of strings`)\n return {\n enabled: readBoolean(input?.enabled, `servers.${id}.enabled`, true),\n mode,\n command,\n args: argsValue === undefined ? ['--stdio'] : [...argsValue] as string[],\n env: resolveEnv(input?.env, `servers.${id}.env`),\n ...(input?.initializationOptions === undefined ? {} : { initializationOptions: cloneJson(input.initializationOptions, `servers.${id}.initializationOptions`) }),\n ...(input?.configuration === undefined ? {} : { configuration: cloneJson(input.configuration, `servers.${id}.configuration`) }),\n }\n}\n\nexport function resolveConfig(input: unknown = {}): ResolvedConfig {\n if (!isRecord(input)) throw configError('config must be an object')\n const limits = isRecord(input.limits) ? input.limits : input.limits === undefined ? {} : (() => { throw configError('limits must be an object') })()\n const timeouts = isRecord(input.timeouts) ? input.timeouts : input.timeouts === undefined ? {} : (() => { throw configError('timeouts must be an object') })()\n const tailwind = isRecord(input.tailwind) ? input.tailwind : input.tailwind === undefined ? {} : (() => { throw configError('tailwind must be an object') })()\n const routing = isRecord(input.routing) ? input.routing : input.routing === undefined ? {} : (() => { throw configError('routing must be an object') })()\n const serverInput = isRecord(input.servers) ? input.servers : input.servers === undefined ? {} : (() => { throw configError('servers must be an object') })()\n const providerId = readString(input.providerId, 'providerId', DEFAULT_CONFIG.providerId)\n const missingServerPolicy = input.missingServerPolicy === undefined ? 'warn' : input.missingServerPolicy\n if (missingServerPolicy !== 'warn' && missingServerPolicy !== 'error') throw configError('missingServerPolicy must be warn or error')\n const classRegex = tailwind.classRegex\n if (classRegex !== undefined && (!Array.isArray(classRegex) || classRegex.some((item) => typeof item !== 'string' && (!Array.isArray(item) || item.length !== 2 || item.some((part) => typeof part !== 'string'))))) throw configError('tailwind.classRegex must contain strings or string pairs')\n const queryStrategy = tailwind.queryStrategy === undefined ? 'candidate' : tailwind.queryStrategy\n for (const expression of (classRegex ?? []) as Array<string | [string, string]>) {\n for (const pattern of Array.isArray(expression) ? expression : [expression]) {\n try { new RegExp(pattern) } catch { throw configError('tailwind.classRegex contains an invalid regular expression') }\n }\n }\n if (queryStrategy !== 'candidate' && queryStrategy !== 'always') throw configError('tailwind.queryStrategy must be candidate or always')\n const includeLanguages = resolveEnv(tailwind.includeLanguages, 'tailwind.includeLanguages')\n return {\n providerId,\n missingServerPolicy,\n limits: {\n maxDocumentBytes: readPositiveInteger(limits.maxDocumentBytes, 'limits.maxDocumentBytes', DEFAULT_LIMITS.maxDocumentBytes),\n maxMessageBytes: readPositiveInteger(limits.maxMessageBytes, 'limits.maxMessageBytes', DEFAULT_LIMITS.maxMessageBytes),\n maxStderrBytes: readPositiveInteger(limits.maxStderrBytes, 'limits.maxStderrBytes', DEFAULT_LIMITS.maxStderrBytes),\n },\n timeouts: {\n navigationMs: readPositiveInteger(timeouts.navigationMs, 'timeouts.navigationMs', DEFAULT_TIMEOUTS.navigationMs),\n primaryHoverMs: readPositiveInteger(timeouts.primaryHoverMs, 'timeouts.primaryHoverMs', DEFAULT_TIMEOUTS.primaryHoverMs),\n auxiliaryHoverMs: readPositiveInteger(timeouts.auxiliaryHoverMs, 'timeouts.auxiliaryHoverMs', DEFAULT_TIMEOUTS.auxiliaryHoverMs),\n diagnosticsMs: readPositiveInteger(timeouts.diagnosticsMs, 'timeouts.diagnosticsMs', DEFAULT_TIMEOUTS.diagnosticsMs),\n completionMs: readPositiveInteger(timeouts.completionMs, 'timeouts.completionMs', DEFAULT_TIMEOUTS.completionMs),\n shutdownMs: readPositiveInteger(timeouts.shutdownMs, 'timeouts.shutdownMs', DEFAULT_TIMEOUTS.shutdownMs),\n killGraceMs: readPositiveInteger(timeouts.killGraceMs, 'timeouts.killGraceMs', DEFAULT_TIMEOUTS.killGraceMs),\n },\n servers: Object.fromEntries(SERVER_IDS.map((id) => [id, resolveServer(id, serverInput[id])])) as Record<ServerId, ResolvedServerConfig>,\n tailwind: {\n enabled: readBoolean(tailwind.enabled, 'tailwind.enabled', true),\n queryStrategy,\n classAttributes: resolveStringArray(tailwind.classAttributes, 'tailwind.classAttributes', DEFAULT_CONFIG.tailwind.classAttributes),\n classRegex: classRegex === undefined ? [] : (classRegex.map((item) => Array.isArray(item) ? [...item] as [string, string] : item)),\n includeLanguages,\n },\n routing: {\n bladeSuffixes: resolveSuffixes(routing.bladeSuffixes, 'routing.bladeSuffixes', DEFAULT_CONFIG.routing.bladeSuffixes),\n tailwindLanguages: resolveStringArray(routing.tailwindLanguages, 'routing.tailwindLanguages', DEFAULT_CONFIG.routing.tailwindLanguages),\n },\n }\n}\n\nif (DEFAULT_CONFIG.tailwind.queryStrategy !== 'candidate' && DEFAULT_CONFIG.tailwind.queryStrategy !== 'always') throw new Error('invalid internal default')\n\nexport const ConfigSchema = {\n parse: resolveConfig,\n validate: resolveConfig,\n} as const\n","import { WebstackLspError } from './errors.js'\nimport type { ResolvedConfig } from './config.js'\n\nexport interface LspPosition { line: number; character: number }\nexport interface LspRange { start: LspPosition; end: LspPosition }\n\nexport interface DiagnosticsRequest { workspaceRoot: string; filePath: string; severity?: 'all' | 'error' | 'warning'; servers?: string[] }\nexport interface CompletionRequest { workspaceRoot: string; filePath: string; position: LspPosition; triggerKind?: 1 | 2 | 3; triggerCharacter?: string }\n\nexport interface NormalizedDiagnostic {\n server: string\n uri: string\n range: LspRange\n severity?: 1 | 2 | 3 | 4\n code?: string | number\n source?: string\n message: string\n tags?: number[]\n servers?: string[]\n}\nexport interface NormalizedCompletionItem { server: string; label: string; kind?: number; detail?: string; documentation?: string; sortText?: string; filterText?: string; insertText?: string; insertTextFormat?: number; deprecated?: boolean }\nexport type NavigationResult =\n | { kind: 'locations'; locations: ReadonlyArray<{ uri: string; range: LspRange }>; resolvedWorkspaceUri: string; truncated?: boolean; omitted?: number }\n | { kind: 'hover'; hover: { contents: string; range?: LspRange } | null }\n/** A skipped diagnostic query is unverified; an empty diagnostics array alone is not evidence of a clean file. */\nexport interface DiagnosticsResult { skipped?: { reason: 'unsupported_file_type'; filePath: string }; diagnostics: NormalizedDiagnostic[]; omittedServers?: string[]; truncated?: { diagnostics: number; characters: number } }\nexport interface CompletionResult { items: NormalizedCompletionItem[]; truncated?: { items: number; characters: number } }\n\nexport interface WebstackLspStatus {\n providerId: string\n /** Routing suffixes; enabled/available servers are reported separately. */\n supportedFileSuffixes?: string[]\n servers: Array<{ id: import('./config.js').ServerId; enabled: boolean; available: boolean; source: 'bundled' | 'path'; command?: string; version?: string; lastError?: string; liveWorkspaces: number; restarts: number }>\n}\n\nexport interface WebstackLspService {\n status(): Promise<WebstackLspStatus>\n diagnostics(request: DiagnosticsRequest, signal?: AbortSignal): Promise<DiagnosticsResult>\n completion(request: CompletionRequest, signal?: AbortSignal): Promise<CompletionResult>\n}\n\nexport interface ExtendedRuntime extends WebstackLspService {}\n\nexport function createWebstackLspService(runtime: ExtendedRuntime, config: Pick<ResolvedConfig, 'limits'> = { limits: { maxDocumentBytes: 1_048_576, maxMessageBytes: 8_388_608, maxStderrBytes: 65_536 } }): WebstackLspService {\n return {\n status: () => runtime.status(),\n diagnostics: (request, signal) => runtime.diagnostics(validateDiagnosticsRequest(request), signal),\n completion: (request, signal) => runtime.completion(validateCompletionRequest(request), signal),\n }\n}\n\nfunction validateDiagnosticsRequest(request: DiagnosticsRequest): DiagnosticsRequest {\n if (!isRequest(request) || typeof request.workspaceRoot !== 'string' || request.workspaceRoot.length === 0 || typeof request.filePath !== 'string' || request.filePath.length === 0) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot and filePath are required')\n return { ...request, ...(request.servers ? { servers: [...request.servers] } : {}) }\n}\n\nfunction validateCompletionRequest(request: CompletionRequest): CompletionRequest {\n if (!isRequest(request) || typeof request.workspaceRoot !== 'string' || request.workspaceRoot.length === 0 || typeof request.filePath !== 'string' || request.filePath.length === 0 || !isPosition(request.position)) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'workspaceRoot, filePath and position are required')\n return { ...request, position: { ...request.position } }\n}\n\nfunction isPosition(value: unknown): value is LspPosition { return typeof value === 'object' && value !== null && Number.isInteger((value as { line?: unknown }).line) && Number.isInteger((value as { character?: unknown }).character) && (value as LspPosition).line >= 0 && (value as LspPosition).character >= 0 }\nfunction isRequest(value: unknown): value is Record<string, unknown> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\n\nexport function createUnavailableService(providerId = 'webstack'): WebstackLspService {\n return { status: async () => ({ providerId, servers: [] }), diagnostics: async () => Promise.reject(new WebstackLspError('LSP_UNAVAILABLE', 'webstack runtime is unavailable')), completion: async () => Promise.reject(new WebstackLspError('LSP_UNAVAILABLE', 'webstack runtime is unavailable')) }\n}\n","import { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { readFile } from 'node:fs/promises'\nimport type { LaunchSpec } from './types.js'\n\nconst require = createRequire(import.meta.url)\n\nexport async function resolvePackageBinary(packageName: string, binName: string, cwd: string, args = ['--stdio']): Promise<LaunchSpec> {\n const packageJson = require.resolve(`${packageName}/package.json`)\n const metadata = JSON.parse(await readFile(packageJson, 'utf8')) as { bin?: string | Record<string, string> }\n const bin = typeof metadata.bin === 'string' ? metadata.bin : metadata.bin?.[binName] ?? metadata.bin?.[packageName]\n if (!bin) throw new Error(`binary ${binName} is not declared by ${packageName}`)\n return { command: process.execPath, args: [resolve(dirname(packageJson), bin), ...args], cwd }\n}\n","import { createRequire } from 'node:module'\nimport type { ResolvedConfig, ServerId } from '../config.js'\nimport { resolvePackageBinary } from './package-bin.js'\nimport type { LaunchSpec } from './types.js'\n\nconst packages: Record<Exclude<ServerId, 'phpantom'>, [string, string]> = {\n typescript: ['typescript-language-server', 'typescript-language-server'],\n svelte: ['svelte-language-server', 'svelteserver'],\n html: ['vscode-langservers-extracted', 'vscode-html-language-server'],\n css: ['vscode-langservers-extracted', 'vscode-css-language-server'],\n tailwind: ['@tailwindcss/language-server', 'tailwindcss-language-server'],\n}\n\nexport async function resolveLaunch(id: ServerId, config: ResolvedConfig, workspace: string): Promise<LaunchSpec> {\n const server = config.servers[id]\n if (server.mode === 'path' || id === 'phpantom') return { command: server.command, args: [...server.args], cwd: workspace, env: { ...server.env } }\n const [pkg, bin] = packages[id]\n return { ...await resolvePackageBinary(pkg, bin, workspace, server.args), env: { ...server.env } }\n}\n\nexport function initializationOptions(id: ServerId, config: ResolvedConfig): unknown {\n const configured = config.servers[id].initializationOptions\n if (configured !== undefined) return configured\n if (id === 'typescript' && config.servers[id].mode === 'bundled') {\n return { tsserver: { path: createRequire(import.meta.url).resolve('typescript/lib/tsserver.js') } }\n }\n if (id === 'tailwind') return { userLanguages: config.tailwind.includeLanguages }\n return null\n}\n\nexport function serverConfiguration(id: ServerId, config: ResolvedConfig): unknown {\n if (config.servers[id].configuration !== undefined) return config.servers[id].configuration\n if (id === 'tailwind') return { tailwindCSS: { classAttributes: config.tailwind.classAttributes, includeLanguages: config.tailwind.includeLanguages, experimental: { classRegex: config.tailwind.classRegex } } }\n return {}\n}\n"],"mappings":"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"}
|