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.
Files changed (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/agent/agent.d.ts +91 -0
  4. package/dist/agent/agent.js +258 -0
  5. package/dist/agent/agent.js.map +1 -0
  6. package/dist/agent/config.d.ts +49 -0
  7. package/dist/agent/config.js +58 -0
  8. package/dist/agent/config.js.map +1 -0
  9. package/dist/agent/persona.d.ts +39 -0
  10. package/dist/agent/persona.js +81 -0
  11. package/dist/agent/persona.js.map +1 -0
  12. package/dist/agents/registry.d.ts +21 -0
  13. package/dist/agents/registry.js +51 -0
  14. package/dist/agents/registry.js.map +1 -0
  15. package/dist/cli/approve.d.ts +17 -0
  16. package/dist/cli/approve.js +50 -0
  17. package/dist/cli/approve.js.map +1 -0
  18. package/dist/cli/chat.d.ts +16 -0
  19. package/dist/cli/chat.js +148 -0
  20. package/dist/cli/chat.js.map +1 -0
  21. package/dist/cli/demo.d.ts +7 -0
  22. package/dist/cli/demo.js +82 -0
  23. package/dist/cli/demo.js.map +1 -0
  24. package/dist/cli/init.d.ts +17 -0
  25. package/dist/cli/init.js +89 -0
  26. package/dist/cli/init.js.map +1 -0
  27. package/dist/cli/live.d.ts +10 -0
  28. package/dist/cli/live.js +109 -0
  29. package/dist/cli/live.js.map +1 -0
  30. package/dist/cli/offline.d.ts +23 -0
  31. package/dist/cli/offline.js +236 -0
  32. package/dist/cli/offline.js.map +1 -0
  33. package/dist/cli/probe.d.ts +23 -0
  34. package/dist/cli/probe.js +140 -0
  35. package/dist/cli/probe.js.map +1 -0
  36. package/dist/cli/render.d.ts +15 -0
  37. package/dist/cli/render.js +50 -0
  38. package/dist/cli/render.js.map +1 -0
  39. package/dist/cli/tui.d.ts +101 -0
  40. package/dist/cli/tui.js +334 -0
  41. package/dist/cli/tui.js.map +1 -0
  42. package/dist/config/index.d.ts +33 -0
  43. package/dist/config/index.js +48 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/connectors/connector.d.ts +58 -0
  46. package/dist/connectors/connector.js +30 -0
  47. package/dist/connectors/connector.js.map +1 -0
  48. package/dist/connectors/email/email-connector.d.ts +43 -0
  49. package/dist/connectors/email/email-connector.js +364 -0
  50. package/dist/connectors/email/email-connector.js.map +1 -0
  51. package/dist/connectors/github/github-connector.d.ts +52 -0
  52. package/dist/connectors/github/github-connector.js +271 -0
  53. package/dist/connectors/github/github-connector.js.map +1 -0
  54. package/dist/connectors/http.d.ts +34 -0
  55. package/dist/connectors/http.js +78 -0
  56. package/dist/connectors/http.js.map +1 -0
  57. package/dist/connectors/index.d.ts +34 -0
  58. package/dist/connectors/index.js +86 -0
  59. package/dist/connectors/index.js.map +1 -0
  60. package/dist/connectors/notion/notion-connector.d.ts +45 -0
  61. package/dist/connectors/notion/notion-connector.js +222 -0
  62. package/dist/connectors/notion/notion-connector.js.map +1 -0
  63. package/dist/connectors/slack/slack-connector.d.ts +43 -0
  64. package/dist/connectors/slack/slack-connector.js +291 -0
  65. package/dist/connectors/slack/slack-connector.js.map +1 -0
  66. package/dist/core/errors.d.ts +36 -0
  67. package/dist/core/errors.js +40 -0
  68. package/dist/core/errors.js.map +1 -0
  69. package/dist/core/logger.d.ts +14 -0
  70. package/dist/core/logger.js +44 -0
  71. package/dist/core/logger.js.map +1 -0
  72. package/dist/core/run-log.d.ts +37 -0
  73. package/dist/core/run-log.js +37 -0
  74. package/dist/core/run-log.js.map +1 -0
  75. package/dist/core/usage.d.ts +22 -0
  76. package/dist/core/usage.js +58 -0
  77. package/dist/core/usage.js.map +1 -0
  78. package/dist/dashboard/data.d.ts +62 -0
  79. package/dist/dashboard/data.js +84 -0
  80. package/dist/dashboard/data.js.map +1 -0
  81. package/dist/dashboard/page.d.ts +9 -0
  82. package/dist/dashboard/page.js +421 -0
  83. package/dist/dashboard/page.js.map +1 -0
  84. package/dist/dashboard/server.d.ts +19 -0
  85. package/dist/dashboard/server.js +44 -0
  86. package/dist/dashboard/server.js.map +1 -0
  87. package/dist/demo/bootstrap.d.ts +25 -0
  88. package/dist/demo/bootstrap.js +60 -0
  89. package/dist/demo/bootstrap.js.map +1 -0
  90. package/dist/demo/claude.d.ts +31 -0
  91. package/dist/demo/claude.js +230 -0
  92. package/dist/demo/claude.js.map +1 -0
  93. package/dist/demo/demo-connector.d.ts +19 -0
  94. package/dist/demo/demo-connector.js +168 -0
  95. package/dist/demo/demo-connector.js.map +1 -0
  96. package/dist/demo/world.d.ts +60 -0
  97. package/dist/demo/world.js +117 -0
  98. package/dist/demo/world.js.map +1 -0
  99. package/dist/index.d.ts +2 -0
  100. package/dist/index.js +396 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/ingest/ingest.d.ts +63 -0
  103. package/dist/ingest/ingest.js +258 -0
  104. package/dist/ingest/ingest.js.map +1 -0
  105. package/dist/llm/claude.d.ts +97 -0
  106. package/dist/llm/claude.js +163 -0
  107. package/dist/llm/claude.js.map +1 -0
  108. package/dist/memory/compaction.d.ts +22 -0
  109. package/dist/memory/compaction.js +79 -0
  110. package/dist/memory/compaction.js.map +1 -0
  111. package/dist/memory/file-store.d.ts +28 -0
  112. package/dist/memory/file-store.js +110 -0
  113. package/dist/memory/file-store.js.map +1 -0
  114. package/dist/memory/store.d.ts +32 -0
  115. package/dist/memory/store.js +2 -0
  116. package/dist/memory/store.js.map +1 -0
  117. package/dist/orchestrator/orchestrator.d.ts +63 -0
  118. package/dist/orchestrator/orchestrator.js +181 -0
  119. package/dist/orchestrator/orchestrator.js.map +1 -0
  120. package/dist/orchestrator/scheduler.d.ts +33 -0
  121. package/dist/orchestrator/scheduler.js +67 -0
  122. package/dist/orchestrator/scheduler.js.map +1 -0
  123. package/dist/orchestrator/seen-events.d.ts +21 -0
  124. package/dist/orchestrator/seen-events.js +71 -0
  125. package/dist/orchestrator/seen-events.js.map +1 -0
  126. package/dist/plugins/apply.d.ts +9 -0
  127. package/dist/plugins/apply.js +17 -0
  128. package/dist/plugins/apply.js.map +1 -0
  129. package/dist/plugins/define.d.ts +29 -0
  130. package/dist/plugins/define.js +30 -0
  131. package/dist/plugins/define.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +31 -0
  133. package/dist/plugins/loader.js +61 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/plugins/scaffold.d.ts +5 -0
  136. package/dist/plugins/scaffold.js +72 -0
  137. package/dist/plugins/scaffold.js.map +1 -0
  138. package/dist/tools/builtin.d.ts +8 -0
  139. package/dist/tools/builtin.js +63 -0
  140. package/dist/tools/builtin.js.map +1 -0
  141. package/dist/tools/tool.d.ts +84 -0
  142. package/dist/tools/tool.js +70 -0
  143. package/dist/tools/tool.js.map +1 -0
  144. package/dist/ui/agent-view.test.d.ts +1 -0
  145. package/dist/ui/agent-view.test.js +54 -0
  146. package/dist/ui/agent-view.test.js.map +1 -0
  147. package/dist/ui/agents-data.d.ts +7 -0
  148. package/dist/ui/agents-data.js +25 -0
  149. package/dist/ui/agents-data.js.map +1 -0
  150. package/dist/ui/app.d.ts +24 -0
  151. package/dist/ui/app.js +59 -0
  152. package/dist/ui/app.js.map +1 -0
  153. package/dist/ui/app.test.d.ts +1 -0
  154. package/dist/ui/app.test.js +47 -0
  155. package/dist/ui/app.test.js.map +1 -0
  156. package/dist/ui/components/key-hints.d.ts +4 -0
  157. package/dist/ui/components/key-hints.js +6 -0
  158. package/dist/ui/components/key-hints.js.map +1 -0
  159. package/dist/ui/components/menu.d.ts +11 -0
  160. package/dist/ui/components/menu.js +20 -0
  161. package/dist/ui/components/menu.js.map +1 -0
  162. package/dist/ui/create-wizard.test.d.ts +1 -0
  163. package/dist/ui/create-wizard.test.js +58 -0
  164. package/dist/ui/create-wizard.test.js.map +1 -0
  165. package/dist/ui/doctor-data.d.ts +6 -0
  166. package/dist/ui/doctor-data.js +29 -0
  167. package/dist/ui/doctor-data.js.map +1 -0
  168. package/dist/ui/history-data.d.ts +2 -0
  169. package/dist/ui/history-data.js +18 -0
  170. package/dist/ui/history-data.js.map +1 -0
  171. package/dist/ui/screens/agent.d.ts +8 -0
  172. package/dist/ui/screens/agent.js +95 -0
  173. package/dist/ui/screens/agent.js.map +1 -0
  174. package/dist/ui/screens/agents.d.ts +7 -0
  175. package/dist/ui/screens/agents.js +47 -0
  176. package/dist/ui/screens/agents.js.map +1 -0
  177. package/dist/ui/screens/create.d.ts +7 -0
  178. package/dist/ui/screens/create.js +141 -0
  179. package/dist/ui/screens/create.js.map +1 -0
  180. package/dist/ui/screens/doctor.d.ts +5 -0
  181. package/dist/ui/screens/doctor.js +13 -0
  182. package/dist/ui/screens/doctor.js.map +1 -0
  183. package/dist/ui/screens/history.d.ts +7 -0
  184. package/dist/ui/screens/history.js +50 -0
  185. package/dist/ui/screens/history.js.map +1 -0
  186. package/dist/ui/screens/home.d.ts +8 -0
  187. package/dist/ui/screens/home.js +35 -0
  188. package/dist/ui/screens/home.js.map +1 -0
  189. package/dist/ui/screens/plugins.d.ts +7 -0
  190. package/dist/ui/screens/plugins.js +40 -0
  191. package/dist/ui/screens/plugins.js.map +1 -0
  192. package/dist/ui/services.d.ts +33 -0
  193. package/dist/ui/services.js +67 -0
  194. package/dist/ui/services.js.map +1 -0
  195. package/dist/ui/start.d.ts +1 -0
  196. package/dist/ui/start.js +16 -0
  197. package/dist/ui/start.js.map +1 -0
  198. package/dist/ui/theme.d.ts +6 -0
  199. package/dist/ui/theme.js +26 -0
  200. package/dist/ui/theme.js.map +1 -0
  201. 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 {};