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 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ /** A recurring input fed to the agent on a timer, e.g. a daily standup. */
3
+ export declare const ScheduleSchema: z.ZodObject<{
4
+ every: z.ZodOptional<z.ZodString>;
5
+ dailyAt: z.ZodOptional<z.ZodString>;
6
+ input: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export type Schedule = z.infer<typeof ScheduleSchema>;
9
+ /**
10
+ * On-disk description of a single agent. One JSON file per agent (see
11
+ * examples/agents). The orchestrator loads these to spin up agents.
12
+ */
13
+ export declare const AgentConfigSchema: z.ZodObject<{
14
+ id: z.ZodString;
15
+ persona: z.ZodObject<{
16
+ name: z.ZodString;
17
+ role: z.ZodString;
18
+ succeeds: z.ZodOptional<z.ZodString>;
19
+ tone: z.ZodDefault<z.ZodString>;
20
+ guidance: z.ZodDefault<z.ZodString>;
21
+ disclosure: z.ZodDefault<z.ZodEnum<{
22
+ transparent: "transparent";
23
+ on_request: "on_request";
24
+ opaque: "opaque";
25
+ }>>;
26
+ }, z.core.$strip>;
27
+ model: z.ZodOptional<z.ZodString>;
28
+ effort: z.ZodOptional<z.ZodEnum<{
29
+ low: "low";
30
+ medium: "medium";
31
+ high: "high";
32
+ xhigh: "xhigh";
33
+ max: "max";
34
+ }>>;
35
+ connectors: z.ZodDefault<z.ZodArray<z.ZodString>>;
36
+ maxIterations: z.ZodOptional<z.ZodNumber>;
37
+ toolPolicies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
38
+ ask: "ask";
39
+ auto: "auto";
40
+ deny: "deny";
41
+ }>>>;
42
+ schedules: z.ZodDefault<z.ZodArray<z.ZodObject<{
43
+ every: z.ZodOptional<z.ZodString>;
44
+ dailyAt: z.ZodOptional<z.ZodString>;
45
+ input: z.ZodString;
46
+ }, z.core.$strip>>>;
47
+ }, z.core.$strip>;
48
+ export type AgentConfig = z.infer<typeof AgentConfigSchema>;
49
+ export declare function loadAgentConfig(path: string): Promise<AgentConfig>;
@@ -0,0 +1,58 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { z } from "zod";
3
+ import { ConfigError } from "../core/errors.js";
4
+ import { PersonaSchema } from "./persona.js";
5
+ import { ActionPolicy } from "../config/index.js";
6
+ /** A recurring input fed to the agent on a timer, e.g. a daily standup. */
7
+ export const ScheduleSchema = z
8
+ .object({
9
+ /** Interval form: "30s", "15m", "2h", "1d". */
10
+ every: z.string().regex(/^\d+(s|m|h|d)$/, 'use a duration like "15m", "2h", "1d"').optional(),
11
+ /** Daily form: fire at a local wall-clock time, "HH:MM". */
12
+ dailyAt: z
13
+ .string()
14
+ .regex(/^([01]?\d|2[0-3]):[0-5]\d$/, 'use a 24h time like "09:00"')
15
+ .optional(),
16
+ /** The instruction to feed the agent when the schedule fires. */
17
+ input: z.string().min(1),
18
+ })
19
+ .refine((s) => (s.every !== undefined) !== (s.dailyAt !== undefined), {
20
+ message: 'exactly one of "every" or "dailyAt" is required',
21
+ });
22
+ /**
23
+ * On-disk description of a single agent. One JSON file per agent (see
24
+ * examples/agents). The orchestrator loads these to spin up agents.
25
+ */
26
+ export const AgentConfigSchema = z.object({
27
+ id: z.string().min(1),
28
+ persona: PersonaSchema,
29
+ /** Override the global default model for this agent. */
30
+ model: z.string().optional(),
31
+ effort: z.enum(["low", "medium", "high", "xhigh", "max"]).optional(),
32
+ /** Connector ids this agent is wired to, e.g. ["email", "slack"]. */
33
+ connectors: z.array(z.string()).default([]),
34
+ maxIterations: z.number().int().min(1).max(200).optional(),
35
+ /**
36
+ * Per-tool approval-policy overrides; "*" matches any tool. Example:
37
+ * { "slack_post_message": "auto", "*": "ask" }.
38
+ */
39
+ toolPolicies: z.record(z.string(), ActionPolicy).optional(),
40
+ /** Recurring inputs, e.g. a morning triage pass. */
41
+ schedules: z.array(ScheduleSchema).default([]),
42
+ });
43
+ export async function loadAgentConfig(path) {
44
+ let raw;
45
+ try {
46
+ raw = JSON.parse(await readFile(path, "utf8"));
47
+ }
48
+ catch (err) {
49
+ throw new ConfigError(`could not read agent config at ${path}: ${err.message}`);
50
+ }
51
+ const parsed = AgentConfigSchema.safeParse(raw);
52
+ if (!parsed.success) {
53
+ const issues = parsed.error.issues.map((i) => ` - ${i.path.join(".")}: ${i.message}`).join("\n");
54
+ throw new ConfigError(`invalid agent config at ${path}:\n${issues}`);
55
+ }
56
+ return parsed.data;
57
+ }
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type Anthropic from "@anthropic-ai/sdk";
2
+ import { z } from "zod";
3
+ /**
4
+ * How an agent presents itself. Disclosure is first-class: an agent stepping
5
+ * into a real person's role can range from fully transparent ("I'm an AI
6
+ * assistant covering Jane's responsibilities") to operating under a fresh
7
+ * identity. Deployments choose, but the framework forces the choice to be explicit.
8
+ */
9
+ export declare const DisclosureMode: z.ZodEnum<{
10
+ transparent: "transparent";
11
+ on_request: "on_request";
12
+ opaque: "opaque";
13
+ }>;
14
+ export type DisclosureMode = z.infer<typeof DisclosureMode>;
15
+ export declare const PersonaSchema: z.ZodObject<{
16
+ name: z.ZodString;
17
+ role: z.ZodString;
18
+ succeeds: z.ZodOptional<z.ZodString>;
19
+ tone: z.ZodDefault<z.ZodString>;
20
+ guidance: z.ZodDefault<z.ZodString>;
21
+ disclosure: z.ZodDefault<z.ZodEnum<{
22
+ transparent: "transparent";
23
+ on_request: "on_request";
24
+ opaque: "opaque";
25
+ }>>;
26
+ }, z.core.$strip>;
27
+ export type Persona = z.infer<typeof PersonaSchema>;
28
+ /**
29
+ * Builds the system prompt as two blocks:
30
+ *
31
+ * 1. A **stable** block (persona, disclosure, principles) carrying the prompt-
32
+ * cache breakpoint — byte-identical across runs, so tools + persona are
33
+ * served from cache.
34
+ * 2. A **dynamic** block (accumulated role memory) that may change between
35
+ * runs without invalidating the stable prefix.
36
+ */
37
+ export declare function buildSystemBlocks(persona: Persona, roleContext: string): Anthropic.TextBlockParam[];
38
+ /** The cache-stable portion of the system prompt. Keep this deterministic. */
39
+ export declare function buildStablePrompt(persona: Persona): string;
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * How an agent presents itself. Disclosure is first-class: an agent stepping
4
+ * into a real person's role can range from fully transparent ("I'm an AI
5
+ * assistant covering Jane's responsibilities") to operating under a fresh
6
+ * identity. Deployments choose, but the framework forces the choice to be explicit.
7
+ */
8
+ export const DisclosureMode = z.enum([
9
+ // Always identifies itself as an AI in outward communication.
10
+ "transparent",
11
+ // Identifies as AI only when asked or when policy/law requires it.
12
+ "on_request",
13
+ // Operates under its own persona without volunteering that it is an AI.
14
+ // Use only where you have authorization and it is lawful to do so.
15
+ "opaque",
16
+ ]);
17
+ export const PersonaSchema = z.object({
18
+ /** The agent's own name/identity (its "new personality"). */
19
+ name: z.string(),
20
+ /** The role/title it is taking over. */
21
+ role: z.string(),
22
+ /** Who it is succeeding, if anyone (the departed employee). */
23
+ succeeds: z.string().optional(),
24
+ /** Voice & temperament guidance, e.g. "concise, warm, proactive". */
25
+ tone: z.string().default("professional, concise, helpful"),
26
+ /** Free-form behavioral guidance baked into the system prompt. */
27
+ guidance: z.string().default(""),
28
+ disclosure: DisclosureMode.default("transparent"),
29
+ });
30
+ const DISCLOSURE_INSTRUCTIONS = {
31
+ transparent: "In any outward communication, clearly identify yourself as an AI assistant operating on behalf of the team. Do not imply you are a human.",
32
+ on_request: "You operate under your persona. If anyone asks whether you are an AI, or if disclosure is legally required, answer truthfully and immediately.",
33
+ opaque: "You operate under your persona and do not volunteer that you are an AI. Hard limits that still apply: never claim to be a specific named human; if someone sincerely and directly asks whether you are an AI or a bot, do not deny it — you may decline to discuss it, but you may not lie; and comply immediately wherever disclosure is legally required.",
34
+ };
35
+ const OPERATING_PRINCIPLES = [
36
+ "Operating principles:",
37
+ "- Use the tools available to gather context before acting. Prefer reading the relevant history over guessing.",
38
+ "- For any action that affects the outside world (sending email, posting messages, writing to external systems), the system may require human approval. Propose the action clearly; do not assume it succeeded until the tool result confirms it.",
39
+ "- When handling an inbound event (a new email, a mention), first decide whether it needs you at all. If no action is warranted, say so briefly and stop — do not reply just to reply.",
40
+ "- Reply in the same channel and thread the conversation arrived on, using the thread/message identifiers from the event or tool results.",
41
+ "- When you learn something durable about the role, the people, or ongoing work, record it with the memory tool so future sessions retain it.",
42
+ "- During longer multi-step work, use display_status when you start a distinct phase (searching, reading, drafting, sending) so the operator can follow along. Skip it for quick single-step answers.",
43
+ "- Never include credentials, API keys, or other secrets in outward messages or in stored memories.",
44
+ "- Report outcomes faithfully. If a tool failed or an action was denied, say so plainly. Never claim an action happened unless a tool result confirms it.",
45
+ ].join("\n");
46
+ /**
47
+ * Builds the system prompt as two blocks:
48
+ *
49
+ * 1. A **stable** block (persona, disclosure, principles) carrying the prompt-
50
+ * cache breakpoint — byte-identical across runs, so tools + persona are
51
+ * served from cache.
52
+ * 2. A **dynamic** block (accumulated role memory) that may change between
53
+ * runs without invalidating the stable prefix.
54
+ */
55
+ export function buildSystemBlocks(persona, roleContext) {
56
+ const blocks = [
57
+ { type: "text", text: buildStablePrompt(persona), cache_control: { type: "ephemeral" } },
58
+ ];
59
+ if (roleContext) {
60
+ blocks.push({ type: "text", text: `Role context and accumulated knowledge:\n${roleContext}` });
61
+ }
62
+ return blocks;
63
+ }
64
+ /** The cache-stable portion of the system prompt. Keep this deterministic. */
65
+ export function buildStablePrompt(persona) {
66
+ const succession = persona.succeeds
67
+ ? `You are taking over the responsibilities previously held by ${persona.succeeds}. Pick up their work where they left off — honor in-flight commitments, threads, and relationships.`
68
+ : "";
69
+ return [
70
+ `You are ${persona.name}, operating as ${persona.role}.`,
71
+ succession,
72
+ `Your communication style is: ${persona.tone}.`,
73
+ persona.guidance,
74
+ DISCLOSURE_INSTRUCTIONS[persona.disclosure],
75
+ "",
76
+ OPERATING_PRINCIPLES,
77
+ ]
78
+ .filter((line) => line !== "")
79
+ .join("\n");
80
+ }
81
+ //# sourceMappingURL=persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.js","sourceRoot":"","sources":["../../src/agent/persona.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACnC,8DAA8D;IAC9D,aAAa;IACb,mEAAmE;IACnE,YAAY;IACZ,wEAAwE;IACxE,mEAAmE;IACnE,QAAQ;CACT,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,6DAA6D;IAC7D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,wCAAwC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,qEAAqE;IACrE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC;IAC1D,kEAAkE;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC;CAClD,CAAC,CAAC;AAGH,MAAM,uBAAuB,GAAmC;IAC9D,WAAW,EACT,2IAA2I;IAC7I,UAAU,EACR,gJAAgJ;IAClJ,MAAM,EACJ,6VAA6V;CAChW,CAAC;AAEF,MAAM,oBAAoB,GAAG;IAC3B,uBAAuB;IACvB,+GAA+G;IAC/G,kPAAkP;IAClP,uLAAuL;IACvL,0IAA0I;IAC1I,8IAA8I;IAC9I,sMAAsM;IACtM,oGAAoG;IACpG,0JAA0J;CAC3J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,WAAmB;IACrE,MAAM,MAAM,GAA+B;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;KACzF,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4CAA4C,WAAW,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ;QACjC,CAAC,CAAC,+DAA+D,OAAO,CAAC,QAAQ,qGAAqG;QACtL,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,WAAW,OAAO,CAAC,IAAI,kBAAkB,OAAO,CAAC,IAAI,GAAG;QACxD,UAAU;QACV,gCAAgC,OAAO,CAAC,IAAI,GAAG;QAC/C,OAAO,CAAC,QAAQ;QAChB,uBAAuB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3C,EAAE;QACF,oBAAoB;KACrB;SACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import { AgentConfigSchema, type AgentConfig } from "../agent/config.js";
3
+ export interface RegisteredAgent {
4
+ path: string;
5
+ config: AgentConfig;
6
+ }
7
+ export interface BrokenAgent {
8
+ path: string;
9
+ error: string;
10
+ }
11
+ /**
12
+ * Resolution order: EXEMPCLAW_AGENTS_DIR → ./agents when it exists (project-local
13
+ * use) → ~/.exempclaw/agents (the default for globally installed users).
14
+ */
15
+ export declare function resolveAgentsDir(env?: NodeJS.ProcessEnv, cwd?: string): string;
16
+ export declare function listAgents(dir: string): Promise<{
17
+ agents: RegisteredAgent[];
18
+ broken: BrokenAgent[];
19
+ }>;
20
+ /** Validates and writes <dir>/<id>.json. Refuses to overwrite an existing agent. */
21
+ export declare function saveAgent(dir: string, config: z.input<typeof AgentConfigSchema>): Promise<string>;
@@ -0,0 +1,51 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readdir, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { loadAgentConfig, AgentConfigSchema } from "../agent/config.js";
6
+ /**
7
+ * Resolution order: EXEMPCLAW_AGENTS_DIR → ./agents when it exists (project-local
8
+ * use) → ~/.exempclaw/agents (the default for globally installed users).
9
+ */
10
+ export function resolveAgentsDir(env = process.env, cwd = process.cwd()) {
11
+ if (env.EXEMPCLAW_AGENTS_DIR)
12
+ return env.EXEMPCLAW_AGENTS_DIR;
13
+ const local = join(cwd, "agents");
14
+ if (existsSync(local))
15
+ return local;
16
+ return join(homedir(), ".exempclaw", "agents");
17
+ }
18
+ export async function listAgents(dir) {
19
+ let files;
20
+ try {
21
+ files = await readdir(dir);
22
+ }
23
+ catch {
24
+ return { agents: [], broken: [] };
25
+ }
26
+ const agents = [];
27
+ const broken = [];
28
+ for (const file of files.sort()) {
29
+ if (!file.endsWith(".json"))
30
+ continue;
31
+ const path = join(dir, file);
32
+ try {
33
+ agents.push({ path, config: await loadAgentConfig(path) });
34
+ }
35
+ catch (err) {
36
+ broken.push({ path, error: err instanceof Error ? err.message : String(err) });
37
+ }
38
+ }
39
+ return { agents, broken };
40
+ }
41
+ /** Validates and writes <dir>/<id>.json. Refuses to overwrite an existing agent. */
42
+ export async function saveAgent(dir, config) {
43
+ const parsed = AgentConfigSchema.parse(config);
44
+ const path = join(dir, `${parsed.id}.json`);
45
+ if (existsSync(path))
46
+ throw new Error(`${path} already exists`);
47
+ await mkdir(dir, { recursive: true });
48
+ await writeFile(path, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
49
+ return path;
50
+ }
51
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAoB,MAAM,oBAAoB,CAAC;AAW1F;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAChG,IAAI,GAAG,CAAC,oBAAoB;QAAE,OAAO,GAAG,CAAC,oBAAoB,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,MAAyC;IACpF,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ApprovalRequest } from "../tools/tool.js";
2
+ import type { Stage } from "./tui.js";
3
+ /**
4
+ * Terminal-based approver used when the policy is "ask". Prints the pending
5
+ * outward action and blocks for a decision:
6
+ *
7
+ * y — approve this action
8
+ * n — deny this action
9
+ * a — approve, and auto-approve this tool for the rest of the session
10
+ *
11
+ * When a Stage is attached, its live animation region is suspended while the
12
+ * prompt owns the terminal and resumed afterwards. Swap this for a web or
13
+ * Slack approver by passing a different function into the orchestrator.
14
+ */
15
+ export declare function createTerminalApprover(stage?: Stage): (req: ApprovalRequest) => Promise<boolean>;
16
+ /** Single-shot approver retained for programmatic use. */
17
+ export declare const terminalApprover: (req: ApprovalRequest) => Promise<boolean>;
@@ -0,0 +1,50 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { bold, dim, yellow } from "./render.js";
4
+ /**
5
+ * Terminal-based approver used when the policy is "ask". Prints the pending
6
+ * outward action and blocks for a decision:
7
+ *
8
+ * y — approve this action
9
+ * n — deny this action
10
+ * a — approve, and auto-approve this tool for the rest of the session
11
+ *
12
+ * When a Stage is attached, its live animation region is suspended while the
13
+ * prompt owns the terminal and resumed afterwards. Swap this for a web or
14
+ * Slack approver by passing a different function into the orchestrator.
15
+ */
16
+ export function createTerminalApprover(stage) {
17
+ const sessionAllowed = new Set();
18
+ return async (req) => {
19
+ if (sessionAllowed.has(req.tool)) {
20
+ const note = dim(`⚙ ${req.tool} auto-approved (session)\n`);
21
+ if (stage)
22
+ stage.print(note);
23
+ else
24
+ stdout.write(`\n${note}`);
25
+ return true;
26
+ }
27
+ stage?.suspend();
28
+ const rl = createInterface({ input: stdin, output: stdout });
29
+ try {
30
+ stdout.write(`\n${yellow("⚠ Approval required")} — ${bold(req.tool)}\n`);
31
+ stdout.write(`${dim(req.summary)}\n`);
32
+ stdout.write(` ${req.detail.replace(/\n/g, "\n ")}\n`);
33
+ const answer = (await rl.question(` Approve? ${dim("[y]es / [n]o / [a]lways this tool")} `))
34
+ .trim()
35
+ .toLowerCase();
36
+ if (answer === "a" || answer === "always") {
37
+ sessionAllowed.add(req.tool);
38
+ return true;
39
+ }
40
+ return answer === "y" || answer === "yes";
41
+ }
42
+ finally {
43
+ rl.close();
44
+ stage?.resume();
45
+ }
46
+ };
47
+ }
48
+ /** Single-shot approver retained for programmatic use. */
49
+ export const terminalApprover = createTerminalApprover();
50
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/cli/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,OAAO,KAAK,EAAE,GAAoB,EAAoB,EAAE;QACtD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,4BAA4B,CAAC,CAAC;YAC5D,IAAI,KAAK;gBAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;gBACxB,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,OAAO,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,sBAAsB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,mCAAmC,CAAC,GAAG,CAAC,CAAC;iBAC3F,IAAI,EAAE;iBACN,WAAW,EAAE,CAAC;YACjB,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,EAAE,MAAM,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Orchestrator } from "../orchestrator/orchestrator.js";
2
+ import { Stage } from "./tui.js";
3
+ /**
4
+ * The interactive REPL. Streams the agent's text live, animates tool calls
5
+ * and the agent's own status signals, supports slash commands, and lets
6
+ * Ctrl-C interrupt the current run without killing the session.
7
+ */
8
+ export declare function runChatSession(opts: {
9
+ orchestrator: Orchestrator;
10
+ agentId: string;
11
+ name: string;
12
+ model: string;
13
+ stage: Stage;
14
+ /** Extra line under the banner (demo mode uses this). */
15
+ notice?: string;
16
+ }): Promise<void>;
@@ -0,0 +1,148 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { addTotals, emptyUsage, formatUsd } from "../core/usage.js";
4
+ import { bold, cyan, dim, usageLine, yellow } from "./render.js";
5
+ import { playBanner } from "./tui.js";
6
+ import { liveRunHooks } from "./live.js";
7
+ /**
8
+ * The interactive REPL. Streams the agent's text live, animates tool calls
9
+ * and the agent's own status signals, supports slash commands, and lets
10
+ * Ctrl-C interrupt the current run without killing the session.
11
+ */
12
+ export async function runChatSession(opts) {
13
+ const { orchestrator, agentId, name, stage } = opts;
14
+ await playBanner(`succession ledger · chatting with ${name}`, { tty: stage.isAnimated });
15
+ stdout.write(`${dim(`agent ${agentId} · model ${opts.model} · /help for commands · Ctrl-C interrupts a run`)}\n`);
16
+ if (opts.notice)
17
+ stdout.write(`${yellow("◈")} ${dim(opts.notice)}\n`);
18
+ let sessionUsage = emptyUsage();
19
+ let sessionCost = 0;
20
+ let hasCost = false;
21
+ let running;
22
+ // Ctrl-C during a run interrupts that run; at the prompt it exits cleanly.
23
+ const onSigint = () => {
24
+ if (running) {
25
+ running.abort();
26
+ }
27
+ else {
28
+ process.exit(0);
29
+ }
30
+ };
31
+ process.on("SIGINT", onSigint);
32
+ const rl = createInterface({ input: stdin, output: stdout });
33
+ rl.on("SIGINT", onSigint);
34
+ try {
35
+ for (;;) {
36
+ let line;
37
+ try {
38
+ line = (await rl.question(`\n${cyan("you ›")} `)).trim();
39
+ }
40
+ catch {
41
+ break; // readline closed
42
+ }
43
+ if (!line)
44
+ continue;
45
+ if (line.startsWith("/") || line === "exit" || line === "quit") {
46
+ const handled = await handleCommand(line, { orchestrator, agentId, rl, sessionUsage, sessionCost, hasCost });
47
+ if (handled === "exit")
48
+ break;
49
+ if (handled === "handled")
50
+ continue;
51
+ // fall through: not a recognized command — treat as a message
52
+ }
53
+ const live = liveRunHooks(stage, name);
54
+ running = new AbortController();
55
+ let interrupted = false;
56
+ try {
57
+ const result = await orchestrator.dispatch(agentId, line, {
58
+ hooks: live.hooks,
59
+ trigger: { kind: "chat" },
60
+ signal: running.signal,
61
+ });
62
+ interrupted = result.stopReason === "interrupted";
63
+ sessionUsage = addTotals(sessionUsage, result.usage);
64
+ if (result.costUsd !== null) {
65
+ sessionCost += result.costUsd;
66
+ hasCost = true;
67
+ }
68
+ live.finish({ interrupted });
69
+ if (interrupted) {
70
+ stdout.write(`\n${yellow("— interrupted")} ${dim("(history saved; keep typing to continue)")}\n`);
71
+ }
72
+ else {
73
+ stdout.write(`\n${usageLine(result.usage, result.costUsd, result.iterations)}\n`);
74
+ }
75
+ }
76
+ catch (err) {
77
+ live.finish();
78
+ stdout.write(`\n${yellow("✖")} ${err.message}\n`);
79
+ }
80
+ finally {
81
+ running = undefined;
82
+ }
83
+ }
84
+ }
85
+ finally {
86
+ process.removeListener("SIGINT", onSigint);
87
+ stage.stopAll();
88
+ rl.close();
89
+ }
90
+ }
91
+ async function handleCommand(line, ctx) {
92
+ const [command, ...rest] = line.split(/\s+/);
93
+ const arg = rest.join(" ").trim();
94
+ switch (command) {
95
+ case "exit":
96
+ case "quit":
97
+ case "/exit":
98
+ case "/quit":
99
+ return "exit";
100
+ case "/help":
101
+ stdout.write([
102
+ `${bold("/memory <query>")} search the agent's durable memory`,
103
+ `${bold("/cost")} session token + spend totals`,
104
+ `${bold("/clear")} wipe conversation history (memories kept)`,
105
+ `${bold("/exit")} leave the chat`,
106
+ dim("anything else is sent to the agent · Ctrl-C interrupts a running turn"),
107
+ ].join("\n") + "\n");
108
+ return "handled";
109
+ case "/cost": {
110
+ const u = ctx.sessionUsage;
111
+ stdout.write(`${bold("session")} ${u.turns} turns · ${u.inputTokens + u.cacheReadTokens + u.cacheWriteTokens} in / ${u.outputTokens} out` +
112
+ ` · cached ${u.cacheReadTokens} · ${ctx.hasCost ? formatUsd(ctx.sessionCost) : "n/a"}\n` +
113
+ `${dim("lifetime totals: exempclaw costs")}\n`);
114
+ return "handled";
115
+ }
116
+ case "/memory": {
117
+ const { memory } = ctx.orchestrator.resources(ctx.agentId);
118
+ const hits = arg ? await memory.searchMemory(arg, 10) : (await memory.allMemories()).slice(-10);
119
+ if (hits.length === 0) {
120
+ stdout.write(`${dim(arg ? "no matching memories" : "no memories yet")}\n`);
121
+ return "handled";
122
+ }
123
+ for (const m of hits) {
124
+ stdout.write(`${dim(m.id.slice(0, 8))} ${cyan(`[${m.source}]`)} ${m.text}\n`);
125
+ }
126
+ return "handled";
127
+ }
128
+ case "/clear": {
129
+ const answer = (await ctx.rl.question(`${yellow("clear conversation history?")} [y/N] `)).trim().toLowerCase();
130
+ if (answer === "y" || answer === "yes") {
131
+ const { memory } = ctx.orchestrator.resources(ctx.agentId);
132
+ await memory.clearHistory();
133
+ stdout.write(`${dim("history cleared (durable memories kept)")}\n`);
134
+ }
135
+ else {
136
+ stdout.write(`${dim("kept")}\n`);
137
+ }
138
+ return "handled";
139
+ }
140
+ default:
141
+ if (command.startsWith("/")) {
142
+ stdout.write(`${dim(`unknown command ${command} — /help lists commands`)}\n`);
143
+ return "handled";
144
+ }
145
+ return "passthrough";
146
+ }
147
+ }
148
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/cli/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `exempclaw demo` — replays a scripted agent session through the real
3
+ * animation pipeline (the same Stage + hooks chat uses), so you can preview
4
+ * the TUI without an API key or credentials. Also handy for testing terminal
5
+ * compatibility.
6
+ */
7
+ export declare function runDemo(): Promise<void>;