dot-agents 0.4.1 → 0.6.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 (140) hide show
  1. package/README.md +239 -122
  2. package/dist/cli/commands/channel.d.ts +19 -0
  3. package/dist/cli/commands/channel.d.ts.map +1 -1
  4. package/dist/cli/commands/channel.js +152 -13
  5. package/dist/cli/commands/channel.js.map +1 -1
  6. package/dist/cli/commands/check.d.ts.map +1 -1
  7. package/dist/cli/commands/check.js +61 -1
  8. package/dist/cli/commands/check.js.map +1 -1
  9. package/dist/cli/commands/index.d.ts +2 -0
  10. package/dist/cli/commands/index.d.ts.map +1 -1
  11. package/dist/cli/commands/index.js +2 -0
  12. package/dist/cli/commands/index.js.map +1 -1
  13. package/dist/cli/commands/personas.d.ts +3 -0
  14. package/dist/cli/commands/personas.d.ts.map +1 -0
  15. package/dist/cli/commands/personas.js +402 -0
  16. package/dist/cli/commands/personas.js.map +1 -0
  17. package/dist/cli/commands/projects.d.ts +3 -0
  18. package/dist/cli/commands/projects.d.ts.map +1 -0
  19. package/dist/cli/commands/projects.js +138 -0
  20. package/dist/cli/commands/projects.js.map +1 -0
  21. package/dist/cli/commands/run.d.ts.map +1 -1
  22. package/dist/cli/commands/run.js +4 -5
  23. package/dist/cli/commands/run.js.map +1 -1
  24. package/dist/cli/index.js +5 -12
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/lib/runner.d.ts +2 -0
  27. package/dist/cli/lib/runner.d.ts.map +1 -1
  28. package/dist/cli/lib/runner.js +102 -25
  29. package/dist/cli/lib/runner.js.map +1 -1
  30. package/dist/daemon/api/server.d.ts.map +1 -1
  31. package/dist/daemon/api/server.js +4 -2
  32. package/dist/daemon/api/server.js.map +1 -1
  33. package/dist/daemon/daemon.d.ts +12 -3
  34. package/dist/daemon/daemon.d.ts.map +1 -1
  35. package/dist/daemon/daemon.js +138 -35
  36. package/dist/daemon/daemon.js.map +1 -1
  37. package/dist/daemon/lib/executor.d.ts +12 -2
  38. package/dist/daemon/lib/executor.d.ts.map +1 -1
  39. package/dist/daemon/lib/executor.js +52 -34
  40. package/dist/daemon/lib/executor.js.map +1 -1
  41. package/dist/daemon/lib/watcher.d.ts +14 -2
  42. package/dist/daemon/lib/watcher.d.ts.map +1 -1
  43. package/dist/daemon/lib/watcher.js +43 -3
  44. package/dist/daemon/lib/watcher.js.map +1 -1
  45. package/dist/lib/channel.d.ts +53 -1
  46. package/dist/lib/channel.d.ts.map +1 -1
  47. package/dist/lib/channel.js +221 -30
  48. package/dist/lib/channel.js.map +1 -1
  49. package/dist/lib/channel.test.d.ts +2 -0
  50. package/dist/lib/channel.test.d.ts.map +1 -0
  51. package/dist/lib/channel.test.js +33 -0
  52. package/dist/lib/channel.test.js.map +1 -0
  53. package/dist/lib/daemon-status.d.ts +26 -0
  54. package/dist/lib/daemon-status.d.ts.map +1 -0
  55. package/dist/lib/daemon-status.js +64 -0
  56. package/dist/lib/daemon-status.js.map +1 -0
  57. package/dist/lib/environment.d.ts +87 -0
  58. package/dist/lib/environment.d.ts.map +1 -0
  59. package/dist/lib/environment.js +224 -0
  60. package/dist/lib/environment.js.map +1 -0
  61. package/dist/lib/frontmatter.d.ts +8 -0
  62. package/dist/lib/frontmatter.d.ts.map +1 -1
  63. package/dist/lib/frontmatter.js +16 -3
  64. package/dist/lib/frontmatter.js.map +1 -1
  65. package/dist/lib/frontmatter.test.d.ts +2 -0
  66. package/dist/lib/frontmatter.test.d.ts.map +1 -0
  67. package/dist/lib/frontmatter.test.js +60 -0
  68. package/dist/lib/frontmatter.test.js.map +1 -0
  69. package/dist/lib/index.d.ts +8 -0
  70. package/dist/lib/index.d.ts.map +1 -1
  71. package/dist/lib/index.js +8 -0
  72. package/dist/lib/index.js.map +1 -1
  73. package/dist/lib/integration.test.d.ts +2 -0
  74. package/dist/lib/integration.test.d.ts.map +1 -0
  75. package/dist/lib/integration.test.js +445 -0
  76. package/dist/lib/integration.test.js.map +1 -0
  77. package/dist/lib/invoke.d.ts +23 -0
  78. package/dist/lib/invoke.d.ts.map +1 -0
  79. package/dist/lib/invoke.js +158 -0
  80. package/dist/lib/invoke.js.map +1 -0
  81. package/dist/lib/invoke.test.d.ts +2 -0
  82. package/dist/lib/invoke.test.d.ts.map +1 -0
  83. package/dist/lib/invoke.test.js +82 -0
  84. package/dist/lib/invoke.test.js.map +1 -0
  85. package/dist/lib/persona.d.ts +41 -0
  86. package/dist/lib/persona.d.ts.map +1 -1
  87. package/dist/lib/persona.js +233 -31
  88. package/dist/lib/persona.js.map +1 -1
  89. package/dist/lib/persona.test.d.ts +2 -0
  90. package/dist/lib/persona.test.d.ts.map +1 -0
  91. package/dist/lib/persona.test.js +324 -0
  92. package/dist/lib/persona.test.js.map +1 -0
  93. package/dist/lib/processor.d.ts +50 -0
  94. package/dist/lib/processor.d.ts.map +1 -0
  95. package/dist/lib/processor.js +135 -0
  96. package/dist/lib/processor.js.map +1 -0
  97. package/dist/lib/processor.test.d.ts +2 -0
  98. package/dist/lib/processor.test.d.ts.map +1 -0
  99. package/dist/lib/processor.test.js +134 -0
  100. package/dist/lib/processor.test.js.map +1 -0
  101. package/dist/lib/registry.d.ts +109 -0
  102. package/dist/lib/registry.d.ts.map +1 -0
  103. package/dist/lib/registry.js +192 -0
  104. package/dist/lib/registry.js.map +1 -0
  105. package/dist/lib/registry.test.d.ts +2 -0
  106. package/dist/lib/registry.test.d.ts.map +1 -0
  107. package/dist/lib/registry.test.js +236 -0
  108. package/dist/lib/registry.test.js.map +1 -0
  109. package/dist/lib/session-thread.d.ts +75 -0
  110. package/dist/lib/session-thread.d.ts.map +1 -0
  111. package/dist/lib/session-thread.js +132 -0
  112. package/dist/lib/session-thread.js.map +1 -0
  113. package/dist/lib/session-thread.test.d.ts +2 -0
  114. package/dist/lib/session-thread.test.d.ts.map +1 -0
  115. package/dist/lib/session-thread.test.js +235 -0
  116. package/dist/lib/session-thread.test.js.map +1 -0
  117. package/dist/lib/session.d.ts +150 -0
  118. package/dist/lib/session.d.ts.map +1 -0
  119. package/dist/lib/session.js +183 -0
  120. package/dist/lib/session.js.map +1 -0
  121. package/dist/lib/session.test.d.ts +2 -0
  122. package/dist/lib/session.test.d.ts.map +1 -0
  123. package/dist/lib/session.test.js +336 -0
  124. package/dist/lib/session.test.js.map +1 -0
  125. package/dist/lib/types/channel.d.ts +4 -0
  126. package/dist/lib/types/channel.d.ts.map +1 -1
  127. package/dist/lib/types/persona.d.ts +51 -0
  128. package/dist/lib/types/persona.d.ts.map +1 -1
  129. package/dist/lib/types/triggers.d.ts +11 -0
  130. package/dist/lib/types/triggers.d.ts.map +1 -1
  131. package/dist/lib/version.d.ts +26 -0
  132. package/dist/lib/version.d.ts.map +1 -0
  133. package/dist/lib/version.js +61 -0
  134. package/dist/lib/version.js.map +1 -0
  135. package/internal/personas/_base/PERSONA.md +251 -0
  136. package/internal/skills/channels/list/SKILL.md +76 -0
  137. package/internal/skills/channels/publish/SKILL.md +129 -0
  138. package/internal/skills/channels/read/SKILL.md +124 -0
  139. package/internal/skills/channels/reply/SKILL.md +138 -0
  140. package/package.json +7 -2
