@agentskit/cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,9 +1,57 @@
1
1
  import { Command } from 'commander';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import { AdapterFactory } from '@agentskit/core';
4
+ import { ChildProcess } from 'node:child_process';
4
5
 
5
6
  declare function createCli(): Command;
6
7
 
8
+ interface AgentsKitConfig {
9
+ tools?: {
10
+ filesystem?: {
11
+ basePath?: string;
12
+ };
13
+ shell?: {
14
+ allowed?: string[];
15
+ timeout?: number;
16
+ maxOutput?: number;
17
+ };
18
+ webSearch?: {
19
+ provider?: string;
20
+ maxResults?: number;
21
+ };
22
+ };
23
+ defaults?: {
24
+ provider?: string;
25
+ model?: string;
26
+ };
27
+ runtime?: {
28
+ maxSteps?: number;
29
+ maxDelegationDepth?: number;
30
+ };
31
+ observability?: {
32
+ console?: boolean | {
33
+ format?: 'human' | 'json';
34
+ };
35
+ langsmith?: {
36
+ projectName?: string;
37
+ };
38
+ };
39
+ }
40
+ interface LoadConfigOptions {
41
+ cwd?: string;
42
+ }
43
+ /**
44
+ * Load an AgentsKit config file. Node-only — uses fs/promises.
45
+ *
46
+ * Tries in order:
47
+ * 1. `.agentskit.config.ts` (imported as a module)
48
+ * 2. `.agentskit.config.json`
49
+ * 3. `"agentskit"` field in `package.json`
50
+ *
51
+ * Returns `undefined` if none found.
52
+ */
53
+ declare function loadConfig(options?: LoadConfigOptions): Promise<AgentsKitConfig | undefined>;
54
+
7
55
  interface ChatCommandOptions {
8
56
  provider: string;
9
57
  model?: string;
@@ -11,14 +59,26 @@ interface ChatCommandOptions {
11
59
  memoryPath?: string;
12
60
  apiKey?: string;
13
61
  baseUrl?: string;
62
+ tools?: string;
63
+ skill?: string;
64
+ memoryBackend?: string;
65
+ agentsKitConfig?: AgentsKitConfig;
14
66
  }
15
67
  declare function ChatApp(options: ChatCommandOptions): react_jsx_runtime.JSX.Element;
16
68
  declare function renderChatHeader(options: ChatCommandOptions): string;
17
69
 
18
- type StarterKind = 'react' | 'ink';
70
+ type StarterKind = 'react' | 'ink' | 'runtime' | 'multi-agent';
71
+ type Provider = 'openai' | 'anthropic' | 'gemini' | 'ollama' | 'demo';
72
+ type ToolKind = 'web_search' | 'filesystem' | 'shell';
73
+ type MemoryKind = 'none' | 'file' | 'sqlite';
74
+ type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
19
75
  interface InitCommandOptions {
20
76
  targetDir: string;
21
77
  template: StarterKind;
78
+ provider?: Provider;
79
+ tools?: ToolKind[];
80
+ memory?: MemoryKind;
81
+ packageManager?: PackageManager;
22
82
  }
23
83
  declare function writeStarterProject(options: InitCommandOptions): Promise<void>;
24
84
 
@@ -37,4 +97,138 @@ interface ResolvedChatProvider {
37
97
  }
38
98
  declare function resolveChatProvider(options: ChatProviderOptions): ResolvedChatProvider;
39
99
 
40
- export { ChatApp, type ChatCommandOptions, type ChatProviderOptions, type InitCommandOptions, type ResolvedChatProvider, type StarterKind, createCli, renderChatHeader, resolveChatProvider, writeStarterProject };
100
+ interface RunCommandOptions {
101
+ provider: string;
102
+ model?: string;
103
+ apiKey?: string;
104
+ baseUrl?: string;
105
+ task?: string;
106
+ skill?: string;
107
+ skills?: string;
108
+ tools?: string;
109
+ memory?: string;
110
+ memoryBackend?: string;
111
+ systemPrompt?: string;
112
+ maxSteps?: string;
113
+ verbose?: boolean;
114
+ pretty?: boolean;
115
+ }
116
+ declare function runAgent(task: string, options: RunCommandOptions): Promise<void>;
117
+
118
+ type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip';
119
+ interface CheckResult {
120
+ status: CheckStatus;
121
+ name: string;
122
+ detail?: string;
123
+ fix?: string;
124
+ }
125
+ interface DoctorReport {
126
+ results: CheckResult[];
127
+ pass: number;
128
+ warn: number;
129
+ fail: number;
130
+ skip: number;
131
+ }
132
+ interface DoctorOptions {
133
+ /** Provider names to check. Defaults to all known providers. */
134
+ providers?: string[];
135
+ /** Skip the network reachability checks. */
136
+ noNetwork?: boolean;
137
+ /** Custom fetch (for tests). */
138
+ fetchImpl?: typeof fetch;
139
+ }
140
+ declare function runDoctor(options?: DoctorOptions): Promise<DoctorReport>;
141
+ declare function renderReport(report: DoctorReport, opts?: {
142
+ color?: boolean;
143
+ }): string;
144
+
145
+ interface DevOptions {
146
+ /** Entry file to run (relative or absolute). */
147
+ entry: string;
148
+ /** Globs to watch for changes. Defaults to common project files. */
149
+ watch?: string[];
150
+ /** Globs to ignore. */
151
+ ignore?: string[];
152
+ /** Args to pass through to the entry script. */
153
+ scriptArgs?: string[];
154
+ /** Debounce ms before restart after a change. */
155
+ debounceMs?: number;
156
+ /**
157
+ * Spawner override for tests. Defaults to spawning `tsx` (or `node` for
158
+ * .js entries) as a child process.
159
+ */
160
+ spawn?: (cmd: string, args: string[]) => ChildProcess;
161
+ /** Watch override for tests. Defaults to chokidar. */
162
+ watcher?: (paths: string[], opts: {
163
+ ignored?: string[];
164
+ }) => DevWatcher;
165
+ /** Stdout sink for tests. */
166
+ stdout?: NodeJS.WritableStream;
167
+ /** Stderr sink for tests. */
168
+ stderr?: NodeJS.WritableStream;
169
+ }
170
+ interface DevWatcher {
171
+ on(event: 'change' | 'add' | 'unlink', listener: (path: string) => void): this;
172
+ close(): Promise<void>;
173
+ }
174
+ /**
175
+ * Run an entry file via tsx, restart it on relevant file changes.
176
+ * Resolves when stop() is called or the watcher closes.
177
+ *
178
+ * Returns a controller so callers (and tests) can stop the loop and
179
+ * inspect activity counters.
180
+ */
181
+ interface DevController {
182
+ /** Promise that resolves when the dev session ends. */
183
+ done: Promise<void>;
184
+ /** Stop the dev loop and clean up. */
185
+ stop: () => Promise<void>;
186
+ /** Number of times the entry has been (re)started. */
187
+ restarts: () => number;
188
+ }
189
+ declare function startDev(options: DevOptions): DevController;
190
+
191
+ interface TunnelOptions {
192
+ /** Local port to expose. Required. */
193
+ port: number;
194
+ /** Optional subdomain hint (best-effort — provider may decline). */
195
+ subdomain?: string;
196
+ /** Local hostname (default: 'localhost'). */
197
+ host?: string;
198
+ /** Tunnel factory override for tests. Defaults to `localtunnel`. */
199
+ open?: (opts: {
200
+ port: number;
201
+ subdomain?: string;
202
+ local_host?: string;
203
+ }) => Promise<TunnelLike>;
204
+ /** Stdout/stderr sinks for tests. */
205
+ stdout?: NodeJS.WritableStream;
206
+ /** Called once the tunnel URL is known. */
207
+ onReady?: (url: string) => void;
208
+ }
209
+ interface TunnelLike {
210
+ url: string;
211
+ on(event: 'request' | 'error' | 'close', listener: (...args: unknown[]) => void): unknown;
212
+ close(): void;
213
+ }
214
+ interface TunnelController {
215
+ /** The public URL once ready. */
216
+ url: string;
217
+ /** Resolves when the tunnel closes (or stop() is called). */
218
+ done: Promise<void>;
219
+ /** Stop the tunnel and resolve done. */
220
+ stop: () => Promise<void>;
221
+ /** Number of requests proxied so far. */
222
+ requests: () => number;
223
+ }
224
+ /**
225
+ * Open a public tunnel to a local port.
226
+ *
227
+ * Uses `localtunnel` by default — no account required, free, URL is
228
+ * something like `https://word-word-12345.loca.lt`. First-time visitors
229
+ * may see a `loca.lt` interstitial click-through; that's a known
230
+ * provider quirk, not an AgentsKit issue.
231
+ */
232
+ declare function startTunnel(options: TunnelOptions): Promise<TunnelController>;
233
+
234
+ export { type AgentsKitConfig, ChatApp, type ChatCommandOptions, type ChatProviderOptions, type CheckResult, type CheckStatus, type DevController, type DevOptions, type DevWatcher, type DoctorOptions, type DoctorReport, type InitCommandOptions, type LoadConfigOptions, type ResolvedChatProvider, type RunCommandOptions, type StarterKind, type TunnelController, type TunnelLike, type TunnelOptions, createCli, loadConfig, renderChatHeader, renderReport, resolveChatProvider, runAgent, runDoctor, startDev, startTunnel, writeStarterProject };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export { ChatApp, createCli, renderChatHeader, resolveChatProvider, writeStarterProject } from './chunk-LVWMW6SW.js';
2
+ export { ChatApp, createCli, loadConfig, renderChatHeader, renderReport, resolveChatProvider, runAgent, runDoctor, startDev, startTunnel, writeStarterProject } from './chunk-YHCQHIPX.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@agentskit/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "CLI for AgentsKit chat and project scaffolding.",
5
+ "keywords": [
6
+ "agentskit",
7
+ "ai",
8
+ "agents",
9
+ "llm",
10
+ "chat",
11
+ "typescript",
12
+ "cli",
13
+ "command-line",
14
+ "scaffolding"
15
+ ],
5
16
  "type": "module",
6
17
  "main": "./dist/index.cjs",
7
18
  "module": "./dist/index.js",
@@ -20,26 +31,40 @@
20
31
  "dist"
21
32
  ],
