yandecode 0.1.0 → 0.2.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 (222) hide show
  1. package/dist/bin.js +14 -8
  2. package/dist/bin.js.map +7 -1
  3. package/dist/chunks/chunk-23DG7PZZ.js +58 -0
  4. package/dist/chunks/chunk-23DG7PZZ.js.map +7 -0
  5. package/dist/chunks/chunk-2S6B3DDQ.js +1769 -0
  6. package/dist/chunks/chunk-2S6B3DDQ.js.map +7 -0
  7. package/dist/chunks/chunk-6J5CZVCJ.js +120 -0
  8. package/dist/chunks/chunk-6J5CZVCJ.js.map +7 -0
  9. package/dist/chunks/chunk-7L6DD2VD.js +768 -0
  10. package/dist/chunks/chunk-7L6DD2VD.js.map +7 -0
  11. package/dist/chunks/chunk-DWD37AI2.js +39 -0
  12. package/dist/chunks/chunk-DWD37AI2.js.map +7 -0
  13. package/dist/chunks/chunk-KPDBXQ62.js +62 -0
  14. package/dist/chunks/chunk-KPDBXQ62.js.map +7 -0
  15. package/dist/chunks/chunk-KVBKQXTU.js +351 -0
  16. package/dist/chunks/chunk-KVBKQXTU.js.map +7 -0
  17. package/dist/chunks/chunk-L2DDIZPI.js +53 -0
  18. package/dist/chunks/chunk-L2DDIZPI.js.map +7 -0
  19. package/dist/chunks/chunk-OIAMKDTQ.js +27 -0
  20. package/dist/chunks/chunk-OIAMKDTQ.js.map +7 -0
  21. package/dist/chunks/chunk-PUWSEWX3.js +61 -0
  22. package/dist/chunks/chunk-PUWSEWX3.js.map +7 -0
  23. package/dist/chunks/chunk-QCQC73WX.js +122 -0
  24. package/dist/chunks/chunk-QCQC73WX.js.map +7 -0
  25. package/dist/chunks/chunk-TYLH4NIC.js +39 -0
  26. package/dist/chunks/chunk-TYLH4NIC.js.map +7 -0
  27. package/dist/chunks/chunk-VKVJGBNJ.js +72 -0
  28. package/dist/chunks/chunk-VKVJGBNJ.js.map +7 -0
  29. package/dist/chunks/chunk-Y2MIXROU.js +20072 -0
  30. package/dist/chunks/chunk-Y2MIXROU.js.map +7 -0
  31. package/dist/chunks/cli-V6PJTDLM.js +3464 -0
  32. package/dist/chunks/cli-V6PJTDLM.js.map +7 -0
  33. package/dist/chunks/doctor-LLDVEPWL.js +184 -0
  34. package/dist/chunks/doctor-LLDVEPWL.js.map +7 -0
  35. package/dist/chunks/entry-YAOEX3EB.js +187 -0
  36. package/dist/chunks/entry-YAOEX3EB.js.map +7 -0
  37. package/dist/chunks/init-4ZJFCKIJ.js +46 -0
  38. package/dist/chunks/init-4ZJFCKIJ.js.map +7 -0
  39. package/dist/chunks/mcp-serve-KWKMUGWZ.js +22575 -0
  40. package/dist/chunks/mcp-serve-KWKMUGWZ.js.map +7 -0
  41. package/dist/chunks/modules-CJB5IKUJ.js +121 -0
  42. package/dist/chunks/modules-CJB5IKUJ.js.map +7 -0
  43. package/dist/chunks/runtime-3E4NIFAL.js +208 -0
  44. package/dist/chunks/runtime-3E4NIFAL.js.map +7 -0
  45. package/dist/chunks/runtime-7CRR63B5.js +395 -0
  46. package/dist/chunks/runtime-7CRR63B5.js.map +7 -0
  47. package/dist/chunks/runtime-CKMVHAU4.js +64 -0
  48. package/dist/chunks/runtime-CKMVHAU4.js.map +7 -0
  49. package/dist/chunks/runtime-CVZMWIJO.js +318 -0
  50. package/dist/chunks/runtime-CVZMWIJO.js.map +7 -0
  51. package/dist/chunks/runtime-DBNXBOAL.js +295 -0
  52. package/dist/chunks/runtime-DBNXBOAL.js.map +7 -0
  53. package/dist/chunks/runtime-EKHO2JXB.js +197 -0
  54. package/dist/chunks/runtime-EKHO2JXB.js.map +7 -0
  55. package/dist/chunks/runtime-EY6SVZYP.js +539 -0
  56. package/dist/chunks/runtime-EY6SVZYP.js.map +7 -0
  57. package/dist/chunks/runtime-UB2O2HUN.js +212 -0
  58. package/dist/chunks/runtime-UB2O2HUN.js.map +7 -0
  59. package/dist/chunks/runtime-WAFQWW4M.js +755 -0
  60. package/dist/chunks/runtime-WAFQWW4M.js.map +7 -0
  61. package/dist/chunks/runtime-ZGGF6RVA.js +271 -0
  62. package/dist/chunks/runtime-ZGGF6RVA.js.map +7 -0
  63. package/dist/chunks/status-SPIESL4F.js +38 -0
  64. package/dist/chunks/status-SPIESL4F.js.map +7 -0
  65. package/dist/chunks/uninstall-J2OWCX4A.js +54 -0
  66. package/dist/chunks/uninstall-J2OWCX4A.js.map +7 -0
  67. package/dist/chunks/update-OX5MZYQY.js +34 -0
  68. package/dist/chunks/update-OX5MZYQY.js.map +7 -0
  69. package/dist/content/agents/yandecode-reviewer.md +22 -0
  70. package/dist/content/agents/yandecode-security-reviewer.md +23 -0
  71. package/dist/content/skills/NOTICE.md +29 -0
  72. package/dist/content/skills/yandecode-code-review/SKILL.md +37 -0
  73. package/dist/content/skills/yandecode-debugging/SKILL.md +33 -0
  74. package/dist/content/skills/yandecode-instructions/SKILL.md +26 -0
  75. package/dist/content/skills/yandecode-memory/SKILL.md +36 -0
  76. package/dist/content/skills/yandecode-security-review/SKILL.md +24 -0
  77. package/dist/content/skills/yandecode-tdd/SKILL.md +38 -0
  78. package/dist/content/skills/yandecode-verification/SKILL.md +29 -0
  79. package/dist/content/skills/yandecode-workflow/SKILL.md +50 -0
  80. package/package.json +25 -19
  81. package/dist/bin.d.ts +0 -3
  82. package/dist/bin.d.ts.map +0 -1
  83. package/dist/cli.d.ts +0 -6
  84. package/dist/cli.d.ts.map +0 -1
  85. package/dist/cli.js +0 -21
  86. package/dist/cli.js.map +0 -1
  87. package/dist/commands/doctor.d.ts +0 -2
  88. package/dist/commands/doctor.d.ts.map +0 -1
  89. package/dist/commands/doctor.js +0 -19
  90. package/dist/commands/doctor.js.map +0 -1
  91. package/dist/commands/hook.d.ts +0 -2
  92. package/dist/commands/hook.d.ts.map +0 -1
  93. package/dist/commands/hook.js +0 -23
  94. package/dist/commands/hook.js.map +0 -1
  95. package/dist/commands/index-cmd.d.ts +0 -2
  96. package/dist/commands/index-cmd.d.ts.map +0 -1
  97. package/dist/commands/index-cmd.js +0 -47
  98. package/dist/commands/index-cmd.js.map +0 -1
  99. package/dist/commands/index.d.ts +0 -13
  100. package/dist/commands/index.d.ts.map +0 -1
  101. package/dist/commands/index.js +0 -15
  102. package/dist/commands/index.js.map +0 -1
  103. package/dist/commands/init.d.ts +0 -2
  104. package/dist/commands/init.d.ts.map +0 -1
  105. package/dist/commands/init.js +0 -22
  106. package/dist/commands/init.js.map +0 -1
  107. package/dist/commands/mcp.d.ts +0 -2
  108. package/dist/commands/mcp.d.ts.map +0 -1
  109. package/dist/commands/mcp.js +0 -71
  110. package/dist/commands/mcp.js.map +0 -1
  111. package/dist/commands/rag.d.ts +0 -2
  112. package/dist/commands/rag.d.ts.map +0 -1
  113. package/dist/commands/rag.js +0 -27
  114. package/dist/commands/rag.js.map +0 -1
  115. package/dist/commands/start.d.ts +0 -6
  116. package/dist/commands/start.d.ts.map +0 -1
  117. package/dist/commands/start.js +0 -76
  118. package/dist/commands/start.js.map +0 -1
  119. package/dist/commands/status.d.ts +0 -2
  120. package/dist/commands/status.d.ts.map +0 -1
  121. package/dist/commands/status.js +0 -29
  122. package/dist/commands/status.js.map +0 -1
  123. package/dist/commands/statusline.d.ts +0 -2
  124. package/dist/commands/statusline.d.ts.map +0 -1
  125. package/dist/commands/statusline.js +0 -90
  126. package/dist/commands/statusline.js.map +0 -1
  127. package/dist/commands/swarm.d.ts +0 -4
  128. package/dist/commands/swarm.d.ts.map +0 -1
  129. package/dist/commands/swarm.js +0 -48
  130. package/dist/commands/swarm.js.map +0 -1
  131. package/dist/commands/uninstall.d.ts +0 -2
  132. package/dist/commands/uninstall.d.ts.map +0 -1
  133. package/dist/commands/uninstall.js +0 -16
  134. package/dist/commands/uninstall.js.map +0 -1
  135. package/dist/context.d.ts +0 -13
  136. package/dist/context.d.ts.map +0 -1
  137. package/dist/context.js +0 -31
  138. package/dist/context.js.map +0 -1
  139. package/dist/doctor/checks.d.ts +0 -18
  140. package/dist/doctor/checks.d.ts.map +0 -1
  141. package/dist/doctor/checks.js +0 -269
  142. package/dist/doctor/checks.js.map +0 -1
  143. package/dist/hooks/handlers.d.ts +0 -21
  144. package/dist/hooks/handlers.d.ts.map +0 -1
  145. package/dist/hooks/handlers.js +0 -191
  146. package/dist/hooks/handlers.js.map +0 -1
  147. package/dist/index.d.ts +0 -9
  148. package/dist/index.d.ts.map +0 -1
  149. package/dist/index.js +0 -9
  150. package/dist/index.js.map +0 -1
  151. package/dist/integration/claude-md.d.ts +0 -6
  152. package/dist/integration/claude-md.d.ts.map +0 -1
  153. package/dist/integration/claude-md.js +0 -30
  154. package/dist/integration/claude-md.js.map +0 -1
  155. package/dist/integration/gitignore.d.ts +0 -3
  156. package/dist/integration/gitignore.d.ts.map +0 -1
  157. package/dist/integration/gitignore.js +0 -13
  158. package/dist/integration/gitignore.js.map +0 -1
  159. package/dist/integration/init.d.ts +0 -17
  160. package/dist/integration/init.d.ts.map +0 -1
  161. package/dist/integration/init.js +0 -86
  162. package/dist/integration/init.js.map +0 -1
  163. package/dist/integration/json-utils.d.ts +0 -13
  164. package/dist/integration/json-utils.d.ts.map +0 -1
  165. package/dist/integration/json-utils.js +0 -33
  166. package/dist/integration/json-utils.js.map +0 -1
  167. package/dist/integration/manifest.d.ts +0 -17
  168. package/dist/integration/manifest.d.ts.map +0 -1
  169. package/dist/integration/manifest.js +0 -26
  170. package/dist/integration/manifest.js.map +0 -1
  171. package/dist/integration/materialize.d.ts +0 -9
  172. package/dist/integration/materialize.d.ts.map +0 -1
  173. package/dist/integration/materialize.js +0 -21
  174. package/dist/integration/materialize.js.map +0 -1
  175. package/dist/integration/mcp-config.d.ts +0 -4
  176. package/dist/integration/mcp-config.d.ts.map +0 -1
  177. package/dist/integration/mcp-config.js +0 -11
  178. package/dist/integration/mcp-config.js.map +0 -1
  179. package/dist/integration/settings.d.ts +0 -7
  180. package/dist/integration/settings.d.ts.map +0 -1
  181. package/dist/integration/settings.js +0 -70
  182. package/dist/integration/settings.js.map +0 -1
  183. package/dist/integration/uninstall.d.ts +0 -10
  184. package/dist/integration/uninstall.d.ts.map +0 -1
  185. package/dist/integration/uninstall.js +0 -71
  186. package/dist/integration/uninstall.js.map +0 -1
  187. package/dist/launcher.d.ts +0 -8
  188. package/dist/launcher.d.ts.map +0 -1
  189. package/dist/launcher.js +0 -18
  190. package/dist/launcher.js.map +0 -1
  191. package/dist/mcp/server.d.ts +0 -27
  192. package/dist/mcp/server.d.ts.map +0 -1
  193. package/dist/mcp/server.js +0 -311
  194. package/dist/mcp/server.js.map +0 -1
  195. package/dist/plugin-content.d.ts +0 -21
  196. package/dist/plugin-content.d.ts.map +0 -1
  197. package/dist/plugin-content.js +0 -67
  198. package/dist/plugin-content.js.map +0 -1
  199. package/dist/rag/format.d.ts +0 -3
  200. package/dist/rag/format.d.ts.map +0 -1
  201. package/dist/rag/format.js +0 -12
  202. package/dist/rag/format.js.map +0 -1
  203. package/dist/retrieval-runtime.d.ts +0 -21
  204. package/dist/retrieval-runtime.d.ts.map +0 -1
  205. package/dist/retrieval-runtime.js +0 -47
  206. package/dist/retrieval-runtime.js.map +0 -1
  207. package/dist/status-line/git.d.ts +0 -3
  208. package/dist/status-line/git.d.ts.map +0 -1
  209. package/dist/status-line/git.js +0 -34
  210. package/dist/status-line/git.js.map +0 -1
  211. package/dist/status-line/render.d.ts +0 -29
  212. package/dist/status-line/render.d.ts.map +0 -1
  213. package/dist/status-line/render.js +0 -72
  214. package/dist/status-line/render.js.map +0 -1
  215. package/dist/swarm-runtime.d.ts +0 -11
  216. package/dist/swarm-runtime.d.ts.map +0 -1
  217. package/dist/swarm-runtime.js +0 -76
  218. package/dist/swarm-runtime.js.map +0 -1
  219. package/dist/version.d.ts +0 -2
  220. package/dist/version.d.ts.map +0 -1
  221. package/dist/version.js +0 -5
  222. package/dist/version.js.map +0 -1