@@ -0,0 +1,324 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert";
3
+ import { join, relative } from "node:path";
4
+ // Pure functions copied from persona.ts for testing
5
+ // This avoids module resolution issues with .js imports
6
+ function buildInheritanceChain(personaPath, personasRoot) {
7
+ const relativePath = relative(personasRoot, personaPath);
8
+ const parts = relativePath.split("/").filter(Boolean);
9
+ const chain = [];
10
+ let currentPath = personasRoot;
11
+ for (const part of parts) {
12
+ currentPath = join(currentPath, part);
13
+ chain.push(currentPath);
14
+ }
15
+ return chain;
16
+ }
17
+ function mergeArraysWithNegation(parent, child) {
18
+ const result = [...parent];
19
+ for (const item of child) {
20
+ if (item.startsWith("!")) {
21
+ const pattern = item.slice(1);
22
+ const index = result.indexOf(pattern);
23
+ if (index !== -1) {
24
+ result.splice(index, 1);
25
+ }
26
+ }
27
+ else if (!result.includes(item)) {
28
+ result.push(item);
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ function deepMerge(parent, child) {
34
+ const result = { ...parent };
35
+ for (const key of Object.keys(child)) {
36
+ const childValue = child[key];
37
+ const parentValue = parent[key];
38
+ if (childValue !== undefined &&
39
+ typeof childValue === "object" &&
40
+ childValue !== null &&
41
+ !Array.isArray(childValue) &&
42
+ typeof parentValue === "object" &&
43
+ parentValue !== null &&
44
+ !Array.isArray(parentValue)) {
45
+ result[key] = deepMerge(parentValue, childValue);
46
+ }
47
+ else if (childValue !== undefined) {
48
+ result[key] = childValue;
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ function combinePrompts(parent, child) {
54
+ if (!parent && !child)
55
+ return undefined;
56
+ if (!parent)
57
+ return child;
58
+ if (!child)
59
+ return parent;
60
+ return parent + "\n\n---\n\n" + child;
61
+ }
62
+ function mergePersonas(parent, child) {
63
+ return {
64
+ name: child.name,
65
+ description: child.description ?? parent.description,
66
+ cmd: child.cmd ?? parent.cmd,
67
+ path: child.path,
68
+ parent: parent.path,
69
+ env: deepMerge(parent.env ?? {}, child.env ?? {}),
70
+ skills: mergeArraysWithNegation(parent.skills ?? [], child.skills ?? []),
71
+ prompt: combinePrompts(parent.prompt, child.prompt),
72
+ };
73
+ }
74
+ function normalizeCommandSpec(cmd) {
75
+ if (cmd === undefined)
76
+ return undefined;
77
+ if (typeof cmd === "string")
78
+ return [cmd];
79
+ return cmd;
80
+ }
81
+ function isCommandModes(cmd) {
82
+ return (cmd !== undefined &&
83
+ typeof cmd === "object" &&
84
+ !Array.isArray(cmd));
85
+ }
86
+ function resolveCommands(cmd) {
87
+ if (!cmd) {
88
+ throw new Error("Persona must specify cmd");
89
+ }
90
+ if (isCommandModes(cmd)) {
91
+ const headless = normalizeCommandSpec(cmd.headless);
92
+ const interactive = normalizeCommandSpec(cmd.interactive);
93
+ if (!headless && !interactive) {
94
+ throw new Error("Persona cmd must specify at least headless or interactive");
95
+ }
96
+ return {
97
+ headless: headless ?? interactive,
98
+ interactive,
99
+ };
100
+ }
101
+ const headless = normalizeCommandSpec(cmd);
102
+ return {
103
+ headless: headless,
104
+ interactive: undefined,
105
+ };
106
+ }
107
+ // Tests
108
+ describe("buildInheritanceChain", () => {
109
+ it("builds chain from root to leaf", () => {
110
+ const chain = buildInheritanceChain("/project/.agents/personas/claude/autonomous", "/project/.agents/personas");
111
+ assert.deepStrictEqual(chain, [
112
+ "/project/.agents/personas/claude",
113
+ "/project/.agents/personas/claude/autonomous",
114
+ ]);
115
+ });
116
+ it("returns single-element chain for top-level persona", () => {
117
+ const chain = buildInheritanceChain("/project/.agents/personas/developer", "/project/.agents/personas");
118
+ assert.deepStrictEqual(chain, ["/project/.agents/personas/developer"]);
119
+ });
120
+ it("handles deeply nested paths", () => {
121
+ const chain = buildInheritanceChain("/project/.agents/personas/a/b/c/d", "/project/.agents/personas");
122
+ assert.deepStrictEqual(chain, [
123
+ "/project/.agents/personas/a",
124
+ "/project/.agents/personas/a/b",
125
+ "/project/.agents/personas/a/b/c",
126
+ "/project/.agents/personas/a/b/c/d",
127
+ ]);
128
+ });
129
+ });
130
+ describe("mergeArraysWithNegation", () => {
131
+ it("combines arrays without duplicates", () => {
132
+ const result = mergeArraysWithNegation(["a", "b"], ["c", "d"]);
133
+ assert.deepStrictEqual(result, ["a", "b", "c", "d"]);
134
+ });
135
+ it("removes items with ! prefix", () => {
136
+ const result = mergeArraysWithNegation(["a", "b", "c"], ["!b"]);
137
+ assert.deepStrictEqual(result, ["a", "c"]);
138
+ });
139
+ it("can add and remove in same operation", () => {
140
+ const result = mergeArraysWithNegation(["a", "b", "c"], ["!b", "d"]);
141
+ assert.deepStrictEqual(result, ["a", "c", "d"]);
142
+ });
143
+ it("ignores removal of non-existent items", () => {
144
+ const result = mergeArraysWithNegation(["a", "b"], ["!z"]);
145
+ assert.deepStrictEqual(result, ["a", "b"]);
146
+ });
147
+ it("does not add duplicates", () => {
148
+ const result = mergeArraysWithNegation(["a", "b"], ["b", "c"]);
149
+ assert.deepStrictEqual(result, ["a", "b", "c"]);
150
+ });
151
+ it("handles empty arrays", () => {
152
+ assert.deepStrictEqual(mergeArraysWithNegation([], ["a"]), ["a"]);
153
+ assert.deepStrictEqual(mergeArraysWithNegation(["a"], []), ["a"]);
154
+ assert.deepStrictEqual(mergeArraysWithNegation([], []), []);
155
+ });
156
+ });
157
+ describe("deepMerge", () => {
158
+ it("merges flat objects", () => {
159
+ const parent = { a: 1, b: 2, c: 0 };
160
+ const child = { b: 3, c: 4 };
161
+ const result = deepMerge(parent, child);
162
+ assert.deepStrictEqual(result, { a: 1, b: 3, c: 4 });
163
+ });
164
+ it("recursively merges nested objects", () => {
165
+ const parent = { outer: { a: 1, b: 2, c: 0 } };
166
+ const child = { outer: { a: 1, b: 3, c: 4 } };
167
+ const result = deepMerge(parent, child);
168
+ assert.deepStrictEqual(result, { outer: { a: 1, b: 3, c: 4 } });
169
+ });
170
+ it("child overrides parent for non-object values", () => {
171
+ const result = deepMerge({ a: "parent" }, { a: "child" });
172
+ assert.deepStrictEqual(result, { a: "child" });
173
+ });
174
+ it("child array replaces parent array (no merge)", () => {
175
+ const result = deepMerge({ arr: [1, 2] }, { arr: [3, 4] });
176
+ assert.deepStrictEqual(result, { arr: [3, 4] });
177
+ });
178
+ it("preserves parent values not in child", () => {
179
+ const result = deepMerge({ a: 1, b: 2 }, { a: 10 });
180
+ assert.deepStrictEqual(result, { a: 10, b: 2 });
181
+ });
182
+ it("handles undefined child values", () => {
183
+ const result = deepMerge({ a: 1 }, { a: undefined });
184
+ assert.deepStrictEqual(result, { a: 1 });
185
+ });
186
+ });
187
+ describe("mergePersonas", () => {
188
+ const parentPersona = {
189
+ name: "parent",
190
+ description: "Parent description",
191
+ cmd: ["parent-cmd"],
192
+ path: "/personas/parent",
193
+ skills: ["skill-a", "skill-b"],
194
+ env: { VAR1: "value1" },
195
+ prompt: "Parent prompt",
196
+ };
197
+ const childPersona = {
198
+ name: "child",
199
+ path: "/personas/parent/child",
200
+ skills: ["skill-c", "!skill-b"],
201
+ env: { VAR2: "value2" },
202
+ prompt: "Child prompt",
203
+ };
204
+ it("uses child name", () => {
205
+ const merged = mergePersonas(parentPersona, childPersona);
206
+ assert.strictEqual(merged.name, "child");
207
+ });
208
+ it("uses child path", () => {
209
+ const merged = mergePersonas(parentPersona, childPersona);
210
+ assert.strictEqual(merged.path, "/personas/parent/child");
211
+ });
212
+ it("sets parent reference", () => {
213
+ const merged = mergePersonas(parentPersona, childPersona);
214
+ assert.strictEqual(merged.parent, "/personas/parent");
215
+ });
216
+ it("falls back to parent description", () => {
217
+ const merged = mergePersonas(parentPersona, childPersona);
218
+ assert.strictEqual(merged.description, "Parent description");
219
+ });
220
+ it("child description overrides parent", () => {
221
+ const childWithDesc = {
222
+ ...childPersona,
223
+ description: "Child description",
224
+ };
225
+ const merged = mergePersonas(parentPersona, childWithDesc);
226
+ assert.strictEqual(merged.description, "Child description");
227
+ });
228
+ it("inherits cmd from parent if not specified", () => {
229
+ const merged = mergePersonas(parentPersona, childPersona);
230
+ assert.deepStrictEqual(merged.cmd, ["parent-cmd"]);
231
+ });
232
+ it("child cmd overrides parent", () => {
233
+ const childWithCmd = { ...childPersona, cmd: ["child-cmd"] };
234
+ const merged = mergePersonas(parentPersona, childWithCmd);
235
+ assert.deepStrictEqual(merged.cmd, ["child-cmd"]);
236
+ });
237
+ it("merges skills with negation support", () => {
238
+ const merged = mergePersonas(parentPersona, childPersona);
239
+ assert.deepStrictEqual(merged.skills, ["skill-a", "skill-c"]);
240
+ });
241
+ it("deep merges env", () => {
242
+ const merged = mergePersonas(parentPersona, childPersona);
243
+ assert.deepStrictEqual(merged.env, { VAR1: "value1", VAR2: "value2" });
244
+ });
245
+ it("combines prompts with separator", () => {
246
+ const merged = mergePersonas(parentPersona, childPersona);
247
+ assert.strictEqual(merged.prompt, "Parent prompt\n\n---\n\nChild prompt");
248
+ });
249
+ it("handles missing parent prompt", () => {
250
+ const parentNoPrompt = { ...parentPersona, prompt: undefined };
251
+ const merged = mergePersonas(parentNoPrompt, childPersona);
252
+ assert.strictEqual(merged.prompt, "Child prompt");
253
+ });
254
+ it("handles missing child prompt", () => {
255
+ const childNoPrompt = { ...childPersona, prompt: undefined };
256
+ const merged = mergePersonas(parentPersona, childNoPrompt);
257
+ assert.strictEqual(merged.prompt, "Parent prompt");
258
+ });
259
+ });
260
+ describe("resolveCommands", () => {
261
+ it("throws when cmd is undefined", () => {
262
+ assert.throws(() => resolveCommands(undefined), {
263
+ message: "Persona must specify cmd",
264
+ });
265
+ });
266
+ it("converts string to headless array", () => {
267
+ const result = resolveCommands("my-command");
268
+ assert.deepStrictEqual(result, {
269
+ headless: ["my-command"],
270
+ interactive: undefined,
271
+ });
272
+ });
273
+ it("keeps array as headless", () => {
274
+ const result = resolveCommands(["cmd", "--flag"]);
275
+ assert.deepStrictEqual(result, {
276
+ headless: ["cmd", "--flag"],
277
+ interactive: undefined,
278
+ });
279
+ });
280
+ it("handles object format with both modes", () => {
281
+ const result = resolveCommands({
282
+ headless: ["headless-cmd"],
283
+ interactive: ["interactive-cmd"],
284
+ });
285
+ assert.deepStrictEqual(result, {
286
+ headless: ["headless-cmd"],
287
+ interactive: ["interactive-cmd"],
288
+ });
289
+ });
290
+ it("converts string values in object format", () => {
291
+ const result = resolveCommands({
292
+ headless: "headless-cmd",
293
+ interactive: "interactive-cmd",
294
+ });
295
+ assert.deepStrictEqual(result, {
296
+ headless: ["headless-cmd"],
297
+ interactive: ["interactive-cmd"],
298
+ });
299
+ });
300
+ it("uses interactive as fallback for headless", () => {
301
+ const result = resolveCommands({
302
+ interactive: ["interactive-only"],
303
+ });
304
+ assert.deepStrictEqual(result, {
305
+ headless: ["interactive-only"],
306
+ interactive: ["interactive-only"],
307
+ });
308
+ });
309
+ it("allows headless-only mode", () => {
310
+ const result = resolveCommands({
311
+ headless: ["headless-only"],
312
+ });
313
+ assert.deepStrictEqual(result, {
314
+ headless: ["headless-only"],
315
+ interactive: undefined,
316
+ });
317
+ });
318
+ it("throws when object has neither mode", () => {
319
+ assert.throws(() => resolveCommands({}), {
320
+ message: "Persona cmd must specify at least headless or interactive",
321
+ });
322
+ });
323
+ });
324
+ //# sourceMappingURL=persona.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.test.js","sourceRoot":"","sources":["../../src/lib/persona.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type DotAgentsConfig } from "./index.js";
2
+ /**
3
+ * Result of processing a single message
4
+ */
5
+ export interface ProcessResult {
6
+ /** Message ID that was processed */
7
+ messageId: string;
8
+ /** Channel the message was in */
9
+ channel: string;
10
+ /** Persona that processed the message */
11
+ persona: string;
12
+ /** Whether processing succeeded */
13
+ success: boolean;
14
+ /** Duration in milliseconds */
15
+ duration: number;
16
+ /** Error message if failed */
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Result of processing all pending messages
21
+ */
22
+ export interface ProcessAllResult {
23
+ /** Number of channels checked */
24
+ channelsChecked: number;
25
+ /** Number of messages processed */
26
+ messagesProcessed: number;
27
+ /** Results for each processed message */
28
+ results: ProcessResult[];
29
+ /** Overall success (all messages processed successfully) */
30
+ success: boolean;
31
+ }
32
+ /**
33
+ * Options for processing channels
34
+ */
35
+ export interface ProcessOptions {
36
+ /** Specific channel to process (e.g., @persona). If not provided, processes all DM channels. */
37
+ channel?: string;
38
+ /** Only process channels that have a matching persona */
39
+ requirePersona?: boolean;
40
+ }
41
+ /**
42
+ * Process all pending messages in DM channels
43
+ *
44
+ * For each @persona channel with pending messages:
45
+ * 1. Check if persona exists
46
+ * 2. Invoke persona with each message
47
+ * 3. Mark channel as processed
48
+ */
49
+ export declare function processChannels(config: DotAgentsConfig, options?: ProcessOptions): Promise<ProcessAllResult>;
50
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/lib/processor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAOrB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyFD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA0D3B"}
@@ -0,0 +1,135 @@
1
+ import { getPendingMessages, markChannelProcessed, listDMChannels, listPersonas, invokePersona, } from "./index.js";
2
+ import { hasPersonaFile } from "./persona.js";
3
+ import { parseFromAddress } from "../cli/commands/channel.js";
4
+ /**
5
+ * Build context object from message metadata
6
+ * Extracts callback info from 'from' field if present
7
+ */
8
+ function buildMessageContext(message) {
9
+ const context = {
10
+ DM_MESSAGE_ID: message.id,
11
+ };
12
+ // Parse from address for callback routing
13
+ if (message.meta.from) {
14
+ const parsed = parseFromAddress(message.meta.from);
15
+ context.FROM_ADDRESS = message.meta.from;
16
+ context.FROM_CHANNEL = parsed.address;
17
+ if (parsed.thread) {
18
+ context.FROM_THREAD = parsed.thread;
19
+ }
20
+ }
21
+ return context;
22
+ }
23
+ /**
24
+ * Process a single pending message by invoking the persona
25
+ */
26
+ async function processMessage(config, message) {
27
+ const personaName = message.channel.slice(1); // Remove @ prefix
28
+ try {
29
+ const context = buildMessageContext(message);
30
+ const result = await invokePersona(config, personaName, message.content, {
31
+ source: message.channel,
32
+ context,
33
+ goal: `Process DM: ${personaName}`,
34
+ });
35
+ return {
36
+ messageId: message.id,
37
+ channel: message.channel,
38
+ persona: personaName,
39
+ success: result.success,
40
+ duration: result.duration,
41
+ error: result.success ? undefined : (result.stderr || result.error),
42
+ };
43
+ }
44
+ catch (error) {
45
+ return {
46
+ messageId: message.id,
47
+ channel: message.channel,
48
+ persona: personaName,
49
+ success: false,
50
+ duration: 0,
51
+ error: error.message,
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * Check if a persona exists for a given DM channel
57
+ */
58
+ async function personaExists(config, channelName) {
59
+ const personaName = channelName.slice(1); // Remove @ prefix
60
+ // Check for root persona (.agents/PERSONA.md)
61
+ if (personaName === "root") {
62
+ return await hasPersonaFile(config.agentsDir);
63
+ }
64
+ const personaPaths = await listPersonas(config.personasDir);
65
+ for (const path of personaPaths) {
66
+ // Extract persona name from path
67
+ const parts = path.split("/");
68
+ const name = parts[parts.length - 1];
69
+ if (name === personaName) {
70
+ return true;
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ /**
76
+ * Process all pending messages in DM channels
77
+ *
78
+ * For each @persona channel with pending messages:
79
+ * 1. Check if persona exists
80
+ * 2. Invoke persona with each message
81
+ * 3. Mark channel as processed
82
+ */
83
+ export async function processChannels(config, options = {}) {
84
+ const results = [];
85
+ let channelsChecked = 0;
86
+ // Get channels to process
87
+ let channels;
88
+ if (options.channel) {
89
+ // Process specific channel
90
+ if (!options.channel.startsWith("@")) {
91
+ return {
92
+ channelsChecked: 0,
93
+ messagesProcessed: 0,
94
+ results: [],
95
+ success: false,
96
+ };
97
+ }
98
+ channels = [options.channel];
99
+ }
100
+ else {
101
+ // Process all DM channels
102
+ channels = await listDMChannels(config.channelsDir);
103
+ }
104
+ for (const channel of channels) {
105
+ channelsChecked++;
106
+ // Check if persona exists for this channel
107
+ const hasPersona = await personaExists(config, channel);
108
+ if (!hasPersona) {
109
+ if (options.requirePersona) {
110
+ continue;
111
+ }
112
+ // Skip channels without personas silently
113
+ continue;
114
+ }
115
+ // Get pending messages
116
+ const pending = await getPendingMessages(config.channelsDir, channel);
117
+ if (pending.length === 0) {
118
+ continue;
119
+ }
120
+ // Process each message
121
+ for (const message of pending) {
122
+ const result = await processMessage(config, message);
123
+ results.push(result);
124
+ }
125
+ // Mark channel as processed
126
+ await markChannelProcessed(config.channelsDir, channel);
127
+ }
128
+ return {
129
+ channelsChecked,
130
+ messagesProcessed: results.length,
131
+ results,
132
+ success: results.every((r) => r.success),
133
+ };
134
+ }
135
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/lib/processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=processor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.test.d.ts","sourceRoot":"","sources":["../../src/lib/processor.test.ts"],"names":[],"mappings":""}