atom-lite 0.0.0-stage → 0.4.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 (250) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/LICENSE +21 -0
  3. package/README.md +313 -2
  4. package/dist/agent/loop.d.ts +32 -0
  5. package/dist/agent/loop.js +204 -0
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/types.d.ts +85 -0
  8. package/dist/agent/types.js +2 -0
  9. package/dist/agent/types.js.map +1 -0
  10. package/dist/cli/activity.d.ts +45 -0
  11. package/dist/cli/activity.js +141 -0
  12. package/dist/cli/activity.js.map +1 -0
  13. package/dist/cli/app.d.ts +1 -0
  14. package/dist/cli/app.js +1576 -0
  15. package/dist/cli/app.js.map +1 -0
  16. package/dist/cli/approval-prompt.d.ts +24 -0
  17. package/dist/cli/approval-prompt.js +82 -0
  18. package/dist/cli/approval-prompt.js.map +1 -0
  19. package/dist/cli/approvals.d.ts +1 -0
  20. package/dist/cli/approvals.js +2 -0
  21. package/dist/cli/approvals.js.map +1 -0
  22. package/dist/cli/banner.d.ts +12 -0
  23. package/dist/cli/banner.js +35 -0
  24. package/dist/cli/banner.js.map +1 -0
  25. package/dist/cli/commands.d.ts +94 -0
  26. package/dist/cli/commands.js +324 -0
  27. package/dist/cli/commands.js.map +1 -0
  28. package/dist/cli/diff.d.ts +1 -0
  29. package/dist/cli/diff.js +28 -0
  30. package/dist/cli/diff.js.map +1 -0
  31. package/dist/cli/input.d.ts +2 -0
  32. package/dist/cli/input.js +10 -0
  33. package/dist/cli/input.js.map +1 -0
  34. package/dist/cli/main.d.ts +2 -0
  35. package/dist/cli/main.js +22 -0
  36. package/dist/cli/main.js.map +1 -0
  37. package/dist/cli/mouse.d.ts +54 -0
  38. package/dist/cli/mouse.js +83 -0
  39. package/dist/cli/mouse.js.map +1 -0
  40. package/dist/cli/palette.d.ts +41 -0
  41. package/dist/cli/palette.js +212 -0
  42. package/dist/cli/palette.js.map +1 -0
  43. package/dist/cli/panel.d.ts +29 -0
  44. package/dist/cli/panel.js +48 -0
  45. package/dist/cli/panel.js.map +1 -0
  46. package/dist/cli/picker.d.ts +34 -0
  47. package/dist/cli/picker.js +173 -0
  48. package/dist/cli/picker.js.map +1 -0
  49. package/dist/cli/renderer.d.ts +1 -0
  50. package/dist/cli/renderer.js +5 -0
  51. package/dist/cli/renderer.js.map +1 -0
  52. package/dist/cli/secret-input.d.ts +21 -0
  53. package/dist/cli/secret-input.js +101 -0
  54. package/dist/cli/secret-input.js.map +1 -0
  55. package/dist/cli/status-line.d.ts +24 -0
  56. package/dist/cli/status-line.js +49 -0
  57. package/dist/cli/status-line.js.map +1 -0
  58. package/dist/cli/stream-text.d.ts +18 -0
  59. package/dist/cli/stream-text.js +63 -0
  60. package/dist/cli/stream-text.js.map +1 -0
  61. package/dist/cli/theme.d.ts +48 -0
  62. package/dist/cli/theme.js +158 -0
  63. package/dist/cli/theme.js.map +1 -0
  64. package/dist/cli/tool-box.d.ts +41 -0
  65. package/dist/cli/tool-box.js +177 -0
  66. package/dist/cli/tool-box.js.map +1 -0
  67. package/dist/cli/transcript.d.ts +26 -0
  68. package/dist/cli/transcript.js +64 -0
  69. package/dist/cli/transcript.js.map +1 -0
  70. package/dist/config/credentials.d.ts +26 -0
  71. package/dist/config/credentials.js +79 -0
  72. package/dist/config/credentials.js.map +1 -0
  73. package/dist/config/defaults.d.ts +34 -0
  74. package/dist/config/defaults.js +35 -0
  75. package/dist/config/defaults.js.map +1 -0
  76. package/dist/config/load.d.ts +9 -0
  77. package/dist/config/load.js +137 -0
  78. package/dist/config/load.js.map +1 -0
  79. package/dist/config/paths.d.ts +4 -0
  80. package/dist/config/paths.js +14 -0
  81. package/dist/config/paths.js.map +1 -0
  82. package/dist/config/schema.d.ts +132 -0
  83. package/dist/config/schema.js +83 -0
  84. package/dist/config/schema.js.map +1 -0
  85. package/dist/config/write.d.ts +20 -0
  86. package/dist/config/write.js +70 -0
  87. package/dist/config/write.js.map +1 -0
  88. package/dist/context/budget.d.ts +2 -0
  89. package/dist/context/budget.js +13 -0
  90. package/dist/context/budget.js.map +1 -0
  91. package/dist/context/builder.d.ts +7 -0
  92. package/dist/context/builder.js +11 -0
  93. package/dist/context/builder.js.map +1 -0
  94. package/dist/context/compaction.d.ts +1 -0
  95. package/dist/context/compaction.js +5 -0
  96. package/dist/context/compaction.js.map +1 -0
  97. package/dist/context/instructions.d.ts +3 -0
  98. package/dist/context/instructions.js +30 -0
  99. package/dist/context/instructions.js.map +1 -0
  100. package/dist/context/manager.d.ts +29 -0
  101. package/dist/context/manager.js +122 -0
  102. package/dist/context/manager.js.map +1 -0
  103. package/dist/extensions/api.d.ts +51 -0
  104. package/dist/extensions/api.js +101 -0
  105. package/dist/extensions/api.js.map +1 -0
  106. package/dist/extensions/discovery.d.ts +26 -0
  107. package/dist/extensions/discovery.js +243 -0
  108. package/dist/extensions/discovery.js.map +1 -0
  109. package/dist/extensions/loader.d.ts +27 -0
  110. package/dist/extensions/loader.js +113 -0
  111. package/dist/extensions/loader.js.map +1 -0
  112. package/dist/extensions/trust.d.ts +4 -0
  113. package/dist/extensions/trust.js +40 -0
  114. package/dist/extensions/trust.js.map +1 -0
  115. package/dist/extensions/types.d.ts +52 -0
  116. package/dist/extensions/types.js +2 -0
  117. package/dist/extensions/types.js.map +1 -0
  118. package/dist/index.d.ts +17 -0
  119. package/dist/index.js +17 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/mcp/client.d.ts +73 -0
  122. package/dist/mcp/client.js +363 -0
  123. package/dist/mcp/client.js.map +1 -0
  124. package/dist/mcp/format.d.ts +3 -0
  125. package/dist/mcp/format.js +37 -0
  126. package/dist/mcp/format.js.map +1 -0
  127. package/dist/mcp/index.d.ts +6 -0
  128. package/dist/mcp/index.js +7 -0
  129. package/dist/mcp/index.js.map +1 -0
  130. package/dist/mcp/manager.d.ts +53 -0
  131. package/dist/mcp/manager.js +349 -0
  132. package/dist/mcp/manager.js.map +1 -0
  133. package/dist/mcp/stdio-transport.d.ts +26 -0
  134. package/dist/mcp/stdio-transport.js +191 -0
  135. package/dist/mcp/stdio-transport.js.map +1 -0
  136. package/dist/mcp/tools.d.ts +22 -0
  137. package/dist/mcp/tools.js +162 -0
  138. package/dist/mcp/tools.js.map +1 -0
  139. package/dist/mcp/types.d.ts +92 -0
  140. package/dist/mcp/types.js +2 -0
  141. package/dist/mcp/types.js.map +1 -0
  142. package/dist/providers/catalog.d.ts +60 -0
  143. package/dist/providers/catalog.js +289 -0
  144. package/dist/providers/catalog.js.map +1 -0
  145. package/dist/providers/context-window.d.ts +11 -0
  146. package/dist/providers/context-window.js +87 -0
  147. package/dist/providers/context-window.js.map +1 -0
  148. package/dist/providers/factory.d.ts +2 -0
  149. package/dist/providers/factory.js +55 -0
  150. package/dist/providers/factory.js.map +1 -0
  151. package/dist/providers/fake.d.ts +14 -0
  152. package/dist/providers/fake.js +23 -0
  153. package/dist/providers/fake.js.map +1 -0
  154. package/dist/providers/gemini.d.ts +24 -0
  155. package/dist/providers/gemini.js +228 -0
  156. package/dist/providers/gemini.js.map +1 -0
  157. package/dist/providers/index.d.ts +5 -0
  158. package/dist/providers/index.js +4 -0
  159. package/dist/providers/index.js.map +1 -0
  160. package/dist/providers/ollama.d.ts +64 -0
  161. package/dist/providers/ollama.js +433 -0
  162. package/dist/providers/ollama.js.map +1 -0
  163. package/dist/providers/openai-compatible.d.ts +27 -0
  164. package/dist/providers/openai-compatible.js +282 -0
  165. package/dist/providers/openai-compatible.js.map +1 -0
  166. package/dist/providers/registry.d.ts +7 -0
  167. package/dist/providers/registry.js +13 -0
  168. package/dist/providers/registry.js.map +1 -0
  169. package/dist/providers/tool-calls.d.ts +18 -0
  170. package/dist/providers/tool-calls.js +42 -0
  171. package/dist/providers/tool-calls.js.map +1 -0
  172. package/dist/providers/types.d.ts +16 -0
  173. package/dist/providers/types.js +2 -0
  174. package/dist/providers/types.js.map +1 -0
  175. package/dist/runtime/approvals.d.ts +20 -0
  176. package/dist/runtime/approvals.js +20 -0
  177. package/dist/runtime/approvals.js.map +1 -0
  178. package/dist/runtime/executor.d.ts +2 -0
  179. package/dist/runtime/executor.js +4 -0
  180. package/dist/runtime/executor.js.map +1 -0
  181. package/dist/runtime/locks.d.ts +13 -0
  182. package/dist/runtime/locks.js +180 -0
  183. package/dist/runtime/locks.js.map +1 -0
  184. package/dist/runtime/scheduler.d.ts +7 -0
  185. package/dist/runtime/scheduler.js +110 -0
  186. package/dist/runtime/scheduler.js.map +1 -0
  187. package/dist/security/paths.d.ts +1 -0
  188. package/dist/security/paths.js +35 -0
  189. package/dist/security/paths.js.map +1 -0
  190. package/dist/security/process.d.ts +1 -0
  191. package/dist/security/process.js +8 -0
  192. package/dist/security/process.js.map +1 -0
  193. package/dist/security/redaction.d.ts +1 -0
  194. package/dist/security/redaction.js +4 -0
  195. package/dist/security/redaction.js.map +1 -0
  196. package/dist/sessions/events.d.ts +30 -0
  197. package/dist/sessions/events.js +92 -0
  198. package/dist/sessions/events.js.map +1 -0
  199. package/dist/sessions/history.d.ts +18 -0
  200. package/dist/sessions/history.js +76 -0
  201. package/dist/sessions/history.js.map +1 -0
  202. package/dist/sessions/index.d.ts +5 -0
  203. package/dist/sessions/index.js +6 -0
  204. package/dist/sessions/index.js.map +1 -0
  205. package/dist/sessions/recovery.d.ts +6 -0
  206. package/dist/sessions/recovery.js +35 -0
  207. package/dist/sessions/recovery.js.map +1 -0
  208. package/dist/sessions/search.d.ts +16 -0
  209. package/dist/sessions/search.js +136 -0
  210. package/dist/sessions/search.js.map +1 -0
  211. package/dist/sessions/store.d.ts +91 -0
  212. package/dist/sessions/store.js +360 -0
  213. package/dist/sessions/store.js.map +1 -0
  214. package/dist/skills/registry.d.ts +23 -0
  215. package/dist/skills/registry.js +129 -0
  216. package/dist/skills/registry.js.map +1 -0
  217. package/dist/tools/bash.d.ts +2 -0
  218. package/dist/tools/bash.js +159 -0
  219. package/dist/tools/bash.js.map +1 -0
  220. package/dist/tools/diff.d.ts +7 -0
  221. package/dist/tools/diff.js +40 -0
  222. package/dist/tools/diff.js.map +1 -0
  223. package/dist/tools/edit.d.ts +2 -0
  224. package/dist/tools/edit.js +118 -0
  225. package/dist/tools/edit.js.map +1 -0
  226. package/dist/tools/index.d.ts +8 -0
  227. package/dist/tools/index.js +8 -0
  228. package/dist/tools/index.js.map +1 -0
  229. package/dist/tools/read.d.ts +2 -0
  230. package/dist/tools/read.js +138 -0
  231. package/dist/tools/read.js.map +1 -0
  232. package/dist/tools/registry.d.ts +7 -0
  233. package/dist/tools/registry.js +13 -0
  234. package/dist/tools/registry.js.map +1 -0
  235. package/dist/tools/types.d.ts +27 -0
  236. package/dist/tools/types.js +2 -0
  237. package/dist/tools/types.js.map +1 -0
  238. package/dist/tools/webfetch.d.ts +2 -0
  239. package/dist/tools/webfetch.js +97 -0
  240. package/dist/tools/webfetch.js.map +1 -0
  241. package/dist/tools/websearch.d.ts +2 -0
  242. package/dist/tools/websearch.js +88 -0
  243. package/dist/tools/websearch.js.map +1 -0
  244. package/dist/tools/write.d.ts +2 -0
  245. package/dist/tools/write.js +91 -0
  246. package/dist/tools/write.js.map +1 -0
  247. package/dist/types.d.ts +84 -0
  248. package/dist/types.js +10 -0
  249. package/dist/types.js.map +1 -0
  250. package/package.json +74 -4
