@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.
- package/dist/engine.d.ts +30 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +218 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.js +175 -93
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +31 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +159 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +44 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +161 -0
- package/dist/memory.js.map +1 -0
- package/dist/react.js +2 -2
- package/dist/react.js.map +1 -1
- package/dist/subagent.d.ts +37 -0
- package/dist/subagent.d.ts.map +1 -0
- package/dist/subagent.js +128 -0
- package/dist/subagent.js.map +1 -0
- package/dist/tools.d.ts +29 -8
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +207 -70
- package/dist/tools.js.map +1 -1
- package/dlnk-release.sh +87 -0
- package/package.json +3 -2
package/dist/engine.d.ts
ADDED
|
@@ -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
|
|
15
|
-
const
|
|
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
|
|
71
|
-
.option('-m, --model <model>', 'Model
|
|
72
|
-
.option('
|
|
73
|
-
.option('--
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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 >
|
|
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('
|
|
123
|
+
console.log(chalk_1.default.green(' ✓ ') + chalk_1.default.gray(preview));
|
|
106
124
|
}
|
|
107
125
|
else {
|
|
108
|
-
console.log(chalk_1.default.red('
|
|
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 === '
|
|
112
|
-
|
|
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
|
-
|
|
159
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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)();
|