@kernel.chat/kbot 2.5.0 → 2.8.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 (79) hide show
  1. package/README.md +98 -42
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +140 -21
  4. package/dist/agent.js.map +1 -1
  5. package/dist/architect.d.ts +44 -0
  6. package/dist/architect.d.ts.map +1 -0
  7. package/dist/architect.js +403 -0
  8. package/dist/architect.js.map +1 -0
  9. package/dist/auth.d.ts +11 -1
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +165 -7
  12. package/dist/auth.js.map +1 -1
  13. package/dist/cli.js +251 -22
  14. package/dist/cli.js.map +1 -1
  15. package/dist/graph-memory.d.ts +98 -0
  16. package/dist/graph-memory.d.ts.map +1 -0
  17. package/dist/graph-memory.js +926 -0
  18. package/dist/graph-memory.js.map +1 -0
  19. package/dist/ide/acp-server.js +2 -2
  20. package/dist/ide/mcp-server.js +1 -1
  21. package/dist/lsp-client.d.ts +167 -0
  22. package/dist/lsp-client.d.ts.map +1 -0
  23. package/dist/lsp-client.js +679 -0
  24. package/dist/lsp-client.js.map +1 -0
  25. package/dist/matrix.d.ts +6 -0
  26. package/dist/matrix.d.ts.map +1 -1
  27. package/dist/matrix.js +98 -0
  28. package/dist/matrix.js.map +1 -1
  29. package/dist/mcp-plugins.d.ts +62 -0
  30. package/dist/mcp-plugins.d.ts.map +1 -0
  31. package/dist/mcp-plugins.js +551 -0
  32. package/dist/mcp-plugins.js.map +1 -0
  33. package/dist/planner.d.ts.map +1 -1
  34. package/dist/planner.js +29 -0
  35. package/dist/planner.js.map +1 -1
  36. package/dist/provider-fallback.d.ts +51 -0
  37. package/dist/provider-fallback.d.ts.map +1 -0
  38. package/dist/provider-fallback.js +237 -0
  39. package/dist/provider-fallback.js.map +1 -0
  40. package/dist/repo-map.d.ts +9 -0
  41. package/dist/repo-map.d.ts.map +1 -0
  42. package/dist/repo-map.js +280 -0
  43. package/dist/repo-map.js.map +1 -0
  44. package/dist/self-eval.d.ts +45 -0
  45. package/dist/self-eval.d.ts.map +1 -0
  46. package/dist/self-eval.js +232 -0
  47. package/dist/self-eval.js.map +1 -0
  48. package/dist/streaming.d.ts.map +1 -1
  49. package/dist/streaming.js +22 -2
  50. package/dist/streaming.js.map +1 -1
  51. package/dist/task-ledger.d.ts +71 -0
  52. package/dist/task-ledger.d.ts.map +1 -0
  53. package/dist/task-ledger.js +282 -0
  54. package/dist/task-ledger.js.map +1 -0
  55. package/dist/tools/computer.js +3 -3
  56. package/dist/tools/computer.js.map +1 -1
  57. package/dist/tools/e2b-sandbox.d.ts +2 -0
  58. package/dist/tools/e2b-sandbox.d.ts.map +1 -0
  59. package/dist/tools/e2b-sandbox.js +460 -0
  60. package/dist/tools/e2b-sandbox.js.map +1 -0
  61. package/dist/tools/index.d.ts.map +1 -1
  62. package/dist/tools/index.js +15 -1
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/lsp-tools.d.ts +2 -0
  65. package/dist/tools/lsp-tools.d.ts.map +1 -0
  66. package/dist/tools/lsp-tools.js +268 -0
  67. package/dist/tools/lsp-tools.js.map +1 -0
  68. package/dist/tools/memory-tools.d.ts +2 -0
  69. package/dist/tools/memory-tools.d.ts.map +1 -0
  70. package/dist/tools/memory-tools.js +228 -0
  71. package/dist/tools/memory-tools.js.map +1 -0
  72. package/dist/tools/quality.d.ts +2 -0
  73. package/dist/tools/quality.d.ts.map +1 -0
  74. package/dist/tools/quality.js +313 -0
  75. package/dist/tools/quality.js.map +1 -0
  76. package/dist/ui.d.ts.map +1 -1
  77. package/dist/ui.js +33 -18
  78. package/dist/ui.js.map +1 -1
  79. package/package.json +27 -3