@@ -0,0 +1,539 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ parseSettings
5
+ } from "./chunk-QCQC73WX.js";
6
+ import {
7
+ definitionInput2 as definitionInput,
8
+ diagnosticsInput,
9
+ lspSettings,
10
+ referencesInput2 as referencesInput
11
+ } from "./chunk-7L6DD2VD.js";
12
+ import {
13
+ fitRows
14
+ } from "./chunk-OIAMKDTQ.js";
15
+ import {
16
+ detectLanguage,
17
+ extractSymbols,
18
+ supportsSymbols
19
+ } from "./chunk-2S6B3DDQ.js";
20
+ import {
21
+ external_exports,
22
+ resolveInsideRoot,
23
+ userCacheDir
24
+ } from "./chunk-Y2MIXROU.js";
25
+
26
+ // packages/cli/src/modules/lsp/runtime.ts
27
+ import { readFileSync as readFileSync2 } from "node:fs";
28
+ import { join as join3 } from "node:path";
29
+
30
+ // packages/cli/src/modules/lsp/servers.ts
31
+ import { execFile } from "node:child_process";
32
+ import { existsSync, mkdirSync } from "node:fs";
33
+ import { delimiter, extname, join } from "node:path";
34
+ import { promisify } from "node:util";
35
+ var run = promisify(execFile);
36
+ var TS_IDS = {
37
+ ".ts": "typescript",
38
+ ".mts": "typescript",
39
+ ".cts": "typescript",
40
+ ".tsx": "typescriptreact",
41
+ ".js": "javascript",
42
+ ".mjs": "javascript",
43
+ ".cjs": "javascript",
44
+ ".jsx": "javascriptreact"
45
+ };
46
+ var SERVERS = {
47
+ typescript: {
48
+ id: "typescript",
49
+ extensions: Object.keys(TS_IDS),
50
+ packages: ["typescript-language-server@^6", "typescript@^5"],
51
+ bin: "typescript-language-server",
52
+ args: ["--stdio"],
53
+ languageIdFor: (path) => TS_IDS[extname(path)] ?? "typescript"
54
+ },
55
+ python: {
56
+ id: "python",
57
+ extensions: [".py", ".pyi"],
58
+ packages: ["pyright@^1"],
59
+ bin: "pyright-langserver",
60
+ args: ["--stdio"],
61
+ languageIdFor: () => "python"
62
+ }
63
+ };
64
+ function serverForPath(path) {
65
+ const ext = extname(path).toLowerCase();
66
+ return Object.values(SERVERS).find((s) => s.extensions.includes(ext)) ?? null;
67
+ }
68
+ var executable = (dir, bin) => {
69
+ for (const name of process.platform === "win32" ? [`${bin}.cmd`, `${bin}.exe`, bin] : [bin]) {
70
+ const candidate = join(dir, name);
71
+ if (existsSync(candidate)) return candidate;
72
+ }
73
+ return null;
74
+ };
75
+ function resolveServer(root, spec, cacheDir2) {
76
+ const project = executable(join(root, "node_modules", ".bin"), spec.bin);
77
+ if (project) return { command: project, args: spec.args, source: "project" };
78
+ for (const dir of (process.env.PATH ?? "").split(delimiter).filter(Boolean)) {
79
+ const found = executable(dir, spec.bin);
80
+ if (found) return { command: found, args: spec.args, source: "path" };
81
+ }
82
+ const managed = executable(join(cacheDir2, spec.id, "node_modules", ".bin"), spec.bin);
83
+ return managed ? { command: managed, args: spec.args, source: "managed" } : null;
84
+ }
85
+ async function installServer(spec, cacheDir2) {
86
+ const dir = join(cacheDir2, spec.id);
87
+ mkdirSync(dir, { recursive: true });
88
+ await run(
89
+ "npm",
90
+ ["install", "--no-audit", "--no-fund", "--silent", "--prefix", dir, ...spec.packages],
91
+ {
92
+ timeout: 3e5,
93
+ shell: process.platform === "win32"
94
+ }
95
+ );
96
+ const managed = executable(join(dir, "node_modules", ".bin"), spec.bin);
97
+ if (!managed)
98
+ throw new Error(`installed ${spec.packages.join(" ")} but ${spec.bin} was not found in ${dir}`);
99
+ return { command: managed, args: spec.args, source: "managed" };
100
+ }
101
+
102
+ // packages/cli/src/modules/lsp/session.ts
103
+ import { spawn } from "node:child_process";
104
+ import { readFileSync } from "node:fs";
105
+ import { join as join2, relative } from "node:path";
106
+ import { pathToFileURL, fileURLToPath } from "node:url";
107
+
108
+ // packages/cli/src/modules/lsp/jsonrpc.ts
109
+ var JsonRpcConnection = class {
110
+ constructor(child) {
111
+ this.child = child;
112
+ child.stdout.on("data", (chunk) => {
113
+ this.receive(chunk);
114
+ });
115
+ child.on("exit", (code) => {
116
+ this.fail(new Error(`language server exited (code ${code ?? "signal"})`));
117
+ });
118
+ child.on("error", (error) => {
119
+ this.fail(error);
120
+ });
121
+ }
122
+ child;
123
+ buffer = Buffer.alloc(0);
124
+ nextId = 1;
125
+ pending = /* @__PURE__ */ new Map();
126
+ notificationHandlers = /* @__PURE__ */ new Map();
127
+ requestHandlers = /* @__PURE__ */ new Map();
128
+ closed = null;
129
+ onNotification(method, handler) {
130
+ this.notificationHandlers.set(method, handler);
131
+ }
132
+ onRequest(method, handler) {
133
+ this.requestHandlers.set(method, handler);
134
+ }
135
+ request(method, params, timeoutMs = 15e3) {
136
+ if (this.closed) return Promise.reject(this.closed);
137
+ const id = this.nextId++;
138
+ return new Promise((resolve, reject) => {
139
+ const timer = setTimeout(() => {
140
+ this.pending.delete(id);
141
+ reject(new Error(`${method} timed out after ${timeoutMs} ms`));
142
+ }, timeoutMs);
143
+ this.pending.set(id, { resolve, reject, timer });
144
+ this.write({ id, method, params });
145
+ });
146
+ }
147
+ notify(method, params) {
148
+ if (!this.closed) this.write({ method, params });
149
+ }
150
+ kill() {
151
+ this.fail(new Error("connection closed"));
152
+ this.child.kill();
153
+ }
154
+ write(message) {
155
+ const body = Buffer.from(JSON.stringify({ jsonrpc: "2.0", ...message }), "utf8");
156
+ this.child.stdin.write(`Content-Length: ${body.length}\r
157
+ \r
158
+ `);
159
+ this.child.stdin.write(body);
160
+ }
161
+ receive(chunk) {
162
+ this.buffer = Buffer.concat([this.buffer, chunk]);
163
+ for (; ; ) {
164
+ const headerEnd = this.buffer.indexOf("\r\n\r\n");
165
+ if (headerEnd < 0) return;
166
+ const length = Number(
167
+ /Content-Length:\s*(\d+)/i.exec(this.buffer.subarray(0, headerEnd).toString())?.[1]
168
+ );
169
+ const start = headerEnd + 4;
170
+ if (!Number.isFinite(length) || this.buffer.length < start + length) return;
171
+ const message = JSON.parse(
172
+ this.buffer.subarray(start, start + length).toString("utf8")
173
+ );
174
+ this.buffer = this.buffer.subarray(start + length);
175
+ this.dispatch(message);
176
+ }
177
+ }
178
+ dispatch(message) {
179
+ if (message.method !== void 0 && message.id !== void 0) {
180
+ const handler = this.requestHandlers.get(message.method);
181
+ Promise.resolve(handler ? handler(message.params) : null).then(
182
+ (result) => {
183
+ this.write({ id: message.id, result: result ?? null });
184
+ },
185
+ (error) => {
186
+ this.write({ id: message.id, error: { message: String(error) } });
187
+ }
188
+ );
189
+ return;
190
+ }
191
+ if (message.method !== void 0) {
192
+ this.notificationHandlers.get(message.method)?.(message.params);
193
+ return;
194
+ }
195
+ const pending = typeof message.id === "number" ? this.pending.get(message.id) : void 0;
196
+ if (!pending) return;
197
+ clearTimeout(pending.timer);
198
+ this.pending.delete(message.id);
199
+ if (message.error) pending.reject(new Error(message.error.message));
200
+ else pending.resolve(message.result);
201
+ }
202
+ fail(error) {
203
+ if (this.closed) return;
204
+ this.closed = error;
205
+ for (const p of this.pending.values()) {
206
+ clearTimeout(p.timer);
207
+ p.reject(error);
208
+ }
209
+ this.pending.clear();
210
+ }
211
+ };
212
+
213
+ // packages/cli/src/modules/lsp/session.ts
214
+ var SEVERITY = {
215
+ 1: "error",
216
+ 2: "warning",
217
+ 3: "info",
218
+ 4: "hint"
219
+ };
220
+ function toDiagnostic(d) {
221
+ return {
222
+ line: d.range.start.line + 1,
223
+ column: d.range.start.character + 1,
224
+ severity: SEVERITY[d.severity ?? 1] ?? "error",
225
+ message: d.message,
226
+ ...d.source ? { source: d.source } : {}
227
+ };
228
+ }
229
+ var QUIET_MS = 700;
230
+ var LspSession = class _LspSession {
231
+ constructor(rpc, options) {
232
+ this.rpc = rpc;
233
+ this.options = options;
234
+ rpc.onNotification("textDocument/publishDiagnostics", (params) => {
235
+ const { uri, diagnostics } = params;
236
+ this.published.set(uri, { seq: ++this.seq, items: diagnostics });
237
+ });
238
+ rpc.onRequest(
239
+ "workspace/configuration",
240
+ (params) => params.items.map(() => null)
241
+ );
242
+ for (const method of [
243
+ "client/registerCapability",
244
+ "window/workDoneProgress/create",
245
+ "workspace/workspaceFolders"
246
+ ]) {
247
+ rpc.onRequest(method, () => null);
248
+ }
249
+ }
250
+ rpc;
251
+ options;
252
+ versions = /* @__PURE__ */ new Map();
253
+ published = /* @__PURE__ */ new Map();
254
+ seq = 0;
255
+ warm = false;
256
+ static async start(options) {
257
+ const child = spawn(options.command, [...options.args], {
258
+ cwd: options.root,
259
+ stdio: ["pipe", "pipe", "pipe"]
260
+ });
261
+ child.stderr.resume();
262
+ const session = new _LspSession(new JsonRpcConnection(child), options);
263
+ const rootUri = pathToFileURL(options.root).href;
264
+ await session.rpc.request(
265
+ "initialize",
266
+ {
267
+ processId: process.pid,
268
+ rootUri,
269
+ workspaceFolders: [{ uri: rootUri, name: "root" }],
270
+ capabilities: {
271
+ textDocument: {
272
+ synchronization: { didSave: false },
273
+ references: {},
274
+ definition: { linkSupport: true },
275
+ publishDiagnostics: {}
276
+ },
277
+ workspace: { configuration: true, workspaceFolders: true }
278
+ }
279
+ },
280
+ 6e4
281
+ );
282
+ session.rpc.notify("initialized", {});
283
+ return session;
284
+ }
285
+ uri(path) {
286
+ return pathToFileURL(join2(this.options.root, path)).href;
287
+ }
288
+ /** Opens or refreshes the file in the server from disk; returns true when the text changed. */
289
+ sync(path) {
290
+ const uri = this.uri(path);
291
+ const text = readFileSync(join2(this.options.root, path), "utf8");
292
+ const open = this.versions.get(uri);
293
+ if (!open) {
294
+ this.versions.set(uri, { version: 1, text });
295
+ this.rpc.notify("textDocument/didOpen", {
296
+ textDocument: { uri, languageId: this.options.languageIdFor(path), version: 1, text }
297
+ });
298
+ return true;
299
+ }
300
+ if (open.text === text) return false;
301
+ const version = open.version + 1;
302
+ this.versions.set(uri, { version, text });
303
+ this.rpc.notify("textDocument/didChange", {
304
+ textDocument: { uri, version },
305
+ contentChanges: [{ text }]
306
+ });
307
+ return true;
308
+ }
309
+ toPositions(result) {
310
+ const list = Array.isArray(result) ? result : result ? [result] : [];
311
+ return list.map((loc) => {
312
+ const uri = loc.targetUri ?? loc.uri;
313
+ const start = (loc.targetSelectionRange ?? loc.range).start;
314
+ return {
315
+ path: relative(this.options.root, fileURLToPath(uri)).split("\\").join("/"),
316
+ line: start.line + 1,
317
+ column: start.character + 1
318
+ };
319
+ }).sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line || a.column - b.column);
320
+ }
321
+ /**
322
+ * Servers answer from a partially loaded project right after the first didOpen (tsserver returns
323
+ * only open files). Their first publishDiagnostics for that file signals the project is loaded.
324
+ */
325
+ async warmUp(path) {
326
+ this.sync(path);
327
+ if (this.warm) return;
328
+ const uri = this.uri(path);
329
+ const deadline = Date.now() + 15e3;
330
+ while (!this.published.has(uri) && Date.now() < deadline) {
331
+ await new Promise((r) => setTimeout(r, 50));
332
+ }
333
+ this.warm = true;
334
+ }
335
+ /** 0-based position, as LSP expects. */
336
+ async references(path, line, character) {
337
+ await this.warmUp(path);
338
+ const result = await this.rpc.request("textDocument/references", {
339
+ textDocument: { uri: this.uri(path) },
340
+ position: { line, character },
341
+ context: { includeDeclaration: true }
342
+ });
343
+ return this.toPositions(result);
344
+ }
345
+ async definition(path, line, character) {
346
+ await this.warmUp(path);
347
+ const result = await this.rpc.request("textDocument/definition", {
348
+ textDocument: { uri: this.uri(path) },
349
+ position: { line, character }
350
+ });
351
+ return this.toPositions(result);
352
+ }
353
+ seqOf(uri) {
354
+ return this.published.get(uri)?.seq ?? 0;
355
+ }
356
+ /** Waits for a publish newer than `after`, then until none arrives for QUIET_MS. */
357
+ async settle(uri, after, timeoutMs) {
358
+ const deadline = Date.now() + timeoutMs;
359
+ let last = after;
360
+ let quietSince = Date.now();
361
+ while (Date.now() < deadline) {
362
+ await new Promise((r) => setTimeout(r, 50));
363
+ const current = this.seqOf(uri);
364
+ if (current !== last) {
365
+ last = current;
366
+ quietSince = Date.now();
367
+ } else if (current > after && Date.now() - quietSince >= QUIET_MS) {
368
+ return;
369
+ }
370
+ }
371
+ }
372
+ /**
373
+ * Diagnostics for the file as it is on disk now. Servers often publish in several rounds
374
+ * (syntax, then types), so after a change this waits for the stream of updates to go quiet.
375
+ */
376
+ async diagnostics(path, timeoutMs = 1e4) {
377
+ const uri = this.uri(path);
378
+ const before = this.seqOf(uri);
379
+ const changed = this.sync(path);
380
+ if (changed || before === 0) await this.settle(uri, before, timeoutMs);
381
+ return (this.published.get(uri)?.items ?? []).map(toDiagnostic);
382
+ }
383
+ async shutdown() {
384
+ try {
385
+ await this.rpc.request("shutdown", null, 2e3);
386
+ this.rpc.notify("exit", null);
387
+ } catch {
388
+ }
389
+ this.rpc.kill();
390
+ }
391
+ };
392
+
393
+ // packages/cli/src/modules/lsp/runtime.ts
394
+ var cacheDir = () => join3(userCacheDir(), "lsp");
395
+ var sessions = /* @__PURE__ */ new Map();
396
+ async function sessionFor(ctx, path) {
397
+ const spec = serverForPath(path);
398
+ if (!spec) {
399
+ throw new Error(
400
+ `no language server configured for ${path} (supported: ${Object.values(SERVERS).flatMap((s) => s.extensions).join(" ")})`
401
+ );
402
+ }
403
+ const key = `${ctx.root}\0${spec.id}`;
404
+ let session = sessions.get(key);
405
+ if (!session) {
406
+ session = (async () => {
407
+ const { autoInstall } = parseSettings("lsp", lspSettings, ctx.settings);
408
+ let server = resolveServer(ctx.root, spec, cacheDir());
409
+ if (!server && autoInstall) {
410
+ ctx.log("install", { server: spec.id });
411
+ server = await installServer(spec, cacheDir()).catch((error) => {
412
+ throw new Error(
413
+ `could not install ${spec.packages.join(" ")} (${error.message}); install it manually or run "yandecode lsp install ${spec.id}" with network access`
414
+ );
415
+ });
416
+ }
417
+ if (!server) throw new Error(`${spec.bin} not found; run "yandecode lsp install ${spec.id}"`);
418
+ return LspSession.start({
419
+ root: ctx.root,
420
+ command: server.command,
421
+ args: server.args,
422
+ languageIdFor: spec.languageIdFor
423
+ });
424
+ })();
425
+ sessions.set(key, session);
426
+ session.catch(() => sessions.delete(key));
427
+ }
428
+ return session;
429
+ }
430
+ function relativePath(ctx, path) {
431
+ resolveInsideRoot(ctx.root, path);
432
+ return path.replace(/^\.\//, "");
433
+ }
434
+ async function symbolPosition(ctx, path, namePath) {
435
+ const language = detectLanguage(path);
436
+ if (!supportsSymbols(language))
437
+ throw new Error(`cannot locate symbols in ${path}; pass line and column`);
438
+ const text = readFileSync2(join3(ctx.root, path), "utf8");
439
+ const symbols = await extractSymbols(text, language);
440
+ const symbol = symbols.find((s) => s.namePath === namePath) ?? symbols.find((s) => s.namePath.endsWith(`/${namePath}`) || s.name === namePath);
441
+ if (!symbol) throw new Error(`no symbol "${namePath}" in ${path}`);
442
+ const lineText = text.split("\n")[symbol.startLine - 1] ?? "";
443
+ const character = new RegExp(`\\b${symbol.name.replace(/[$]/g, "\\$")}\\b`).exec(lineText)?.index ?? 0;
444
+ return { line: symbol.startLine - 1, character };
445
+ }
446
+ function lineOf(ctx, path, line) {
447
+ try {
448
+ return (readFileSync2(join3(ctx.root, path), "utf8").split("\n")[line - 1] ?? "").trim().slice(0, 160);
449
+ } catch {
450
+ return "";
451
+ }
452
+ }
453
+ async function lspReferences(raw, ctx) {
454
+ const args = external_exports.object(referencesInput).parse(raw);
455
+ const path = relativePath(ctx, args.path);
456
+ const position = args.name_path ? await symbolPosition(ctx, path, args.name_path) : args.line && args.column ? { line: args.line - 1, character: args.column - 1 } : null;
457
+ if (!position) return { isError: true, text: "pass name_path, or line and column" };
458
+ const refs = await (await sessionFor(ctx, path)).references(path, position.line, position.character);
459
+ const rows = refs.map((r) => `${r.path}:${r.line}:${r.column} ${lineOf(ctx, r.path, r.line)}`);
460
+ return {
461
+ text: fitRows(`${refs.length} reference(s) (language server)`, rows, args.max_chars ?? 4e3)
462
+ };
463
+ }
464
+ async function lspDefinition(raw, ctx) {
465
+ const args = external_exports.object(definitionInput).parse(raw);
466
+ const path = relativePath(ctx, args.path);
467
+ const found = await (await sessionFor(ctx, path)).definition(path, args.line - 1, args.column - 1);
468
+ if (found.length === 0)
469
+ return { text: `No definition found at ${path}:${args.line}:${args.column}.` };
470
+ return {
471
+ text: found.map((d) => `${d.path}:${d.line}:${d.column} ${lineOf(ctx, d.path, d.line)}`).join("\n")
472
+ };
473
+ }
474
+ async function lspDiagnostics(raw, ctx) {
475
+ const args = external_exports.object(diagnosticsInput).parse(raw);
476
+ const path = relativePath(ctx, args.path);
477
+ const items = await (await sessionFor(ctx, path)).diagnostics(path);
478
+ if (items.length === 0) return { text: `${path}: no problems reported.` };
479
+ const rows = items.map(
480
+ (d) => `${path}:${d.line}:${d.column} ${d.severity} ${d.message.split("\n")[0]}${d.source ? ` (${d.source})` : ""}`
481
+ );
482
+ const errors = items.filter((d) => d.severity === "error").length;
483
+ return {
484
+ text: fitRows(
485
+ `${path}: ${errors} error(s), ${items.length - errors} other`,
486
+ rows,
487
+ args.max_chars ?? 4e3
488
+ )
489
+ };
490
+ }
491
+ var runtime = {
492
+ tools: {
493
+ lsp_references: lspReferences,
494
+ lsp_definition: lspDefinition,
495
+ lsp_diagnostics: lspDiagnostics
496
+ },
497
+ doctor: (ctx) => Promise.resolve(
498
+ Object.values(SERVERS).map((spec) => {
499
+ const server = resolveServer(ctx.root, spec, cacheDir());
500
+ return server ? { name: spec.id, status: "ok", detail: `${server.source}: ${server.command}` } : {
501
+ name: spec.id,
502
+ status: "warn",
503
+ detail: "not installed (installed on first use)",
504
+ fix: `yandecode lsp install ${spec.id}`
505
+ };
506
+ })
507
+ ),
508
+ dispose: async () => {
509
+ const all = [...sessions.values()];
510
+ sessions.clear();
511
+ await Promise.allSettled(all.map(async (s) => (await s).shutdown()));
512
+ }
513
+ };
514
+ function isLanguage(value) {
515
+ return Object.hasOwn(SERVERS, value);
516
+ }
517
+ async function runInstallCommand(language) {
518
+ if (language !== void 0 && !isLanguage(language)) {
519
+ process.stderr.write(
520
+ `unknown language "${language}" (available: ${Object.keys(SERVERS).join(", ")})
521
+ `
522
+ );
523
+ return 1;
524
+ }
525
+ const specs = language ? [SERVERS[language]] : Object.values(SERVERS);
526
+ for (const spec of specs) {
527
+ process.stdout.write(`installing ${spec.packages.join(" ")} \u2026
528
+ `);
529
+ const server = await installServer(spec, cacheDir());
530
+ process.stdout.write(` ${spec.id}: ${server.command}
531
+ `);
532
+ }
533
+ return 0;
534
+ }
535
+ export {
536
+ runInstallCommand,
537
+ runtime
538
+ };
539
+ //# sourceMappingURL=runtime-EY6SVZYP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/modules/lsp/runtime.ts", "../../src/modules/lsp/servers.ts", "../../src/modules/lsp/session.ts", "../../src/modules/lsp/jsonrpc.ts"],
4
+ "sourcesContent": ["import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { resolveInsideRoot, userCacheDir } from '@yandecode/core';\nimport { extractSymbols, supportsSymbols, detectLanguage } from '@yandecode/retrieval';\nimport { z } from 'zod';\nimport type { ModuleContext, ModuleRuntime, ToolResult } from '@cli/modules/contract';\nimport { parseSettings } from '@cli/modules/host';\nimport { fitRows } from '@cli/shared/budget';\nimport { definitionInput, diagnosticsInput, lspSettings, referencesInput } from './definition';\nimport { installServer, resolveServer, serverForPath, SERVERS, type ServerSpec } from './servers';\nimport { LspSession } from './session';\n\nconst cacheDir = (): string => join(userCacheDir(), 'lsp');\nconst sessions = new Map<string, Promise<LspSession>>();\n\nasync function sessionFor(ctx: ModuleContext, path: string): Promise<LspSession> {\n const spec = serverForPath(path);\n if (!spec) {\n throw new Error(\n `no language server configured for ${path} (supported: ${Object.values(SERVERS)\n .flatMap((s) => s.extensions)\n .join(' ')})`,\n );\n }\n const key = `${ctx.root}\\0${spec.id}`;\n let session = sessions.get(key);\n if (!session) {\n session = (async () => {\n const { autoInstall } = parseSettings('lsp', lspSettings, ctx.settings);\n let server = resolveServer(ctx.root, spec, cacheDir());\n if (!server && autoInstall) {\n ctx.log('install', { server: spec.id });\n server = await installServer(spec, cacheDir()).catch((error: unknown) => {\n throw new Error(\n `could not install ${spec.packages.join(' ')} (${(error as Error).message}); install it manually or run \"yandecode lsp install ${spec.id}\" with network access`,\n );\n });\n }\n if (!server) throw new Error(`${spec.bin} not found; run \"yandecode lsp install ${spec.id}\"`);\n return LspSession.start({\n root: ctx.root,\n command: server.command,\n args: server.args,\n languageIdFor: spec.languageIdFor,\n });\n })();\n sessions.set(key, session);\n session.catch(() => sessions.delete(key));\n }\n return session;\n}\n\nfunction relativePath(ctx: ModuleContext, path: string): string {\n resolveInsideRoot(ctx.root, path);\n return path.replace(/^\\.\\//, '');\n}\n\n/** 0-based position of a symbol's name on its declaration line. */\nasync function symbolPosition(\n ctx: ModuleContext,\n path: string,\n namePath: string,\n): Promise<{ line: number; character: number }> {\n const language = detectLanguage(path);\n if (!supportsSymbols(language))\n throw new Error(`cannot locate symbols in ${path}; pass line and column`);\n const text = readFileSync(join(ctx.root, path), 'utf8');\n const symbols = await extractSymbols(text, language!);\n const symbol =\n symbols.find((s) => s.namePath === namePath) ??\n symbols.find((s) => s.namePath.endsWith(`/${namePath}`) || s.name === namePath);\n if (!symbol) throw new Error(`no symbol \"${namePath}\" in ${path}`);\n const lineText = text.split('\\n')[symbol.startLine - 1] ?? '';\n const character =\n new RegExp(`\\\\b${symbol.name.replace(/[$]/g, '\\\\$')}\\\\b`).exec(lineText)?.index ?? 0;\n return { line: symbol.startLine - 1, character };\n}\n\nfunction lineOf(ctx: ModuleContext, path: string, line: number): string {\n try {\n return (readFileSync(join(ctx.root, path), 'utf8').split('\\n')[line - 1] ?? '')\n .trim()\n .slice(0, 160);\n } catch {\n return '';\n }\n}\n\nasync function lspReferences(\n raw: Record<string, unknown>,\n ctx: ModuleContext,\n): Promise<ToolResult> {\n const args = z.object(referencesInput).parse(raw);\n const path = relativePath(ctx, args.path);\n const position = args.name_path\n ? await symbolPosition(ctx, path, args.name_path)\n : args.line && args.column\n ? { line: args.line - 1, character: args.column - 1 }\n : null;\n if (!position) return { isError: true, text: 'pass name_path, or line and column' };\n const refs = await (\n await sessionFor(ctx, path)\n ).references(path, position.line, position.character);\n const rows = refs.map((r) => `${r.path}:${r.line}:${r.column} ${lineOf(ctx, r.path, r.line)}`);\n return {\n text: fitRows(`${refs.length} reference(s) (language server)`, rows, args.max_chars ?? 4_000),\n };\n}\n\nasync function lspDefinition(\n raw: Record<string, unknown>,\n ctx: ModuleContext,\n): Promise<ToolResult> {\n const args = z.object(definitionInput).parse(raw);\n const path = relativePath(ctx, args.path);\n const found = await (\n await sessionFor(ctx, path)\n ).definition(path, args.line - 1, args.column - 1);\n if (found.length === 0)\n return { text: `No definition found at ${path}:${args.line}:${args.column}.` };\n return {\n text: found\n .map((d) => `${d.path}:${d.line}:${d.column} ${lineOf(ctx, d.path, d.line)}`)\n .join('\\n'),\n };\n}\n\nasync function lspDiagnostics(\n raw: Record<string, unknown>,\n ctx: ModuleContext,\n): Promise<ToolResult> {\n const args = z.object(diagnosticsInput).parse(raw);\n const path = relativePath(ctx, args.path);\n const items = await (await sessionFor(ctx, path)).diagnostics(path);\n if (items.length === 0) return { text: `${path}: no problems reported.` };\n const rows = items.map(\n (d) =>\n `${path}:${d.line}:${d.column} ${d.severity} ${d.message.split('\\n')[0]}${d.source ? ` (${d.source})` : ''}`,\n );\n const errors = items.filter((d) => d.severity === 'error').length;\n return {\n text: fitRows(\n `${path}: ${errors} error(s), ${items.length - errors} other`,\n rows,\n args.max_chars ?? 4_000,\n ),\n };\n}\n\nexport const runtime: ModuleRuntime = {\n tools: {\n lsp_references: lspReferences,\n lsp_definition: lspDefinition,\n lsp_diagnostics: lspDiagnostics,\n },\n doctor: (ctx) =>\n Promise.resolve(\n Object.values(SERVERS).map((spec: ServerSpec) => {\n const server = resolveServer(ctx.root, spec, cacheDir());\n return server\n ? { name: spec.id, status: 'ok' as const, detail: `${server.source}: ${server.command}` }\n : {\n name: spec.id,\n status: 'warn' as const,\n detail: 'not installed (installed on first use)',\n fix: `yandecode lsp install ${spec.id}`,\n };\n }),\n ),\n dispose: async () => {\n const all = [...sessions.values()];\n sessions.clear();\n await Promise.allSettled(all.map(async (s) => (await s).shutdown()));\n },\n};\n\nfunction isLanguage(value: string): value is keyof typeof SERVERS {\n return Object.hasOwn(SERVERS, value);\n}\n\nexport async function runInstallCommand(language?: string): Promise<number> {\n if (language !== undefined && !isLanguage(language)) {\n process.stderr.write(\n `unknown language \"${language}\" (available: ${Object.keys(SERVERS).join(', ')})\\n`,\n );\n return 1;\n }\n const specs: ServerSpec[] = language ? [SERVERS[language]] : Object.values(SERVERS);\n for (const spec of specs) {\n process.stdout.write(`installing ${spec.packages.join(' ')} \u2026\\n`);\n const server = await installServer(spec, cacheDir());\n process.stdout.write(` ${spec.id}: ${server.command}\\n`);\n }\n return 0;\n}\n", "import { execFile } from 'node:child_process';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { delimiter, extname, join } from 'node:path';\nimport { promisify } from 'node:util';\n\nconst run = promisify(execFile);\n\nexport interface ServerSpec {\n id: string;\n extensions: readonly string[];\n /** npm packages to install for a managed copy. */\n packages: readonly string[];\n bin: string;\n args: readonly string[];\n languageIdFor: (path: string) => string;\n}\n\nexport interface ServerCommand {\n command: string;\n args: readonly string[];\n source: 'project' | 'path' | 'managed';\n}\n\nconst TS_IDS: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascriptreact',\n};\n\nexport const SERVERS = {\n typescript: {\n id: 'typescript',\n extensions: Object.keys(TS_IDS),\n packages: ['typescript-language-server@^6', 'typescript@^5'],\n bin: 'typescript-language-server',\n args: ['--stdio'],\n languageIdFor: (path: string) => TS_IDS[extname(path)] ?? 'typescript',\n },\n python: {\n id: 'python',\n extensions: ['.py', '.pyi'],\n packages: ['pyright@^1'],\n bin: 'pyright-langserver',\n args: ['--stdio'],\n languageIdFor: () => 'python',\n },\n} satisfies Record<string, ServerSpec>;\n\nexport function serverForPath(path: string): ServerSpec | null {\n const ext = extname(path).toLowerCase();\n return Object.values(SERVERS).find((s) => s.extensions.includes(ext)) ?? null;\n}\n\nconst executable = (dir: string, bin: string): string | null => {\n for (const name of process.platform === 'win32' ? [`${bin}.cmd`, `${bin}.exe`, bin] : [bin]) {\n const candidate = join(dir, name);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n};\n\n/** Project-local binary first, then PATH, then the copy YandeCode manages in its cache. */\nexport function resolveServer(\n root: string,\n spec: ServerSpec,\n cacheDir: string,\n): ServerCommand | null {\n const project = executable(join(root, 'node_modules', '.bin'), spec.bin);\n if (project) return { command: project, args: spec.args, source: 'project' };\n for (const dir of (process.env.PATH ?? '').split(delimiter).filter(Boolean)) {\n const found = executable(dir, spec.bin);\n if (found) return { command: found, args: spec.args, source: 'path' };\n }\n const managed = executable(join(cacheDir, spec.id, 'node_modules', '.bin'), spec.bin);\n return managed ? { command: managed, args: spec.args, source: 'managed' } : null;\n}\n\n/** Installs the server into `<cacheDir>/<id>` with npm (needs registry access once). */\nexport async function installServer(spec: ServerSpec, cacheDir: string): Promise<ServerCommand> {\n const dir = join(cacheDir, spec.id);\n mkdirSync(dir, { recursive: true });\n await run(\n 'npm',\n ['install', '--no-audit', '--no-fund', '--silent', '--prefix', dir, ...spec.packages],\n {\n timeout: 300_000,\n shell: process.platform === 'win32',\n },\n );\n const managed = executable(join(dir, 'node_modules', '.bin'), spec.bin);\n if (!managed)\n throw new Error(`installed ${spec.packages.join(' ')} but ${spec.bin} was not found in ${dir}`);\n return { command: managed, args: spec.args, source: 'managed' };\n}\n", "import { spawn } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport { pathToFileURL, fileURLToPath } from 'node:url';\nimport { JsonRpcConnection } from './jsonrpc';\n\nexport interface Position {\n path: string;\n /** 1-based. */\n line: number;\n /** 1-based. */\n column: number;\n}\n\nexport interface Diagnostic {\n line: number;\n column: number;\n severity: 'error' | 'warning' | 'info' | 'hint';\n message: string;\n source?: string;\n}\n\ninterface LspRange {\n start: { line: number; character: number };\n}\ninterface LspLocation {\n uri?: string;\n range?: LspRange;\n targetUri?: string;\n targetSelectionRange?: LspRange;\n}\ninterface LspDiagnostic {\n range: LspRange;\n severity?: number;\n message: string;\n source?: string;\n}\n\nconst SEVERITY: Readonly<Record<number, Diagnostic['severity']>> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nfunction toDiagnostic(d: LspDiagnostic): Diagnostic {\n return {\n line: d.range.start.line + 1,\n column: d.range.start.character + 1,\n severity: SEVERITY[d.severity ?? 1] ?? 'error',\n message: d.message,\n ...(d.source ? { source: d.source } : {}),\n };\n}\nconst QUIET_MS = 700;\n\nexport interface SessionOptions {\n root: string;\n command: string;\n args: readonly string[];\n languageIdFor: (path: string) => string;\n}\n\n/** One running language server for a project root. Files are synced from disk before each query. */\nexport class LspSession {\n private readonly versions = new Map<string, { version: number; text: string }>();\n private readonly published = new Map<string, { seq: number; items: LspDiagnostic[] }>();\n private seq = 0;\n private warm = false;\n\n private constructor(\n private readonly rpc: JsonRpcConnection,\n private readonly options: SessionOptions,\n ) {\n rpc.onNotification('textDocument/publishDiagnostics', (params) => {\n const { uri, diagnostics } = params as { uri: string; diagnostics: LspDiagnostic[] };\n this.published.set(uri, { seq: ++this.seq, items: diagnostics });\n });\n rpc.onRequest('workspace/configuration', (params) =>\n (params as { items: unknown[] }).items.map(() => null),\n );\n for (const method of [\n 'client/registerCapability',\n 'window/workDoneProgress/create',\n 'workspace/workspaceFolders',\n ]) {\n rpc.onRequest(method, () => null);\n }\n }\n\n static async start(options: SessionOptions): Promise<LspSession> {\n const child = spawn(options.command, [...options.args], {\n cwd: options.root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n child.stderr.resume();\n const session = new LspSession(new JsonRpcConnection(child), options);\n const rootUri = pathToFileURL(options.root).href;\n await session.rpc.request(\n 'initialize',\n {\n processId: process.pid,\n rootUri,\n workspaceFolders: [{ uri: rootUri, name: 'root' }],\n capabilities: {\n textDocument: {\n synchronization: { didSave: false },\n references: {},\n definition: { linkSupport: true },\n publishDiagnostics: {},\n },\n workspace: { configuration: true, workspaceFolders: true },\n },\n },\n 60_000,\n );\n session.rpc.notify('initialized', {});\n return session;\n }\n\n private uri(path: string): string {\n return pathToFileURL(join(this.options.root, path)).href;\n }\n\n /** Opens or refreshes the file in the server from disk; returns true when the text changed. */\n private sync(path: string): boolean {\n const uri = this.uri(path);\n const text = readFileSync(join(this.options.root, path), 'utf8');\n const open = this.versions.get(uri);\n if (!open) {\n this.versions.set(uri, { version: 1, text });\n this.rpc.notify('textDocument/didOpen', {\n textDocument: { uri, languageId: this.options.languageIdFor(path), version: 1, text },\n });\n return true;\n }\n if (open.text === text) return false;\n const version = open.version + 1;\n this.versions.set(uri, { version, text });\n this.rpc.notify('textDocument/didChange', {\n textDocument: { uri, version },\n contentChanges: [{ text }],\n });\n return true;\n }\n\n private toPositions(result: unknown): Position[] {\n const list = (Array.isArray(result) ? result : result ? [result] : []) as LspLocation[];\n return list\n .map((loc) => {\n const uri = loc.targetUri ?? loc.uri!;\n const start = (loc.targetSelectionRange ?? loc.range)!.start;\n return {\n path: relative(this.options.root, fileURLToPath(uri)).split('\\\\').join('/'),\n line: start.line + 1,\n column: start.character + 1,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line || a.column - b.column);\n }\n\n /**\n * Servers answer from a partially loaded project right after the first didOpen (tsserver returns\n * only open files). Their first publishDiagnostics for that file signals the project is loaded.\n */\n private async warmUp(path: string): Promise<void> {\n this.sync(path);\n if (this.warm) return;\n const uri = this.uri(path);\n const deadline = Date.now() + 15_000;\n while (!this.published.has(uri) && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 50));\n }\n this.warm = true;\n }\n\n /** 0-based position, as LSP expects. */\n async references(path: string, line: number, character: number): Promise<Position[]> {\n await this.warmUp(path);\n const result = await this.rpc.request('textDocument/references', {\n textDocument: { uri: this.uri(path) },\n position: { line, character },\n context: { includeDeclaration: true },\n });\n return this.toPositions(result);\n }\n\n async definition(path: string, line: number, character: number): Promise<Position[]> {\n await this.warmUp(path);\n const result = await this.rpc.request('textDocument/definition', {\n textDocument: { uri: this.uri(path) },\n position: { line, character },\n });\n return this.toPositions(result);\n }\n\n private seqOf(uri: string): number {\n return this.published.get(uri)?.seq ?? 0;\n }\n\n /** Waits for a publish newer than `after`, then until none arrives for QUIET_MS. */\n private async settle(uri: string, after: number, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let last = after;\n let quietSince = Date.now();\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 50));\n const current = this.seqOf(uri);\n if (current !== last) {\n last = current;\n quietSince = Date.now();\n } else if (current > after && Date.now() - quietSince >= QUIET_MS) {\n return;\n }\n }\n }\n\n /**\n * Diagnostics for the file as it is on disk now. Servers often publish in several rounds\n * (syntax, then types), so after a change this waits for the stream of updates to go quiet.\n */\n async diagnostics(path: string, timeoutMs = 10_000): Promise<Diagnostic[]> {\n const uri = this.uri(path);\n const before = this.seqOf(uri);\n const changed = this.sync(path);\n if (changed || before === 0) await this.settle(uri, before, timeoutMs);\n return (this.published.get(uri)?.items ?? []).map(toDiagnostic);\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.rpc.request('shutdown', null, 2_000);\n this.rpc.notify('exit', null);\n } catch {\n // Already gone or unresponsive; kill below.\n }\n this.rpc.kill();\n }\n}\n", "import type { ChildProcessWithoutNullStreams } from 'node:child_process';\n\ninterface Pending {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\ninterface Message {\n id?: number | string;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { message: string };\n}\n\ntype Handler = (params: unknown) => unknown;\n\n/** JSON-RPC 2.0 over an LSP stdio stream (Content-Length framing). */\nexport class JsonRpcConnection {\n private buffer = Buffer.alloc(0);\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly notificationHandlers = new Map<string, Handler>();\n private readonly requestHandlers = new Map<string, Handler>();\n private closed: Error | null = null;\n\n constructor(private readonly child: ChildProcessWithoutNullStreams) {\n child.stdout.on('data', (chunk: Buffer) => {\n this.receive(chunk);\n });\n child.on('exit', (code) => {\n this.fail(new Error(`language server exited (code ${code ?? 'signal'})`));\n });\n child.on('error', (error) => {\n this.fail(error);\n });\n }\n\n onNotification(method: string, handler: Handler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n onRequest(method: string, handler: Handler): void {\n this.requestHandlers.set(method, handler);\n }\n\n request<T>(method: string, params: unknown, timeoutMs = 15_000): Promise<T> {\n if (this.closed) return Promise.reject(this.closed);\n const id = this.nextId++;\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`${method} timed out after ${timeoutMs} ms`));\n }, timeoutMs);\n this.pending.set(id, { resolve: resolve as (v: unknown) => void, reject, timer });\n this.write({ id, method, params });\n });\n }\n\n notify(method: string, params: unknown): void {\n if (!this.closed) this.write({ method, params });\n }\n\n kill(): void {\n this.fail(new Error('connection closed'));\n this.child.kill();\n }\n\n private write(message: Message): void {\n const body = Buffer.from(JSON.stringify({ jsonrpc: '2.0', ...message }), 'utf8');\n this.child.stdin.write(`Content-Length: ${body.length}\\r\\n\\r\\n`);\n this.child.stdin.write(body);\n }\n\n private receive(chunk: Buffer): void {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const headerEnd = this.buffer.indexOf('\\r\\n\\r\\n');\n if (headerEnd < 0) return;\n const length = Number(\n /Content-Length:\\s*(\\d+)/i.exec(this.buffer.subarray(0, headerEnd).toString())?.[1],\n );\n const start = headerEnd + 4;\n if (!Number.isFinite(length) || this.buffer.length < start + length) return;\n const message = JSON.parse(\n this.buffer.subarray(start, start + length).toString('utf8'),\n ) as Message;\n this.buffer = this.buffer.subarray(start + length);\n this.dispatch(message);\n }\n }\n\n private dispatch(message: Message): void {\n if (message.method !== undefined && message.id !== undefined) {\n const handler = this.requestHandlers.get(message.method);\n Promise.resolve(handler ? handler(message.params) : null).then(\n (result) => {\n this.write({ id: message.id!, result: result ?? null });\n },\n (error: unknown) => {\n this.write({ id: message.id!, error: { message: String(error) } });\n },\n );\n return;\n }\n if (message.method !== undefined) {\n this.notificationHandlers.get(message.method)?.(message.params);\n return;\n }\n const pending = typeof message.id === 'number' ? this.pending.get(message.id) : undefined;\n if (!pending) return;\n clearTimeout(pending.timer);\n this.pending.delete(message.id as number);\n if (message.error) pending.reject(new Error(message.error.message));\n else pending.resolve(message.result);\n }\n\n private fail(error: Error): void {\n if (this.closed) return;\n this.closed = error;\n for (const p of this.pending.values()) {\n clearTimeout(p.timer);\n p.reject(error);\n }\n this.pending.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["readFileSync", "join", "cacheDir", "join", "join", "join", "readFileSync"]
7
+ }