@reactive-agents/cli 0.1.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/LICENSE +21 -0
- package/README.md +61 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +470 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tyler Buell
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# @reactive-agents/cli — `rax`
|
|
2
|
+
|
|
3
|
+
**The Reactive Agents eXecutable** — CLI for scaffolding, running, and inspecting AI agents.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Global install
|
|
9
|
+
bun add -g @reactive-agents/cli
|
|
10
|
+
|
|
11
|
+
# Or run without installing
|
|
12
|
+
bunx @reactive-agents/cli --help
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
rax init <name> [--template minimal|standard|full]
|
|
19
|
+
Scaffold a new Reactive Agents project
|
|
20
|
+
|
|
21
|
+
rax create agent <name> [--recipe basic|researcher|coder|orchestrator]
|
|
22
|
+
Generate an agent file in your project
|
|
23
|
+
|
|
24
|
+
rax run <prompt> [--provider anthropic|openai|ollama] [--model <model>] [--name <name>]
|
|
25
|
+
Run an agent with a prompt and print the result
|
|
26
|
+
|
|
27
|
+
rax dev
|
|
28
|
+
Start a development server with hot reload
|
|
29
|
+
|
|
30
|
+
rax eval run --suite <name>
|
|
31
|
+
Run an evaluation suite
|
|
32
|
+
|
|
33
|
+
rax playground
|
|
34
|
+
Launch an interactive REPL
|
|
35
|
+
|
|
36
|
+
rax inspect <agent-id> [--trace last]
|
|
37
|
+
Inspect agent state and execution traces
|
|
38
|
+
|
|
39
|
+
rax version
|
|
40
|
+
Print version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Scaffold a new project with all features
|
|
47
|
+
rax init my-ai-app --template full
|
|
48
|
+
cd my-ai-app
|
|
49
|
+
bun install
|
|
50
|
+
|
|
51
|
+
# Generate a research agent
|
|
52
|
+
rax create agent researcher --recipe researcher
|
|
53
|
+
|
|
54
|
+
# Run a one-off prompt
|
|
55
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
56
|
+
rax run "Summarize the state of fusion energy" --provider anthropic
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Documentation
|
|
60
|
+
|
|
61
|
+
Full documentation at [tylerjrbuell.github.io/reactive-agents-ts/reference/cli/](https://tylerjrbuell.github.io/reactive-agents-ts/reference/cli/)
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
|
|
4
|
+
// src/commands/init.ts
|
|
5
|
+
import { join as join2 } from "path";
|
|
6
|
+
|
|
7
|
+
// src/generators/project-generator.ts
|
|
8
|
+
import { mkdirSync, writeFileSync, existsSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
var TEMPLATE_DEPS = {
|
|
11
|
+
minimal: ["@reactive-agents/core", "@reactive-agents/llm-provider", "@reactive-agents/runtime"],
|
|
12
|
+
standard: [
|
|
13
|
+
"@reactive-agents/core",
|
|
14
|
+
"@reactive-agents/llm-provider",
|
|
15
|
+
"@reactive-agents/memory",
|
|
16
|
+
"@reactive-agents/reasoning",
|
|
17
|
+
"@reactive-agents/tools",
|
|
18
|
+
"@reactive-agents/runtime"
|
|
19
|
+
],
|
|
20
|
+
full: [
|
|
21
|
+
"@reactive-agents/core",
|
|
22
|
+
"@reactive-agents/llm-provider",
|
|
23
|
+
"@reactive-agents/memory",
|
|
24
|
+
"@reactive-agents/reasoning",
|
|
25
|
+
"@reactive-agents/tools",
|
|
26
|
+
"@reactive-agents/verification",
|
|
27
|
+
"@reactive-agents/cost",
|
|
28
|
+
"@reactive-agents/identity",
|
|
29
|
+
"@reactive-agents/orchestration",
|
|
30
|
+
"@reactive-agents/observability",
|
|
31
|
+
"@reactive-agents/interaction",
|
|
32
|
+
"@reactive-agents/guardrails",
|
|
33
|
+
"@reactive-agents/prompts",
|
|
34
|
+
"@reactive-agents/runtime"
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
function generateProject(config) {
|
|
38
|
+
const { name, template, targetDir } = config;
|
|
39
|
+
const files = [];
|
|
40
|
+
const dirs = [targetDir, join(targetDir, "src"), join(targetDir, "src", "agents")];
|
|
41
|
+
for (const dir of dirs) {
|
|
42
|
+
if (!existsSync(dir)) {
|
|
43
|
+
mkdirSync(dir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const deps = Object.fromEntries(TEMPLATE_DEPS[template].map((d) => [d, "latest"]));
|
|
47
|
+
const packageJson = {
|
|
48
|
+
name,
|
|
49
|
+
version: "0.1.0",
|
|
50
|
+
type: "module",
|
|
51
|
+
scripts: {
|
|
52
|
+
dev: "bun run src/index.ts",
|
|
53
|
+
build: "tsc --noEmit",
|
|
54
|
+
test: "bun test"
|
|
55
|
+
},
|
|
56
|
+
dependencies: {
|
|
57
|
+
effect: "^3.10.0",
|
|
58
|
+
...deps
|
|
59
|
+
},
|
|
60
|
+
devDependencies: {
|
|
61
|
+
typescript: "^5.7.0",
|
|
62
|
+
"bun-types": "latest"
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const pkgPath = join(targetDir, "package.json");
|
|
66
|
+
writeFileSync(pkgPath, JSON.stringify(packageJson, null, 2) + "\n");
|
|
67
|
+
files.push(pkgPath);
|
|
68
|
+
const tsconfig = {
|
|
69
|
+
compilerOptions: {
|
|
70
|
+
target: "ES2022",
|
|
71
|
+
module: "ES2022",
|
|
72
|
+
moduleResolution: "bundler",
|
|
73
|
+
strict: true,
|
|
74
|
+
esModuleInterop: true,
|
|
75
|
+
skipLibCheck: true,
|
|
76
|
+
outDir: "dist",
|
|
77
|
+
types: ["bun-types"]
|
|
78
|
+
},
|
|
79
|
+
include: ["src/**/*"]
|
|
80
|
+
};
|
|
81
|
+
const tscPath = join(targetDir, "tsconfig.json");
|
|
82
|
+
writeFileSync(tscPath, JSON.stringify(tsconfig, null, 2) + "\n");
|
|
83
|
+
files.push(tscPath);
|
|
84
|
+
const agentCode = generateAgentExample(template);
|
|
85
|
+
const agentPath = join(targetDir, "src", "agents", "my-agent.ts");
|
|
86
|
+
writeFileSync(agentPath, agentCode);
|
|
87
|
+
files.push(agentPath);
|
|
88
|
+
const entryCode = `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
89
|
+
|
|
90
|
+
const agent = await ReactiveAgents.create()
|
|
91
|
+
.withProvider("anthropic")
|
|
92
|
+
.withName("my-agent")
|
|
93
|
+
.build();
|
|
94
|
+
|
|
95
|
+
const result = await agent.run("Hello, what can you help me with?");
|
|
96
|
+
console.log(result);
|
|
97
|
+
`;
|
|
98
|
+
const entryPath = join(targetDir, "src", "index.ts");
|
|
99
|
+
writeFileSync(entryPath, entryCode);
|
|
100
|
+
files.push(entryPath);
|
|
101
|
+
const envExample = `# LLM Provider
|
|
102
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
103
|
+
# OPENAI_API_KEY=sk-...
|
|
104
|
+
|
|
105
|
+
# Optional
|
|
106
|
+
LLM_DEFAULT_MODEL=claude-sonnet-4-20250514
|
|
107
|
+
`;
|
|
108
|
+
const envPath = join(targetDir, ".env.example");
|
|
109
|
+
writeFileSync(envPath, envExample);
|
|
110
|
+
files.push(envPath);
|
|
111
|
+
return { files };
|
|
112
|
+
}
|
|
113
|
+
function generateAgentExample(template) {
|
|
114
|
+
switch (template) {
|
|
115
|
+
case "minimal":
|
|
116
|
+
return `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
117
|
+
|
|
118
|
+
export const createMyAgent = () =>
|
|
119
|
+
ReactiveAgents.create()
|
|
120
|
+
.withProvider("anthropic")
|
|
121
|
+
.withName("my-agent")
|
|
122
|
+
.build();
|
|
123
|
+
`;
|
|
124
|
+
case "standard":
|
|
125
|
+
return `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
126
|
+
|
|
127
|
+
export const createMyAgent = () =>
|
|
128
|
+
ReactiveAgents.create()
|
|
129
|
+
.withProvider("anthropic")
|
|
130
|
+
.withName("my-agent")
|
|
131
|
+
.withMemory(true)
|
|
132
|
+
.withReasoning("reactive")
|
|
133
|
+
.build();
|
|
134
|
+
`;
|
|
135
|
+
case "full":
|
|
136
|
+
return `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
137
|
+
|
|
138
|
+
export const createMyAgent = () =>
|
|
139
|
+
ReactiveAgents.create()
|
|
140
|
+
.withProvider("anthropic")
|
|
141
|
+
.withName("my-agent")
|
|
142
|
+
.withMemory(true)
|
|
143
|
+
.withReasoning("reactive")
|
|
144
|
+
.withVerification(true)
|
|
145
|
+
.withGuardrails(true)
|
|
146
|
+
.build();
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/commands/init.ts
|
|
152
|
+
var VALID_TEMPLATES = ["minimal", "standard", "full"];
|
|
153
|
+
function runInit(args) {
|
|
154
|
+
const name = args[0];
|
|
155
|
+
if (!name) {
|
|
156
|
+
console.error("Usage: reactive-agents init <project-name> [--template minimal|standard|full]");
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
let template = "standard";
|
|
160
|
+
const templateIdx = args.indexOf("--template");
|
|
161
|
+
if (templateIdx !== -1 && args[templateIdx + 1]) {
|
|
162
|
+
const t = args[templateIdx + 1];
|
|
163
|
+
if (!VALID_TEMPLATES.includes(t)) {
|
|
164
|
+
console.error(`Invalid template: ${t}. Valid options: ${VALID_TEMPLATES.join(", ")}`);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
template = t;
|
|
168
|
+
}
|
|
169
|
+
const targetDir = join2(process.cwd(), name);
|
|
170
|
+
console.log(`Creating project "${name}" with template "${template}"...`);
|
|
171
|
+
const result = generateProject({ name, template, targetDir });
|
|
172
|
+
console.log(`Created ${result.files.length} files:`);
|
|
173
|
+
for (const file of result.files) {
|
|
174
|
+
console.log(` ${file}`);
|
|
175
|
+
}
|
|
176
|
+
console.log(`
|
|
177
|
+
Next steps:`);
|
|
178
|
+
console.log(` cd ${name}`);
|
|
179
|
+
console.log(` bun install`);
|
|
180
|
+
console.log(` cp .env.example .env # Add your API keys`);
|
|
181
|
+
console.log(` bun run dev`);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/generators/agent-generator.ts
|
|
185
|
+
import { writeFileSync as writeFileSync2, mkdirSync as mkdirSync2, existsSync as existsSync2 } from "fs";
|
|
186
|
+
import { join as join3, dirname } from "path";
|
|
187
|
+
var RECIPE_TEMPLATES = {
|
|
188
|
+
basic: (name) => `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
189
|
+
|
|
190
|
+
export const ${toCamelCase(name)} = () =>
|
|
191
|
+
ReactiveAgents.create()
|
|
192
|
+
.withProvider("anthropic")
|
|
193
|
+
.withName("${name}")
|
|
194
|
+
.build();
|
|
195
|
+
`,
|
|
196
|
+
researcher: (name) => `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
197
|
+
|
|
198
|
+
export const ${toCamelCase(name)} = () =>
|
|
199
|
+
ReactiveAgents.create()
|
|
200
|
+
.withProvider("anthropic")
|
|
201
|
+
.withName("${name}")
|
|
202
|
+
.withSystemPrompt("You are a research assistant. Gather information, synthesize findings, and provide well-sourced answers.")
|
|
203
|
+
.withMemory(true)
|
|
204
|
+
.withReasoning("reactive")
|
|
205
|
+
.build();
|
|
206
|
+
`,
|
|
207
|
+
coder: (name) => `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
208
|
+
|
|
209
|
+
export const ${toCamelCase(name)} = () =>
|
|
210
|
+
ReactiveAgents.create()
|
|
211
|
+
.withProvider("anthropic")
|
|
212
|
+
.withName("${name}")
|
|
213
|
+
.withSystemPrompt("You are a coding assistant. Write clean, well-tested code and explain your decisions.")
|
|
214
|
+
.withReasoning("reactive")
|
|
215
|
+
.build();
|
|
216
|
+
`,
|
|
217
|
+
orchestrator: (name) => `import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
218
|
+
|
|
219
|
+
export const ${toCamelCase(name)} = () =>
|
|
220
|
+
ReactiveAgents.create()
|
|
221
|
+
.withProvider("anthropic")
|
|
222
|
+
.withName("${name}")
|
|
223
|
+
.withSystemPrompt("You are an orchestrator agent. Decompose complex tasks and coordinate sub-agents.")
|
|
224
|
+
.withMemory(true)
|
|
225
|
+
.withReasoning("reactive")
|
|
226
|
+
.build();
|
|
227
|
+
`
|
|
228
|
+
};
|
|
229
|
+
function generateAgent(config) {
|
|
230
|
+
const { name, recipe, targetDir } = config;
|
|
231
|
+
const fileName = `${toKebabCase(name)}.ts`;
|
|
232
|
+
const filePath = join3(targetDir, "src", "agents", fileName);
|
|
233
|
+
const dir = dirname(filePath);
|
|
234
|
+
if (!existsSync2(dir)) {
|
|
235
|
+
mkdirSync2(dir, { recursive: true });
|
|
236
|
+
}
|
|
237
|
+
const template = RECIPE_TEMPLATES[recipe];
|
|
238
|
+
writeFileSync2(filePath, template(name));
|
|
239
|
+
return { filePath };
|
|
240
|
+
}
|
|
241
|
+
function toCamelCase(str) {
|
|
242
|
+
return str.replace(/[-_]+(.)/g, (_, c) => c.toUpperCase()).replace(/^(.)/, (_, c) => c.toLowerCase());
|
|
243
|
+
}
|
|
244
|
+
function toKebabCase(str) {
|
|
245
|
+
return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// src/commands/create-agent.ts
|
|
249
|
+
var VALID_RECIPES = ["basic", "researcher", "coder", "orchestrator"];
|
|
250
|
+
function runCreateAgent(args) {
|
|
251
|
+
const name = args[0];
|
|
252
|
+
if (!name) {
|
|
253
|
+
console.error("Usage: reactive-agents create agent <name> [--recipe basic|researcher|coder|orchestrator]");
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
let recipe = "basic";
|
|
257
|
+
const recipeIdx = args.indexOf("--recipe");
|
|
258
|
+
if (recipeIdx !== -1 && args[recipeIdx + 1]) {
|
|
259
|
+
const r = args[recipeIdx + 1];
|
|
260
|
+
if (!VALID_RECIPES.includes(r)) {
|
|
261
|
+
console.error(`Invalid recipe: ${r}. Valid options: ${VALID_RECIPES.join(", ")}`);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
recipe = r;
|
|
265
|
+
}
|
|
266
|
+
console.log(`Creating agent "${name}" with recipe "${recipe}"...`);
|
|
267
|
+
const result = generateAgent({
|
|
268
|
+
name,
|
|
269
|
+
recipe,
|
|
270
|
+
targetDir: process.cwd()
|
|
271
|
+
});
|
|
272
|
+
console.log(`Created: ${result.filePath}`);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// src/commands/dev.ts
|
|
276
|
+
function runDev(_args) {
|
|
277
|
+
console.log("Starting development server...");
|
|
278
|
+
console.log("Dev server is a placeholder \u2014 Tier 1 implementation.");
|
|
279
|
+
console.log("Use 'bun run src/index.ts' to run your agent directly.");
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// src/commands/eval.ts
|
|
283
|
+
function runEval(args) {
|
|
284
|
+
const subcommand = args[0];
|
|
285
|
+
if (subcommand !== "run") {
|
|
286
|
+
console.error("Usage: reactive-agents eval run --suite <suite-name>");
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
const suiteIdx = args.indexOf("--suite");
|
|
290
|
+
const suite = suiteIdx !== -1 ? args[suiteIdx + 1] : void 0;
|
|
291
|
+
if (!suite) {
|
|
292
|
+
console.error("Usage: reactive-agents eval run --suite <suite-name>");
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
console.log(`Running eval suite: ${suite}`);
|
|
296
|
+
console.log("Eval runner is a placeholder \u2014 Tier 1 implementation.");
|
|
297
|
+
console.log("When @reactive-agents/eval is built, this will run EvalService programmatically.");
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// src/commands/playground.ts
|
|
301
|
+
function runPlayground(_args) {
|
|
302
|
+
console.log("Interactive playground is a placeholder \u2014 Tier 1 implementation.");
|
|
303
|
+
console.log("When ready, this will launch an interactive REPL for agent conversations.");
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// src/commands/inspect.ts
|
|
307
|
+
function runInspect(args) {
|
|
308
|
+
const agentId = args[0];
|
|
309
|
+
if (!agentId) {
|
|
310
|
+
console.error("Usage: reactive-agents inspect <agent-id> [--trace last]");
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
console.log(`Inspecting agent: ${agentId}`);
|
|
314
|
+
console.log("Agent inspection is a placeholder \u2014 Tier 1 implementation.");
|
|
315
|
+
console.log("When @reactive-agents/observability is wired, this will show agent state, traces, and metrics.");
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// src/commands/run.ts
|
|
319
|
+
import { ReactiveAgents } from "@reactive-agents/runtime";
|
|
320
|
+
async function runAgent(args) {
|
|
321
|
+
const promptParts = [];
|
|
322
|
+
let provider = "anthropic";
|
|
323
|
+
let model;
|
|
324
|
+
let name = "cli-agent";
|
|
325
|
+
for (let i = 0; i < args.length; i++) {
|
|
326
|
+
const arg = args[i];
|
|
327
|
+
if (arg === "--provider" && args[i + 1]) {
|
|
328
|
+
provider = args[++i];
|
|
329
|
+
} else if (arg === "--model" && args[i + 1]) {
|
|
330
|
+
model = args[++i];
|
|
331
|
+
} else if (arg === "--name" && args[i + 1]) {
|
|
332
|
+
name = args[++i];
|
|
333
|
+
} else if (!arg.startsWith("--")) {
|
|
334
|
+
promptParts.push(arg);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const prompt = promptParts.join(" ");
|
|
338
|
+
if (!prompt) {
|
|
339
|
+
console.error("Usage: reactive-agents run <prompt> [--provider anthropic|openai|ollama|test] [--model <model>] [--name <name>]");
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
console.log(`Building agent "${name}" with provider: ${provider}...`);
|
|
343
|
+
const builder = ReactiveAgents.create().withName(name).withProvider(provider);
|
|
344
|
+
if (model) {
|
|
345
|
+
builder.withModel(model);
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
const agent = await builder.build();
|
|
349
|
+
console.log(`Agent ready: ${agent.agentId}`);
|
|
350
|
+
console.log(`Running: "${prompt}"
|
|
351
|
+
`);
|
|
352
|
+
const result = await agent.run(prompt);
|
|
353
|
+
if (result.success) {
|
|
354
|
+
console.log("\u2500\u2500\u2500 Output \u2500\u2500\u2500");
|
|
355
|
+
console.log(result.output || "(no output)");
|
|
356
|
+
console.log("\n\u2500\u2500\u2500 Metadata \u2500\u2500\u2500");
|
|
357
|
+
console.log(` Duration: ${result.metadata.duration}ms`);
|
|
358
|
+
console.log(` Steps: ${result.metadata.stepsCount}`);
|
|
359
|
+
console.log(` Cost: $${result.metadata.cost.toFixed(6)}`);
|
|
360
|
+
} else {
|
|
361
|
+
console.error("Agent execution failed.");
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
} catch (err) {
|
|
365
|
+
console.error("Error:", err instanceof Error ? err.message : String(err));
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// src/banner.ts
|
|
371
|
+
var PURPLE = "\x1B[38;5;99m";
|
|
372
|
+
var INDIGO = "\x1B[38;5;63m";
|
|
373
|
+
var VIOLET = "\x1B[38;5;135m";
|
|
374
|
+
var LAVENDER = "\x1B[38;5;183m";
|
|
375
|
+
var DIM = "\x1B[2m";
|
|
376
|
+
var RESET = "\x1B[0m";
|
|
377
|
+
var BOLD = "\x1B[1m";
|
|
378
|
+
var BANNER = `
|
|
379
|
+
${PURPLE} \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557${RESET}
|
|
380
|
+
${PURPLE} \u2551${RESET} ${PURPLE}\u2551${RESET}
|
|
381
|
+
${PURPLE} \u2551${RESET} ${INDIGO}\u250F\u2501\u2513 ${VIOLET}\u250F\u2501\u2513${RESET} ${LAVENDER}\u250F\u2501\u2513 \u257B${RESET} ${PURPLE}\u2551${RESET}
|
|
382
|
+
${PURPLE} \u2551${RESET} ${INDIGO}\u2523\u2533\u251B ${VIOLET}\u2523\u2501\u252B${RESET} ${LAVENDER}\u250F\u254B\u251B\u250F\u254B\u251B${RESET} ${PURPLE}\u2551${RESET}
|
|
383
|
+
${PURPLE} \u2551${RESET} ${INDIGO}\u2579\u2517\u2578 ${VIOLET}\u2579 \u2579${RESET} ${LAVENDER}\u2579 \u2579 ${RESET} ${PURPLE}\u2551${RESET}
|
|
384
|
+
${PURPLE} \u2551${RESET} ${PURPLE}\u2551${RESET}
|
|
385
|
+
${PURPLE} \u2551${RESET} ${BOLD}${INDIGO}R${VIOLET}eactive ${INDIGO}A${VIOLET}gents e${INDIGO}X${VIOLET}ecutable${RESET} ${PURPLE}\u2551${RESET}
|
|
386
|
+
${PURPLE} \u2551${RESET} ${DIM}Type-safe AI agents on Effect-TS${RESET} ${PURPLE}\u2551${RESET}
|
|
387
|
+
${PURPLE} \u2551${RESET} ${PURPLE}\u2551${RESET}
|
|
388
|
+
${PURPLE} \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D${RESET}
|
|
389
|
+
`;
|
|
390
|
+
var VERSION = "0.1.0";
|
|
391
|
+
function printBanner() {
|
|
392
|
+
console.log(BANNER);
|
|
393
|
+
}
|
|
394
|
+
function printVersion() {
|
|
395
|
+
console.log(`${INDIGO}rax${RESET} ${DIM}v${VERSION}${RESET}`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// src/index.ts
|
|
399
|
+
var HELP = `
|
|
400
|
+
Usage: rax <command> [options]
|
|
401
|
+
|
|
402
|
+
Commands:
|
|
403
|
+
init <name> [--template minimal|standard|full] Scaffold a new project
|
|
404
|
+
create agent <name> [--recipe basic|...] Generate an agent file
|
|
405
|
+
run <prompt> [--provider ...] [--model ...] Run an agent with a prompt
|
|
406
|
+
dev Start dev server
|
|
407
|
+
eval run --suite <name> Run evaluation suite
|
|
408
|
+
playground Launch interactive REPL
|
|
409
|
+
inspect <agent-id> [--trace last] Inspect agent state
|
|
410
|
+
help Show this help
|
|
411
|
+
version Show version
|
|
412
|
+
`.trimEnd();
|
|
413
|
+
function main(argv = process.argv.slice(2)) {
|
|
414
|
+
const command = argv[0];
|
|
415
|
+
switch (command) {
|
|
416
|
+
case "init":
|
|
417
|
+
runInit(argv.slice(1));
|
|
418
|
+
break;
|
|
419
|
+
case "create": {
|
|
420
|
+
const subcommand = argv[1];
|
|
421
|
+
if (subcommand === "agent") {
|
|
422
|
+
runCreateAgent(argv.slice(2));
|
|
423
|
+
} else {
|
|
424
|
+
console.error(`Unknown create subcommand: ${subcommand}`);
|
|
425
|
+
console.error("Usage: rax create agent <name>");
|
|
426
|
+
process.exit(1);
|
|
427
|
+
}
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case "run":
|
|
431
|
+
runAgent(argv.slice(1));
|
|
432
|
+
break;
|
|
433
|
+
case "dev":
|
|
434
|
+
runDev(argv.slice(1));
|
|
435
|
+
break;
|
|
436
|
+
case "eval":
|
|
437
|
+
runEval(argv.slice(1));
|
|
438
|
+
break;
|
|
439
|
+
case "playground":
|
|
440
|
+
runPlayground(argv.slice(1));
|
|
441
|
+
break;
|
|
442
|
+
case "inspect":
|
|
443
|
+
runInspect(argv.slice(1));
|
|
444
|
+
break;
|
|
445
|
+
case "version":
|
|
446
|
+
case "--version":
|
|
447
|
+
case "-v":
|
|
448
|
+
printVersion();
|
|
449
|
+
break;
|
|
450
|
+
case "help":
|
|
451
|
+
case "--help":
|
|
452
|
+
case "-h":
|
|
453
|
+
case void 0:
|
|
454
|
+
printBanner();
|
|
455
|
+
console.log(HELP);
|
|
456
|
+
break;
|
|
457
|
+
default:
|
|
458
|
+
console.error(`Unknown command: ${command}`);
|
|
459
|
+
printBanner();
|
|
460
|
+
console.log(HELP);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (import.meta.main) {
|
|
465
|
+
main();
|
|
466
|
+
}
|
|
467
|
+
export {
|
|
468
|
+
main
|
|
469
|
+
};
|
|
470
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts","../src/generators/project-generator.ts","../src/generators/agent-generator.ts","../src/commands/create-agent.ts","../src/commands/dev.ts","../src/commands/eval.ts","../src/commands/playground.ts","../src/commands/inspect.ts","../src/commands/run.ts","../src/banner.ts","../src/index.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { generateProject, type ProjectTemplate } from \"../generators/project-generator.js\";\n\nconst VALID_TEMPLATES: ProjectTemplate[] = [\"minimal\", \"standard\", \"full\"];\n\nexport function runInit(args: string[]): void {\n const name = args[0];\n if (!name) {\n console.error(\"Usage: reactive-agents init <project-name> [--template minimal|standard|full]\");\n process.exit(1);\n }\n\n let template: ProjectTemplate = \"standard\";\n const templateIdx = args.indexOf(\"--template\");\n if (templateIdx !== -1 && args[templateIdx + 1]) {\n const t = args[templateIdx + 1] as ProjectTemplate;\n if (!VALID_TEMPLATES.includes(t)) {\n console.error(`Invalid template: ${t}. Valid options: ${VALID_TEMPLATES.join(\", \")}`);\n process.exit(1);\n }\n template = t;\n }\n\n const targetDir = join(process.cwd(), name);\n console.log(`Creating project \"${name}\" with template \"${template}\"...`);\n\n const result = generateProject({ name, template, targetDir });\n\n console.log(`Created ${result.files.length} files:`);\n for (const file of result.files) {\n console.log(` ${file}`);\n }\n console.log(`\\nNext steps:`);\n console.log(` cd ${name}`);\n console.log(` bun install`);\n console.log(` cp .env.example .env # Add your API keys`);\n console.log(` bun run dev`);\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type ProjectTemplate = \"minimal\" | \"standard\" | \"full\";\n\ninterface ProjectConfig {\n name: string;\n template: ProjectTemplate;\n targetDir: string;\n}\n\nconst TEMPLATE_DEPS: Record<ProjectTemplate, string[]> = {\n minimal: [\"@reactive-agents/core\", \"@reactive-agents/llm-provider\", \"@reactive-agents/runtime\"],\n standard: [\n \"@reactive-agents/core\",\n \"@reactive-agents/llm-provider\",\n \"@reactive-agents/memory\",\n \"@reactive-agents/reasoning\",\n \"@reactive-agents/tools\",\n \"@reactive-agents/runtime\",\n ],\n full: [\n \"@reactive-agents/core\",\n \"@reactive-agents/llm-provider\",\n \"@reactive-agents/memory\",\n \"@reactive-agents/reasoning\",\n \"@reactive-agents/tools\",\n \"@reactive-agents/verification\",\n \"@reactive-agents/cost\",\n \"@reactive-agents/identity\",\n \"@reactive-agents/orchestration\",\n \"@reactive-agents/observability\",\n \"@reactive-agents/interaction\",\n \"@reactive-agents/guardrails\",\n \"@reactive-agents/prompts\",\n \"@reactive-agents/runtime\",\n ],\n};\n\nexport function generateProject(config: ProjectConfig): { files: string[] } {\n const { name, template, targetDir } = config;\n const files: string[] = [];\n\n // Create directory structure\n const dirs = [targetDir, join(targetDir, \"src\"), join(targetDir, \"src\", \"agents\")];\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // package.json\n const deps = Object.fromEntries(TEMPLATE_DEPS[template].map((d) => [d, \"latest\"]));\n const packageJson = {\n name,\n version: \"0.1.0\",\n type: \"module\",\n scripts: {\n dev: \"bun run src/index.ts\",\n build: \"tsc --noEmit\",\n test: \"bun test\",\n },\n dependencies: {\n effect: \"^3.10.0\",\n ...deps,\n },\n devDependencies: {\n typescript: \"^5.7.0\",\n \"bun-types\": \"latest\",\n },\n };\n const pkgPath = join(targetDir, \"package.json\");\n writeFileSync(pkgPath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n files.push(pkgPath);\n\n // tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ES2022\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n types: [\"bun-types\"],\n },\n include: [\"src/**/*\"],\n };\n const tscPath = join(targetDir, \"tsconfig.json\");\n writeFileSync(tscPath, JSON.stringify(tsconfig, null, 2) + \"\\n\");\n files.push(tscPath);\n\n // Example agent\n const agentCode = generateAgentExample(template);\n const agentPath = join(targetDir, \"src\", \"agents\", \"my-agent.ts\");\n writeFileSync(agentPath, agentCode);\n files.push(agentPath);\n\n // Entry point\n const entryCode = `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nconst agent = await ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"my-agent\")\n .build();\n\nconst result = await agent.run(\"Hello, what can you help me with?\");\nconsole.log(result);\n`;\n const entryPath = join(targetDir, \"src\", \"index.ts\");\n writeFileSync(entryPath, entryCode);\n files.push(entryPath);\n\n // .env.example\n const envExample = `# LLM Provider\nANTHROPIC_API_KEY=sk-ant-...\n# OPENAI_API_KEY=sk-...\n\n# Optional\nLLM_DEFAULT_MODEL=claude-sonnet-4-20250514\n`;\n const envPath = join(targetDir, \".env.example\");\n writeFileSync(envPath, envExample);\n files.push(envPath);\n\n return { files };\n}\n\nfunction generateAgentExample(template: ProjectTemplate): string {\n switch (template) {\n case \"minimal\":\n return `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const createMyAgent = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"my-agent\")\n .build();\n`;\n case \"standard\":\n return `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const createMyAgent = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"my-agent\")\n .withMemory(true)\n .withReasoning(\"reactive\")\n .build();\n`;\n case \"full\":\n return `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const createMyAgent = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"my-agent\")\n .withMemory(true)\n .withReasoning(\"reactive\")\n .withVerification(true)\n .withGuardrails(true)\n .build();\n`;\n }\n}\n","import { writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\n\nexport type AgentRecipe = \"basic\" | \"researcher\" | \"coder\" | \"orchestrator\";\n\ninterface AgentConfig {\n name: string;\n recipe: AgentRecipe;\n targetDir: string;\n}\n\nconst RECIPE_TEMPLATES: Record<AgentRecipe, (name: string) => string> = {\n basic: (name) => `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const ${toCamelCase(name)} = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"${name}\")\n .build();\n`,\n\n researcher: (name) => `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const ${toCamelCase(name)} = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"${name}\")\n .withSystemPrompt(\"You are a research assistant. Gather information, synthesize findings, and provide well-sourced answers.\")\n .withMemory(true)\n .withReasoning(\"reactive\")\n .build();\n`,\n\n coder: (name) => `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const ${toCamelCase(name)} = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"${name}\")\n .withSystemPrompt(\"You are a coding assistant. Write clean, well-tested code and explain your decisions.\")\n .withReasoning(\"reactive\")\n .build();\n`,\n\n orchestrator: (name) => `import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport const ${toCamelCase(name)} = () =>\n ReactiveAgents.create()\n .withProvider(\"anthropic\")\n .withName(\"${name}\")\n .withSystemPrompt(\"You are an orchestrator agent. Decompose complex tasks and coordinate sub-agents.\")\n .withMemory(true)\n .withReasoning(\"reactive\")\n .build();\n`,\n};\n\nexport function generateAgent(config: AgentConfig): { filePath: string } {\n const { name, recipe, targetDir } = config;\n const fileName = `${toKebabCase(name)}.ts`;\n const filePath = join(targetDir, \"src\", \"agents\", fileName);\n\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const template = RECIPE_TEMPLATES[recipe];\n writeFileSync(filePath, template(name));\n\n return { filePath };\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_]+(.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, (_, c) => c.toLowerCase());\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .toLowerCase();\n}\n","import { generateAgent, type AgentRecipe } from \"../generators/agent-generator.js\";\n\nconst VALID_RECIPES: AgentRecipe[] = [\"basic\", \"researcher\", \"coder\", \"orchestrator\"];\n\nexport function runCreateAgent(args: string[]): void {\n const name = args[0];\n if (!name) {\n console.error(\"Usage: reactive-agents create agent <name> [--recipe basic|researcher|coder|orchestrator]\");\n process.exit(1);\n }\n\n let recipe: AgentRecipe = \"basic\";\n const recipeIdx = args.indexOf(\"--recipe\");\n if (recipeIdx !== -1 && args[recipeIdx + 1]) {\n const r = args[recipeIdx + 1] as AgentRecipe;\n if (!VALID_RECIPES.includes(r)) {\n console.error(`Invalid recipe: ${r}. Valid options: ${VALID_RECIPES.join(\", \")}`);\n process.exit(1);\n }\n recipe = r;\n }\n\n console.log(`Creating agent \"${name}\" with recipe \"${recipe}\"...`);\n\n const result = generateAgent({\n name,\n recipe,\n targetDir: process.cwd(),\n });\n\n console.log(`Created: ${result.filePath}`);\n}\n","export function runDev(_args: string[]): void {\n console.log(\"Starting development server...\");\n console.log(\"Dev server is a placeholder — Tier 1 implementation.\");\n console.log(\"Use 'bun run src/index.ts' to run your agent directly.\");\n}\n","export function runEval(args: string[]): void {\n const subcommand = args[0];\n if (subcommand !== \"run\") {\n console.error(\"Usage: reactive-agents eval run --suite <suite-name>\");\n process.exit(1);\n }\n\n const suiteIdx = args.indexOf(\"--suite\");\n const suite = suiteIdx !== -1 ? args[suiteIdx + 1] : undefined;\n\n if (!suite) {\n console.error(\"Usage: reactive-agents eval run --suite <suite-name>\");\n process.exit(1);\n }\n\n console.log(`Running eval suite: ${suite}`);\n console.log(\"Eval runner is a placeholder — Tier 1 implementation.\");\n console.log(\"When @reactive-agents/eval is built, this will run EvalService programmatically.\");\n}\n","export function runPlayground(_args: string[]): void {\n console.log(\"Interactive playground is a placeholder — Tier 1 implementation.\");\n console.log(\"When ready, this will launch an interactive REPL for agent conversations.\");\n}\n","export function runInspect(args: string[]): void {\n const agentId = args[0];\n if (!agentId) {\n console.error(\"Usage: reactive-agents inspect <agent-id> [--trace last]\");\n process.exit(1);\n }\n\n console.log(`Inspecting agent: ${agentId}`);\n console.log(\"Agent inspection is a placeholder — Tier 1 implementation.\");\n console.log(\"When @reactive-agents/observability is wired, this will show agent state, traces, and metrics.\");\n}\n","import { ReactiveAgents } from \"@reactive-agents/runtime\";\n\nexport async function runAgent(args: string[]): Promise<void> {\n // Parse arguments\n const promptParts: string[] = [];\n let provider: \"anthropic\" | \"openai\" | \"ollama\" | \"test\" = \"anthropic\";\n let model: string | undefined;\n let name = \"cli-agent\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--provider\" && args[i + 1]) {\n provider = args[++i] as typeof provider;\n } else if (arg === \"--model\" && args[i + 1]) {\n model = args[++i];\n } else if (arg === \"--name\" && args[i + 1]) {\n name = args[++i];\n } else if (!arg.startsWith(\"--\")) {\n promptParts.push(arg);\n }\n }\n\n const prompt = promptParts.join(\" \");\n if (!prompt) {\n console.error(\"Usage: reactive-agents run <prompt> [--provider anthropic|openai|ollama|test] [--model <model>] [--name <name>]\");\n process.exit(1);\n }\n\n console.log(`Building agent \"${name}\" with provider: ${provider}...`);\n\n const builder = ReactiveAgents.create()\n .withName(name)\n .withProvider(provider);\n\n if (model) {\n builder.withModel(model);\n }\n\n try {\n const agent = await builder.build();\n console.log(`Agent ready: ${agent.agentId}`);\n console.log(`Running: \"${prompt}\"\\n`);\n\n const result = await agent.run(prompt);\n\n if (result.success) {\n console.log(\"─── Output ───\");\n console.log(result.output || \"(no output)\");\n console.log(\"\\n─── Metadata ───\");\n console.log(` Duration: ${result.metadata.duration}ms`);\n console.log(` Steps: ${result.metadata.stepsCount}`);\n console.log(` Cost: $${result.metadata.cost.toFixed(6)}`);\n } else {\n console.error(\"Agent execution failed.\");\n process.exit(1);\n }\n } catch (err) {\n console.error(\"Error:\", err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n","const PURPLE = \"\\x1b[38;5;99m\";\nconst INDIGO = \"\\x1b[38;5;63m\";\nconst VIOLET = \"\\x1b[38;5;135m\";\nconst LAVENDER = \"\\x1b[38;5;183m\";\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\nconst BOLD = \"\\x1b[1m\";\n\nexport const BANNER = `\n${PURPLE} ╔══════════════════════════════════════════╗${RESET}\n${PURPLE} ║${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${INDIGO}┏━┓ ${VIOLET}┏━┓${RESET} ${LAVENDER}┏━┓ ╻${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${INDIGO}┣┳┛ ${VIOLET}┣━┫${RESET} ${LAVENDER}┏╋┛┏╋┛${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${INDIGO}╹┗╸ ${VIOLET}╹ ╹${RESET} ${LAVENDER}╹ ╹ ${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${BOLD}${INDIGO}R${VIOLET}eactive ${INDIGO}A${VIOLET}gents e${INDIGO}X${VIOLET}ecutable${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${DIM}Type-safe AI agents on Effect-TS${RESET} ${PURPLE}║${RESET}\n${PURPLE} ║${RESET} ${PURPLE}║${RESET}\n${PURPLE} ╚══════════════════════════════════════════╝${RESET}\n`;\n\nexport const VERSION = \"0.1.0\";\n\nexport function printBanner() {\n console.log(BANNER);\n}\n\nexport function printVersion() {\n console.log(`${INDIGO}rax${RESET} ${DIM}v${VERSION}${RESET}`);\n}\n","#!/usr/bin/env bun\n\nimport { runInit } from \"./commands/init.js\";\nimport { runCreateAgent } from \"./commands/create-agent.js\";\nimport { runDev } from \"./commands/dev.js\";\nimport { runEval } from \"./commands/eval.js\";\nimport { runPlayground } from \"./commands/playground.js\";\nimport { runInspect } from \"./commands/inspect.js\";\nimport { runAgent } from \"./commands/run.js\";\nimport { printBanner, printVersion, VERSION } from \"./banner.js\";\n\nconst HELP = `\n Usage: rax <command> [options]\n\n Commands:\n init <name> [--template minimal|standard|full] Scaffold a new project\n create agent <name> [--recipe basic|...] Generate an agent file\n run <prompt> [--provider ...] [--model ...] Run an agent with a prompt\n dev Start dev server\n eval run --suite <name> Run evaluation suite\n playground Launch interactive REPL\n inspect <agent-id> [--trace last] Inspect agent state\n help Show this help\n version Show version\n`.trimEnd();\n\nexport function main(argv: string[] = process.argv.slice(2)) {\n const command = argv[0];\n\n switch (command) {\n case \"init\":\n runInit(argv.slice(1));\n break;\n\n case \"create\": {\n const subcommand = argv[1];\n if (subcommand === \"agent\") {\n runCreateAgent(argv.slice(2));\n } else {\n console.error(`Unknown create subcommand: ${subcommand}`);\n console.error(\"Usage: rax create agent <name>\");\n process.exit(1);\n }\n break;\n }\n\n case \"run\":\n runAgent(argv.slice(1));\n break;\n\n case \"dev\":\n runDev(argv.slice(1));\n break;\n\n case \"eval\":\n runEval(argv.slice(1));\n break;\n\n case \"playground\":\n runPlayground(argv.slice(1));\n break;\n\n case \"inspect\":\n runInspect(argv.slice(1));\n break;\n\n case \"version\":\n case \"--version\":\n case \"-v\":\n printVersion();\n break;\n\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n printBanner();\n console.log(HELP);\n break;\n\n default:\n console.error(`Unknown command: ${command}`);\n printBanner();\n console.log(HELP);\n process.exit(1);\n }\n}\n\n// Run if invoked directly\nif (import.meta.main) {\n main();\n}\n"],"mappings":";;;;AAAA,SAAS,QAAAA,aAAY;;;ACArB,SAAS,WAAW,eAAe,kBAAkB;AACrD,SAAS,YAAY;AAUrB,IAAM,gBAAmD;AAAA,EACvD,SAAS,CAAC,yBAAyB,iCAAiC,0BAA0B;AAAA,EAC9F,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAA4C;AAC1E,QAAM,EAAE,MAAM,UAAU,UAAU,IAAI;AACtC,QAAM,QAAkB,CAAC;AAGzB,QAAM,OAAO,CAAC,WAAW,KAAK,WAAW,KAAK,GAAG,KAAK,WAAW,OAAO,QAAQ,CAAC;AACjF,aAAW,OAAO,MAAM;AACtB,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAGA,QAAM,OAAO,OAAO,YAAY,cAAc,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;AACjF,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA,MACf,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,UAAU,KAAK,WAAW,cAAc;AAC9C,gBAAc,SAAS,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,IAAI;AAClE,QAAM,KAAK,OAAO;AAGlB,QAAM,WAAW;AAAA,IACf,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,OAAO,CAAC,WAAW;AAAA,IACrB;AAAA,IACA,SAAS,CAAC,UAAU;AAAA,EACtB;AACA,QAAM,UAAU,KAAK,WAAW,eAAe;AAC/C,gBAAc,SAAS,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAC/D,QAAM,KAAK,OAAO;AAGlB,QAAM,YAAY,qBAAqB,QAAQ;AAC/C,QAAM,YAAY,KAAK,WAAW,OAAO,UAAU,aAAa;AAChE,gBAAc,WAAW,SAAS;AAClC,QAAM,KAAK,SAAS;AAGpB,QAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUlB,QAAM,YAAY,KAAK,WAAW,OAAO,UAAU;AACnD,gBAAc,WAAW,SAAS;AAClC,QAAM,KAAK,SAAS;AAGpB,QAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnB,QAAM,UAAU,KAAK,WAAW,cAAc;AAC9C,gBAAc,SAAS,UAAU;AACjC,QAAM,KAAK,OAAO;AAElB,SAAO,EAAE,MAAM;AACjB;AAEA,SAAS,qBAAqB,UAAmC;AAC/D,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQT,KAAK;AACH,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUT,KAAK;AACH,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYX;AACF;;;ADlKA,IAAM,kBAAqC,CAAC,WAAW,YAAY,MAAM;AAElE,SAAS,QAAQ,MAAsB;AAC5C,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,+EAA+E;AAC7F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAA4B;AAChC,QAAM,cAAc,KAAK,QAAQ,YAAY;AAC7C,MAAI,gBAAgB,MAAM,KAAK,cAAc,CAAC,GAAG;AAC/C,UAAM,IAAI,KAAK,cAAc,CAAC;AAC9B,QAAI,CAAC,gBAAgB,SAAS,CAAC,GAAG;AAChC,cAAQ,MAAM,qBAAqB,CAAC,oBAAoB,gBAAgB,KAAK,IAAI,CAAC,EAAE;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,eAAW;AAAA,EACb;AAEA,QAAM,YAAYC,MAAK,QAAQ,IAAI,GAAG,IAAI;AAC1C,UAAQ,IAAI,qBAAqB,IAAI,oBAAoB,QAAQ,MAAM;AAEvE,QAAM,SAAS,gBAAgB,EAAE,MAAM,UAAU,UAAU,CAAC;AAE5D,UAAQ,IAAI,WAAW,OAAO,MAAM,MAAM,SAAS;AACnD,aAAW,QAAQ,OAAO,OAAO;AAC/B,YAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACzB;AACA,UAAQ,IAAI;AAAA,YAAe;AAC3B,UAAQ,IAAI,QAAQ,IAAI,EAAE;AAC1B,UAAQ,IAAI,eAAe;AAC3B,UAAQ,IAAI,6CAA6C;AACzD,UAAQ,IAAI,eAAe;AAC7B;;;AErCA,SAAS,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AACrD,SAAS,QAAAC,OAAM,eAAe;AAU9B,IAAM,mBAAkE;AAAA,EACtE,OAAO,CAAC,SAAS;AAAA;AAAA,eAEJ,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,iBAGf,IAAI;AAAA;AAAA;AAAA,EAInB,YAAY,CAAC,SAAS;AAAA;AAAA,eAET,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,iBAGf,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnB,OAAO,CAAC,SAAS;AAAA;AAAA,eAEJ,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,iBAGf,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,cAAc,CAAC,SAAS;AAAA;AAAA,eAEX,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,iBAGf,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAMrB;AAEO,SAAS,cAAc,QAA2C;AACvE,QAAM,EAAE,MAAM,QAAQ,UAAU,IAAI;AACpC,QAAM,WAAW,GAAG,YAAY,IAAI,CAAC;AACrC,QAAM,WAAWA,MAAK,WAAW,OAAO,UAAU,QAAQ;AAE1D,QAAM,MAAM,QAAQ,QAAQ;AAC5B,MAAI,CAACD,YAAW,GAAG,GAAG;AACpB,IAAAD,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,WAAW,iBAAiB,MAAM;AACxC,EAAAD,eAAc,UAAU,SAAS,IAAI,CAAC;AAEtC,SAAO,EAAE,SAAS;AACpB;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,EAC9C,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC9C;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB;;;AClFA,IAAM,gBAA+B,CAAC,SAAS,cAAc,SAAS,cAAc;AAE7E,SAAS,eAAe,MAAsB;AACnD,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,2FAA2F;AACzG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,SAAsB;AAC1B,QAAM,YAAY,KAAK,QAAQ,UAAU;AACzC,MAAI,cAAc,MAAM,KAAK,YAAY,CAAC,GAAG;AAC3C,UAAM,IAAI,KAAK,YAAY,CAAC;AAC5B,QAAI,CAAC,cAAc,SAAS,CAAC,GAAG;AAC9B,cAAQ,MAAM,mBAAmB,CAAC,oBAAoB,cAAc,KAAK,IAAI,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,aAAS;AAAA,EACX;AAEA,UAAQ,IAAI,mBAAmB,IAAI,kBAAkB,MAAM,MAAM;AAEjE,QAAM,SAAS,cAAc;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,WAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AAED,UAAQ,IAAI,YAAY,OAAO,QAAQ,EAAE;AAC3C;;;AC/BO,SAAS,OAAO,OAAuB;AAC5C,UAAQ,IAAI,gCAAgC;AAC5C,UAAQ,IAAI,2DAAsD;AAClE,UAAQ,IAAI,wDAAwD;AACtE;;;ACJO,SAAS,QAAQ,MAAsB;AAC5C,QAAM,aAAa,KAAK,CAAC;AACzB,MAAI,eAAe,OAAO;AACxB,YAAQ,MAAM,sDAAsD;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,QAAM,QAAQ,aAAa,KAAK,KAAK,WAAW,CAAC,IAAI;AAErD,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,sDAAsD;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,uBAAuB,KAAK,EAAE;AAC1C,UAAQ,IAAI,4DAAuD;AACnE,UAAQ,IAAI,kFAAkF;AAChG;;;AClBO,SAAS,cAAc,OAAuB;AACnD,UAAQ,IAAI,uEAAkE;AAC9E,UAAQ,IAAI,2EAA2E;AACzF;;;ACHO,SAAS,WAAW,MAAsB;AAC/C,QAAM,UAAU,KAAK,CAAC;AACtB,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,0DAA0D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,qBAAqB,OAAO,EAAE;AAC1C,UAAQ,IAAI,iEAA4D;AACxE,UAAQ,IAAI,gGAAgG;AAC9G;;;ACVA,SAAS,sBAAsB;AAE/B,eAAsB,SAAS,MAA+B;AAE5D,QAAM,cAAwB,CAAC;AAC/B,MAAI,WAAuD;AAC3D,MAAI;AACJ,MAAI,OAAO;AAEX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,gBAAgB,KAAK,IAAI,CAAC,GAAG;AACvC,iBAAW,KAAK,EAAE,CAAC;AAAA,IACrB,WAAW,QAAQ,aAAa,KAAK,IAAI,CAAC,GAAG;AAC3C,cAAQ,KAAK,EAAE,CAAC;AAAA,IAClB,WAAW,QAAQ,YAAY,KAAK,IAAI,CAAC,GAAG;AAC1C,aAAO,KAAK,EAAE,CAAC;AAAA,IACjB,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG;AAChC,kBAAY,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,KAAK,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,iHAAiH;AAC/H,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,mBAAmB,IAAI,oBAAoB,QAAQ,KAAK;AAEpE,QAAM,UAAU,eAAe,OAAO,EACnC,SAAS,IAAI,EACb,aAAa,QAAQ;AAExB,MAAI,OAAO;AACT,YAAQ,UAAU,KAAK;AAAA,EACzB;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,YAAQ,IAAI,gBAAgB,MAAM,OAAO,EAAE;AAC3C,YAAQ,IAAI,aAAa,MAAM;AAAA,CAAK;AAEpC,UAAM,SAAS,MAAM,MAAM,IAAI,MAAM;AAErC,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI,8CAAgB;AAC5B,cAAQ,IAAI,OAAO,UAAU,aAAa;AAC1C,cAAQ,IAAI,kDAAoB;AAChC,cAAQ,IAAI,eAAe,OAAO,SAAS,QAAQ,IAAI;AACvD,cAAQ,IAAI,YAAY,OAAO,SAAS,UAAU,EAAE;AACpD,cAAQ,IAAI,YAAY,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,IAC3D,OAAO;AACL,cAAQ,MAAM,yBAAyB;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AC5DA,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,OAAO;AAEN,IAAM,SAAS;AAAA,EACpB,MAAM,6QAAiD,KAAK;AAAA,EAC5D,MAAM,WAAM,KAAK,6CAA6C,MAAM,SAAI,KAAK;AAAA,EAC7E,MAAM,WAAM,KAAK,UAAU,MAAM,uBAAQ,MAAM,qBAAM,KAAK,MAAM,QAAQ,6BAAS,KAAK,qBAAqB,MAAM,SAAI,KAAK;AAAA,EAC1H,MAAM,WAAM,KAAK,UAAU,MAAM,uBAAQ,MAAM,qBAAM,KAAK,MAAM,QAAQ,uCAAS,KAAK,qBAAqB,MAAM,SAAI,KAAK;AAAA,EAC1H,MAAM,WAAM,KAAK,UAAU,MAAM,uBAAQ,MAAM,gBAAM,KAAK,MAAM,QAAQ,mBAAS,KAAK,qBAAqB,MAAM,SAAI,KAAK;AAAA,EAC1H,MAAM,WAAM,KAAK,6CAA6C,MAAM,SAAI,KAAK;AAAA,EAC7E,MAAM,WAAM,KAAK,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,WAAW,MAAM,IAAI,MAAM,UAAU,MAAM,IAAI,MAAM,WAAW,KAAK,gBAAgB,MAAM,SAAI,KAAK;AAAA,EAClJ,MAAM,WAAM,KAAK,MAAM,GAAG,mCAAmC,KAAK,UAAU,MAAM,SAAI,KAAK;AAAA,EAC3F,MAAM,WAAM,KAAK,6CAA6C,MAAM,SAAI,KAAK;AAAA,EAC7E,MAAM,6QAAiD,KAAK;AAAA;AAGvD,IAAM,UAAU;AAEhB,SAAS,cAAc;AAC5B,UAAQ,IAAI,MAAM;AACpB;AAEO,SAAS,eAAe;AAC7B,UAAQ,IAAI,GAAG,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAC9D;;;AClBA,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaX,QAAQ;AAEH,SAAS,KAAK,OAAiB,QAAQ,KAAK,MAAM,CAAC,GAAG;AAC3D,QAAM,UAAU,KAAK,CAAC;AAEtB,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,cAAQ,KAAK,MAAM,CAAC,CAAC;AACrB;AAAA,IAEF,KAAK,UAAU;AACb,YAAM,aAAa,KAAK,CAAC;AACzB,UAAI,eAAe,SAAS;AAC1B,uBAAe,KAAK,MAAM,CAAC,CAAC;AAAA,MAC9B,OAAO;AACL,gBAAQ,MAAM,8BAA8B,UAAU,EAAE;AACxD,gBAAQ,MAAM,gCAAgC;AAC9C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK;AACH,eAAS,KAAK,MAAM,CAAC,CAAC;AACtB;AAAA,IAEF,KAAK;AACH,aAAO,KAAK,MAAM,CAAC,CAAC;AACpB;AAAA,IAEF,KAAK;AACH,cAAQ,KAAK,MAAM,CAAC,CAAC;AACrB;AAAA,IAEF,KAAK;AACH,oBAAc,KAAK,MAAM,CAAC,CAAC;AAC3B;AAAA,IAEF,KAAK;AACH,iBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,mBAAa;AACb;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,kBAAY;AACZ,cAAQ,IAAI,IAAI;AAChB;AAAA,IAEF;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,kBAAY;AACZ,cAAQ,IAAI,IAAI;AAChB,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAGA,IAAI,YAAY,MAAM;AACpB,OAAK;AACP;","names":["join","join","writeFileSync","mkdirSync","existsSync","join"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reactive-agents/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"rax": "dist/index.js",
|
|
8
|
+
"reactive-agents": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsup --config tsup.config.ts",
|
|
12
|
+
"typecheck": "tsc --noEmit",
|
|
13
|
+
"test": "bun test"
|
|
14
|
+
},
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/tylerjrbuell/reactive-agents-ts.git",
|
|
19
|
+
"directory": "apps/cli"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"effect": "^3.10.0",
|
|
31
|
+
"@reactive-agents/core": "0.1.0",
|
|
32
|
+
"@reactive-agents/runtime": "0.1.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"typescript": "^5.7.0",
|
|
36
|
+
"bun-types": "latest"
|
|
37
|
+
},
|
|
38
|
+
"description": "rax — the Reactive Agents CLI for scaffolding, running, and inspecting AI agents",
|
|
39
|
+
"homepage": "https://tylerjrbuell.github.io/reactive-agents-ts/",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/tylerjrbuell/reactive-agents-ts/issues"
|
|
42
|
+
},
|
|
43
|
+
"types": "./dist/index.d.ts"
|
|
44
|
+
}
|