@dlnk/cli 0.2.0 → 0.4.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.
@@ -0,0 +1,30 @@
1
+ import { MemoryManager } from './memory.js';
2
+ export interface AgentStep {
3
+ type: 'thinking' | 'tool_call' | 'tool_result' | 'token' | 'done';
4
+ content: string;
5
+ toolName?: string;
6
+ success?: boolean;
7
+ }
8
+ export interface AgentResult {
9
+ output: string;
10
+ steps: AgentStep[];
11
+ iterations: number;
12
+ success: boolean;
13
+ }
14
+ export declare function runAgent(task: string, options?: {
15
+ cwd?: string;
16
+ role?: string;
17
+ permissionMode?: 'auto' | 'ask' | 'deny';
18
+ onStep?: (step: AgentStep) => void;
19
+ memory?: MemoryManager;
20
+ }): Promise<AgentResult>;
21
+ export interface SubAgent {
22
+ name: string;
23
+ role: string;
24
+ task: string;
25
+ }
26
+ export declare function runMultiAgent(masterTask: string, subAgents: SubAgent[], onProgress?: (agent: string, step: AgentStep) => void): Promise<{
27
+ agent: string;
28
+ result: AgentResult;
29
+ }[]>;
30
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;CACnB,GACL,OAAO,CAAC,WAAW,CAAC,CAuHtB;AA6DD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,EAAE,EACrB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,GACpD,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EAAE,CAAC,CAkBnD"}
package/dist/engine.js ADDED
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runAgent = runAgent;
40
+ exports.runMultiAgent = runMultiAgent;
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const readline = __importStar(require("readline"));
43
+ const tools_js_1 = require("./tools.js");
44
+ const memory_js_1 = require("./memory.js");
45
+ const config_js_1 = require("./config.js");
46
+ const MAX_ITERATIONS = 20;
47
+ // ── Streaming ReAct Engine ─────────────────────────────────────
48
+ async function runAgent(task, options = {}) {
49
+ const config = (0, config_js_1.loadConfig)();
50
+ const cwd = options.cwd || process.cwd();
51
+ const memory = options.memory || new memory_js_1.MemoryManager(cwd);
52
+ const steps = [];
53
+ const emit = (step) => {
54
+ steps.push(step);
55
+ if (options.onStep)
56
+ options.onStep(step);
57
+ };
58
+ // Permission handler — auto by default, ask if permissionMode=ask
59
+ const confirm = async (message) => {
60
+ if (options.permissionMode === 'deny')
61
+ return false;
62
+ if (options.permissionMode !== 'ask')
63
+ return true; // auto
64
+ return new Promise((resolve) => {
65
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
66
+ rl.question(chalk_1.default.yellow(`\n ⚠️ ${message}\n Allow? (y/n) `), (ans) => {
67
+ rl.close();
68
+ resolve(ans.toLowerCase() === 'y');
69
+ });
70
+ });
71
+ };
72
+ const toolCtx = { cwd, confirm };
73
+ // Build system prompt
74
+ const systemPrompt = (0, tools_js_1.getToolsSystemPrompt)(cwd) + memory.getMemoryContext();
75
+ // Initialize memory
76
+ memory.addMessage('system', systemPrompt);
77
+ memory.addMessage('user', task);
78
+ let finalOutput = '';
79
+ for (let i = 0; i < MAX_ITERATIONS; i++) {
80
+ // Stream from LLM
81
+ let fullResponse = '';
82
+ let inToolBlock = false;
83
+ try {
84
+ await streamLLM(memory.getMessages(), config, (token) => {
85
+ fullResponse += token;
86
+ // Detect tool block start/end for streaming display
87
+ if (fullResponse.includes('```tool') && !inToolBlock) {
88
+ inToolBlock = true;
89
+ }
90
+ // Stream non-tool tokens to UI
91
+ if (!inToolBlock) {
92
+ emit({ type: 'token', content: token });
93
+ }
94
+ if (inToolBlock && fullResponse.includes('```\n') &&
95
+ fullResponse.lastIndexOf('```') > fullResponse.indexOf('```tool')) {
96
+ inToolBlock = false;
97
+ }
98
+ });
99
+ }
100
+ catch (e) {
101
+ return { output: `LLM error: ${e.message}`, steps, iterations: i, success: false };
102
+ }
103
+ memory.addMessage('assistant', fullResponse);
104
+ // Parse tool call
105
+ const toolCall = (0, tools_js_1.parseToolCall)(fullResponse);
106
+ if (!toolCall) {
107
+ // Final answer — no tool call
108
+ finalOutput = fullResponse.replace(/```tool[\s\S]*?```/g, '').trim();
109
+ emit({ type: 'done', content: finalOutput });
110
+ memory.saveSession();
111
+ return { output: finalOutput, steps, iterations: i + 1, success: true };
112
+ }
113
+ // Extract thought text
114
+ const thought = fullResponse.replace(/```tool[\s\S]*?```/g, '').trim();
115
+ if (thought) {
116
+ emit({ type: 'thinking', content: thought });
117
+ }
118
+ // Show tool call
119
+ emit({ type: 'tool_call', content: JSON.stringify(toolCall.params), toolName: toolCall.tool });
120
+ // Track in memory
121
+ if (toolCall.tool === 'read_file')
122
+ memory.trackFileRead(toolCall.params.path || '');
123
+ if (toolCall.tool === 'write_file' || toolCall.tool === 'patch_file') {
124
+ memory.trackFileWrite(toolCall.params.path || '');
125
+ }
126
+ if (toolCall.tool === 'shell')
127
+ memory.trackCommand(toolCall.params.command || '');
128
+ // Execute tool
129
+ const result = await (0, tools_js_1.executeTool)(toolCall, toolCtx);
130
+ emit({
131
+ type: 'tool_result',
132
+ content: result.success ? result.output : `ERROR: ${result.error}`,
133
+ toolName: toolCall.tool,
134
+ success: result.success,
135
+ });
136
+ // Feed result back
137
+ const resultMsg = result.success
138
+ ? `Tool result (${toolCall.tool}):\n${result.output}`
139
+ : `Tool error (${toolCall.tool}): ${result.error}\nTry a different approach.`;
140
+ memory.addMessage('user', resultMsg);
141
+ }
142
+ return {
143
+ output: 'Max iterations reached.',
144
+ steps,
145
+ iterations: MAX_ITERATIONS,
146
+ success: false
147
+ };
148
+ }
149
+ // ── Streaming LLM call ─────────────────────────────────────────
150
+ async function streamLLM(messages, config, onToken) {
151
+ const fetch = (await Promise.resolve().then(() => __importStar(require('node-fetch')))).default;
152
+ const endpoint = config.endpoint || 'http://localhost:8000';
153
+ const model = config.model || 'claude-haiku-4.5';
154
+ const apiKey = config.apiKey || 'dlnk-key';
155
+ const res = await fetch(`${endpoint}/v1/chat/completions`, {
156
+ method: 'POST',
157
+ headers: {
158
+ 'Content-Type': 'application/json',
159
+ 'Authorization': `Bearer ${apiKey}`
160
+ },
161
+ body: JSON.stringify({
162
+ model,
163
+ messages,
164
+ temperature: 0.3,
165
+ max_tokens: 4096,
166
+ stream: true,
167
+ }),
168
+ timeout: 90000,
169
+ });
170
+ if (!res.ok) {
171
+ const err = await res.text();
172
+ throw new Error(`API ${res.status}: ${err.slice(0, 200)}`);
173
+ }
174
+ // Parse SSE stream
175
+ const body = res.body;
176
+ let buffer = '';
177
+ await new Promise((resolve, reject) => {
178
+ body.on('data', (chunk) => {
179
+ buffer += chunk.toString();
180
+ const lines = buffer.split('\n');
181
+ buffer = lines.pop() || '';
182
+ for (const line of lines) {
183
+ if (!line.startsWith('data: '))
184
+ continue;
185
+ const data = line.slice(6).trim();
186
+ if (data === '[DONE]') {
187
+ resolve();
188
+ return;
189
+ }
190
+ try {
191
+ const parsed = JSON.parse(data);
192
+ const token = parsed.choices?.[0]?.delta?.content;
193
+ if (token)
194
+ onToken(token);
195
+ }
196
+ catch { }
197
+ }
198
+ });
199
+ body.on('end', resolve);
200
+ body.on('error', reject);
201
+ });
202
+ }
203
+ async function runMultiAgent(masterTask, subAgents, onProgress) {
204
+ const results = [];
205
+ for (const agent of subAgents) {
206
+ console.log(chalk_1.default.cyan(`\n 🤖 ${agent.name} [${agent.role}]`));
207
+ const result = await runAgent(agent.task, {
208
+ role: agent.role,
209
+ onStep: (step) => {
210
+ if (onProgress)
211
+ onProgress(agent.name, step);
212
+ }
213
+ });
214
+ results.push({ agent: agent.name, result });
215
+ }
216
+ return results;
217
+ }
218
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,8 +11,10 @@ const branding_1 = require("./branding");
11
11
  const config_1 = require("./config");
