@visorcraft/idlehands 0.9.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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent.js +2604 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/anton/controller.js +341 -0
  6. package/dist/anton/controller.js.map +1 -0
  7. package/dist/anton/lock.js +110 -0
  8. package/dist/anton/lock.js.map +1 -0
  9. package/dist/anton/parser.js +303 -0
  10. package/dist/anton/parser.js.map +1 -0
  11. package/dist/anton/prompt.js +203 -0
  12. package/dist/anton/prompt.js.map +1 -0
  13. package/dist/anton/reporter.js +119 -0
  14. package/dist/anton/reporter.js.map +1 -0
  15. package/dist/anton/session.js +51 -0
  16. package/dist/anton/session.js.map +1 -0
  17. package/dist/anton/types.js +7 -0
  18. package/dist/anton/types.js.map +1 -0
  19. package/dist/anton/verifier.js +263 -0
  20. package/dist/anton/verifier.js.map +1 -0
  21. package/dist/bench/compare.js +239 -0
  22. package/dist/bench/compare.js.map +1 -0
  23. package/dist/bench/debug_hooks.js +17 -0
  24. package/dist/bench/debug_hooks.js.map +1 -0
  25. package/dist/bench/json_extract.js +22 -0
  26. package/dist/bench/json_extract.js.map +1 -0
  27. package/dist/bench/openclaw.js +86 -0
  28. package/dist/bench/openclaw.js.map +1 -0
  29. package/dist/bench/report.js +116 -0
  30. package/dist/bench/report.js.map +1 -0
  31. package/dist/bench/runner.js +312 -0
  32. package/dist/bench/runner.js.map +1 -0
  33. package/dist/bench/types.js +2 -0
  34. package/dist/bench/types.js.map +1 -0
  35. package/dist/bot/commands.js +444 -0
  36. package/dist/bot/commands.js.map +1 -0
  37. package/dist/bot/confirm-discord.js +133 -0
  38. package/dist/bot/confirm-discord.js.map +1 -0
  39. package/dist/bot/confirm-telegram.js +290 -0
  40. package/dist/bot/confirm-telegram.js.map +1 -0
  41. package/dist/bot/discord.js +826 -0
  42. package/dist/bot/discord.js.map +1 -0
  43. package/dist/bot/format.js +210 -0
  44. package/dist/bot/format.js.map +1 -0
  45. package/dist/bot/session-manager.js +270 -0
  46. package/dist/bot/session-manager.js.map +1 -0
  47. package/dist/bot/telegram.js +678 -0
  48. package/dist/bot/telegram.js.map +1 -0
  49. package/dist/cli/agent-turn.js +45 -0
  50. package/dist/cli/agent-turn.js.map +1 -0
  51. package/dist/cli/args.js +236 -0
  52. package/dist/cli/args.js.map +1 -0
  53. package/dist/cli/bot.js +252 -0
  54. package/dist/cli/bot.js.map +1 -0
  55. package/dist/cli/build-repl-context.js +365 -0
  56. package/dist/cli/build-repl-context.js.map +1 -0
  57. package/dist/cli/command-registry.js +20 -0
  58. package/dist/cli/command-registry.js.map +1 -0
  59. package/dist/cli/commands/anton.js +271 -0
  60. package/dist/cli/commands/anton.js.map +1 -0
  61. package/dist/cli/commands/editing.js +328 -0
  62. package/dist/cli/commands/editing.js.map +1 -0
  63. package/dist/cli/commands/model.js +274 -0
  64. package/dist/cli/commands/model.js.map +1 -0
  65. package/dist/cli/commands/project.js +255 -0
  66. package/dist/cli/commands/project.js.map +1 -0
  67. package/dist/cli/commands/runtime.js +63 -0
  68. package/dist/cli/commands/runtime.js.map +1 -0
  69. package/dist/cli/commands/session.js +281 -0
  70. package/dist/cli/commands/session.js.map +1 -0
  71. package/dist/cli/commands/tools.js +126 -0
  72. package/dist/cli/commands/tools.js.map +1 -0
  73. package/dist/cli/commands/trifecta.js +221 -0
  74. package/dist/cli/commands/trifecta.js.map +1 -0
  75. package/dist/cli/commands/tui.js +17 -0
  76. package/dist/cli/commands/tui.js.map +1 -0
  77. package/dist/cli/init.js +222 -0
  78. package/dist/cli/init.js.map +1 -0
  79. package/dist/cli/input.js +360 -0
  80. package/dist/cli/input.js.map +1 -0
  81. package/dist/cli/oneshot.js +254 -0
  82. package/dist/cli/oneshot.js.map +1 -0
  83. package/dist/cli/repl-context.js +2 -0
  84. package/dist/cli/repl-context.js.map +1 -0
  85. package/dist/cli/runtime-cmds.js +811 -0
  86. package/dist/cli/runtime-cmds.js.map +1 -0
  87. package/dist/cli/service.js +145 -0
  88. package/dist/cli/service.js.map +1 -0
  89. package/dist/cli/session-state.js +130 -0
  90. package/dist/cli/session-state.js.map +1 -0
  91. package/dist/cli/setup.js +815 -0
  92. package/dist/cli/setup.js.map +1 -0
  93. package/dist/cli/shell.js +79 -0
  94. package/dist/cli/shell.js.map +1 -0
  95. package/dist/cli/status.js +392 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/watch.js +33 -0
  98. package/dist/cli/watch.js.map +1 -0
  99. package/dist/client.js +676 -0
  100. package/dist/client.js.map +1 -0
  101. package/dist/commands.js +194 -0
  102. package/dist/commands.js.map +1 -0
  103. package/dist/config.js +507 -0
  104. package/dist/config.js.map +1 -0
  105. package/dist/confirm/auto.js +13 -0
  106. package/dist/confirm/auto.js.map +1 -0
  107. package/dist/confirm/headless.js +41 -0
  108. package/dist/confirm/headless.js.map +1 -0
  109. package/dist/confirm/terminal.js +90 -0
  110. package/dist/confirm/terminal.js.map +1 -0
  111. package/dist/context.js +49 -0
  112. package/dist/context.js.map +1 -0
  113. package/dist/git.js +136 -0
  114. package/dist/git.js.map +1 -0
  115. package/dist/harnesses.js +171 -0
  116. package/dist/harnesses.js.map +1 -0
  117. package/dist/history.js +139 -0
  118. package/dist/history.js.map +1 -0
  119. package/dist/index.js +700 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/indexer.js +374 -0
  122. package/dist/indexer.js.map +1 -0
  123. package/dist/jsonrpc.js +76 -0
  124. package/dist/jsonrpc.js.map +1 -0
  125. package/dist/lens.js +525 -0
  126. package/dist/lens.js.map +1 -0
  127. package/dist/lsp.js +605 -0
  128. package/dist/lsp.js.map +1 -0
  129. package/dist/markdown.js +275 -0
  130. package/dist/markdown.js.map +1 -0
  131. package/dist/mcp.js +554 -0
  132. package/dist/mcp.js.map +1 -0
  133. package/dist/recovery.js +178 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/replay.js +132 -0
  136. package/dist/replay.js.map +1 -0
  137. package/dist/replay_cli.js +24 -0
  138. package/dist/replay_cli.js.map +1 -0
  139. package/dist/runtime/executor.js +418 -0
  140. package/dist/runtime/executor.js.map +1 -0
  141. package/dist/runtime/planner.js +197 -0
  142. package/dist/runtime/planner.js.map +1 -0
  143. package/dist/runtime/store.js +289 -0
  144. package/dist/runtime/store.js.map +1 -0
  145. package/dist/runtime/types.js +2 -0
  146. package/dist/runtime/types.js.map +1 -0
  147. package/dist/safety.js +446 -0
  148. package/dist/safety.js.map +1 -0
  149. package/dist/spinner.js +224 -0
  150. package/dist/spinner.js.map +1 -0
  151. package/dist/sys/context.js +124 -0
  152. package/dist/sys/context.js.map +1 -0
  153. package/dist/sys/snapshot.sh +97 -0
  154. package/dist/term.js +61 -0
  155. package/dist/term.js.map +1 -0
  156. package/dist/themes.js +135 -0
  157. package/dist/themes.js.map +1 -0
  158. package/dist/tools.js +1114 -0
  159. package/dist/tools.js.map +1 -0
  160. package/dist/tui/branch-picker.js +65 -0
  161. package/dist/tui/branch-picker.js.map +1 -0
  162. package/dist/tui/command-handler.js +108 -0
  163. package/dist/tui/command-handler.js.map +1 -0
  164. package/dist/tui/confirm.js +90 -0
  165. package/dist/tui/confirm.js.map +1 -0
  166. package/dist/tui/controller.js +463 -0
  167. package/dist/tui/controller.js.map +1 -0
  168. package/dist/tui/event-bridge.js +44 -0
  169. package/dist/tui/event-bridge.js.map +1 -0
  170. package/dist/tui/events.js +2 -0
  171. package/dist/tui/events.js.map +1 -0
  172. package/dist/tui/keymap.js +144 -0
  173. package/dist/tui/keymap.js.map +1 -0
  174. package/dist/tui/layout.js +11 -0
  175. package/dist/tui/layout.js.map +1 -0
  176. package/dist/tui/render.js +186 -0
  177. package/dist/tui/render.js.map +1 -0
  178. package/dist/tui/screen.js +48 -0
  179. package/dist/tui/screen.js.map +1 -0
  180. package/dist/tui/state.js +167 -0
  181. package/dist/tui/state.js.map +1 -0
  182. package/dist/tui/theme.js +70 -0
  183. package/dist/tui/theme.js.map +1 -0
  184. package/dist/tui/types.js +2 -0
  185. package/dist/tui/types.js.map +1 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/upgrade.js +412 -0
  189. package/dist/upgrade.js.map +1 -0
  190. package/dist/utils.js +87 -0
  191. package/dist/utils.js.map +1 -0
  192. package/dist/vault.js +520 -0
  193. package/dist/vault.js.map +1 -0
  194. package/dist/vim.js +160 -0
  195. package/dist/vim.js.map +1 -0
  196. package/package.json +67 -0
  197. package/src/sys/snapshot.sh +97 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,554 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { encodeJsonRpcFrame, extractMessages } from './jsonrpc.js';
