@agentskit/cli 0.4.0 → 0.4.2
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/README.md +51 -0
- package/dist/bin.cjs +303 -30
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/chunk-RHXN45FL.js +545 -0
- package/dist/chunk-RHXN45FL.js.map +1 -0
- package/dist/index.cjs +304 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +1 -1
- package/package.json +24 -9
- package/dist/chunk-LVWMW6SW.js +0 -270
- package/dist/chunk-LVWMW6SW.js.map +0 -1
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { kimi, grok, deepseek, ollama, gemini, anthropic, openai } from '@agentskit/adapters';
|
|
3
|
+
import React3, { useMemo, useState, useEffect } from 'react';
|
|
4
|
+
import { Box, Text, render } from 'ink';
|
|
5
|
+
import { useChat, ChatContainer, Message, ToolCallView, ThinkingIndicator, InputBar } from '@agentskit/ink';
|
|
6
|
+
import { loadConfig, createFileMemory } from '@agentskit/core';
|
|
7
|
+
import { shell, filesystem, webSearch } from '@agentskit/tools';
|
|
8
|
+
import { summarizer, critic, planner, coder, researcher, composeSkills } from '@agentskit/skills';
|
|
9
|
+
import { sqliteChatMemory } from '@agentskit/memory';
|
|
10
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
11
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { createRuntime } from '@agentskit/runtime';
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
|
|
16
|
+
var providers = {
|
|
17
|
+
openai: {
|
|
18
|
+
label: "OpenAI",
|
|
19
|
+
envKeys: ["OPENAI_API_KEY"],
|
|
20
|
+
defaultModel: "gpt-4o-mini",
|
|
21
|
+
factory: (c) => openai(c)
|
|
22
|
+
},
|
|
23
|
+
anthropic: {
|
|
24
|
+
label: "Anthropic",
|
|
25
|
+
envKeys: ["ANTHROPIC_API_KEY"],
|
|
26
|
+
defaultModel: "claude-3-5-sonnet-latest",
|
|
27
|
+
factory: (c) => anthropic(c)
|
|
28
|
+
},
|
|
29
|
+
gemini: {
|
|
30
|
+
label: "Gemini",
|
|
31
|
+
envKeys: ["GEMINI_API_KEY"],
|
|
32
|
+
defaultModel: "gemini-2.5-flash",
|
|
33
|
+
factory: (c) => gemini(c)
|
|
34
|
+
},
|
|
35
|
+
ollama: {
|
|
36
|
+
label: "Ollama",
|
|
37
|
+
envKeys: [],
|
|
38
|
+
defaultModel: "llama3.1",
|
|
39
|
+
factory: (c) => ollama({ model: c.model, baseUrl: c.baseUrl })
|
|
40
|
+
},
|
|
41
|
+
deepseek: {
|
|
42
|
+
label: "DeepSeek",
|
|
43
|
+
envKeys: ["DEEPSEEK_API_KEY"],
|
|
44
|
+
defaultModel: "deepseek-chat",
|
|
45
|
+
factory: (c) => deepseek(c)
|
|
46
|
+
},
|
|
47
|
+
grok: {
|
|
48
|
+
label: "xAI Grok",
|
|
49
|
+
envKeys: ["XAI_API_KEY"],
|
|
50
|
+
requiresModel: true,
|
|
51
|
+
factory: (c) => grok(c)
|
|
52
|
+
},
|
|
53
|
+
kimi: {
|
|
54
|
+
label: "Kimi",
|
|
55
|
+
envKeys: ["KIMI_API_KEY", "MOONSHOT_API_KEY"],
|
|
56
|
+
requiresModel: true,
|
|
57
|
+
factory: (c) => kimi(c)
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
function createDemoAdapter(provider, model) {
|
|
61
|
+
return {
|
|
62
|
+
createSource: ({ messages }) => {
|
|
63
|
+
let cancelled = false;
|
|
64
|
+
return {
|
|
65
|
+
stream: async function* () {
|
|
66
|
+
const userMessages = messages.filter((message) => message.role === "user");
|
|
67
|
+
const lastMessage = userMessages[userMessages.length - 1];
|
|
68
|
+
const reply = [
|
|
69
|
+
`Provider: ${provider}${model ? ` (${model})` : ""}.`,
|
|
70
|
+
"This is the AgentsKit CLI demo adapter.",
|
|
71
|
+
`You said: ${lastMessage?.content ?? ""}`
|
|
72
|
+
].join(" ");
|
|
73
|
+
for (const chunk of reply.match(/.{1,18}/g) ?? []) {
|
|
74
|
+
if (cancelled) return;
|
|
75
|
+
await new Promise((resolve) => setTimeout(resolve, 35));
|
|
76
|
+
yield { type: "text", content: chunk };
|
|
77
|
+
}
|
|
78
|
+
yield { type: "done" };
|
|
79
|
+
},
|
|
80
|
+
abort: () => {
|
|
81
|
+
cancelled = true;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function resolveChatProvider(options) {
|
|
88
|
+
const name = options.provider.toLowerCase();
|
|
89
|
+
if (name === "demo") {
|
|
90
|
+
return {
|
|
91
|
+
adapter: createDemoAdapter(name, options.model),
|
|
92
|
+
provider: name,
|
|
93
|
+
model: options.model,
|
|
94
|
+
mode: "demo",
|
|
95
|
+
summary: "demo adapter (no network, no API key required)"
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const entry = providers[name];
|
|
99
|
+
if (!entry) {
|
|
100
|
+
const supported = ["demo", ...Object.keys(providers)].join(", ");
|
|
101
|
+
throw new Error(`Unsupported provider "${options.provider}". Try ${supported}.`);
|
|
102
|
+
}
|
|
103
|
+
let apiKey = options.apiKey;
|
|
104
|
+
if (!apiKey) {
|
|
105
|
+
for (const key of entry.envKeys) {
|
|
106
|
+
apiKey = process.env[key];
|
|
107
|
+
if (apiKey) break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (!apiKey && entry.envKeys.length > 0) {
|
|
111
|
+
const keyList = entry.envKeys.join(" or ");
|
|
112
|
+
throw new Error(`${entry.label} requires an API key. Pass --api-key or set ${keyList}.`);
|
|
113
|
+
}
|
|
114
|
+
const model = options.model ?? entry.defaultModel;
|
|
115
|
+
if (!model) {
|
|
116
|
+
throw new Error(`${entry.label} requires --model in the current CLI version.`);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
adapter: entry.factory({ apiKey: apiKey ?? "", model, baseUrl: options.baseUrl }),
|
|
120
|
+
provider: name,
|
|
121
|
+
model,
|
|
122
|
+
mode: "live",
|
|
123
|
+
summary: `${entry.label} live adapter`
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
var skillRegistry = {
|
|
127
|
+
researcher,
|
|
128
|
+
coder,
|
|
129
|
+
planner,
|
|
130
|
+
critic,
|
|
131
|
+
summarizer
|
|
132
|
+
};
|
|
133
|
+
function resolveTools(toolNames) {
|
|
134
|
+
if (!toolNames) return [];
|
|
135
|
+
const tools = [];
|
|
136
|
+
for (const name of toolNames.split(",").map((s) => s.trim())) {
|
|
137
|
+
switch (name) {
|
|
138
|
+
case "web_search":
|
|
139
|
+
tools.push(webSearch());
|
|
140
|
+
break;
|
|
141
|
+
case "filesystem":
|
|
142
|
+
tools.push(...filesystem({ basePath: process.cwd() }));
|
|
143
|
+
break;
|
|
144
|
+
case "shell":
|
|
145
|
+
tools.push(shell({ timeout: 3e4 }));
|
|
146
|
+
break;
|
|
147
|
+
default:
|
|
148
|
+
process.stderr.write(`Unknown tool: ${name}
|
|
149
|
+
`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return tools;
|
|
153
|
+
}
|
|
154
|
+
function resolveSkill(skillName) {
|
|
155
|
+
if (!skillName) return void 0;
|
|
156
|
+
const skill = skillRegistry[skillName.trim()];
|
|
157
|
+
if (!skill) {
|
|
158
|
+
process.stderr.write(`Unknown skill: ${skillName}
|
|
159
|
+
`);
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
return skill;
|
|
163
|
+
}
|
|
164
|
+
function resolveSkills(skillNames) {
|
|
165
|
+
if (!skillNames) return void 0;
|
|
166
|
+
const names = skillNames.split(",").map((s) => s.trim());
|
|
167
|
+
const resolved = names.map((n) => skillRegistry[n]).filter(Boolean);
|
|
168
|
+
if (resolved.length === 0) {
|
|
169
|
+
process.stderr.write(`No valid skills found in: ${skillNames}
|
|
170
|
+
`);
|
|
171
|
+
return void 0;
|
|
172
|
+
}
|
|
173
|
+
if (resolved.length === 1) return resolved[0];
|
|
174
|
+
return composeSkills(...resolved);
|
|
175
|
+
}
|
|
176
|
+
function resolveMemory(backend, memoryPath) {
|
|
177
|
+
switch (backend) {
|
|
178
|
+
case "sqlite":
|
|
179
|
+
return sqliteChatMemory({ path: memoryPath.replace(/\.json$/, ".db") });
|
|
180
|
+
case "file":
|
|
181
|
+
default:
|
|
182
|
+
return createFileMemory(memoryPath);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function ChatApp(options) {
|
|
186
|
+
const adapter = useMemo(
|
|
187
|
+
() => resolveChatProvider(options).adapter,
|
|
188
|
+
[options.apiKey, options.baseUrl, options.model, options.provider]
|
|
189
|
+
);
|
|
190
|
+
const memory = useMemo(
|
|
191
|
+
() => resolveMemory(options.memoryBackend, options.memoryPath ?? ".agentskit-history.json"),
|
|
192
|
+
[options.memoryPath, options.memoryBackend]
|
|
193
|
+
);
|
|
194
|
+
const tools = useMemo(() => resolveTools(options.tools), [options.tools]);
|
|
195
|
+
const skills = useMemo(() => {
|
|
196
|
+
if (!options.skill) return void 0;
|
|
197
|
+
const names = options.skill.split(",").map((s) => s.trim());
|
|
198
|
+
const resolved = names.map((n) => skillRegistry[n]).filter(Boolean);
|
|
199
|
+
if (resolved.length === 0) return void 0;
|
|
200
|
+
return resolved;
|
|
201
|
+
}, [options.skill]);
|
|
202
|
+
const chat = useChat({
|
|
203
|
+
adapter,
|
|
204
|
+
memory,
|
|
205
|
+
systemPrompt: options.system,
|
|
206
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
207
|
+
skills
|
|
208
|
+
});
|
|
209
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
|
|
210
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "AgentsKit CLI" }),
|
|
211
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press Enter to send. Live providers use env vars or --api-key, and demo mode stays available for zero-config usage." }),
|
|
212
|
+
/* @__PURE__ */ jsx(ChatContainer, { children: chat.messages.map((message) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Message, { message }),
|
|
214
|
+
message.toolCalls?.map((toolCall) => /* @__PURE__ */ jsx(ToolCallView, { toolCall }, toolCall.id))
|
|
215
|
+
] }, message.id)) }),
|
|
216
|
+
/* @__PURE__ */ jsx(ThinkingIndicator, { visible: chat.status === "streaming" }),
|
|
217
|
+
/* @__PURE__ */ jsx(InputBar, { chat, placeholder: "Type a message and press Enter..." })
|
|
218
|
+
] });
|
|
219
|
+
}
|
|
220
|
+
function renderChatHeader(options) {
|
|
221
|
+
const runtime = resolveChatProvider(options);
|
|
222
|
+
const parts = [`provider=${runtime.provider}`];
|
|
223
|
+
if (runtime.model) parts.push(`model=${runtime.model}`);
|
|
224
|
+
parts.push(`mode=${runtime.mode}`);
|
|
225
|
+
if (options.tools) parts.push(`tools=${options.tools}`);
|
|
226
|
+
if (options.skill) parts.push(`skill=${options.skill}`);
|
|
227
|
+
if (options.memoryBackend) parts.push(`memory=${options.memoryBackend}`);
|
|
228
|
+
return parts.join(" ");
|
|
229
|
+
}
|
|
230
|
+
function reactStarter() {
|
|
231
|
+
return {
|
|
232
|
+
"package.json": JSON.stringify({
|
|
233
|
+
name: "agentskit-react-app",
|
|
234
|
+
private: true,
|
|
235
|
+
type: "module",
|
|
236
|
+
scripts: {
|
|
237
|
+
dev: "vite"
|
|
238
|
+
},
|
|
239
|
+
dependencies: {
|
|
240
|
+
"@agentskit/adapters": "^0.1.0",
|
|
241
|
+
"@agentskit/react": "^0.1.0",
|
|
242
|
+
react: "^18.3.1",
|
|
243
|
+
"react-dom": "^18.3.1"
|
|
244
|
+
}
|
|
245
|
+
}, null, 2),
|
|
246
|
+
"src/main.tsx": `import React from 'react'
|
|
247
|
+
import ReactDOM from 'react-dom/client'
|
|
248
|
+
import { ChatContainer, InputBar, Message, useChat } from '@agentskit/react'
|
|
249
|
+
import { openai } from '@agentskit/adapters'
|
|
250
|
+
import '@agentskit/react/theme'
|
|
251
|
+
|
|
252
|
+
function App() {
|
|
253
|
+
const chat = useChat({
|
|
254
|
+
adapter: openai({ apiKey: import.meta.env.VITE_OPENAI_API_KEY ?? '', model: 'gpt-4o-mini' }),
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
return (
|
|
258
|
+
<ChatContainer>
|
|
259
|
+
{chat.messages.map(message => <Message key={message.id} message={message} />)}
|
|
260
|
+
<InputBar chat={chat} />
|
|
261
|
+
</ChatContainer>
|
|
262
|
+
)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(<App />)
|
|
266
|
+
`,
|
|
267
|
+
".env.example": "VITE_OPENAI_API_KEY=\n"
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function inkStarter() {
|
|
271
|
+
return {
|
|
272
|
+
"package.json": JSON.stringify({
|
|
273
|
+
name: "agentskit-ink-app",
|
|
274
|
+
private: true,
|
|
275
|
+
type: "module",
|
|
276
|
+
scripts: {
|
|
277
|
+
dev: "tsx src/index.tsx"
|
|
278
|
+
},
|
|
279
|
+
dependencies: {
|
|
280
|
+
"@agentskit/ink": "^0.1.0",
|
|
281
|
+
react: "^18.3.1"
|
|
282
|
+
}
|
|
283
|
+
}, null, 2),
|
|
284
|
+
"src/index.tsx": `import React from 'react'
|
|
285
|
+
import { render } from 'ink'
|
|
286
|
+
import { ChatContainer, InputBar, Message, useChat } from '@agentskit/ink'
|
|
287
|
+
|
|
288
|
+
function DemoAdapter() {
|
|
289
|
+
return {
|
|
290
|
+
createSource: () => ({
|
|
291
|
+
async *stream() {
|
|
292
|
+
yield { type: 'text', content: 'Hello from AgentsKit Ink.' }
|
|
293
|
+
yield { type: 'done' }
|
|
294
|
+
},
|
|
295
|
+
abort() {},
|
|
296
|
+
}),
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function App() {
|
|
301
|
+
const chat = useChat({ adapter: DemoAdapter() })
|
|
302
|
+
return (
|
|
303
|
+
<ChatContainer>
|
|
304
|
+
{chat.messages.map(message => <Message key={message.id} message={message} />)}
|
|
305
|
+
<InputBar chat={chat} />
|
|
306
|
+
</ChatContainer>
|
|
307
|
+
)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
render(<App />)
|
|
311
|
+
`
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async function writeStarterProject(options) {
|
|
315
|
+
const files = options.template === "ink" ? inkStarter() : reactStarter();
|
|
316
|
+
await mkdir(options.targetDir, { recursive: true });
|
|
317
|
+
await Promise.all(
|
|
318
|
+
Object.entries(files).map(async ([relativePath, content]) => {
|
|
319
|
+
const absolutePath = path.join(options.targetDir, relativePath);
|
|
320
|
+
await mkdir(path.dirname(absolutePath), { recursive: true });
|
|
321
|
+
await writeFile(absolutePath, content, "utf8");
|
|
322
|
+
})
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
function formatEvent(event) {
|
|
326
|
+
switch (event.type) {
|
|
327
|
+
case "agent:step":
|
|
328
|
+
return `[step ${event.step}] ${event.action}`;
|
|
329
|
+
case "llm:start":
|
|
330
|
+
return `[llm] start (${event.messageCount} messages)`;
|
|
331
|
+
case "llm:end": {
|
|
332
|
+
const preview = event.content.length > 100 ? event.content.slice(0, 100) + "..." : event.content;
|
|
333
|
+
return `[llm] done (${event.durationMs}ms) "${preview}"`;
|
|
334
|
+
}
|
|
335
|
+
case "tool:start":
|
|
336
|
+
return `[tool] ${event.name} ${JSON.stringify(event.args)}`;
|
|
337
|
+
case "tool:end":
|
|
338
|
+
return `[tool] ${event.name} done (${event.durationMs}ms)`;
|
|
339
|
+
case "error":
|
|
340
|
+
return `[error] ${event.error.message}`;
|
|
341
|
+
default:
|
|
342
|
+
return `[${event.type}]`;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async function runAgent(task, options) {
|
|
346
|
+
if (options.skill && options.skills) {
|
|
347
|
+
process.stderr.write("Error: --skill and --skills are mutually exclusive. Use one or the other.\n");
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
const { adapter } = resolveChatProvider({
|
|
351
|
+
provider: options.provider,
|
|
352
|
+
model: options.model,
|
|
353
|
+
apiKey: options.apiKey,
|
|
354
|
+
baseUrl: options.baseUrl
|
|
355
|
+
});
|
|
356
|
+
const tools = resolveTools(options.tools);
|
|
357
|
+
const skill = options.skills ? resolveSkills(options.skills) : resolveSkill(options.skill);
|
|
358
|
+
const memory = options.memory ? resolveMemory(options.memoryBackend, options.memory) : void 0;
|
|
359
|
+
const observers = [];
|
|
360
|
+
if (options.verbose) {
|
|
361
|
+
observers.push({
|
|
362
|
+
name: "cli-verbose",
|
|
363
|
+
on(event) {
|
|
364
|
+
process.stderr.write(formatEvent(event) + "\n");
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const runtime = createRuntime({
|
|
369
|
+
adapter,
|
|
370
|
+
tools,
|
|
371
|
+
memory,
|
|
372
|
+
systemPrompt: options.systemPrompt,
|
|
373
|
+
maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : void 0,
|
|
374
|
+
observers
|
|
375
|
+
});
|
|
376
|
+
const result = await runtime.run(task, {
|
|
377
|
+
skill: skill ?? void 0
|
|
378
|
+
});
|
|
379
|
+
process.stdout.write(result.content + "\n");
|
|
380
|
+
}
|
|
381
|
+
function RunApp({ task, options }) {
|
|
382
|
+
const [status, setStatus] = useState("running");
|
|
383
|
+
const [currentStep, setCurrentStep] = useState(0);
|
|
384
|
+
const [toolCalls, setToolCalls] = useState([]);
|
|
385
|
+
const [result, setResult] = useState("");
|
|
386
|
+
const [error, setError] = useState("");
|
|
387
|
+
const [durationMs, setDurationMs] = useState(0);
|
|
388
|
+
useEffect(() => {
|
|
389
|
+
async function execute() {
|
|
390
|
+
if (options.skill && options.skills) {
|
|
391
|
+
setError("--skill and --skills are mutually exclusive.");
|
|
392
|
+
setStatus("error");
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const { adapter } = resolveChatProvider({
|
|
396
|
+
provider: options.provider,
|
|
397
|
+
model: options.model,
|
|
398
|
+
apiKey: options.apiKey,
|
|
399
|
+
baseUrl: options.baseUrl
|
|
400
|
+
});
|
|
401
|
+
const tools = resolveTools(options.tools);
|
|
402
|
+
const skill = options.skills ? resolveSkills(options.skills) : resolveSkill(options.skill);
|
|
403
|
+
const memory = options.memory ? resolveMemory(options.memoryBackend, options.memory) : void 0;
|
|
404
|
+
const observers = [{
|
|
405
|
+
name: "run-ui",
|
|
406
|
+
on(event) {
|
|
407
|
+
switch (event.type) {
|
|
408
|
+
case "agent:step":
|
|
409
|
+
setCurrentStep(event.step);
|
|
410
|
+
break;
|
|
411
|
+
case "tool:start":
|
|
412
|
+
setToolCalls((prev) => [...prev, { name: event.name, status: "running" }]);
|
|
413
|
+
break;
|
|
414
|
+
case "tool:end":
|
|
415
|
+
setToolCalls((prev) => prev.map(
|
|
416
|
+
(tc) => tc.name === event.name && tc.status === "running" ? { ...tc, status: "done", durationMs: event.durationMs } : tc
|
|
417
|
+
));
|
|
418
|
+
break;
|
|
419
|
+
case "error":
|
|
420
|
+
setToolCalls((prev) => prev.map(
|
|
421
|
+
(tc) => tc.status === "running" ? { ...tc, status: "error" } : tc
|
|
422
|
+
));
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}];
|
|
427
|
+
const runtime = createRuntime({
|
|
428
|
+
adapter,
|
|
429
|
+
tools,
|
|
430
|
+
memory,
|
|
431
|
+
systemPrompt: options.systemPrompt,
|
|
432
|
+
maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : void 0,
|
|
433
|
+
observers
|
|
434
|
+
});
|
|
435
|
+
try {
|
|
436
|
+
const runResult = await runtime.run(task, { skill: skill ?? void 0 });
|
|
437
|
+
setResult(runResult.content);
|
|
438
|
+
setDurationMs(runResult.durationMs);
|
|
439
|
+
setStatus("done");
|
|
440
|
+
} catch (err) {
|
|
441
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
442
|
+
setStatus("error");
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
void execute();
|
|
446
|
+
}, []);
|
|
447
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
|
|
448
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "agentskit run" }),
|
|
449
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
450
|
+
"Task: ",
|
|
451
|
+
task
|
|
452
|
+
] }),
|
|
453
|
+
status === "running" && currentStep > 0 && /* @__PURE__ */ jsxs(Text, { color: "yellow", children: [
|
|
454
|
+
"\u27F3",
|
|
455
|
+
" Step ",
|
|
456
|
+
currentStep
|
|
457
|
+
] }),
|
|
458
|
+
toolCalls.map((tc, i) => /* @__PURE__ */ jsx(Box, { marginLeft: 2, children: /* @__PURE__ */ jsxs(Text, { color: tc.status === "running" ? "yellow" : tc.status === "done" ? "green" : "red", children: [
|
|
459
|
+
tc.status === "running" ? "\u27F3" : tc.status === "done" ? "\u2713" : "\u2717",
|
|
460
|
+
" ",
|
|
461
|
+
tc.name,
|
|
462
|
+
tc.durationMs !== void 0 ? ` (${tc.durationMs}ms)` : ""
|
|
463
|
+
] }) }, i)),
|
|
464
|
+
status === "running" && /* @__PURE__ */ jsx(Text, { color: "yellow", children: "Running..." }),
|
|
465
|
+
status === "done" && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
466
|
+
/* @__PURE__ */ jsxs(Text, { color: "green", bold: true, children: [
|
|
467
|
+
"Done (",
|
|
468
|
+
durationMs,
|
|
469
|
+
"ms)"
|
|
470
|
+
] }),
|
|
471
|
+
/* @__PURE__ */ jsx(Text, { children: result })
|
|
472
|
+
] }),
|
|
473
|
+
status === "error" && /* @__PURE__ */ jsxs(Text, { color: "red", bold: true, children: [
|
|
474
|
+
"Error: ",
|
|
475
|
+
error
|
|
476
|
+
] })
|
|
477
|
+
] });
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// src/commands.ts
|
|
481
|
+
function mergeWithConfig(options, config) {
|
|
482
|
+
if (!config) return options;
|
|
483
|
+
return {
|
|
484
|
+
...options,
|
|
485
|
+
// Config defaults — only apply if CLI flag wasn't set
|
|
486
|
+
provider: options.provider !== "demo" ? options.provider : config.defaults?.provider ?? options.provider,
|
|
487
|
+
model: options.model ?? config.defaults?.model
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
function createCli() {
|
|
491
|
+
const program = new Command();
|
|
492
|
+
program.name("agentskit").description("AgentsKit CLI for chat demos and project bootstrapping.");
|
|
493
|
+
program.command("chat").description("Start a terminal chat session.").option("--provider <provider>", "Provider to use", "demo").option("--model <model>", "Model name").option("--api-key <key>", "API key for the selected provider").option("--base-url <url>", "Override provider base URL").option("--system <prompt>", "System prompt").option("--memory <path>", "Path for file-based memory", ".agentskit-history.json").option("--tools <tools>", "Comma-separated tools: web_search,filesystem,shell").option("--skill <skills>", "Comma-separated skills: researcher,coder,planner,critic,summarizer").option("--memory-backend <backend>", "Memory backend: file (default), sqlite").option("--no-config", "Skip loading .agentskit.config.json").action(async (options) => {
|
|
494
|
+
const config = options.config !== false ? await loadConfig() : void 0;
|
|
495
|
+
const merged = mergeWithConfig(options, config);
|
|
496
|
+
const chatOptions = {
|
|
497
|
+
apiKey: merged.apiKey ?? options.apiKey,
|
|
498
|
+
baseUrl: merged.baseUrl ?? options.baseUrl,
|
|
499
|
+
provider: merged.provider,
|
|
500
|
+
model: merged.model,
|
|
501
|
+
system: options.system,
|
|
502
|
+
memoryPath: options.memory,
|
|
503
|
+
tools: options.tools,
|
|
504
|
+
skill: options.skill,
|
|
505
|
+
memoryBackend: options.memoryBackend,
|
|
506
|
+
agentsKitConfig: config
|
|
507
|
+
};
|
|
508
|
+
process.stdout.write(`${renderChatHeader(chatOptions)}
|
|
509
|
+
`);
|
|
510
|
+
render(React3.createElement(ChatApp, chatOptions));
|
|
511
|
+
});
|
|
512
|
+
program.command("run [task]").description("Execute an agent task and output the result.").option("--task <task>", "Task string (alternative to positional argument)").option("--provider <provider>", "Provider to use", "demo").option("--model <model>", "Model name").option("--api-key <key>", "API key for the selected provider").option("--base-url <url>", "Override provider base URL").option("--skill <skill>", "Single skill to use").option("--skills <skills>", "Comma-separated skills (composed together)").option("--tools <tools>", "Comma-separated tools: web_search,filesystem,shell").option("--memory <path>", "Path for memory persistence").option("--memory-backend <backend>", "Memory backend: file (default), sqlite").option("--system-prompt <prompt>", "System prompt").option("--max-steps <steps>", "Maximum agent steps", "10").option("--verbose", "Stream agent steps to stderr").option("--pretty", "Use rich Ink-based output").option("--no-config", "Skip loading .agentskit.config.json").action(async (positionalTask, options) => {
|
|
513
|
+
const task = options.task ?? positionalTask;
|
|
514
|
+
if (!task) {
|
|
515
|
+
process.stderr.write("Error: task is required. Pass as argument or use --task.\n");
|
|
516
|
+
process.exit(1);
|
|
517
|
+
}
|
|
518
|
+
const config = options.config !== false ? await loadConfig() : void 0;
|
|
519
|
+
const merged = mergeWithConfig(options, config);
|
|
520
|
+
if (options.pretty) {
|
|
521
|
+
render(React3.createElement(RunApp, { task, options }));
|
|
522
|
+
} else {
|
|
523
|
+
try {
|
|
524
|
+
await runAgent(task, { ...options, provider: merged.provider, model: merged.model });
|
|
525
|
+
} catch (err) {
|
|
526
|
+
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}
|
|
527
|
+
`);
|
|
528
|
+
process.exit(1);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
program.command("init").description("Generate a starter project.").option("--template <template>", "Starter template (react|ink)", "react").option("--dir <directory>", "Target directory", "agentskit-starter").action(async (options) => {
|
|
533
|
+
await writeStarterProject({
|
|
534
|
+
template: options.template === "ink" ? "ink" : "react",
|
|
535
|
+
targetDir: path.resolve(process.cwd(), options.dir)
|
|
536
|
+
});
|
|
537
|
+
process.stdout.write(`Created ${options.template} starter in ${options.dir}
|
|
538
|
+
`);
|
|
539
|
+
});
|
|
540
|
+
return program;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export { ChatApp, createCli, renderChatHeader, resolveChatProvider, runAgent, writeStarterProject };
|
|
544
|
+
//# sourceMappingURL=chunk-RHXN45FL.js.map
|
|
545
|
+
//# sourceMappingURL=chunk-RHXN45FL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers.ts","../src/resolve.ts","../src/chat.tsx","../src/init.ts","../src/run.ts","../src/run-ui.tsx","../src/commands.ts"],"names":["createRuntime","jsxs","Box","jsx","Text","React","path"],"mappings":"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","file":"chunk-RHXN45FL.js","sourcesContent":["import {\n anthropic,\n deepseek,\n gemini,\n grok,\n kimi,\n ollama,\n openai,\n} from '@agentskit/adapters'\nimport type { AdapterFactory } from '@agentskit/core'\n\nexport interface ChatProviderOptions {\n provider: string\n model?: string\n apiKey?: string\n baseUrl?: string\n}\n\nexport interface ResolvedChatProvider {\n adapter: AdapterFactory\n provider: string\n model?: string\n mode: 'demo' | 'live'\n summary: string\n}\n\ninterface ProviderEntry {\n label: string\n envKeys: string[]\n defaultModel?: string\n requiresModel?: boolean\n factory: (config: { apiKey: string; model: string; baseUrl?: string }) => AdapterFactory\n}\n\nconst providers: Record<string, ProviderEntry> = {\n openai: {\n label: 'OpenAI',\n envKeys: ['OPENAI_API_KEY'],\n defaultModel: 'gpt-4o-mini',\n factory: (c) => openai(c),\n },\n anthropic: {\n label: 'Anthropic',\n envKeys: ['ANTHROPIC_API_KEY'],\n defaultModel: 'claude-3-5-sonnet-latest',\n factory: (c) => anthropic(c),\n },\n gemini: {\n label: 'Gemini',\n envKeys: ['GEMINI_API_KEY'],\n defaultModel: 'gemini-2.5-flash',\n factory: (c) => gemini(c),\n },\n ollama: {\n label: 'Ollama',\n envKeys: [],\n defaultModel: 'llama3.1',\n factory: (c) => ollama({ model: c.model, baseUrl: c.baseUrl }),\n },\n deepseek: {\n label: 'DeepSeek',\n envKeys: ['DEEPSEEK_API_KEY'],\n defaultModel: 'deepseek-chat',\n factory: (c) => deepseek(c),\n },\n grok: {\n label: 'xAI Grok',\n envKeys: ['XAI_API_KEY'],\n requiresModel: true,\n factory: (c) => grok(c),\n },\n kimi: {\n label: 'Kimi',\n envKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],\n requiresModel: true,\n factory: (c) => kimi(c),\n },\n}\n\nfunction createDemoAdapter(provider: string, model?: string): AdapterFactory {\n return {\n createSource: ({ messages }) => {\n let cancelled = false\n\n return {\n stream: async function* () {\n const userMessages = messages.filter(message => message.role === 'user')\n const lastMessage = userMessages[userMessages.length - 1]\n const reply = [\n `Provider: ${provider}${model ? ` (${model})` : ''}.`,\n 'This is the AgentsKit CLI demo adapter.',\n `You said: ${lastMessage?.content ?? ''}`,\n ].join(' ')\n\n for (const chunk of reply.match(/.{1,18}/g) ?? []) {\n if (cancelled) return\n await new Promise(resolve => setTimeout(resolve, 35))\n yield { type: 'text' as const, content: chunk }\n }\n\n yield { type: 'done' as const }\n },\n abort: () => {\n cancelled = true\n },\n }\n },\n }\n}\n\nexport function resolveChatProvider(options: ChatProviderOptions): ResolvedChatProvider {\n const name = options.provider.toLowerCase()\n\n if (name === 'demo') {\n return {\n adapter: createDemoAdapter(name, options.model),\n provider: name,\n model: options.model,\n mode: 'demo',\n summary: 'demo adapter (no network, no API key required)',\n }\n }\n\n const entry = providers[name]\n if (!entry) {\n const supported = ['demo', ...Object.keys(providers)].join(', ')\n throw new Error(`Unsupported provider \"${options.provider}\". Try ${supported}.`)\n }\n\n // Resolve API key: try explicit flag first, then each envKey in order\n let apiKey = options.apiKey\n if (!apiKey) {\n for (const key of entry.envKeys) {\n apiKey = process.env[key]\n if (apiKey) break\n }\n }\n if (!apiKey && entry.envKeys.length > 0) {\n const keyList = entry.envKeys.join(' or ')\n throw new Error(`${entry.label} requires an API key. Pass --api-key or set ${keyList}.`)\n }\n\n // Resolve model\n const model = options.model ?? entry.defaultModel\n if (!model) {\n throw new Error(`${entry.label} requires --model in the current CLI version.`)\n }\n\n return {\n adapter: entry.factory({ apiKey: apiKey ?? '', model, baseUrl: options.baseUrl }),\n provider: name,\n model,\n mode: 'live',\n summary: `${entry.label} live adapter`,\n }\n}\n","import { createFileMemory } from '@agentskit/core'\nimport type { ChatMemory, SkillDefinition, ToolDefinition } from '@agentskit/core'\nimport { webSearch, filesystem, shell } from '@agentskit/tools'\nimport { researcher, coder, planner, critic, summarizer, composeSkills } from '@agentskit/skills'\nimport { sqliteChatMemory } from '@agentskit/memory'\n\nexport const skillRegistry: Record<string, SkillDefinition> = {\n researcher,\n coder,\n planner,\n critic,\n summarizer,\n}\n\nexport function resolveTools(toolNames: string | undefined): ToolDefinition[] {\n if (!toolNames) return []\n const tools: ToolDefinition[] = []\n for (const name of toolNames.split(',').map(s => s.trim())) {\n switch (name) {\n case 'web_search':\n tools.push(webSearch())\n break\n case 'filesystem':\n tools.push(...filesystem({ basePath: process.cwd() }))\n break\n case 'shell':\n tools.push(shell({ timeout: 30_000 }))\n break\n default:\n process.stderr.write(`Unknown tool: ${name}\\n`)\n }\n }\n return tools\n}\n\nexport function resolveSkill(skillName: string | undefined): SkillDefinition | undefined {\n if (!skillName) return undefined\n const skill = skillRegistry[skillName.trim()]\n if (!skill) {\n process.stderr.write(`Unknown skill: ${skillName}\\n`)\n return undefined\n }\n return skill\n}\n\nexport function resolveSkills(skillNames: string | undefined): SkillDefinition | undefined {\n if (!skillNames) return undefined\n const names = skillNames.split(',').map(s => s.trim())\n const resolved = names.map(n => skillRegistry[n]).filter(Boolean)\n if (resolved.length === 0) {\n process.stderr.write(`No valid skills found in: ${skillNames}\\n`)\n return undefined\n }\n if (resolved.length === 1) return resolved[0]\n return composeSkills(...resolved)\n}\n\nexport function resolveMemory(backend: string | undefined, memoryPath: string): ChatMemory {\n switch (backend) {\n case 'sqlite':\n return sqliteChatMemory({ path: memoryPath.replace(/\\.json$/, '.db') })\n case 'file':\n default:\n return createFileMemory(memoryPath)\n }\n}\n","import React, { useMemo } from 'react'\nimport { Box, Text } from 'ink'\nimport { ChatContainer, InputBar, Message, ThinkingIndicator, ToolCallView, useChat } from '@agentskit/ink'\nimport { resolveChatProvider } from './providers'\nimport { resolveTools, resolveMemory, skillRegistry } from './resolve'\n\nimport type { AgentsKitConfig } from '@agentskit/core'\n\nexport interface ChatCommandOptions {\n provider: string\n model?: string\n system?: string\n memoryPath?: string\n apiKey?: string\n baseUrl?: string\n tools?: string\n skill?: string\n memoryBackend?: string\n agentsKitConfig?: AgentsKitConfig\n}\n\nexport function ChatApp(options: ChatCommandOptions) {\n const adapter = useMemo(\n () => resolveChatProvider(options).adapter,\n [options.apiKey, options.baseUrl, options.model, options.provider]\n )\n const memory = useMemo(\n () => resolveMemory(options.memoryBackend, options.memoryPath ?? '.agentskit-history.json'),\n [options.memoryPath, options.memoryBackend]\n )\n const tools = useMemo(() => resolveTools(options.tools), [options.tools])\n const skills = useMemo(() => {\n if (!options.skill) return undefined\n const names = options.skill.split(',').map(s => s.trim())\n const resolved = names.map(n => skillRegistry[n]).filter(Boolean)\n if (resolved.length === 0) return undefined\n return resolved\n }, [options.skill])\n\n const chat = useChat({\n adapter,\n memory,\n systemPrompt: options.system,\n tools: tools.length > 0 ? tools : undefined,\n skills,\n })\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold color=\"cyan\">\n AgentsKit CLI\n </Text>\n <Text dimColor>\n Press Enter to send. Live providers use env vars or --api-key, and demo mode stays available for zero-config usage.\n </Text>\n <ChatContainer>\n {chat.messages.map(message => (\n <Box key={message.id} flexDirection=\"column\" marginBottom={1}>\n <Message message={message} />\n {message.toolCalls?.map(toolCall => (\n <ToolCallView key={toolCall.id} toolCall={toolCall} />\n ))}\n </Box>\n ))}\n </ChatContainer>\n <ThinkingIndicator visible={chat.status === 'streaming'} />\n <InputBar chat={chat} placeholder=\"Type a message and press Enter...\" />\n </Box>\n )\n}\n\nexport function renderChatHeader(options: ChatCommandOptions): string {\n const runtime = resolveChatProvider(options)\n const parts = [`provider=${runtime.provider}`]\n if (runtime.model) parts.push(`model=${runtime.model}`)\n parts.push(`mode=${runtime.mode}`)\n if (options.tools) parts.push(`tools=${options.tools}`)\n if (options.skill) parts.push(`skill=${options.skill}`)\n if (options.memoryBackend) parts.push(`memory=${options.memoryBackend}`)\n return parts.join(' ')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nexport type StarterKind = 'react' | 'ink'\n\nexport interface InitCommandOptions {\n targetDir: string\n template: StarterKind\n}\n\nfunction reactStarter() {\n return {\n 'package.json': JSON.stringify({\n name: 'agentskit-react-app',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n },\n dependencies: {\n '@agentskit/adapters': '^0.1.0',\n '@agentskit/react': '^0.1.0',\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n },\n }, null, 2),\n 'src/main.tsx': `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { ChatContainer, InputBar, Message, useChat } from '@agentskit/react'\nimport { openai } from '@agentskit/adapters'\nimport '@agentskit/react/theme'\n\nfunction App() {\n const chat = useChat({\n adapter: openai({ apiKey: import.meta.env.VITE_OPENAI_API_KEY ?? '', model: 'gpt-4o-mini' }),\n })\n\n return (\n <ChatContainer>\n {chat.messages.map(message => <Message key={message.id} message={message} />)}\n <InputBar chat={chat} />\n </ChatContainer>\n )\n}\n\nReactDOM.createRoot(document.getElementById('root')!).render(<App />)\n`,\n '.env.example': 'VITE_OPENAI_API_KEY=\\n',\n }\n}\n\nfunction inkStarter() {\n return {\n 'package.json': JSON.stringify({\n name: 'agentskit-ink-app',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx src/index.tsx',\n },\n dependencies: {\n '@agentskit/ink': '^0.1.0',\n react: '^18.3.1',\n },\n }, null, 2),\n 'src/index.tsx': `import React from 'react'\nimport { render } from 'ink'\nimport { ChatContainer, InputBar, Message, useChat } from '@agentskit/ink'\n\nfunction DemoAdapter() {\n return {\n createSource: () => ({\n async *stream() {\n yield { type: 'text', content: 'Hello from AgentsKit Ink.' }\n yield { type: 'done' }\n },\n abort() {},\n }),\n }\n}\n\nfunction App() {\n const chat = useChat({ adapter: DemoAdapter() })\n return (\n <ChatContainer>\n {chat.messages.map(message => <Message key={message.id} message={message} />)}\n <InputBar chat={chat} />\n </ChatContainer>\n )\n}\n\nrender(<App />)\n`,\n }\n}\n\nexport async function writeStarterProject(options: InitCommandOptions) {\n const files = options.template === 'ink' ? inkStarter() : reactStarter()\n await mkdir(options.targetDir, { recursive: true })\n\n await Promise.all(\n Object.entries(files).map(async ([relativePath, content]) => {\n const absolutePath = path.join(options.targetDir, relativePath)\n await mkdir(path.dirname(absolutePath), { recursive: true })\n await writeFile(absolutePath, content, 'utf8')\n })\n )\n}\n","import { createRuntime } from '@agentskit/runtime'\nimport type { AgentEvent, Observer } from '@agentskit/core'\nimport { resolveChatProvider } from './providers'\nimport { resolveTools, resolveSkill, resolveSkills, resolveMemory } from './resolve'\n\nexport interface RunCommandOptions {\n provider: string\n model?: string\n apiKey?: string\n baseUrl?: string\n task?: string\n skill?: string\n skills?: string\n tools?: string\n memory?: string\n memoryBackend?: string\n systemPrompt?: string\n maxSteps?: string\n verbose?: boolean\n pretty?: boolean\n}\n\nfunction formatEvent(event: AgentEvent): string {\n switch (event.type) {\n case 'agent:step':\n return `[step ${event.step}] ${event.action}`\n case 'llm:start':\n return `[llm] start (${event.messageCount} messages)`\n case 'llm:end': {\n const preview = event.content.length > 100 ? event.content.slice(0, 100) + '...' : event.content\n return `[llm] done (${event.durationMs}ms) \"${preview}\"`\n }\n case 'tool:start':\n return `[tool] ${event.name} ${JSON.stringify(event.args)}`\n case 'tool:end':\n return `[tool] ${event.name} done (${event.durationMs}ms)`\n case 'error':\n return `[error] ${event.error.message}`\n default:\n return `[${event.type}]`\n }\n}\n\nexport async function runAgent(task: string, options: RunCommandOptions): Promise<void> {\n if (options.skill && options.skills) {\n process.stderr.write('Error: --skill and --skills are mutually exclusive. Use one or the other.\\n')\n process.exit(1)\n }\n\n const { adapter } = resolveChatProvider({\n provider: options.provider,\n model: options.model,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n })\n\n const tools = resolveTools(options.tools)\n const skill = options.skills\n ? resolveSkills(options.skills)\n : resolveSkill(options.skill)\n const memory = options.memory\n ? resolveMemory(options.memoryBackend, options.memory)\n : undefined\n\n const observers: Observer[] = []\n if (options.verbose) {\n observers.push({\n name: 'cli-verbose',\n on(event: AgentEvent) {\n process.stderr.write(formatEvent(event) + '\\n')\n },\n })\n }\n\n const runtime = createRuntime({\n adapter,\n tools,\n memory,\n systemPrompt: options.systemPrompt,\n maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : undefined,\n observers,\n })\n\n const result = await runtime.run(task, {\n skill: skill ?? undefined,\n })\n\n process.stdout.write(result.content + '\\n')\n}\n","import React, { useEffect, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { createRuntime } from '@agentskit/runtime'\nimport type { AgentEvent, Observer } from '@agentskit/core'\nimport { resolveChatProvider } from './providers'\nimport { resolveTools, resolveSkill, resolveSkills, resolveMemory } from './resolve'\nimport type { RunCommandOptions } from './run'\n\ninterface ToolCallInfo {\n name: string\n status: 'running' | 'done' | 'error'\n durationMs?: number\n}\n\nexport function RunApp({ task, options }: { task: string; options: RunCommandOptions }) {\n const [status, setStatus] = useState<'running' | 'done' | 'error'>('running')\n const [currentStep, setCurrentStep] = useState(0)\n const [toolCalls, setToolCalls] = useState<ToolCallInfo[]>([])\n const [result, setResult] = useState('')\n const [error, setError] = useState('')\n const [durationMs, setDurationMs] = useState(0)\n\n useEffect(() => {\n async function execute() {\n if (options.skill && options.skills) {\n setError('--skill and --skills are mutually exclusive.')\n setStatus('error')\n return\n }\n\n const { adapter } = resolveChatProvider({\n provider: options.provider,\n model: options.model,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n })\n\n const tools = resolveTools(options.tools)\n const skill = options.skills\n ? resolveSkills(options.skills)\n : resolveSkill(options.skill)\n const memory = options.memory\n ? resolveMemory(options.memoryBackend, options.memory)\n : undefined\n\n const observers: Observer[] = [{\n name: 'run-ui',\n on(event: AgentEvent) {\n switch (event.type) {\n case 'agent:step':\n setCurrentStep(event.step)\n break\n case 'tool:start':\n setToolCalls(prev => [...prev, { name: event.name, status: 'running' }])\n break\n case 'tool:end':\n setToolCalls(prev => prev.map(tc =>\n tc.name === event.name && tc.status === 'running'\n ? { ...tc, status: 'done', durationMs: event.durationMs }\n : tc\n ))\n break\n case 'error':\n setToolCalls(prev => prev.map(tc =>\n tc.status === 'running' ? { ...tc, status: 'error' } : tc\n ))\n break\n }\n },\n }]\n\n const runtime = createRuntime({\n adapter,\n tools,\n memory,\n systemPrompt: options.systemPrompt,\n maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : undefined,\n observers,\n })\n\n try {\n const runResult = await runtime.run(task, { skill: skill ?? undefined })\n setResult(runResult.content)\n setDurationMs(runResult.durationMs)\n setStatus('done')\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n setStatus('error')\n }\n }\n\n void execute()\n }, [])\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold color=\"cyan\">agentskit run</Text>\n <Text dimColor>Task: {task}</Text>\n\n {status === 'running' && currentStep > 0 && (\n <Text color=\"yellow\">{'⟳'} Step {currentStep}</Text>\n )}\n\n {toolCalls.map((tc, i) => (\n <Box key={i} marginLeft={2}>\n <Text color={tc.status === 'running' ? 'yellow' : tc.status === 'done' ? 'green' : 'red'}>\n {tc.status === 'running' ? '⟳' : tc.status === 'done' ? '✓' : '✗'}{' '}\n {tc.name}\n {tc.durationMs !== undefined ? ` (${tc.durationMs}ms)` : ''}\n </Text>\n </Box>\n ))}\n\n {status === 'running' && (\n <Text color=\"yellow\">Running...</Text>\n )}\n\n {status === 'done' && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>Done ({durationMs}ms)</Text>\n <Text>{result}</Text>\n </Box>\n )}\n\n {status === 'error' && (\n <Text color=\"red\" bold>Error: {error}</Text>\n )}\n </Box>\n )\n}\n","import React from 'react'\nimport { render } from 'ink'\nimport { Command } from 'commander'\nimport path from 'node:path'\nimport { loadConfig } from '@agentskit/core'\nimport type { AgentsKitConfig } from '@agentskit/core'\nimport { ChatApp, renderChatHeader } from './chat'\nimport { writeStarterProject } from './init'\nimport { runAgent } from './run'\nimport { RunApp } from './run-ui'\n\nfunction mergeWithConfig(options: Record<string, unknown>, config: AgentsKitConfig | undefined): Record<string, unknown> {\n if (!config) return options\n return {\n ...options,\n // Config defaults — only apply if CLI flag wasn't set\n provider: options.provider !== 'demo' ? options.provider : (config.defaults?.provider ?? options.provider),\n model: options.model ?? config.defaults?.model,\n }\n}\n\nexport function createCli() {\n const program = new Command()\n\n program\n .name('agentskit')\n .description('AgentsKit CLI for chat demos and project bootstrapping.')\n\n program\n .command('chat')\n .description('Start a terminal chat session.')\n .option('--provider <provider>', 'Provider to use', 'demo')\n .option('--model <model>', 'Model name')\n .option('--api-key <key>', 'API key for the selected provider')\n .option('--base-url <url>', 'Override provider base URL')\n .option('--system <prompt>', 'System prompt')\n .option('--memory <path>', 'Path for file-based memory', '.agentskit-history.json')\n .option('--tools <tools>', 'Comma-separated tools: web_search,filesystem,shell')\n .option('--skill <skills>', 'Comma-separated skills: researcher,coder,planner,critic,summarizer')\n .option('--memory-backend <backend>', 'Memory backend: file (default), sqlite')\n .option('--no-config', 'Skip loading .agentskit.config.json')\n .action(async (options) => {\n const config = options.config !== false ? await loadConfig() : undefined\n const merged = mergeWithConfig(options, config)\n\n const chatOptions = {\n apiKey: (merged.apiKey ?? options.apiKey) as string | undefined,\n baseUrl: (merged.baseUrl ?? options.baseUrl) as string | undefined,\n provider: merged.provider as string,\n model: merged.model as string | undefined,\n system: options.system as string | undefined,\n memoryPath: options.memory as string | undefined,\n tools: options.tools as string | undefined,\n skill: options.skill as string | undefined,\n memoryBackend: options.memoryBackend as string | undefined,\n agentsKitConfig: config,\n }\n process.stdout.write(`${renderChatHeader(chatOptions)}\\n`)\n render(React.createElement(ChatApp, chatOptions))\n })\n\n program\n .command('run [task]')\n .description('Execute an agent task and output the result.')\n .option('--task <task>', 'Task string (alternative to positional argument)')\n .option('--provider <provider>', 'Provider to use', 'demo')\n .option('--model <model>', 'Model name')\n .option('--api-key <key>', 'API key for the selected provider')\n .option('--base-url <url>', 'Override provider base URL')\n .option('--skill <skill>', 'Single skill to use')\n .option('--skills <skills>', 'Comma-separated skills (composed together)')\n .option('--tools <tools>', 'Comma-separated tools: web_search,filesystem,shell')\n .option('--memory <path>', 'Path for memory persistence')\n .option('--memory-backend <backend>', 'Memory backend: file (default), sqlite')\n .option('--system-prompt <prompt>', 'System prompt')\n .option('--max-steps <steps>', 'Maximum agent steps', '10')\n .option('--verbose', 'Stream agent steps to stderr')\n .option('--pretty', 'Use rich Ink-based output')\n .option('--no-config', 'Skip loading .agentskit.config.json')\n .action(async (positionalTask: string | undefined, options) => {\n const task = options.task ?? positionalTask\n if (!task) {\n process.stderr.write('Error: task is required. Pass as argument or use --task.\\n')\n process.exit(1)\n }\n\n const config = options.config !== false ? await loadConfig() : undefined\n const merged = mergeWithConfig(options, config)\n\n if (options.pretty) {\n render(React.createElement(RunApp, { task, options }))\n } else {\n try {\n await runAgent(task, { ...options, provider: merged.provider, model: merged.model })\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n }\n }\n })\n\n program\n .command('init')\n .description('Generate a starter project.')\n .option('--template <template>', 'Starter template (react|ink)', 'react')\n .option('--dir <directory>', 'Target directory', 'agentskit-starter')\n .action(async (options) => {\n await writeStarterProject({\n template: options.template === 'ink' ? 'ink' : 'react',\n targetDir: path.resolve(process.cwd(), options.dir),\n })\n process.stdout.write(`Created ${options.template} starter in ${options.dir}\\n`)\n })\n\n return program\n}\n"]}
|