zelari-code 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cli/app.js +3 -1
  2. package/dist/cli/app.js.map +1 -1
  3. package/dist/cli/ast/engine.js +126 -0
  4. package/dist/cli/ast/engine.js.map +1 -0
  5. package/dist/cli/ast/tools.js +71 -0
  6. package/dist/cli/ast/tools.js.map +1 -0
  7. package/dist/cli/browser/driver.js +125 -0
  8. package/dist/cli/browser/driver.js.map +1 -0
  9. package/dist/cli/browser/tools.js +71 -0
  10. package/dist/cli/browser/tools.js.map +1 -0
  11. package/dist/cli/hooks/useSlashDispatch.js +33 -2
  12. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  13. package/dist/cli/lsp/client.js +89 -0
  14. package/dist/cli/lsp/client.js.map +1 -0
  15. package/dist/cli/lsp/manager.js +287 -0
  16. package/dist/cli/lsp/manager.js.map +1 -0
  17. package/dist/cli/lsp/protocol.js +83 -0
  18. package/dist/cli/lsp/protocol.js.map +1 -0
  19. package/dist/cli/lsp/servers.js +80 -0
  20. package/dist/cli/lsp/servers.js.map +1 -0
  21. package/dist/cli/lsp/tools.js +125 -0
  22. package/dist/cli/lsp/tools.js.map +1 -0
  23. package/dist/cli/main.bundled.js +1563 -273
  24. package/dist/cli/main.bundled.js.map +4 -4
  25. package/dist/cli/mode.js +32 -0
  26. package/dist/cli/mode.js.map +1 -0
  27. package/dist/cli/semantic/embeddings.js +71 -0
  28. package/dist/cli/semantic/embeddings.js.map +1 -0
  29. package/dist/cli/semantic/index.js +147 -0
  30. package/dist/cli/semantic/index.js.map +1 -0
  31. package/dist/cli/semantic/provider.js +29 -0
  32. package/dist/cli/semantic/provider.js.map +1 -0
  33. package/dist/cli/semantic/store.js +71 -0
  34. package/dist/cli/semantic/store.js.map +1 -0
  35. package/dist/cli/semantic/tools.js +54 -0
  36. package/dist/cli/semantic/tools.js.map +1 -0
  37. package/dist/cli/slashCommands.js +22 -1
  38. package/dist/cli/slashCommands.js.map +1 -1
  39. package/dist/cli/slashHandlers/semantic.js +37 -0
  40. package/dist/cli/slashHandlers/semantic.js.map +1 -0
  41. package/dist/cli/toolRegistry.js +50 -0
  42. package/dist/cli/toolRegistry.js.map +1 -1
  43. package/package.json +3 -3
