contextos-mcp 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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/bin/mcp.mjs +61 -0
  4. package/bin/swarm.mjs +45 -0
  5. package/dist/agents/aider.d.ts +12 -0
  6. package/dist/agents/aider.js +192 -0
  7. package/dist/agents/aider.js.map +1 -0
  8. package/dist/agents/claude-code.d.ts +9 -0
  9. package/dist/agents/claude-code.js +236 -0
  10. package/dist/agents/claude-code.js.map +1 -0
  11. package/dist/agents/codex.d.ts +14 -0
  12. package/dist/agents/codex.js +203 -0
  13. package/dist/agents/codex.js.map +1 -0
  14. package/dist/agents/direct-llm.d.ts +22 -0
  15. package/dist/agents/direct-llm.js +254 -0
  16. package/dist/agents/direct-llm.js.map +1 -0
  17. package/dist/agents/mock.d.ts +10 -0
  18. package/dist/agents/mock.js +170 -0
  19. package/dist/agents/mock.js.map +1 -0
  20. package/dist/agents/opencode.d.ts +23 -0
  21. package/dist/agents/opencode.js +631 -0
  22. package/dist/agents/opencode.js.map +1 -0
  23. package/dist/agents/provider.d.ts +11 -0
  24. package/dist/agents/provider.js +31 -0
  25. package/dist/agents/provider.js.map +1 -0
  26. package/dist/compression/compressor.d.ts +28 -0
  27. package/dist/compression/compressor.js +268 -0
  28. package/dist/compression/compressor.js.map +1 -0
  29. package/dist/config.d.ts +43 -0
  30. package/dist/config.js +172 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/contextos/loader.d.ts +46 -0
  33. package/dist/contextos/loader.js +120 -0
  34. package/dist/contextos/loader.js.map +1 -0
  35. package/dist/contextos/selector.d.ts +46 -0
  36. package/dist/contextos/selector.js +80 -0
  37. package/dist/contextos/selector.js.map +1 -0
  38. package/dist/core/action-dispatcher.d.ts +15 -0
  39. package/dist/core/action-dispatcher.js +28 -0
  40. package/dist/core/action-dispatcher.js.map +1 -0
  41. package/dist/core/action-schema.d.ts +72 -0
  42. package/dist/core/action-schema.js +86 -0
  43. package/dist/core/action-schema.js.map +1 -0
  44. package/dist/core/repl-interface.d.ts +48 -0
  45. package/dist/core/repl-interface.js +5 -0
  46. package/dist/core/repl-interface.js.map +1 -0
  47. package/dist/core/repl.d.ts +59 -0
  48. package/dist/core/repl.js +353 -0
  49. package/dist/core/repl.js.map +1 -0
  50. package/dist/core/rlm.d.ts +65 -0
  51. package/dist/core/rlm.js +564 -0
  52. package/dist/core/rlm.js.map +1 -0
  53. package/dist/core/runtime.py +470 -0
  54. package/dist/core/types.d.ts +265 -0
  55. package/dist/core/types.js +19 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/env.d.ts +10 -0
  58. package/dist/env.js +75 -0
  59. package/dist/env.js.map +1 -0
  60. package/dist/hooks/runner.d.ts +43 -0
  61. package/dist/hooks/runner.js +173 -0
  62. package/dist/hooks/runner.js.map +1 -0
  63. package/dist/labs/cli.d.ts +15 -0
  64. package/dist/labs/cli.js +295 -0
  65. package/dist/labs/cli.js.map +1 -0
  66. package/dist/labs/episodic-memory.d.ts +132 -0
  67. package/dist/labs/episodic-memory.js +391 -0
  68. package/dist/labs/episodic-memory.js.map +1 -0
  69. package/dist/labs/interactive-swarm.d.ts +20 -0
  70. package/dist/labs/interactive-swarm.js +1173 -0
  71. package/dist/labs/interactive-swarm.js.map +1 -0
  72. package/dist/labs/interactive.d.ts +10 -0
  73. package/dist/labs/interactive.js +2099 -0
  74. package/dist/labs/interactive.js.map +1 -0
  75. package/dist/labs/ts-analyzer.d.ts +74 -0
  76. package/dist/labs/ts-analyzer.js +379 -0
  77. package/dist/labs/ts-analyzer.js.map +1 -0
  78. package/dist/labs/viewer.d.ts +12 -0
  79. package/dist/labs/viewer.js +1284 -0
  80. package/dist/labs/viewer.js.map +1 -0
  81. package/dist/main.d.ts +15 -0
  82. package/dist/main.js +247 -0
  83. package/dist/main.js.map +1 -0
  84. package/dist/mcp/server.d.ts +16 -0
  85. package/dist/mcp/server.js +192775 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/mcp/session.d.ts +117 -0
  88. package/dist/mcp/session.js +450 -0
  89. package/dist/mcp/session.js.map +1 -0
  90. package/dist/mcp/state.d.ts +42 -0
  91. package/dist/mcp/state.js +537 -0
  92. package/dist/mcp/state.js.map +1 -0
  93. package/dist/mcp/tools/contextos.d.ts +17 -0
  94. package/dist/mcp/tools/contextos.js +583 -0
  95. package/dist/mcp/tools/contextos.js.map +1 -0
  96. package/dist/mcp/tools.d.ts +15 -0
  97. package/dist/mcp/tools.js +393 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/orchestration/reviewer-gate.d.ts +43 -0
  100. package/dist/orchestration/reviewer-gate.js +280 -0
  101. package/dist/orchestration/reviewer-gate.js.map +1 -0
  102. package/dist/orchestration/reviewer-prompt.d.ts +18 -0
  103. package/dist/orchestration/reviewer-prompt.js +67 -0
  104. package/dist/orchestration/reviewer-prompt.js.map +1 -0
  105. package/dist/orchestration/verification-runner.d.ts +53 -0
  106. package/dist/orchestration/verification-runner.js +352 -0
  107. package/dist/orchestration/verification-runner.js.map +1 -0
  108. package/dist/plugins/adapter.d.ts +11 -0
  109. package/dist/plugins/adapter.js +11 -0
  110. package/dist/plugins/adapter.js.map +1 -0
  111. package/dist/plugins/core/archive.d.ts +9 -0
  112. package/dist/plugins/core/archive.js +128 -0
  113. package/dist/plugins/core/archive.js.map +1 -0
  114. package/dist/plugins/core/digest.d.ts +11 -0
  115. package/dist/plugins/core/digest.js +70 -0
  116. package/dist/plugins/core/digest.js.map +1 -0
  117. package/dist/plugins/core/grants.d.ts +22 -0
  118. package/dist/plugins/core/grants.js +90 -0
  119. package/dist/plugins/core/grants.js.map +1 -0
  120. package/dist/plugins/core/index.d.ts +10 -0
  121. package/dist/plugins/core/index.js +11 -0
  122. package/dist/plugins/core/index.js.map +1 -0
  123. package/dist/plugins/core/pinning.d.ts +15 -0
  124. package/dist/plugins/core/pinning.js +86 -0
  125. package/dist/plugins/core/pinning.js.map +1 -0
  126. package/dist/plugins/core/types.d.ts +105 -0
  127. package/dist/plugins/core/types.js +22 -0
  128. package/dist/plugins/core/types.js.map +1 -0
  129. package/dist/plugins/core/updater.d.ts +16 -0
  130. package/dist/plugins/core/updater.js +64 -0
  131. package/dist/plugins/core/updater.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +65 -0
  133. package/dist/plugins/loader.js +110 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/prompts/orchestrator.d.ts +6 -0
  136. package/dist/prompts/orchestrator.js +114 -0
  137. package/dist/prompts/orchestrator.js.map +1 -0
  138. package/dist/routing/model-resolver.d.ts +27 -0
  139. package/dist/routing/model-resolver.js +265 -0
  140. package/dist/routing/model-resolver.js.map +1 -0
  141. package/dist/routing/model-router.d.ts +130 -0
  142. package/dist/routing/model-router.js +515 -0
  143. package/dist/routing/model-router.js.map +1 -0
  144. package/dist/runtime/attestations.cjs +260 -0
  145. package/dist/runtime/reviewer-pipeline.cjs +319 -0
  146. package/dist/runtime/sandbox.cjs +468 -0
  147. package/dist/runtime/state-machine.cjs +885 -0
  148. package/dist/runtime/thread-store.cjs +175 -0
  149. package/dist/runtime/transactional-git.cjs +315 -0
  150. package/dist/runtime/verification-pipeline.cjs +435 -0
  151. package/dist/sandbox/execution.d.ts +165 -0
  152. package/dist/sandbox/execution.js +497 -0
  153. package/dist/sandbox/execution.js.map +1 -0
  154. package/dist/security/file-policy.d.ts +22 -0
  155. package/dist/security/file-policy.js +53 -0
  156. package/dist/security/file-policy.js.map +1 -0
  157. package/dist/security/repository-boundary.d.ts +21 -0
  158. package/dist/security/repository-boundary.js +119 -0
  159. package/dist/security/repository-boundary.js.map +1 -0
  160. package/dist/security/secret-filter.d.ts +36 -0
  161. package/dist/security/secret-filter.js +149 -0
  162. package/dist/security/secret-filter.js.map +1 -0
  163. package/dist/swarm.d.ts +14 -0
  164. package/dist/swarm.js +624 -0
  165. package/dist/swarm.js.map +1 -0
  166. package/dist/threads/cache.d.ts +64 -0
  167. package/dist/threads/cache.js +241 -0
  168. package/dist/threads/cache.js.map +1 -0
  169. package/dist/threads/manager.d.ts +94 -0
  170. package/dist/threads/manager.js +914 -0
  171. package/dist/threads/manager.js.map +1 -0
  172. package/dist/ui/banner.d.ts +14 -0
  173. package/dist/ui/banner.js +42 -0
  174. package/dist/ui/banner.js.map +1 -0
  175. package/dist/ui/dashboard.d.ts +33 -0
  176. package/dist/ui/dashboard.js +135 -0
  177. package/dist/ui/dashboard.js.map +1 -0
  178. package/dist/ui/index.d.ts +11 -0
  179. package/dist/ui/index.js +12 -0
  180. package/dist/ui/index.js.map +1 -0
  181. package/dist/ui/log.d.ts +39 -0
  182. package/dist/ui/log.js +126 -0
  183. package/dist/ui/log.js.map +1 -0
  184. package/dist/ui/onboarding.d.ts +14 -0
  185. package/dist/ui/onboarding.js +755 -0
  186. package/dist/ui/onboarding.js.map +1 -0
  187. package/dist/ui/run-log.d.ts +50 -0
  188. package/dist/ui/run-log.js +60 -0
  189. package/dist/ui/run-log.js.map +1 -0
  190. package/dist/ui/spinner.d.ts +41 -0
  191. package/dist/ui/spinner.js +172 -0
  192. package/dist/ui/spinner.js.map +1 -0
  193. package/dist/ui/streaming-feed.d.ts +72 -0
  194. package/dist/ui/streaming-feed.js +386 -0
  195. package/dist/ui/streaming-feed.js.map +1 -0
  196. package/dist/ui/summary.d.ts +18 -0
  197. package/dist/ui/summary.js +113 -0
  198. package/dist/ui/summary.js.map +1 -0
  199. package/dist/ui/text-input.d.ts +19 -0
  200. package/dist/ui/text-input.js +266 -0
  201. package/dist/ui/text-input.js.map +1 -0
  202. package/dist/ui/theme.d.ts +63 -0
  203. package/dist/ui/theme.js +97 -0
  204. package/dist/ui/theme.js.map +1 -0
  205. package/dist/utils/command-exists.d.ts +11 -0
  206. package/dist/utils/command-exists.js +41 -0
  207. package/dist/utils/command-exists.js.map +1 -0
  208. package/dist/utils/process-security.d.ts +19 -0
  209. package/dist/utils/process-security.js +90 -0
  210. package/dist/utils/process-security.js.map +1 -0
  211. package/dist/utils/rolling-buffer.d.ts +16 -0
  212. package/dist/utils/rolling-buffer.js +30 -0
  213. package/dist/utils/rolling-buffer.js.map +1 -0
  214. package/dist/utils/safe-spawn.d.ts +13 -0
  215. package/dist/utils/safe-spawn.js +49 -0
  216. package/dist/utils/safe-spawn.js.map +1 -0
  217. package/dist/worktree/manager.d.ts +69 -0
  218. package/dist/worktree/manager.js +593 -0
  219. package/dist/worktree/manager.js.map +1 -0
  220. package/dist/worktree/merge.d.ts +58 -0
  221. package/dist/worktree/merge.js +389 -0
  222. package/dist/worktree/merge.js.map +1 -0
  223. package/package.json +63 -0
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Episodic memory — persists successful thread strategies to disk.
3
+ *
4
+ * Records episodes after successful thread completions:
5
+ * - Task pattern (normalized keywords)
6
+ * - Agent + model used
7
+ * - Result quality (success, duration, cost, files changed)
8
+ * - Task slot + complexity classification
9
+ *
10
+ * Recall: given a new task, find similar past episodes and return
11
+ * the strategies that worked. Used to inform agent/model selection
12
+ * and provide context hints to the orchestrator.
13
+ *
14
+ * Storage: JSON files in ~/.swarm/memory/episodes/ indexed by
15
+ * task similarity hash (trigram-based).
16
+ */
17
+ import { createHash } from "node:crypto";
18
+ import * as fs from "node:fs";
19
+ import * as path from "node:path";
20
+ import { redactSecrets } from "../security/secret-filter.js";
21
+ // ── Helpers ────────────────────────────────────────────────────────────────
22
+ /** Stop words to filter from task keywords. */
23
+ const STOP_WORDS = new Set([
24
+ "the",
25
+ "a",
26
+ "an",
27
+ "is",
28
+ "are",
29
+ "was",
30
+ "were",
31
+ "be",
32
+ "been",
33
+ "being",
34
+ "have",
35
+ "has",
36
+ "had",
37
+ "do",
38
+ "does",
39
+ "did",
40
+ "will",
41
+ "would",
42
+ "could",
43
+ "should",
44
+ "may",
45
+ "might",
46
+ "shall",
47
+ "can",
48
+ "to",
49
+ "of",
50
+ "in",
51
+ "for",
52
+ "on",
53
+ "with",
54
+ "at",
55
+ "by",
56
+ "from",
57
+ "as",
58
+ "into",
59
+ "through",
60
+ "during",
61
+ "before",
62
+ "after",
63
+ "above",
64
+ "below",
65
+ "between",
66
+ "and",
67
+ "but",
68
+ "or",
69
+ "not",
70
+ "no",
71
+ "all",
72
+ "each",
73
+ "every",
74
+ "both",
75
+ "few",
76
+ "more",
77
+ "most",
78
+ "other",
79
+ "some",
80
+ "such",
81
+ "than",
82
+ "too",
83
+ "very",
84
+ "just",
85
+ "about",
86
+ "this",
87
+ "that",
88
+ "these",
89
+ "those",
90
+ "it",
91
+ "its",
92
+ "my",
93
+ "your",
94
+ "our",
95
+ ]);
96
+ /** Extract normalized keywords from a task string. */
97
+ function extractKeywords(task) {
98
+ return task
99
+ .toLowerCase()
100
+ .replace(/[^a-z0-9\s-_./]/g, " ")
101
+ .split(/\s+/)
102
+ .filter((w) => w.length > 2 && !STOP_WORDS.has(w))
103
+ .sort();
104
+ }
105
+ /** Generate trigrams from a string for fuzzy matching. */
106
+ function trigrams(s) {
107
+ const padded = ` ${s.toLowerCase()} `;
108
+ const result = new Set();
109
+ for (let i = 0; i < padded.length - 2; i++) {
110
+ result.add(padded.slice(i, i + 3));
111
+ }
112
+ return result;
113
+ }
114
+ /** Compute Jaccard similarity between two trigram sets. */
115
+ function trigramSimilarity(a, b) {
116
+ if (a.size === 0 && b.size === 0)
117
+ return 1;
118
+ let intersection = 0;
119
+ for (const t of a) {
120
+ if (b.has(t))
121
+ intersection++;
122
+ }
123
+ const union = a.size + b.size - intersection;
124
+ return union === 0 ? 0 : intersection / union;
125
+ }
126
+ /** Generate a deterministic episode ID. */
127
+ function episodeId(task, timestamp) {
128
+ return createHash("sha256").update(`${task}:${timestamp}`).digest("hex").slice(0, 16);
129
+ }
130
+ // ── Episodic Memory Store ──────────────────────────────────────────────────
131
+ export class EpisodicMemory {
132
+ memoryDir;
133
+ episodes = [];
134
+ loaded = false;
135
+ maxEpisodes;
136
+ constructor(memoryDir, maxEpisodes = 500) {
137
+ this.memoryDir = path.join(memoryDir, "episodes");
138
+ this.maxEpisodes = maxEpisodes;
139
+ }
140
+ /** Initialize — create directory and load existing episodes. */
141
+ async init() {
142
+ fs.mkdirSync(this.memoryDir, { recursive: true });
143
+ await this.loadAll();
144
+ }
145
+ /** Record a new episode from a completed thread. */
146
+ async record(params) {
147
+ // Only record successful episodes — failures don't teach useful strategies
148
+ if (!params.success) {
149
+ return {
150
+ id: "",
151
+ taskKeywords: [],
152
+ filesChangedCount: params.filesChanged.length,
153
+ timestamp: Date.now(),
154
+ ...params,
155
+ };
156
+ }
157
+ const timestamp = Date.now();
158
+ const episode = {
159
+ id: episodeId(params.task, timestamp),
160
+ task: params.task,
161
+ taskKeywords: extractKeywords(params.task),
162
+ agent: params.agent,
163
+ model: params.model,
164
+ slot: params.slot,
165
+ complexity: params.complexity,
166
+ success: params.success,
167
+ durationMs: params.durationMs,
168
+ estimatedCostUsd: params.estimatedCostUsd,
169
+ filesChangedCount: params.filesChanged.length,
170
+ filesChanged: params.filesChanged,
171
+ summary: redactSecrets(params.summary.slice(0, 2000)), // Cap stored summary + redact secrets
172
+ timestamp,
173
+ };
174
+ this.episodes.push(episode);
175
+ // Evict oldest if over capacity
176
+ if (this.episodes.length > this.maxEpisodes) {
177
+ const removed = this.episodes.shift();
178
+ this.deleteFile(removed.id);
179
+ }
180
+ // Persist to disk
181
+ await this.saveEpisode(episode);
182
+ return episode;
183
+ }
184
+ /**
185
+ * Recall similar past episodes for a given task.
186
+ * Returns episodes sorted by similarity (highest first).
187
+ */
188
+ recall(task, maxResults = 5, minSimilarity = 0.15) {
189
+ if (this.episodes.length === 0)
190
+ return [];
191
+ const taskTrigrams = trigrams(task);
192
+ const taskKeywords = new Set(extractKeywords(task));
193
+ const scored = [];
194
+ for (const episode of this.episodes) {
195
+ if (!episode.success)
196
+ continue;
197
+ // Trigram similarity on full task string
198
+ const triSim = trigramSimilarity(taskTrigrams, trigrams(episode.task));
199
+ // Keyword overlap bonus
200
+ const epKeywords = new Set(episode.taskKeywords);
201
+ let keywordOverlap = 0;
202
+ for (const kw of taskKeywords) {
203
+ if (epKeywords.has(kw))
204
+ keywordOverlap++;
205
+ }
206
+ const maxKeywords = Math.max(taskKeywords.size, epKeywords.size);
207
+ const kwSim = maxKeywords > 0 ? keywordOverlap / maxKeywords : 0;
208
+ // Combined similarity (weighted: trigrams 60%, keywords 40%)
209
+ const similarity = triSim * 0.6 + kwSim * 0.4;
210
+ if (similarity >= minSimilarity) {
211
+ scored.push({ episode, similarity });
212
+ }
213
+ }
214
+ return scored.sort((a, b) => b.similarity - a.similarity).slice(0, maxResults);
215
+ }
216
+ /**
217
+ * Get strategy recommendations based on past episodes.
218
+ * Returns a formatted string for inclusion in orchestrator context.
219
+ */
220
+ getStrategyHints(task) {
221
+ const recalls = this.recall(task, 3, 0.2);
222
+ if (recalls.length === 0)
223
+ return null;
224
+ const lines = ["Past successful strategies for similar tasks:"];
225
+ for (const { episode, similarity } of recalls) {
226
+ const sim = (similarity * 100).toFixed(0);
227
+ const cost = episode.estimatedCostUsd.toFixed(4);
228
+ const duration = (episode.durationMs / 1000).toFixed(1);
229
+ lines.push(` - [${sim}% match] "${episode.task.slice(0, 80)}" → ` +
230
+ `${episode.agent}/${episode.model} (${episode.slot}, ${duration}s, $${cost}, ` +
231
+ `${episode.filesChangedCount} files)`);
232
+ }
233
+ return lines.join("\n");
234
+ }
235
+ /**
236
+ * Get the best agent/model recommendation for a task based on past episodes.
237
+ * Returns null if no relevant episodes found.
238
+ */
239
+ recommendStrategy(task) {
240
+ const recalls = this.recall(task, 5, 0.25);
241
+ if (recalls.length === 0)
242
+ return null;
243
+ // Score agent+model pairs as composite keys to avoid mismatched combos
244
+ const pairScores = new Map();
245
+ for (const { episode, similarity } of recalls) {
246
+ const quality = 1 / (1 + episode.estimatedCostUsd * 10 + episode.durationMs / 60000);
247
+ const score = similarity * quality;
248
+ const pairKey = `${episode.agent}::${episode.model}`;
249
+ const existing = pairScores.get(pairKey);
250
+ if (existing) {
251
+ existing.score += score;
252
+ }
253
+ else {
254
+ pairScores.set(pairKey, { agent: episode.agent, model: episode.model, score });
255
+ }
256
+ }
257
+ // Pick highest-scoring agent+model pair
258
+ let bestPair = null;
259
+ for (const pair of pairScores.values()) {
260
+ if (!bestPair || pair.score > bestPair.score) {
261
+ bestPair = pair;
262
+ }
263
+ }
264
+ if (!bestPair)
265
+ return null;
266
+ return {
267
+ agent: bestPair.agent,
268
+ model: bestPair.model,
269
+ confidence: Math.min(1, recalls[0].similarity),
270
+ };
271
+ }
272
+ /**
273
+ * Get aggregate statistics across all episodes, grouped by agent.
274
+ *
275
+ * Returns per-agent success rates, average costs/durations, slot distributions,
276
+ * and a file-extension-to-agent mapping. Used by the model router as a fallback
277
+ * when no high-confidence episodic match exists.
278
+ *
279
+ * Returns null if no episodes are loaded (graceful degradation).
280
+ */
281
+ getAggregateStats() {
282
+ if (this.episodes.length === 0)
283
+ return null;
284
+ const perAgent = new Map();
285
+ const fileExtensions = new Map();
286
+ for (const episode of this.episodes) {
287
+ if (!episode.success)
288
+ continue;
289
+ // Initialize agent stats if needed
290
+ let stats = perAgent.get(episode.agent);
291
+ if (!stats) {
292
+ stats = {
293
+ totalEpisodes: 0,
294
+ avgDurationMs: 0,
295
+ avgCostUsd: 0,
296
+ slotCounts: new Map(),
297
+ fileExtensions: new Set(),
298
+ };
299
+ perAgent.set(episode.agent, stats);
300
+ }
301
+ // Running average: update incrementally
302
+ const n = stats.totalEpisodes;
303
+ stats.avgDurationMs = (stats.avgDurationMs * n + episode.durationMs) / (n + 1);
304
+ stats.avgCostUsd = (stats.avgCostUsd * n + episode.estimatedCostUsd) / (n + 1);
305
+ stats.totalEpisodes++;
306
+ // Slot counts
307
+ if (episode.slot) {
308
+ stats.slotCounts.set(episode.slot, (stats.slotCounts.get(episode.slot) || 0) + 1);
309
+ }
310
+ // Extract file extensions from changed files
311
+ for (const filePath of episode.filesChanged) {
312
+ const dotIdx = filePath.lastIndexOf(".");
313
+ if (dotIdx !== -1 && dotIdx < filePath.length - 1) {
314
+ const ext = filePath.slice(dotIdx).toLowerCase();
315
+ stats.fileExtensions.add(ext);
316
+ // Update global file extension → agent mapping
317
+ let agentMap = fileExtensions.get(ext);
318
+ if (!agentMap) {
319
+ agentMap = new Map();
320
+ fileExtensions.set(ext, agentMap);
321
+ }
322
+ agentMap.set(episode.agent, (agentMap.get(episode.agent) || 0) + 1);
323
+ }
324
+ }
325
+ }
326
+ return { perAgent, fileExtensions };
327
+ }
328
+ /** Get total episode count. */
329
+ get size() {
330
+ return this.episodes.length;
331
+ }
332
+ /** Get all episodes (for viewer). */
333
+ getAll() {
334
+ return [...this.episodes];
335
+ }
336
+ // ── Persistence ──────────────────────────────────────────────────────────
337
+ async loadAll() {
338
+ if (this.loaded)
339
+ return;
340
+ this.loaded = true;
341
+ if (!fs.existsSync(this.memoryDir))
342
+ return;
343
+ let files;
344
+ try {
345
+ files = fs.readdirSync(this.memoryDir).filter((f) => f.endsWith(".json"));
346
+ }
347
+ catch {
348
+ return;
349
+ }
350
+ for (const file of files) {
351
+ try {
352
+ const raw = fs.readFileSync(path.join(this.memoryDir, file), "utf-8");
353
+ const episode = JSON.parse(raw);
354
+ if (episode.id && episode.task) {
355
+ this.episodes.push(episode);
356
+ }
357
+ }
358
+ catch {
359
+ // Skip corrupt files
360
+ }
361
+ }
362
+ // Sort by timestamp (oldest first for consistent eviction)
363
+ this.episodes.sort((a, b) => a.timestamp - b.timestamp);
364
+ // Trim to max
365
+ while (this.episodes.length > this.maxEpisodes) {
366
+ const removed = this.episodes.shift();
367
+ this.deleteFile(removed.id);
368
+ }
369
+ }
370
+ async saveEpisode(episode) {
371
+ try {
372
+ const filePath = path.join(this.memoryDir, `${episode.id}.json`);
373
+ fs.writeFileSync(filePath, JSON.stringify(episode, null, 2), "utf-8");
374
+ }
375
+ catch {
376
+ // Non-fatal — memory is best-effort
377
+ }
378
+ }
379
+ deleteFile(id) {
380
+ try {
381
+ const filePath = path.join(this.memoryDir, `${id}.json`);
382
+ if (fs.existsSync(filePath)) {
383
+ fs.unlinkSync(filePath);
384
+ }
385
+ }
386
+ catch {
387
+ // Non-fatal
388
+ }
389
+ }
390
+ }
391
+ //# sourceMappingURL=episodic-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodic-memory.js","sourceRoot":"","sources":["../../src/labs/episodic-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAkE7D,8EAA8E;AAE9E,+CAA+C;AAC/C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IAC1B,KAAK;IACL,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;CACL,CAAC,CAAC;AAEH,sDAAsD;AACtD,SAAS,eAAe,CAAC,IAAY;IACpC,OAAO,IAAI;SACT,WAAW,EAAE;SACb,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACjD,IAAI,EAAE,CAAC;AACV,CAAC;AAED,0DAA0D;AAC1D,SAAS,QAAQ,CAAC,CAAS;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,2DAA2D;AAC3D,SAAS,iBAAiB,CAAC,CAAc,EAAE,CAAc;IACxD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,YAAY,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;IAC7C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;AAC/C,CAAC;AAED,2CAA2C;AAC3C,SAAS,SAAS,CAAC,IAAY,EAAE,SAAiB;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,8EAA8E;AAE9E,MAAM,OAAO,cAAc;IAClB,SAAS,CAAS;IAClB,QAAQ,GAAc,EAAE,CAAC;IACzB,MAAM,GAAY,KAAK,CAAC;IACxB,WAAW,CAAS;IAE5B,YAAY,SAAiB,EAAE,cAAsB,GAAG;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI;QACT,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,MAWZ;QACA,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;gBACN,EAAE,EAAE,EAAE;gBACN,YAAY,EAAE,EAAE;gBAChB,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,GAAG,MAAM;aACT,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAY;YACxB,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACrC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;YAC7C,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,sCAAsC;YAC7F,SAAS;SACT,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAG,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEhC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY,EAAE,aAAqB,CAAC,EAAE,gBAAwB,IAAI;QACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,SAAS;YAE/B,yCAAyC;YACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAEvE,wBAAwB;YACxB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,cAAc,EAAE,CAAC;YAC1C,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjE,6DAA6D;YAC7D,MAAM,UAAU,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;YAE9C,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,IAAY;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,KAAK,GAAa,CAAC,+CAA+C,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CACT,QAAQ,GAAG,aAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;gBACtD,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,KAAK,QAAQ,OAAO,IAAI,IAAI;gBAC9E,GAAG,OAAO,CAAC,iBAAiB,SAAS,CACtC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,IAAY;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,uEAAuE;QACvE,MAAM,UAAU,GAAiE,IAAI,GAAG,EAAE,CAAC;QAE3F,KAAK,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;YACrF,MAAM,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC;YAEnC,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACd,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACP,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,wCAAwC;QACxC,IAAI,QAAQ,GAA2D,IAAI,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC9C,QAAQ,GAAG,IAAI,CAAC;YACjB,CAAC;QACF,CAAC;QAED,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,OAAO;YACN,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;SAC9C,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,iBAAiB;QAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,QAAQ,GAAqC,IAAI,GAAG,EAAE,CAAC;QAC7D,MAAM,cAAc,GAAqC,IAAI,GAAG,EAAE,CAAC;QAEnE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,SAAS;YAE/B,mCAAmC;YACnC,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,KAAK,GAAG;oBACP,aAAa,EAAE,CAAC;oBAChB,aAAa,EAAE,CAAC;oBAChB,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,IAAI,GAAG,EAAE;oBACrB,cAAc,EAAE,IAAI,GAAG,EAAE;iBACzB,CAAC;gBACF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;YAED,wCAAwC;YACxC,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;YAC9B,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,KAAK,CAAC,aAAa,EAAE,CAAC;YAEtB,cAAc;YACd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,CAAC;YAED,6CAA6C;YAC7C,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;oBACjD,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAE9B,+CAA+C;oBAC/C,IAAI,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACf,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;wBACrB,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACnC,CAAC;oBACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACrC,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,qCAAqC;IACrC,MAAM;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,OAAO;QACpB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO;QAE3C,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACJ,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACR,OAAO;QACR,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,qBAAqB;YACtB,CAAC;QACF,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAExD,cAAc;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAG,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAgB;QACzC,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACR,oCAAoC;QACrC,CAAC;IACF,CAAC;IAEO,UAAU,CAAC,EAAU;QAC5B,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,YAAY;QACb,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Interactive swarm REPL — a persistent session for follow-up tasks,
3
+ * thread inspection, manual merge/reject, and live DAG visualization.
4
+ *
5
+ * Usage: swarm --dir ./project (no query argument enters interactive mode)
6
+ *
7
+ * Commands:
8
+ * <task> Run a task through the RLM orchestrator
9
+ * /threads (/t) List all threads with status, cost, duration
10
+ * /thread <id> Show detailed info for a specific thread
11
+ * /merge [id...] Merge specific thread branches (or all if no args)
12
+ * /reject <id> Discard a thread's worktree and branch
13
+ * /dag Show thread dependency DAG with status indicators
14
+ * /budget Show budget state
15
+ * /status Overall session status
16
+ * /help Show available commands
17
+ * /quit (/exit) Cleanup and exit
18
+ */
19
+ import "./env.js";
20
+ export declare function runInteractiveSwarm(rawArgs: string[]): Promise<void>;