exempclaw 0.4.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 +306 -0
- package/dist/agent/agent.d.ts +91 -0
- package/dist/agent/agent.js +258 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/config.d.ts +49 -0
- package/dist/agent/config.js +58 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/persona.d.ts +39 -0
- package/dist/agent/persona.js +81 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agents/registry.d.ts +21 -0
- package/dist/agents/registry.js +51 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/cli/approve.d.ts +17 -0
- package/dist/cli/approve.js +50 -0
- package/dist/cli/approve.js.map +1 -0
- package/dist/cli/chat.d.ts +16 -0
- package/dist/cli/chat.js +148 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/demo.d.ts +7 -0
- package/dist/cli/demo.js +82 -0
- package/dist/cli/demo.js.map +1 -0
- package/dist/cli/init.d.ts +17 -0
- package/dist/cli/init.js +89 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/live.d.ts +10 -0
- package/dist/cli/live.js +109 -0
- package/dist/cli/live.js.map +1 -0
- package/dist/cli/offline.d.ts +23 -0
- package/dist/cli/offline.js +236 -0
- package/dist/cli/offline.js.map +1 -0
- package/dist/cli/probe.d.ts +23 -0
- package/dist/cli/probe.js +140 -0
- package/dist/cli/probe.js.map +1 -0
- package/dist/cli/render.d.ts +15 -0
- package/dist/cli/render.js +50 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/tui.d.ts +101 -0
- package/dist/cli/tui.js +334 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/index.d.ts +33 -0
- package/dist/config/index.js +48 -0
- package/dist/config/index.js.map +1 -0
- package/dist/connectors/connector.d.ts +58 -0
- package/dist/connectors/connector.js +30 -0
- package/dist/connectors/connector.js.map +1 -0
- package/dist/connectors/email/email-connector.d.ts +43 -0
- package/dist/connectors/email/email-connector.js +364 -0
- package/dist/connectors/email/email-connector.js.map +1 -0
- package/dist/connectors/github/github-connector.d.ts +52 -0
- package/dist/connectors/github/github-connector.js +271 -0
- package/dist/connectors/github/github-connector.js.map +1 -0
- package/dist/connectors/http.d.ts +34 -0
- package/dist/connectors/http.js +78 -0
- package/dist/connectors/http.js.map +1 -0
- package/dist/connectors/index.d.ts +34 -0
- package/dist/connectors/index.js +86 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/notion/notion-connector.d.ts +45 -0
- package/dist/connectors/notion/notion-connector.js +222 -0
- package/dist/connectors/notion/notion-connector.js.map +1 -0
- package/dist/connectors/slack/slack-connector.d.ts +43 -0
- package/dist/connectors/slack/slack-connector.js +291 -0
- package/dist/connectors/slack/slack-connector.js.map +1 -0
- package/dist/core/errors.d.ts +36 -0
- package/dist/core/errors.js +40 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +14 -0
- package/dist/core/logger.js +44 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/run-log.d.ts +37 -0
- package/dist/core/run-log.js +37 -0
- package/dist/core/run-log.js.map +1 -0
- package/dist/core/usage.d.ts +22 -0
- package/dist/core/usage.js +58 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/dashboard/data.d.ts +62 -0
- package/dist/dashboard/data.js +84 -0
- package/dist/dashboard/data.js.map +1 -0
- package/dist/dashboard/page.d.ts +9 -0
- package/dist/dashboard/page.js +421 -0
- package/dist/dashboard/page.js.map +1 -0
- package/dist/dashboard/server.d.ts +19 -0
- package/dist/dashboard/server.js +44 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/demo/bootstrap.d.ts +25 -0
- package/dist/demo/bootstrap.js +60 -0
- package/dist/demo/bootstrap.js.map +1 -0
- package/dist/demo/claude.d.ts +31 -0
- package/dist/demo/claude.js +230 -0
- package/dist/demo/claude.js.map +1 -0
- package/dist/demo/demo-connector.d.ts +19 -0
- package/dist/demo/demo-connector.js +168 -0
- package/dist/demo/demo-connector.js.map +1 -0
- package/dist/demo/world.d.ts +60 -0
- package/dist/demo/world.js +117 -0
- package/dist/demo/world.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +396 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/ingest.d.ts +63 -0
- package/dist/ingest/ingest.js +258 -0
- package/dist/ingest/ingest.js.map +1 -0
- package/dist/llm/claude.d.ts +97 -0
- package/dist/llm/claude.js +163 -0
- package/dist/llm/claude.js.map +1 -0
- package/dist/memory/compaction.d.ts +22 -0
- package/dist/memory/compaction.js +79 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/file-store.d.ts +28 -0
- package/dist/memory/file-store.js +110 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/store.d.ts +32 -0
- package/dist/memory/store.js +2 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +63 -0
- package/dist/orchestrator/orchestrator.js +181 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +33 -0
- package/dist/orchestrator/scheduler.js +67 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/orchestrator/seen-events.d.ts +21 -0
- package/dist/orchestrator/seen-events.js +71 -0
- package/dist/orchestrator/seen-events.js.map +1 -0
- package/dist/plugins/apply.d.ts +9 -0
- package/dist/plugins/apply.js +17 -0
- package/dist/plugins/apply.js.map +1 -0
- package/dist/plugins/define.d.ts +29 -0
- package/dist/plugins/define.js +30 -0
- package/dist/plugins/define.js.map +1 -0
- package/dist/plugins/loader.d.ts +31 -0
- package/dist/plugins/loader.js +61 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/scaffold.d.ts +5 -0
- package/dist/plugins/scaffold.js +72 -0
- package/dist/plugins/scaffold.js.map +1 -0
- package/dist/tools/builtin.d.ts +8 -0
- package/dist/tools/builtin.js +63 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/tool.d.ts +84 -0
- package/dist/tools/tool.js +70 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/ui/agent-view.test.d.ts +1 -0
- package/dist/ui/agent-view.test.js +54 -0
- package/dist/ui/agent-view.test.js.map +1 -0
- package/dist/ui/agents-data.d.ts +7 -0
- package/dist/ui/agents-data.js +25 -0
- package/dist/ui/agents-data.js.map +1 -0
- package/dist/ui/app.d.ts +24 -0
- package/dist/ui/app.js +59 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/app.test.d.ts +1 -0
- package/dist/ui/app.test.js +47 -0
- package/dist/ui/app.test.js.map +1 -0
- package/dist/ui/components/key-hints.d.ts +4 -0
- package/dist/ui/components/key-hints.js +6 -0
- package/dist/ui/components/key-hints.js.map +1 -0
- package/dist/ui/components/menu.d.ts +11 -0
- package/dist/ui/components/menu.js +20 -0
- package/dist/ui/components/menu.js.map +1 -0
- package/dist/ui/create-wizard.test.d.ts +1 -0
- package/dist/ui/create-wizard.test.js +58 -0
- package/dist/ui/create-wizard.test.js.map +1 -0
- package/dist/ui/doctor-data.d.ts +6 -0
- package/dist/ui/doctor-data.js +29 -0
- package/dist/ui/doctor-data.js.map +1 -0
- package/dist/ui/history-data.d.ts +2 -0
- package/dist/ui/history-data.js +18 -0
- package/dist/ui/history-data.js.map +1 -0
- package/dist/ui/screens/agent.d.ts +8 -0
- package/dist/ui/screens/agent.js +95 -0
- package/dist/ui/screens/agent.js.map +1 -0
- package/dist/ui/screens/agents.d.ts +7 -0
- package/dist/ui/screens/agents.js +47 -0
- package/dist/ui/screens/agents.js.map +1 -0
- package/dist/ui/screens/create.d.ts +7 -0
- package/dist/ui/screens/create.js +141 -0
- package/dist/ui/screens/create.js.map +1 -0
- package/dist/ui/screens/doctor.d.ts +5 -0
- package/dist/ui/screens/doctor.js +13 -0
- package/dist/ui/screens/doctor.js.map +1 -0
- package/dist/ui/screens/history.d.ts +7 -0
- package/dist/ui/screens/history.js +50 -0
- package/dist/ui/screens/history.js.map +1 -0
- package/dist/ui/screens/home.d.ts +8 -0
- package/dist/ui/screens/home.js +35 -0
- package/dist/ui/screens/home.js.map +1 -0
- package/dist/ui/screens/plugins.d.ts +7 -0
- package/dist/ui/screens/plugins.js +40 -0
- package/dist/ui/screens/plugins.js.map +1 -0
- package/dist/ui/services.d.ts +33 -0
- package/dist/ui/services.js +67 -0
- package/dist/ui/services.js.map +1 -0
- package/dist/ui/start.d.ts +1 -0
- package/dist/ui/start.js +16 -0
- package/dist/ui/start.js.map +1 -0
- package/dist/ui/theme.d.ts +6 -0
- package/dist/ui/theme.js +26 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +69 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { stdout } from "node:process";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { loadConfig, loadOfflineConfig, ActionPolicy } from "./config/index.js";
|
|
5
|
+
import { createLogger } from "./core/logger.js";
|
|
6
|
+
import { ExempclawError } from "./core/errors.js";
|
|
7
|
+
import { estimateCostUsd } from "./core/usage.js";
|
|
8
|
+
import { loadAgentConfig } from "./agent/config.js";
|
|
9
|
+
import { Orchestrator } from "./orchestrator/orchestrator.js";
|
|
10
|
+
import { FileMemoryStore } from "./memory/file-store.js";
|
|
11
|
+
import { ClaudeClient } from "./llm/claude.js";
|
|
12
|
+
import { ingestArchive } from "./ingest/ingest.js";
|
|
13
|
+
import { startDashboard } from "./dashboard/server.js";
|
|
14
|
+
import { createTerminalApprover } from "./cli/approve.js";
|
|
15
|
+
import { bold, cyan, dim, usageLine } from "./cli/render.js";
|
|
16
|
+
import { Stage, flashLine, progressBar } from "./cli/tui.js";
|
|
17
|
+
import { liveRunHooks } from "./cli/live.js";
|
|
18
|
+
import { runChatSession } from "./cli/chat.js";
|
|
19
|
+
import { runInit } from "./cli/init.js";
|
|
20
|
+
import { runDemo } from "./cli/demo.js";
|
|
21
|
+
import { bootstrapDemo } from "./demo/bootstrap.js";
|
|
22
|
+
import { runConnectors, runCosts, runDoctor, runHistory, runMemory } from "./cli/offline.js";
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name("exempclaw")
|
|
26
|
+
.description("Build and run Claude-powered agents from a friendly terminal menu. Run with no arguments to open it.")
|
|
27
|
+
.version("0.4.0");
|
|
28
|
+
program
|
|
29
|
+
.command("init")
|
|
30
|
+
.description("Scaffold a new agent config JSON (interactive unless flags cover it).")
|
|
31
|
+
.argument("<path>", "where to write the agent config, e.g. agents/sam.json")
|
|
32
|
+
.option("--id <id>")
|
|
33
|
+
.option("--name <name>", "persona name")
|
|
34
|
+
.option("--role <role>", "role being taken over")
|
|
35
|
+
.option("--succeeds <person>", "the departed employee")
|
|
36
|
+
.option("--tone <tone>")
|
|
37
|
+
.option("--guidance <text>")
|
|
38
|
+
.option("--disclosure <mode>", "transparent | on_request | opaque")
|
|
39
|
+
.option("--connectors <ids>", "comma-separated, e.g. email,slack")
|
|
40
|
+
.option("--force", "overwrite if the file exists")
|
|
41
|
+
.option("--yes", "non-interactive; use defaults for anything not flagged")
|
|
42
|
+
.action(async (path, flags) => {
|
|
43
|
+
await runInit(path, flags);
|
|
44
|
+
});
|
|
45
|
+
program
|
|
46
|
+
.command("run")
|
|
47
|
+
.description("Run a single agent on one input and print the result.")
|
|
48
|
+
.argument("<agentConfig>", "path to an agent config JSON file")
|
|
49
|
+
.argument("<input>", "the message / instruction to give the agent")
|
|
50
|
+
.option("--policy <policy>", "override outward-action policy: ask | auto | deny")
|
|
51
|
+
.option("--json", "print the full run result as JSON (disables animations)")
|
|
52
|
+
.action(async (agentConfigPath, input, opts) => {
|
|
53
|
+
const stage = new Stage({ tty: opts.json ? false : undefined });
|
|
54
|
+
const animate = !opts.json && stage.isAnimated;
|
|
55
|
+
const { orchestrator, agentId, name } = await bootstrapSingleAgent(agentConfigPath, opts.policy, stage);
|
|
56
|
+
const running = new AbortController();
|
|
57
|
+
const onSigint = () => running.abort();
|
|
58
|
+
process.on("SIGINT", onSigint);
|
|
59
|
+
try {
|
|
60
|
+
const live = animate ? liveRunHooks(stage, name) : undefined;
|
|
61
|
+
const result = await orchestrator.dispatch(agentId, input, {
|
|
62
|
+
trigger: { kind: "cli", detail: "run" },
|
|
63
|
+
...(live ? { hooks: live.hooks } : {}),
|
|
64
|
+
signal: running.signal,
|
|
65
|
+
});
|
|
66
|
+
live?.finish({ interrupted: result.stopReason === "interrupted" });
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
69
|
+
}
|
|
70
|
+
else if (animate) {
|
|
71
|
+
// text already streamed above the live region
|
|
72
|
+
stdout.write(`\n${usageLine(result.usage, result.costUsd, result.iterations)}\n`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
stdout.write(`\n${result.text}\n`);
|
|
76
|
+
stdout.write(`${usageLine(result.usage, result.costUsd, result.iterations)}\n`);
|
|
77
|
+
}
|
|
78
|
+
if (result.stopReason === "interrupted")
|
|
79
|
+
process.exitCode = 130;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
process.removeListener("SIGINT", onSigint);
|
|
83
|
+
stage.stopAll();
|
|
84
|
+
await orchestrator.shutdown();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
program
|
|
88
|
+
.command("chat")
|
|
89
|
+
.description("Open an interactive REPL with a single agent (streams live, animated).")
|
|
90
|
+
.argument("<agentConfig>", "path to an agent config JSON file")
|
|
91
|
+
.option("--policy <policy>", "override outward-action policy: ask | auto | deny")
|
|
92
|
+
.action(async (agentConfigPath, opts) => {
|
|
93
|
+
const stage = new Stage();
|
|
94
|
+
const { orchestrator, agentId, name, model } = await bootstrapSingleAgent(agentConfigPath, opts.policy, stage);
|
|
95
|
+
try {
|
|
96
|
+
await runChatSession({ orchestrator, agentId, name, model, stage });
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
await orchestrator.shutdown();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
program
|
|
103
|
+
.command("start")
|
|
104
|
+
.description("Load one or more agents and run the fleet: listen for events, fire schedules.")
|
|
105
|
+
.argument("<agentConfigs...>", "paths to agent config JSON files")
|
|
106
|
+
.option("--policy <policy>", "override outward-action policy: ask | auto | deny")
|
|
107
|
+
.action(async (paths, opts) => {
|
|
108
|
+
const config = applyPolicyOverride(loadConfig(), opts.policy);
|
|
109
|
+
const log = createLogger(config.logLevel);
|
|
110
|
+
const orchestrator = new Orchestrator(config, log, createTerminalApprover());
|
|
111
|
+
for (const path of paths) {
|
|
112
|
+
const cfg = await loadAgentConfig(path);
|
|
113
|
+
await orchestrator.addAgent(cfg);
|
|
114
|
+
}
|
|
115
|
+
// One-shot flash per inbound event; serialized so bursts don't interleave.
|
|
116
|
+
let flashQueue = Promise.resolve();
|
|
117
|
+
orchestrator.onInboundEvent = (agentId, event) => {
|
|
118
|
+
flashQueue = flashQueue.then(() => flashLine(`${event.type} ${dim(`(${event.threadId})`)} → ${bold(agentId)}`));
|
|
119
|
+
};
|
|
120
|
+
const stop = () => {
|
|
121
|
+
void orchestrator.shutdown().then(() => process.exit(0));
|
|
122
|
+
};
|
|
123
|
+
process.on("SIGINT", stop);
|
|
124
|
+
process.on("SIGTERM", stop);
|
|
125
|
+
await orchestrator.start();
|
|
126
|
+
});
|
|
127
|
+
program
|
|
128
|
+
.command("ingest")
|
|
129
|
+
.description("Onboarding pass: distill a directory of exported work artifacts into agent memory.")
|
|
130
|
+
.argument("<agentConfig>", "path to an agent config JSON file")
|
|
131
|
+
.argument("<dir>", "directory of exported files (.txt, .md, .eml, .json, …)")
|
|
132
|
+
.option("--model <model>", "model to use for distillation (defaults to the agent's model)")
|
|
133
|
+
.option("--max-chunks <n>", "cap distillation calls to bound cost", "60")
|
|
134
|
+
.option("--no-briefing", "skip the final role-briefing synthesis")
|
|
135
|
+
.action(async (agentConfigPath, dir, opts) => {
|
|
136
|
+
const config = loadConfig();
|
|
137
|
+
const log = createLogger(config.logLevel);
|
|
138
|
+
const agentCfg = await loadAgentConfig(agentConfigPath);
|
|
139
|
+
const memory = new FileMemoryStore(config.dataDir, agentCfg.id);
|
|
140
|
+
const claude = new ClaudeClient(config.anthropicApiKey, config.defaultModel, log);
|
|
141
|
+
const model = opts.model ?? agentCfg.model ?? config.defaultModel;
|
|
142
|
+
const stage = new Stage();
|
|
143
|
+
stage.print(`Ingesting ${dir} for agent ${bold(agentCfg.id)} ${dim(`(model ${model})`)}\n`);
|
|
144
|
+
stage.addRow("scan", { anim: "searching", icon: "◇", label: "scanning archive" });
|
|
145
|
+
const result = await ingestArchive({
|
|
146
|
+
dir,
|
|
147
|
+
persona: agentCfg.persona,
|
|
148
|
+
memory,
|
|
149
|
+
claude,
|
|
150
|
+
model,
|
|
151
|
+
log,
|
|
152
|
+
maxChunks: Number(opts.maxChunks),
|
|
153
|
+
briefing: opts.briefing,
|
|
154
|
+
onProgress: (event) => {
|
|
155
|
+
switch (event.phase) {
|
|
156
|
+
case "scanned":
|
|
157
|
+
stage.settleRow("scan", {
|
|
158
|
+
label: "scanned archive",
|
|
159
|
+
suffix: dim(`${event.files} file(s)${event.skipped ? `, ${event.skipped} skipped` : ""}`),
|
|
160
|
+
});
|
|
161
|
+
break;
|
|
162
|
+
case "chunk":
|
|
163
|
+
stage.addRow("distill", {
|
|
164
|
+
anim: "reading",
|
|
165
|
+
icon: "▥",
|
|
166
|
+
label: `distilling ${event.files[0] ?? ""}${event.files.length > 1 ? ` +${event.files.length - 1}` : ""}`,
|
|
167
|
+
hint: `${progressBar(event.index - 1, event.total)} ${event.index}/${event.total}`,
|
|
168
|
+
});
|
|
169
|
+
break;
|
|
170
|
+
case "briefing":
|
|
171
|
+
stage.settleRow("distill", { label: "distilled archive" });
|
|
172
|
+
stage.addRow("brief", { anim: "writing", icon: "✎", label: "synthesizing role briefing" });
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
stage.settleRow("distill", { label: "distilled archive" });
|
|
178
|
+
stage.settleRow("brief", { label: "role briefing ready" });
|
|
179
|
+
stage.stopAll();
|
|
180
|
+
stdout.write(`\nIngested ${result.files} file(s) in ${result.chunks} chunk(s) → ${bold(String(result.memoriesAdded))} memories.\n`);
|
|
181
|
+
if (result.skippedFiles.length > 0) {
|
|
182
|
+
stdout.write(dim(`Skipped: ${result.skippedFiles.slice(0, 10).join(", ")}${result.skippedFiles.length > 10 ? "…" : ""}\n`));
|
|
183
|
+
}
|
|
184
|
+
if (result.briefing) {
|
|
185
|
+
stdout.write(`\n${bold("Role briefing")}\n${result.briefing}\n`);
|
|
186
|
+
}
|
|
187
|
+
stdout.write(`${usageLine(result.usage, estimateCostUsd(model, result.usage), result.usage.turns)}\n`);
|
|
188
|
+
});
|
|
189
|
+
program
|
|
190
|
+
.command("memory")
|
|
191
|
+
.description("Inspect or edit an agent's durable memory.")
|
|
192
|
+
.argument("<agentConfig>", "path to an agent config JSON file")
|
|
193
|
+
.option("--search <query>", "keyword search instead of listing recent")
|
|
194
|
+
.option("--add <text>", "store a memory as the operator")
|
|
195
|
+
.option("--tags <tags>", "comma-separated tags for --add")
|
|
196
|
+
.option("--rm <id>", "remove a memory by id (or id prefix)")
|
|
197
|
+
.option("--limit <n>", "how many to show", "20")
|
|
198
|
+
.action(runMemory);
|
|
199
|
+
program
|
|
200
|
+
.command("history")
|
|
201
|
+
.description("Show (or clear) an agent's conversation history.")
|
|
202
|
+
.argument("<agentConfig>", "path to an agent config JSON file")
|
|
203
|
+
.option("--limit <n>", "how many messages to show", "20")
|
|
204
|
+
.option("--clear", "delete the conversation history (memories are kept)")
|
|
205
|
+
.option("--force", "skip the confirmation prompt for --clear")
|
|
206
|
+
.action(runHistory);
|
|
207
|
+
program
|
|
208
|
+
.command("costs")
|
|
209
|
+
.description("Token usage and estimated spend per agent, from the run log.")
|
|
210
|
+
.option("--agent <id>", "limit to one agent id")
|
|
211
|
+
.action(runCosts);
|
|
212
|
+
program
|
|
213
|
+
.command("connectors")
|
|
214
|
+
.description("List connectors and whether their credentials are configured.")
|
|
215
|
+
.action(runConnectors);
|
|
216
|
+
program
|
|
217
|
+
.command("dashboard")
|
|
218
|
+
.description("Serve the local read-only fleet dashboard (runs, approvals, costs, memory).")
|
|
219
|
+
.argument("[agentConfigs...]", "agent config JSONs to enrich the view with persona details")
|
|
220
|
+
.option("--port <n>", "port to listen on (127.0.0.1 only)", "4177")
|
|
221
|
+
.action(async (paths, opts) => {
|
|
222
|
+
const config = loadOfflineConfig();
|
|
223
|
+
const log = createLogger(config.logLevel);
|
|
224
|
+
const metas = new Map();
|
|
225
|
+
for (const path of paths) {
|
|
226
|
+
const cfg = await loadAgentConfig(path);
|
|
227
|
+
metas.set(cfg.id, {
|
|
228
|
+
persona: cfg.persona,
|
|
229
|
+
model: cfg.model ?? config.defaultModel,
|
|
230
|
+
connectors: cfg.connectors,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
const { url } = await startDashboard({ dataDir: config.dataDir, port: Number(opts.port), metas, log });
|
|
234
|
+
stdout.write(`${bold("Succession Ledger")} serving at ${cyan(url)}\n`);
|
|
235
|
+
stdout.write(dim(`data dir: ${config.dataDir} · ${metas.size} dossier(s) enriched · Ctrl-C to stop\n`));
|
|
236
|
+
await new Promise(() => undefined); // run until killed
|
|
237
|
+
});
|
|
238
|
+
program
|
|
239
|
+
.command("doctor")
|
|
240
|
+
.description("Check the environment: Node, API key, and live connector probes.")
|
|
241
|
+
.option("--no-probe", "skip live connectivity probes (credential presence only)")
|
|
242
|
+
.action((opts) => runDoctor({ probe: opts.probe }));
|
|
243
|
+
const plugin = program.command("plugin").description("Manage plugins (~/.exempclaw/plugins).");
|
|
244
|
+
plugin
|
|
245
|
+
.command("create <name>")
|
|
246
|
+
.description("Scaffold a new plugin folder with a working example tool.")
|
|
247
|
+
.action(async (name) => {
|
|
248
|
+
const { scaffoldPlugin } = await import("./plugins/scaffold.js");
|
|
249
|
+
const { defaultPluginsDir } = await import("./plugins/loader.js");
|
|
250
|
+
const dir = await scaffoldPlugin(defaultPluginsDir(), name);
|
|
251
|
+
stdout.write(`Created ${bold(dir)}\nEdit ${dir}/index.js, then run ${cyan("exempclaw")} → Plugins to see it loaded.\n`);
|
|
252
|
+
});
|
|
253
|
+
plugin
|
|
254
|
+
.command("list")
|
|
255
|
+
.description("List discovered plugins and any load errors.")
|
|
256
|
+
.action(async () => {
|
|
257
|
+
const { loadPlugins, defaultPluginsDir } = await import("./plugins/loader.js");
|
|
258
|
+
const result = await loadPlugins();
|
|
259
|
+
stdout.write(dim(`plugins dir: ${defaultPluginsDir()}\n`));
|
|
260
|
+
if (result.plugins.length === 0 && result.failures.length === 0) {
|
|
261
|
+
stdout.write("No plugins installed. Try: exempclaw plugin create my-plugin\n");
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
for (const p of result.plugins) {
|
|
265
|
+
const provides = [
|
|
266
|
+
p.spec.tools?.length ? `${p.spec.tools.length} tool(s)` : "",
|
|
267
|
+
p.spec.connectors?.length ? `${p.spec.connectors.length} connector(s)` : "",
|
|
268
|
+
].filter(Boolean).join(", ");
|
|
269
|
+
stdout.write(`✓ ${bold(p.manifest.name)} ${p.manifest.version} ${dim(provides || "nothing exported")}\n`);
|
|
270
|
+
}
|
|
271
|
+
for (const f of result.failures) {
|
|
272
|
+
stdout.write(`✗ ${bold(f.name)} ${dim(f.error)}\n`);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
program
|
|
276
|
+
.command("ui")
|
|
277
|
+
.description("Open the full-screen fleet UI (the same thing bare `exempclaw` does).")
|
|
278
|
+
.action(async () => {
|
|
279
|
+
const { startUi } = await import("./ui/start.js");
|
|
280
|
+
await startUi();
|
|
281
|
+
});
|
|
282
|
+
const demo = program
|
|
283
|
+
.command("demo")
|
|
284
|
+
.description("Try Exempclaw with no API key: an animated tour, or a fully interactive offline demo.")
|
|
285
|
+
.action(runDemo); // bare `exempclaw demo` plays the animated tour
|
|
286
|
+
demo
|
|
287
|
+
.command("chat")
|
|
288
|
+
.description("Interactive offline demo: a scripted brain + fictional Initech workspace, real runtime.")
|
|
289
|
+
.option("--policy <policy>", "outward-action policy for the demo: ask | auto | deny (default ask)")
|
|
290
|
+
.action(async (opts) => {
|
|
291
|
+
const stage = new Stage();
|
|
292
|
+
const policy = opts.policy ? parsePolicy(opts.policy) : undefined;
|
|
293
|
+
const { orchestrator, agentId, name, model } = await bootstrapDemo({
|
|
294
|
+
policy,
|
|
295
|
+
approve: createTerminalApprover(stage),
|
|
296
|
+
});
|
|
297
|
+
try {
|
|
298
|
+
await runChatSession({
|
|
299
|
+
orchestrator,
|
|
300
|
+
agentId,
|
|
301
|
+
name,
|
|
302
|
+
model,
|
|
303
|
+
stage,
|
|
304
|
+
notice: "offline demo — scripted brain, fictional Initech inbox, $0.00 spend; the approval prompts and memory are the real thing",
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
await orchestrator.shutdown();
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
demo
|
|
312
|
+
.command("run <input>")
|
|
313
|
+
.description("One-shot offline demo run (try: \"Anything from Initech overnight?\").")
|
|
314
|
+
.option("--policy <policy>", "outward-action policy: ask | auto | deny (default ask)")
|
|
315
|
+
.option("--json", "print the full run result as JSON (disables animations)")
|
|
316
|
+
.action(async (input, opts) => {
|
|
317
|
+
const stage = new Stage({ tty: opts.json ? false : undefined });
|
|
318
|
+
const animate = !opts.json && stage.isAnimated;
|
|
319
|
+
const policy = opts.policy ? parsePolicy(opts.policy) : undefined;
|
|
320
|
+
const { orchestrator, agentId, name } = await bootstrapDemo({
|
|
321
|
+
policy,
|
|
322
|
+
approve: createTerminalApprover(stage),
|
|
323
|
+
});
|
|
324
|
+
try {
|
|
325
|
+
const live = animate ? liveRunHooks(stage, name) : undefined;
|
|
326
|
+
const result = await orchestrator.dispatch(agentId, input, {
|
|
327
|
+
trigger: { kind: "cli", detail: "demo run" },
|
|
328
|
+
...(live ? { hooks: live.hooks } : {}),
|
|
329
|
+
});
|
|
330
|
+
live?.finish();
|
|
331
|
+
if (opts.json) {
|
|
332
|
+
stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
333
|
+
}
|
|
334
|
+
else if (animate) {
|
|
335
|
+
stdout.write(`\n${usageLine(result.usage, result.costUsd, result.iterations)}\n`);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
stdout.write(`\n${result.text}\n`);
|
|
339
|
+
stdout.write(`${usageLine(result.usage, result.costUsd, result.iterations)}\n`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
finally {
|
|
343
|
+
stage.stopAll();
|
|
344
|
+
await orchestrator.shutdown();
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
async function bootstrapSingleAgent(agentConfigPath, policyOverride, stage) {
|
|
348
|
+
const config = applyPolicyOverride(loadConfig(), policyOverride);
|
|
349
|
+
const log = createLogger(config.logLevel);
|
|
350
|
+
const orchestrator = new Orchestrator(config, log, createTerminalApprover(stage));
|
|
351
|
+
const cfg = await loadAgentConfig(agentConfigPath);
|
|
352
|
+
await orchestrator.addAgent(cfg);
|
|
353
|
+
return {
|
|
354
|
+
orchestrator,
|
|
355
|
+
agentId: cfg.id,
|
|
356
|
+
name: cfg.persona.name,
|
|
357
|
+
model: cfg.model ?? config.defaultModel,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
function parsePolicy(policy) {
|
|
361
|
+
const parsed = ActionPolicy.safeParse(policy);
|
|
362
|
+
if (!parsed.success) {
|
|
363
|
+
throw new ExempclawError(`invalid --policy "${policy}" (use ask, auto, or deny)`);
|
|
364
|
+
}
|
|
365
|
+
return parsed.data;
|
|
366
|
+
}
|
|
367
|
+
function applyPolicyOverride(config, policy) {
|
|
368
|
+
if (!policy)
|
|
369
|
+
return config;
|
|
370
|
+
return { ...config, actionPolicy: parsePolicy(policy) };
|
|
371
|
+
}
|
|
372
|
+
async function main() {
|
|
373
|
+
// Bare `exempclaw` opens the fleet UI — but only with a real interactive
|
|
374
|
+
// terminal. ink needs raw-mode stdin; without a TTY (pipes, CI) fall back to
|
|
375
|
+
// help text instead of crashing on setRawMode.
|
|
376
|
+
if (process.argv.slice(2).length === 0) {
|
|
377
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
378
|
+
const { startUi } = await import("./ui/start.js");
|
|
379
|
+
await startUi();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
program.outputHelp();
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
await program.parseAsync();
|
|
386
|
+
}
|
|
387
|
+
main().catch((err) => {
|
|
388
|
+
if (err instanceof ExempclawError) {
|
|
389
|
+
process.stderr.write(`\n✖ ${err.message}\n`);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
process.stderr.write(`\n✖ Unexpected error: ${err.stack ?? String(err)}\n`);
|
|
393
|
+
}
|
|
394
|
+
process.exit(1);
|
|
395
|
+
});
|
|
396
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ClaudeClient } from "../llm/claude.js";
|
|
2
|
+
import type { Logger } from "../core/logger.js";
|
|
3
|
+
import { type UsageTotals } from "../core/usage.js";
|
|
4
|
+
import type { MemoryStore } from "../memory/store.js";
|
|
5
|
+
import type { Persona } from "../agent/persona.js";
|
|
6
|
+
/** Structured progress events for the CLI's animated rendering. */
|
|
7
|
+
export type IngestProgress = {
|
|
8
|
+
phase: "scanned";
|
|
9
|
+
files: number;
|
|
10
|
+
skipped: number;
|
|
11
|
+
} | {
|
|
12
|
+
phase: "chunk";
|
|
13
|
+
index: number;
|
|
14
|
+
total: number;
|
|
15
|
+
files: string[];
|
|
16
|
+
} | {
|
|
17
|
+
phase: "briefing";
|
|
18
|
+
};
|
|
19
|
+
/** The slice of ClaudeClient ingestion needs (substitutable in tests). */
|
|
20
|
+
export type IngestClaude = Pick<ClaudeClient, "extract" | "summarize">;
|
|
21
|
+
export interface IngestOptions {
|
|
22
|
+
dir: string;
|
|
23
|
+
persona: Persona;
|
|
24
|
+
memory: MemoryStore;
|
|
25
|
+
claude: IngestClaude;
|
|
26
|
+
model?: string;
|
|
27
|
+
log: Logger;
|
|
28
|
+
/** Skip files larger than this. Default 512 KiB. */
|
|
29
|
+
maxFileBytes?: number;
|
|
30
|
+
/** Target characters per distillation call. Default 24000. */
|
|
31
|
+
chunkChars?: number;
|
|
32
|
+
/** Upper bound on distillation calls, to bound cost. Default 60. */
|
|
33
|
+
maxChunks?: number;
|
|
34
|
+
/** Also synthesize a role briefing from the distilled memories. Default true. */
|
|
35
|
+
briefing?: boolean;
|
|
36
|
+
onProgress?: (event: IngestProgress) => void;
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}
|
|
39
|
+
export interface IngestResult {
|
|
40
|
+
files: number;
|
|
41
|
+
chunks: number;
|
|
42
|
+
memoriesAdded: number;
|
|
43
|
+
skippedFiles: string[];
|
|
44
|
+
briefing?: string;
|
|
45
|
+
usage: UsageTotals;
|
|
46
|
+
}
|
|
47
|
+
interface SourceFile {
|
|
48
|
+
path: string;
|
|
49
|
+
text: string;
|
|
50
|
+
}
|
|
51
|
+
interface Chunk {
|
|
52
|
+
text: string;
|
|
53
|
+
files: string[];
|
|
54
|
+
}
|
|
55
|
+
export declare function ingestArchive(opts: IngestOptions): Promise<IngestResult>;
|
|
56
|
+
/** Recursively collects readable text files, skipping junk and oversized files. */
|
|
57
|
+
export declare function collectFiles(dir: string, maxFileBytes: number): Promise<{
|
|
58
|
+
files: SourceFile[];
|
|
59
|
+
skipped: string[];
|
|
60
|
+
}>;
|
|
61
|
+
/** Greedily packs files into chunks; oversized files split on paragraphs. */
|
|
62
|
+
export declare function chunkFiles(files: SourceFile[], chunkChars: number): Chunk[];
|
|
63
|
+
export {};
|