@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
package/dist/index.cjs
CHANGED
|
@@ -1,61 +1,65 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var React3 = require('react');
|
|
5
5
|
var ink$1 = require('ink');
|
|
6
6
|
var commander = require('commander');
|
|
7
7
|
var path = require('path');
|
|
8
8
|
var core = require('@agentskit/core');
|
|
9
9
|
var ink = require('@agentskit/ink');
|
|
10
10
|
var adapters = require('@agentskit/adapters');
|
|
11
|
+
var tools = require('@agentskit/tools');
|
|
12
|
+
var skills = require('@agentskit/skills');
|
|
13
|
+
var memory = require('@agentskit/memory');
|
|
11
14
|
var jsxRuntime = require('react/jsx-runtime');
|
|
12
15
|
var promises = require('fs/promises');
|
|
16
|
+
var runtime = require('@agentskit/runtime');
|
|
13
17
|
|
|
14
18
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
19
|
|
|
16
|
-
var
|
|
20
|
+
var React3__default = /*#__PURE__*/_interopDefault(React3);
|
|
17
21
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
18
22
|
|
|
19
23
|
var providers = {
|
|
20
24
|
openai: {
|
|
21
25
|
label: "OpenAI",
|
|
22
|
-
|
|
26
|
+
envKeys: ["OPENAI_API_KEY"],
|
|
23
27
|
defaultModel: "gpt-4o-mini",
|
|
24
28
|
factory: (c) => adapters.openai(c)
|
|
25
29
|
},
|
|
26
30
|
anthropic: {
|
|
27
31
|
label: "Anthropic",
|
|
28
|
-
|
|
32
|
+
envKeys: ["ANTHROPIC_API_KEY"],
|
|
29
33
|
defaultModel: "claude-3-5-sonnet-latest",
|
|
30
34
|
factory: (c) => adapters.anthropic(c)
|
|
31
35
|
},
|
|
32
36
|
gemini: {
|
|
33
37
|
label: "Gemini",
|
|
34
|
-
|
|
38
|
+
envKeys: ["GEMINI_API_KEY"],
|
|
35
39
|
defaultModel: "gemini-2.5-flash",
|
|
36
40
|
factory: (c) => adapters.gemini(c)
|
|
37
41
|
},
|
|
38
42
|
ollama: {
|
|
39
43
|
label: "Ollama",
|
|
40
|
-
|
|
44
|
+
envKeys: [],
|
|
41
45
|
defaultModel: "llama3.1",
|
|
42
46
|
factory: (c) => adapters.ollama({ model: c.model, baseUrl: c.baseUrl })
|
|
43
47
|
},
|
|
44
48
|
deepseek: {
|
|
45
49
|
label: "DeepSeek",
|
|
46
|
-
|
|
50
|
+
envKeys: ["DEEPSEEK_API_KEY"],
|
|
47
51
|
defaultModel: "deepseek-chat",
|
|
48
52
|
factory: (c) => adapters.deepseek(c)
|
|
49
53
|
},
|
|
50
54
|
grok: {
|
|
51
55
|
label: "xAI Grok",
|
|
52
|
-
|
|
56
|
+
envKeys: ["XAI_API_KEY"],
|
|
53
57
|
requiresModel: true,
|
|
54
58
|
factory: (c) => adapters.grok(c)
|
|
55
59
|
},
|
|
56
60
|
kimi: {
|
|
57
61
|
label: "Kimi",
|
|
58
|
-
|
|
62
|
+
envKeys: ["KIMI_API_KEY", "MOONSHOT_API_KEY"],
|
|
59
63
|
requiresModel: true,
|
|
60
64
|
factory: (c) => adapters.kimi(c)
|
|
61
65
|
}
|
|
@@ -103,12 +107,16 @@ function resolveChatProvider(options) {
|
|
|
103
107
|
const supported = ["demo", ...Object.keys(providers)].join(", ");
|
|
104
108
|
throw new Error(`Unsupported provider "${options.provider}". Try ${supported}.`);
|
|
105
109
|
}
|
|
106
|
-
let apiKey = options.apiKey
|
|
107
|
-
if (
|
|
108
|
-
|
|
110
|
+
let apiKey = options.apiKey;
|
|
111
|
+
if (!apiKey) {
|
|
112
|
+
for (const key of entry.envKeys) {
|
|
113
|
+
apiKey = process.env[key];
|
|
114
|
+
if (apiKey) break;
|
|
115
|
+
}
|
|
109
116
|
}
|
|
110
|
-
if (!apiKey && entry.
|
|
111
|
-
|
|
117
|
+
if (!apiKey && entry.envKeys.length > 0) {
|
|
118
|
+
const keyList = entry.envKeys.join(" or ");
|
|
119
|
+
throw new Error(`${entry.label} requires an API key. Pass --api-key or set ${keyList}.`);
|
|
112
120
|
}
|
|
113
121
|
const model = options.model ?? entry.defaultModel;
|
|
114
122
|
if (!model) {
|
|
@@ -122,19 +130,88 @@ function resolveChatProvider(options) {
|
|
|
122
130
|
summary: `${entry.label} live adapter`
|
|
123
131
|
};
|
|
124
132
|
}
|
|
133
|
+
var skillRegistry = {
|
|
134
|
+
researcher: skills.researcher,
|
|
135
|
+
coder: skills.coder,
|
|
136
|
+
planner: skills.planner,
|
|
137
|
+
critic: skills.critic,
|
|
138
|
+
summarizer: skills.summarizer
|
|
139
|
+
};
|
|
140
|
+
function resolveTools(toolNames) {
|
|
141
|
+
if (!toolNames) return [];
|
|
142
|
+
const tools$1 = [];
|
|
143
|
+
for (const name of toolNames.split(",").map((s) => s.trim())) {
|
|
144
|
+
switch (name) {
|
|
145
|
+
case "web_search":
|
|
146
|
+
tools$1.push(tools.webSearch());
|
|
147
|
+
break;
|
|
148
|
+
case "filesystem":
|
|
149
|
+
tools$1.push(...tools.filesystem({ basePath: process.cwd() }));
|
|
150
|
+
break;
|
|
151
|
+
case "shell":
|
|
152
|
+
tools$1.push(tools.shell({ timeout: 3e4 }));
|
|
153
|
+
break;
|
|
154
|
+
default:
|
|
155
|
+
process.stderr.write(`Unknown tool: ${name}
|
|
156
|
+
`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return tools$1;
|
|
160
|
+
}
|
|
161
|
+
function resolveSkill(skillName) {
|
|
162
|
+
if (!skillName) return void 0;
|
|
163
|
+
const skill = skillRegistry[skillName.trim()];
|
|
164
|
+
if (!skill) {
|
|
165
|
+
process.stderr.write(`Unknown skill: ${skillName}
|
|
166
|
+
`);
|
|
167
|
+
return void 0;
|
|
168
|
+
}
|
|
169
|
+
return skill;
|
|
170
|
+
}
|
|
171
|
+
function resolveSkills(skillNames) {
|
|
172
|
+
if (!skillNames) return void 0;
|
|
173
|
+
const names = skillNames.split(",").map((s) => s.trim());
|
|
174
|
+
const resolved = names.map((n) => skillRegistry[n]).filter(Boolean);
|
|
175
|
+
if (resolved.length === 0) {
|
|
176
|
+
process.stderr.write(`No valid skills found in: ${skillNames}
|
|
177
|
+
`);
|
|
178
|
+
return void 0;
|
|
179
|
+
}
|
|
180
|
+
if (resolved.length === 1) return resolved[0];
|
|
181
|
+
return skills.composeSkills(...resolved);
|
|
182
|
+
}
|
|
183
|
+
function resolveMemory(backend, memoryPath) {
|
|
184
|
+
switch (backend) {
|
|
185
|
+
case "sqlite":
|
|
186
|
+
return memory.sqliteChatMemory({ path: memoryPath.replace(/\.json$/, ".db") });
|
|
187
|
+
case "file":
|
|
188
|
+
default:
|
|
189
|
+
return core.createFileMemory(memoryPath);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
125
192
|
function ChatApp(options) {
|
|
126
|
-
const adapter =
|
|
193
|
+
const adapter = React3.useMemo(
|
|
127
194
|
() => resolveChatProvider(options).adapter,
|
|
128
195
|
[options.apiKey, options.baseUrl, options.model, options.provider]
|
|
129
196
|
);
|
|
130
|
-
const memory =
|
|
131
|
-
() =>
|
|
132
|
-
[options.memoryPath]
|
|
197
|
+
const memory = React3.useMemo(
|
|
198
|
+
() => resolveMemory(options.memoryBackend, options.memoryPath ?? ".agentskit-history.json"),
|
|
199
|
+
[options.memoryPath, options.memoryBackend]
|
|
133
200
|
);
|
|
201
|
+
const tools = React3.useMemo(() => resolveTools(options.tools), [options.tools]);
|
|
202
|
+
const skills = React3.useMemo(() => {
|
|
203
|
+
if (!options.skill) return void 0;
|
|
204
|
+
const names = options.skill.split(",").map((s) => s.trim());
|
|
205
|
+
const resolved = names.map((n) => skillRegistry[n]).filter(Boolean);
|
|
206
|
+
if (resolved.length === 0) return void 0;
|
|
207
|
+
return resolved;
|
|
208
|
+
}, [options.skill]);
|
|
134
209
|
const chat = ink.useChat({
|
|
135
210
|
adapter,
|
|
136
211
|
memory,
|
|
137
|
-
systemPrompt: options.system
|
|
212
|
+
systemPrompt: options.system,
|
|
213
|
+
tools: tools.length > 0 ? tools : void 0,
|
|
214
|
+
skills
|
|
138
215
|
});
|
|
139
216
|
return /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Box, { flexDirection: "column", gap: 1, children: [
|
|
140
217
|
/* @__PURE__ */ jsxRuntime.jsx(ink$1.Text, { bold: true, color: "cyan", children: "AgentsKit CLI" }),
|
|
@@ -149,7 +226,13 @@ function ChatApp(options) {
|
|
|
149
226
|
}
|
|
150
227
|
function renderChatHeader(options) {
|
|
151
228
|
const runtime = resolveChatProvider(options);
|
|
152
|
-
|
|
229
|
+
const parts = [`provider=${runtime.provider}`];
|
|
230
|
+
if (runtime.model) parts.push(`model=${runtime.model}`);
|
|
231
|
+
parts.push(`mode=${runtime.mode}`);
|
|
232
|
+
if (options.tools) parts.push(`tools=${options.tools}`);
|
|
233
|
+
if (options.skill) parts.push(`skill=${options.skill}`);
|
|
234
|
+
if (options.memoryBackend) parts.push(`memory=${options.memoryBackend}`);
|
|
235
|
+
return parts.join(" ");
|
|
153
236
|
}
|
|
154
237
|
function reactStarter() {
|
|
155
238
|
return {
|
|
@@ -246,22 +329,212 @@ async function writeStarterProject(options) {
|
|
|
246
329
|
})
|
|
247
330
|
);
|
|
248
331
|
}
|
|
332
|
+
function formatEvent(event) {
|
|
333
|
+
switch (event.type) {
|
|
334
|
+
case "agent:step":
|
|
335
|
+
return `[step ${event.step}] ${event.action}`;
|
|
336
|
+
case "llm:start":
|
|
337
|
+
return `[llm] start (${event.messageCount} messages)`;
|
|
338
|
+
case "llm:end": {
|
|
339
|
+
const preview = event.content.length > 100 ? event.content.slice(0, 100) + "..." : event.content;
|
|
340
|
+
return `[llm] done (${event.durationMs}ms) "${preview}"`;
|
|
341
|
+
}
|
|
342
|
+
case "tool:start":
|
|
343
|
+
return `[tool] ${event.name} ${JSON.stringify(event.args)}`;
|
|
344
|
+
case "tool:end":
|
|
345
|
+
return `[tool] ${event.name} done (${event.durationMs}ms)`;
|
|
346
|
+
case "error":
|
|
347
|
+
return `[error] ${event.error.message}`;
|
|
348
|
+
default:
|
|
349
|
+
return `[${event.type}]`;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
async function runAgent(task, options) {
|
|
353
|
+
if (options.skill && options.skills) {
|
|
354
|
+
process.stderr.write("Error: --skill and --skills are mutually exclusive. Use one or the other.\n");
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
const { adapter } = resolveChatProvider({
|
|
358
|
+
provider: options.provider,
|
|
359
|
+
model: options.model,
|
|
360
|
+
apiKey: options.apiKey,
|
|
361
|
+
baseUrl: options.baseUrl
|
|
362
|
+
});
|
|
363
|
+
const tools = resolveTools(options.tools);
|
|
364
|
+
const skill = options.skills ? resolveSkills(options.skills) : resolveSkill(options.skill);
|
|
365
|
+
const memory = options.memory ? resolveMemory(options.memoryBackend, options.memory) : void 0;
|
|
366
|
+
const observers = [];
|
|
367
|
+
if (options.verbose) {
|
|
368
|
+
observers.push({
|
|
369
|
+
name: "cli-verbose",
|
|
370
|
+
on(event) {
|
|
371
|
+
process.stderr.write(formatEvent(event) + "\n");
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
const runtime$1 = runtime.createRuntime({
|
|
376
|
+
adapter,
|
|
377
|
+
tools,
|
|
378
|
+
memory,
|
|
379
|
+
systemPrompt: options.systemPrompt,
|
|
380
|
+
maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : void 0,
|
|
381
|
+
observers
|
|
382
|
+
});
|
|
383
|
+
const result = await runtime$1.run(task, {
|
|
384
|
+
skill: skill ?? void 0
|
|
385
|
+
});
|
|
386
|
+
process.stdout.write(result.content + "\n");
|
|
387
|
+
}
|
|
388
|
+
function RunApp({ task, options }) {
|
|
389
|
+
const [status, setStatus] = React3.useState("running");
|
|
390
|
+
const [currentStep, setCurrentStep] = React3.useState(0);
|
|
391
|
+
const [toolCalls, setToolCalls] = React3.useState([]);
|
|
392
|
+
const [result, setResult] = React3.useState("");
|
|
393
|
+
const [error, setError] = React3.useState("");
|
|
394
|
+
const [durationMs, setDurationMs] = React3.useState(0);
|
|
395
|
+
React3.useEffect(() => {
|
|
396
|
+
async function execute() {
|
|
397
|
+
if (options.skill && options.skills) {
|
|
398
|
+
setError("--skill and --skills are mutually exclusive.");
|
|
399
|
+
setStatus("error");
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const { adapter } = resolveChatProvider({
|
|
403
|
+
provider: options.provider,
|
|
404
|
+
model: options.model,
|
|
405
|
+
apiKey: options.apiKey,
|
|
406
|
+
baseUrl: options.baseUrl
|
|
407
|
+
});
|
|
408
|
+
const tools = resolveTools(options.tools);
|
|
409
|
+
const skill = options.skills ? resolveSkills(options.skills) : resolveSkill(options.skill);
|
|
410
|
+
const memory = options.memory ? resolveMemory(options.memoryBackend, options.memory) : void 0;
|
|
411
|
+
const observers = [{
|
|
412
|
+
name: "run-ui",
|
|
413
|
+
on(event) {
|
|
414
|
+
switch (event.type) {
|
|
415
|
+
case "agent:step":
|
|
416
|
+
setCurrentStep(event.step);
|
|
417
|
+
break;
|
|
418
|
+
case "tool:start":
|
|
419
|
+
setToolCalls((prev) => [...prev, { name: event.name, status: "running" }]);
|
|
420
|
+
break;
|
|
421
|
+
case "tool:end":
|
|
422
|
+
setToolCalls((prev) => prev.map(
|
|
423
|
+
(tc) => tc.name === event.name && tc.status === "running" ? { ...tc, status: "done", durationMs: event.durationMs } : tc
|
|
424
|
+
));
|
|
425
|
+
break;
|
|
426
|
+
case "error":
|
|
427
|
+
setToolCalls((prev) => prev.map(
|
|
428
|
+
(tc) => tc.status === "running" ? { ...tc, status: "error" } : tc
|
|
429
|
+
));
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}];
|
|
434
|
+
const runtime$1 = runtime.createRuntime({
|
|
435
|
+
adapter,
|
|
436
|
+
tools,
|
|
437
|
+
memory,
|
|
438
|
+
systemPrompt: options.systemPrompt,
|
|
439
|
+
maxSteps: options.maxSteps ? parseInt(options.maxSteps, 10) : void 0,
|
|
440
|
+
observers
|
|
441
|
+
});
|
|
442
|
+
try {
|
|
443
|
+
const runResult = await runtime$1.run(task, { skill: skill ?? void 0 });
|
|
444
|
+
setResult(runResult.content);
|
|
445
|
+
setDurationMs(runResult.durationMs);
|
|
446
|
+
setStatus("done");
|
|
447
|
+
} catch (err) {
|
|
448
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
449
|
+
setStatus("error");
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
void execute();
|
|
453
|
+
}, []);
|
|
454
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Box, { flexDirection: "column", gap: 1, children: [
|
|
455
|
+
/* @__PURE__ */ jsxRuntime.jsx(ink$1.Text, { bold: true, color: "cyan", children: "agentskit run" }),
|
|
456
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ink$1.Text, { dimColor: true, children: [
|
|
457
|
+
"Task: ",
|
|
458
|
+
task
|
|
459
|
+
] }),
|
|
460
|
+
status === "running" && currentStep > 0 && /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Text, { color: "yellow", children: [
|
|
461
|
+
"\u27F3",
|
|
462
|
+
" Step ",
|
|
463
|
+
currentStep
|
|
464
|
+
] }),
|
|
465
|
+
toolCalls.map((tc, i) => /* @__PURE__ */ jsxRuntime.jsx(ink$1.Box, { marginLeft: 2, children: /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Text, { color: tc.status === "running" ? "yellow" : tc.status === "done" ? "green" : "red", children: [
|
|
466
|
+
tc.status === "running" ? "\u27F3" : tc.status === "done" ? "\u2713" : "\u2717",
|
|
467
|
+
" ",
|
|
468
|
+
tc.name,
|
|
469
|
+
tc.durationMs !== void 0 ? ` (${tc.durationMs}ms)` : ""
|
|
470
|
+
] }) }, i)),
|
|
471
|
+
status === "running" && /* @__PURE__ */ jsxRuntime.jsx(ink$1.Text, { color: "yellow", children: "Running..." }),
|
|
472
|
+
status === "done" && /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Box, { flexDirection: "column", children: [
|
|
473
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ink$1.Text, { color: "green", bold: true, children: [
|
|
474
|
+
"Done (",
|
|
475
|
+
durationMs,
|
|
476
|
+
"ms)"
|
|
477
|
+
] }),
|
|
478
|
+
/* @__PURE__ */ jsxRuntime.jsx(ink$1.Text, { children: result })
|
|
479
|
+
] }),
|
|
480
|
+
status === "error" && /* @__PURE__ */ jsxRuntime.jsxs(ink$1.Text, { color: "red", bold: true, children: [
|
|
481
|
+
"Error: ",
|
|
482
|
+
error
|
|
483
|
+
] })
|
|
484
|
+
] });
|
|
485
|
+
}
|
|
249
486
|
|
|
250
487
|
// src/commands.ts
|
|
488
|
+
function mergeWithConfig(options, config) {
|
|
489
|
+
if (!config) return options;
|
|
490
|
+
return {
|
|
491
|
+
...options,
|
|
492
|
+
// Config defaults — only apply if CLI flag wasn't set
|
|
493
|
+
provider: options.provider !== "demo" ? options.provider : config.defaults?.provider ?? options.provider,
|
|
494
|
+
model: options.model ?? config.defaults?.model
|
|
495
|
+
};
|
|
496
|
+
}
|
|
251
497
|
function createCli() {
|
|
252
498
|
const program = new commander.Command();
|
|
253
499
|
program.name("agentskit").description("AgentsKit CLI for chat demos and project bootstrapping.");
|
|
254
|
-
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").action((options) => {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
apiKey: options.apiKey,
|
|
259
|
-
baseUrl: options.baseUrl,
|
|
260
|
-
provider:
|
|
261
|
-
model:
|
|
500
|
+
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) => {
|
|
501
|
+
const config = options.config !== false ? await core.loadConfig() : void 0;
|
|
502
|
+
const merged = mergeWithConfig(options, config);
|
|
503
|
+
const chatOptions = {
|
|
504
|
+
apiKey: merged.apiKey ?? options.apiKey,
|
|
505
|
+
baseUrl: merged.baseUrl ?? options.baseUrl,
|
|
506
|
+
provider: merged.provider,
|
|
507
|
+
model: merged.model,
|
|
262
508
|
system: options.system,
|
|
263
|
-
memoryPath: options.memory
|
|
264
|
-
|
|
509
|
+
memoryPath: options.memory,
|
|
510
|
+
tools: options.tools,
|
|
511
|
+
skill: options.skill,
|
|
512
|
+
memoryBackend: options.memoryBackend,
|
|
513
|
+
agentsKitConfig: config
|
|
514
|
+
};
|
|
515
|
+
process.stdout.write(`${renderChatHeader(chatOptions)}
|
|
516
|
+
`);
|
|
517
|
+
ink$1.render(React3__default.default.createElement(ChatApp, chatOptions));
|
|
518
|
+
});
|
|
519
|
+
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) => {
|
|
520
|
+
const task = options.task ?? positionalTask;
|
|
521
|
+
if (!task) {
|
|
522
|
+
process.stderr.write("Error: task is required. Pass as argument or use --task.\n");
|
|
523
|
+
process.exit(1);
|
|
524
|
+
}
|
|
525
|
+
const config = options.config !== false ? await core.loadConfig() : void 0;
|
|
526
|
+
const merged = mergeWithConfig(options, config);
|
|
527
|
+
if (options.pretty) {
|
|
528
|
+
ink$1.render(React3__default.default.createElement(RunApp, { task, options }));
|
|
529
|
+
} else {
|
|
530
|
+
try {
|
|
531
|
+
await runAgent(task, { ...options, provider: merged.provider, model: merged.model });
|
|
532
|
+
} catch (err) {
|
|
533
|
+
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}
|
|
534
|
+
`);
|
|
535
|
+
process.exit(1);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
265
538
|
});
|
|
266
539
|
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) => {
|
|
267
540
|
await writeStarterProject({
|
|
@@ -278,6 +551,7 @@ exports.ChatApp = ChatApp;
|
|
|
278
551
|
exports.createCli = createCli;
|
|
279
552
|
exports.renderChatHeader = renderChatHeader;
|
|
280
553
|
exports.resolveChatProvider = resolveChatProvider;
|
|
554
|
+
exports.runAgent = runAgent;
|
|
281
555
|
exports.writeStarterProject = writeStarterProject;
|
|
282
556
|
//# sourceMappingURL=index.cjs.map
|
|
283
557
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers.ts","../src/chat.tsx","../src/init.ts","../src/commands.ts"],"names":["openai","anthropic","gemini","ollama","deepseek","grok","kimi","useMemo","createFileMemory","useChat","jsxs","Box","jsx","Text","ChatContainer","Message","ToolCallView","ThinkingIndicator","InputBar","mkdir","path","writeFile","Command","render","React"],"mappings":";;;;;;;;;;;;;;;;;;AAkCA,IAAM,SAAA,GAA2C;AAAA,EAC/C,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,YAAA,EAAc,aAAA;AAAA,IACd,OAAA,EAAS,CAAC,CAAA,KAAMA,eAAA,CAAO,CAAC;AAAA,GAC1B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,YAAA,EAAc,0BAAA;AAAA,IACd,OAAA,EAAS,CAAC,CAAA,KAAMC,kBAAA,CAAU,CAAC;AAAA,GAC7B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,YAAA,EAAc,kBAAA;AAAA,IACd,OAAA,EAAS,CAAC,CAAA,KAAMC,eAAA,CAAO,CAAC;AAAA,GAC1B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,YAAA,EAAc,UAAA;AAAA,IACd,OAAA,EAAS,CAAC,CAAA,KAAMC,eAAA,CAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS;AAAA,GAC/D;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,YAAA,EAAc,eAAA;AAAA,IACd,OAAA,EAAS,CAAC,CAAA,KAAMC,iBAAA,CAAS,CAAC;AAAA,GAC5B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,CAAA,KAAMC,aAAA,CAAK,CAAC;AAAA,GACxB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,CAAA,KAAMC,aAAA,CAAK,CAAC;AAAA;AAE1B,CAAA;AAEA,SAAS,iBAAA,CAAkB,UAAkB,KAAA,EAAgC;AAC3E,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,EAAE,QAAA,EAAS,KAAM;AAC9B,MAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,MAAA,OAAO;AAAA,QACL,QAAQ,mBAAmB;AACzB,UAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,MAAM,CAAA;AACvE,UAAA,MAAM,WAAA,GAAc,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACxD,UAAA,MAAM,KAAA,GAAQ;AAAA,YACZ,aAAa,QAAQ,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,MAAM,EAAE,CAAA,CAAA,CAAA;AAAA,YAClD,yCAAA;AAAA,YACA,CAAA,UAAA,EAAa,WAAA,EAAa,OAAA,IAAW,EAAE,CAAA;AAAA,WACzC,CAAE,KAAK,GAAG,CAAA;AAEV,UAAA,KAAA,MAAW,SAAS,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA,IAAK,EAAC,EAAG;AACjD,YAAA,IAAI,SAAA,EAAW;AACf,YAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACpD,YAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAiB,OAAA,EAAS,KAAA,EAAM;AAAA,UAChD;AAEA,UAAA,MAAM,EAAE,MAAM,MAAA,EAAgB;AAAA,QAChC,CAAA;AAAA,QACA,OAAO,MAAM;AACX,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEO,SAAS,oBAAoB,OAAA,EAAoD;AACtF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAE1C,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,iBAAA,CAAkB,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC9C,QAAA,EAAU,IAAA;AAAA,MACV,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,GAAG,MAAA,CAAO,KAAK,SAAS,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,QAAQ,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,MAAA,GAAS,QAAQ,MAAA,KAAW,KAAA,CAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA,CAAA;AAC3E,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,CAAC,MAAA,EAAQ;AAC9B,IAAA,MAAA,GAAS,QAAQ,GAAA,CAAI,gBAAA;AAAA,EACvB;AACA,EAAA,IAAI,CAAC,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,MAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,4CAAA,EAA+C,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9F;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,KAAA,CAAM,YAAA;AACrC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,IAAU,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,IAChF,QAAA,EAAU,IAAA;AAAA,IACV,KAAA;AAAA,IACA,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,aAAA;AAAA,GACzB;AACF;ACxIO,SAAS,QAAQ,OAAA,EAA6B;AACnD,EAAA,MAAM,OAAA,GAAUC,cAAA;AAAA,IACd,MAAM,mBAAA,CAAoB,OAAO,CAAA,CAAE,OAAA;AAAA,IACnC,CAAC,QAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAQ;AAAA,GACnE;AACA,EAAA,MAAM,MAAA,GAASA,cAAA;AAAA,IACb,MAAMC,qBAAA,CAAiB,OAAA,CAAQ,UAAA,IAAc,yBAAyB,CAAA;AAAA,IACtE,CAAC,QAAQ,UAAU;AAAA,GACrB;AAEA,EAAA,MAAM,OAAOC,WAAA,CAAQ;AAAA,IACnB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAA;AAED,EAAA,uBACEC,eAAA,CAACC,SAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,UAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QAAO,QAAA,EAAA,eAAA,EAExB,CAAA;AAAA,oBACAD,cAAA,CAACC,UAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,qHAAA,EAEf,CAAA;AAAA,oBACAD,cAAA,CAACE,iBAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,qBACjBJ,eAAA,CAACC,SAAA,EAAA,EAAqB,aAAA,EAAc,QAAA,EAAS,YAAA,EAAc,CAAA,EACzD,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACG,eAAQ,OAAA,EAAkB,CAAA;AAAA,MAC1B,OAAA,CAAQ,WAAW,GAAA,CAAI,CAAA,QAAA,oCACrBC,gBAAA,EAAA,EAA+B,QAAA,EAAA,EAAb,QAAA,CAAS,EAAwB,CACrD;AAAA,KAAA,EAAA,EAJO,OAAA,CAAQ,EAKlB,CACD,CAAA,EACH,CAAA;AAAA,oBACAJ,cAAA,CAACK,qBAAA,EAAA,EAAkB,OAAA,EAAS,IAAA,CAAK,WAAW,WAAA,EAAa,CAAA;AAAA,oBACzDL,cAAA,CAACM,YAAA,EAAA,EAAS,IAAA,EAAY,WAAA,EAAY,mCAAA,EAAoC;AAAA,GAAA,EACxE,CAAA;AAEJ;AAEO,SAAS,iBAAiB,OAAA,EAAqC;AACpE,EAAA,MAAM,OAAA,GAAU,oBAAoB,OAAO,CAAA;AAC3C,EAAA,OAAO,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAA,CAAQ,KAAA,GAAQ,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,MAAA,EAAS,QAAQ,IAAI,CAAA,CAAA;AAC3G;AChDA,SAAS,YAAA,GAAe;AACtB,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,GAAA,EAAK;AAAA,OACP;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,qBAAA,EAAuB,QAAA;AAAA,QACvB,kBAAA,EAAoB,QAAA;AAAA,QACpB,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA;AACf,KACF,EAAG,MAAM,CAAC,CAAA;AAAA,IACV,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAAA,IAqBhB,cAAA,EAAgB;AAAA,GAClB;AACF;AAEA,SAAS,UAAA,GAAa;AACpB,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,GAAA,EAAK;AAAA,OACP;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,gBAAA,EAAkB,QAAA;AAAA,QAClB,KAAA,EAAO;AAAA;AACT,KACF,EAAG,MAAM,CAAC,CAAA;AAAA,IACV,eAAA,EAAiB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,GA4BnB;AACF;AAEA,eAAsB,oBAAoB,OAAA,EAA6B;AACrE,EAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,KAAa,KAAA,GAAQ,UAAA,KAAe,YAAA,EAAa;AACvE,EAAA,MAAMC,eAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAElD,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,OAAO,CAAC,YAAA,EAAc,OAAO,CAAA,KAAM;AAC3D,MAAA,MAAM,YAAA,GAAeC,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAW,YAAY,CAAA;AAC9D,MAAA,MAAMD,cAAA,CAAMC,sBAAK,OAAA,CAAQ,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3D,MAAA,MAAMC,kBAAA,CAAU,YAAA,EAAc,OAAA,EAAS,MAAM,CAAA;AAAA,IAC/C,CAAC;AAAA,GACH;AACF;;;ACpGO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,OAAA,GAAU,IAAIC,iBAAA,EAAQ;AAE5B,EAAA,OAAA,CACG,IAAA,CAAK,WAAW,CAAA,CAChB,WAAA,CAAY,yDAAyD,CAAA;AAExE,EAAA,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,gCAAgC,CAAA,CAC5C,MAAA,CAAO,uBAAA,EAAyB,iBAAA,EAAmB,MAAM,CAAA,CACzD,MAAA,CAAO,iBAAA,EAAmB,YAAY,EACtC,MAAA,CAAO,iBAAA,EAAmB,mCAAmC,CAAA,CAC7D,MAAA,CAAO,kBAAA,EAAoB,4BAA4B,CAAA,CACvD,OAAO,mBAAA,EAAqB,eAAe,CAAA,CAC3C,MAAA,CAAO,mBAAmB,4BAAA,EAA8B,yBAAyB,CAAA,CACjF,MAAA,CAAO,CAAC,OAAA,KAAY;AACnB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,gBAAA,CAAiB,OAAO,CAAC;AAAA,CAAI,CAAA;AACrD,IAAAC,YAAA,CAAOC,uBAAAA,CAAM,cAAc,OAAA,EAAS;AAAA,MAClC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAC,CAAA;AAAA,EACJ,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,6BAA6B,CAAA,CACzC,OAAO,uBAAA,EAAyB,8BAAA,EAAgC,OAAO,CAAA,CACvE,OAAO,mBAAA,EAAqB,kBAAA,EAAoB,mBAAmB,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,mBAAA,CAAoB;AAAA,MACxB,QAAA,EAAU,OAAA,CAAQ,QAAA,KAAa,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAAA,MAC/C,WAAWJ,qBAAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,QAAQ,GAAG;AAAA,KACnD,CAAA;AACD,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,QAAQ,CAAA,YAAA,EAAe,QAAQ,GAAG;AAAA,CAAI,CAAA;AAAA,EAChF,CAAC,CAAA;AAEH,EAAA,OAAO,OAAA;AACT","file":"index.cjs","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 envKey: 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 envKey: 'OPENAI_API_KEY',\n defaultModel: 'gpt-4o-mini',\n factory: (c) => openai(c),\n },\n anthropic: {\n label: 'Anthropic',\n envKey: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-3-5-sonnet-latest',\n factory: (c) => anthropic(c),\n },\n gemini: {\n label: 'Gemini',\n envKey: 'GEMINI_API_KEY',\n defaultModel: 'gemini-2.5-flash',\n factory: (c) => gemini(c),\n },\n ollama: {\n label: 'Ollama',\n envKey: '',\n defaultModel: 'llama3.1',\n factory: (c) => ollama({ model: c.model, baseUrl: c.baseUrl }),\n },\n deepseek: {\n label: 'DeepSeek',\n envKey: 'DEEPSEEK_API_KEY',\n defaultModel: 'deepseek-chat',\n factory: (c) => deepseek(c),\n },\n grok: {\n label: 'xAI Grok',\n envKey: 'XAI_API_KEY',\n requiresModel: true,\n factory: (c) => grok(c),\n },\n kimi: {\n label: 'Kimi',\n envKey: 'KIMI_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\n let apiKey = options.apiKey ?? (entry.envKey ? process.env[entry.envKey] : undefined)\n if (name === 'kimi' && !apiKey) {\n apiKey = process.env.MOONSHOT_API_KEY\n }\n if (!apiKey && entry.envKey) {\n throw new Error(`${entry.label} requires an API key. Pass --api-key or set ${entry.envKey}.`)\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 React, { useMemo } from 'react'\nimport { Box, Text } from 'ink'\nimport { createFileMemory } from '@agentskit/core'\nimport { ChatContainer, InputBar, Message, ThinkingIndicator, ToolCallView, useChat } from '@agentskit/ink'\nimport { resolveChatProvider } from './providers'\n\nexport interface ChatCommandOptions {\n provider: string\n model?: string\n system?: string\n memoryPath?: string\n apiKey?: string\n baseUrl?: string\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 () => createFileMemory(options.memoryPath ?? '.agentskit-history.json'),\n [options.memoryPath]\n )\n\n const chat = useChat({\n adapter,\n memory,\n systemPrompt: options.system,\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 return `provider=${runtime.provider}${runtime.model ? ` model=${runtime.model}` : ''} mode=${runtime.mode}`\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 React from 'react'\nimport { render } from 'ink'\nimport { Command } from 'commander'\nimport path from 'node:path'\nimport { ChatApp, renderChatHeader } from './chat'\nimport { writeStarterProject } from './init'\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 .action((options) => {\n process.stdout.write(`${renderChatHeader(options)}\\n`)\n render(React.createElement(ChatApp, {\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n provider: options.provider,\n model: options.model,\n system: options.system,\n memoryPath: options.memory,\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"]}
|
|
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":["openai","anthropic","gemini","ollama","deepseek","grok","kimi","researcher","coder","planner","critic","summarizer","tools","webSearch","filesystem","shell","composeSkills","sqliteChatMemory","createFileMemory","useMemo","useChat","jsxs","Box","jsx","Text","ChatContainer","Message","ToolCallView","ThinkingIndicator","InputBar","mkdir","path","writeFile","runtime","createRuntime","useState","useEffect","Command","loadConfig","render","React"],"mappings":"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","file":"index.cjs","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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
-
import { AdapterFactory } from '@agentskit/core';
|
|
3
|
+
import { AgentsKitConfig, AdapterFactory } from '@agentskit/core';
|
|
4
4
|
|
|
5
5
|
declare function createCli(): Command;
|
|
6
6
|
|
|
@@ -11,6 +11,10 @@ interface ChatCommandOptions {
|
|
|
11
11
|
memoryPath?: string;
|
|
12
12
|
apiKey?: string;
|
|
13
13
|
baseUrl?: string;
|
|
14
|
+
tools?: string;
|
|
15
|
+
skill?: string;
|
|
16
|
+
memoryBackend?: string;
|
|
17
|
+
agentsKitConfig?: AgentsKitConfig;
|
|
14
18
|
}
|
|
15
19
|
declare function ChatApp(options: ChatCommandOptions): react_jsx_runtime.JSX.Element;
|
|
16
20
|
declare function renderChatHeader(options: ChatCommandOptions): string;
|
|
@@ -37,4 +41,22 @@ interface ResolvedChatProvider {
|
|
|
37
41
|
}
|
|
38
42
|
declare function resolveChatProvider(options: ChatProviderOptions): ResolvedChatProvider;
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
interface RunCommandOptions {
|
|
45
|
+
provider: string;
|
|
46
|
+
model?: string;
|
|
47
|
+
apiKey?: string;
|
|
48
|
+
baseUrl?: string;
|
|
49
|
+
task?: string;
|
|
50
|
+
skill?: string;
|
|
51
|
+
skills?: string;
|
|
52
|
+
tools?: string;
|
|
53
|
+
memory?: string;
|
|
54
|
+
memoryBackend?: string;
|
|
55
|
+
systemPrompt?: string;
|
|
56
|
+
maxSteps?: string;
|
|
57
|
+
verbose?: boolean;
|
|
58
|
+
pretty?: boolean;
|
|
59
|
+
}
|
|
60
|
+
declare function runAgent(task: string, options: RunCommandOptions): Promise<void>;
|
|
61
|
+
|
|
62
|
+
export { ChatApp, type ChatCommandOptions, type ChatProviderOptions, type InitCommandOptions, type ResolvedChatProvider, type RunCommandOptions, type StarterKind, createCli, renderChatHeader, resolveChatProvider, runAgent, writeStarterProject };
|