pi-shazam 0.1.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 (121) hide show
  1. package/dist/core/cache.d.ts +50 -0
  2. package/dist/core/cache.d.ts.map +1 -0
  3. package/dist/core/cache.js +116 -0
  4. package/dist/core/cache.js.map +1 -0
  5. package/dist/core/encoding.d.ts +25 -0
  6. package/dist/core/encoding.d.ts.map +1 -0
  7. package/dist/core/encoding.js +109 -0
  8. package/dist/core/encoding.js.map +1 -0
  9. package/dist/core/graph.d.ts +146 -0
  10. package/dist/core/graph.d.ts.map +1 -0
  11. package/dist/core/graph.js +224 -0
  12. package/dist/core/graph.js.map +1 -0
  13. package/dist/core/pagerank.d.ts +19 -0
  14. package/dist/core/pagerank.d.ts.map +1 -0
  15. package/dist/core/pagerank.js +106 -0
  16. package/dist/core/pagerank.js.map +1 -0
  17. package/dist/core/scanner.d.ts +19 -0
  18. package/dist/core/scanner.d.ts.map +1 -0
  19. package/dist/core/scanner.js +266 -0
  20. package/dist/core/scanner.js.map +1 -0
  21. package/dist/core/treesitter-queries.d.ts +19 -0
  22. package/dist/core/treesitter-queries.d.ts.map +1 -0
  23. package/dist/core/treesitter-queries.js +222 -0
  24. package/dist/core/treesitter-queries.js.map +1 -0
  25. package/dist/core/treesitter.d.ts +67 -0
  26. package/dist/core/treesitter.d.ts.map +1 -0
  27. package/dist/core/treesitter.js +624 -0
  28. package/dist/core/treesitter.js.map +1 -0
  29. package/dist/hooks/after-write.d.ts +32 -0
  30. package/dist/hooks/after-write.d.ts.map +1 -0
  31. package/dist/hooks/after-write.js +111 -0
  32. package/dist/hooks/after-write.js.map +1 -0
  33. package/dist/hooks/before-start.d.ts +23 -0
  34. package/dist/hooks/before-start.d.ts.map +1 -0
  35. package/dist/hooks/before-start.js +43 -0
  36. package/dist/hooks/before-start.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +106 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/lsp/client.d.ts +77 -0
  42. package/dist/lsp/client.d.ts.map +1 -0
  43. package/dist/lsp/client.js +355 -0
  44. package/dist/lsp/client.js.map +1 -0
  45. package/dist/lsp/manager.d.ts +85 -0
  46. package/dist/lsp/manager.d.ts.map +1 -0
  47. package/dist/lsp/manager.js +362 -0
  48. package/dist/lsp/manager.js.map +1 -0
  49. package/dist/lsp/servers.d.ts +43 -0
  50. package/dist/lsp/servers.d.ts.map +1 -0
  51. package/dist/lsp/servers.js +140 -0
  52. package/dist/lsp/servers.js.map +1 -0
  53. package/dist/lsp/setup.d.ts +24 -0
  54. package/dist/lsp/setup.d.ts.map +1 -0
  55. package/dist/lsp/setup.js +140 -0
  56. package/dist/lsp/setup.js.map +1 -0
  57. package/dist/tools/call_chain.d.ts +9 -0
  58. package/dist/tools/call_chain.d.ts.map +1 -0
  59. package/dist/tools/call_chain.js +151 -0
  60. package/dist/tools/call_chain.js.map +1 -0
  61. package/dist/tools/check.d.ts +18 -0
  62. package/dist/tools/check.d.ts.map +1 -0
  63. package/dist/tools/check.js +141 -0
  64. package/dist/tools/check.js.map +1 -0
  65. package/dist/tools/codequery.d.ts +19 -0
  66. package/dist/tools/codequery.d.ts.map +1 -0
  67. package/dist/tools/codequery.js +128 -0
  68. package/dist/tools/codequery.js.map +1 -0
  69. package/dist/tools/codesearch.d.ts +8 -0
  70. package/dist/tools/codesearch.d.ts.map +1 -0
  71. package/dist/tools/codesearch.js +101 -0
  72. package/dist/tools/codesearch.js.map +1 -0
  73. package/dist/tools/file_detail.d.ts +9 -0
  74. package/dist/tools/file_detail.d.ts.map +1 -0
  75. package/dist/tools/file_detail.js +125 -0
  76. package/dist/tools/file_detail.js.map +1 -0
  77. package/dist/tools/fix.d.ts +25 -0
  78. package/dist/tools/fix.d.ts.map +1 -0
  79. package/dist/tools/fix.js +257 -0
  80. package/dist/tools/fix.js.map +1 -0
  81. package/dist/tools/hotspots.d.ts +9 -0
  82. package/dist/tools/hotspots.d.ts.map +1 -0
  83. package/dist/tools/hotspots.js +107 -0
  84. package/dist/tools/hotspots.js.map +1 -0
  85. package/dist/tools/impact.d.ts +14 -0
  86. package/dist/tools/impact.d.ts.map +1 -0
  87. package/dist/tools/impact.js +160 -0
  88. package/dist/tools/impact.js.map +1 -0
  89. package/dist/tools/orphan.d.ts +9 -0
  90. package/dist/tools/orphan.d.ts.map +1 -0
  91. package/dist/tools/orphan.js +124 -0
  92. package/dist/tools/orphan.js.map +1 -0
  93. package/dist/tools/overview.d.ts +9 -0
  94. package/dist/tools/overview.d.ts.map +1 -0
  95. package/dist/tools/overview.js +137 -0
  96. package/dist/tools/overview.js.map +1 -0
  97. package/dist/tools/ready.d.ts +18 -0
  98. package/dist/tools/ready.d.ts.map +1 -0
  99. package/dist/tools/ready.js +145 -0
  100. package/dist/tools/ready.js.map +1 -0
  101. package/dist/tools/refs.d.ts +9 -0
  102. package/dist/tools/refs.d.ts.map +1 -0
  103. package/dist/tools/refs.js +129 -0
  104. package/dist/tools/refs.js.map +1 -0
  105. package/dist/tools/routes.d.ts +8 -0
  106. package/dist/tools/routes.d.ts.map +1 -0
  107. package/dist/tools/routes.js +83 -0
  108. package/dist/tools/routes.js.map +1 -0
  109. package/dist/tools/state_map.d.ts +8 -0
  110. package/dist/tools/state_map.d.ts.map +1 -0
  111. package/dist/tools/state_map.js +95 -0
  112. package/dist/tools/state_map.js.map +1 -0
  113. package/dist/tools/symbol.d.ts +9 -0
  114. package/dist/tools/symbol.d.ts.map +1 -0
  115. package/dist/tools/symbol.js +84 -0
  116. package/dist/tools/symbol.js.map +1 -0
  117. package/dist/tools/verify.d.ts +24 -0
  118. package/dist/tools/verify.d.ts.map +1 -0
  119. package/dist/tools/verify.js +212 -0
  120. package/dist/tools/verify.js.map +1 -0
  121. package/package.json +70 -0