22
33
  "dependencies": {
34
+ "@inquirer/prompts": "^8.4.1",
35
+ "chokidar": "^5.0.0",
23
36
  "commander": "^14.0.1",
24
- "ink": "^5.1.1",
25
- "react": "^18.3.1",
26
- "@agentskit/core": "0.4.0",
27
- "@agentskit/adapters": "0.4.0",
28
- "@agentskit/ink": "0.4.0"
37
+ "ink": "^7.0.0",
38
+ "kleur": "^4.1.5",
39
+ "localtunnel": "^2.0.2",
40
+ "react": "^19.2.5",
41
+ "@agentskit/ink": "0.5.0",
42
+ "@agentskit/tools": "0.4.3",
43
+ "@agentskit/core": "1.0.0",
44
+ "@agentskit/memory": "0.5.0",
45
+ "@agentskit/runtime": "0.4.3",
46
+ "@agentskit/adapters": "0.5.0",
47
+ "@agentskit/skills": "0.4.3"
29
48
  },
30
49
  "devDependencies": {
31
- "@types/node": "^24.0.0",
32
- "@types/react": "^18.3.0",
50
+ "@types/localtunnel": "^2.0.4",
51
+ "@types/node": "^25.6.0",
52
+ "@types/react": "^19.2.14",
33
53
  "tsup": "^8.5.0",
34
- "typescript": "^5.9.2",
35
- "vitest": "^4.1.2"
54
+ "typescript": "^6.0.2",
55
+ "vitest": "^4.1.4"
36
56
  },