3
+ import { PKG_VERSION } from './utils.js';
4
+ function normalizeSchema(schema) {
5
+ if (schema && typeof schema === 'object' && !Array.isArray(schema)) {
6
+ return schema;
7
+ }
8
+ return {
9
+ type: 'object',
10
+ additionalProperties: false,
11
+ properties: {},
12
+ required: [],
13
+ };
14
+ }
15
+ function estimateSchemaTokens(schema) {
16
+ const json = JSON.stringify(schema);
17
+ return Math.max(1, Math.ceil(json.length / 4));
18
+ }
19
+ function clampToolResult(raw, maxBytes = 4096) {
20
+ const buf = Buffer.from(raw ?? '', 'utf8');
21
+ if (buf.length <= maxBytes)
22
+ return raw;
23
+ const cut = buf.subarray(0, maxBytes).toString('utf8');
24
+ return `${cut}\n[truncated, ${buf.length} bytes total]`;
25
+ }
26
+ function parseToolCallResult(result) {
27
+ if (result == null)
28
+ return '';
29
+ // MCP tool result often looks like:
30
+ // { content: [{ type: 'text', text: '...' }], isError?: boolean }
31
+ if (Array.isArray(result?.content)) {
32
+ const parts = [];
33
+ for (const item of result.content) {
34
+ if (!item)
35
+ continue;
36
+ if (typeof item.text === 'string') {
37
+ parts.push(item.text);
38
+ }
39
+ else if (typeof item.data === 'string') {
40
+ parts.push(item.data);
41
+ }
42
+ else {
43
+ parts.push(JSON.stringify(item));
44
+ }
45
+ }
46
+ return parts.join('\n').trim() || JSON.stringify(result);
47
+ }
48
+ if (typeof result?.content === 'string') {
49
+ return result.content;
50
+ }
51
+ if (typeof result?.text === 'string') {
52
+ return result.text;
53
+ }
54
+ return JSON.stringify(result);
55
+ }
56
+ function asArray(v) {
57
+ if (Array.isArray(v))
58
+ return v;
59
+ return [];
60
+ }
61
+ function toErrorMessage(e) {
62
+ return e?.message ?? String(e);
63
+ }
64
+ class StdioRpcTransport {
65
+ child;
66
+ nextId = 1;
67
+ pending = new Map();
68
+ buffer = Buffer.alloc(0);
69
+ closed = false;
70
+ stderrTail = '';
71
+ constructor(command, args, env) {
72
+ this.child = spawn(command, args, {
73
+ stdio: ['pipe', 'pipe', 'pipe'],
74
+ env: { ...process.env, ...(env ?? {}) },
75
+ });
76
+ this.child.stdout.on('data', (chunk) => {
77
+ const b = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
78
+ this.buffer = Buffer.concat([this.buffer, b]);
79
+ this.parseBuffer();
80
+ });
81
+ this.child.stderr.on('data', (chunk) => {
82
+ const text = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
83
+ this.stderrTail = (this.stderrTail + text).slice(-2000);
84
+ });
85
+ this.child.on('error', (err) => {
86
+ this.failAll(new Error(`MCP stdio transport error: ${err.message}`));
87
+ });
88
+ this.child.on('close', (code, signal) => {
89
+ this.closed = true;
90
+ const reason = `MCP stdio transport closed (code=${code ?? 'null'}, signal=${signal ?? 'null'})`;
91
+ const tail = this.stderrTail.trim();
92
+ const msg = tail ? `${reason}; stderr: ${tail}` : reason;
93
+ this.failAll(new Error(msg));
94
+ });
95
+ }
96
+ failAll(err) {
97
+ for (const [id, p] of this.pending.entries()) {
98
+ clearTimeout(p.timer);
99
+ p.reject(err);
100
+ this.pending.delete(id);
101
+ }
102
+ }
103
+ writeFrame(message) {
104
+ if (this.closed)
105
+ throw new Error('MCP stdio transport is closed');
106
+ this.child.stdin.write(encodeJsonRpcFrame(message));
107
+ }
108
+ parseBuffer() {
109
+ const { messages, remaining } = extractMessages(this.buffer);
110
+ this.buffer = remaining;
111
+ for (const msg of messages) {
112
+ this.handleParsedMessage(msg);
113
+ }
114
+ // Fallback: newline-delimited JSON for non-standard test servers
115
+ while (this.buffer.length > 0) {
116
+ const prefix = this.buffer.subarray(0, Math.min(32, this.buffer.length)).toString('utf8').toLowerCase();
117
+ if (prefix.startsWith('content-length'))
118
+ return; // incomplete header, wait
119
+ const nl = this.buffer.indexOf(0x0a);
120
+ if (nl < 0)
121
+ return;
122
+ const line = this.buffer.subarray(0, nl).toString('utf8').trim();
123
+ this.buffer = Buffer.from(this.buffer.subarray(nl + 1));
124
+ if (!line)
125
+ continue;
126
+ try {
127
+ this.handleParsedMessage(JSON.parse(line));
128
+ }
129
+ catch { /* skip malformed lines */ }
130
+ }
131
+ }
132
+ handleParsedMessage(msg) {
133
+ if (typeof msg.id !== 'number') {
134
+ // Notification / event, ignore for now.
135
+ return;
136
+ }
137
+ const pending = this.pending.get(msg.id);
138
+ if (!pending)
139
+ return;
140
+ this.pending.delete(msg.id);
141
+ clearTimeout(pending.timer);
142
+ if (msg.error) {
143
+ pending.reject(new Error(msg.error.message || `MCP error code ${msg.error.code ?? 'unknown'}`));
144
+ return;
145
+ }
146
+ pending.resolve(msg.result ?? null);
147
+ }
148
+ async request(method, params, timeoutMs) {
149
+ const id = this.nextId++;
150
+ return await new Promise((resolve, reject) => {
151
+ const timer = setTimeout(() => {
152
+ this.pending.delete(id);
153
+ reject(new Error(`MCP request timed out: ${method} after ${timeoutMs}ms`));
154
+ }, Math.max(1, timeoutMs));
155
+ this.pending.set(id, {
156
+ resolve,
157
+ reject,
158
+ timer,
159
+ });
160
+ try {
161
+ this.writeFrame({
162
+ jsonrpc: '2.0',
163
+ id,
164
+ method,
165
+ params,
166
+ });
167
+ }
168
+ catch (e) {
169
+ clearTimeout(timer);
170
+ this.pending.delete(id);
171
+ reject(e instanceof Error ? e : new Error(String(e)));
172
+ }
173
+ });
174
+ }
175
+ async notify(method, params) {
176
+ this.writeFrame({
177
+ jsonrpc: '2.0',
178
+ method,
179
+ params,
180
+ });
181
+ }
182
+ async close() {
183
+ this.closed = true;
184
+ try {
185
+ this.child.stdin.end();
186
+ }
187
+ catch { }
188
+ try {
189
+ this.child.kill('SIGTERM');
190
+ }
191
+ catch { }
192
+ }
193
+ }
194
+ class HttpRpcTransport {
195
+ url;
196
+ nextId = 1;
197
+ constructor(url) {
198
+ this.url = url;
199
+ }
200
+ async request(method, params, timeoutMs) {
201
+ const id = this.nextId++;
202
+ const ac = new AbortController();
203
+ const timer = setTimeout(() => ac.abort(), Math.max(1, timeoutMs));
204
+ try {
205
+ const res = await fetch(this.url, {
206
+ method: 'POST',
207
+ headers: {
208
+ 'content-type': 'application/json',
209
+ accept: 'application/json',
210
+ },
211
+ body: JSON.stringify({ jsonrpc: '2.0', id, method, params }),
212
+ signal: ac.signal,
213
+ });
214
+ if (!res.ok) {
215
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
216
+ }
217
+ const json = await res.json().catch(() => ({}));
218
+ if (json?.error) {
219
+ throw new Error(json.error.message || `MCP error code ${json.error.code ?? 'unknown'}`);
220
+ }
221
+ return json?.result ?? null;
222
+ }
223
+ finally {
224
+ clearTimeout(timer);
225
+ }
226
+ }
227
+ async notify(method, params) {
228
+ const ac = new AbortController();
229
+ const timer = setTimeout(() => ac.abort(), 5000);
230
+ try {
231
+ await fetch(this.url, {
232
+ method: 'POST',
233
+ headers: {
234
+ 'content-type': 'application/json',
235
+ accept: 'application/json',
236
+ },
237
+ body: JSON.stringify({ jsonrpc: '2.0', method, params }),
238
+ signal: ac.signal,
239
+ }).catch(() => { });
240
+ }
241
+ finally {
242
+ clearTimeout(timer);
243
+ }
244
+ }
245
+ async close() {
246
+ // nothing to close
247
+ }
248
+ }
249
+ export class MCPManager {
250
+ opts;
251
+ servers = new Map();
252
+ tools = new Map();
253
+ warnings = [];
254
+ nextRank = 0;
255
+ toolBudgetTokens;
256
+ callTimeoutMs;
257
+ builtInToolNames;
258
+ globalEnabledTools;
259
+ constructor(opts) {
260
+ this.opts = opts;
261
+ this.toolBudgetTokens = Number.isFinite(opts.toolBudgetTokens)
262
+ ? Math.max(0, Math.floor(opts.toolBudgetTokens))
263
+ : 1000;
264
+ this.callTimeoutMs = Number.isFinite(opts.callTimeoutMs)
265
+ ? Math.max(1000, Math.floor(opts.callTimeoutMs))
266
+ : 30_000;
267
+ this.builtInToolNames = new Set(opts.builtInToolNames ?? []);
268
+ this.globalEnabledTools = Array.isArray(opts.enabledTools) && opts.enabledTools.length
269
+ ? new Set(opts.enabledTools)
270
+ : null;
271
+ }
272
+ getWarnings() {
273
+ return [...this.warnings];
274
+ }
275
+ pushWarn(msg) {
276
+ this.warnings.push(msg);
277
+ }
278
+ async init() {
279
+ this.warnings = [];
280
+ this.servers.clear();
281
+ this.tools.clear();
282
+ for (const rawCfg of this.opts.servers) {
283
+ if (!rawCfg || typeof rawCfg !== 'object')
284
+ continue;
285
+ const name = String(rawCfg.name ?? '').trim();
286
+ if (!name)
287
+ continue;
288
+ if (this.servers.has(name)) {
289
+ this.pushWarn(`[mcp] duplicate server name '${name}' ignored`);
290
+ continue;
291
+ }
292
+ const transport = rawCfg.transport === 'http' ? 'http' : 'stdio';
293
+ const cfg = {
294
+ ...rawCfg,
295
+ name,
296
+ transport,
297
+ args: asArray(rawCfg.args).map((a) => String(a)),
298
+ };
299
+ if (cfg.enabled === false) {
300
+ this.servers.set(name, { config: cfg, connected: false, tools: [], error: 'disabled' });
301
+ continue;
302
+ }
303
+ if (this.opts.offline && cfg.transport === 'http') {
304
+ this.servers.set(name, {
305
+ config: cfg,
306
+ connected: false,
307
+ tools: [],
308
+ error: 'offline mode: HTTP MCP transport disabled',
309
+ });
310
+ this.pushWarn(`[mcp] ${name}: skipped HTTP server in offline mode`);
311
+ continue;
312
+ }
313
+ const server = await this.connectServer(cfg);
314
+ this.servers.set(name, server);
315
+ }
316
+ this.recomputeBudget();
317
+ }
318
+ async connectServer(cfg) {
319
+ const name = cfg.name;
320
+ const server = {
321
+ config: cfg,
322
+ connected: false,
323
+ tools: [],
324
+ };
325
+ try {
326
+ let transport;
327
+ if (cfg.transport === 'http') {
328
+ const url = String(cfg.url ?? '').trim();
329
+ if (!url)
330
+ throw new Error('missing url');
331
+ transport = new HttpRpcTransport(url);
332
+ }
333
+ else {
334
+ const command = String(cfg.command ?? '').trim();
335
+ if (!command)
336
+ throw new Error('missing command');
337
+ transport = new StdioRpcTransport(command, cfg.args ?? [], cfg.env);
338
+ }
339
+ server.transport = transport;
340
+ // Best-effort initialize handshake.
341
+ try {
342
+ await transport.request('initialize', {
343
+ protocolVersion: '2024-11-05',
344
+ capabilities: {},
345
+ clientInfo: {
346
+ name: 'idlehands',
347
+ version: PKG_VERSION,
348
+ },
349
+ }, this.callTimeoutMs);
350
+ await transport.notify('notifications/initialized', {});
351
+ }
352
+ catch {
353
+ // Not all servers require/implement initialize exactly; continue.
354
+ }
355
+ const listResult = await transport.request('tools/list', {}, this.callTimeoutMs);
356
+ const list = asArray(listResult?.tools);
357
+ const serverAllowed = Array.isArray(cfg.enabled_tools) && cfg.enabled_tools.length
358
+ ? new Set(cfg.enabled_tools)
359
+ : null;
360
+ for (const rawTool of list) {
361
+ const toolName = String(rawTool?.name ?? '').trim();
362
+ if (!toolName)
363
+ continue;
364
+ if (this.builtInToolNames.has(toolName)) {
365
+ this.pushWarn(`[mcp] ${name}: skipped '${toolName}' (conflicts with built-in tool)`);
366
+ continue;
367
+ }
368
+ if (this.tools.has(toolName)) {
369
+ this.pushWarn(`[mcp] ${name}: skipped '${toolName}' (duplicate MCP tool name)`);
370
+ continue;
371
+ }
372
+ const schema = {
373
+ type: 'function',
374
+ function: {
375
+ name: toolName,
376
+ description: `[mcp:${name}] ${String(rawTool?.description ?? 'MCP tool').trim()}`,
377
+ parameters: normalizeSchema(rawTool?.inputSchema),
378
+ },
379
+ };
380
+ const enabledByAllowList = (!this.globalEnabledTools || this.globalEnabledTools.has(toolName)) &&
381
+ (!serverAllowed || serverAllowed.has(toolName));
382
+ const readOnly = Boolean(rawTool?.readOnly ??
383
+ rawTool?.annotations?.readOnlyHint ??
384
+ rawTool?.annotations?.readOnly ??
385
+ false);
386
+ this.tools.set(toolName, {
387
+ name: toolName,
388
+ server: name,
389
+ description: typeof rawTool?.description === 'string' ? rawTool.description : undefined,
390
+ inputSchema: normalizeSchema(rawTool?.inputSchema),
391
+ readOnly,
392
+ estimatedTokens: estimateSchemaTokens(schema),
393
+ enabled: enabledByAllowList,
394
+ rank: this.nextRank++,
395
+ });
396
+ server.tools.push(toolName);
397
+ }
398
+ server.connected = true;
399
+ return server;
400
+ }
401
+ catch (e) {
402
+ server.connected = false;
403
+ server.error = toErrorMessage(e);
404
+ if (server.transport) {
405
+ await server.transport.close().catch(() => { });
406
+ }
407
+ this.pushWarn(`[mcp] ${name}: ${server.error}`);
408
+ return server;
409
+ }
410
+ }
411
+ recomputeBudget() {
412
+ const budget = this.toolBudgetTokens;
413
+ let used = 0;
414
+ const ordered = [...this.tools.values()].sort((a, b) => a.rank - b.rank);
415
+ for (const tool of ordered) {
416
+ if (!tool.enabled)
417
+ continue;
418
+ const next = used + tool.estimatedTokens;
419
+ if (next > budget) {
420
+ tool.enabled = false;
421
+ }
422
+ else {
423
+ used = next;
424
+ }
425
+ }
426
+ const disabledByBudget = ordered.filter((t) => !t.enabled).length;
427
+ if (disabledByBudget > 0) {
428
+ this.pushWarn(`[mcp] tool schema budget exceeded (${budget} tokens): ${disabledByBudget} tool(s) disabled`);
429
+ }
430
+ }
431
+ listServers() {
432
+ const out = [];
433
+ for (const s of this.servers.values()) {
434
+ const enabled = s.tools.filter((n) => this.tools.get(n)?.enabled).length;
435
+ out.push({
436
+ name: s.config.name,
437
+ transport: s.config.transport,
438
+ connected: s.connected,
439
+ toolsTotal: s.tools.length,
440
+ toolsEnabled: enabled,
441
+ error: s.error,
442
+ });
443
+ }
444
+ return out;
445
+ }
446
+ listTools(opts) {
447
+ const includeDisabled = opts?.includeDisabled === true;
448
+ const out = [];
449
+ for (const t of [...this.tools.values()].sort((a, b) => a.rank - b.rank)) {
450
+ if (!includeDisabled && !t.enabled)
451
+ continue;
452
+ out.push({
453
+ name: t.name,
454
+ server: t.server,
455
+ description: t.description,
456
+ readOnly: t.readOnly,
457
+ enabled: t.enabled,
458
+ estimatedTokens: t.estimatedTokens,
459
+ });
460
+ }
461
+ return out;
462
+ }
463
+ getEnabledToolSchemas() {
464
+ const schemas = [];
465
+ for (const t of [...this.tools.values()].sort((a, b) => a.rank - b.rank)) {
466
+ if (!t.enabled)
467
+ continue;
468
+ schemas.push({
469
+ type: 'function',
470
+ function: {
471
+ name: t.name,
472
+ description: `[mcp:${t.server}] ${t.description || 'MCP tool'}`,
473
+ parameters: normalizeSchema(t.inputSchema),
474
+ },
475
+ });
476
+ }
477
+ return schemas;
478
+ }
479
+ hasTool(name) {
480
+ return this.tools.has(name);
481
+ }
482
+ isToolReadOnly(name) {
483
+ return Boolean(this.tools.get(name)?.readOnly);
484
+ }
485
+ enableTool(name) {
486
+ const t = this.tools.get(name);
487
+ if (!t)
488
+ return false;
489
+ if (t.enabled)
490
+ return true;
491
+ const used = this.listTools().reduce((acc, cur) => acc + cur.estimatedTokens, 0);
492
+ if (used + t.estimatedTokens > this.toolBudgetTokens) {
493
+ return false;
494
+ }
495
+ t.enabled = true;
496
+ return true;
497
+ }
498
+ disableTool(name) {
499
+ const t = this.tools.get(name);
500
+ if (!t)
501
+ return false;
502
+ t.enabled = false;
503
+ return true;
504
+ }
505
+ async restartServer(name) {
506
+ const existing = this.servers.get(name);
507
+ if (!existing)
508
+ return { ok: false, message: `unknown MCP server: ${name}` };
509
+ if (existing.transport) {
510
+ await existing.transport.close().catch(() => { });
511
+ }
512
+ // Drop old tools for this server first.
513
+ for (const toolName of existing.tools) {
514
+ this.tools.delete(toolName);
515
+ }
516
+ const next = await this.connectServer(existing.config);
517
+ this.servers.set(name, next);
518
+ this.recomputeBudget();
519
+ if (!next.connected) {
520
+ return { ok: false, message: `MCP server ${name} restart failed: ${next.error || 'unknown error'}` };
521
+ }
522
+ return { ok: true, message: `MCP server ${name} reconnected (${next.tools.length} tools)` };
523
+ }
524
+ async callTool(name, args) {
525
+ const tool = this.tools.get(name);
526
+ if (!tool)
527
+ throw new Error(`unknown MCP tool: ${name}`);
528
+ if (!tool.enabled)
529
+ throw new Error(`MCP tool disabled: ${name}`);
530
+ const server = this.servers.get(tool.server);
531
+ if (!server?.transport || !server.connected) {
532
+ throw new Error(`MCP server unavailable: ${tool.server}`);
533
+ }
534
+ const result = await server.transport.request('tools/call', {
535
+ name,
536
+ arguments: args ?? {},
537
+ }, this.callTimeoutMs);
538
+ if (result?.isError) {
539
+ const msg = parseToolCallResult(result) || `MCP tool error: ${name}`;
540
+ throw new Error(msg);
541
+ }
542
+ const text = parseToolCallResult(result);
543
+ return clampToolResult(text, 4096);
544
+ }
545
+ async close() {
546
+ const closes = [];
547
+ for (const s of this.servers.values()) {
548
+ if (s.transport)
549
+ closes.push(s.transport.close().catch(() => { }));
550
+ }
551
+ await Promise.all(closes);
552
+ }
553
+ }
554
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}