atom-lite 0.1.0 → 0.5.1

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 (169) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +58 -10
  3. package/dist/agent/loop.d.ts +11 -0
  4. package/dist/agent/loop.js +238 -47
  5. package/dist/agent/loop.js.map +1 -1
  6. package/dist/agent/model-turn.d.ts +37 -0
  7. package/dist/agent/model-turn.js +53 -0
  8. package/dist/agent/model-turn.js.map +1 -0
  9. package/dist/agent/turn-recorder.d.ts +33 -0
  10. package/dist/agent/turn-recorder.js +74 -0
  11. package/dist/agent/turn-recorder.js.map +1 -0
  12. package/dist/agent/types.d.ts +4 -0
  13. package/dist/cli/activity.d.ts +45 -0
  14. package/dist/cli/activity.js +141 -0
  15. package/dist/cli/activity.js.map +1 -0
  16. package/dist/cli/app.js +1234 -378
  17. package/dist/cli/app.js.map +1 -1
  18. package/dist/cli/approval-prompt.d.ts +24 -0
  19. package/dist/cli/approval-prompt.js +82 -0
  20. package/dist/cli/approval-prompt.js.map +1 -0
  21. package/dist/cli/banner.d.ts +5 -1
  22. package/dist/cli/banner.js +10 -4
  23. package/dist/cli/banner.js.map +1 -1
  24. package/dist/cli/commands.d.ts +92 -14
  25. package/dist/cli/commands.js +330 -52
  26. package/dist/cli/commands.js.map +1 -1
  27. package/dist/cli/diff.d.ts +1 -0
  28. package/dist/cli/diff.js +28 -0
  29. package/dist/cli/diff.js.map +1 -0
  30. package/dist/cli/input.d.ts +2 -0
  31. package/dist/cli/input.js +10 -0
  32. package/dist/cli/input.js.map +1 -0
  33. package/dist/cli/main.js +2 -2
  34. package/dist/cli/main.js.map +1 -1
  35. package/dist/cli/mouse.d.ts +54 -0
  36. package/dist/cli/mouse.js +86 -0
  37. package/dist/cli/mouse.js.map +1 -0
  38. package/dist/cli/palette.d.ts +41 -0
  39. package/dist/cli/palette.js +212 -0
  40. package/dist/cli/palette.js.map +1 -0
  41. package/dist/cli/panel.d.ts +29 -0
  42. package/dist/cli/panel.js +48 -0
  43. package/dist/cli/panel.js.map +1 -0
  44. package/dist/cli/picker.d.ts +8 -0
  45. package/dist/cli/picker.js +26 -28
  46. package/dist/cli/picker.js.map +1 -1
  47. package/dist/cli/status-line.d.ts +6 -0
  48. package/dist/cli/status-line.js +21 -7
  49. package/dist/cli/status-line.js.map +1 -1
  50. package/dist/cli/stream-text.d.ts +4 -8
  51. package/dist/cli/stream-text.js +26 -12
  52. package/dist/cli/stream-text.js.map +1 -1
  53. package/dist/cli/theme.d.ts +48 -0
  54. package/dist/cli/theme.js +160 -0
  55. package/dist/cli/theme.js.map +1 -0
  56. package/dist/cli/tool-box.d.ts +41 -0
  57. package/dist/cli/tool-box.js +177 -0
  58. package/dist/cli/tool-box.js.map +1 -0
  59. package/dist/cli/transcript.d.ts +24 -1
  60. package/dist/cli/transcript.js +65 -2
  61. package/dist/cli/transcript.js.map +1 -1
  62. package/dist/cli/trust-prompt.d.ts +24 -0
  63. package/dist/cli/trust-prompt.js +89 -0
  64. package/dist/cli/trust-prompt.js.map +1 -0
  65. package/dist/config/defaults.d.ts +12 -0
  66. package/dist/config/defaults.js +12 -0
  67. package/dist/config/defaults.js.map +1 -1
  68. package/dist/config/load.d.ts +2 -0
  69. package/dist/config/load.js +36 -0
  70. package/dist/config/load.js.map +1 -1
  71. package/dist/config/paths.d.ts +2 -0
  72. package/dist/config/paths.js +12 -1
  73. package/dist/config/paths.js.map +1 -1
  74. package/dist/config/schema.d.ts +53 -0
  75. package/dist/config/schema.js +33 -0
  76. package/dist/config/schema.js.map +1 -1
  77. package/dist/config/write.d.ts +2 -0
  78. package/dist/config/write.js +9 -0
  79. package/dist/config/write.js.map +1 -1
  80. package/dist/context/builder.d.ts +7 -0
  81. package/dist/context/builder.js +11 -0
  82. package/dist/context/builder.js.map +1 -0
  83. package/dist/context/manager.d.ts +17 -3
  84. package/dist/context/manager.js +129 -41
  85. package/dist/context/manager.js.map +1 -1
  86. package/dist/extensions/api.d.ts +101 -0
  87. package/dist/extensions/api.js +219 -0
  88. package/dist/extensions/api.js.map +1 -0
  89. package/dist/extensions/discovery.d.ts +42 -0
  90. package/dist/extensions/discovery.js +326 -0
  91. package/dist/extensions/discovery.js.map +1 -0
  92. package/dist/extensions/loader.d.ts +68 -0
  93. package/dist/extensions/loader.js +353 -0
  94. package/dist/extensions/loader.js.map +1 -0
  95. package/dist/extensions/session-manager.d.ts +44 -0
  96. package/dist/extensions/session-manager.js +137 -0
  97. package/dist/extensions/session-manager.js.map +1 -0
  98. package/dist/extensions/tool-adapter.d.ts +12 -0
  99. package/dist/extensions/tool-adapter.js +157 -0
  100. package/dist/extensions/tool-adapter.js.map +1 -0
  101. package/dist/extensions/trust.d.ts +6 -0
  102. package/dist/extensions/trust.js +55 -0
  103. package/dist/extensions/trust.js.map +1 -0
  104. package/dist/extensions/types.d.ts +94 -0
  105. package/dist/extensions/types.js +2 -0
  106. package/dist/extensions/types.js.map +1 -0
  107. package/dist/extensions/ui.d.ts +21 -0
  108. package/dist/extensions/ui.js +75 -0
  109. package/dist/extensions/ui.js.map +1 -0
  110. package/dist/index.d.ts +2 -0
  111. package/dist/index.js +2 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/mcp/client.d.ts +73 -0
  114. package/dist/mcp/client.js +363 -0
  115. package/dist/mcp/client.js.map +1 -0
  116. package/dist/mcp/format.d.ts +3 -0
  117. package/dist/mcp/format.js +37 -0
  118. package/dist/mcp/format.js.map +1 -0
  119. package/dist/mcp/index.d.ts +6 -0
  120. package/dist/mcp/index.js +7 -0
  121. package/dist/mcp/index.js.map +1 -0
  122. package/dist/mcp/manager.d.ts +53 -0
  123. package/dist/mcp/manager.js +349 -0
  124. package/dist/mcp/manager.js.map +1 -0
  125. package/dist/mcp/stdio-transport.d.ts +26 -0
  126. package/dist/mcp/stdio-transport.js +174 -0
  127. package/dist/mcp/stdio-transport.js.map +1 -0
  128. package/dist/mcp/tools.d.ts +22 -0
  129. package/dist/mcp/tools.js +162 -0
  130. package/dist/mcp/tools.js.map +1 -0
  131. package/dist/mcp/types.d.ts +92 -0
  132. package/dist/mcp/types.js +2 -0
  133. package/dist/mcp/types.js.map +1 -0
  134. package/dist/providers/factory.js +1 -0
  135. package/dist/providers/factory.js.map +1 -1
  136. package/dist/runtime/executor.d.ts +2 -0
  137. package/dist/runtime/executor.js +4 -0
  138. package/dist/runtime/executor.js.map +1 -0
  139. package/dist/runtime/scheduler.d.ts +4 -3
  140. package/dist/runtime/scheduler.js +7 -98
  141. package/dist/runtime/scheduler.js.map +1 -1
  142. package/dist/runtime/tool-executor.d.ts +18 -0
  143. package/dist/runtime/tool-executor.js +126 -0
  144. package/dist/runtime/tool-executor.js.map +1 -0
  145. package/dist/security/process.d.ts +10 -0
  146. package/dist/security/process.js +36 -0
  147. package/dist/security/process.js.map +1 -1
  148. package/dist/sessions/events.d.ts +9 -0
  149. package/dist/sessions/events.js +11 -6
  150. package/dist/sessions/events.js.map +1 -1
  151. package/dist/sessions/history.d.ts +18 -0
  152. package/dist/sessions/history.js +76 -0
  153. package/dist/sessions/history.js.map +1 -0
  154. package/dist/sessions/index.d.ts +2 -0
  155. package/dist/sessions/index.js +2 -0
  156. package/dist/sessions/index.js.map +1 -1
  157. package/dist/sessions/search.d.ts +16 -0
  158. package/dist/sessions/search.js +136 -0
  159. package/dist/sessions/search.js.map +1 -0
  160. package/dist/sessions/store.js +7 -4
  161. package/dist/sessions/store.js.map +1 -1
  162. package/dist/tools/bash.js +6 -3
  163. package/dist/tools/bash.js.map +1 -1
  164. package/dist/tools/edit.js +2 -1
  165. package/dist/tools/edit.js.map +1 -1
  166. package/dist/tools/types.d.ts +6 -0
  167. package/dist/types.d.ts +2 -1
  168. package/dist/types.js.map +1 -1
  169. package/package.json +3 -1
