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
@@ -0,0 +1,82 @@
1
+ import { stdout } from "node:process";
2
+ import { Stage, playBanner, progressBar, flashLine } from "./tui.js";
3
+ import { liveRunHooks } from "./live.js";
4
+ import { bold, dim } from "./render.js";
5
+ import { usageLine } from "./render.js";
6
+ /**
7
+ * `exempclaw demo` — replays a scripted agent session through the real
8
+ * animation pipeline (the same Stage + hooks chat uses), so you can preview
9
+ * the TUI without an API key or credentials. Also handy for testing terminal
10
+ * compatibility.
11
+ */
12
+ export async function runDemo() {
13
+ const stage = new Stage();
14
+ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, stage.isAnimated ? ms : 0));
15
+ await playBanner("succession ledger · animation demo");
16
+ stdout.write(`${dim("a scripted replay — no API calls, no credentials, nothing leaves this terminal")}\n\n`);
17
+ stdout.write(`${bold("you ›")} Jordan, anything from Initech overnight?\n`);
18
+ const live = liveRunHooks(stage, "Jordan");
19
+ const h = live.hooks;
20
+ // turn 1: the agent thinks, signals a phase, fans out two reads
21
+ h.onTurnStart?.(1);
22
+ await wait(1400);
23
+ h.onStatus?.("searching", "combing the inbox for Initech traffic");
24
+ await wait(1300);
25
+ h.onToolStart?.("email_search", { from: "initech", sinceDays: 1 });
26
+ h.onToolStart?.("slack_read_channel", { channel: "#initech-account" });
27
+ await wait(1500);
28
+ h.onToolEnd?.("email_search", true);
29
+ await wait(500);
30
+ h.onToolEnd?.("slack_read_channel", true);
31
+ // turn 2: reading the thread it found
32
+ h.onTurnStart?.(2);
33
+ await wait(900);
34
+ h.onStatus?.("reading", "Ana's reply about the webhook retries");
35
+ h.onToolStart?.("email_read_message", { uid: 4711 });
36
+ await wait(1600);
37
+ h.onToolEnd?.("email_read_message", true);
38
+ // turn 3: drafting + sending (outward)
39
+ h.onTurnStart?.(3);
40
+ await wait(800);
41
+ h.onStatus?.("writing", "drafting a reply in Alex's voice");
42
+ await wait(1700);
43
+ h.onStatus?.("sending", "reply to ana.flores@initech.example");
44
+ h.onToolStart?.("email_send", { to: ["ana.flores@initech.example"], subject: "Re: webhook retries" });
45
+ await wait(1400);
46
+ h.onToolEnd?.("email_send", true);
47
+ // turn 4: the answer streams, then a small celebration
48
+ h.onTurnStart?.(4);
49
+ await wait(700);
50
+ const reply = "One thing came in overnight: Ana confirmed the staging fix looks good and asked when it ships to prod. " +
51
+ "I replied that we'll confirm the production date today and looped Marcus in on the renewal question. " +
52
+ "I also noted her volume-pricing ask in memory for the September renewal.";
53
+ for (const word of reply.split(" ")) {
54
+ h.onText?.(`${word} `);
55
+ await wait(26);
56
+ }
57
+ h.onText?.("\n");
58
+ h.onStatus?.("celebrating", "thread handled end to end");
59
+ await wait(1900);
60
+ live.finish();
61
+ stdout.write(`\n${usageLine({ inputTokens: 18432, outputTokens: 612, cacheReadTokens: 15210, cacheWriteTokens: 980, turns: 4 }, 0.18, 4)}\n`);
62
+ // the rest of the menagerie, for terminals and taste-testing
63
+ stdout.write(`\n${dim("other moments you'll see around the CLI:")}\n`);
64
+ await flashLine(`email.received ${dim("(<m4@initech>)")} → ${bold("jordan-support-lead")}`);
65
+ stage.addRow("ingest", {
66
+ anim: "reading",
67
+ icon: "▥",
68
+ label: "distilling handoff-notes.md",
69
+ hint: `${progressBar(2, 5)} 3/5`,
70
+ });
71
+ await wait(1500);
72
+ stage.settleRow("ingest", { label: "distilled archive" });
73
+ stage.addRow("waiting", { anim: "waiting", icon: "≋", label: "waiting on IMAP IDLE" });
74
+ await wait(1300);
75
+ stage.removeRow("waiting");
76
+ stage.addRow("alert", { anim: "alert", icon: "≋", label: "billing dispute over $500 — needs a human", color: "red" });
77
+ await wait(1600);
78
+ stage.settleRow("alert", { mark: "▲", color: "red" });
79
+ stage.stopAll();
80
+ stdout.write(`\n${dim("that's the tour — now drive it yourself, still with no API key:")} ${bold("exempclaw demo chat")}\n`);
81
+ }
82
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface InitFlags {
2
+ id?: string;
3
+ name?: string;
4
+ role?: string;
5
+ succeeds?: string;
6
+ tone?: string;
7
+ guidance?: string;
8
+ disclosure?: string;
9
+ connectors?: string;
10
+ force?: boolean;
11
+ yes?: boolean;
12
+ }
13
+ /**
14
+ * Scaffolds an agent config JSON. Values can come from flags; anything
15
+ * missing is prompted for interactively (unless --yes, which takes defaults).
16
+ */
17
+ export declare function runInit(path: string, flags: InitFlags): Promise<void>;
@@ -0,0 +1,89 @@
1
+ import { mkdir, stat, writeFile } from "node:fs/promises";
2
+ import { basename, dirname } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { stdin, stdout } from "node:process";
5
+ import { availableConnectorIds } from "../connectors/index.js";
6
+ import { AgentConfigSchema } from "../agent/config.js";
7
+ import { ConfigError } from "../core/errors.js";
8
+ import { dim } from "./render.js";
9
+ /**
10
+ * Scaffolds an agent config JSON. Values can come from flags; anything
11
+ * missing is prompted for interactively (unless --yes, which takes defaults).
12
+ */
13
+ export async function runInit(path, flags) {
14
+ if (!flags.force) {
15
+ const exists = await stat(path).then(() => true, () => false);
16
+ if (exists)
17
+ throw new ConfigError(`${path} already exists (use --force to overwrite)`);
18
+ }
19
+ const rl = createInterface({ input: stdin, output: stdout });
20
+ const ask = async (label, fallback, required = false) => {
21
+ if (flags.yes)
22
+ return fallback ?? "";
23
+ for (;;) {
24
+ const suffix = fallback ? ` ${dim(`(${fallback})`)}` : required ? ` ${dim("(required)")}` : ` ${dim("(optional)")}`;
25
+ const answer = (await rl.question(`${label}${suffix}: `)).trim();
26
+ if (answer)
27
+ return answer;
28
+ if (fallback !== undefined)
29
+ return fallback;
30
+ if (!required)
31
+ return "";
32
+ stdout.write(dim(" this field is required\n"));
33
+ }
34
+ };
35
+ try {
36
+ const defaultId = basename(path)
37
+ .replace(/\.json$/i, "")
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9-]+/g, "-");
40
+ const id = flags.id ?? (await ask("agent id", defaultId));
41
+ const name = flags.name ?? (await ask("persona name (the agent's own identity)", undefined, true));
42
+ const role = flags.role ?? (await ask("role it takes over", undefined, true));
43
+ const succeeds = flags.succeeds ?? (await ask("who it succeeds (the departed employee)"));
44
+ const tone = flags.tone ?? (await ask("tone", "professional, concise, helpful"));
45
+ const guidance = flags.guidance ?? (await ask("extra guidance"));
46
+ const disclosure = flags.disclosure ??
47
+ (await ask(`disclosure ${dim("transparent | on_request | opaque")}`, "transparent"));
48
+ const known = availableConnectorIds();
49
+ const connectorsRaw = flags.connectors ?? (await ask(`connectors ${dim(`any of: ${known.join(", ")}`)}`, ""));
50
+ const connectors = connectorsRaw
51
+ .split(",")
52
+ .map((c) => c.trim())
53
+ .filter(Boolean);
54
+ for (const c of connectors) {
55
+ if (!known.includes(c))
56
+ throw new ConfigError(`unknown connector "${c}" (available: ${known.join(", ")})`);
57
+ }
58
+ const config = {
59
+ id,
60
+ persona: {
61
+ name,
62
+ role,
63
+ ...(succeeds ? { succeeds } : {}),
64
+ tone,
65
+ ...(guidance ? { guidance } : {}),
66
+ disclosure,
67
+ },
68
+ effort: "high",
69
+ connectors,
70
+ maxIterations: 25,
71
+ };
72
+ const parsed = AgentConfigSchema.safeParse(config);
73
+ if (!parsed.success) {
74
+ const issues = parsed.error.issues.map((i) => ` - ${i.path.join(".")}: ${i.message}`).join("\n");
75
+ throw new ConfigError(`invalid agent config:\n${issues}`);
76
+ }
77
+ await mkdir(dirname(path), { recursive: true });
78
+ await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, "utf8");
79
+ stdout.write(`\nWrote ${path}\n`);
80
+ stdout.write(dim(`Try it: npm run dev -- chat ${path}\n`));
81
+ if (connectors.length > 0) {
82
+ stdout.write(dim(`Connector credentials needed — check: npm run dev -- connectors\n`));
83
+ }
84
+ }
85
+ finally {
86
+ rl.close();
87
+ }
88
+ }
89
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RunHooks } from "../agent/agent.js";
2
+ import { Stage } from "./tui.js";
3
+ export interface LiveRun {
4
+ hooks: RunHooks;
5
+ /** Clear any leftover rows once the dispatch settles. */
6
+ finish(opts?: {
7
+ interrupted?: boolean;
8
+ }): void;
9
+ }
10
+ export declare function liveRunHooks(stage: Stage, speaker: string): LiveRun;
@@ -0,0 +1,109 @@
1
+ import { toolIcon } from "./tui.js";
2
+ /**
3
+ * Wires an agent run's hooks to the animation stage:
4
+ *
5
+ * - a thinking spinner while the model reasons (with elapsed time),
6
+ * - streamed text printed above the live region,
7
+ * - one animated row per in-flight tool call, settling ✓/✗ with duration,
8
+ * - the agent's own display_status signals as expressive activity rows,
9
+ * - "celebrating" plays a short burst and settles on its own.
10
+ */
11
+ const STATUS_ANIMS = {
12
+ thinking: "thinking",
13
+ searching: "searching",
14
+ reading: "reading",
15
+ writing: "writing",
16
+ sending: "sending",
17
+ waiting: "waiting",
18
+ celebrating: "celebrating",
19
+ alert: "alert",
20
+ };
21
+ export function liveRunHooks(stage, speaker) {
22
+ let toolSeq = 0;
23
+ const activeToolRows = new Map(); // tool name → row-id stack
24
+ let sawTextThisTurn = false;
25
+ let celebrationTimer;
26
+ const dropThinkingRow = () => stage.removeRow("turn");
27
+ const hooks = {
28
+ onTurnStart(iteration) {
29
+ sawTextThisTurn = false;
30
+ stage.addRow("turn", {
31
+ anim: "thinking",
32
+ label: iteration === 1 ? `${speaker} is thinking` : `${speaker} is thinking it over`,
33
+ color: "amber",
34
+ });
35
+ },
36
+ onText(delta) {
37
+ if (!sawTextThisTurn) {
38
+ sawTextThisTurn = true;
39
+ dropThinkingRow();
40
+ }
41
+ stage.write(delta);
42
+ },
43
+ onToolStart(name, input) {
44
+ dropThinkingRow();
45
+ const rowId = `tool:${name}:${++toolSeq}`;
46
+ const stack = activeToolRows.get(name) ?? [];
47
+ stack.push(rowId);
48
+ activeToolRows.set(name, stack);
49
+ stage.addRow(rowId, {
50
+ anim: "tool",
51
+ icon: toolIcon(name),
52
+ label: name,
53
+ hint: previewInput(input),
54
+ });
55
+ },
56
+ onToolEnd(name, ok, detail) {
57
+ const stack = activeToolRows.get(name);
58
+ const rowId = stack?.shift();
59
+ if (!rowId)
60
+ return;
61
+ stage.settleRow(rowId, {
62
+ mark: ok ? "✓" : "✗",
63
+ color: ok ? "green" : "red",
64
+ ...(detail && !ok ? { suffix: `— ${detail}` } : {}),
65
+ });
66
+ },
67
+ onStatus(activity, message) {
68
+ if (celebrationTimer) {
69
+ clearTimeout(celebrationTimer);
70
+ celebrationTimer = undefined;
71
+ }
72
+ stage.addRow("status", {
73
+ anim: STATUS_ANIMS[activity],
74
+ icon: "≋",
75
+ label: message,
76
+ color: activity === "alert" ? "red" : "amber",
77
+ });
78
+ if (activity === "celebrating") {
79
+ celebrationTimer = setTimeout(() => {
80
+ stage.settleRow("status", { mark: "✦", color: "amber" });
81
+ }, 1600);
82
+ celebrationTimer.unref?.();
83
+ }
84
+ },
85
+ };
86
+ return {
87
+ hooks,
88
+ finish(opts = {}) {
89
+ if (celebrationTimer)
90
+ clearTimeout(celebrationTimer);
91
+ if (opts.interrupted) {
92
+ stage.print("");
93
+ }
94
+ stage.stopAll();
95
+ },
96
+ };
97
+ }
98
+ function previewInput(input) {
99
+ try {
100
+ const json = JSON.stringify(input);
101
+ if (!json || json === "{}")
102
+ return "";
103
+ return json.length > 60 ? `${json.slice(0, 60)}…` : json;
104
+ }
105
+ catch {
106
+ return "";
107
+ }
108
+ }
109
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/cli/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CLI commands that work on local state only (no Anthropic key required,
3
+ * except doctor's optional API ping).
4
+ */
5
+ export declare function runMemory(agentConfigPath: string, opts: {
6
+ search?: string;
7
+ add?: string;
8
+ tags?: string;
9
+ rm?: string;
10
+ limit: string;
11
+ }): Promise<void>;
12
+ export declare function runHistory(agentConfigPath: string, opts: {
13
+ limit: string;
14
+ clear?: boolean;
15
+ force?: boolean;
16
+ }): Promise<void>;
17
+ export declare function runCosts(opts: {
18
+ agent?: string;
19
+ }): Promise<void>;
20
+ export declare function runConnectors(): void;
21
+ export declare function runDoctor(opts?: {
22
+ probe?: boolean;
23
+ }): Promise<void>;
@@ -0,0 +1,236 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { stdin, stdout } from "node:process";
5
+ import { loadOfflineConfig } from "../config/index.js";
6
+ import { createLogger } from "../core/logger.js";
7
+ import { RunLog } from "../core/run-log.js";
8
+ import { addTotals, emptyUsage, estimateCostUsd, formatUsd } from "../core/usage.js";
9
+ import { FileMemoryStore } from "../memory/file-store.js";
10
+ import { loadAgentConfig } from "../agent/config.js";
11
+ import { connectorStatuses, createConnector } from "../connectors/index.js";
12
+ import { ClaudeClient } from "../llm/claude.js";
13
+ import { bold, cyan, dim, fail, formatTokens, ok, table, warn } from "./render.js";
14
+ import { Stage, toolIcon } from "./tui.js";
15
+ import { PROBES } from "./probe.js";
16
+ /**
17
+ * CLI commands that work on local state only (no Anthropic key required,
18
+ * except doctor's optional API ping).
19
+ */
20
+ export async function runMemory(agentConfigPath, opts) {
21
+ const config = loadOfflineConfig();
22
+ const agent = await loadAgentConfig(agentConfigPath);
23
+ const store = new FileMemoryStore(config.dataDir, agent.id);
24
+ const limit = Number(opts.limit);
25
+ if (opts.add) {
26
+ const entry = await store.addMemory({
27
+ text: opts.add,
28
+ source: "operator",
29
+ tags: (opts.tags ?? "").split(",").map((t) => t.trim()).filter(Boolean),
30
+ });
31
+ stdout.write(`Stored ${entry.id}\n`);
32
+ return;
33
+ }
34
+ if (opts.rm) {
35
+ const removed = await store.removeMemory(opts.rm);
36
+ stdout.write(removed ? `Removed ${opts.rm}\n` : `No memory matching "${opts.rm}"\n`);
37
+ return;
38
+ }
39
+ const memories = opts.search ? await store.searchMemory(opts.search, limit) : (await store.allMemories()).slice(-limit);
40
+ if (memories.length === 0) {
41
+ stdout.write(opts.search ? "No matching memories.\n" : "No memories yet. Run `ingest` or let the agent remember things.\n");
42
+ return;
43
+ }
44
+ for (const m of memories) {
45
+ stdout.write(`${dim(m.id.slice(0, 8))} ${cyan(`[${m.source}]`)} ${m.text}${m.tags.length ? ` ${dim(m.tags.map((t) => `#${t}`).join(" "))}` : ""}\n`);
46
+ }
47
+ stdout.write(dim(`\n${memories.length} shown · agent ${agent.id}\n`));
48
+ }
49
+ export async function runHistory(agentConfigPath, opts) {
50
+ const config = loadOfflineConfig();
51
+ const agent = await loadAgentConfig(agentConfigPath);
52
+ const store = new FileMemoryStore(config.dataDir, agent.id);
53
+ if (opts.clear) {
54
+ if (!opts.force) {
55
+ const rl = createInterface({ input: stdin, output: stdout });
56
+ try {
57
+ const answer = (await rl.question(`Clear conversation history for ${agent.id}? [y/N] `)).trim().toLowerCase();
58
+ if (answer !== "y" && answer !== "yes") {
59
+ stdout.write("Aborted.\n");
60
+ return;
61
+ }
62
+ }
63
+ finally {
64
+ rl.close();
65
+ }
66
+ }
67
+ await store.clearHistory();
68
+ stdout.write(`History cleared for ${agent.id} (memories kept).\n`);
69
+ return;
70
+ }
71
+ const messages = await store.loadHistory();
72
+ if (messages.length === 0) {
73
+ stdout.write("No history yet.\n");
74
+ return;
75
+ }
76
+ const recent = messages.slice(-Number(opts.limit));
77
+ for (const msg of recent) {
78
+ stdout.write(`${renderHistoryMessage(msg)}\n`);
79
+ }
80
+ stdout.write(dim(`\n${recent.length} of ${messages.length} messages · agent ${agent.id}\n`));
81
+ }
82
+ function renderHistoryMessage(msg) {
83
+ const tag = msg.role === "user" ? cyan("user ›") : bold("agent ›");
84
+ if (typeof msg.content === "string")
85
+ return `${tag} ${truncate(msg.content, 500)}`;
86
+ const parts = [];
87
+ for (const block of msg.content) {
88
+ if (block.type === "text")
89
+ parts.push(truncate(block.text, 500));
90
+ else if (block.type === "tool_use")
91
+ parts.push(dim(`⚙ ${block.name}(${truncate(JSON.stringify(block.input), 120)})`));
92
+ else if (block.type === "tool_result") {
93
+ const body = typeof block.content === "string" ? block.content : "[blocks]";
94
+ parts.push(dim(`↳ ${block.is_error ? "error: " : ""}${truncate(body, 200)}`));
95
+ }
96
+ }
97
+ return `${tag} ${parts.filter(Boolean).join("\n ")}`;
98
+ }
99
+ export async function runCosts(opts) {
100
+ const config = loadOfflineConfig();
101
+ let agentIds;
102
+ try {
103
+ agentIds = (await readdir(join(config.dataDir, "agents"), { withFileTypes: true }))
104
+ .filter((e) => e.isDirectory())
105
+ .map((e) => e.name);
106
+ }
107
+ catch {
108
+ stdout.write("No agent data yet.\n");
109
+ return;
110
+ }
111
+ if (opts.agent)
112
+ agentIds = agentIds.filter((id) => id === opts.agent);
113
+ if (agentIds.length === 0) {
114
+ stdout.write("No matching agents.\n");
115
+ return;
116
+ }
117
+ const rows = [[bold("agent"), bold("runs"), bold("in"), bold("out"), bold("cached"), bold("est. cost")]];
118
+ let grandTotal = 0;
119
+ let anyCost = false;
120
+ for (const agentId of agentIds.sort()) {
121
+ const records = await new RunLog(config.dataDir, agentId).readAll();
122
+ if (records.length === 0)
123
+ continue;
124
+ let usage = emptyUsage();
125
+ let cost = 0;
126
+ let hasCost = false;
127
+ for (const record of records) {
128
+ usage = addTotals(usage, record.usage);
129
+ const recordCost = record.costUsd ?? estimateCostUsd(record.model, record.usage);
130
+ if (recordCost !== null) {
131
+ cost += recordCost;
132
+ hasCost = true;
133
+ }
134
+ }
135
+ if (hasCost) {
136
+ grandTotal += cost;
137
+ anyCost = true;
138
+ }
139
+ rows.push([
140
+ agentId,
141
+ String(records.length),
142
+ formatTokens(usage.inputTokens),
143
+ formatTokens(usage.outputTokens),
144
+ formatTokens(usage.cacheReadTokens),
145
+ hasCost ? formatUsd(cost) : "n/a",
146
+ ]);
147
+ }
148
+ if (rows.length === 1) {
149
+ stdout.write("No runs recorded yet.\n");
150
+ return;
151
+ }
152
+ stdout.write(`${table(rows)}\n`);
153
+ if (anyCost)
154
+ stdout.write(`\n${bold("total")} ${formatUsd(grandTotal)}\n`);
155
+ stdout.write(dim("Estimates from public per-token prices; cache reads billed at ~0.1x input.\n"));
156
+ }
157
+ export function runConnectors() {
158
+ const statuses = connectorStatuses();
159
+ for (const status of statuses) {
160
+ stdout.write(`${status.configured ? ok(bold(status.id)) : fail(bold(status.id))} ${dim(status.description)}\n`);
161
+ for (const key of status.envKeys) {
162
+ const mark = key.set ? ok(key.env) : key.required ? fail(key.env) : warn(key.env);
163
+ stdout.write(` ${mark}${key.required ? "" : dim(" (optional)")}${key.note ? dim(` — ${key.note}`) : ""}\n`);
164
+ }
165
+ }
166
+ stdout.write(dim("\nA connector is usable when all its required vars are set.\n"));
167
+ }
168
+ export async function runDoctor(opts = {}) {
169
+ const probeEnabled = opts.probe ?? true;
170
+ const stage = new Stage();
171
+ let failed = false;
172
+ const major = Number(process.versions.node.split(".")[0]);
173
+ if (major >= 22)
174
+ stage.print(`${ok(`node ${process.versions.node}`)}\n`);
175
+ else {
176
+ stage.print(`${fail(`node ${process.versions.node} — Exempclaw needs >= 22 (built-in WebSocket)`)}\n`);
177
+ failed = true;
178
+ }
179
+ const config = loadOfflineConfig();
180
+ stage.print(`${ok(`data dir: ${config.dataDir}`)}\n`);
181
+ stage.print(`${ok(`default model: ${config.defaultModel} · action policy: ${config.actionPolicy}`)}\n`);
182
+ // Anthropic API + connector probes run in parallel, each as a live row.
183
+ const checks = [];
184
+ if (!config.anthropicApiKey) {
185
+ stage.print(`${fail("ANTHROPIC_API_KEY is not set — agents cannot run (see .env.example)")}\n`);
186
+ failed = true;
187
+ }
188
+ else {
189
+ stage.addRow("api", { anim: "thinking", icon: "◈", label: "Anthropic API" });
190
+ const claude = new ClaudeClient(config.anthropicApiKey, config.defaultModel, createLogger("error"));
191
+ checks.push(claude.ping().then((model) => stage.settleRow("api", { suffix: dim(`${model.displayName} (${model.id})`) }), (err) => {
192
+ failed = true;
193
+ stage.settleRow("api", { mark: "✗", color: "red", suffix: dim(err.message) });
194
+ }));
195
+ }
196
+ for (const status of connectorStatuses()) {
197
+ if (!status.configured) {
198
+ const missing = status.envKeys.filter((k) => k.required && !k.set).map((k) => k.env);
199
+ stage.print(`${warn(`connector ${status.id}: not configured (missing ${missing.join(", ")})`)}\n`);
200
+ continue;
201
+ }
202
+ if (!probeEnabled) {
203
+ stage.print(`${ok(`connector ${status.id}: credentials present (probe skipped)`)}\n`);
204
+ continue;
205
+ }
206
+ const prober = PROBES[status.id];
207
+ if (!prober)
208
+ continue;
209
+ const rowId = `probe:${status.id}`;
210
+ stage.addRow(rowId, { anim: "searching", icon: toolIcon(`${status.id}_`), label: `probing ${status.id}` });
211
+ const { config: connectorConfig } = createConnector(status.id);
212
+ checks.push(prober(connectorConfig).then((result) => {
213
+ if (result.ok) {
214
+ stage.settleRow(rowId, { label: `connector ${status.id}`, suffix: dim(result.detail) });
215
+ }
216
+ else {
217
+ failed = true;
218
+ stage.settleRow(rowId, {
219
+ mark: "✗",
220
+ color: "red",
221
+ label: `connector ${status.id}`,
222
+ suffix: dim(result.detail),
223
+ });
224
+ }
225
+ }));
226
+ }
227
+ await Promise.all(checks);
228
+ stage.stopAll();
229
+ if (failed)
230
+ process.exitCode = 1;
231
+ }
232
+ function truncate(text, max) {
233
+ const flat = text.replace(/\s+/g, " ").trim();
234
+ return flat.length > max ? `${flat.slice(0, max)}…` : flat;
235
+ }
236
+ //# sourceMappingURL=offline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/cli/offline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ImapFlow } from "imapflow";
2
+ import { createTransport } from "nodemailer";
3
+ import { type FetchLike } from "../connectors/http.js";
4
+ /**
5
+ * Live connectivity probes for `exempclaw doctor`. Each probe actually
6
+ * authenticates against the upstream service (read-only) and reports what it
7
+ * found. Transports are injectable for tests.
8
+ */
9
+ export interface ProbeResult {
10
+ ok: boolean;
11
+ detail: string;
12
+ }
13
+ export declare function probeSlack(config: Record<string, string>, fetchImpl?: FetchLike): Promise<ProbeResult>;
14
+ export declare function probeNotion(config: Record<string, string>, fetchImpl?: FetchLike): Promise<ProbeResult>;
15
+ export declare function probeGitHub(config: Record<string, string>, fetchImpl?: FetchLike): Promise<ProbeResult>;
16
+ export interface EmailProbeTransports {
17
+ imapFactory?: (opts: ConstructorParameters<typeof ImapFlow>[0]) => Pick<ImapFlow, "connect" | "logout">;
18
+ smtpFactory?: typeof createTransport;
19
+ }
20
+ export declare function probeEmail(config: Record<string, string>, transports?: EmailProbeTransports): Promise<ProbeResult>;
21
+ export type Prober = (config: Record<string, string>) => Promise<ProbeResult>;
22
+ /** Probe per connector id; consumed by `doctor`. */
23
+ export declare const PROBES: Record<string, Prober>;