@@ -0,0 +1,551 @@
1
+ // K:BOT MCP-Native Plugin System
2
+ //
3
+ // Plugins are MCP servers — discovered, started, and consumed natively.
4
+ // Two discovery methods:
5
+ // 1. ~/.kbot/plugins.json — explicit MCP server configs
6
+ // 2. ~/.kbot/plugins/*/package.json — packages with "kbot": { "mcp": true }
7
+ //
8
+ // Each plugin is an MCP server process communicating over stdio.
9
+ // The agent can list all plugin tools and call them through meta-tools.
10
+ import { spawn } from 'node:child_process';
11
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ import { registerTool } from './tools/index.js';
15
+ // ── Constants ──
16
+ const KBOT_DIR = join(homedir(), '.kbot');
17
+ const PLUGINS_JSON = join(KBOT_DIR, 'plugins.json');
18
+ const PLUGINS_DIR = join(KBOT_DIR, 'plugins');
19
+ const STARTUP_TIMEOUT_MS = 30_000;
20
+ const REQUEST_TIMEOUT_MS = 30_000;
21
+ function encodeJsonRpc(msg) {
22
+ const body = JSON.stringify(msg);
23
+ return `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`;
24
+ }
25
+ // ── Plugin registry ──
26
+ const plugins = new Map();
27
+ /** Parse incoming JSON-RPC messages from a plugin's stdout buffer */
28
+ function parseMessages(plugin) {
29
+ while (true) {
30
+ const headerEnd = plugin.buffer.indexOf('\r\n\r\n');
31
+ if (headerEnd === -1)
32
+ break;
33
+ const header = plugin.buffer.slice(0, headerEnd);
34
+ const lengthMatch = header.match(/Content-Length:\s*(\d+)/i);
35
+ if (!lengthMatch) {
36
+ plugin.buffer = plugin.buffer.slice(headerEnd + 4);
37
+ continue;
38
+ }
39
+ const contentLength = parseInt(lengthMatch[1], 10);
40
+ const bodyStart = headerEnd + 4;
41
+ if (plugin.buffer.length < bodyStart + contentLength)
42
+ break;
43
+ const body = plugin.buffer.slice(bodyStart, bodyStart + contentLength);
44
+ plugin.buffer = plugin.buffer.slice(bodyStart + contentLength);
45
+ try {
46
+ const msg = JSON.parse(body);
47
+ if (msg.id !== undefined && plugin.pending.has(msg.id)) {
48
+ const entry = plugin.pending.get(msg.id);
49
+ plugin.pending.delete(msg.id);
50
+ clearTimeout(entry.timer);
51
+ if (msg.error) {
52
+ entry.reject(new Error(msg.error.message));
53
+ }
54
+ else {
55
+ entry.resolve(msg.result);
56
+ }
57
+ }
58
+ }
59
+ catch {
60
+ // skip malformed messages
61
+ }
62
+ }
63
+ }
64
+ /** Send a JSON-RPC request and await the response */
65
+ function sendRequest(plugin, method, params, timeoutMs = REQUEST_TIMEOUT_MS) {
66
+ return new Promise((resolve, reject) => {
67
+ if (!plugin.process?.stdin?.writable) {
68
+ reject(new Error(`Plugin "${plugin.id}" process is not available`));
69
+ return;
70
+ }
71
+ const id = ++plugin.messageId;
72
+ const timer = setTimeout(() => {
73
+ if (plugin.pending.has(id)) {
74
+ plugin.pending.delete(id);
75
+ reject(new Error(`Plugin "${plugin.id}" request timeout: ${method} (${timeoutMs}ms)`));
76
+ }
77
+ }, timeoutMs);
78
+ plugin.pending.set(id, { resolve, reject, timer });
79
+ const msg = { jsonrpc: '2.0', id, method, params };
80
+ plugin.process.stdin.write(encodeJsonRpc(msg));
81
+ });
82
+ }
83
+ /** Send a JSON-RPC notification (no response expected) */
84
+ function sendNotification(plugin, method, params) {
85
+ if (!plugin.process?.stdin?.writable)
86
+ return;
87
+ const msg = { jsonrpc: '2.0', method, params };
88
+ plugin.process.stdin.write(encodeJsonRpc(msg));
89
+ }
90
+ // ── Discovery ──
91
+ /** Discover all configured MCP plugins from plugins.json and package.json sources */
92
+ export function discoverPlugins() {
93
+ const discovered = new Map();
94
+ // Source 1: ~/.kbot/plugins.json
95
+ if (existsSync(PLUGINS_JSON)) {
96
+ try {
97
+ const raw = readFileSync(PLUGINS_JSON, 'utf-8');
98
+ const parsed = JSON.parse(raw);
99
+ if (parsed.plugins && typeof parsed.plugins === 'object') {
100
+ for (const [id, config] of Object.entries(parsed.plugins)) {
101
+ if (!config.command || typeof config.command !== 'string')
102
+ continue;
103
+ discovered.set(id, {
104
+ config: {
105
+ command: config.command,
106
+ args: Array.isArray(config.args) ? config.args : [],
107
+ env: config.env && typeof config.env === 'object' ? config.env : {},
108
+ },
109
+ source: 'plugins.json',
110
+ });
111
+ }
112
+ }
113
+ }
114
+ catch {
115
+ // Malformed plugins.json — skip silently
116
+ }
117
+ }
118
+ // Source 2: ~/.kbot/plugins/*/package.json with "kbot": { "mcp": true }
119
+ if (existsSync(PLUGINS_DIR)) {
120
+ try {
121
+ const entries = readdirSync(PLUGINS_DIR);
122
+ for (const entry of entries) {
123
+ const entryPath = join(PLUGINS_DIR, entry);
124
+ try {
125
+ const stat = statSync(entryPath);
126
+ if (!stat.isDirectory())
127
+ continue;
128
+ }
129
+ catch {
130
+ continue;
131
+ }
132
+ const pkgPath = join(entryPath, 'package.json');
133
+ if (!existsSync(pkgPath))
134
+ continue;
135
+ try {
136
+ const raw = readFileSync(pkgPath, 'utf-8');
137
+ const pkg = JSON.parse(raw);
138
+ if (pkg.kbot?.mcp !== true)
139
+ continue;
140
+ // Determine command: use "bin" field or default to "node ."
141
+ let command;
142
+ let args;
143
+ if (typeof pkg.bin === 'string') {
144
+ command = 'node';
145
+ args = [join(entryPath, pkg.bin)];
146
+ }
147
+ else if (pkg.bin && typeof pkg.bin === 'object') {
148
+ const firstBin = Object.values(pkg.bin)[0];
149
+ command = 'node';
150
+ args = [join(entryPath, firstBin)];
151
+ }
152
+ else if (pkg.main) {
153
+ command = 'node';
154
+ args = [join(entryPath, pkg.main)];
155
+ }
156
+ else {
157
+ command = 'node';
158
+ args = [entryPath];
159
+ }
160
+ const id = pkg.name || entry;
161
+ // Don't overwrite plugins.json entries — explicit config takes priority
162
+ if (!discovered.has(id)) {
163
+ discovered.set(id, {
164
+ config: { command, args, env: {} },
165
+ source: 'package.json',
166
+ });
167
+ }
168
+ }
169
+ catch {
170
+ // Malformed package.json — skip
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // Can't read plugins dir — skip
176
+ }
177
+ }
178
+ return discovered;
179
+ }
180
+ // ── Lifecycle ──
181
+ /** Start a single plugin by ID. Spawns the process, performs MCP handshake, fetches tools. */
182
+ export async function startPlugin(id) {
183
+ // Check if already running
184
+ const existing = plugins.get(id);
185
+ if (existing && (existing.health === 'healthy' || existing.health === 'starting')) {
186
+ return existing;
187
+ }
188
+ // Discover if not already in registry
189
+ const discovered = discoverPlugins();
190
+ const entry = discovered.get(id);
191
+ if (!entry) {
192
+ throw new Error(`Plugin "${id}" not found in plugins.json or plugin packages`);
193
+ }
194
+ const state = {
195
+ id,
196
+ config: entry.config,
197
+ source: entry.source,
198
+ health: 'starting',
199
+ process: null,
200
+ messageId: 0,
201
+ pending: new Map(),
202
+ buffer: '',
203
+ tools: [],
204
+ startedAt: null,
205
+ error: null,
206
+ };
207
+ plugins.set(id, state);
208
+ // Spawn the process
209
+ const { command, args = [], env = {} } = entry.config;
210
+ let proc;
211
+ try {
212
+ proc = spawn(command, args, {
213
+ stdio: ['pipe', 'pipe', 'pipe'],
214
+ env: { ...process.env, ...env },
215
+ });
216
+ }
217
+ catch (err) {
218
+ state.health = 'unhealthy';
219
+ state.error = `Failed to spawn: ${err instanceof Error ? err.message : String(err)}`;
220
+ return state;
221
+ }
222
+ state.process = proc;
223
+ // Wire up stdout for JSON-RPC message parsing
224
+ proc.stdout?.on('data', (chunk) => {
225
+ state.buffer += chunk.toString();
226
+ parseMessages(state);
227
+ });
228
+ // Collect stderr for diagnostics
229
+ let stderrBuffer = '';
230
+ proc.stderr?.on('data', (chunk) => {
231
+ stderrBuffer += chunk.toString();
232
+ // Cap stderr buffer at 4KB
233
+ if (stderrBuffer.length > 4096) {
234
+ stderrBuffer = stderrBuffer.slice(-4096);
235
+ }
236
+ });
237
+ // Handle unexpected process exit
238
+ proc.on('error', (err) => {
239
+ state.health = 'unhealthy';
240
+ state.error = `Process error: ${err.message}`;
241
+ // Reject all pending requests
242
+ for (const [reqId, entry] of state.pending) {
243
+ clearTimeout(entry.timer);
244
+ entry.reject(new Error(`Plugin "${id}" process crashed`));
245
+ state.pending.delete(reqId);
246
+ }
247
+ });
248
+ proc.on('exit', (code, signal) => {
249
+ if (state.health !== 'stopped') {
250
+ state.health = 'unhealthy';
251
+ state.error = `Process exited unexpectedly (code=${code}, signal=${signal})${stderrBuffer ? ` stderr: ${stderrBuffer.slice(0, 500)}` : ''}`;
252
+ }
253
+ state.process = null;
254
+ // Reject all pending requests
255
+ for (const [reqId, entry] of state.pending) {
256
+ clearTimeout(entry.timer);
257
+ entry.reject(new Error(`Plugin "${id}" process exited`));
258
+ state.pending.delete(reqId);
259
+ }
260
+ });
261
+ // Perform MCP initialize handshake with startup timeout
262
+ try {
263
+ const initResult = await sendRequest(state, 'initialize', {
264
+ protocolVersion: '2024-11-05',
265
+ capabilities: {},
266
+ clientInfo: { name: 'kbot', version: '2.0.0' },
267
+ }, STARTUP_TIMEOUT_MS);
268
+ sendNotification(state, 'initialized', {});
269
+ // Fetch available tools
270
+ try {
271
+ const toolsResult = await sendRequest(state, 'tools/list', {});
272
+ state.tools = toolsResult?.tools || [];
273
+ }
274
+ catch {
275
+ // Server may not expose tools — that's fine
276
+ state.tools = [];
277
+ }
278
+ state.health = 'healthy';
279
+ state.startedAt = new Date().toISOString();
280
+ state.error = null;
281
+ return state;
282
+ }
283
+ catch (err) {
284
+ state.health = 'unhealthy';
285
+ state.error = `Handshake failed: ${err instanceof Error ? err.message : String(err)}${stderrBuffer ? ` stderr: ${stderrBuffer.slice(0, 500)}` : ''}`;
286
+ // Kill the process since handshake failed
287
+ try {
288
+ proc.kill();
289
+ }
290
+ catch { /* ignore */ }
291
+ state.process = null;
292
+ return state;
293
+ }
294
+ }
295
+ /** Stop a single plugin gracefully */
296
+ export async function stopPlugin(id) {
297
+ const state = plugins.get(id);
298
+ if (!state)
299
+ return;
300
+ state.health = 'stopped';
301
+ if (state.process) {
302
+ // Attempt graceful shutdown via MCP protocol
303
+ try {
304
+ await sendRequest(state, 'shutdown', null, 5000);
305
+ sendNotification(state, 'exit', null);
306
+ }
307
+ catch {
308
+ // Force kill if graceful shutdown fails
309
+ }
310
+ // Ensure process is terminated
311
+ try {
312
+ state.process.kill();
313
+ }
314
+ catch { /* ignore */ }
315
+ state.process = null;
316
+ }
317
+ // Clear all pending requests
318
+ for (const [, entry] of state.pending) {
319
+ clearTimeout(entry.timer);
320
+ entry.reject(new Error(`Plugin "${id}" stopped`));
321
+ }
322
+ state.pending.clear();
323
+ }
324
+ /** Start all discovered plugins */
325
+ export async function startAllPlugins() {
326
+ const discovered = discoverPlugins();
327
+ const results = [];
328
+ // Start plugins concurrently but collect results
329
+ const promises = Array.from(discovered.keys()).map(async (id) => {
330
+ try {
331
+ const state = await startPlugin(id);
332
+ results.push({
333
+ id: state.id,
334
+ health: state.health,
335
+ tools: state.tools.length,
336
+ startedAt: state.startedAt,
337
+ error: state.error,
338
+ source: state.source,
339
+ });
340
+ }
341
+ catch (err) {
342
+ results.push({
343
+ id,
344
+ health: 'unhealthy',
345
+ tools: 0,
346
+ startedAt: null,
347
+ error: err instanceof Error ? err.message : String(err),
348
+ source: discovered.get(id).source,
349
+ });
350
+ }
351
+ });
352
+ await Promise.allSettled(promises);
353
+ return results;
354
+ }
355
+ /** Stop all running plugins */
356
+ export async function stopAllPlugins() {
357
+ const ids = Array.from(plugins.keys());
358
+ await Promise.allSettled(ids.map(id => stopPlugin(id)));
359
+ plugins.clear();
360
+ }
361
+ /** Get tools exposed by a specific plugin */
362
+ export function getPluginTools(id) {
363
+ const state = plugins.get(id);
364
+ if (!state)
365
+ return [];
366
+ return state.tools;
367
+ }
368
+ /** Call a tool on a specific plugin */
369
+ export async function callPluginTool(id, toolName, args = {}) {
370
+ const state = plugins.get(id);
371
+ if (!state) {
372
+ throw new Error(`Plugin "${id}" not found. Start it first with startPlugin().`);
373
+ }
374
+ if (state.health !== 'healthy') {
375
+ throw new Error(`Plugin "${id}" is ${state.health}${state.error ? `: ${state.error}` : ''}`);
376
+ }
377
+ // Verify the tool exists on this plugin
378
+ const tool = state.tools.find(t => t.name === toolName);
379
+ if (!tool) {
380
+ const available = state.tools.map(t => t.name).join(', ');
381
+ throw new Error(`Tool "${toolName}" not found on plugin "${id}". Available: ${available || '(none)'}`);
382
+ }
383
+ const result = await sendRequest(state, 'tools/call', {
384
+ name: toolName,
385
+ arguments: args,
386
+ });
387
+ if (result?.content) {
388
+ return result.content.map(c => c.text || JSON.stringify(c)).join('\n');
389
+ }
390
+ return JSON.stringify(result, null, 2);
391
+ }
392
+ /** Get health status of all plugins */
393
+ export function getPluginStatus() {
394
+ const statuses = [];
395
+ for (const [, state] of plugins) {
396
+ statuses.push({
397
+ id: state.id,
398
+ health: state.health,
399
+ tools: state.tools.length,
400
+ startedAt: state.startedAt,
401
+ error: state.error,
402
+ source: state.source,
403
+ });
404
+ }
405
+ return statuses;
406
+ }
407
+ // ── Auto-cleanup on process exit ──
408
+ function cleanup() {
409
+ for (const [, state] of plugins) {
410
+ if (state.process) {
411
+ try {
412
+ state.process.kill();
413
+ }
414
+ catch { /* ignore */ }
415
+ }
416
+ }
417
+ plugins.clear();
418
+ }
419
+ process.on('exit', cleanup);
420
+ process.on('SIGINT', () => { cleanup(); process.exit(0); });
421
+ process.on('SIGTERM', () => { cleanup(); process.exit(0); });
422
+ // ── Agent tool registration ──
423
+ /** Register meta-tools for the agent to interact with MCP plugins */
424
+ export function registerMcpPluginTools() {
425
+ registerTool({
426
+ name: 'mcp_plugin_list',
427
+ description: [
428
+ 'List all available MCP plugin tools.',
429
+ 'Shows discovered plugins, their health status, and the tools each one exposes.',
430
+ 'Use this to find available plugin tools before calling them with mcp_plugin_call.',
431
+ ].join(' '),
432
+ parameters: {
433
+ plugin_id: {
434
+ type: 'string',
435
+ description: 'Optional: filter to a specific plugin ID. Omit to list all.',
436
+ required: false,
437
+ },
438
+ },
439
+ tier: 'free',
440
+ async execute(args) {
441
+ const filterId = args.plugin_id ? String(args.plugin_id) : null;
442
+ // If no plugins are started, try discovery to show what's available
443
+ if (plugins.size === 0) {
444
+ const discovered = discoverPlugins();
445
+ if (discovered.size === 0) {
446
+ return [
447
+ 'No MCP plugins configured.',
448
+ '',
449
+ 'To add plugins, create ~/.kbot/plugins.json:',
450
+ '{',
451
+ ' "plugins": {',
452
+ ' "my-plugin": {',
453
+ ' "command": "npx",',
454
+ ' "args": ["-y", "kbot-plugin-example"],',
455
+ ' "env": {}',
456
+ ' }',
457
+ ' }',
458
+ '}',
459
+ '',
460
+ 'Or install a package in ~/.kbot/plugins/ with "kbot": { "mcp": true } in its package.json.',
461
+ ].join('\n');
462
+ }
463
+ const lines = ['Discovered plugins (not yet started):', ''];
464
+ for (const [id, entry] of discovered) {
465
+ if (filterId && id !== filterId)
466
+ continue;
467
+ lines.push(` ${id} (${entry.source})`);
468
+ lines.push(` command: ${entry.config.command} ${(entry.config.args || []).join(' ')}`);
469
+ }
470
+ lines.push('');
471
+ lines.push('Plugins need to be started before their tools are available.');
472
+ return lines.join('\n');
473
+ }
474
+ const lines = [];
475
+ for (const [, state] of plugins) {
476
+ if (filterId && state.id !== filterId)
477
+ continue;
478
+ const healthIcon = state.health === 'healthy' ? '[OK]' : state.health === 'starting' ? '[..]' : '[!!]';
479
+ lines.push(`${healthIcon} ${state.id} (${state.source}) — ${state.health}`);
480
+ if (state.error) {
481
+ lines.push(` error: ${state.error}`);
482
+ }
483
+ if (state.tools.length > 0) {
484
+ lines.push(` tools (${state.tools.length}):`);
485
+ for (const tool of state.tools) {
486
+ lines.push(` - ${tool.name}: ${tool.description || '(no description)'}`);
487
+ }
488
+ }
489
+ else {
490
+ lines.push(' tools: none');
491
+ }
492
+ lines.push('');
493
+ }
494
+ if (lines.length === 0 && filterId) {
495
+ return `Plugin "${filterId}" not found. Use mcp_plugin_list without a filter to see all plugins.`;
496
+ }
497
+ return lines.join('\n');
498
+ },
499
+ });
500
+ registerTool({
501
+ name: 'mcp_plugin_call',
502
+ description: [
503
+ 'Call a tool exposed by an MCP plugin.',
504
+ 'First use mcp_plugin_list to discover available plugins and their tools.',
505
+ 'If the target plugin is not running, it will be auto-started.',
506
+ ].join(' '),
507
+ parameters: {
508
+ plugin_id: {
509
+ type: 'string',
510
+ description: 'The plugin ID (e.g., "my-plugin")',
511
+ required: true,
512
+ },
513
+ tool: {
514
+ type: 'string',
515
+ description: 'The tool name to call on the plugin',
516
+ required: true,
517
+ },
518
+ arguments: {
519
+ type: 'object',
520
+ description: 'Arguments to pass to the tool (JSON object)',
521
+ required: false,
522
+ },
523
+ },
524
+ tier: 'pro',
525
+ async execute(args) {
526
+ const pluginId = String(args.plugin_id);
527
+ const toolName = String(args.tool);
528
+ const toolArgs = args.arguments || {};
529
+ // Auto-start the plugin if it's not running or unhealthy
530
+ let state = plugins.get(pluginId);
531
+ if (!state || state.health === 'unhealthy' || state.health === 'stopped') {
532
+ try {
533
+ state = await startPlugin(pluginId);
534
+ }
535
+ catch (err) {
536
+ return `Error: Could not start plugin "${pluginId}": ${err instanceof Error ? err.message : String(err)}`;
537
+ }
538
+ if (state.health !== 'healthy') {
539
+ return `Error: Plugin "${pluginId}" failed to start: ${state.error || 'unknown error'}`;
540
+ }
541
+ }
542
+ try {
543
+ return await callPluginTool(pluginId, toolName, toolArgs);
544
+ }
545
+ catch (err) {
546
+ return `Error: ${err instanceof Error ? err.message : String(err)}`;
547
+ }
548
+ },
549
+ });
550
+ }
551
+ //# sourceMappingURL=mcp-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-plugins.js","sourceRoot":"","sources":["../src/mcp-plugins.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAaA,OAAO,EAAY,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAA;AAW5E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC/E,SAAS,EAAE,MAAM,CAAA;CAClB;AAkCD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAqB5C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,YAAY,EACvB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GACxC,OAAO,CAAC,IAAI,CAAC,CA0Gf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IACR,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9C,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBpD"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAaA,OAAO,EAAY,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAA;AAY5E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC/E,SAAS,EAAE,MAAM,CAAA;CAClB;AAkCD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAqB5C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,YAAY,EACvB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GACxC,OAAO,CAAC,IAAI,CAAC,CA0If;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IACR,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9C,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBpD"}
package/dist/planner.js CHANGED
@@ -14,6 +14,7 @@ import { runAgent } from './agent.js';
14
14
  import { executeTool, getTool } from './tools/index.js';
15
15
  import { gatherContext, formatContextForPrompt } from './context.js';
16
16
  import { createSpinner, printInfo, printSuccess, printError, printWarn } from './ui.js';
17
+ import { TaskLedger } from './task-ledger.js';
17
18
  import chalk from 'chalk';
18
19
  const AMETHYST = chalk.hex('#6B5B95');
19
20
  // ── Plan Generation ──
@@ -131,6 +132,16 @@ export function displayPlan(plan) {
131
132
  */
132
133
  export async function executePlan(plan, agentOpts, onStepComplete) {
133
134
  plan.status = 'executing';
135
+ // Initialize dual-ledger orchestration
136
+ const ledger = new TaskLedger();
137
+ ledger.setPlan(plan.steps.map(s => ({
138
+ index: s.id - 1,
139
+ description: s.description,
140
+ agent: s.tool ? undefined : 'coder',
141
+ tools: s.tool ? [s.tool] : undefined,
142
+ status: 'pending',
143
+ dependsOn: s.dependsOn?.map(d => d - 1),
144
+ })));
134
145
  // Group steps by dependency layers for parallel execution
135
146
  const executed = new Set();
136
147
  while (executed.size < plan.steps.length) {
@@ -211,9 +222,25 @@ export async function executePlan(plan, agentOpts, onStepComplete) {
211
222
  printError(`Self-correction also failed. Continuing.`);
212
223
  }
213
224
  }
225
+ // Record step result in the task ledger
226
+ const stepResult = {
227
+ result: step.status === 'done' ? 'success' : 'failure',
228
+ output: step.result?.slice(0, 200),
229
+ error: step.error,
230
+ toolsUsed: step.tool ? [step.tool] : [],
231
+ tokensUsed: 0,
232
+ costUsd: 0,
233
+ };
234
+ ledger.updateStep(step.id - 1, stepResult);
214
235
  executed.add(step.id);
215
236
  onStepComplete?.(step);
216
237
  }));
238
+ // Check if the ledger recommends replanning
239
+ if (ledger.shouldReplan()) {
240
+ printWarn('Task ledger recommends replanning — too many failures or high cost.');
241
+ printInfo(ledger.getProgressSummary());
242
+ break;
243
+ }
217
244
  }
218
245
  // Final status
219
246
  const failed = plan.steps.filter(s => s.status === 'failed');
@@ -226,6 +253,8 @@ export async function executePlan(plan, agentOpts, onStepComplete) {
226
253
  else {
227
254
  printWarn(`Plan finished with errors: ${done.length} done, ${failed.length} failed`);
228
255
  }
256
+ // Log ledger summary
257
+ printInfo(ledger.getProgressSummary());
229
258
  return plan;
230
259
  }
231
260
  /**