@@ -0,0 +1,349 @@
1
+ import { createHash } from "node:crypto";
2
+ import { McpClient } from "./client.js";
3
+ import { StdioTransport } from "./stdio-transport.js";
4
+ const MAX_TOOL_NAME_LENGTH = 64;
5
+ /** Sanitise one name segment to the character set tool APIs accept. */
6
+ export function sanitizeNameSegment(value, fallback = "tool") {
7
+ const cleaned = value
8
+ .replace(/[^A-Za-z0-9_-]+/g, "_")
9
+ .replace(/^_+|_+$/g, "");
10
+ return cleaned || fallback;
11
+ }
12
+ function shortHash(value) {
13
+ return createHash("sha1").update(value).digest("hex").slice(0, 8);
14
+ }
15
+ function bounded(name) {
16
+ if (name.length <= MAX_TOOL_NAME_LENGTH)
17
+ return name;
18
+ const hash = shortHash(name);
19
+ return `${name.slice(0, MAX_TOOL_NAME_LENGTH - hash.length - 1).replace(/_+$/, "")}_${hash}`;
20
+ }
21
+ /**
22
+ * Resolve a remote tool to its model-facing name. The server and tool segments
23
+ * are sanitised and the whole name is capped so it stays valid everywhere.
24
+ */
25
+ export function namespacedToolName(server, tool) {
26
+ return bounded(`mcp__${sanitizeNameSegment(server, "server")}__${sanitizeNameSegment(tool)}`);
27
+ }
28
+ function errorMessage(error) {
29
+ return error instanceof Error ? error.message : String(error);
30
+ }
31
+ function defaultTransportFactory(_serverName, config) {
32
+ return new StdioTransport(config);
33
+ }
34
+ /**
35
+ * Owns the lifetime of every configured MCP server. Connections are lazy,
36
+ * failures are isolated per server, and every state transition is observable.
37
+ */
38
+ export class McpManager {
39
+ onToolsChanged;
40
+ records;
41
+ transportFactory;
42
+ onEvent;
43
+ closed = false;
44
+ constructor(options = {}) {
45
+ this.records = new Map();
46
+ this.transportFactory = options.transportFactory ?? defaultTransportFactory;
47
+ this.onEvent = options.onEvent;
48
+ for (const [name, config] of Object.entries(options.servers ?? {})) {
49
+ this.records.set(name, {
50
+ name,
51
+ config,
52
+ state: config.enabled ? "idle" : "disabled",
53
+ remoteTools: [],
54
+ failedReported: false,
55
+ });
56
+ }
57
+ }
58
+ /** Configured server names, including disabled entries. */
59
+ serverNames() {
60
+ return [...this.records.keys()];
61
+ }
62
+ /** True when there is at least one enabled server. */
63
+ hasEnabledServers() {
64
+ return [...this.records.values()].some((record) => record.config.enabled);
65
+ }
66
+ status() {
67
+ const namesByRemote = new Map(this.tools().map((tool) => [
68
+ `${tool.server}\u0000${tool.remoteName}`,
69
+ tool.name,
70
+ ]));
71
+ return [...this.records.values()].map((record) => ({
72
+ name: record.name,
73
+ state: record.state,
74
+ enabled: record.config.enabled,
75
+ requiresApproval: record.config.requiresApproval,
76
+ toolCount: record.state === "ready" ? record.remoteTools.length : 0,
77
+ tools: record.state === "ready"
78
+ ? record.remoteTools.map((tool) => namesByRemote.get(`${record.name}\u0000${tool.name}`) ??
79
+ namespacedToolName(record.name, tool.name))
80
+ : [],
81
+ lastError: record.lastError,
82
+ }));
83
+ }
84
+ /** Discovered tools across every ready server. */
85
+ tools() {
86
+ const tools = [];
87
+ const used = new Set();
88
+ for (const record of this.records.values()) {
89
+ if (record.state !== "ready")
90
+ continue;
91
+ for (const remote of record.remoteTools) {
92
+ const name = this.uniqueName(record.name, remote.name, used);
93
+ tools.push({
94
+ server: record.name,
95
+ remoteName: remote.name,
96
+ name,
97
+ description: remote.description ??
98
+ `MCP tool ${remote.name} from ${record.name}`,
99
+ inputSchema: remote.inputSchema ?? {
100
+ type: "object",
101
+ properties: {},
102
+ },
103
+ requiresApproval: record.config.requiresApproval,
104
+ callTimeoutMs: record.config.callTimeoutMs,
105
+ });
106
+ }
107
+ }
108
+ return tools;
109
+ }
110
+ /**
111
+ * Connect every idle server and return the current tool list. A failing
112
+ * server is recorded and skipped; it never rejects the overall discovery.
113
+ */
114
+ async syncTools() {
115
+ if (this.closed)
116
+ return [];
117
+ const pending = [];
118
+ for (const record of this.records.values()) {
119
+ if (!record.config.enabled)
120
+ continue;
121
+ if (record.state === "idle")
122
+ pending.push(this.connect(record.name));
123
+ }
124
+ await Promise.all(pending);
125
+ return this.tools();
126
+ }
127
+ /** Retry one server, or every server when no name is given. */
128
+ async reconnect(name) {
129
+ if (this.closed)
130
+ throw new Error("MCP manager is closed");
131
+ if (name !== undefined) {
132
+ if (!this.records.has(name)) {
133
+ throw new Error(`Unknown MCP server: ${name}`);
134
+ }
135
+ await this.reset(this.records.get(name));
136
+ if (this.records.get(name).config.enabled) {
137
+ await this.connect(name);
138
+ }
139
+ return this.status();
140
+ }
141
+ for (const record of this.records.values()) {
142
+ await this.reset(record);
143
+ }
144
+ await Promise.all([...this.records.values()]
145
+ .filter((record) => record.config.enabled)
146
+ .map((record) => this.connect(record.name)));
147
+ return this.status();
148
+ }
149
+ async callTool(server, tool, args, options = {}) {
150
+ const record = this.records.get(server);
151
+ if (!record)
152
+ throw new Error(`Unknown MCP server: ${server}`);
153
+ if (record.state !== "ready" || !record.client) {
154
+ throw new Error(`MCP_SERVER_UNAVAILABLE: ${server} is ${record.state}${record.lastError ? ` (${record.lastError})` : ""}`);
155
+ }
156
+ if (options.signal?.aborted)
157
+ throw new Error("USER_CANCELLED");
158
+ const result = await record.client.callTool(tool, args, {
159
+ timeoutMs: record.config.callTimeoutMs,
160
+ signal: options.signal,
161
+ });
162
+ if (typeof result === "object" && result !== null) {
163
+ return result;
164
+ }
165
+ return { content: result };
166
+ }
167
+ /** Close every server without reporting failures. */
168
+ async close() {
169
+ if (this.closed)
170
+ return;
171
+ this.closed = true;
172
+ const records = [...this.records.values()];
173
+ for (const record of records) {
174
+ record.state = "closed";
175
+ }
176
+ await Promise.all(records.map(async (record) => {
177
+ const client = record.client;
178
+ record.client = undefined;
179
+ record.transport = undefined;
180
+ await client?.close().catch(() => { });
181
+ }));
182
+ }
183
+ /** Internal: establish one server and cache its tools. */
184
+ async connect(name) {
185
+ const record = this.records.get(name);
186
+ if (!record || this.closed || !record.config.enabled)
187
+ return;
188
+ if (record.state === "ready")
189
+ return;
190
+ if (record.connectPromise)
191
+ return record.connectPromise;
192
+ record.connectPromise = (async () => {
193
+ record.state = "connecting";
194
+ record.lastError = undefined;
195
+ const transport = this.transportFactory(name, record.config);
196
+ const client = new McpClient(transport, {
197
+ onClose: (info) => this.handleUnexpectedClose(record, info),
198
+ });
199
+ record.transport = transport;
200
+ record.client = client;
201
+ client.onNotification("notifications/tools/list_changed", () => {
202
+ void this.refresh(name);
203
+ });
204
+ try {
205
+ await client.connect({
206
+ startupTimeoutMs: record.config.startupTimeoutMs,
207
+ });
208
+ const remoteTools = await client.listTools({
209
+ timeoutMs: record.config.callTimeoutMs,
210
+ });
211
+ if (record.client !== client)
212
+ return;
213
+ record.remoteTools = remoteTools;
214
+ record.state = "ready";
215
+ record.failedReported = false;
216
+ record.lastError = undefined;
217
+ this.emit({
218
+ type: "mcp_server_connected",
219
+ server: name,
220
+ toolCount: remoteTools.length,
221
+ });
222
+ this.emitToolsChanged();
223
+ }
224
+ catch (error) {
225
+ if (record.client !== client)
226
+ return;
227
+ this.fail(record, error, transport);
228
+ await client.close().catch(() => { });
229
+ if (record.client === client) {
230
+ record.client = undefined;
231
+ record.transport = undefined;
232
+ }
233
+ }
234
+ finally {
235
+ record.connectPromise = undefined;
236
+ }
237
+ })();
238
+ return record.connectPromise;
239
+ }
240
+ async refresh(name) {
241
+ const record = this.records.get(name);
242
+ if (!record || this.closed || record.state !== "ready")
243
+ return;
244
+ if (record.refreshPromise)
245
+ return record.refreshPromise;
246
+ const client = record.client;
247
+ if (!client)
248
+ return;
249
+ record.refreshPromise = (async () => {
250
+ try {
251
+ const remoteTools = await client.listTools({
252
+ timeoutMs: record.config.callTimeoutMs,
253
+ });
254
+ if (record.client !== client)
255
+ return;
256
+ record.remoteTools = remoteTools;
257
+ record.lastError = undefined;
258
+ this.emit({
259
+ type: "mcp_tools_changed",
260
+ server: name,
261
+ toolCount: remoteTools.length,
262
+ });
263
+ this.emitToolsChanged();
264
+ }
265
+ catch (error) {
266
+ if (record.client !== client)
267
+ return;
268
+ record.lastError = errorMessage(error);
269
+ if (client.isClosed()) {
270
+ this.fail(record, error, record.transport);
271
+ }
272
+ }
273
+ finally {
274
+ record.refreshPromise = undefined;
275
+ }
276
+ })();
277
+ return record.refreshPromise;
278
+ }
279
+ handleUnexpectedClose(record, info) {
280
+ if (record.client && record.state !== "closed") {
281
+ const detail = info.code !== undefined && info.code !== null
282
+ ? `MCP server exited (code ${info.code})`
283
+ : info.signal
284
+ ? `MCP server exited (signal ${info.signal})`
285
+ : "MCP server exited";
286
+ record.lastError = detail;
287
+ this.fail(record, new Error(detail), record.transport);
288
+ }
289
+ }
290
+ fail(record, error, transport) {
291
+ record.state = "failed";
292
+ record.remoteTools = [];
293
+ const stderr = transport?.stderrText?.();
294
+ const message = errorMessage(error);
295
+ record.lastError =
296
+ stderr && !message.includes(stderr)
297
+ ? `${message}: ${stderr.slice(-2000)}`
298
+ : message;
299
+ if (!record.failedReported) {
300
+ record.failedReported = true;
301
+ this.emit({
302
+ type: "mcp_server_failed",
303
+ server: record.name,
304
+ error: record.lastError,
305
+ });
306
+ }
307
+ this.emitToolsChanged();
308
+ }
309
+ async reset(record) {
310
+ const client = record.client;
311
+ record.client = undefined;
312
+ record.transport = undefined;
313
+ record.connectPromise = undefined;
314
+ record.refreshPromise = undefined;
315
+ await client?.close().catch(() => { });
316
+ record.remoteTools = [];
317
+ record.lastError = undefined;
318
+ record.failedReported = false;
319
+ record.state = record.config.enabled ? "idle" : "disabled";
320
+ this.emitToolsChanged();
321
+ }
322
+ uniqueName(server, tool, used) {
323
+ const base = namespacedToolName(server, tool);
324
+ let name = base;
325
+ if (used.has(name)) {
326
+ const hash = shortHash(`${server}\0${tool}`);
327
+ name = `${base.slice(0, MAX_TOOL_NAME_LENGTH - hash.length - 1).replace(/_+$/, "")}_${hash}`;
328
+ }
329
+ used.add(name);
330
+ return name;
331
+ }
332
+ emitToolsChanged() {
333
+ try {
334
+ this.onToolsChanged?.(this.tools());
335
+ }
336
+ catch {
337
+ // Consumers must not break server lifecycle.
338
+ }
339
+ }
340
+ emit(event) {
341
+ try {
342
+ this.onEvent?.(event);
343
+ }
344
+ catch {
345
+ // Observability must never break tool execution.
346
+ }
347
+ }
348
+ }
349
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { McpServerConfig, McpTransport, McpTransportHandlers } from "./types.js";
2
+ /**
3
+ * Build the deliberately small environment inherited by an MCP server. The
4
+ * provider API keys in the parent process are not part of the allowlist, so a
5
+ * server only receives secrets the user explicitly declared.
6
+ */
7
+ export declare function buildMcpEnv(declared?: Record<string, string>, base?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
8
+ /**
9
+ * MCP stdio framing: one JSON-RPC message per newline. stderr is captured for
10
+ * diagnostics but never mixed into the protocol stream.
11
+ */
12
+ export declare class StdioTransport implements McpTransport {
13
+ private readonly config;
14
+ private handlers?;
15
+ private child?;
16
+ private lines?;
17
+ private startPromise?;
18
+ private closing;
19
+ private stderrBuffer;
20
+ constructor(config: McpServerConfig);
21
+ setHandlers(handlers: McpTransportHandlers): void;
22
+ stderrText(): string;
23
+ start(): Promise<void>;
24
+ send(message: unknown): void;
25
+ close(): Promise<void>;
26
+ }
@@ -0,0 +1,174 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import { terminateProcessTree } from "../security/process.js";
4
+ const ENV_ALLOWLIST = new Set([
5
+ "PATH",
6
+ "HOME",
7
+ "USER",
8
+ "LOGNAME",
9
+ "SHELL",
10
+ "LANG",
11
+ "LANGUAGE",
12
+ "TERM",
13
+ "TMPDIR",
14
+ "TMP",
15
+ "TEMP",
16
+ // Windows process bootstrap.
17
+ "SystemRoot",
18
+ "SystemDrive",
19
+ "WINDIR",
20
+ "ComSpec",
21
+ "PATHEXT",
22
+ "USERPROFILE",
23
+ "APPDATA",
24
+ "LOCALAPPDATA",
25
+ "PROGRAMDATA",
26
+ "PROGRAMFILES",
27
+ "PROGRAMFILES(X86)",
28
+ "CommonProgramFiles",
29
+ "CommonProgramW6432",
30
+ ]);
31
+ const ENV_PREFIX_ALLOWLIST = ["LC_", "XDG_"];
32
+ /**
33
+ * Build the deliberately small environment inherited by an MCP server. The
34
+ * provider API keys in the parent process are not part of the allowlist, so a
35
+ * server only receives secrets the user explicitly declared.
36
+ */
37
+ export function buildMcpEnv(declared = {}, base = process.env) {
38
+ const env = {};
39
+ for (const [key, value] of Object.entries(base)) {
40
+ if (value === undefined)
41
+ continue;
42
+ if (ENV_ALLOWLIST.has(key) ||
43
+ ENV_PREFIX_ALLOWLIST.some((prefix) => key.startsWith(prefix))) {
44
+ env[key] = value;
45
+ }
46
+ }
47
+ for (const [key, value] of Object.entries(declared)) {
48
+ env[key] = value;
49
+ }
50
+ return env;
51
+ }
52
+ const MAX_STDERR_BYTES = 8192;
53
+ /**
54
+ * MCP stdio framing: one JSON-RPC message per newline. stderr is captured for
55
+ * diagnostics but never mixed into the protocol stream.
56
+ */
57
+ export class StdioTransport {
58
+ config;
59
+ handlers;
60
+ child;
61
+ lines;
62
+ startPromise;
63
+ closing = false;
64
+ stderrBuffer = "";
65
+ constructor(config) {
66
+ this.config = config;
67
+ }
68
+ setHandlers(handlers) {
69
+ this.handlers = handlers;
70
+ }
71
+ stderrText() {
72
+ return this.stderrBuffer.trim();
73
+ }
74
+ start() {
75
+ if (this.startPromise)
76
+ return this.startPromise;
77
+ this.startPromise = new Promise((resolve, reject) => {
78
+ let settled = false;
79
+ let child;
80
+ try {
81
+ child = spawn(this.config.command, this.config.args ?? [], {
82
+ cwd: this.config.cwd,
83
+ env: buildMcpEnv(this.config.env ?? {}),
84
+ stdio: ["pipe", "pipe", "pipe"],
85
+ windowsHide: true,
86
+ detached: process.platform !== "win32",
87
+ });
88
+ }
89
+ catch (error) {
90
+ reject(error instanceof Error ? error : new Error(String(error)));
91
+ return;
92
+ }
93
+ this.child = child;
94
+ child.once("spawn", () => {
95
+ settled = true;
96
+ resolve();
97
+ });
98
+ child.once("error", (error) => {
99
+ if (!settled) {
100
+ settled = true;
101
+ reject(error);
102
+ }
103
+ else {
104
+ this.handlers?.onError(error);
105
+ }
106
+ });
107
+ child.once("close", (code, signal) => {
108
+ this.lines?.close();
109
+ this.lines = undefined;
110
+ this.child = undefined;
111
+ if (!this.closing) {
112
+ this.handlers?.onClose({ code, signal });
113
+ }
114
+ });
115
+ child.stderr?.on("data", (chunk) => {
116
+ this.stderrBuffer += chunk.toString();
117
+ if (this.stderrBuffer.length > MAX_STDERR_BYTES) {
118
+ this.stderrBuffer = this.stderrBuffer.slice(-MAX_STDERR_BYTES);
119
+ }
120
+ });
121
+ this.lines = createInterface({ input: child.stdout, crlfDelay: Infinity });
122
+ this.lines.on("line", (line) => {
123
+ const trimmed = line.trim();
124
+ if (!trimmed)
125
+ return;
126
+ try {
127
+ this.handlers?.onMessage(JSON.parse(trimmed));
128
+ }
129
+ catch {
130
+ this.handlers?.onError(new Error(`MCP server sent invalid JSON: ${trimmed.slice(0, 200)}`));
131
+ }
132
+ });
133
+ });
134
+ return this.startPromise;
135
+ }
136
+ send(message) {
137
+ const stdin = this.child?.stdin;
138
+ if (!stdin || stdin.destroyed) {
139
+ throw new Error("MCP server stdin is not available");
140
+ }
141
+ stdin.write(JSON.stringify(message) + "\n");
142
+ }
143
+ async close() {
144
+ if (this.closing)
145
+ return;
146
+ this.closing = true;
147
+ this.lines?.close();
148
+ this.lines = undefined;
149
+ const child = this.child;
150
+ this.child = undefined;
151
+ if (!child)
152
+ return;
153
+ try {
154
+ child.stdin.end();
155
+ }
156
+ catch {
157
+ // Ignore.
158
+ }
159
+ if (child.exitCode !== null || child.signalCode !== null)
160
+ return;
161
+ terminateProcessTree(child, "SIGTERM");
162
+ await new Promise((resolve) => {
163
+ const timer = setTimeout(() => {
164
+ terminateProcessTree(child, "SIGKILL");
165
+ resolve();
166
+ }, 750);
167
+ child.once("close", () => {
168
+ clearTimeout(timer);
169
+ resolve();
170
+ });
171
+ });
172
+ }
173
+ }
174
+ //# sourceMappingURL=stdio-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/mcp/stdio-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Tool, ToolContext, ToolResult } from "../tools/types.js";
2
+ import type { ToolCall } from "../types.js";
3
+ import type { McpManager } from "./manager.js";
4
+ import type { McpToolState } from "./types.js";
5
+ export declare const MCP_APPROVAL_REQUIRED = "MCP_APPROVAL_REQUIRED";
6
+ export declare const MCP_CALL_FAILED = "MCP_CALL_FAILED";
7
+ export declare const MCP_APPROVAL_PREFIX = "mcp";
8
+ /**
9
+ * Wrap one discovered MCP tool as an Atom-lite `Tool`. The execution path is
10
+ * the same as built-ins: it receives the normal context, honours approval
11
+ * policy, and returns the normal result shape.
12
+ */
13
+ export declare class McpTool implements Tool {
14
+ private readonly manager;
15
+ private readonly tool;
16
+ readonly definition: Tool["definition"];
17
+ constructor(manager: McpManager, tool: McpToolState);
18
+ execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult>;
19
+ }
20
+ export declare function createMcpTools(manager: McpManager): Tool[];
21
+ /** Map an MCP tool result into the single string Atom-lite tools use. */
22
+ export declare function summariseMcpResult(result: unknown): string;