noumen 0.1.0 → 0.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 (127) hide show
  1. package/README.md +846 -51
  2. package/dist/a2a/index.d.ts +148 -0
  3. package/dist/a2a/index.js +579 -0
  4. package/dist/a2a/index.js.map +1 -0
  5. package/dist/acp/index.d.ts +129 -0
  6. package/dist/acp/index.js +498 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/agent-1nFVUP9E.d.ts +1332 -0
  9. package/dist/cache-DsRqxx6v.d.ts +38 -0
  10. package/dist/chunk-3HEYCV26.js +10 -0
  11. package/dist/chunk-3HEYCV26.js.map +1 -0
  12. package/dist/chunk-3SK5GCI6.js +75 -0
  13. package/dist/chunk-3SK5GCI6.js.map +1 -0
  14. package/dist/chunk-42PHHZUA.js +132 -0
  15. package/dist/chunk-42PHHZUA.js.map +1 -0
  16. package/dist/chunk-4HW6LN6D.js +10365 -0
  17. package/dist/chunk-4HW6LN6D.js.map +1 -0
  18. package/dist/chunk-4SQA2UCV.js +26 -0
  19. package/dist/chunk-4SQA2UCV.js.map +1 -0
  20. package/dist/chunk-5GEX6ZSB.js +179 -0
  21. package/dist/chunk-5GEX6ZSB.js.map +1 -0
  22. package/dist/chunk-5JN4SPI7.js +94 -0
  23. package/dist/chunk-5JN4SPI7.js.map +1 -0
  24. package/dist/chunk-AMYIJSAZ.js +57 -0
  25. package/dist/chunk-AMYIJSAZ.js.map +1 -0
  26. package/dist/chunk-BZSFUEWM.js +43 -0
  27. package/dist/chunk-BZSFUEWM.js.map +1 -0
  28. package/dist/chunk-CS6WNDCF.js +171 -0
  29. package/dist/chunk-CS6WNDCF.js.map +1 -0
  30. package/dist/chunk-D43BWEZA.js +346 -0
  31. package/dist/chunk-D43BWEZA.js.map +1 -0
  32. package/dist/chunk-DGUM43GV.js +11 -0
  33. package/dist/chunk-DGUM43GV.js.map +1 -0
  34. package/dist/chunk-EKOGVTBT.js +472 -0
  35. package/dist/chunk-EKOGVTBT.js.map +1 -0
  36. package/dist/chunk-HEQQQGK5.js +131 -0
  37. package/dist/chunk-HEQQQGK5.js.map +1 -0
  38. package/dist/chunk-HL6JCRZJ.js +3112 -0
  39. package/dist/chunk-HL6JCRZJ.js.map +1 -0
  40. package/dist/chunk-JACGEMTF.js +43 -0
  41. package/dist/chunk-JACGEMTF.js.map +1 -0
  42. package/dist/chunk-JX7CLUCV.js +21 -0
  43. package/dist/chunk-JX7CLUCV.js.map +1 -0
  44. package/dist/chunk-KXDB56YW.js +39 -0
  45. package/dist/chunk-KXDB56YW.js.map +1 -0
  46. package/dist/chunk-L3L3FG5T.js +16 -0
  47. package/dist/chunk-L3L3FG5T.js.map +1 -0
  48. package/dist/chunk-OGXNFXFA.js +196 -0
  49. package/dist/chunk-OGXNFXFA.js.map +1 -0
  50. package/dist/chunk-UVSSQBDY.js +192 -0
  51. package/dist/chunk-UVSSQBDY.js.map +1 -0
  52. package/dist/chunk-Y45R3PQL.js +684 -0
  53. package/dist/chunk-Y45R3PQL.js.map +1 -0
  54. package/dist/cli/index.d.ts +1 -0
  55. package/dist/cli/index.js +874 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/client/index.d.ts +64 -0
  58. package/dist/client/index.js +409 -0
  59. package/dist/client/index.js.map +1 -0
  60. package/dist/client-CRRO2376.js +10 -0
  61. package/dist/client-CRRO2376.js.map +1 -0
  62. package/dist/headless-FFU2DESQ.js +142 -0
  63. package/dist/headless-FFU2DESQ.js.map +1 -0
  64. package/dist/history-snip-64GYP4ZL.js +12 -0
  65. package/dist/history-snip-64GYP4ZL.js.map +1 -0
  66. package/dist/index.d.ts +1459 -422
  67. package/dist/index.js +398 -1757
  68. package/dist/index.js.map +1 -1
  69. package/dist/jsonrpc/index.d.ts +54 -0
  70. package/dist/jsonrpc/index.js +34 -0
  71. package/dist/jsonrpc/index.js.map +1 -0
  72. package/dist/lsp/index.d.ts +36 -0
  73. package/dist/lsp/index.js +16 -0
  74. package/dist/lsp/index.js.map +1 -0
  75. package/dist/lsp-PS3BWIHC.js +8 -0
  76. package/dist/lsp-PS3BWIHC.js.map +1 -0
  77. package/dist/manager-DLXK63XC.js +8 -0
  78. package/dist/manager-DLXK63XC.js.map +1 -0
  79. package/dist/mcp/index.d.ts +111 -0
  80. package/dist/mcp/index.js +105 -0
  81. package/dist/mcp/index.js.map +1 -0
  82. package/dist/mcp-auth-AEI2R4ZC.js +9 -0
  83. package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
  84. package/dist/provider-factory-KCLIF34X.js +20 -0
  85. package/dist/provider-factory-KCLIF34X.js.map +1 -0
  86. package/dist/providers/anthropic.d.ts +19 -0
  87. package/dist/providers/anthropic.js +35 -0
  88. package/dist/providers/anthropic.js.map +1 -0
  89. package/dist/providers/bedrock.d.ts +39 -0
  90. package/dist/providers/bedrock.js +56 -0
  91. package/dist/providers/bedrock.js.map +1 -0
  92. package/dist/providers/gemini.d.ts +17 -0
  93. package/dist/providers/gemini.js +262 -0
  94. package/dist/providers/gemini.js.map +1 -0
  95. package/dist/providers/ollama.d.ts +13 -0
  96. package/dist/providers/ollama.js +20 -0
  97. package/dist/providers/ollama.js.map +1 -0
  98. package/dist/providers/openai.d.ts +21 -0
  99. package/dist/providers/openai.js +9 -0
  100. package/dist/providers/openai.js.map +1 -0
  101. package/dist/providers/openrouter.d.ts +16 -0
  102. package/dist/providers/openrouter.js +24 -0
  103. package/dist/providers/openrouter.js.map +1 -0
  104. package/dist/providers/vertex.d.ts +42 -0
  105. package/dist/providers/vertex.js +67 -0
  106. package/dist/providers/vertex.js.map +1 -0
  107. package/dist/render-GRN4ZSSW.js +14 -0
  108. package/dist/render-GRN4ZSSW.js.map +1 -0
  109. package/dist/resolve-4JA2BBDA.js +14 -0
  110. package/dist/resolve-4JA2BBDA.js.map +1 -0
  111. package/dist/server/index.d.ts +143 -0
  112. package/dist/server/index.js +695 -0
  113. package/dist/server/index.js.map +1 -0
  114. package/dist/server-CHMxuWKq.d.ts +96 -0
  115. package/dist/spinner-OJNR6NFO.js +8 -0
  116. package/dist/spinner-OJNR6NFO.js.map +1 -0
  117. package/dist/types-2kTLUCnD.d.ts +107 -0
  118. package/dist/types-CD0rUKKT.d.ts +109 -0
  119. package/dist/types-LrU4LRmX.d.ts +575 -0
  120. package/dist/types-NIyVwQ4h.d.ts +109 -0
  121. package/dist/types-QwfylltH.d.ts +71 -0
  122. package/dist/types-RPKUTu1k.d.ts +645 -0
  123. package/dist/uuid-RVN2T26F.js +8 -0
  124. package/dist/uuid-RVN2T26F.js.map +1 -0
  125. package/dist/zod-7YXKWYMC.js +12 -0
  126. package/dist/zod-7YXKWYMC.js.map +1 -0
  127. package/package.json +141 -7
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/openai.ts"],"sourcesContent":["import OpenAI from \"openai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface OpenAIProviderOptions {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n defaultHeaders?: Record<string, string | undefined>;\n /** When true, omits `stream_options` that some OpenAI-compatible endpoints don't support. */\n compatMode?: boolean;\n}\n\nconst O_SERIES_PATTERN = /^o[1-9]/;\n\nexport class OpenAIProvider implements AIProvider {\n private client: OpenAI;\n private defaultModel: string;\n protected compatMode: boolean;\n\n constructor(opts: OpenAIProviderOptions) {\n this.client = new OpenAI({\n apiKey: opts.apiKey ?? \"not-needed\",\n baseURL: opts.baseURL,\n defaultHeaders: opts.defaultHeaders,\n maxRetries: 0,\n });\n this.defaultModel = opts.model ?? \"gpt-5.4\";\n this.compatMode = opts.compatMode ?? false;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const messages = this.buildMessages(params.system, params.messages);\n const model = params.model ?? this.defaultModel;\n const isOSeries = O_SERIES_PATTERN.test(model);\n\n const createParams: OpenAI.ChatCompletionCreateParamsStreaming = {\n model,\n messages: messages as unknown as OpenAI.ChatCompletionMessageParam[],\n tools: params.tools?.map((t) => ({\n type: \"function\" as const,\n function: t.function,\n })),\n stream: true,\n ...(this.compatMode ? {} : { stream_options: { include_usage: true } }),\n };\n\n if (isOSeries) {\n (createParams as unknown as Record<string, unknown>).max_completion_tokens = params.max_tokens ?? 16384;\n if (params.thinking?.type === \"enabled\") {\n (createParams as unknown as Record<string, unknown>).reasoning_effort = \"high\";\n }\n } else {\n createParams.max_tokens = params.max_tokens;\n createParams.temperature = params.temperature;\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_schema\",\n json_schema: {\n name: params.outputFormat.name ?? \"response\",\n schema: params.outputFormat.schema,\n strict: params.outputFormat.strict ?? false,\n },\n };\n } else if (params.outputFormat?.type === \"json_object\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_object\",\n };\n }\n\n try {\n const stream = await this.client.chat.completions.create(createParams, {\n ...(params.signal ? { signal: params.signal } : {}),\n });\n\n for await (const chunk of stream) {\n const usage = chunk.usage;\n let mappedUsage: ChatStreamChunk[\"usage\"] | undefined;\n if (usage) {\n const u = usage as unknown as Record<string, unknown>;\n const promptDetails = u.prompt_tokens_details as Record<string, unknown> | undefined;\n const completionDetails = u.completion_tokens_details as Record<string, unknown> | undefined;\n mappedUsage = {\n prompt_tokens: usage.prompt_tokens,\n completion_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n cache_read_tokens: promptDetails?.cached_tokens as number | undefined,\n cache_creation_tokens: promptDetails?.cache_creation_tokens as number | undefined,\n thinking_tokens: completionDetails?.reasoning_tokens as number | undefined,\n };\n }\n\n const choices = chunk.choices ?? [];\n if (choices.length === 0 && mappedUsage) {\n yield { id: chunk.id, model: chunk.model, choices: [], usage: mappedUsage };\n continue;\n }\n\n yield {\n id: chunk.id,\n model: chunk.model,\n choices: choices.map((c) => ({\n index: c.index,\n delta: {\n role: c.delta.role as \"assistant\" | undefined,\n content: c.delta.content,\n thinking_content: (c.delta as Record<string, unknown>).reasoning_content as string | undefined,\n tool_calls: c.delta.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n })),\n },\n finish_reason: c.finish_reason,\n })),\n usage: mappedUsage,\n };\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; headers?: Record<string, string> & { get?(k: string): string | null } };\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: apiErr.status,\n retryAfter: apiErr.headers?.get?.(\"retry-after\") ?? apiErr.headers?.[\"retry-after\"] ?? undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToOpenAI(\n parts: ContentPart[],\n ): Array<Record<string, unknown>> {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: { url: `data:${part.media_type};base64,${part.data}` },\n };\n }\n // image_url\n return { type: \"image_url\", image_url: { url: part.url } };\n });\n }\n\n private buildMessages(\n system: string | undefined,\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n if (system) {\n result.push({ role: \"system\", content: system });\n }\n for (const msg of messages) {\n if (msg.role === \"tool\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({\n role: \"tool\",\n tool_call_id: msg.tool_call_id,\n content,\n });\n } else if (msg.role === \"assistant\") {\n const entry: Record<string, unknown> = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls) {\n entry.tool_calls = msg.tool_calls;\n }\n result.push(entry);\n } else if (msg.role === \"user\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({ role: \"user\", content });\n } else {\n result.push({ role: msg.role, content: msg.content });\n }\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,346 @@
1
+ // src/lsp/client.ts
2
+ import { spawn } from "child_process";
3
+ import {
4
+ createMessageConnection,
5
+ StreamMessageReader,
6
+ StreamMessageWriter
7
+ } from "vscode-jsonrpc/node.js";
8
+ var LspClient = class {
9
+ process = null;
10
+ connection = null;
11
+ config;
12
+ _state = "stopped";
13
+ capabilities = {};
14
+ diagnosticHandler;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ get state() {
19
+ return this._state;
20
+ }
21
+ onDiagnostics(handler) {
22
+ this.diagnosticHandler = handler;
23
+ }
24
+ async start(rootUri) {
25
+ if (this._state === "running") return;
26
+ this._state = "starting";
27
+ try {
28
+ this.process = spawn(this.config.command, this.config.args ?? [], {
29
+ stdio: ["pipe", "pipe", "pipe"],
30
+ env: { ...process.env, ...this.config.env }
31
+ });
32
+ if (!this.process.stdout || !this.process.stdin) {
33
+ throw new Error("Failed to get stdio streams from LSP server");
34
+ }
35
+ this.connection = createMessageConnection(
36
+ new StreamMessageReader(this.process.stdout),
37
+ new StreamMessageWriter(this.process.stdin)
38
+ );
39
+ this.connection.onNotification(
40
+ "textDocument/publishDiagnostics",
41
+ (params) => {
42
+ if (!this.diagnosticHandler) return;
43
+ const filePath = params.uri.startsWith("file://") ? params.uri.slice(7) : params.uri;
44
+ const mapped = params.diagnostics.map((d) => ({
45
+ filePath,
46
+ line: d.range.start.line + 1,
47
+ character: d.range.start.character + 1,
48
+ severity: mapSeverity(d.severity),
49
+ message: d.message,
50
+ source: d.source
51
+ }));
52
+ this.diagnosticHandler(mapped);
53
+ }
54
+ );
55
+ this.connection.listen();
56
+ const initResult = await this.connection.sendRequest(
57
+ "initialize",
58
+ {
59
+ processId: process.pid,
60
+ capabilities: {
61
+ textDocument: {
62
+ synchronization: { didSave: true },
63
+ publishDiagnostics: {},
64
+ hover: { contentFormat: ["plaintext"] },
65
+ definition: { linkSupport: true },
66
+ references: {},
67
+ documentSymbol: { hierarchicalDocumentSymbolSupport: true }
68
+ }
69
+ },
70
+ rootUri,
71
+ workspaceFolders: [{ uri: rootUri, name: "workspace" }]
72
+ }
73
+ );
74
+ this.capabilities = initResult?.capabilities ?? {};
75
+ this.connection.sendNotification("initialized", {});
76
+ this._state = "running";
77
+ this.process.on("exit", () => {
78
+ this._state = "stopped";
79
+ this.connection = null;
80
+ this.process = null;
81
+ });
82
+ } catch (err) {
83
+ this._state = "error";
84
+ this.stop();
85
+ throw err;
86
+ }
87
+ }
88
+ async stop() {
89
+ if (this.connection) {
90
+ try {
91
+ await this.connection.sendRequest(
92
+ "shutdown",
93
+ null
94
+ );
95
+ this.connection.sendNotification("exit");
96
+ } catch {
97
+ }
98
+ this.connection.dispose();
99
+ this.connection = null;
100
+ }
101
+ if (this.process) {
102
+ this.process.kill();
103
+ this.process = null;
104
+ }
105
+ this._state = "stopped";
106
+ }
107
+ async sendRequest(method, params) {
108
+ if (!this.connection || this._state !== "running") {
109
+ throw new Error(`LSP server not running (state: ${this._state})`);
110
+ }
111
+ return this.connection.sendRequest(
112
+ method,
113
+ params
114
+ );
115
+ }
116
+ sendNotification(method, params) {
117
+ if (!this.connection || this._state !== "running") return;
118
+ this.connection.sendNotification(method, params);
119
+ }
120
+ hasCapability(name) {
121
+ return !!this.capabilities[name];
122
+ }
123
+ };
124
+ function mapSeverity(severity) {
125
+ switch (severity) {
126
+ case 1:
127
+ return "error";
128
+ case 2:
129
+ return "warning";
130
+ case 3:
131
+ return "info";
132
+ case 4:
133
+ return "hint";
134
+ default:
135
+ return "info";
136
+ }
137
+ }
138
+
139
+ // src/lsp/diagnostics.ts
140
+ var MAX_PENDING_PER_FILE = 50;
141
+ var DiagnosticRegistry = class {
142
+ pending = /* @__PURE__ */ new Map();
143
+ /**
144
+ * Register diagnostics from an LSP server's publishDiagnostics notification.
145
+ * Replaces all diagnostics for the given file.
146
+ */
147
+ register(diagnostics) {
148
+ if (diagnostics.length === 0) return;
149
+ const byFile = /* @__PURE__ */ new Map();
150
+ for (const d of diagnostics) {
151
+ const existing = byFile.get(d.filePath) ?? [];
152
+ existing.push(d);
153
+ byFile.set(d.filePath, existing);
154
+ }
155
+ for (const [file, diags] of byFile) {
156
+ this.pending.set(file, diags.slice(0, MAX_PENDING_PER_FILE));
157
+ }
158
+ }
159
+ /**
160
+ * Clear diagnostics for a specific file (e.g., after a write/edit).
161
+ */
162
+ clearForFile(filePath) {
163
+ this.pending.delete(filePath);
164
+ }
165
+ /**
166
+ * Get all pending diagnostics and clear them.
167
+ */
168
+ flush() {
169
+ const all = [];
170
+ for (const diags of this.pending.values()) {
171
+ all.push(...diags);
172
+ }
173
+ this.pending.clear();
174
+ return all;
175
+ }
176
+ /**
177
+ * Get pending diagnostics without clearing.
178
+ */
179
+ peek() {
180
+ const all = [];
181
+ for (const diags of this.pending.values()) {
182
+ all.push(...diags);
183
+ }
184
+ return all;
185
+ }
186
+ hasPending() {
187
+ return this.pending.size > 0;
188
+ }
189
+ };
190
+
191
+ // src/lsp/manager.ts
192
+ var LspServerManager = class {
193
+ servers = /* @__PURE__ */ new Map();
194
+ extensionMap = /* @__PURE__ */ new Map();
195
+ diagnostics = new DiagnosticRegistry();
196
+ rootUri;
197
+ constructor(configs, rootUri) {
198
+ this.rootUri = rootUri.startsWith("file://") ? rootUri : `file://${rootUri}`;
199
+ for (const [name, config] of Object.entries(configs)) {
200
+ const client = new LspClient(config);
201
+ client.onDiagnostics((diags) => this.diagnostics.register(diags));
202
+ this.servers.set(name, {
203
+ config,
204
+ client,
205
+ openFiles: /* @__PURE__ */ new Set()
206
+ });
207
+ for (const ext of config.fileExtensions) {
208
+ this.extensionMap.set(ext, name);
209
+ }
210
+ }
211
+ }
212
+ /**
213
+ * Get the server that handles a given file path.
214
+ */
215
+ getServerForFile(filePath) {
216
+ const ext = filePath.includes(".") ? "." + filePath.split(".").pop() : "";
217
+ const serverName = this.extensionMap.get(ext);
218
+ if (!serverName) return void 0;
219
+ return this.servers.get(serverName);
220
+ }
221
+ /**
222
+ * Ensure a server is started, starting it lazily if needed.
223
+ */
224
+ async ensureStarted(server) {
225
+ if (server.client.state === "running") return;
226
+ await server.client.start(this.rootUri);
227
+ }
228
+ /**
229
+ * Send a request to the appropriate server for a file.
230
+ */
231
+ async sendRequest(filePath, method, params) {
232
+ const server = this.getServerForFile(filePath);
233
+ if (!server) return null;
234
+ await this.ensureStarted(server);
235
+ await this.ensureFileOpen(server, filePath);
236
+ return server.client.sendRequest(method, params);
237
+ }
238
+ /**
239
+ * Notify LSP servers that a file was opened or changed.
240
+ */
241
+ async notifyFileChanged(filePath, content, version) {
242
+ const server = this.getServerForFile(filePath);
243
+ if (!server) return;
244
+ if (server.client.state !== "running") return;
245
+ const uri = `file://${filePath}`;
246
+ if (server.openFiles.has(filePath)) {
247
+ server.client.sendNotification("textDocument/didChange", {
248
+ textDocument: { uri, version },
249
+ contentChanges: [{ text: content }]
250
+ });
251
+ } else {
252
+ await this.ensureFileOpen(server, filePath, content);
253
+ }
254
+ }
255
+ /**
256
+ * Notify LSP servers that a file was saved.
257
+ */
258
+ notifyFileSaved(filePath) {
259
+ const server = this.getServerForFile(filePath);
260
+ if (!server || server.client.state !== "running") return;
261
+ server.client.sendNotification("textDocument/didSave", {
262
+ textDocument: { uri: `file://${filePath}` }
263
+ });
264
+ }
265
+ async ensureFileOpen(server, filePath, content) {
266
+ if (server.openFiles.has(filePath)) return;
267
+ const uri = `file://${filePath}`;
268
+ const ext = filePath.includes(".") ? filePath.split(".").pop() : "plaintext";
269
+ server.client.sendNotification("textDocument/didOpen", {
270
+ textDocument: {
271
+ uri,
272
+ languageId: mapExtToLanguageId(ext),
273
+ version: 1,
274
+ text: content ?? ""
275
+ }
276
+ });
277
+ server.openFiles.add(filePath);
278
+ }
279
+ /**
280
+ * Get the diagnostic registry for reading pending diagnostics.
281
+ */
282
+ getDiagnostics() {
283
+ return this.diagnostics;
284
+ }
285
+ /**
286
+ * Check if any LSP server is connected and running.
287
+ */
288
+ isConnected() {
289
+ for (const server of this.servers.values()) {
290
+ if (server.client.state === "running") return true;
291
+ }
292
+ return false;
293
+ }
294
+ /**
295
+ * Return the name and state of every configured LSP server.
296
+ */
297
+ getServerStatus() {
298
+ return Array.from(this.servers.entries()).map(([name, s]) => ({
299
+ name,
300
+ state: s.client.state
301
+ }));
302
+ }
303
+ /**
304
+ * Shut down all LSP servers.
305
+ */
306
+ async shutdown() {
307
+ const tasks = [];
308
+ for (const server of this.servers.values()) {
309
+ tasks.push(server.client.stop());
310
+ }
311
+ await Promise.all(tasks);
312
+ }
313
+ };
314
+ function mapExtToLanguageId(ext) {
315
+ const map = {
316
+ ts: "typescript",
317
+ tsx: "typescriptreact",
318
+ js: "javascript",
319
+ jsx: "javascriptreact",
320
+ py: "python",
321
+ rs: "rust",
322
+ go: "go",
323
+ java: "java",
324
+ rb: "ruby",
325
+ c: "c",
326
+ cpp: "cpp",
327
+ cs: "csharp",
328
+ html: "html",
329
+ css: "css",
330
+ json: "json",
331
+ md: "markdown",
332
+ yaml: "yaml",
333
+ yml: "yaml",
334
+ toml: "toml",
335
+ sh: "shellscript",
336
+ bash: "shellscript"
337
+ };
338
+ return map[ext] ?? "plaintext";
339
+ }
340
+
341
+ export {
342
+ LspClient,
343
+ DiagnosticRegistry,
344
+ LspServerManager
345
+ };
346
+ //# sourceMappingURL=chunk-D43BWEZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lsp/client.ts","../src/lsp/diagnostics.ts","../src/lsp/manager.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport {\n createMessageConnection,\n StreamMessageReader,\n StreamMessageWriter,\n type MessageConnection,\n type RequestType,\n} from \"vscode-jsonrpc/node.js\";\nimport type { LspServerConfig, LspServerState, LspDiagnostic } from \"./types.js\";\n\ninterface ServerCapabilities {\n definitionProvider?: boolean;\n referencesProvider?: boolean;\n hoverProvider?: boolean;\n documentSymbolProvider?: boolean;\n workspaceSymbolProvider?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Wraps a single LSP server process with JSON-RPC communication.\n */\nexport class LspClient {\n private process: ChildProcess | null = null;\n private connection: MessageConnection | null = null;\n private config: LspServerConfig;\n private _state: LspServerState = \"stopped\";\n private capabilities: ServerCapabilities = {};\n private diagnosticHandler?: (diagnostics: LspDiagnostic[]) => void;\n\n constructor(config: LspServerConfig) {\n this.config = config;\n }\n\n get state(): LspServerState {\n return this._state;\n }\n\n onDiagnostics(handler: (diagnostics: LspDiagnostic[]) => void): void {\n this.diagnosticHandler = handler;\n }\n\n async start(rootUri: string): Promise<void> {\n if (this._state === \"running\") return;\n this._state = \"starting\";\n\n try {\n this.process = spawn(this.config.command, this.config.args ?? [], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.config.env },\n });\n\n if (!this.process.stdout || !this.process.stdin) {\n throw new Error(\"Failed to get stdio streams from LSP server\");\n }\n\n this.connection = createMessageConnection(\n new StreamMessageReader(this.process.stdout),\n new StreamMessageWriter(this.process.stdin),\n );\n\n this.connection.onNotification(\n \"textDocument/publishDiagnostics\",\n (params: { uri: string; diagnostics: Array<{ range: { start: { line: number; character: number } }; severity?: number; message: string; source?: string }> }) => {\n if (!this.diagnosticHandler) return;\n const filePath = params.uri.startsWith(\"file://\")\n ? params.uri.slice(7)\n : params.uri;\n const mapped = params.diagnostics.map((d) => ({\n filePath,\n line: d.range.start.line + 1,\n character: d.range.start.character + 1,\n severity: mapSeverity(d.severity),\n message: d.message,\n source: d.source,\n }));\n this.diagnosticHandler(mapped);\n },\n );\n\n this.connection.listen();\n\n const initResult = await this.connection.sendRequest(\n \"initialize\" as unknown as RequestType<unknown, unknown, unknown>,\n {\n processId: process.pid,\n capabilities: {\n textDocument: {\n synchronization: { didSave: true },\n publishDiagnostics: {},\n hover: { contentFormat: [\"plaintext\"] },\n definition: { linkSupport: true },\n references: {},\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n },\n },\n rootUri,\n workspaceFolders: [{ uri: rootUri, name: \"workspace\" }],\n },\n );\n\n this.capabilities =\n (initResult as { capabilities?: ServerCapabilities })?.capabilities ?? {};\n\n this.connection.sendNotification(\"initialized\", {});\n this._state = \"running\";\n\n this.process.on(\"exit\", () => {\n this._state = \"stopped\";\n this.connection = null;\n this.process = null;\n });\n } catch (err) {\n this._state = \"error\";\n this.stop();\n throw err;\n }\n }\n\n async stop(): Promise<void> {\n if (this.connection) {\n try {\n await this.connection.sendRequest(\n \"shutdown\" as unknown as RequestType<unknown, unknown, unknown>,\n null,\n );\n this.connection.sendNotification(\"exit\");\n } catch {\n // ignore errors during shutdown\n }\n this.connection.dispose();\n this.connection = null;\n }\n if (this.process) {\n this.process.kill();\n this.process = null;\n }\n this._state = \"stopped\";\n }\n\n async sendRequest<T>(method: string, params: unknown): Promise<T> {\n if (!this.connection || this._state !== \"running\") {\n throw new Error(`LSP server not running (state: ${this._state})`);\n }\n return this.connection.sendRequest(\n method as unknown as RequestType<unknown, T, unknown>,\n params,\n ) as Promise<T>;\n }\n\n sendNotification(method: string, params: unknown): void {\n if (!this.connection || this._state !== \"running\") return;\n this.connection.sendNotification(method, params);\n }\n\n hasCapability(name: keyof ServerCapabilities): boolean {\n return !!this.capabilities[name];\n }\n}\n\nfunction mapSeverity(\n severity: number | undefined,\n): \"error\" | \"warning\" | \"info\" | \"hint\" {\n switch (severity) {\n case 1: return \"error\";\n case 2: return \"warning\";\n case 3: return \"info\";\n case 4: return \"hint\";\n default: return \"info\";\n }\n}\n","import type { LspDiagnostic } from \"./types.js\";\n\nconst MAX_PENDING_PER_FILE = 50;\n\n/**\n * Accumulates LSP diagnostics and provides them for injection into the agent context.\n */\nexport class DiagnosticRegistry {\n private pending = new Map<string, LspDiagnostic[]>();\n\n /**\n * Register diagnostics from an LSP server's publishDiagnostics notification.\n * Replaces all diagnostics for the given file.\n */\n register(diagnostics: LspDiagnostic[]): void {\n if (diagnostics.length === 0) return;\n\n const byFile = new Map<string, LspDiagnostic[]>();\n for (const d of diagnostics) {\n const existing = byFile.get(d.filePath) ?? [];\n existing.push(d);\n byFile.set(d.filePath, existing);\n }\n\n for (const [file, diags] of byFile) {\n this.pending.set(file, diags.slice(0, MAX_PENDING_PER_FILE));\n }\n }\n\n /**\n * Clear diagnostics for a specific file (e.g., after a write/edit).\n */\n clearForFile(filePath: string): void {\n this.pending.delete(filePath);\n }\n\n /**\n * Get all pending diagnostics and clear them.\n */\n flush(): LspDiagnostic[] {\n const all: LspDiagnostic[] = [];\n for (const diags of this.pending.values()) {\n all.push(...diags);\n }\n this.pending.clear();\n return all;\n }\n\n /**\n * Get pending diagnostics without clearing.\n */\n peek(): LspDiagnostic[] {\n const all: LspDiagnostic[] = [];\n for (const diags of this.pending.values()) {\n all.push(...diags);\n }\n return all;\n }\n\n hasPending(): boolean {\n return this.pending.size > 0;\n }\n}\n","import { LspClient } from \"./client.js\";\nimport { DiagnosticRegistry } from \"./diagnostics.js\";\nimport type { LspServerConfig, LspDiagnostic } from \"./types.js\";\n\ninterface ManagedServer {\n config: LspServerConfig;\n client: LspClient;\n openFiles: Set<string>;\n}\n\n/**\n * Manages multiple LSP servers, maps file extensions to servers,\n * and handles lifecycle (lazy start, file sync, shutdown).\n */\nexport class LspServerManager {\n private servers = new Map<string, ManagedServer>();\n private extensionMap = new Map<string, string>();\n private diagnostics = new DiagnosticRegistry();\n private rootUri: string;\n\n constructor(\n configs: Record<string, LspServerConfig>,\n rootUri: string,\n ) {\n this.rootUri = rootUri.startsWith(\"file://\") ? rootUri : `file://${rootUri}`;\n\n for (const [name, config] of Object.entries(configs)) {\n const client = new LspClient(config);\n client.onDiagnostics((diags) => this.diagnostics.register(diags));\n this.servers.set(name, {\n config,\n client,\n openFiles: new Set(),\n });\n\n for (const ext of config.fileExtensions) {\n this.extensionMap.set(ext, name);\n }\n }\n }\n\n /**\n * Get the server that handles a given file path.\n */\n private getServerForFile(filePath: string): ManagedServer | undefined {\n const ext = filePath.includes(\".\")\n ? \".\" + filePath.split(\".\").pop()!\n : \"\";\n const serverName = this.extensionMap.get(ext);\n if (!serverName) return undefined;\n return this.servers.get(serverName);\n }\n\n /**\n * Ensure a server is started, starting it lazily if needed.\n */\n private async ensureStarted(server: ManagedServer): Promise<void> {\n if (server.client.state === \"running\") return;\n await server.client.start(this.rootUri);\n }\n\n /**\n * Send a request to the appropriate server for a file.\n */\n async sendRequest<T>(\n filePath: string,\n method: string,\n params: unknown,\n ): Promise<T | null> {\n const server = this.getServerForFile(filePath);\n if (!server) return null;\n\n await this.ensureStarted(server);\n await this.ensureFileOpen(server, filePath);\n\n return server.client.sendRequest<T>(method, params);\n }\n\n /**\n * Notify LSP servers that a file was opened or changed.\n */\n async notifyFileChanged(\n filePath: string,\n content: string,\n version: number,\n ): Promise<void> {\n const server = this.getServerForFile(filePath);\n if (!server) return;\n if (server.client.state !== \"running\") return;\n\n const uri = `file://${filePath}`;\n if (server.openFiles.has(filePath)) {\n server.client.sendNotification(\"textDocument/didChange\", {\n textDocument: { uri, version },\n contentChanges: [{ text: content }],\n });\n } else {\n await this.ensureFileOpen(server, filePath, content);\n }\n }\n\n /**\n * Notify LSP servers that a file was saved.\n */\n notifyFileSaved(filePath: string): void {\n const server = this.getServerForFile(filePath);\n if (!server || server.client.state !== \"running\") return;\n\n server.client.sendNotification(\"textDocument/didSave\", {\n textDocument: { uri: `file://${filePath}` },\n });\n }\n\n private async ensureFileOpen(\n server: ManagedServer,\n filePath: string,\n content?: string,\n ): Promise<void> {\n if (server.openFiles.has(filePath)) return;\n\n const uri = `file://${filePath}`;\n const ext = filePath.includes(\".\")\n ? filePath.split(\".\").pop()!\n : \"plaintext\";\n\n server.client.sendNotification(\"textDocument/didOpen\", {\n textDocument: {\n uri,\n languageId: mapExtToLanguageId(ext),\n version: 1,\n text: content ?? \"\",\n },\n });\n server.openFiles.add(filePath);\n }\n\n /**\n * Get the diagnostic registry for reading pending diagnostics.\n */\n getDiagnostics(): DiagnosticRegistry {\n return this.diagnostics;\n }\n\n /**\n * Check if any LSP server is connected and running.\n */\n isConnected(): boolean {\n for (const server of this.servers.values()) {\n if (server.client.state === \"running\") return true;\n }\n return false;\n }\n\n /**\n * Return the name and state of every configured LSP server.\n */\n getServerStatus(): Array<{ name: string; state: string }> {\n return Array.from(this.servers.entries()).map(([name, s]) => ({\n name,\n state: s.client.state,\n }));\n }\n\n /**\n * Shut down all LSP servers.\n */\n async shutdown(): Promise<void> {\n const tasks: Promise<void>[] = [];\n for (const server of this.servers.values()) {\n tasks.push(server.client.stop());\n }\n await Promise.all(tasks);\n }\n}\n\nfunction mapExtToLanguageId(ext: string): string {\n const map: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescriptreact\",\n js: \"javascript\",\n jsx: \"javascriptreact\",\n py: \"python\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n rb: \"ruby\",\n c: \"c\",\n cpp: \"cpp\",\n cs: \"csharp\",\n html: \"html\",\n css: \"css\",\n json: \"json\",\n md: \"markdown\",\n yaml: \"yaml\",\n yml: \"yaml\",\n toml: \"toml\",\n sh: \"shellscript\",\n bash: \"shellscript\",\n };\n return map[ext] ?? \"plaintext\";\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
11
+ //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}