@@ -0,0 +1,89 @@
1
+ /**
2
+ * lsp/client — a minimal JSON-RPC 2.0 client speaking LSP over a transport.
3
+ *
4
+ * The transport is injectable (a language-server child process's stdio in
5
+ * production, a fake in tests), so the request/response correlation, server
6
+ * request handling, and timeouts are all unit-testable without spawning a
7
+ * real language server.
8
+ */
9
+ import { encodeMessage, createMessageParser } from './protocol.js';
10
+ export class LspClient {
11
+ transport;
12
+ nextId = 1;
13
+ pending = new Map();
14
+ parser = createMessageParser();
15
+ closed = false;
16
+ timeoutMs;
17
+ constructor(transport, options = {}) {
18
+ this.transport = transport;
19
+ this.timeoutMs = options.timeoutMs ?? 15_000;
20
+ transport.onData((chunk) => this.onData(chunk));
21
+ transport.onClose(() => this.onClose());
22
+ }
23
+ /** Send a request and await the matching response. */
24
+ request(method, params) {
25
+ if (this.closed)
26
+ return Promise.reject(new Error('LSP transport is closed'));
27
+ const id = this.nextId++;
28
+ const msg = { jsonrpc: '2.0', id, method, ...(params !== undefined ? { params } : {}) };
29
+ return new Promise((resolve, reject) => {
30
+ const timer = setTimeout(() => {
31
+ this.pending.delete(id);
32
+ reject(new Error(`LSP request "${method}" timed out after ${this.timeoutMs}ms`));
33
+ }, this.timeoutMs);
34
+ this.pending.set(id, { resolve: resolve, reject, timer });
35
+ this.transport.send(encodeMessage(msg));
36
+ });
37
+ }
38
+ /** Fire a notification (no response expected). */
39
+ notify(method, params) {
40
+ if (this.closed)
41
+ return;
42
+ const msg = { jsonrpc: '2.0', method, ...(params !== undefined ? { params } : {}) };
43
+ this.transport.send(encodeMessage(msg));
44
+ }
45
+ onData(chunk) {
46
+ for (const message of this.parser.push(chunk)) {
47
+ this.handleMessage(message);
48
+ }
49
+ }
50
+ handleMessage(message) {
51
+ // Response to one of our requests (has an id AND result/error, no method).
52
+ if (message.method === undefined && message.id !== undefined) {
53
+ const entry = this.pending.get(message.id);
54
+ if (!entry)
55
+ return;
56
+ this.pending.delete(message.id);
57
+ clearTimeout(entry.timer);
58
+ if (message.error) {
59
+ entry.reject(new Error(`LSP error ${message.error.code}: ${message.error.message}`));
60
+ }
61
+ else {
62
+ entry.resolve(message.result);
63
+ }
64
+ return;
65
+ }
66
+ // Server → client REQUEST (has method AND id): reply so the server doesn't
67
+ // stall. We don't implement any client capabilities, so a null result is
68
+ // the safe universal answer (e.g. workspace/configuration → null).
69
+ if (message.method !== undefined && message.id !== undefined) {
70
+ this.transport.send(encodeMessage({ jsonrpc: '2.0', id: message.id, result: null }));
71
+ return;
72
+ }
73
+ // Server → client NOTIFICATION (method, no id): ignored (diagnostics,
74
+ // logs, progress). The tools use pull-based requests instead.
75
+ }
76
+ onClose() {
77
+ this.closed = true;
78
+ for (const [, entry] of this.pending) {
79
+ clearTimeout(entry.timer);
80
+ entry.reject(new Error('LSP transport closed before response'));
81
+ }
82
+ this.pending.clear();
83
+ }
84
+ dispose() {
85
+ this.onClose();
86
+ this.transport.dispose();
87
+ }
88
+ }
89
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/cli/lsp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * lsp/manager — spawn + lifecycle for language servers, exposing normalized
3
+ * navigation operations (the `LspProvider` the LSP tools depend on).
4
+ *
5
+ * One server process is started lazily per language and reused for the
6
+ * session. Documents are opened/synced on demand. All operations are
7
+ * best-effort: a missing server binary, a spawn failure, or a request
8
+ * timeout resolves to an empty/neutral result so the tools degrade cleanly.
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { readFileSync } from 'node:fs';
12
+ import { LspClient } from './client.js';
13
+ import { pathToUri, uriToPath } from './protocol.js';
14
+ import { resolveServerCommand, languageIdForFile } from './servers.js';
15
+ /** Spawn a child process and adapt its stdio to an LspTransport. */
16
+ function processTransport(child) {
17
+ return {
18
+ send: (data) => {
19
+ if (child.stdin.writable)
20
+ child.stdin.write(data);
21
+ },
22
+ onData: (cb) => child.stdout.on('data', (b) => cb(b.toString('utf8'))),
23
+ onClose: (cb) => child.on('exit', cb),
24
+ dispose: () => {
25
+ try {
26
+ child.kill();
27
+ }
28
+ catch {
29
+ /* ignore */
30
+ }
31
+ },
32
+ };
33
+ }
34
+ const SYMBOL_KINDS = {
35
+ 1: 'File', 2: 'Module', 3: 'Namespace', 4: 'Package', 5: 'Class', 6: 'Method',
36
+ 7: 'Property', 8: 'Field', 9: 'Constructor', 10: 'Enum', 11: 'Interface',
37
+ 12: 'Function', 13: 'Variable', 14: 'Constant', 15: 'String', 16: 'Number',
38
+ 17: 'Boolean', 18: 'Array', 19: 'Object', 20: 'Key', 21: 'Null',
39
+ 22: 'EnumMember', 23: 'Struct', 24: 'Event', 25: 'Operator', 26: 'TypeParameter',
40
+ };
41
+ export class LspManager {
42
+ cwd;
43
+ spawnImpl;
44
+ timeoutMs;
45
+ servers = new Map(); // language → entry (null = unavailable)
46
+ constructor(options = {}) {
47
+ this.cwd = options.cwd ?? process.cwd();
48
+ this.spawnImpl = options.spawnImpl ?? spawn;
49
+ this.timeoutMs = options.timeoutMs ?? 15_000;
50
+ }
51
+ /** Lazily start (or reuse) the server for a file's language. Null if none. */
52
+ getServer(file) {
53
+ const cmd = resolveServerCommand(file, this.cwd);
54
+ if (!cmd)
55
+ return null;
56
+ const cached = this.servers.get(cmd.language);
57
+ if (cached !== undefined)
58
+ return cached;
59
+ let entry = null;
60
+ try {
61
+ const child = this.spawnImpl(cmd.command, cmd.args, {
62
+ cwd: this.cwd,
63
+ });
64
+ const client = new LspClient(processTransport(child), { timeoutMs: this.timeoutMs });
65
+ const initialized = client
66
+ .request('initialize', {
67
+ processId: process.pid,
68
+ rootUri: pathToUri(this.cwd),
69
+ capabilities: {},
70
+ workspaceFolders: [{ uri: pathToUri(this.cwd), name: 'root' }],
71
+ })
72
+ .then(() => {
73
+ client.notify('initialized', {});
74
+ });
75
+ entry = { client, initialized, opened: new Map(), dispose: () => client.dispose() };
76
+ }
77
+ catch {
78
+ entry = null; // spawn failed (binary not found)
79
+ }
80
+ this.servers.set(cmd.language, entry);
81
+ return entry;
82
+ }
83
+ /** Ensure a document is open (or synced) on the server. */
84
+ async openDoc(entry, file) {
85
+ await entry.initialized;
86
+ const uri = pathToUri(file);
87
+ let text;
88
+ try {
89
+ text = readFileSync(file, 'utf8');
90
+ }
91
+ catch {
92
+ text = '';
93
+ }
94
+ const prev = entry.opened.get(uri);
95
+ if (prev === undefined) {
96
+ entry.client.notify('textDocument/didOpen', {
97
+ textDocument: { uri, languageId: languageIdForFile(file), version: 1, text },
98
+ });
99
+ entry.opened.set(uri, 1);
100
+ }
101
+ else {
102
+ const version = prev + 1;
103
+ entry.client.notify('textDocument/didChange', {
104
+ textDocument: { uri, version },
105
+ contentChanges: [{ text }],
106
+ });
107
+ entry.opened.set(uri, version);
108
+ }
109
+ return uri;
110
+ }
111
+ async withDoc(file, fn, fallback) {
112
+ const entry = this.getServer(file);
113
+ if (!entry)
114
+ return fallback;
115
+ try {
116
+ const uri = await this.openDoc(entry, file);
117
+ return await fn(entry, uri);
118
+ }
119
+ catch {
120
+ return fallback;
121
+ }
122
+ }
123
+ async definition(file, line, character) {
124
+ return this.withDoc(file, async (entry, uri) => {
125
+ const res = await entry.client.request('textDocument/definition', {
126
+ textDocument: { uri },
127
+ position: { line, character },
128
+ });
129
+ return normalizeLocations(res);
130
+ }, []);
131
+ }
132
+ async references(file, line, character) {
133
+ return this.withDoc(file, async (entry, uri) => {
134
+ const res = await entry.client.request('textDocument/references', {
135
+ textDocument: { uri },
136
+ position: { line, character },
137
+ context: { includeDeclaration: true },
138
+ });
139
+ return normalizeLocations(res);
140
+ }, []);
141
+ }
142
+ async hover(file, line, character) {
143
+ return this.withDoc(file, async (entry, uri) => {
144
+ const res = (await entry.client.request('textDocument/hover', {
145
+ textDocument: { uri },
146
+ position: { line, character },
147
+ }));
148
+ return extractHoverText(res);
149
+ }, null);
150
+ }
151
+ async documentSymbols(file) {
152
+ return this.withDoc(file, async (entry, uri) => {
153
+ const res = (await entry.client.request('textDocument/documentSymbol', {
154
+ textDocument: { uri },
155
+ }));
156
+ return normalizeSymbols(res);
157
+ }, []);
158
+ }
159
+ async rename(file, line, character, newName) {
160
+ return this.withDoc(file, async (entry, uri) => {
161
+ const res = (await entry.client.request('textDocument/rename', {
162
+ textDocument: { uri },
163
+ position: { line, character },
164
+ newName,
165
+ }));
166
+ return normalizeRename(res);
167
+ }, null);
168
+ }
169
+ dispose() {
170
+ for (const entry of this.servers.values())
171
+ entry?.dispose();
172
+ this.servers.clear();
173
+ }
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Shared singleton — LSP servers are heavy, so one manager is reused across
177
+ // turns and disposed on process exit (rather than one per tool registry).
178
+ // ---------------------------------------------------------------------------
179
+ let shared = null;
180
+ export function getSharedLspManager(cwd = process.cwd()) {
181
+ if (shared && shared.cwd === cwd)
182
+ return shared.manager;
183
+ // cwd changed (rare) — dispose the old one and start fresh.
184
+ shared?.manager.dispose();
185
+ const manager = new LspManager({ cwd });
186
+ shared = { cwd, manager };
187
+ return manager;
188
+ }
189
+ export function disposeSharedLspManager() {
190
+ shared?.manager.dispose();
191
+ shared = null;
192
+ }
193
+ // Best-effort cleanup so language servers don't outlive the CLI.
194
+ if (typeof process !== 'undefined' && typeof process.once === 'function') {
195
+ process.once('exit', () => {
196
+ try {
197
+ shared?.manager.dispose();
198
+ }
199
+ catch {
200
+ /* ignore */
201
+ }
202
+ });
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // Response normalizers (exported for unit testing)
206
+ // ---------------------------------------------------------------------------
207
+ export function normalizeLocations(res) {
208
+ if (!res)
209
+ return [];
210
+ const arr = Array.isArray(res) ? res : [res];
211
+ const out = [];
212
+ for (const item of arr) {
213
+ if (!item || typeof item !== 'object')
214
+ continue;
215
+ const loc = item;
216
+ const uri = loc.uri ?? loc.targetUri;
217
+ const range = (loc.range ?? loc.targetRange);
218
+ if (typeof uri === 'string' && range)
219
+ out.push({ uri, range });
220
+ }
221
+ return out;
222
+ }
223
+ export function extractHoverText(res) {
224
+ if (!res || !res.contents)
225
+ return null;
226
+ const c = res.contents;
227
+ if (typeof c === 'string')
228
+ return c.trim() || null;
229
+ if (Array.isArray(c)) {
230
+ return (c
231
+ .map((x) => (typeof x === 'string' ? x : x?.value ?? ''))
232
+ .filter(Boolean)
233
+ .join('\n')
234
+ .trim() || null);
235
+ }
236
+ if (typeof c === 'object' && 'value' in c) {
237
+ return (c.value ?? '').trim() || null;
238
+ }
239
+ return null;
240
+ }
241
+ export function normalizeSymbols(res) {
242
+ if (!Array.isArray(res))
243
+ return [];
244
+ const out = [];
245
+ const visit = (nodes) => {
246
+ for (const n of nodes) {
247
+ if (!n || typeof n !== 'object')
248
+ continue;
249
+ const s = n;
250
+ const line0 = s.range?.start?.line ?? s.location?.range?.start?.line;
251
+ if (typeof s.name === 'string' && typeof line0 === 'number') {
252
+ out.push({ name: s.name, kind: SYMBOL_KINDS[s.kind ?? 0] ?? 'Symbol', line: line0 + 1 });
253
+ }
254
+ if (Array.isArray(s.children))
255
+ visit(s.children);
256
+ }
257
+ };
258
+ visit(res);
259
+ return out;
260
+ }
261
+ export function normalizeRename(res) {
262
+ if (!res)
263
+ return null;
264
+ const files = [];
265
+ let total = 0;
266
+ if (res.changes && typeof res.changes === 'object') {
267
+ for (const [uri, edits] of Object.entries(res.changes)) {
268
+ const count = Array.isArray(edits) ? edits.length : 0;
269
+ files.push({ file: uriToPath(uri), count });
270
+ total += count;
271
+ }
272
+ }
273
+ if (Array.isArray(res.documentChanges)) {
274
+ for (const dc of res.documentChanges) {
275
+ const d = dc;
276
+ if (d?.textDocument?.uri) {
277
+ const count = Array.isArray(d.edits) ? d.edits.length : 0;
278
+ files.push({ file: uriToPath(d.textDocument.uri), count });
279
+ total += count;
280
+ }
281
+ }
282
+ }
283
+ if (files.length === 0)
284
+ return null;
285
+ return { files, totalEdits: total };
286
+ }
287
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/cli/lsp/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * lsp/protocol — LSP wire framing + minimal type helpers.
3
+ *
4
+ * Language Server Protocol messages are JSON-RPC 2.0 objects framed with an
5
+ * HTTP-style header: `Content-Length: <bytes>\r\n\r\n<json-body>`. This module
6
+ * is the pure, dependency-free core: encode a message, and incrementally
7
+ * decode a byte stream into complete messages (handling partial frames and
8
+ * multiple messages per chunk). It never does I/O, so it's fully unit-testable.
9
+ */
10
+ /** Encode a JSON-RPC message into a framed LSP wire string. */
11
+ export function encodeMessage(message) {
12
+ const json = JSON.stringify(message);
13
+ // Content-Length is the BYTE length of the body, not the char length.
14
+ const contentLength = Buffer.byteLength(json, 'utf8');
15
+ return `Content-Length: ${contentLength}\r\n\r\n${json}`;
16
+ }
17
+ /**
18
+ * Incremental LSP message decoder. Feed it raw stdout chunks; it returns any
19
+ * complete JSON-RPC messages parsed so far, buffering partial frames.
20
+ */
21
+ export function createMessageParser() {
22
+ let buffer = '';
23
+ return {
24
+ push(chunk) {
25
+ buffer += chunk;
26
+ const out = [];
27
+ // Loop: each iteration extracts one complete frame, or breaks when the
28
+ // buffer doesn't yet hold a full header+body.
29
+ for (;;) {
30
+ const headerEnd = buffer.indexOf('\r\n\r\n');
31
+ if (headerEnd === -1)
32
+ break; // header not complete yet
33
+ const header = buffer.slice(0, headerEnd);
34
+ const match = /Content-Length:\s*(\d+)/i.exec(header);
35
+ if (!match) {
36
+ // Malformed header — drop up to the separator and resync.
37
+ buffer = buffer.slice(headerEnd + 4);
38
+ continue;
39
+ }
40
+ const length = Number(match[1]);
41
+ const bodyStart = headerEnd + 4;
42
+ // Content-Length is bytes; slice by bytes to be correct with UTF-8.
43
+ const rest = Buffer.from(buffer.slice(bodyStart), 'utf8');
44
+ if (rest.length < length)
45
+ break; // body not fully arrived yet
46
+ const body = rest.subarray(0, length).toString('utf8');
47
+ // Advance the buffer past the consumed body (re-encode remainder).
48
+ buffer = rest.subarray(length).toString('utf8');
49
+ try {
50
+ out.push(JSON.parse(body));
51
+ }
52
+ catch {
53
+ // Skip an unparseable body — the stream stays framed correctly
54
+ // because we already consumed exactly Content-Length bytes.
55
+ }
56
+ }
57
+ return out;
58
+ },
59
+ };
60
+ }
61
+ /** Convert a filesystem path to a `file://` URI (LSP identifies docs by URI). */
62
+ export function pathToUri(filePath) {
63
+ // Normalize Windows backslashes and ensure a leading slash.
64
+ let p = filePath.replace(/\\/g, '/');
65
+ if (!p.startsWith('/'))
66
+ p = `/${p}`;
67
+ // Encode each segment but keep the slashes.
68
+ const encoded = p
69
+ .split('/')
70
+ .map((seg) => encodeURIComponent(seg))
71
+ .join('/');
72
+ return `file://${encoded}`;
73
+ }
74
+ /** Convert a `file://` URI back to a filesystem path. */
75
+ export function uriToPath(uri) {
76
+ if (!uri.startsWith('file://'))
77
+ return uri;
78
+ const withoutScheme = decodeURIComponent(uri.slice('file://'.length));
79
+ // On POSIX the path already starts with '/'. On Windows LSP emits
80
+ // file:///C:/... — strip the leading slash before a drive letter.
81
+ return /^\/[A-Za-z]:/.test(withoutScheme) ? withoutScheme.slice(1) : withoutScheme;
82
+ }
83
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/cli/lsp/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,sEAAsE;IACtE,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,mBAAmB,aAAa,WAAW,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAGjC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO;QACL,IAAI,CAAC,KAAa;YAChB,MAAM,IAAI,KAAK,CAAC;YAChB,MAAM,GAAG,GAAc,EAAE,CAAC;YAC1B,uEAAuE;YACvE,8CAA8C;YAC9C,SAAS,CAAC;gBACR,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7C,IAAI,SAAS,KAAK,CAAC,CAAC;oBAAE,MAAM,CAAC,0BAA0B;gBACvD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,0DAA0D;oBAC1D,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;oBACrC,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;gBAChC,oEAAoE;gBACpE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;oBAAE,MAAM,CAAC,6BAA6B;gBAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvD,mEAAmE;gBACnE,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,+DAA+D;oBAC/D,4DAA4D;gBAC9D,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAqBD,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,4DAA4D;IAC5D,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,4CAA4C;IAC5C,MAAM,OAAO,GAAG,CAAC;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,UAAU,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,kEAAkE;IAClE,kEAAkE;IAClE,OAAO,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACrF,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * lsp/servers — map a source file to the language server that handles it.
3
+ *
4
+ * Servers are external binaries resolved at runtime (project-local
5
+ * node_modules/.bin first, then PATH), exactly like the diagnostics
6
+ * checkers. When none is installed the LSP tools degrade silently.
7
+ */
8
+ import path from 'node:path';
9
+ import { resolveBin } from '../diagnostics/engine.js';
10
+ /**
11
+ * Built-in server specs. Order matters only for display; extension lookup is
12
+ * exact. All speak LSP over stdio.
13
+ */
14
+ export const LSP_SERVERS = [
15
+ {
16
+ language: 'typescript',
17
+ bin: 'typescript-language-server',
18
+ args: ['--stdio'],
19
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
20
+ },
21
+ {
22
+ language: 'python',
23
+ bin: 'pyright-langserver',
24
+ args: ['--stdio'],
25
+ extensions: ['.py'],
26
+ },
27
+ {
28
+ language: 'go',
29
+ bin: 'gopls',
30
+ args: [],
31
+ extensions: ['.go'],
32
+ },
33
+ {
34
+ language: 'rust',
35
+ bin: 'rust-analyzer',
36
+ args: [],
37
+ extensions: ['.rs'],
38
+ },
39
+ ];
40
+ /** The `languageId` LSP expects for a given extension (didOpen). */
41
+ export function languageIdForFile(file) {
42
+ const ext = path.extname(file).toLowerCase();
43
+ const map = {
44
+ '.ts': 'typescript',
45
+ '.tsx': 'typescriptreact',
46
+ '.js': 'javascript',
47
+ '.jsx': 'javascriptreact',
48
+ '.mjs': 'javascript',
49
+ '.cjs': 'javascript',
50
+ '.py': 'python',
51
+ '.go': 'go',
52
+ '.rs': 'rust',
53
+ };
54
+ return map[ext] ?? 'plaintext';
55
+ }
56
+ /** Find the server spec for a file's extension, or null. */
57
+ export function serverForFile(file, servers = LSP_SERVERS) {
58
+ const ext = path.extname(file).toLowerCase();
59
+ return servers.find((s) => s.extensions.includes(ext)) ?? null;
60
+ }
61
+ /**
62
+ * Resolve the launch command for a file's server, or null when no server is
63
+ * installed for that language. `bin` is resolved project-local first.
64
+ */
65
+ export function resolveServerCommand(file, cwd, servers = LSP_SERVERS) {
66
+ const spec = serverForFile(file, servers);
67
+ if (!spec)
68
+ return null;
69
+ const command = resolveBin(spec.bin, cwd);
70
+ // resolveBin returns the bare name when nothing local was found; we can't
71
+ // know if it's on PATH without spawning, so report `resolved` = whether a
72
+ // path (vs the bare bin name) came back.
73
+ return {
74
+ language: spec.language,
75
+ command,
76
+ args: spec.args,
77
+ resolved: command !== spec.bin,
78
+ };
79
+ }
80
+ //# sourceMappingURL=servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../../src/cli/lsp/servers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAatD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAA6B;IACnD;QACE,QAAQ,EAAE,YAAY;QACtB,GAAG,EAAE,4BAA4B;QACjC,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAC3D;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,GAAG,EAAE,oBAAoB;QACzB,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;IACD;QACE,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,CAAC,KAAK,CAAC;KACpB;CACF,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,MAAM;KACd,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC;AACjC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,UAAoC,WAAW;IAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,GAAW,EACX,UAAoC,WAAW;IAE/C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1C,0EAA0E;IAC1E,0EAA0E;IAC1E,yCAAyC;IACzC,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG;KAC/B,CAAC;AACJ,CAAC"}