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
package/dist/labs/cli.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Standalone RLM CLI — run Recursive Language Model queries from the terminal.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx tsx src/cli.ts --file large-file.txt "What are the main themes?"
|
|
7
|
+
* npx tsx src/cli.ts --url https://example.com/big.txt "Summarize this"
|
|
8
|
+
* cat data.txt | npx tsx src/cli.ts --stdin "Count the errors"
|
|
9
|
+
*
|
|
10
|
+
* Environment (pick one):
|
|
11
|
+
* ANTHROPIC_API_KEY — for Anthropic models
|
|
12
|
+
* OPENAI_API_KEY — for OpenAI models
|
|
13
|
+
* GEMINI_API_KEY — for Google models
|
|
14
|
+
*/
|
|
15
|
+
import "./env.js";
|
|
16
|
+
import * as fs from "node:fs";
|
|
17
|
+
// Dynamic imports — ensures env.js has set process.env BEFORE pi-ai loads
|
|
18
|
+
const { getModels, getProviders } = await import("@mariozechner/pi-ai");
|
|
19
|
+
const { PythonRepl } = await import("../core/repl.js");
|
|
20
|
+
const { runRlmLoop } = await import("../core/rlm.js");
|
|
21
|
+
// ── Arg parsing ─────────────────────────────────────────────────────────────
|
|
22
|
+
function usage() {
|
|
23
|
+
console.error(`
|
|
24
|
+
swarm run — Text processing mode (RLM)
|
|
25
|
+
|
|
26
|
+
USAGE
|
|
27
|
+
swarm run [OPTIONS] "<query>"
|
|
28
|
+
|
|
29
|
+
OPTIONS
|
|
30
|
+
--model <id> Model ID (default: RLM_MODEL from .env)
|
|
31
|
+
--file <path> Read context from a file
|
|
32
|
+
--url <url> Fetch context from a URL
|
|
33
|
+
--stdin Read context from stdin (pipe data in)
|
|
34
|
+
--allow-hooks Enable lifecycle hooks execution (default: disabled)
|
|
35
|
+
--verbose Show iteration progress
|
|
36
|
+
|
|
37
|
+
EXAMPLES
|
|
38
|
+
swarm run --file big.txt "List all classes"
|
|
39
|
+
curl -s https://example.com/large.py | swarm run --stdin "Summarize"
|
|
40
|
+
swarm run --url https://raw.githubusercontent.com/.../typing.py "Count public classes"
|
|
41
|
+
`.trim());
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
function parseArgs() {
|
|
45
|
+
const args = process.argv.slice(2);
|
|
46
|
+
let modelId;
|
|
47
|
+
let file;
|
|
48
|
+
let url;
|
|
49
|
+
let useStdin = false;
|
|
50
|
+
let allowHooks = false;
|
|
51
|
+
let verbose = false;
|
|
52
|
+
const positional = [];
|
|
53
|
+
for (let i = 0; i < args.length; i++) {
|
|
54
|
+
const arg = args[i];
|
|
55
|
+
if (arg === "--model" && i + 1 < args.length) {
|
|
56
|
+
modelId = args[++i];
|
|
57
|
+
}
|
|
58
|
+
else if (arg === "--file" && i + 1 < args.length) {
|
|
59
|
+
file = args[++i];
|
|
60
|
+
}
|
|
61
|
+
else if (arg === "--url" && i + 1 < args.length) {
|
|
62
|
+
url = args[++i];
|
|
63
|
+
}
|
|
64
|
+
else if (arg === "--stdin") {
|
|
65
|
+
useStdin = true;
|
|
66
|
+
}
|
|
67
|
+
else if (arg === "--allow-hooks") {
|
|
68
|
+
allowHooks = true;
|
|
69
|
+
}
|
|
70
|
+
else if (arg === "--verbose") {
|
|
71
|
+
verbose = true;
|
|
72
|
+
}
|
|
73
|
+
else if (arg === "--help" || arg === "-h") {
|
|
74
|
+
usage();
|
|
75
|
+
}
|
|
76
|
+
else if (!arg.startsWith("--")) {
|
|
77
|
+
positional.push(arg);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.error(`Unknown option: ${arg}`);
|
|
81
|
+
usage();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!modelId) {
|
|
85
|
+
modelId = process.env.RLM_MODEL || "claude-sonnet-4-6";
|
|
86
|
+
}
|
|
87
|
+
if (positional.length === 0) {
|
|
88
|
+
console.error("Error: query argument is required");
|
|
89
|
+
usage();
|
|
90
|
+
}
|
|
91
|
+
const query = positional.join(" ");
|
|
92
|
+
if (!file && !url && !useStdin) {
|
|
93
|
+
console.error("Error: one of --file, --url, or --stdin is required");
|
|
94
|
+
usage();
|
|
95
|
+
}
|
|
96
|
+
return { modelId, file, url, useStdin, allowHooks, verbose, query };
|
|
97
|
+
}
|
|
98
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
99
|
+
const MAX_STDIN_BYTES = 50 * 1024 * 1024; // 50MB
|
|
100
|
+
async function readStdin() {
|
|
101
|
+
const chunks = [];
|
|
102
|
+
let total = 0;
|
|
103
|
+
for await (const chunk of process.stdin) {
|
|
104
|
+
total += chunk.length;
|
|
105
|
+
if (total > MAX_STDIN_BYTES) {
|
|
106
|
+
throw new Error(`stdin exceeds ${MAX_STDIN_BYTES / 1024 / 1024}MB limit`);
|
|
107
|
+
}
|
|
108
|
+
chunks.push(chunk);
|
|
109
|
+
}
|
|
110
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
111
|
+
}
|
|
112
|
+
const FETCH_TIMEOUT_MS = 30_000;
|
|
113
|
+
const MAX_RESPONSE_BYTES = 50 * 1024 * 1024; // 50MB
|
|
114
|
+
async function fetchUrl(url) {
|
|
115
|
+
const resp = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
|
|
116
|
+
if (!resp.ok) {
|
|
117
|
+
throw new Error(`Failed to fetch ${url}: ${resp.status} ${resp.statusText}`);
|
|
118
|
+
}
|
|
119
|
+
const contentLength = resp.headers.get("content-length");
|
|
120
|
+
if (contentLength && parseInt(contentLength, 10) > MAX_RESPONSE_BYTES) {
|
|
121
|
+
throw new Error(`Response too large (${(parseInt(contentLength, 10) / 1024 / 1024).toFixed(1)}MB). Limit is ${MAX_RESPONSE_BYTES / 1024 / 1024}MB.`);
|
|
122
|
+
}
|
|
123
|
+
const text = await resp.text();
|
|
124
|
+
if (text.length > MAX_RESPONSE_BYTES) {
|
|
125
|
+
throw new Error(`Response too large (${(text.length / 1024 / 1024).toFixed(1)}MB). Limit is ${MAX_RESPONSE_BYTES / 1024 / 1024}MB.`);
|
|
126
|
+
}
|
|
127
|
+
return text;
|
|
128
|
+
}
|
|
129
|
+
// ── Main ────────────────────────────────────────────────────────────────────
|
|
130
|
+
async function main() {
|
|
131
|
+
const args = parseArgs();
|
|
132
|
+
// Provider → env var mapping
|
|
133
|
+
const providerKeys = {
|
|
134
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
135
|
+
openai: "OPENAI_API_KEY",
|
|
136
|
+
google: "GEMINI_API_KEY",
|
|
137
|
+
};
|
|
138
|
+
const defaultModels = {
|
|
139
|
+
anthropic: "claude-sonnet-4-6",
|
|
140
|
+
openai: "gpt-4o",
|
|
141
|
+
google: "gemini-2.5-flash",
|
|
142
|
+
};
|
|
143
|
+
// Resolve model — ensure provider has an API key
|
|
144
|
+
// Prioritise well-known providers so e.g. "gpt-4o" picks "openai" not "azure-openai-responses"
|
|
145
|
+
let model;
|
|
146
|
+
let _resolvedProvider = "";
|
|
147
|
+
const allModelIds = [];
|
|
148
|
+
const knownProviders = new Set(Object.keys(providerKeys));
|
|
149
|
+
// First pass: only well-known providers
|
|
150
|
+
for (const provider of getProviders()) {
|
|
151
|
+
const providerModels = getModels(provider);
|
|
152
|
+
for (const m of providerModels) {
|
|
153
|
+
allModelIds.push(m.id);
|
|
154
|
+
if (!model && m.id === args.modelId && knownProviders.has(provider)) {
|
|
155
|
+
const key = providerKeys[provider];
|
|
156
|
+
if (process.env[key]) {
|
|
157
|
+
model = m;
|
|
158
|
+
_resolvedProvider = provider;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Second pass: remaining providers (if not found above)
|
|
164
|
+
if (!model) {
|
|
165
|
+
for (const provider of getProviders()) {
|
|
166
|
+
if (knownProviders.has(provider))
|
|
167
|
+
continue;
|
|
168
|
+
for (const m of getModels(provider)) {
|
|
169
|
+
if (m.id === args.modelId) {
|
|
170
|
+
const key = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
|
|
171
|
+
if (process.env[key]) {
|
|
172
|
+
model = m;
|
|
173
|
+
_resolvedProvider = provider;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (model)
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Fallback: if default model's provider has no key, pick one that does
|
|
183
|
+
if (!model) {
|
|
184
|
+
for (const [prov, envKey] of Object.entries(providerKeys)) {
|
|
185
|
+
if (!process.env[envKey])
|
|
186
|
+
continue;
|
|
187
|
+
const fallbackId = defaultModels[prov];
|
|
188
|
+
if (!fallbackId)
|
|
189
|
+
continue;
|
|
190
|
+
for (const p of getProviders()) {
|
|
191
|
+
if (p !== prov)
|
|
192
|
+
continue;
|
|
193
|
+
for (const m of getModels(p)) {
|
|
194
|
+
if (m.id === fallbackId) {
|
|
195
|
+
model = m;
|
|
196
|
+
_resolvedProvider = prov;
|
|
197
|
+
args.modelId = fallbackId;
|
|
198
|
+
console.error(`Note: using ${fallbackId} (${prov}) — set RLM_MODEL to override`);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (model)
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
if (model)
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (!model) {
|
|
210
|
+
console.error(`Error: unknown model "${args.modelId}"`);
|
|
211
|
+
console.error(`Available models: ${allModelIds.join(", ")}`);
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
// Load context
|
|
215
|
+
let context;
|
|
216
|
+
if (args.file) {
|
|
217
|
+
try {
|
|
218
|
+
const stat = fs.statSync(args.file);
|
|
219
|
+
if (stat.isDirectory()) {
|
|
220
|
+
console.error(`Error: "${args.file}" is a directory. Use the interactive mode (\`rlm\`) for directory loading.`);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
console.error(`Error: could not access "${args.file}": ${err.message}`);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
console.error(`Reading context from file: ${args.file}`);
|
|
229
|
+
try {
|
|
230
|
+
context = fs.readFileSync(args.file, "utf-8");
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
console.error(`Error: could not read file "${args.file}": ${err.message}`);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else if (args.url) {
|
|
238
|
+
console.error(`Fetching context from URL: ${args.url}`);
|
|
239
|
+
context = await fetchUrl(args.url);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.error("Reading context from stdin...");
|
|
243
|
+
context = await readStdin();
|
|
244
|
+
}
|
|
245
|
+
console.error(`Context loaded: ${context.length.toLocaleString()} characters`);
|
|
246
|
+
console.error(`Model: ${model.id}`);
|
|
247
|
+
console.error(`Query: ${args.query}`);
|
|
248
|
+
console.error("---");
|
|
249
|
+
// Start REPL: PythonRepl if explicitly specified; NodeVmRepl is deprecated/disabled
|
|
250
|
+
const usePython = process.argv.includes("--python-repl") || process.argv.includes("--repl=python");
|
|
251
|
+
if (!usePython) {
|
|
252
|
+
console.error("Error: In-process JavaScript execution has been permanently deprecated for security. Pass --python-repl for Python text processing.");
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
const repl = new PythonRepl();
|
|
256
|
+
const ac = new AbortController();
|
|
257
|
+
const abortAndExit = () => {
|
|
258
|
+
console.error("\nAborting...");
|
|
259
|
+
ac.abort();
|
|
260
|
+
};
|
|
261
|
+
process.on("SIGINT", abortAndExit);
|
|
262
|
+
process.on("SIGTERM", abortAndExit);
|
|
263
|
+
try {
|
|
264
|
+
await repl.start(ac.signal);
|
|
265
|
+
const startTime = Date.now();
|
|
266
|
+
const result = await runRlmLoop({
|
|
267
|
+
context,
|
|
268
|
+
query: args.query,
|
|
269
|
+
model,
|
|
270
|
+
repl,
|
|
271
|
+
signal: ac.signal,
|
|
272
|
+
onProgress: args.verbose
|
|
273
|
+
? (info) => {
|
|
274
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
275
|
+
console.error(`[${elapsed}s] Iteration ${info.iteration}/${info.maxIterations} | ` +
|
|
276
|
+
`Sub-queries: ${info.subQueries} | Phase: ${info.phase}`);
|
|
277
|
+
}
|
|
278
|
+
: undefined,
|
|
279
|
+
});
|
|
280
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
281
|
+
console.error("---");
|
|
282
|
+
console.error(`Completed in ${elapsed}s | ${result.iterations} iterations | ${result.totalSubQueries} sub-queries | ${result.completed ? "success" : "incomplete"}`);
|
|
283
|
+
console.error("---");
|
|
284
|
+
// Write the answer to stdout (not stderr) so it can be piped
|
|
285
|
+
console.log(result.answer);
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
repl.shutdown();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
main().catch((err) => {
|
|
292
|
+
console.error("Fatal error:", err);
|
|
293
|
+
process.exit(1);
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/labs/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
export interface Episode {
|
|
18
|
+
/** Unique episode ID (SHA-256 of task + timestamp). */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Original task description. */
|
|
21
|
+
task: string;
|
|
22
|
+
/** Normalized task keywords for similarity matching. */
|
|
23
|
+
taskKeywords: string[];
|
|
24
|
+
/** Agent backend used. */
|
|
25
|
+
agent: string;
|
|
26
|
+
/** Model used. */
|
|
27
|
+
model: string;
|
|
28
|
+
/** Task slot (execution/search/reasoning/planning). */
|
|
29
|
+
slot: string;
|
|
30
|
+
/** Task complexity (simple/medium/complex). */
|
|
31
|
+
complexity: string;
|
|
32
|
+
/** Whether the thread succeeded. */
|
|
33
|
+
success: boolean;
|
|
34
|
+
/** Duration in ms. */
|
|
35
|
+
durationMs: number;
|
|
36
|
+
/** Estimated cost in USD. */
|
|
37
|
+
estimatedCostUsd: number;
|
|
38
|
+
/** Number of files changed. */
|
|
39
|
+
filesChangedCount: number;
|
|
40
|
+
/** File paths changed (for pattern matching). */
|
|
41
|
+
filesChanged: string[];
|
|
42
|
+
/** Compressed result summary (the episode content). */
|
|
43
|
+
summary: string;
|
|
44
|
+
/** Timestamp. */
|
|
45
|
+
timestamp: number;
|
|
46
|
+
}
|
|
47
|
+
export interface EpisodeRecall {
|
|
48
|
+
episode: Episode;
|
|
49
|
+
/** Similarity score (0-1). */
|
|
50
|
+
similarity: number;
|
|
51
|
+
}
|
|
52
|
+
/** Per-agent aggregate statistics derived from episodic memory. */
|
|
53
|
+
export interface AgentAggregateStats {
|
|
54
|
+
/** Total number of successful episodes. */
|
|
55
|
+
totalEpisodes: number;
|
|
56
|
+
/** Average duration in ms. */
|
|
57
|
+
avgDurationMs: number;
|
|
58
|
+
/** Average cost in USD. */
|
|
59
|
+
avgCostUsd: number;
|
|
60
|
+
/** Success count per slot (execution/search/reasoning/planning). */
|
|
61
|
+
slotCounts: Map<string, number>;
|
|
62
|
+
/** File extensions this agent has successfully worked with. */
|
|
63
|
+
fileExtensions: Set<string>;
|
|
64
|
+
}
|
|
65
|
+
/** Aggregate stats across all agents. */
|
|
66
|
+
export interface AggregateStats {
|
|
67
|
+
/** Per-agent statistics. */
|
|
68
|
+
perAgent: Map<string, AgentAggregateStats>;
|
|
69
|
+
/**
|
|
70
|
+
* File extension → agent → success count.
|
|
71
|
+
* Used by the router to boost agents that handle specific file types well.
|
|
72
|
+
*/
|
|
73
|
+
fileExtensions: Map<string, Map<string, number>>;
|
|
74
|
+
}
|
|
75
|
+
export declare class EpisodicMemory {
|
|
76
|
+
private memoryDir;
|
|
77
|
+
private episodes;
|
|
78
|
+
private loaded;
|
|
79
|
+
private maxEpisodes;
|
|
80
|
+
constructor(memoryDir: string, maxEpisodes?: number);
|
|
81
|
+
/** Initialize — create directory and load existing episodes. */
|
|
82
|
+
init(): Promise<void>;
|
|
83
|
+
/** Record a new episode from a completed thread. */
|
|
84
|
+
record(params: {
|
|
85
|
+
task: string;
|
|
86
|
+
agent: string;
|
|
87
|
+
model: string;
|
|
88
|
+
slot: string;
|
|
89
|
+
complexity: string;
|
|
90
|
+
success: boolean;
|
|
91
|
+
durationMs: number;
|
|
92
|
+
estimatedCostUsd: number;
|
|
93
|
+
filesChanged: string[];
|
|
94
|
+
summary: string;
|
|
95
|
+
}): Promise<Episode>;
|
|
96
|
+
/**
|
|
97
|
+
* Recall similar past episodes for a given task.
|
|
98
|
+
* Returns episodes sorted by similarity (highest first).
|
|
99
|
+
*/
|
|
100
|
+
recall(task: string, maxResults?: number, minSimilarity?: number): EpisodeRecall[];
|
|
101
|
+
/**
|
|
102
|
+
* Get strategy recommendations based on past episodes.
|
|
103
|
+
* Returns a formatted string for inclusion in orchestrator context.
|
|
104
|
+
*/
|
|
105
|
+
getStrategyHints(task: string): string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Get the best agent/model recommendation for a task based on past episodes.
|
|
108
|
+
* Returns null if no relevant episodes found.
|
|
109
|
+
*/
|
|
110
|
+
recommendStrategy(task: string): {
|
|
111
|
+
agent: string;
|
|
112
|
+
model: string;
|
|
113
|
+
confidence: number;
|
|
114
|
+
} | null;
|
|
115
|
+
/**
|
|
116
|
+
* Get aggregate statistics across all episodes, grouped by agent.
|
|
117
|
+
*
|
|
118
|
+
* Returns per-agent success rates, average costs/durations, slot distributions,
|
|
119
|
+
* and a file-extension-to-agent mapping. Used by the model router as a fallback
|
|
120
|
+
* when no high-confidence episodic match exists.
|
|
121
|
+
*
|
|
122
|
+
* Returns null if no episodes are loaded (graceful degradation).
|
|
123
|
+
*/
|
|
124
|
+
getAggregateStats(): AggregateStats | null;
|
|
125
|
+
/** Get total episode count. */
|
|
126
|
+
get size(): number;
|
|
127
|
+
/** Get all episodes (for viewer). */
|
|
128
|
+
getAll(): Episode[];
|
|
129
|
+
private loadAll;
|
|
130
|
+
private saveEpisode;
|
|
131
|
+
private deleteFile;
|
|
132
|
+
}
|