12
12
  const api_1 = require("./api");
13
13
  const agents_1 = require("./agents");
14
- const orchestrator_1 = require("./orchestrator");
15
- const react_1 = require("./react");
14
+ const engine_1 = require("./engine");
15
+ const memory_1 = require("./memory");
16
+ const mcp_1 = require("./mcp");
17
+ const subagent_1 = require("./subagent");
16
18
  const license_1 = require("./license");
17
19
  const os_1 = __importDefault(require("os"));
18
20
  const program = new commander_1.Command();
@@ -67,115 +69,77 @@ program
67
69
  // ─── run ─────────────────────────────────────────────────────────────────────
68
70
  program
69
71
  .command('run <task>')
70
- .description('Run agentic task with AI swarm')
71
- .option('-m, --model <model>', 'Model (auto/fast/pro)', 'auto')
72
- .option('-a, --agents <n>', 'Max agents to spawn', '4')
73
- .option('--agent <id>', 'Use single specific agent')
74
- .option('--swarm', 'Use full 12-agent swarm mode', false)
75
- .option('--react', 'Use ReAct agentic loop (tools-enabled)', false)
72
+ .description('Run agentic task (ReAct loop with tools)')
73
+ .option('-m, --model <model>', 'Model override')
74
+ .option('--perm <mode>', 'Permission mode: auto|ask|deny', 'auto')
75
+ .option('--cwd <path>', 'Working directory')
76
76
  .action(async (task, options) => {
77
77
  (0, branding_1.showBanner)();
78
- // License check
79
- const maxAgents = parseInt(options.agents) || 4;
80
- const check = (0, license_1.trackUsage)(options.swarm ? maxAgents : 1);
78
+ const check = (0, license_1.trackUsage)(1);
81
79
  if (!check.allowed) {
82
80
  console.log(chalk_1.default.red(` ✗ ${check.reason}`));
83
- console.log('');
84
81
  return;
85
82
  }
86
- // ── ReAct Agentic Loop ──────────────────────────────────────
87
- if (options.react || (!options.agent && !options.swarm)) {
88
- const role = options.agent ? agents_1.AGENT_ROLES[options.agent]?.name : undefined;
89
- console.log(chalk_1.default.hex('#6C63FF')(' ◆ agentic') + chalk_1.default.gray(role ? ` [${role}]` : ' [auto]'));
90
- console.log(chalk_1.default.white(` ${task}\n`));
91
- let iteration = 0;
92
- try {
93
- const result = await (0, react_1.runReAct)(task, role, (step) => {
94
- iteration++;
95
- if (step.type === 'thought') {
96
- console.log(chalk_1.default.cyan('\n 💭 ') + chalk_1.default.gray(step.content.slice(0, 200)));
83
+ const cwd = options.cwd || process.cwd();
84
+ const memory = new memory_1.MemoryManager(cwd);
85
+ console.log(chalk_1.default.hex('#6C63FF')(' ◆ agent') + chalk_1.default.gray(` [${cwd}]`));
86
+ console.log(chalk_1.default.white(` ${task}\n`));
87
+ let currentLine = '';
88
+ try {
89
+ const result = await (0, engine_1.runAgent)(task, {
90
+ cwd,
91
+ permissionMode: options.perm || 'auto',
92
+ memory,
93
+ onStep: (step) => {
94
+ if (step.type === 'token') {
95
+ process.stdout.write(chalk_1.default.white(step.content));
96
+ currentLine += step.content;
97
+ }
98
+ else if (step.type === 'thinking') {
99
+ if (currentLine) {
100
+ process.stdout.write('\n');
101
+ currentLine = '';
102
+ }
103
+ // thinking is streamed as tokens already
97
104
  }
98
105
  else if (step.type === 'tool_call') {
99
- const call = JSON.parse(step.content);
100
- console.log(chalk_1.default.yellow(` 🔧 ${step.toolName} `) + chalk_1.default.gray(JSON.stringify(call.params).slice(0, 80)));
106
+ if (currentLine) {
107
+ process.stdout.write('\n\n');
108
+ currentLine = '';
109
+ }
110
+ let params = {};
111
+ try {
112
+ params = JSON.parse(step.content);
113
+ }
114
+ catch { }
115
+ const paramsStr = JSON.stringify(params).slice(0, 80);
116
+ console.log(chalk_1.default.yellow(` ⚡ ${step.toolName}`) + chalk_1.default.gray(` ${paramsStr}`));
101
117
  }
102
118
  else if (step.type === 'tool_result') {
103
- const preview = step.content.length > 150 ? step.content.slice(0, 150) + '...' : step.content;
119
+ const preview = step.content.length > 200
120
+ ? step.content.slice(0, 200) + '...'
121
+ : step.content;
104
122
  if (step.success !== false) {
105
- console.log(chalk_1.default.green(' ✓ ') + chalk_1.default.gray(preview));
123
+ console.log(chalk_1.default.green(' ✓ ') + chalk_1.default.gray(preview));
106
124
  }
107
125
  else {
108
- console.log(chalk_1.default.red(' ✗ ') + chalk_1.default.gray(preview));
126
+ console.log(chalk_1.default.red(' ✗ ') + chalk_1.default.gray(preview));
109
127
  }
128
+ process.stdout.write(chalk_1.default.hex('#6C63FF')('\n '));
110
129
  }
111
- else if (step.type === 'final') {
112
- console.log(chalk_1.default.white('\n' + step.content.split('\n').map((l) => ' ' + l).join('\n')));
113
- }
114
- });
115
- console.log(chalk_1.default.gray(`\n ─── completed in ${result.iterations} steps ───`));
116
- console.log('');
117
- }
118
- catch (e) {
119
- console.log(chalk_1.default.red(` Error: ${e.message}`));
120
- }
121
- return;
122
- }
123
- if (options.agent) {
124
- // Single agent mode
125
- const role = agents_1.AGENT_ROLES[options.agent];
126
- if (!role) {
127
- console.log(chalk_1.default.red(` Unknown agent: ${options.agent}`));
128
- console.log(chalk_1.default.gray(` Available: ${Object.keys(agents_1.AGENT_ROLES).join(', ')}`));
129
- return;
130
- }
131
- console.log(chalk_1.default.hex('#6C63FF')(` ◆ ${role.emoji} ${role.name}`));
132
- console.log(chalk_1.default.white(` ${task}\n`));
133
- process.stdout.write(chalk_1.default.hex('#6C63FF')(' > '));
134
- try {
135
- await (0, orchestrator_1.runAgent)(role, task, '', (chunk) => process.stdout.write(chalk_1.default.white(chunk)));
136
- }
137
- catch (e) {
138
- process.stdout.write(chalk_1.default.red(`\n Error: ${e.message}`));
139
- }
140
- process.stdout.write('\n\n');
141
- }
142
- else if (options.swarm) {
143
- // Full swarm mode
144
- console.log(chalk_1.default.hex('#6C63FF')(' ◆ swarm mode') + chalk_1.default.gray(` [max ${maxAgents} agents]`));
145
- console.log(chalk_1.default.white(` ${task}\n`));
146
- let step = 0;
147
- const steps = ['briefing', 'planning', 'executing'];
148
- try {
149
- const { results } = await (0, orchestrator_1.runSwarm)(task, maxAgents, (stepName, agent) => {
150
- if (stepName === 'briefing')
151
- console.log(chalk_1.default.gray(' 📋 Coordinator analyzing task...'));
152
- else if (stepName === 'planning')
153
- console.log(chalk_1.default.gray(' 🗺️ Planner creating execution plan...'));
154
- else if (stepName === 'executing' && agent) {
155
- console.log(chalk_1.default.gray(` ${agent.emoji} ${agent.name} working...`));
130
+ else if (step.type === 'done') {
131
+ if (currentLine) {
132
+ process.stdout.write('\n');
133
+ }
156
134
  }
157
- });
158
- console.log('\n' + chalk_1.default.hex('#6C63FF')(' ◆ results\n'));
159
- console.log((0, orchestrator_1.formatResults)(results));
160
- console.log('');
161
- }
162
- catch (e) {
163
- console.log(chalk_1.default.red(` Error: ${e.message}`));
164
- }
135
+ }
136
+ });
137
+ console.log(chalk_1.default.gray(`\n\n ─── ${result.iterations} steps ─── ${result.success ? '✓' : '✗'} ───`));
165
138
  }
166
- else {
167
- // Default: stream single response
168
- console.log(chalk_1.default.hex('#6C63FF')(' ◆ run') + chalk_1.default.gray(` [auto mode]`));
169
- console.log(chalk_1.default.white(` ${task}\n`));
170
- process.stdout.write(chalk_1.default.hex('#6C63FF')(' dlnk > '));
171
- try {
172
- await (0, api_1.streamChat)([{ role: 'user', content: task }], options.model || (0, config_1.loadConfig)().model, (chunk) => process.stdout.write(chalk_1.default.white(chunk)));
173
- }
174
- catch (e) {
175
- process.stdout.write(chalk_1.default.red(`\n Error: ${e.message}`));
176
- }
177
- process.stdout.write('\n\n');
139
+ catch (e) {
140
+ console.log(chalk_1.default.red(` Error: ${e.message}`));
178
141
  }
142
+ console.log('');
179
143
  });
180
144
  // ─── agents ──────────────────────────────────────────────────────────────────
181
145
  program
@@ -292,6 +256,124 @@ program
292
256
  console.log('');
293
257
  }
294
258
  });
259
+ // ─── mcp ──────────────────────────────────────────────────────────────────────
260
+ program
261
+ .command('mcp')
262
+ .description('Manage MCP (Model Context Protocol) servers')
263
+ .option('--list', 'List configured MCP servers')
264
+ .option('--add <name>', 'Add MCP server by name')
265
+ .option('--remove <name>', 'Remove MCP server')
266
+ .option('--enable <name>', 'Enable an MCP server')
267
+ .option('--disable <name>', 'Disable an MCP server')
268
+ .action((options) => {
269
+ (0, branding_1.showBanner)();
270
+ const servers = (0, mcp_1.listMCPServers)();
271
+ if (options.list || (!options.add && !options.remove && !options.enable && !options.disable)) {
272
+ console.log(chalk_1.default.hex('#6C63FF')(' ◆ mcp servers\n'));
273
+ servers.forEach(s => {
274
+ const status = s.enabled ? chalk_1.default.green('● enabled') : chalk_1.default.gray('○ disabled');
275
+ console.log(` ${status} ${chalk_1.default.white(s.name.padEnd(16))} ${chalk_1.default.gray(s.description)}`);
276
+ });
277
+ console.log('');
278
+ console.log(chalk_1.default.gray(' Enable: dlnk mcp --enable github'));
279
+ console.log(chalk_1.default.gray(' Disable: dlnk mcp --disable github'));
280
+ console.log('');
281
+ return;
282
+ }
283
+ if (options.enable) {
284
+ const builtin = mcp_1.BUILTIN_MCP_SERVERS.find(s => s.name === options.enable);
285
+ if (!builtin) {
286
+ console.log(chalk_1.default.red(` ✗ Unknown server: ${options.enable}`));
287
+ return;
288
+ }
289
+ (0, mcp_1.addMCPServer)({ ...builtin, enabled: true });
290
+ console.log(chalk_1.default.green(` ✓ ${options.enable} enabled`));
291
+ }
292
+ if (options.disable) {
293
+ const builtin = mcp_1.BUILTIN_MCP_SERVERS.find(s => s.name === options.disable);
294
+ if (!builtin) {
295
+ console.log(chalk_1.default.red(` ✗ Unknown server: ${options.disable}`));
296
+ return;
297
+ }
298
+ (0, mcp_1.addMCPServer)({ ...builtin, enabled: false });
299
+ console.log(chalk_1.default.green(` ✓ ${options.disable} disabled`));
300
+ }
301
+ if (options.remove) {
302
+ (0, mcp_1.removeMCPServer)(options.remove);
303
+ console.log(chalk_1.default.green(` ✓ removed ${options.remove}`));
304
+ }
305
+ console.log('');
306
+ });
307
+ // ─── swarm ─────────────────────────────────────────────────────────────────────
308
+ program
309
+ .command('swarm <task>')
310
+ .description('Run multi-agent pipeline (planner → coder → reviewer → tester)')
311
+ .option('--agents <ids>', 'Comma-separated agent IDs', 'planner,coder,reviewer')
312
+ .option('--parallel', 'Run agents in parallel (default: sequential)', false)
313
+ .option('--cwd <path>', 'Working directory')
314
+ .action(async (task, options) => {
315
+ (0, branding_1.showBanner)();
316
+ const check = (0, license_1.trackUsage)(3);
317
+ if (!check.allowed) {
318
+ console.log(chalk_1.default.red(` ✗ ${check.reason}`));
319
+ return;
320
+ }
321
+ const agentIds = options.agents.split(',').map((s) => s.trim());
322
+ const cwd = options.cwd || process.cwd();
323
+ console.log(chalk_1.default.hex('#6C63FF')(' ◆ swarm') + chalk_1.default.gray(` [${agentIds.join(' → ')}]`));
324
+ console.log(chalk_1.default.white(` ${task}\n`));
325
+ try {
326
+ if (options.parallel) {
327
+ // Parallel: all agents get same task simultaneously
328
+ console.log(chalk_1.default.gray(' ⚡ Running agents in parallel...\n'));
329
+ const swarmTasks = agentIds.map((id) => ({ agentId: id, task }));
330
+ const results = await (0, subagent_1.runSwarm)(swarmTasks, {
331
+ cwd,
332
+ onStep: (agentId, stepType, content) => {
333
+ if (stepType === 'token')
334
+ process.stdout.write(chalk_1.default.gray(`[${agentId}] `) + content);
335
+ }
336
+ });
337
+ results.forEach(r => {
338
+ const def = subagent_1.SUB_AGENTS[r.agentId];
339
+ console.log(`\n ${def?.emoji || '•'} ${chalk_1.default.white(r.agentId)} ${r.result.success ? chalk_1.default.green('✓') : chalk_1.default.red('✗')}`);
340
+ console.log(chalk_1.default.gray(' ' + r.result.output.slice(0, 300).replace(/\n/g, '\n ')));
341
+ });
342
+ }
343
+ else {
344
+ // Sequential pipeline
345
+ let currentAgent = '';
346
+ const result = await (0, subagent_1.runPipeline)(task, agentIds, {
347
+ cwd,
348
+ onAgentStart: (agent, agentTask) => {
349
+ currentAgent = agent.id;
350
+ console.log(chalk_1.default.cyan(`\n ${agent.emoji} ${agent.name}`) + chalk_1.default.gray(` → ${agentTask.slice(0, 60)}`));
351
+ },
352
+ onStep: (agentId, stepType, content) => {
353
+ if (stepType === 'token')
354
+ process.stdout.write(content);
355
+ else if (stepType === 'tool_call') {
356
+ let p = {};
357
+ try {
358
+ p = JSON.parse(content);
359
+ }
360
+ catch { }
361
+ process.stdout.write(chalk_1.default.yellow(`\n ⚡ ${p.tool || agentId} `) + chalk_1.default.gray(JSON.stringify(p.params || {}).slice(0, 60)) + '\n ');
362
+ }
363
+ else if (stepType === 'tool_result') {
364
+ process.stdout.write(chalk_1.default.green(' ✓ ') + chalk_1.default.gray(content.slice(0, 80)) + '\n ');
365
+ }
366
+ }
367
+ });
368
+ console.log(chalk_1.default.hex('#6C63FF')('\n\n ◆ summary\n'));
369
+ console.log(' ' + result.summary.replace(/\n/g, '\n '));
370
+ }
371
+ }
372
+ catch (e) {
373
+ console.log(chalk_1.default.red(` Error: ${e.message}`));
374
+ }
375
+ console.log('');
376
+ });
295
377
  // Default
296
378
  if (process.argv.length <= 2) {
297
379
  (0, branding_1.showBanner)();