arcie 0.1.4 → 0.1.6
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/agent/index.d.ts +1 -1
- package/dist/build-TWNCPXBU.js +82 -0
- package/dist/build-TWNCPXBU.js.map +1 -0
- package/dist/channels/index.d.ts +1 -1
- package/dist/{chunk-2ZSKZYWK.js → chunk-4WSILP75.js} +37 -164
- package/dist/chunk-4WSILP75.js.map +1 -0
- package/dist/chunk-HVBDOHTL.js +148 -0
- package/dist/chunk-HVBDOHTL.js.map +1 -0
- package/dist/chunk-HWD2Z2CH.js +742 -0
- package/dist/chunk-HWD2Z2CH.js.map +1 -0
- package/dist/chunk-KVSX4MLK.js +139 -0
- package/dist/chunk-KVSX4MLK.js.map +1 -0
- package/dist/chunk-N5R3TEEZ.js +15 -0
- package/dist/chunk-N5R3TEEZ.js.map +1 -0
- package/dist/chunk-SGWQZZ2A.js +54 -0
- package/dist/chunk-SGWQZZ2A.js.map +1 -0
- package/dist/chunk-XOFWQUOO.js +30 -0
- package/dist/chunk-XOFWQUOO.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +156 -231
- package/dist/cli/index.js.map +1 -1
- package/dist/context/index.d.ts +1 -1
- package/dist/dev-ZZDVOWUZ.js +1967 -0
- package/dist/dev-ZZDVOWUZ.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/{index-b4NcDl3m.d.ts → index-CElLRVTP.d.ts} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/init-5F7CIVLN.js +822 -0
- package/dist/init-5F7CIVLN.js.map +1 -0
- package/dist/instructions/index.d.ts +1 -1
- package/dist/runner/index.d.ts +2 -2
- package/dist/runner/index.js +2 -1
- package/dist/scaffold-web-chat-OQL5C2GK.js +7 -0
- package/dist/scaffold-web-chat-OQL5C2GK.js.map +1 -0
- package/dist/schedules/index.d.ts +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/{types-BxOQTzx1.d.ts → types-DwxwdSa2.d.ts} +1 -1
- package/package.json +1 -1
- package/templates/default/.env.local +12 -0
- package/templates/web-chat/.env.local.example +4 -0
- package/templates/web-chat/README.md +51 -0
- package/templates/web-chat/app/api/chat/route.ts +43 -0
- package/templates/web-chat/app/globals.css +65 -0
- package/templates/web-chat/app/layout.tsx +15 -0
- package/templates/web-chat/app/page.tsx +9 -0
- package/templates/web-chat/components/chat.tsx +219 -0
- package/templates/web-chat/components/input-bar.tsx +181 -0
- package/templates/web-chat/components/message.tsx +123 -0
- package/templates/web-chat/components/tool-call.tsx +79 -0
- package/templates/web-chat/components/ui/button.tsx +46 -0
- package/templates/web-chat/components/ui/input.tsx +19 -0
- package/templates/web-chat/components.json +20 -0
- package/templates/web-chat/lib/stream.ts +41 -0
- package/templates/web-chat/lib/types.ts +62 -0
- package/templates/web-chat/lib/utils.ts +6 -0
- package/templates/web-chat/next.config.mjs +6 -0
- package/templates/web-chat/package.json +33 -0
- package/templates/web-chat/postcss.config.mjs +6 -0
- package/templates/web-chat/tailwind.config.ts +61 -0
- package/templates/web-chat/tsconfig.json +23 -0
- package/dist/chunk-2ZSKZYWK.js.map +0 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,259 +1,184 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "../chunk-
|
|
3
|
+
createCliTheme,
|
|
4
|
+
renderCliTaggedLine
|
|
5
|
+
} from "../chunk-HVBDOHTL.js";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import "../chunk-PHTJLJOV.js";
|
|
7
|
+
arcieCliBanner,
|
|
8
|
+
version
|
|
9
|
+
} from "../chunk-XOFWQUOO.js";
|
|
11
10
|
|
|
12
11
|
// src/cli/index.ts
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
async function initCommand(name, options) {
|
|
22
|
-
const targetDir = name ? resolve(process.cwd(), name) : resolve(process.cwd(), ".");
|
|
23
|
-
if (existsSync(targetDir) && name) {
|
|
24
|
-
console.error(`Directory already exists: ${targetDir}`);
|
|
25
|
-
process.exit(1);
|
|
12
|
+
import { resolve as resolvePath } from "path";
|
|
13
|
+
import { Command, CommanderError, InvalidArgumentError } from "commander";
|
|
14
|
+
var DISPLAY_MODES = /* @__PURE__ */ new Set(["full", "collapsed", "auto-collapsed", "hidden"]);
|
|
15
|
+
var STATS_MODES = /* @__PURE__ */ new Set(["tokens", "tokensPerSecond"]);
|
|
16
|
+
var LOG_MODES = /* @__PURE__ */ new Set(["all", "stderr", "none"]);
|
|
17
|
+
function parsePortOption(value) {
|
|
18
|
+
if (!/^-?\d+$/.test(value)) {
|
|
19
|
+
throw new InvalidArgumentError(`Expected a numeric port, received "${value}".`);
|
|
26
20
|
}
|
|
27
|
-
const
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
process.exit(1);
|
|
21
|
+
const port = Number(value);
|
|
22
|
+
if (port < 0 || port > 65535) {
|
|
23
|
+
throw new InvalidArgumentError(`Expected a port between 0 and 65535, received "${value}".`);
|
|
31
24
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
25
|
+
return port;
|
|
26
|
+
}
|
|
27
|
+
function parseDisplayMode(value) {
|
|
28
|
+
if (!DISPLAY_MODES.has(value)) {
|
|
29
|
+
throw new InvalidArgumentError(
|
|
30
|
+
`Expected one of ${[...DISPLAY_MODES].join(", ")}, received "${value}".`
|
|
31
|
+
);
|
|
38
32
|
}
|
|
39
|
-
|
|
40
|
-
console.log(`
|
|
41
|
-
Next steps:`);
|
|
42
|
-
console.log(` cd ${name || "."}`);
|
|
43
|
-
console.log(` npm install`);
|
|
44
|
-
console.log(` npm run dev`);
|
|
45
|
-
console.log();
|
|
33
|
+
return value;
|
|
46
34
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (entry.endsWith(".gitkeep")) {
|
|
53
|
-
const parentDir = destPath.replace("/.gitkeep", "");
|
|
54
|
-
mkdirSync(parentDir, { recursive: true });
|
|
55
|
-
writeFileSync(join(parentDir, ".gitkeep"), "");
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
mkdirSync(dirname(destPath), { recursive: true });
|
|
59
|
-
if (entry.endsWith(".ts") || entry.endsWith(".md") || entry.endsWith(".json")) {
|
|
60
|
-
const content = readFileSync(entry, "utf-8");
|
|
61
|
-
writeFileSync(destPath, content);
|
|
62
|
-
} else {
|
|
63
|
-
copyFileSync(entry, destPath);
|
|
64
|
-
}
|
|
35
|
+
function parseStatsMode(value) {
|
|
36
|
+
if (!STATS_MODES.has(value)) {
|
|
37
|
+
throw new InvalidArgumentError(
|
|
38
|
+
`Expected one of ${[...STATS_MODES].join(", ")}, received "${value}".`
|
|
39
|
+
);
|
|
65
40
|
}
|
|
41
|
+
return value;
|
|
66
42
|
}
|
|
67
|
-
function
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const stat = statSync(fullPath);
|
|
73
|
-
if (stat.isDirectory()) {
|
|
74
|
-
files.push(...collectFiles(fullPath));
|
|
75
|
-
} else {
|
|
76
|
-
files.push(fullPath);
|
|
77
|
-
}
|
|
43
|
+
function parseLogsMode(value) {
|
|
44
|
+
if (!LOG_MODES.has(value)) {
|
|
45
|
+
throw new InvalidArgumentError(
|
|
46
|
+
`Expected one of ${[...LOG_MODES].join(", ")}, received "${value}".`
|
|
47
|
+
);
|
|
78
48
|
}
|
|
79
|
-
return
|
|
49
|
+
return value;
|
|
80
50
|
}
|
|
81
|
-
function
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
pkg.name = projectName;
|
|
86
|
-
writeFileSync(pkgPath2, JSON.stringify(pkg, null, 2) + "\n");
|
|
51
|
+
function parseContextSizeOption(value) {
|
|
52
|
+
const size = Number(value);
|
|
53
|
+
if (!Number.isFinite(size) || size <= 0) {
|
|
54
|
+
throw new InvalidArgumentError(`Expected a positive number, received "${value}".`);
|
|
87
55
|
}
|
|
56
|
+
return size;
|
|
88
57
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
import { resolve as resolve2 } from "path";
|
|
93
|
-
|
|
94
|
-
// src/cli/banner.ts
|
|
95
|
-
function showBanner() {
|
|
96
|
-
console.log();
|
|
97
|
-
console.log(" \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\u2557");
|
|
98
|
-
console.log(" \u2551 Arcie \u2551");
|
|
99
|
-
console.log(" \u2551 The electronic line \u2014 build \u2551");
|
|
100
|
-
console.log(" \u2551 agents at the speed of light. \u2551");
|
|
101
|
-
console.log(" \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\u255D");
|
|
102
|
-
console.log();
|
|
58
|
+
function shouldPrintCliBootBanner(actionCommand) {
|
|
59
|
+
const name = actionCommand.name();
|
|
60
|
+
return name === "info" || name === "dev" || name === "init";
|
|
103
61
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);
|
|
111
|
-
if (diagnostics.some((d) => d.severity === "error")) {
|
|
112
|
-
for (const d of diagnostics) {
|
|
113
|
-
console.error(` \u2716 ${d.code}: ${d.message}`);
|
|
62
|
+
function createCliProgram(logger) {
|
|
63
|
+
const program = new Command();
|
|
64
|
+
const theme = createCliTheme();
|
|
65
|
+
program.name("arcie").description("arcie \u2014 the electronic line, build agents at the speed of light").version(version()).showHelpAfterError().exitOverride().hook("preAction", (_program, actionCommand) => {
|
|
66
|
+
if (shouldPrintCliBootBanner(actionCommand)) {
|
|
67
|
+
logger.log(arcieCliBanner());
|
|
114
68
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
const agent = await loadAgent(agentDirPath);
|
|
126
|
-
console.log(` Model: ${agent.manifest.config.model}`);
|
|
127
|
-
console.log(` Tools: ${Object.keys(agent.manifest.tools).length}`);
|
|
128
|
-
console.log();
|
|
129
|
-
} catch {
|
|
69
|
+
}).configureOutput({
|
|
70
|
+
writeErr: (message) => logger.error(message.trimEnd()),
|
|
71
|
+
writeOut: (message) => logger.log(message.trimEnd())
|
|
72
|
+
});
|
|
73
|
+
const channels = program.command("channels").description("Manage channels for the current agent (web UI, HTTP, etc.).");
|
|
74
|
+
channels.command("add <kind>").description("Scaffold a channel (currently supports: web).").option("--agent-dir <path>", "Path to agent directory", ".").action(async (kind, options) => {
|
|
75
|
+
if (kind !== "web") {
|
|
76
|
+
logger.error(`unknown channel kind: ${kind}. supported: web`);
|
|
77
|
+
process.exit(1);
|
|
130
78
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (stream) {
|
|
139
|
-
res.writeHead(200, {
|
|
140
|
-
"Content-Type": "application/x-ndjson",
|
|
141
|
-
"Cache-Control": "no-cache",
|
|
142
|
-
Connection: "keep-alive"
|
|
143
|
-
});
|
|
144
|
-
for await (const event of streamAgent(agentDirPath, message)) {
|
|
145
|
-
res.write(JSON.stringify(event) + "\n");
|
|
146
|
-
}
|
|
147
|
-
res.end();
|
|
148
|
-
} else {
|
|
149
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
150
|
-
for await (const _event of streamAgent(agentDirPath, message)) {
|
|
151
|
-
}
|
|
152
|
-
res.end(JSON.stringify({ status: "ok" }));
|
|
153
|
-
}
|
|
154
|
-
} catch (err) {
|
|
155
|
-
res.writeHead(500, { "Content-Type": "application/json" });
|
|
156
|
-
res.end(JSON.stringify({ error: String(err) }));
|
|
79
|
+
const agentDir = resolvePath(process.cwd(), options.agentDir);
|
|
80
|
+
const { scaffoldWebChat } = await import("../scaffold-web-chat-OQL5C2GK.js");
|
|
81
|
+
try {
|
|
82
|
+
const result = scaffoldWebChat(agentDir);
|
|
83
|
+
if (result.alreadyExisted) {
|
|
84
|
+
logger.error(`channels/web already exists at ${result.targetPath}`);
|
|
85
|
+
process.exit(1);
|
|
157
86
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
87
|
+
logger.log(
|
|
88
|
+
renderCliTaggedLine(theme, {
|
|
89
|
+
message: `scaffolded ${result.targetPath}`,
|
|
90
|
+
tag: "channels",
|
|
91
|
+
tone: "success"
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
logger.log(
|
|
95
|
+
renderCliTaggedLine(theme, {
|
|
96
|
+
message: "cd into it, then: npm install && cp .env.local.example .env.local && npm run dev",
|
|
97
|
+
tag: "next",
|
|
98
|
+
tone: "info"
|
|
99
|
+
})
|
|
100
|
+
);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
103
|
+
process.exit(1);
|
|
161
104
|
}
|
|
162
105
|
});
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
106
|
+
program.command("init [target]").description("Create a new arcie agent, or add one to an existing project directory.").option("--template <name>", "Template to use (default, agent-only)", "default").option("-y, --yes", "Accepted for compatibility; has no effect").action(async (target, options) => {
|
|
107
|
+
if (options.yes) logger.error("warning: --yes has no effect for arcie init.");
|
|
108
|
+
const { initCommand } = await import("../init-5F7CIVLN.js");
|
|
109
|
+
await initCommand(target, { template: options.template });
|
|
110
|
+
});
|
|
111
|
+
program.command("build").description("Compile the agent for production.").option("--agent-dir <path>", "Path to agent directory", "agent").option("--out-dir <path>", "Output directory", ".arcie").action(async (options) => {
|
|
112
|
+
const { buildCommand } = await import("../build-TWNCPXBU.js");
|
|
113
|
+
await buildCommand(options);
|
|
114
|
+
logger.log(
|
|
115
|
+
renderCliTaggedLine(theme, {
|
|
116
|
+
message: `output at ${options.outDir}`,
|
|
117
|
+
tag: "build",
|
|
118
|
+
tone: "success"
|
|
119
|
+
})
|
|
120
|
+
);
|
|
167
121
|
});
|
|
122
|
+
program.command("dev").description("Start the arcie development server or attach an interactive UI.").option("-p, --port <port>", "Port to listen on", parsePortOption, 3e3).option("--host <host>", "Host interface to bind").option("--agent-dir <path>", "Path to agent directory", "agent").option("--input <text>", "Pre-fill the prompt input, or start onboarding with /model").option("--no-ui", "Start the server without an interactive UI").option("--name <name>", "Title shown in the terminal UI (defaults to the app folder name)").option(
|
|
123
|
+
"--tools <mode>",
|
|
124
|
+
"How tool calls render: full | collapsed | auto-collapsed | hidden",
|
|
125
|
+
parseDisplayMode
|
|
126
|
+
).option(
|
|
127
|
+
"--reasoning <mode>",
|
|
128
|
+
"How reasoning renders: full | collapsed | auto-collapsed | hidden",
|
|
129
|
+
parseDisplayMode
|
|
130
|
+
).option(
|
|
131
|
+
"--subagents <mode>",
|
|
132
|
+
"How subagent sections render: full | collapsed | auto-collapsed | hidden",
|
|
133
|
+
parseDisplayMode
|
|
134
|
+
).option(
|
|
135
|
+
"--assistant-response-stats <mode>",
|
|
136
|
+
"Assistant header statistic: tokens | tokensPerSecond",
|
|
137
|
+
parseStatsMode
|
|
138
|
+
).option(
|
|
139
|
+
"--context-size <tokens>",
|
|
140
|
+
"Model context window size, shown as a usage percentage",
|
|
141
|
+
parseContextSizeOption
|
|
142
|
+
).option("--logs <mode>", "Which logs to show: all | stderr | none", parseLogsMode).action(async (options) => {
|
|
143
|
+
const { devCommand } = await import("../dev-ZZDVOWUZ.js");
|
|
144
|
+
await devCommand({
|
|
145
|
+
port: String(options.port ?? 3e3),
|
|
146
|
+
agentDir: options.agentDir,
|
|
147
|
+
input: options.ui === false ? false : Boolean(options.input) || options.ui !== false
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
return program;
|
|
168
151
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const outDir = resolve3(process.cwd(), options.outDir);
|
|
176
|
-
console.log(`
|
|
177
|
-
Building agent...
|
|
178
|
-
`);
|
|
179
|
-
if (!existsSync2(agentDirPath)) {
|
|
180
|
-
console.error(` Agent directory not found: ${agentDirPath}`);
|
|
181
|
-
process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);
|
|
184
|
-
if (diagnostics.some((d) => d.severity === "error")) {
|
|
185
|
-
for (const d of diagnostics) {
|
|
186
|
-
console.error(` \u2716 ${d.code}: ${d.message}`);
|
|
187
|
-
}
|
|
188
|
-
process.exit(1);
|
|
152
|
+
var KNOWN_COMMANDS = /* @__PURE__ */ new Set(["channels", "init", "build", "dev", "help"]);
|
|
153
|
+
function resolveArgv(argv) {
|
|
154
|
+
if (argv.length === 0) return ["dev"];
|
|
155
|
+
const first = argv[0];
|
|
156
|
+
if (first === "-h" || first === "--help" || first === "-V" || first === "--version") {
|
|
157
|
+
return [...argv];
|
|
189
158
|
}
|
|
159
|
+
if (first.startsWith("-")) return [...argv];
|
|
160
|
+
if (KNOWN_COMMANDS.has(first)) return [...argv];
|
|
161
|
+
return ["init", ...argv];
|
|
162
|
+
}
|
|
163
|
+
async function runCli(argv = process.argv.slice(2), logger = console) {
|
|
164
|
+
const program = createCliProgram(logger);
|
|
165
|
+
const input = resolveArgv(argv);
|
|
190
166
|
try {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
hooks: Object.keys(agent.manifest.hooks),
|
|
199
|
-
channels: Object.keys(agent.manifest.channels),
|
|
200
|
-
connections: Object.keys(agent.manifest.connections),
|
|
201
|
-
schedules: Object.keys(agent.manifest.schedules),
|
|
202
|
-
subagents: Object.fromEntries(
|
|
203
|
-
Object.entries(agent.manifest.subagents).map(([id, sub]) => [
|
|
204
|
-
id,
|
|
205
|
-
{ description: sub.config.description, tools: Object.keys(sub.tools) }
|
|
206
|
-
])
|
|
207
|
-
),
|
|
208
|
-
discovered: {
|
|
209
|
-
tools: discovered.tools.map((t) => t.name),
|
|
210
|
-
skills: discovered.skills.map((s) => s.name),
|
|
211
|
-
hooks: discovered.hooks.map((h) => h.name),
|
|
212
|
-
channels: discovered.channels.map((c) => c.name),
|
|
213
|
-
connections: discovered.connections.map((c) => c.name),
|
|
214
|
-
schedules: discovered.schedules.map((s) => s.name),
|
|
215
|
-
subagents: discovered.subagents.map((s) => s.id)
|
|
216
|
-
},
|
|
217
|
-
session: agent.manifest.session,
|
|
218
|
-
policy: agent.manifest.policy
|
|
219
|
-
};
|
|
220
|
-
writeFileSync2(
|
|
221
|
-
join2(outDir, "manifest.json"),
|
|
222
|
-
JSON.stringify(manifest, null, 2)
|
|
223
|
-
);
|
|
224
|
-
console.log(` Written to ${outDir}/manifest.json`);
|
|
225
|
-
console.log(` Tools: ${manifest.tools.length}`);
|
|
226
|
-
console.log(` Skills: ${manifest.skills.length}`);
|
|
227
|
-
console.log(` Channels: ${manifest.channels.length}`);
|
|
228
|
-
console.log(` Connections: ${manifest.connections.length}`);
|
|
229
|
-
console.log(` Schedules: ${manifest.schedules.length}`);
|
|
230
|
-
console.log(` Subagents: ${Object.keys(manifest.subagents).length}`);
|
|
231
|
-
console.log(`
|
|
232
|
-
Done.
|
|
233
|
-
`);
|
|
234
|
-
} catch (err) {
|
|
235
|
-
console.error(` Build failed:`, err);
|
|
236
|
-
process.exit(1);
|
|
167
|
+
await program.parseAsync(input, { from: "user" });
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error instanceof CommanderError) {
|
|
170
|
+
if (error.exitCode === 0) return;
|
|
171
|
+
throw new Error(error.message);
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
237
174
|
}
|
|
238
175
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
try {
|
|
248
|
-
const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
|
|
249
|
-
version = pkg.version;
|
|
250
|
-
} catch {
|
|
251
|
-
}
|
|
252
|
-
showBanner();
|
|
253
|
-
var program = new Command();
|
|
254
|
-
program.name("arcie").description("Arcie \u2014 the electronic line, build agents at the speed of light").version(version);
|
|
255
|
-
program.command("init").description("Scaffold a new agent project").argument("[name]", "Project directory name").option("--template <name>", "Template to use (default, agent-only)", "default").action(initCommand);
|
|
256
|
-
program.command("dev").description("Run the agent locally").option("-p, --port <port>", "Port to listen on", "3000").option("--agent-dir <path>", "Path to agent directory", "agent").action(devCommand);
|
|
257
|
-
program.command("build").description("Compile the agent for production").option("--agent-dir <path>", "Path to agent directory", "agent").option("--out-dir <path>", "Output directory", ".arcie").action(buildCommand);
|
|
258
|
-
program.parse(process.argv);
|
|
176
|
+
runCli().catch((error) => {
|
|
177
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
178
|
+
console.error(message);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
});
|
|
181
|
+
export {
|
|
182
|
+
runCli
|
|
183
|
+
};
|
|
259
184
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/init.ts","../../src/cli/dev.ts","../../src/cli/banner.ts","../../src/cli/build.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { devCommand } from \"./dev\";\nimport { buildCommand } from \"./build\";\nimport { showBanner } from \"./banner\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgPath = resolve(__dirname, \"../../package.json\");\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n version = pkg.version;\n} catch {}\n\nshowBanner();\n\nconst program = new Command();\n\nprogram\n .name(\"arcie\")\n .description(\"Arcie — the electronic line, build agents at the speed of light\")\n .version(version);\n\nprogram\n .command(\"init\")\n .description(\"Scaffold a new agent project\")\n .argument(\"[name]\", \"Project directory name\")\n .option(\"--template <name>\", \"Template to use (default, agent-only)\", \"default\")\n .action(initCommand);\n\nprogram\n .command(\"dev\")\n .description(\"Run the agent locally\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"3000\")\n .option(\"--agent-dir <path>\", \"Path to agent directory\", \"agent\")\n .action(devCommand);\n\nprogram\n .command(\"build\")\n .description(\"Compile the agent for production\")\n .option(\"--agent-dir <path>\", \"Path to agent directory\", \"agent\")\n .option(\"--out-dir <path>\", \"Output directory\", \".arcie\")\n .action(buildCommand);\n\nprogram.parse(process.argv);\n","import { mkdirSync, writeFileSync, existsSync, readFileSync, readdirSync, statSync, copyFileSync } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = resolve(__dirname, \"../../templates\");\n\nexport async function initCommand(\n name: string | undefined,\n options: { template: string }\n): Promise<void> {\n const targetDir = name\n ? resolve(process.cwd(), name)\n : resolve(process.cwd(), \".\");\n\n if (existsSync(targetDir) && name) {\n console.error(`Directory already exists: ${targetDir}`);\n process.exit(1);\n }\n\n const templateDir = resolve(TEMPLATES_DIR, options.template);\n if (!existsSync(templateDir)) {\n console.error(`Template not found: ${options.template}`);\n process.exit(1);\n }\n\n console.log(`\\n Scaffolding agent in ${targetDir}...\\n`);\n\n copyTemplate(templateDir, targetDir);\n\n if (name) {\n updatePackageJson(targetDir, name);\n }\n\n console.log(` Done! Created agent in ${targetDir}`);\n console.log(`\\n Next steps:`);\n console.log(` cd ${name || \".\"}`);\n console.log(` npm install`);\n console.log(` npm run dev`);\n console.log();\n}\n\nfunction copyTemplate(src: string, dest: string): void {\n const entries = collectFiles(src);\n\n for (const entry of entries) {\n const relative = entry.replace(src, \"\").replace(/^\\//, \"\");\n const destPath = join(dest, relative);\n\n if (entry.endsWith(\".gitkeep\")) {\n const parentDir = destPath.replace(\"/.gitkeep\", \"\");\n mkdirSync(parentDir, { recursive: true });\n writeFileSync(join(parentDir, \".gitkeep\"), \"\");\n continue;\n }\n\n mkdirSync(dirname(destPath), { recursive: true });\n\n if (entry.endsWith(\".ts\") || entry.endsWith(\".md\") || entry.endsWith(\".json\")) {\n const content = readFileSync(entry, \"utf-8\");\n writeFileSync(destPath, content);\n } else {\n copyFileSync(entry, destPath);\n }\n }\n}\n\nfunction collectFiles(dir: string): string[] {\n const files: string[] = [];\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n files.push(...collectFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nfunction updatePackageJson(targetDir: string, projectName: string): void {\n const pkgPath = join(targetDir, \"package.json\");\n\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n pkg.name = projectName;\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n }\n}\n","import { createServer } from \"node:http\";\nimport { resolve } from \"node:path\";\nimport { loadAgent } from \"../loader\";\nimport { discoverAgent } from \"../discover/index\";\nimport { streamAgent } from \"../runner/index\";\nimport { showBanner } from \"./banner\";\n\nexport async function devCommand(options: {\n port: string;\n agentDir: string;\n}): Promise<void> {\n const port = parseInt(options.port, 10);\n const agentDirPath = resolve(process.cwd(), options.agentDir);\n\n showBanner();\n\n const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);\n\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics) {\n console.error(` ✖ ${d.code}: ${d.message}`);\n }\n process.exit(1);\n }\n\n for (const d of diagnostics) {\n console.warn(` ⚠ ${d.code}: ${d.message}`);\n }\n\n console.log(` Agent: ${agentDirPath}`);\n console.log(` Server: http://localhost:${port}`);\n console.log();\n\n if (discovered.agentConfig) {\n try {\n const agent = await loadAgent(agentDirPath);\n console.log(` Model: ${agent.manifest.config.model}`);\n console.log(` Tools: ${Object.keys(agent.manifest.tools).length}`);\n console.log();\n } catch {}\n }\n\n const server = createServer(async (req, res) => {\n if (req.method === \"POST\" && req.url === \"/\") {\n let body = \"\";\n for await (const chunk of req) body += chunk;\n\n try {\n const { message, stream } = JSON.parse(body);\n\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"application/x-ndjson\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n for await (const event of streamAgent(agentDirPath, message)) {\n res.write(JSON.stringify(event) + \"\\n\");\n }\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n for await (const _event of streamAgent(agentDirPath, message)) {}\n res.end(JSON.stringify({ status: \"ok\" }));\n }\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: String(err) }));\n }\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n server.listen(port, () => {\n console.log(` Listening on http://localhost:${port}`);\n console.log(` POST / with { \"message\": \"hello\" }`);\n console.log();\n });\n}\n","export function showBanner(): void {\n console.log();\n console.log(\" ╔══════════════════════════════════╗\");\n console.log(\" ║ Arcie ║\");\n console.log(\" ║ The electronic line — build ║\");\n console.log(\" ║ agents at the speed of light. ║\");\n console.log(\" ╚══════════════════════════════════╝\");\n console.log();\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { loadAgent } from \"../loader\";\nimport { discoverAgent } from \"../discover/index\";\n\nexport async function buildCommand(options: {\n agentDir: string;\n outDir: string;\n}): Promise<void> {\n const agentDirPath = resolve(process.cwd(), options.agentDir);\n const outDir = resolve(process.cwd(), options.outDir);\n\n console.log(`\\n Building agent...\\n`);\n\n if (!existsSync(agentDirPath)) {\n console.error(` Agent directory not found: ${agentDirPath}`);\n process.exit(1);\n }\n\n const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);\n\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics) {\n console.error(` ✖ ${d.code}: ${d.message}`);\n }\n process.exit(1);\n }\n\n try {\n const agent = await loadAgent(agentDirPath);\n\n mkdirSync(outDir, { recursive: true });\n\n const manifest = {\n config: agent.manifest.config,\n instructions: agent.manifest.instructions,\n tools: Object.keys(agent.manifest.tools),\n skills: Object.keys(agent.manifest.skills),\n hooks: Object.keys(agent.manifest.hooks),\n channels: Object.keys(agent.manifest.channels),\n connections: Object.keys(agent.manifest.connections),\n schedules: Object.keys(agent.manifest.schedules),\n subagents: Object.fromEntries(\n Object.entries(agent.manifest.subagents).map(([id, sub]) => [\n id,\n { description: sub.config.description, tools: Object.keys(sub.tools) },\n ])\n ),\n discovered: {\n tools: discovered.tools.map((t) => t.name),\n skills: discovered.skills.map((s) => s.name),\n hooks: discovered.hooks.map((h) => h.name),\n channels: discovered.channels.map((c) => c.name),\n connections: discovered.connections.map((c) => c.name),\n schedules: discovered.schedules.map((s) => s.name),\n subagents: discovered.subagents.map((s) => s.id),\n },\n session: agent.manifest.session,\n policy: agent.manifest.policy,\n };\n\n writeFileSync(\n join(outDir, \"manifest.json\"),\n JSON.stringify(manifest, null, 2)\n );\n\n console.log(` Written to ${outDir}/manifest.json`);\n console.log(` Tools: ${manifest.tools.length}`);\n console.log(` Skills: ${manifest.skills.length}`);\n console.log(` Channels: ${manifest.channels.length}`);\n console.log(` Connections: ${manifest.connections.length}`);\n console.log(` Schedules: ${manifest.schedules.length}`);\n console.log(` Subagents: ${Object.keys(manifest.subagents).length}`);\n console.log(`\\n Done.\\n`);\n } catch (err) {\n console.error(` Build failed:`, err);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["pkgPath","resolve","resolve","mkdirSync","writeFileSync","existsSync","resolve","join","resolve","existsSync","mkdirSync","writeFileSync","join","readFileSync","resolve","dirname","fileURLToPath","__dirname"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { resolve as resolvePath } from \"node:path\";\nimport { Command, CommanderError, InvalidArgumentError } from \"commander\";\nimport { arcieCliBanner, version } from \"./banner\";\nimport { createCliTheme, renderCliTaggedLine } from \"./ui/output\";\n\ninterface CliLogger {\n error(message: string): void;\n log(message: string): void;\n}\n\nconst DISPLAY_MODES = new Set([\"full\", \"collapsed\", \"auto-collapsed\", \"hidden\"]);\nconst STATS_MODES = new Set([\"tokens\", \"tokensPerSecond\"]);\nconst LOG_MODES = new Set([\"all\", \"stderr\", \"none\"]);\n\ntype TerminalPartDisplayMode = \"full\" | \"collapsed\" | \"auto-collapsed\" | \"hidden\";\ntype AssistantResponseStatsMode = \"tokens\" | \"tokensPerSecond\";\ntype LogDisplayMode = \"all\" | \"stderr\" | \"none\";\n\nfunction parsePortOption(value: string): number {\n if (!/^-?\\d+$/.test(value)) {\n throw new InvalidArgumentError(`Expected a numeric port, received \"${value}\".`);\n }\n const port = Number(value);\n if (port < 0 || port > 65_535) {\n throw new InvalidArgumentError(`Expected a port between 0 and 65535, received \"${value}\".`);\n }\n return port;\n}\n\nfunction parseDisplayMode(value: string): TerminalPartDisplayMode {\n if (!DISPLAY_MODES.has(value)) {\n throw new InvalidArgumentError(\n `Expected one of ${[...DISPLAY_MODES].join(\", \")}, received \"${value}\".`,\n );\n }\n return value as TerminalPartDisplayMode;\n}\n\nfunction parseStatsMode(value: string): AssistantResponseStatsMode {\n if (!STATS_MODES.has(value)) {\n throw new InvalidArgumentError(\n `Expected one of ${[...STATS_MODES].join(\", \")}, received \"${value}\".`,\n );\n }\n return value as AssistantResponseStatsMode;\n}\n\nfunction parseLogsMode(value: string): LogDisplayMode {\n if (!LOG_MODES.has(value)) {\n throw new InvalidArgumentError(\n `Expected one of ${[...LOG_MODES].join(\", \")}, received \"${value}\".`,\n );\n }\n return value as LogDisplayMode;\n}\n\nfunction parseContextSizeOption(value: string): number {\n const size = Number(value);\n if (!Number.isFinite(size) || size <= 0) {\n throw new InvalidArgumentError(`Expected a positive number, received \"${value}\".`);\n }\n return size;\n}\n\nfunction shouldPrintCliBootBanner(actionCommand: Command): boolean {\n const name = actionCommand.name();\n return name === \"info\" || name === \"dev\" || name === \"init\";\n}\n\nfunction createCliProgram(logger: CliLogger): Command {\n const program = new Command();\n const theme = createCliTheme();\n\n program\n .name(\"arcie\")\n .description(\"arcie — the electronic line, build agents at the speed of light\")\n .version(version())\n .showHelpAfterError()\n .exitOverride()\n .hook(\"preAction\", (_program, actionCommand) => {\n if (shouldPrintCliBootBanner(actionCommand)) {\n logger.log(arcieCliBanner());\n }\n })\n .configureOutput({\n writeErr: (message) => logger.error(message.trimEnd()),\n writeOut: (message) => logger.log(message.trimEnd()),\n });\n\n const channels = program\n .command(\"channels\")\n .description(\"Manage channels for the current agent (web UI, HTTP, etc.).\");\n\n channels\n .command(\"add <kind>\")\n .description(\"Scaffold a channel (currently supports: web).\")\n .option(\"--agent-dir <path>\", \"Path to agent directory\", \".\")\n .action(async (kind: string, options: { agentDir: string }) => {\n if (kind !== \"web\") {\n logger.error(`unknown channel kind: ${kind}. supported: web`);\n process.exit(1);\n }\n const agentDir = resolvePath(process.cwd(), options.agentDir);\n const { scaffoldWebChat } = await import(\"./scaffold-web-chat\");\n try {\n const result = scaffoldWebChat(agentDir);\n if (result.alreadyExisted) {\n logger.error(`channels/web already exists at ${result.targetPath}`);\n process.exit(1);\n }\n logger.log(\n renderCliTaggedLine(theme, {\n message: `scaffolded ${result.targetPath}`,\n tag: \"channels\",\n tone: \"success\",\n }),\n );\n logger.log(\n renderCliTaggedLine(theme, {\n message: \"cd into it, then: npm install && cp .env.local.example .env.local && npm run dev\",\n tag: \"next\",\n tone: \"info\",\n }),\n );\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n program\n .command(\"init [target]\")\n .description(\"Create a new arcie agent, or add one to an existing project directory.\")\n .option(\"--template <name>\", \"Template to use (default, agent-only)\", \"default\")\n .option(\"-y, --yes\", \"Accepted for compatibility; has no effect\")\n .action(async (target: string | undefined, options: { template: string; yes?: boolean }) => {\n if (options.yes) logger.error(\"warning: --yes has no effect for arcie init.\");\n const { initCommand } = await import(\"./init\");\n await initCommand(target, { template: options.template });\n });\n\n program\n .command(\"build\")\n .description(\"Compile the agent for production.\")\n .option(\"--agent-dir <path>\", \"Path to agent directory\", \"agent\")\n .option(\"--out-dir <path>\", \"Output directory\", \".arcie\")\n .action(async (options: { agentDir: string; outDir: string }) => {\n const { buildCommand } = await import(\"./build\");\n await buildCommand(options);\n logger.log(\n renderCliTaggedLine(theme, {\n message: `output at ${options.outDir}`,\n tag: \"build\",\n tone: \"success\",\n }),\n );\n });\n\n program\n .command(\"dev\")\n .description(\"Start the arcie development server or attach an interactive UI.\")\n .option(\"-p, --port <port>\", \"Port to listen on\", parsePortOption, 3000)\n .option(\"--host <host>\", \"Host interface to bind\")\n .option(\"--agent-dir <path>\", \"Path to agent directory\", \"agent\")\n .option(\"--input <text>\", \"Pre-fill the prompt input, or start onboarding with /model\")\n .option(\"--no-ui\", \"Start the server without an interactive UI\")\n .option(\"--name <name>\", \"Title shown in the terminal UI (defaults to the app folder name)\")\n .option(\n \"--tools <mode>\",\n \"How tool calls render: full | collapsed | auto-collapsed | hidden\",\n parseDisplayMode,\n )\n .option(\n \"--reasoning <mode>\",\n \"How reasoning renders: full | collapsed | auto-collapsed | hidden\",\n parseDisplayMode,\n )\n .option(\n \"--subagents <mode>\",\n \"How subagent sections render: full | collapsed | auto-collapsed | hidden\",\n parseDisplayMode,\n )\n .option(\n \"--assistant-response-stats <mode>\",\n \"Assistant header statistic: tokens | tokensPerSecond\",\n parseStatsMode,\n )\n .option(\n \"--context-size <tokens>\",\n \"Model context window size, shown as a usage percentage\",\n parseContextSizeOption,\n )\n .option(\"--logs <mode>\", \"Which logs to show: all | stderr | none\", parseLogsMode)\n .action(async (options) => {\n const { devCommand } = await import(\"./dev\");\n await devCommand({\n port: String(options.port ?? 3000),\n agentDir: options.agentDir,\n input: options.ui === false ? false : Boolean(options.input) || options.ui !== false,\n });\n });\n\n return program;\n}\n\nconst KNOWN_COMMANDS = new Set([\"channels\", \"init\", \"build\", \"dev\", \"help\"]);\n\nfunction resolveArgv(argv: readonly string[]): string[] {\n if (argv.length === 0) return [\"dev\"];\n const first = argv[0]!;\n if (first === \"-h\" || first === \"--help\" || first === \"-V\" || first === \"--version\") {\n return [...argv];\n }\n if (first.startsWith(\"-\")) return [...argv];\n if (KNOWN_COMMANDS.has(first)) return [...argv];\n // Bare positional like `arcie my-agent` — treat as `arcie init my-agent`.\n return [\"init\", ...argv];\n}\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n logger: CliLogger = console,\n): Promise<void> {\n const program = createCliProgram(logger);\n const input = resolveArgv(argv);\n\n try {\n await program.parseAsync(input, { from: \"user\" });\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return;\n throw new Error(error.message);\n }\n throw error;\n }\n}\n\nrunCli().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
package/dist/context/index.d.ts
CHANGED