@@ -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,191 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ const ENV_ALLOWLIST = new Set([
4
+ "PATH",
5
+ "HOME",
6
+ "USER",
7
+ "LOGNAME",
8
+ "SHELL",
9
+ "LANG",
10
+ "LANGUAGE",
11
+ "TERM",
12
+ "TMPDIR",
13
+ "TMP",
14
+ "TEMP",
15
+ // Windows process bootstrap.
16
+ "SystemRoot",
17
+ "SystemDrive",
18
+ "WINDIR",
19
+ "ComSpec",
20
+ "PATHEXT",
21
+ "USERPROFILE",
22
+ "APPDATA",
23
+ "LOCALAPPDATA",
24
+ "PROGRAMDATA",
25
+ "PROGRAMFILES",
26
+ "PROGRAMFILES(X86)",
27
+ "CommonProgramFiles",
28
+ "CommonProgramW6432",
29
+ ]);
30
+ const ENV_PREFIX_ALLOWLIST = ["LC_", "XDG_"];
31
+ /**
32
+ * Build the deliberately small environment inherited by an MCP server. The
33
+ * provider API keys in the parent process are not part of the allowlist, so a
34
+ * server only receives secrets the user explicitly declared.
35
+ */
36
+ export function buildMcpEnv(declared = {}, base = process.env) {
37
+ const env = {};
38
+ for (const [key, value] of Object.entries(base)) {
39
+ if (value === undefined)
40
+ continue;
41
+ if (ENV_ALLOWLIST.has(key) ||
42
+ ENV_PREFIX_ALLOWLIST.some((prefix) => key.startsWith(prefix))) {
43
+ env[key] = value;
44
+ }
45
+ }
46
+ for (const [key, value] of Object.entries(declared)) {
47
+ env[key] = value;
48
+ }
49
+ return env;
50
+ }
51
+ const MAX_STDERR_BYTES = 8192;
52
+ /**
53
+ * MCP stdio framing: one JSON-RPC message per newline. stderr is captured for
54
+ * diagnostics but never mixed into the protocol stream.
55
+ */
56
+ export class StdioTransport {
57
+ config;
58
+ handlers;
59
+ child;
60
+ lines;
61
+ startPromise;
62
+ closing = false;
63
+ stderrBuffer = "";
64
+ constructor(config) {
65
+ this.config = config;
66
+ }
67
+ setHandlers(handlers) {
68
+ this.handlers = handlers;
69
+ }
70
+ stderrText() {
71
+ return this.stderrBuffer.trim();
72
+ }
73
+ start() {
74
+ if (this.startPromise)
75
+ return this.startPromise;
76
+ this.startPromise = new Promise((resolve, reject) => {
77
+ let settled = false;
78
+ let child;
79
+ try {
80
+ child = spawn(this.config.command, this.config.args ?? [], {
81
+ cwd: this.config.cwd,
82
+ env: buildMcpEnv(this.config.env ?? {}),
83
+ stdio: ["pipe", "pipe", "pipe"],
84
+ windowsHide: true,
85
+ detached: process.platform !== "win32",
86
+ });
87
+ }
88
+ catch (error) {
89
+ reject(error instanceof Error ? error : new Error(String(error)));
90
+ return;
91
+ }
92
+ this.child = child;
93
+ child.once("spawn", () => {
94
+ settled = true;
95
+ resolve();
96
+ });
97
+ child.once("error", (error) => {
98
+ if (!settled) {
99
+ settled = true;
100
+ reject(error);
101
+ }
102
+ else {
103
+ this.handlers?.onError(error);
104
+ }
105
+ });
106
+ child.once("close", (code, signal) => {
107
+ this.lines?.close();
108
+ this.lines = undefined;
109
+ this.child = undefined;
110
+ if (!this.closing) {
111
+ this.handlers?.onClose({ code, signal });
112
+ }
113
+ });
114
+ child.stderr?.on("data", (chunk) => {
115
+ this.stderrBuffer += chunk.toString();
116
+ if (this.stderrBuffer.length > MAX_STDERR_BYTES) {
117
+ this.stderrBuffer = this.stderrBuffer.slice(-MAX_STDERR_BYTES);
118
+ }
119
+ });
120
+ this.lines = createInterface({ input: child.stdout, crlfDelay: Infinity });
121
+ this.lines.on("line", (line) => {
122
+ const trimmed = line.trim();
123
+ if (!trimmed)
124
+ return;
125
+ try {
126
+ this.handlers?.onMessage(JSON.parse(trimmed));
127
+ }
128
+ catch {
129
+ this.handlers?.onError(new Error(`MCP server sent invalid JSON: ${trimmed.slice(0, 200)}`));
130
+ }
131
+ });
132
+ });
133
+ return this.startPromise;
134
+ }
135
+ send(message) {
136
+ const stdin = this.child?.stdin;
137
+ if (!stdin || stdin.destroyed) {
138
+ throw new Error("MCP server stdin is not available");
139
+ }
140
+ stdin.write(JSON.stringify(message) + "\n");
141
+ }
142
+ async close() {
143
+ if (this.closing)
144
+ return;
145
+ this.closing = true;
146
+ this.lines?.close();
147
+ this.lines = undefined;
148
+ const child = this.child;
149
+ this.child = undefined;
150
+ if (!child)
151
+ return;
152
+ try {
153
+ child.stdin.end();
154
+ }
155
+ catch {
156
+ // Ignore.
157
+ }
158
+ if (child.exitCode !== null || child.signalCode !== null)
159
+ return;
160
+ const pid = child.pid;
161
+ const killGroup = (signal) => {
162
+ if (process.platform !== "win32" && pid) {
163
+ try {
164
+ process.kill(-pid, signal);
165
+ return;
166
+ }
167
+ catch {
168
+ // Fall through to direct child kill.
169
+ }
170
+ }
171
+ try {
172
+ child.kill(signal);
173
+ }
174
+ catch {
175
+ // Ignore.
176
+ }
177
+ };
178
+ killGroup("SIGTERM");
179
+ await new Promise((resolve) => {
180
+ const timer = setTimeout(() => {
181
+ killGroup("SIGKILL");
182
+ resolve();
183
+ }, 750);
184
+ child.once("close", () => {
185
+ clearTimeout(timer);
186
+ resolve();
187
+ });
188
+ });
189
+ }
190
+ }
191
+ //# 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;