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.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/mcp.mjs +61 -0
- package/bin/swarm.mjs +45 -0
- package/dist/agents/aider.d.ts +12 -0
- package/dist/agents/aider.js +192 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/claude-code.d.ts +9 -0
- package/dist/agents/claude-code.js +236 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/codex.d.ts +14 -0
- package/dist/agents/codex.js +203 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/direct-llm.d.ts +22 -0
- package/dist/agents/direct-llm.js +254 -0
- package/dist/agents/direct-llm.js.map +1 -0
- package/dist/agents/mock.d.ts +10 -0
- package/dist/agents/mock.js +170 -0
- package/dist/agents/mock.js.map +1 -0
- package/dist/agents/opencode.d.ts +23 -0
- package/dist/agents/opencode.js +631 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/provider.d.ts +11 -0
- package/dist/agents/provider.js +31 -0
- package/dist/agents/provider.js.map +1 -0
- package/dist/compression/compressor.d.ts +28 -0
- package/dist/compression/compressor.js +268 -0
- package/dist/compression/compressor.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/contextos/loader.d.ts +46 -0
- package/dist/contextos/loader.js +120 -0
- package/dist/contextos/loader.js.map +1 -0
- package/dist/contextos/selector.d.ts +46 -0
- package/dist/contextos/selector.js +80 -0
- package/dist/contextos/selector.js.map +1 -0
- package/dist/core/action-dispatcher.d.ts +15 -0
- package/dist/core/action-dispatcher.js +28 -0
- package/dist/core/action-dispatcher.js.map +1 -0
- package/dist/core/action-schema.d.ts +72 -0
- package/dist/core/action-schema.js +86 -0
- package/dist/core/action-schema.js.map +1 -0
- package/dist/core/repl-interface.d.ts +48 -0
- package/dist/core/repl-interface.js +5 -0
- package/dist/core/repl-interface.js.map +1 -0
- package/dist/core/repl.d.ts +59 -0
- package/dist/core/repl.js +353 -0
- package/dist/core/repl.js.map +1 -0
- package/dist/core/rlm.d.ts +65 -0
- package/dist/core/rlm.js +564 -0
- package/dist/core/rlm.js.map +1 -0
- package/dist/core/runtime.py +470 -0
- package/dist/core/types.d.ts +265 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/hooks/runner.d.ts +43 -0
- package/dist/hooks/runner.js +173 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/labs/cli.d.ts +15 -0
- package/dist/labs/cli.js +295 -0
- package/dist/labs/cli.js.map +1 -0
- package/dist/labs/episodic-memory.d.ts +132 -0
- package/dist/labs/episodic-memory.js +391 -0
- package/dist/labs/episodic-memory.js.map +1 -0
- package/dist/labs/interactive-swarm.d.ts +20 -0
- package/dist/labs/interactive-swarm.js +1173 -0
- package/dist/labs/interactive-swarm.js.map +1 -0
- package/dist/labs/interactive.d.ts +10 -0
- package/dist/labs/interactive.js +2099 -0
- package/dist/labs/interactive.js.map +1 -0
- package/dist/labs/ts-analyzer.d.ts +74 -0
- package/dist/labs/ts-analyzer.js +379 -0
- package/dist/labs/ts-analyzer.js.map +1 -0
- package/dist/labs/viewer.d.ts +12 -0
- package/dist/labs/viewer.js +1284 -0
- package/dist/labs/viewer.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.js +247 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +192775 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +117 -0
- package/dist/mcp/session.js +450 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/state.d.ts +42 -0
- package/dist/mcp/state.js +537 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/mcp/tools/contextos.d.ts +17 -0
- package/dist/mcp/tools/contextos.js +583 -0
- package/dist/mcp/tools/contextos.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.js +393 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestration/reviewer-gate.d.ts +43 -0
- package/dist/orchestration/reviewer-gate.js +280 -0
- package/dist/orchestration/reviewer-gate.js.map +1 -0
- package/dist/orchestration/reviewer-prompt.d.ts +18 -0
- package/dist/orchestration/reviewer-prompt.js +67 -0
- package/dist/orchestration/reviewer-prompt.js.map +1 -0
- package/dist/orchestration/verification-runner.d.ts +53 -0
- package/dist/orchestration/verification-runner.js +352 -0
- package/dist/orchestration/verification-runner.js.map +1 -0
- package/dist/plugins/adapter.d.ts +11 -0
- package/dist/plugins/adapter.js +11 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/core/archive.d.ts +9 -0
- package/dist/plugins/core/archive.js +128 -0
- package/dist/plugins/core/archive.js.map +1 -0
- package/dist/plugins/core/digest.d.ts +11 -0
- package/dist/plugins/core/digest.js +70 -0
- package/dist/plugins/core/digest.js.map +1 -0
- package/dist/plugins/core/grants.d.ts +22 -0
- package/dist/plugins/core/grants.js +90 -0
- package/dist/plugins/core/grants.js.map +1 -0
- package/dist/plugins/core/index.d.ts +10 -0
- package/dist/plugins/core/index.js +11 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/core/pinning.d.ts +15 -0
- package/dist/plugins/core/pinning.js +86 -0
- package/dist/plugins/core/pinning.js.map +1 -0
- package/dist/plugins/core/types.d.ts +105 -0
- package/dist/plugins/core/types.js +22 -0
- package/dist/plugins/core/types.js.map +1 -0
- package/dist/plugins/core/updater.d.ts +16 -0
- package/dist/plugins/core/updater.js +64 -0
- package/dist/plugins/core/updater.js.map +1 -0
- package/dist/plugins/loader.d.ts +65 -0
- package/dist/plugins/loader.js +110 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/prompts/orchestrator.d.ts +6 -0
- package/dist/prompts/orchestrator.js +114 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/routing/model-resolver.d.ts +27 -0
- package/dist/routing/model-resolver.js +265 -0
- package/dist/routing/model-resolver.js.map +1 -0
- package/dist/routing/model-router.d.ts +130 -0
- package/dist/routing/model-router.js +515 -0
- package/dist/routing/model-router.js.map +1 -0
- package/dist/runtime/attestations.cjs +260 -0
- package/dist/runtime/reviewer-pipeline.cjs +319 -0
- package/dist/runtime/sandbox.cjs +468 -0
- package/dist/runtime/state-machine.cjs +885 -0
- package/dist/runtime/thread-store.cjs +175 -0
- package/dist/runtime/transactional-git.cjs +315 -0
- package/dist/runtime/verification-pipeline.cjs +435 -0
- package/dist/sandbox/execution.d.ts +165 -0
- package/dist/sandbox/execution.js +497 -0
- package/dist/sandbox/execution.js.map +1 -0
- package/dist/security/file-policy.d.ts +22 -0
- package/dist/security/file-policy.js +53 -0
- package/dist/security/file-policy.js.map +1 -0
- package/dist/security/repository-boundary.d.ts +21 -0
- package/dist/security/repository-boundary.js +119 -0
- package/dist/security/repository-boundary.js.map +1 -0
- package/dist/security/secret-filter.d.ts +36 -0
- package/dist/security/secret-filter.js +149 -0
- package/dist/security/secret-filter.js.map +1 -0
- package/dist/swarm.d.ts +14 -0
- package/dist/swarm.js +624 -0
- package/dist/swarm.js.map +1 -0
- package/dist/threads/cache.d.ts +64 -0
- package/dist/threads/cache.js +241 -0
- package/dist/threads/cache.js.map +1 -0
- package/dist/threads/manager.d.ts +94 -0
- package/dist/threads/manager.js +914 -0
- package/dist/threads/manager.js.map +1 -0
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.js +42 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/dashboard.d.ts +33 -0
- package/dist/ui/dashboard.js +135 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.js +12 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/log.d.ts +39 -0
- package/dist/ui/log.js +126 -0
- package/dist/ui/log.js.map +1 -0
- package/dist/ui/onboarding.d.ts +14 -0
- package/dist/ui/onboarding.js +755 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/run-log.d.ts +50 -0
- package/dist/ui/run-log.js +60 -0
- package/dist/ui/run-log.js.map +1 -0
- package/dist/ui/spinner.d.ts +41 -0
- package/dist/ui/spinner.js +172 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/streaming-feed.d.ts +72 -0
- package/dist/ui/streaming-feed.js +386 -0
- package/dist/ui/streaming-feed.js.map +1 -0
- package/dist/ui/summary.d.ts +18 -0
- package/dist/ui/summary.js +113 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/ui/text-input.d.ts +19 -0
- package/dist/ui/text-input.js +266 -0
- package/dist/ui/text-input.js.map +1 -0
- package/dist/ui/theme.d.ts +63 -0
- package/dist/ui/theme.js +97 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/command-exists.d.ts +11 -0
- package/dist/utils/command-exists.js +41 -0
- package/dist/utils/command-exists.js.map +1 -0
- package/dist/utils/process-security.d.ts +19 -0
- package/dist/utils/process-security.js +90 -0
- package/dist/utils/process-security.js.map +1 -0
- package/dist/utils/rolling-buffer.d.ts +16 -0
- package/dist/utils/rolling-buffer.js +30 -0
- package/dist/utils/rolling-buffer.js.map +1 -0
- package/dist/utils/safe-spawn.d.ts +13 -0
- package/dist/utils/safe-spawn.js +49 -0
- package/dist/utils/safe-spawn.js.map +1 -0
- package/dist/worktree/manager.d.ts +69 -0
- package/dist/worktree/manager.js +593 -0
- package/dist/worktree/manager.js.map +1 -0
- package/dist/worktree/merge.d.ts +58 -0
- package/dist/worktree/merge.js +389 -0
- package/dist/worktree/merge.js.map +1 -0
- 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":"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"}
|
|
@@ -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>;
|