37
57
  "publishConfig": {
38
58
  "access": "public"
39
59
  },
60
+ "agentskit": {
61
+ "stability": "stable",
62
+ "stabilityNote": "chat, init, run commands stable."
63
+ },
40
64
  "scripts": {
41
65
  "build": "tsup",
42
66
  "test": "vitest run",
67
+ "test:coverage": "vitest run --coverage",
43
68
  "lint": "tsc --noEmit",
44
69
  "dev": "tsup --watch"
45
70
  }
@@ -1,270 +0,0 @@
1
- #!/usr/bin/env node
2
- import { kimi, grok, deepseek, ollama, gemini, anthropic, openai } from '@agentskit/adapters';
3
- import React2, { useMemo } from 'react';
4
- import { Box, Text, render } from 'ink';
5
- import { createFileMemory } from '@agentskit/core';
6
- import { useChat, ChatContainer, Message, ToolCallView, ThinkingIndicator, InputBar } from '@agentskit/ink';
7
- import { jsxs, jsx } from 'react/jsx-runtime';
8
- import { mkdir, writeFile } from 'fs/promises';
9
- import path from 'path';
10
- import { Command } from 'commander';
11
-
12
- var providers = {
13
- openai: {
14
- label: "OpenAI",
15
- envKey: "OPENAI_API_KEY",
16
- defaultModel: "gpt-4o-mini",
17
- factory: (c) => openai(c)
18
- },
19
- anthropic: {
20
- label: "Anthropic",
21
- envKey: "ANTHROPIC_API_KEY",
22
- defaultModel: "claude-3-5-sonnet-latest",
23
- factory: (c) => anthropic(c)
24
- },
25
- gemini: {
26
- label: "Gemini",
27
- envKey: "GEMINI_API_KEY",
28
- defaultModel: "gemini-2.5-flash",
29
- factory: (c) => gemini(c)
30
- },
31
- ollama: {
32
- label: "Ollama",
33
- envKey: "",
34
- defaultModel: "llama3.1",
35
- factory: (c) => ollama({ model: c.model, baseUrl: c.baseUrl })
36
- },
37
- deepseek: {
38
- label: "DeepSeek",
39
- envKey: "DEEPSEEK_API_KEY",
40
- defaultModel: "deepseek-chat",
41
- factory: (c) => deepseek(c)
42
- },
43
- grok: {
44
- label: "xAI Grok",
45
- envKey: "XAI_API_KEY",
46
- requiresModel: true,
47
- factory: (c) => grok(c)
48
- },
49
- kimi: {
50
- label: "Kimi",
51
- envKey: "KIMI_API_KEY",
52
- requiresModel: true,
53
- factory: (c) => kimi(c)
54
- }
55
- };
56
- function createDemoAdapter(provider, model) {
57
- return {
58
- createSource: ({ messages }) => {
59
- let cancelled = false;
60
- return {
61
- stream: async function* () {
62
- const userMessages = messages.filter((message) => message.role === "user");
63
- const lastMessage = userMessages[userMessages.length - 1];
64
- const reply = [
65
- `Provider: ${provider}${model ? ` (${model})` : ""}.`,
66
- "This is the AgentsKit CLI demo adapter.",
67
- `You said: ${lastMessage?.content ?? ""}`
68
- ].join(" ");
69
- for (const chunk of reply.match(/.{1,18}/g) ?? []) {
70
- if (cancelled) return;
71
- await new Promise((resolve) => setTimeout(resolve, 35));
72
- yield { type: "text", content: chunk };
73
- }
74
- yield { type: "done" };
75
- },
76
- abort: () => {
77
- cancelled = true;
78
- }
79
- };
80
- }
81
- };
82
- }
83
- function resolveChatProvider(options) {
84
- const name = options.provider.toLowerCase();
85
- if (name === "demo") {
86
- return {
87
- adapter: createDemoAdapter(name, options.model),
88
- provider: name,
89
- model: options.model,
90
- mode: "demo",
91
- summary: "demo adapter (no network, no API key required)"
92
- };
93
- }
94
- const entry = providers[name];
95
- if (!entry) {
96
- const supported = ["demo", ...Object.keys(providers)].join(", ");
97
- throw new Error(`Unsupported provider "${options.provider}". Try ${supported}.`);
98
- }
99
- let apiKey = options.apiKey ?? (entry.envKey ? process.env[entry.envKey] : void 0);
100
- if (name === "kimi" && !apiKey) {
101
- apiKey = process.env.MOONSHOT_API_KEY;
102
- }
103
- if (!apiKey && entry.envKey) {
104
- throw new Error(`${entry.label} requires an API key. Pass --api-key or set ${entry.envKey}.`);
105
- }
106
- const model = options.model ?? entry.defaultModel;
107
- if (!model) {
108
- throw new Error(`${entry.label} requires --model in the current CLI version.`);
109
- }
110
- return {
111
- adapter: entry.factory({ apiKey: apiKey ?? "", model, baseUrl: options.baseUrl }),
112
- provider: name,
113
- model,
114
- mode: "live",
115
- summary: `${entry.label} live adapter`
116
- };
117
- }
118
- function ChatApp(options) {
119
- const adapter = useMemo(
120
- () => resolveChatProvider(options).adapter,
121
- [options.apiKey, options.baseUrl, options.model, options.provider]
122
- );
123
- const memory = useMemo(
124
- () => createFileMemory(options.memoryPath ?? ".agentskit-history.json"),
125
- [options.memoryPath]
126
- );
127
- const chat = useChat({
128
- adapter,
129
- memory,
130
- systemPrompt: options.system
131
- });
132
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
133
- /* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "AgentsKit CLI" }),
134
- /* @__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." }),
135
- /* @__PURE__ */ jsx(ChatContainer, { children: chat.messages.map((message) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
136
- /* @__PURE__ */ jsx(Message, { message }),
137
- message.toolCalls?.map((toolCall) => /* @__PURE__ */ jsx(ToolCallView, { toolCall }, toolCall.id))
138
- ] }, message.id)) }),
139
- /* @__PURE__ */ jsx(ThinkingIndicator, { visible: chat.status === "streaming" }),
140
- /* @__PURE__ */ jsx(InputBar, { chat, placeholder: "Type a message and press Enter..." })
141
- ] });
142
- }
143
- function renderChatHeader(options) {
144
- const runtime = resolveChatProvider(options);
145
- return `provider=${runtime.provider}${runtime.model ? ` model=${runtime.model}` : ""} mode=${runtime.mode}`;
146
- }
147
- function reactStarter() {
148
- return {
149
- "package.json": JSON.stringify({
150
- name: "agentskit-react-app",
151
- private: true,
152
- type: "module",
153
- scripts: {
154
- dev: "vite"
155
- },
156
- dependencies: {
157
- "@agentskit/adapters": "^0.1.0",
158
- "@agentskit/react": "^0.1.0",
159
- react: "^18.3.1",
160
- "react-dom": "^18.3.1"
161
- }
162
- }, null, 2),
163
- "src/main.tsx": `import React from 'react'
164
- import ReactDOM from 'react-dom/client'
165
- import { ChatContainer, InputBar, Message, useChat } from '@agentskit/react'
166
- import { openai } from '@agentskit/adapters'
167
- import '@agentskit/react/theme'
168
-
169
- function App() {
170
- const chat = useChat({
171
- adapter: openai({ apiKey: import.meta.env.VITE_OPENAI_API_KEY ?? '', model: 'gpt-4o-mini' }),
172
- })
173
-
174
- return (
175
- <ChatContainer>
176
- {chat.messages.map(message => <Message key={message.id} message={message} />)}
177
- <InputBar chat={chat} />
178
- </ChatContainer>
179
- )
180
- }
181
-
182
- ReactDOM.createRoot(document.getElementById('root')!).render(<App />)
183
- `,
184
- ".env.example": "VITE_OPENAI_API_KEY=\n"
185
- };
186
- }
187
- function inkStarter() {
188
- return {
189
- "package.json": JSON.stringify({
190
- name: "agentskit-ink-app",
191
- private: true,
192
- type: "module",
193
- scripts: {
194
- dev: "tsx src/index.tsx"
195
- },
196
- dependencies: {
197
- "@agentskit/ink": "^0.1.0",
198
- react: "^18.3.1"
199
- }
200
- }, null, 2),
201
- "src/index.tsx": `import React from 'react'
202
- import { render } from 'ink'
203
- import { ChatContainer, InputBar, Message, useChat } from '@agentskit/ink'
204
-
205
- function DemoAdapter() {
206
- return {
207
- createSource: () => ({
208
- async *stream() {
209
- yield { type: 'text', content: 'Hello from AgentsKit Ink.' }
210
- yield { type: 'done' }
211
- },
212
- abort() {},
213
- }),
214
- }
215
- }
216
-
217
- function App() {
218
- const chat = useChat({ adapter: DemoAdapter() })
219
- return (
220
- <ChatContainer>
221
- {chat.messages.map(message => <Message key={message.id} message={message} />)}
222
- <InputBar chat={chat} />
223
- </ChatContainer>
224
- )
225
- }
226
-
227
- render(<App />)
228
- `
229
- };
230
- }
231
- async function writeStarterProject(options) {
232
- const files = options.template === "ink" ? inkStarter() : reactStarter();
233
- await mkdir(options.targetDir, { recursive: true });
234
- await Promise.all(
235
- Object.entries(files).map(async ([relativePath, content]) => {
236
- const absolutePath = path.join(options.targetDir, relativePath);
237
- await mkdir(path.dirname(absolutePath), { recursive: true });
238
- await writeFile(absolutePath, content, "utf8");
239
- })
240
- );
241
- }
242
- function createCli() {
243
- const program = new Command();
244
- program.name("agentskit").description("AgentsKit CLI for chat demos and project bootstrapping.");
245
- 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) => {
246
- process.stdout.write(`${renderChatHeader(options)}
247
- `);
248
- render(React2.createElement(ChatApp, {
249
- apiKey: options.apiKey,
250
- baseUrl: options.baseUrl,
251
- provider: options.provider,
252
- model: options.model,
253
- system: options.system,
254
- memoryPath: options.memory
255
- }));
256
- });
257
- 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) => {
258
- await writeStarterProject({
259
- template: options.template === "ink" ? "ink" : "react",
260
- targetDir: path.resolve(process.cwd(), options.dir)
261
- });
262
- process.stdout.write(`Created ${options.template} starter in ${options.dir}
263
- `);
264
- });
265
- return program;
266
- }
267
-
268
- export { ChatApp, createCli, renderChatHeader, resolveChatProvider, writeStarterProject };
269
- //# sourceMappingURL=chunk-LVWMW6SW.js.map
270
- //# sourceMappingURL=chunk-LVWMW6SW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers.ts","../src/chat.tsx","../src/init.ts","../src/commands.ts"],"names":["React","path"],"mappings":"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","file":"chunk-LVWMW6SW.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 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"]}