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
@@ -21,7 +21,7 @@ export declare function publishMessage(channelsDir: string, channelName: string,
21
21
  /**
22
22
  * Read messages from a channel
23
23
  */
24
- export declare function readChannel(channelsDir: string, channelName: string, limit?: number, since?: Date): Promise<ChannelMessage[]>;
24
+ export declare function readChannel(channelsDir: string, channelName: string, limit?: number, since?: Date, threadId?: string): Promise<ChannelMessage[]>;
25
25
  /**
26
26
  * Reply to a message in a channel
27
27
  */
@@ -30,4 +30,56 @@ export declare function replyToMessage(channelsDir: string, channelName: string,
30
30
  * Load channel metadata
31
31
  */
32
32
  export declare function loadChannelMetadata(channelsDir: string, channelName: string): Promise<ChannelMetadata | null>;
33
+ /**
34
+ * Get the last processed timestamp for a channel
35
+ */
36
+ export declare function getLastProcessedTime(channelsDir: string, channelName: string): Promise<Date | null>;
37
+ /**
38
+ * Mark a channel as processed at the current time
39
+ */
40
+ export declare function markChannelProcessed(channelsDir: string, channelName: string): Promise<void>;
41
+ /**
42
+ * A pending message that needs processing
43
+ */
44
+ export interface PendingMessage {
45
+ /** Message ID (ISO 8601 timestamp) */
46
+ id: string;
47
+ /** Channel name (e.g., @persona) */
48
+ channel: string;
49
+ /** Path to the message file */
50
+ path: string;
51
+ /** Message content (body, without frontmatter) */
52
+ content: string;
53
+ /** Message metadata */
54
+ meta: ChannelMessageMeta;
55
+ }
56
+ /**
57
+ * Get pending (unprocessed) messages for a DM channel
58
+ * Returns messages newer than the last processed timestamp
59
+ */
60
+ export declare function getPendingMessages(channelsDir: string, channelName: string): Promise<PendingMessage[]>;
61
+ /**
62
+ * List all DM channels (@persona) in the channels directory
63
+ */
64
+ export declare function listDMChannels(channelsDir: string): Promise<string[]>;
65
+ /**
66
+ * Get the workspace directory path for a thread.
67
+ * The workspace is a directory within the thread for working files.
68
+ *
69
+ * @param channelsDir - Base channels directory
70
+ * @param channelName - Channel name (e.g., "#sessions")
71
+ * @param threadId - Thread ID (ISO timestamp)
72
+ * @param create - If true, creates the workspace directory if it doesn't exist
73
+ * @returns Path to the workspace directory, or null if thread doesn't exist
74
+ */
75
+ export declare function getThreadWorkspace(channelsDir: string, channelName: string, threadId: string, create?: boolean): Promise<string | null>;
76
+ /**
77
+ * Get the thread directory path.
78
+ *
79
+ * @param channelsDir - Base channels directory
80
+ * @param channelName - Channel name (e.g., "#sessions")
81
+ * @param threadId - Thread ID (ISO timestamp)
82
+ * @returns Path to the thread directory, or null if it doesn't exist
83
+ */
84
+ export declare function getThreadPath(channelsDir: string, channelName: string, threadId: string): Promise<string | null>;
33
85
  //# sourceMappingURL=channel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/lib/channel.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAoC5B;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,EAAE,CAAC,CAiCxD;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,IAAI,GACX,OAAO,CAAC,cAAc,EAAE,CAAC,CA2D3B;AA+CD;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CASjC"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/lib/channel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAyD5B;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,EAAE,CAAC,CAiCxD;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,IAAI,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,EAAE,CAAC,CA4E3B;AAmDD;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CASjC;AAYD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CActB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CA4D3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB"}
@@ -1,9 +1,11 @@
1
1
  import { readdir, mkdir, readFile, writeFile, stat } from "node:fs/promises";
2
+ import { hostname } from "node:os";
2
3
  import { join } from "node:path";
3
4
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
5
  import { parseFrontmatter } from "./frontmatter.js";
5
6
  const METADATA_FILE = "_metadata.yaml";
6
- const MESSAGE_FILE = "message.md";
7
+ const MESSAGE_FILE_LEGACY = "message.md"; // Backwards compatibility
8
+ const LAST_PROCESSED_FILE = "_last_processed.yaml";
7
9
  /**
8
10
  * Check if a path exists and is a directory
9
11
  */
@@ -34,6 +36,23 @@ async function isFile(path) {
34
36
  function generateMessageId() {
35
37
  return new Date().toISOString();
36
38
  }
39
+ /**
40
+ * Get the path to the initial message file in a thread directory.
41
+ * Supports both new format (<threadId>.md) and legacy format (message.md).
42
+ */
43
+ async function getInitialMessagePath(threadDir, threadId) {
44
+ // Try new format first: <threadId>.md
45
+ const newPath = join(threadDir, `${threadId}.md`);
46
+ if (await isFile(newPath)) {
47
+ return newPath;
48
+ }
49
+ // Fall back to legacy format: message.md
50
+ const legacyPath = join(threadDir, MESSAGE_FILE_LEGACY);
51
+ if (await isFile(legacyPath)) {
52
+ return legacyPath;
53
+ }
54
+ return null;
55
+ }
37
56
  /**
38
57
  * Check if a name is a valid channel name (starts with # or @)
39
58
  */
@@ -102,25 +121,27 @@ export async function publishMessage(channelsDir, channelName, content, meta) {
102
121
  const messageId = generateMessageId();
103
122
  const messagePath = join(channelsDir, channelName, messageId);
104
123
  await mkdir(messagePath, { recursive: true });
124
+ const host = hostname();
105
125
  let messageContent = "";
106
- if (meta && (meta.from || meta.run_id || meta.tags?.length)) {
107
- const frontmatter = {};
108
- if (meta.from)
109
- frontmatter.from = meta.from;
110
- if (meta.run_id)
111
- frontmatter.run_id = meta.run_id;
112
- if (meta.tags?.length)
113
- frontmatter.tags = meta.tags;
114
- messageContent = `---\n${stringifyYaml(frontmatter)}---\n\n`;
115
- }
126
+ const frontmatter = { host };
127
+ if (meta?.from)
128
+ frontmatter.from = meta.from;
129
+ if (meta?.run_id)
130
+ frontmatter.run_id = meta.run_id;
131
+ if (meta?.tags?.length)
132
+ frontmatter.tags = meta.tags;
133
+ if (meta?.thread_id)
134
+ frontmatter.thread_id = meta.thread_id;
135
+ messageContent = `---\n${stringifyYaml(frontmatter)}---\n\n`;
116
136
  messageContent += content + "\n";
117
- await writeFile(join(messagePath, MESSAGE_FILE), messageContent, "utf-8");
137
+ // Write initial message with timestamp filename (uniform with replies)
138
+ await writeFile(join(messagePath, `${messageId}.md`), messageContent, "utf-8");
118
139
  return messageId;
119
140
  }
120
141
  /**
121
142
  * Read messages from a channel
122
143
  */
123
- export async function readChannel(channelsDir, channelName, limit, since) {
144
+ export async function readChannel(channelsDir, channelName, limit, since, threadId) {
124
145
  const channelPath = join(channelsDir, channelName);
125
146
  if (!(await isDirectory(channelPath))) {
126
147
  return [];
@@ -133,12 +154,31 @@ export async function readChannel(channelsDir, channelName, limit, since) {
133
154
  if (entry.name.startsWith("_"))
134
155
  continue;
135
156
  const messageDir = join(channelPath, entry.name);
136
- const messagePath = join(messageDir, MESSAGE_FILE);
137
- if (!(await isFile(messagePath)))
157
+ const threadId_local = entry.name;
158
+ // Find initial message file (new or legacy format)
159
+ const messagePath = await getInitialMessagePath(messageDir, threadId_local);
160
+ if (!messagePath)
138
161
  continue;
139
162
  const messageDate = new Date(entry.name);
140
163
  if (since && messageDate < since)
141
164
  continue;
165
+ // If filtering by thread, we need to read and check frontmatter first
166
+ if (threadId) {
167
+ try {
168
+ const content = await readFile(messagePath, "utf-8");
169
+ if (content.startsWith("---\n")) {
170
+ const parsed = parseFrontmatter(content);
171
+ if (parsed.frontmatter.thread_id !== threadId)
172
+ continue;
173
+ }
174
+ else {
175
+ continue; // No frontmatter means no thread_id
176
+ }
177
+ }
178
+ catch {
179
+ continue;
180
+ }
181
+ }
142
182
  try {
143
183
  const content = await readFile(messagePath, "utf-8");
144
184
  let meta = {};
@@ -156,7 +196,7 @@ export async function readChannel(channelsDir, channelName, limit, since) {
156
196
  else {
157
197
  body = content.trim();
158
198
  }
159
- const replies = await readReplies(messageDir);
199
+ const replies = await readReplies(messageDir, threadId_local);
160
200
  messages.push({
161
201
  id: entry.name,
162
202
  content: body,
@@ -175,16 +215,20 @@ export async function readChannel(channelsDir, channelName, limit, since) {
175
215
  return messages;
176
216
  }
177
217
  /**
178
- * Read replies for a message
218
+ * Read replies for a message (excluding the initial message)
179
219
  */
180
- async function readReplies(messageDir) {
220
+ async function readReplies(messageDir, threadId) {
181
221
  const entries = await readdir(messageDir, { withFileTypes: true });
182
222
  const replies = [];
223
+ // Files to skip: legacy message.md and the initial message (<threadId>.md)
224
+ const initialMessageFile = `${threadId}.md`;
183
225
  for (const entry of entries) {
184
226
  if (!entry.isFile())
185
227
  continue;
186
- if (entry.name === MESSAGE_FILE)
187
- continue;
228
+ if (entry.name === MESSAGE_FILE_LEGACY)
229
+ continue; // Skip legacy initial
230
+ if (entry.name === initialMessageFile)
231
+ continue; // Skip new-format initial
188
232
  if (!entry.name.endsWith(".md"))
189
233
  continue;
190
234
  const replyId = entry.name.replace(/\.md$/, "");
@@ -227,17 +271,16 @@ export async function replyToMessage(channelsDir, channelName, messageId, conten
227
271
  throw new Error(`Message not found: ${channelName}/${messageId}`);
228
272
  }
229
273
  const replyId = generateMessageId();
274
+ const host = hostname();
230
275
  let replyContent = "";
231
- if (meta && (meta.from || meta.run_id || meta.tags?.length)) {
232
- const frontmatter = {};
233
- if (meta.from)
234
- frontmatter.from = meta.from;
235
- if (meta.run_id)
236
- frontmatter.run_id = meta.run_id;
237
- if (meta.tags?.length)
238
- frontmatter.tags = meta.tags;
239
- replyContent = `---\n${stringifyYaml(frontmatter)}---\n\n`;
240
- }
276
+ const frontmatter = { host };
277
+ if (meta?.from)
278
+ frontmatter.from = meta.from;
279
+ if (meta?.run_id)
280
+ frontmatter.run_id = meta.run_id;
281
+ if (meta?.tags?.length)
282
+ frontmatter.tags = meta.tags;
283
+ replyContent = `---\n${stringifyYaml(frontmatter)}---\n\n`;
241
284
  replyContent += content + "\n";
242
285
  await writeFile(join(messagePath, `${replyId}.md`), replyContent, "utf-8");
243
286
  return replyId;
@@ -253,4 +296,152 @@ export async function loadChannelMetadata(channelsDir, channelName) {
253
296
  const content = await readFile(metadataPath, "utf-8");
254
297
  return parseYaml(content);
255
298
  }
299
+ /**
300
+ * Get the last processed timestamp for a channel
301
+ */
302
+ export async function getLastProcessedTime(channelsDir, channelName) {
303
+ const lastProcessedPath = join(channelsDir, channelName, LAST_PROCESSED_FILE);
304
+ if (!(await isFile(lastProcessedPath))) {
305
+ return null;
306
+ }
307
+ try {
308
+ const content = await readFile(lastProcessedPath, "utf-8");
309
+ const info = parseYaml(content);
310
+ return new Date(info.last_processed_at);
311
+ }
312
+ catch {
313
+ return null;
314
+ }
315
+ }
316
+ /**
317
+ * Mark a channel as processed at the current time
318
+ */
319
+ export async function markChannelProcessed(channelsDir, channelName) {
320
+ const channelPath = join(channelsDir, channelName);
321
+ if (!(await isDirectory(channelPath))) {
322
+ return;
323
+ }
324
+ const info = {
325
+ last_processed_at: new Date().toISOString(),
326
+ processed_by: hostname(),
327
+ };
328
+ const lastProcessedPath = join(channelPath, LAST_PROCESSED_FILE);
329
+ await writeFile(lastProcessedPath, stringifyYaml(info), "utf-8");
330
+ }
331
+ /**
332
+ * Get pending (unprocessed) messages for a DM channel
333
+ * Returns messages newer than the last processed timestamp
334
+ */
335
+ export async function getPendingMessages(channelsDir, channelName) {
336
+ const channelPath = join(channelsDir, channelName);
337
+ if (!(await isDirectory(channelPath))) {
338
+ return [];
339
+ }
340
+ const lastProcessed = await getLastProcessedTime(channelsDir, channelName);
341
+ const entries = await readdir(channelPath, { withFileTypes: true });
342
+ const pending = [];
343
+ for (const entry of entries) {
344
+ if (!entry.isDirectory())
345
+ continue;
346
+ if (entry.name.startsWith("_"))
347
+ continue;
348
+ // Message ID is an ISO timestamp
349
+ const messageDate = new Date(entry.name);
350
+ if (Number.isNaN(messageDate.getTime()))
351
+ continue;
352
+ // Skip if already processed
353
+ if (lastProcessed && messageDate <= lastProcessed)
354
+ continue;
355
+ const messageDir = join(channelPath, entry.name);
356
+ const threadId = entry.name;
357
+ // Find initial message file (new or legacy format)
358
+ const messagePath = await getInitialMessagePath(messageDir, threadId);
359
+ if (!messagePath)
360
+ continue;
361
+ try {
362
+ const content = await readFile(messagePath, "utf-8");
363
+ let meta = {};
364
+ let body;
365
+ if (content.startsWith("---\n")) {
366
+ try {
367
+ const parsed = parseFrontmatter(content);
368
+ meta = parsed.frontmatter;
369
+ body = parsed.body;
370
+ }
371
+ catch {
372
+ body = content;
373
+ }
374
+ }
375
+ else {
376
+ body = content.trim();
377
+ }
378
+ pending.push({
379
+ id: entry.name,
380
+ channel: channelName,
381
+ path: messagePath,
382
+ content: body,
383
+ meta,
384
+ });
385
+ }
386
+ catch {
387
+ continue;
388
+ }
389
+ }
390
+ // Sort by timestamp ascending (oldest first for processing order)
391
+ return pending.sort((a, b) => a.id.localeCompare(b.id));
392
+ }
393
+ /**
394
+ * List all DM channels (@persona) in the channels directory
395
+ */
396
+ export async function listDMChannels(channelsDir) {
397
+ if (!(await isDirectory(channelsDir))) {
398
+ return [];
399
+ }
400
+ const entries = await readdir(channelsDir, { withFileTypes: true });
401
+ const dmChannels = [];
402
+ for (const entry of entries) {
403
+ if (!entry.isDirectory())
404
+ continue;
405
+ if (entry.name.startsWith("@")) {
406
+ dmChannels.push(entry.name);
407
+ }
408
+ }
409
+ return dmChannels.sort();
410
+ }
411
+ /**
412
+ * Get the workspace directory path for a thread.
413
+ * The workspace is a directory within the thread for working files.
414
+ *
415
+ * @param channelsDir - Base channels directory
416
+ * @param channelName - Channel name (e.g., "#sessions")
417
+ * @param threadId - Thread ID (ISO timestamp)
418
+ * @param create - If true, creates the workspace directory if it doesn't exist
419
+ * @returns Path to the workspace directory, or null if thread doesn't exist
420
+ */
421
+ export async function getThreadWorkspace(channelsDir, channelName, threadId, create = false) {
422
+ const threadDir = join(channelsDir, channelName, threadId);
423
+ if (!(await isDirectory(threadDir))) {
424
+ return null;
425
+ }
426
+ const workspacePath = join(threadDir, "workspace");
427
+ if (create) {
428
+ await mkdir(workspacePath, { recursive: true });
429
+ }
430
+ return workspacePath;
431
+ }
432
+ /**
433
+ * Get the thread directory path.
434
+ *
435
+ * @param channelsDir - Base channels directory
436
+ * @param channelName - Channel name (e.g., "#sessions")
437
+ * @param threadId - Thread ID (ISO timestamp)
438
+ * @returns Path to the thread directory, or null if it doesn't exist
439
+ */
440
+ export async function getThreadPath(channelsDir, channelName, threadId) {
441
+ const threadDir = join(channelsDir, channelName, threadId);
442
+ if (!(await isDirectory(threadDir))) {
443
+ return null;
444
+ }
445
+ return threadDir;
446
+ }
256
447
  //# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/lib/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/lib/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=channel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.test.d.ts","sourceRoot":"","sources":["../../src/lib/channel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert";
3
+ // isChannelName is a pure function - inline it to avoid module resolution issues
4
+ // This is the same logic as in channel.ts
5
+ function isChannelName(name) {
6
+ return name.startsWith("#") || name.startsWith("@");
7
+ }
8
+ describe("isChannelName", () => {
9
+ it("returns true for public channels (# prefix)", () => {
10
+ assert.strictEqual(isChannelName("#general"), true);
11
+ assert.strictEqual(isChannelName("#status"), true);
12
+ assert.strictEqual(isChannelName("#dev-updates"), true);
13
+ });
14
+ it("returns true for DM channels (@ prefix)", () => {
15
+ assert.strictEqual(isChannelName("@developer"), true);
16
+ assert.strictEqual(isChannelName("@human"), true);
17
+ assert.strictEqual(isChannelName("@alice-bob"), true);
18
+ });
19
+ it("returns false for names without prefix", () => {
20
+ assert.strictEqual(isChannelName("general"), false);
21
+ assert.strictEqual(isChannelName("status"), false);
22
+ assert.strictEqual(isChannelName("developer"), false);
23
+ });
24
+ it("returns false for names with wrong prefix", () => {
25
+ assert.strictEqual(isChannelName("!general"), false);
26
+ assert.strictEqual(isChannelName("$status"), false);
27
+ assert.strictEqual(isChannelName("/developer"), false);
28
+ });
29
+ it("returns false for empty string", () => {
30
+ assert.strictEqual(isChannelName(""), false);
31
+ });
32
+ });
33
+ //# sourceMappingURL=channel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.test.js","sourceRoot":"","sources":["../../src/lib/channel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,iFAAiF;AACjF,0CAA0C;AAC1C,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Daemon status information
3
+ */
4
+ export interface DaemonStatus {
5
+ /** Whether the daemon is running */
6
+ running: boolean;
7
+ /** Process ID if running */
8
+ pid?: number;
9
+ }
10
+ /**
11
+ * Get the path to the daemon PID file for an agents directory
12
+ */
13
+ export declare function getPidFilePath(agentsDir: string): string;
14
+ /**
15
+ * Write the daemon PID file
16
+ */
17
+ export declare function writePidFile(agentsDir: string, pid: number): Promise<void>;
18
+ /**
19
+ * Remove the daemon PID file
20
+ */
21
+ export declare function removePidFile(agentsDir: string): Promise<void>;
22
+ /**
23
+ * Get the daemon status for an agents directory
24
+ */
25
+ export declare function getDaemonStatus(agentsDir: string): Promise<DaemonStatus>;
26
+ //# sourceMappingURL=daemon-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-status.d.ts","sourceRoot":"","sources":["../../src/lib/daemon-status.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAeD;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqB9E"}
@@ -0,0 +1,64 @@
1
+ import { readFile, writeFile, unlink } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const PID_FILE = "daemon.pid";
4
+ /**
5
+ * Get the path to the daemon PID file for an agents directory
6
+ */
7
+ export function getPidFilePath(agentsDir) {
8
+ return join(agentsDir, PID_FILE);
9
+ }
10
+ /**
11
+ * Write the daemon PID file
12
+ */
13
+ export async function writePidFile(agentsDir, pid) {
14
+ const pidPath = getPidFilePath(agentsDir);
15
+ await writeFile(pidPath, pid.toString(), "utf-8");
16
+ }
17
+ /**
18
+ * Remove the daemon PID file
19
+ */
20
+ export async function removePidFile(agentsDir) {
21
+ const pidPath = getPidFilePath(agentsDir);
22
+ try {
23
+ await unlink(pidPath);
24
+ }
25
+ catch {
26
+ // File may not exist, ignore
27
+ }
28
+ }
29
+ /**
30
+ * Check if a process with the given PID is running
31
+ */
32
+ function isProcessRunning(pid) {
33
+ try {
34
+ // Sending signal 0 tests if process exists without actually signaling it
35
+ process.kill(pid, 0);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Get the daemon status for an agents directory
44
+ */
45
+ export async function getDaemonStatus(agentsDir) {
46
+ const pidPath = getPidFilePath(agentsDir);
47
+ try {
48
+ const content = await readFile(pidPath, "utf-8");
49
+ const pid = parseInt(content.trim(), 10);
50
+ if (isNaN(pid)) {
51
+ return { running: false };
52
+ }
53
+ if (isProcessRunning(pid)) {
54
+ return { running: true, pid };
55
+ }
56
+ // PID file exists but process is not running (stale)
57
+ return { running: false };
58
+ }
59
+ catch {
60
+ // No PID file
61
+ return { running: false };
62
+ }
63
+ }
64
+ //# sourceMappingURL=daemon-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-status.js","sourceRoot":"","sources":["../../src/lib/daemon-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAY9B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,GAAW;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,yEAAyE;QACzE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAEzC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAChC,CAAC;QAED,qDAAqD;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;QACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}