@@ -0,0 +1,362 @@
1
+ /**
2
+ * pi-shazam lsp/manager — Language server process lifecycle management.
3
+ *
4
+ * Detects project languages, spawns LSP servers on demand,
5
+ * handles health checks, restarts, and graceful shutdown.
6
+ *
7
+ * Ported from repomap/src/lsp.py (detect_project_languages, detect_lsp_server).
8
+ */
9
+ import { readdirSync, statSync, existsSync } from "node:fs";
10
+ import { join, resolve } from "node:path";
11
+ import { homedir } from "node:os";
12
+ import { LspClient } from "./client.js";
13
+ import { LSP_SERVER_SPECS, languageForSuffix, lspTimeoutFor, } from "./servers.js";
14
+ // ── Project language detection ───────────────────────────────────────────────
15
+ const SKIP_DIRS = new Set([
16
+ ".git",
17
+ "node_modules",
18
+ "dist",
19
+ "build",
20
+ "out",
21
+ ".venv",
22
+ "venv",
23
+ "target",
24
+ "__pycache__",
25
+ ".cache",
26
+ ".next",
27
+ ".nuxt",
28
+ "coverage",
29
+ ".nyc_output",
30
+ "vendor",
31
+ "bower_components",
32
+ "tmp",
33
+ "temp",
34
+ ".idea",
35
+ ".vscode",
36
+ ".turbo",
37
+ ".vercel",
38
+ ".yarn",
39
+ ]);
40
+ /**
41
+ * Check if a path contains any skip directory segment.
42
+ * Used to avoid feeding vendored/generated files to LSP.
43
+ */
44
+ export function shouldSkipPath(filePath) {
45
+ const segments = filePath.split("/");
46
+ for (const seg of segments) {
47
+ if (SKIP_DIRS.has(seg))
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ /**
53
+ * Walk project root and detect languages from file extensions.
54
+ */
55
+ export function detectProjectLanguages(projectRoot, maxFiles = 2000) {
56
+ const langs = new Set();
57
+ let seen = 0;
58
+ function walk(dir) {
59
+ if (seen >= maxFiles)
60
+ return;
61
+ let entries;
62
+ try {
63
+ entries = readdirSync(dir);
64
+ }
65
+ catch {
66
+ return;
67
+ }
68
+ for (const entry of entries) {
69
+ if (seen >= maxFiles)
70
+ return;
71
+ if (SKIP_DIRS.has(entry))
72
+ continue;
73
+ const fullPath = join(dir, entry);
74
+ let st;
75
+ try {
76
+ st = statSync(fullPath);
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ if (st.isDirectory()) {
82
+ walk(fullPath);
83
+ }
84
+ else if (st.isFile()) {
85
+ seen++;
86
+ const ext = entry.substring(entry.lastIndexOf(".")).toLowerCase();
87
+ const lang = languageForSuffix(ext);
88
+ if (lang)
89
+ langs.add(lang);
90
+ }
91
+ }
92
+ }
93
+ walk(resolve(projectRoot));
94
+ return [...langs].sort();
95
+ }
96
+ // ── LSP server detection ─────────────────────────────────────────────────────
97
+ /**
98
+ * Find the LSP workspace root by walking up from a file path
99
+ * looking for root markers.
100
+ */
101
+ function detectWorkspaceRoot(projectRoot, filePath, language) {
102
+ const root = resolve(projectRoot);
103
+ const specs = LSP_SERVER_SPECS.filter((s) => s.language === language);
104
+ const markers = new Set();
105
+ for (const spec of specs) {
106
+ for (const m of spec.rootMarkers) {
107
+ markers.add(m);
108
+ }
109
+ }
110
+ let current = filePath ? resolve(filePath) : root;
111
+ if (!existsSync(current))
112
+ current = root;
113
+ // Start from file's directory
114
+ if (existsSync(current) && statSync(current).isFile()) {
115
+ current = join(current, "..");
116
+ }
117
+ current = resolve(current);
118
+ while (true) {
119
+ for (const marker of markers) {
120
+ if (existsSync(join(current, marker))) {
121
+ return current;
122
+ }
123
+ }
124
+ // Check if we've reached or passed the project root
125
+ const parent = resolve(current, "..");
126
+ if (current === parent || current === "/" || parent === root) {
127
+ if (current !== root) {
128
+ // Check root itself
129
+ for (const marker of markers) {
130
+ if (existsSync(join(root, marker))) {
131
+ return root;
132
+ }
133
+ }
134
+ }
135
+ break;
136
+ }
137
+ current = parent;
138
+ }
139
+ return root;
140
+ }
141
+ // ── Executable search ────────────────────────────────────────────────────────
142
+ function isExecutable(filePath) {
143
+ try {
144
+ const st = statSync(filePath);
145
+ // Check if file exists and is executable (or just exists on Windows)
146
+ if (process.platform === "win32")
147
+ return st.isFile();
148
+ return st.isFile();
149
+ // Note: actual X_OK check requires fs.accessSync which we skip for simplicity
150
+ // The spawn() call will fail if it's not executable
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ }
156
+ function findInPath(command) {
157
+ const pathEnv = process.env.PATH ?? "";
158
+ const dirs = pathEnv.split(":");
159
+ for (const dir of dirs) {
160
+ const candidate = join(dir, command);
161
+ if (isExecutable(candidate))
162
+ return candidate;
163
+ }
164
+ return null;
165
+ }
166
+ function trustedUserCandidates(commandName) {
167
+ const home = homedir();
168
+ const candidates = [
169
+ join(home, ".local", "bin", commandName),
170
+ join(home, ".npm-global", "bin", commandName),
171
+ join(home, ".cargo", "bin", commandName),
172
+ join(home, "go", "bin", commandName),
173
+ join(home, ".bun", "bin", commandName),
174
+ join(home, ".yarn", "bin", commandName),
175
+ join(home, ".config", "yarn", "global", "node_modules", ".bin", commandName),
176
+ join(home, ".local", "share", "pnpm", commandName),
177
+ join(home, ".local", "share", "nvim", "mason", "bin", commandName),
178
+ ];
179
+ return candidates.filter(isExecutable);
180
+ }
181
+ // ── Detection ────────────────────────────────────────────────────────────────
182
+ export function detectLspServer(projectRoot, language, filePath) {
183
+ const root = resolve(projectRoot);
184
+ const workspaceRoot = detectWorkspaceRoot(root, filePath ?? null, language);
185
+ const specs = LSP_SERVER_SPECS.filter((s) => s.language === language);
186
+ if (specs.length === 0) {
187
+ return {
188
+ language,
189
+ serverName: "",
190
+ status: "missing",
191
+ command: [],
192
+ source: "",
193
+ workspaceRoot: root,
194
+ reason: "unsupported language",
195
+ };
196
+ }
197
+ for (const spec of specs) {
198
+ // Check project-relative candidates first
199
+ if (spec.projectRelativeCandidates) {
200
+ for (const candidate of spec.projectRelativeCandidates) {
201
+ const fullPath = join(workspaceRoot, candidate);
202
+ if (isExecutable(fullPath)) {
203
+ return {
204
+ language,
205
+ serverName: spec.serverName,
206
+ status: "available",
207
+ command: [fullPath, ...spec.args],
208
+ source: "project",
209
+ workspaceRoot,
210
+ };
211
+ }
212
+ }
213
+ }
214
+ // Check PATH
215
+ for (const cmdName of spec.commandNames) {
216
+ const resolved = findInPath(cmdName);
217
+ if (resolved) {
218
+ return {
219
+ language,
220
+ serverName: spec.serverName,
221
+ status: "available",
222
+ command: [resolved, ...spec.args],
223
+ source: "path",
224
+ workspaceRoot,
225
+ };
226
+ }
227
+ // Check user directories
228
+ for (const candidate of trustedUserCandidates(cmdName)) {
229
+ return {
230
+ language,
231
+ serverName: spec.serverName,
232
+ status: "available",
233
+ command: [candidate, ...spec.args],
234
+ source: "user",
235
+ workspaceRoot,
236
+ };
237
+ }
238
+ }
239
+ }
240
+ return {
241
+ language,
242
+ serverName: specs[0].serverName,
243
+ status: "missing",
244
+ command: [],
245
+ source: "",
246
+ workspaceRoot,
247
+ reason: "LSP server executable not found",
248
+ };
249
+ }
250
+ // ── LspManager ───────────────────────────────────────────────────────────────
251
+ export class LspManager {
252
+ projectRoot;
253
+ servers = new Map();
254
+ log;
255
+ constructor(projectRoot, log) {
256
+ this.projectRoot = resolve(projectRoot);
257
+ this.log = log ?? (() => { });
258
+ }
259
+ // ── Detection ──────────────────────────────────────────────────────────────
260
+ /**
261
+ * Auto-detect languages in the project and return what was found.
262
+ */
263
+ detectLanguages() {
264
+ return detectProjectLanguages(this.projectRoot);
265
+ }
266
+ /**
267
+ * Detect LSP server for a specific language.
268
+ */
269
+ detectServer(language, filePath) {
270
+ return detectLspServer(this.projectRoot, language, filePath ?? null);
271
+ }
272
+ // ── Server management ──────────────────────────────────────────────────────
273
+ /**
274
+ * Get the LSP client for a given file, creating one if needed.
275
+ * Returns null if no LSP server is available for the file's language.
276
+ */
277
+ getServerForFile(filePath) {
278
+ // Skip vendored / generated / cache directories
279
+ if (shouldSkipPath(filePath))
280
+ return null;
281
+ const ext = filePath.substring(filePath.lastIndexOf(".")).toLowerCase();
282
+ const language = languageForSuffix(ext);
283
+ if (!language)
284
+ return null;
285
+ return this.getServerForLanguage(language, filePath);
286
+ }
287
+ /**
288
+ * Get or create an LSP client for a language.
289
+ */
290
+ getServerForLanguage(language, filePath) {
291
+ // Return existing server if already running
292
+ const existing = this.servers.get(language);
293
+ if (existing)
294
+ return existing;
295
+ // Detect and spawn
296
+ const detection = detectLspServer(this.projectRoot, language, filePath ?? null);
297
+ if (detection.status !== "available" || detection.command.length === 0) {
298
+ this.log(`LSP server not available for ${language}: ${detection.reason ?? "not found"}`);
299
+ return null;
300
+ }
301
+ const timeout = lspTimeoutFor(language);
302
+ const client = new LspClient(detection.command, detection.workspaceRoot, timeout, this.log);
303
+ try {
304
+ client.start();
305
+ }
306
+ catch (err) {
307
+ this.log(`Failed to start LSP for ${language}: ${err}`);
308
+ return null;
309
+ }
310
+ const info = {
311
+ language,
312
+ serverName: detection.serverName,
313
+ client,
314
+ command: detection.command,
315
+ workspaceRoot: detection.workspaceRoot,
316
+ source: detection.source,
317
+ };
318
+ this.servers.set(language, info);
319
+ return info;
320
+ }
321
+ /**
322
+ * Initialize all detected LSP servers.
323
+ */
324
+ async initializeAll() {
325
+ const languages = this.detectLanguages();
326
+ const promises = languages.map(async (language) => {
327
+ const info = this.getServerForLanguage(language);
328
+ if (info) {
329
+ try {
330
+ await info.client.initialize();
331
+ this.log(`LSP initialized: ${language} (${info.serverName})`);
332
+ }
333
+ catch (err) {
334
+ this.log(`LSP init failed for ${language}: ${err}`);
335
+ }
336
+ }
337
+ });
338
+ await Promise.allSettled(promises);
339
+ }
340
+ /**
341
+ * Get all active LSP servers.
342
+ */
343
+ getActiveServers() {
344
+ return [...this.servers.values()];
345
+ }
346
+ /**
347
+ * Shutdown all LSP servers gracefully.
348
+ */
349
+ shutdown() {
350
+ for (const [language, info] of this.servers) {
351
+ try {
352
+ info.client.close();
353
+ this.log(`LSP shutdown: ${language}`);
354
+ }
355
+ catch (err) {
356
+ this.log(`LSP shutdown error for ${language}: ${err}`);
357
+ }
358
+ }
359
+ this.servers.clear();
360
+ }
361
+ }
362
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../lsp/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACb,MAAM,cAAc,CAAC;AAoCtB,gFAAgF;AAEhF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACzB,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,MAAM;IACN,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,OAAO;IACP,OAAO;IACP,UAAU;IACV,aAAa;IACb,QAAQ;IACR,kBAAkB;IAClB,KAAK;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;CACP,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACrC,WAAmB,EACnB,WAAmB,IAAI;IAEvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,SAAS,IAAI,CAAC,GAAW;QACxB,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QAC7B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACJ,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO;QACR,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,IAAI,QAAQ;gBAAE,OAAO;YAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAM,CAAC,CAAC;YACnC,IAAI,EAAE,CAAC;YACP,IAAI,CAAC;gBACJ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS;YACV,CAAC;YACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxB,IAAI,EAAE,CAAC;gBACP,MAAM,GAAG,GAAG,KAAM,CAAC,SAAS,CAAC,KAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,IAAI;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,mBAAmB,CAC3B,WAAmB,EACnB,QAAuB,EACvB,QAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;IAED,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,IAAI,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACvD,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,OAAO,CAAC;YAChB,CAAC;QACF,CAAC;QACD,oDAAoD;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC9D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtB,oBAAoB;gBACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;wBACpC,OAAO,IAAI,CAAC;oBACb,CAAC;gBACF,CAAC;YACF,CAAC;YACD,MAAM;QACP,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,QAAgB;IACrC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,qEAAqE;QACrE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;QACnB,8EAA8E;QAC9E,oDAAoD;IACrD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,YAAY,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB;IACjD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAa;QAC5B,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;QACvC,IAAI,CACH,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,EACR,cAAc,EACd,MAAM,EACN,WAAW,CACX;QACD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;QAClD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;KAClE,CAAC;IACF,OAAO,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,eAAe,CAC9B,WAAmB,EACnB,QAAgB,EAChB,QAAwB;IAExB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAEtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACN,QAAQ;YACR,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,sBAAsB;SAC9B,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAChD,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO;wBACN,QAAQ;wBACR,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,MAAM,EAAE,WAAW;wBACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;wBACjC,MAAM,EAAE,SAAS;wBACjB,aAAa;qBACb,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;QAED,aAAa;QACb,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACN,QAAQ;oBACR,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;oBACjC,MAAM,EAAE,MAAM;oBACd,aAAa;iBACb,CAAC;YACH,CAAC;YAED,yBAAyB;YACzB,KAAK,MAAM,SAAS,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxD,OAAO;oBACN,QAAQ;oBACR,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;oBAClC,MAAM,EAAE,MAAM;oBACd,aAAa;iBACb,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO;QACN,QAAQ;QACR,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU;QAChC,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,aAAa;QACb,MAAM,EAAE,iCAAiC;KACzC,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,OAAO,UAAU;IACd,WAAW,CAAS;IACpB,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC3C,GAAG,CAAwB;IAEnC,YAAY,WAAmB,EAAE,GAA2B;QAC3D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,8EAA8E;IAE9E;;OAEG;IACH,eAAe;QACd,OAAO,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB,EAAE,QAAiB;QAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,8EAA8E;IAE9E;;;OAGG;IACH,gBAAgB,CAAC,QAAgB;QAChC,gDAAgD;QAChD,IAAI,cAAc,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,oBAAoB,CACnB,QAAgB,EAChB,QAAiB;QAEjB,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,mBAAmB;QACnB,MAAM,SAAS,GAAG,eAAe,CAChC,IAAI,CAAC,WAAW,EAChB,QAAQ,EACR,QAAQ,IAAI,IAAI,CAChB,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,GAAG,CACP,gCAAgC,QAAQ,KAAK,SAAS,CAAC,MAAM,IAAI,WAAW,EAAE,CAC9E,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC3B,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,aAAa,EACvB,OAAO,EACP,IAAI,CAAC,GAAG,CACR,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,2BAA2B,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAkB;YAC3B,QAAQ;YACR,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,MAAM;YACN,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,MAAM,EAAE,SAAS,CAAC,MAAiC;SACnD,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,oBAAoB,QAAQ,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,uBAAuB,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;gBACrD,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ;QACP,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,0BAA0B,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;QACF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * pi-shazam lsp/servers — Language server configuration table.
3
+ *
4
+ * Ported from repomap/src/lsp.py (LSP_SPECS, language_for_file).
5
+ * Only 6 languages: Python (pyright + pylsp), TypeScript, Go, JSON, YAML, Rust.
6
+ */
7
+ export interface LspServerSpec {
8
+ /** Language identifier (e.g., "python", "typescript") */
9
+ language: string;
10
+ /** Human-readable server name */
11
+ serverName: string;
12
+ /** Executable names to search for (first found wins) */
13
+ commandNames: readonly string[];
14
+ /** Default CLI arguments */
15
+ args: readonly string[];
16
+ /** File extensions this server handles */
17
+ fileSuffixes: readonly string[];
18
+ /** Root marker files (e.g., package.json, Cargo.toml) */
19
+ rootMarkers: readonly string[];
20
+ /** Relative paths from workspace root to check for project-local installs */
21
+ projectRelativeCandidates?: readonly string[];
22
+ }
23
+ export declare const LSP_SERVER_SPECS: readonly LspServerSpec[];
24
+ /** File suffix → LSP language mapping, derived from LSP_SERVER_SPECS. */
25
+ export declare const suffixToLanguage: Record<string, string>;
26
+ /**
27
+ * Get the LSP language for a file based on its extension.
28
+ */
29
+ export declare function languageForSuffix(suffix: string): string | undefined;
30
+ /**
31
+ * Get all server specs for a given language.
32
+ */
33
+ export declare function specsForLanguage(language: string): LspServerSpec[];
34
+ /**
35
+ * Get all unique LSP languages from file suffixes.
36
+ */
37
+ export declare function languagesForSuffixes(suffixes: string[]): string[];
38
+ export declare const DEFAULT_LSP_TIMEOUT_MS = 8000;
39
+ /**
40
+ * Get the recommended LSP timeout for a language (in milliseconds).
41
+ */
42
+ export declare function lspTimeoutFor(language: string): number;
43
+ //# sourceMappingURL=servers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../lsp/servers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,aAAa;IAC7B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,4BAA4B;IAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,0CAA0C;IAC1C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,yDAAyD;IACzD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,6EAA6E;IAC7E,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAID,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAqFpD,CAAC;AAIF,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAY3D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAElE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAOjE;AAaD,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * pi-shazam lsp/servers — Language server configuration table.
3
+ *
4
+ * Ported from repomap/src/lsp.py (LSP_SPECS, language_for_file).
5
+ * Only 6 languages: Python (pyright + pylsp), TypeScript, Go, JSON, YAML, Rust.
6
+ */
7
+ // ── Server specs ─────────────────────────────────────────────────────────────
8
+ export const LSP_SERVER_SPECS = [
9
+ // ── Python ──────────────────────────────────────────────────────────────
10
+ {
11
+ language: "python",
12
+ serverName: "pyright-langserver",
13
+ commandNames: ["pyright-langserver"],
14
+ args: ["--stdio"],
15
+ fileSuffixes: [".py", ".pyi", ".pyx", ".pxd"],
16
+ rootMarkers: ["pyproject.toml", "setup.py", "setup.cfg", ".venv"],
17
+ projectRelativeCandidates: [".venv/bin/pyright-langserver"],
18
+ },
19
+ {
20
+ language: "python",
21
+ serverName: "pylsp",
22
+ commandNames: ["pylsp"],
23
+ args: [],
24
+ fileSuffixes: [".py", ".pyi", ".pyx", ".pxd"],
25
+ rootMarkers: ["pyproject.toml", "setup.py", "setup.cfg", ".venv"],
26
+ projectRelativeCandidates: [".venv/bin/pylsp"],
27
+ },
28
+ // ── TypeScript ──────────────────────────────────────────────────────────
29
+ {
30
+ language: "typescript",
31
+ serverName: "typescript-language-server",
32
+ commandNames: ["typescript-language-server"],
33
+ args: ["--stdio"],
34
+ fileSuffixes: [
35
+ ".ts",
36
+ ".tsx",
37
+ ".mts",
38
+ ".cts",
39
+ ".js",
40
+ ".jsx",
41
+ ".mjs",
42
+ ".cjs",
43
+ ],
44
+ rootMarkers: ["package.json", "tsconfig.json", "jsconfig.json"],
45
+ projectRelativeCandidates: [
46
+ "node_modules/.bin/typescript-language-server",
47
+ ],
48
+ },
49
+ // ── Go ────────────────────────────────────────────────────────────────────
50
+ {
51
+ language: "go",
52
+ serverName: "gopls",
53
+ commandNames: ["gopls"],
54
+ args: [],
55
+ fileSuffixes: [".go"],
56
+ rootMarkers: ["go.mod", "go.work"],
57
+ },
58
+ // ── JSON ──────────────────────────────────────────────────────────────────
59
+ {
60
+ language: "json",
61
+ serverName: "vscode-json-languageserver",
62
+ commandNames: [
63
+ "vscode-json-languageserver",
64
+ "json-languageserver",
65
+ ],
66
+ args: ["--stdio"],
67
+ fileSuffixes: [".json", ".jsonc", ".json5"],
68
+ rootMarkers: ["package.json", ".vscode"],
69
+ },
70
+ // ── YAML ──────────────────────────────────────────────────────────────────
71
+ {
72
+ language: "yaml",
73
+ serverName: "yaml-language-server",
74
+ commandNames: ["yaml-language-server"],
75
+ args: ["--stdio"],
76
+ fileSuffixes: [".yaml", ".yml"],
77
+ rootMarkers: [".github", ".yaml", ".yml"],
78
+ },
79
+ // ── Rust ──────────────────────────────────────────────────────────────────
80
+ {
81
+ language: "rust",
82
+ serverName: "rust-analyzer",
83
+ commandNames: ["rust-analyzer"],
84
+ args: [],
85
+ fileSuffixes: [".rs"],
86
+ rootMarkers: ["Cargo.toml"],
87
+ },
88
+ ];
89
+ // ── Suffix → language mapping ────────────────────────────────────────────────
90
+ /** File suffix → LSP language mapping, derived from LSP_SERVER_SPECS. */
91
+ export const suffixToLanguage = {};
92
+ for (const spec of LSP_SERVER_SPECS) {
93
+ for (const suffix of spec.fileSuffixes) {
94
+ if (!suffixToLanguage[suffix]) {
95
+ suffixToLanguage[suffix] = spec.language;
96
+ }
97
+ }
98
+ }
99
+ // ── Lookup helpers ───────────────────────────────────────────────────────────
100
+ /**
101
+ * Get the LSP language for a file based on its extension.
102
+ */
103
+ export function languageForSuffix(suffix) {
104
+ return suffixToLanguage[suffix.toLowerCase()];
105
+ }
106
+ /**
107
+ * Get all server specs for a given language.
108
+ */
109
+ export function specsForLanguage(language) {
110
+ return LSP_SERVER_SPECS.filter((s) => s.language === language);
111
+ }
112
+ /**
113
+ * Get all unique LSP languages from file suffixes.
114
+ */
115
+ export function languagesForSuffixes(suffixes) {
116
+ const langs = new Set();
117
+ for (const suffix of suffixes) {
118
+ const lang = languageForSuffix(suffix);
119
+ if (lang)
120
+ langs.add(lang);
121
+ }
122
+ return [...langs].sort();
123
+ }
124
+ // ── LSP timeouts by language ─────────────────────────────────────────────────
125
+ const LSP_TIMEOUT_BY_LANGUAGE = {
126
+ typescript: 15_000,
127
+ python: 12_000,
128
+ rust: 20_000,
129
+ go: 8_000,
130
+ json: 8_000,
131
+ yaml: 8_000,
132
+ };
133
+ export const DEFAULT_LSP_TIMEOUT_MS = 8_000;
134
+ /**
135
+ * Get the recommended LSP timeout for a language (in milliseconds).
136
+ */
137
+ export function lspTimeoutFor(language) {
138
+ return LSP_TIMEOUT_BY_LANGUAGE[language] ?? DEFAULT_LSP_TIMEOUT_MS;
139
+ }
140
+ //# sourceMappingURL=servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../lsp/servers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * pi-shazam lsp/setup — /shazam-setup command: detect + install guidance.
3
+ *
4
+ * Scans the project for supported languages, detects installed LSP servers,
5
+ * and outputs install instructions for missing ones.
6
+ *
7
+ * Ported from repomap/src/lsp.py (detect_lsp_servers and CLI output formatting).
8
+ */
9
+ import type { LspServerDetection } from "./manager.js";
10
+ export type { LspServerDetection };
11
+ /**
12
+ * Detect LSP servers for specified languages or auto-detect from project.
13
+ */
14
+ export declare function detectLspServers(projectRoot: string, languages?: string[]): LspServerDetection[];
15
+ /**
16
+ * Generate the /shazam-setup output as a formatted string.
17
+ */
18
+ export declare function generateSetupReport(projectRoot: string, languages?: string[]): string;
19
+ /**
20
+ * Get the install instructions as a simple key-value map
21
+ * for use in tool outputs.
22
+ */
23
+ export declare function getInstallInstructions(): Record<string, string[]>;
24
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../lsp/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAoEvD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAInC;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,GAClB,kBAAkB,EAAE,CAGtB;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,CAiER;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAOjE"}