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
package/dist/swarm.js ADDED
@@ -0,0 +1,624 @@
1
+ /**
2
+ * Swarm mode — orchestrates coding agents in parallel via the RLM loop.
3
+ *
4
+ * Usage: swarm --dir ./my-project "add error handling to all API routes"
5
+ *
6
+ * This module:
7
+ * 1. Parses swarm-specific CLI args
8
+ * 2. Scans the target directory to build a codebase context
9
+ * 3. Sets up ThreadManager + WorktreeManager
10
+ * 4. Runs the RLM loop with the swarm orchestrator prompt
11
+ * 5. Cleans up worktrees on exit
12
+ */
13
+ import "./env.js";
14
+ import * as fs from "node:fs";
15
+ import * as path from "node:path";
16
+ // Dynamic imports — ensures env.js has set process.env BEFORE pi-ai loads
17
+ await import("@mariozechner/pi-ai");
18
+ const { PythonRepl } = await import("./core/repl.js");
19
+ const { ActionDispatcher } = await import("./core/action-dispatcher.js");
20
+ const { runRlmLoop } = await import("./core/rlm.js");
21
+ const { loadConfig } = await import("./config.js");
22
+ // Register agent backends
23
+ const opencodeMod = await import("./agents/opencode.js");
24
+ await import("./agents/direct-llm.js");
25
+ await import("./agents/claude-code.js");
26
+ await import("./agents/codex.js");
27
+ await import("./agents/aider.js");
28
+ import { randomBytes } from "node:crypto";
29
+ // Api/Model types used via resolveModel from model-resolver
30
+ import { loadHooks, runHooks } from "./hooks/runner.js";
31
+ import { EpisodicMemory } from "./labs/episodic-memory.js";
32
+ import { buildSwarmSystemPrompt } from "./prompts/orchestrator.js";
33
+ import { resolveModel } from "./routing/model-resolver.js";
34
+ import { classifyTaskComplexity, describeAvailableAgents, FailureTracker, routeTask } from "./routing/model-router.js";
35
+ import { assertWithinRepository } from "./security/repository-boundary.js";
36
+ import { containsSecrets, isBlockedPath, redactSecrets } from "./security/secret-filter.js";
37
+ import { ThreadManager } from "./threads/manager.js";
38
+ import { renderBanner } from "./ui/banner.js";
39
+ import { ThreadDashboard } from "./ui/dashboard.js";
40
+ import { isJsonMode, logAnswer, logError, logRouter, logSuccess, logVerbose, logWarn, setJsonMode, setLogLevel, } from "./ui/log.js";
41
+ import { runOnboarding } from "./ui/onboarding.js";
42
+ // UI system
43
+ import { Spinner } from "./ui/spinner.js";
44
+ import { StreamingFeed } from "./ui/streaming-feed.js";
45
+ import { renderSummary } from "./ui/summary.js";
46
+ import { mergeAllThreads } from "./worktree/merge.js";
47
+ function parseSwarmArgs(args) {
48
+ let dir = "";
49
+ let orchestratorModel = "";
50
+ let agent = "";
51
+ let dryRun = false;
52
+ let maxBudget = null;
53
+ let verbose = false;
54
+ let quiet = false;
55
+ let json = false;
56
+ let autoRoute = false;
57
+ let allowHooks = false;
58
+ let replBackend = "node";
59
+ const positional = [];
60
+ for (let i = 0; i < args.length; i++) {
61
+ const arg = args[i];
62
+ if (arg === "--help" || arg === "-h") {
63
+ process.stderr.write(`\nUsage: swarm --dir <path> [options] "your task"\n\n`);
64
+ process.stderr.write(`Options:\n`);
65
+ process.stderr.write(` --dir <path> Target repository directory\n`);
66
+ process.stderr.write(` --orchestrator <model> Orchestrator LLM model\n`);
67
+ process.stderr.write(` --agent <backend> Agent backend (opencode, claude, codex, aider)\n`);
68
+ process.stderr.write(` --repl <node|python> REPL execution engine (default: node)\n`);
69
+ process.stderr.write(` --python-repl Use legacy Python runtime.py subprocess\n`);
70
+ process.stderr.write(` --allow-hooks Enable lifecycle hooks execution (default: disabled)\n`);
71
+ process.stderr.write(` --dry-run Plan only, don't spawn threads\n`);
72
+ process.stderr.write(` --max-budget <usd> Maximum session budget\n`);
73
+ process.stderr.write(` --auto-route Enable automatic model selection\n`);
74
+ process.stderr.write(` --verbose Detailed progress output\n`);
75
+ process.stderr.write(` --quiet / -q Suppress non-essential output\n`);
76
+ process.stderr.write(` --json Machine-readable JSON output\n\n`);
77
+ process.exit(0);
78
+ }
79
+ else if (arg === "--dir" && i + 1 < args.length) {
80
+ dir = args[++i];
81
+ }
82
+ else if (arg === "--orchestrator" && i + 1 < args.length) {
83
+ orchestratorModel = args[++i];
84
+ }
85
+ else if (arg === "--agent" && i + 1 < args.length) {
86
+ agent = args[++i];
87
+ }
88
+ else if (arg === "--allow-hooks") {
89
+ allowHooks = true;
90
+ }
91
+ else if (arg === "--repl" && i + 1 < args.length) {
92
+ const val = args[++i].toLowerCase();
93
+ replBackend = val === "python" ? "python" : "node";
94
+ }
95
+ else if (arg === "--python-repl") {
96
+ replBackend = "python";
97
+ }
98
+ else if (arg === "--dry-run") {
99
+ dryRun = true;
100
+ }
101
+ else if (arg === "--max-budget" && i + 1 < args.length) {
102
+ const rawBudget = args[++i];
103
+ const parsed = parseFloat(rawBudget);
104
+ if (Number.isFinite(parsed) && parsed > 0) {
105
+ maxBudget = parsed;
106
+ }
107
+ else {
108
+ logWarn(`Invalid --max-budget value "${rawBudget}", ignoring`);
109
+ }
110
+ }
111
+ else if (arg === "--verbose") {
112
+ verbose = true;
113
+ }
114
+ else if (arg === "--quiet" || arg === "-q") {
115
+ quiet = true;
116
+ }
117
+ else if (arg === "--json") {
118
+ json = true;
119
+ }
120
+ else if (arg === "--auto-route") {
121
+ autoRoute = true;
122
+ }
123
+ else if (arg.startsWith("--")) {
124
+ logWarn(`Unknown flag: ${arg}`);
125
+ }
126
+ else {
127
+ positional.push(arg);
128
+ }
129
+ }
130
+ if (!dir) {
131
+ logError("--dir <path> is required for swarm mode", 'Usage: swarm --dir ./project "your task"');
132
+ process.exit(1);
133
+ }
134
+ if (positional.length === 0) {
135
+ logError("Query argument is required", 'Usage: swarm --dir ./project "your task description"');
136
+ process.exit(1);
137
+ }
138
+ return {
139
+ dir: path.resolve(dir),
140
+ orchestratorModel: orchestratorModel || process.env.RLM_MODEL || "claude-sonnet-4-6",
141
+ agent: agent || "",
142
+ replBackend,
143
+ dryRun,
144
+ maxBudget,
145
+ autoRoute,
146
+ allowHooks,
147
+ verbose,
148
+ quiet,
149
+ json,
150
+ query: positional.join(" "),
151
+ };
152
+ }
153
+ // ── Codebase scanning ───────────────────────────────────────────────────────
154
+ const SKIP_DIRS = new Set([
155
+ "node_modules",
156
+ ".git",
157
+ "dist",
158
+ "build",
159
+ ".next",
160
+ ".venv",
161
+ "venv",
162
+ "__pycache__",
163
+ ".swarm-worktrees",
164
+ "coverage",
165
+ ".turbo",
166
+ ".cache",
167
+ ]);
168
+ const SKIP_EXTENSIONS = new Set([
169
+ ".png",
170
+ ".jpg",
171
+ ".jpeg",
172
+ ".gif",
173
+ ".ico",
174
+ ".svg",
175
+ ".woff",
176
+ ".woff2",
177
+ ".ttf",
178
+ ".eot",
179
+ ".mp3",
180
+ ".mp4",
181
+ ".webm",
182
+ ".zip",
183
+ ".tar",
184
+ ".gz",
185
+ ".lock",
186
+ ".map",
187
+ ]);
188
+ function scanDirectory(dir, maxFiles = 200, maxTotalSize = 2 * 1024 * 1024) {
189
+ const canonicalDir = assertWithinRepository(dir, dir);
190
+ const files = [];
191
+ let totalSize = 0;
192
+ function walk(currentDir, depth) {
193
+ if (depth > 15 || files.length >= maxFiles || totalSize >= maxTotalSize)
194
+ return;
195
+ let entries;
196
+ try {
197
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
198
+ }
199
+ catch {
200
+ return;
201
+ }
202
+ entries.sort((a, b) => a.name.localeCompare(b.name));
203
+ for (const entry of entries) {
204
+ if (files.length >= maxFiles || totalSize >= maxTotalSize)
205
+ return;
206
+ if (entry.isDirectory()) {
207
+ if (isBlockedPath(entry.name) || SKIP_DIRS.has(entry.name) || entry.name.startsWith(".")) {
208
+ continue;
209
+ }
210
+ const nextDir = path.join(currentDir, entry.name);
211
+ try {
212
+ assertWithinRepository(nextDir, canonicalDir);
213
+ if (isBlockedPath(nextDir))
214
+ continue;
215
+ walk(nextDir, depth + 1);
216
+ }
217
+ catch {
218
+ // Skip symlink or directory escaping repository boundary
219
+ }
220
+ }
221
+ else if (entry.isFile()) {
222
+ if (isBlockedPath(entry.name))
223
+ continue;
224
+ const ext = path.extname(entry.name).toLowerCase();
225
+ if (SKIP_EXTENSIONS.has(ext))
226
+ continue;
227
+ const fullPath = path.join(currentDir, entry.name);
228
+ try {
229
+ assertWithinRepository(fullPath, canonicalDir);
230
+ if (isBlockedPath(fullPath))
231
+ continue;
232
+ const stat = fs.statSync(fullPath);
233
+ if (stat.size > 100 * 1024)
234
+ continue;
235
+ if (stat.size === 0)
236
+ continue;
237
+ const content = fs.readFileSync(fullPath, "utf-8");
238
+ if (content.includes("\0"))
239
+ continue;
240
+ if (containsSecrets(content))
241
+ continue; // Sensitive content default-deny
242
+ const relPath = path.relative(canonicalDir, fullPath);
243
+ files.push({ relPath, content: redactSecrets(content) });
244
+ totalSize += content.length;
245
+ }
246
+ catch { }
247
+ }
248
+ }
249
+ }
250
+ walk(canonicalDir, 0);
251
+ const parts = [];
252
+ parts.push(`Codebase: ${path.basename(canonicalDir)}`);
253
+ parts.push(`Files: ${files.length}`);
254
+ parts.push(`Total size: ${(totalSize / 1024).toFixed(1)}KB`);
255
+ parts.push("---");
256
+ for (const file of files) {
257
+ parts.push(`\n=== ${file.relPath} ===`);
258
+ parts.push(file.content);
259
+ }
260
+ return redactSecrets(parts.join("\n"));
261
+ }
262
+ // ── Main ────────────────────────────────────────────────────────────────────
263
+ export async function runSwarmMode(rawArgs) {
264
+ const args = parseSwarmArgs(rawArgs);
265
+ const config = loadConfig(args.dir || undefined);
266
+ const allowHooks = Boolean(args.allowHooks || config.allow_hooks);
267
+ const hooks = loadHooks(args.dir, allowHooks);
268
+ // Configure UI
269
+ if (args.json)
270
+ setJsonMode(true);
271
+ if (args.quiet)
272
+ setLogLevel("quiet");
273
+ else if (args.verbose)
274
+ setLogLevel("verbose");
275
+ // Verify target directory before anything else
276
+ if (!fs.existsSync(args.dir)) {
277
+ logError(`Directory "${args.dir}" does not exist`);
278
+ process.exit(1);
279
+ }
280
+ try {
281
+ args.dir = assertWithinRepository(args.dir, args.dir);
282
+ }
283
+ catch (err) {
284
+ logError(`Security boundary violation: ${err instanceof Error ? err.message : String(err)}`);
285
+ process.exit(1);
286
+ }
287
+ // First-run onboarding (after dir validation so we don't waste user's time)
288
+ await runOnboarding();
289
+ // Override config with CLI args
290
+ if (args.agent)
291
+ config.default_agent = args.agent;
292
+ if (args.maxBudget !== null)
293
+ config.max_session_budget_usd = args.maxBudget;
294
+ if (args.autoRoute)
295
+ config.auto_model_selection = true;
296
+ // Resolve orchestrator model — prefer CLI arg, then config's default_model
297
+ const orchestratorModelId = args.orchestratorModel !== "claude-sonnet-4-6"
298
+ ? args.orchestratorModel
299
+ : config.default_model || args.orchestratorModel;
300
+ const modelLookupId = orchestratorModelId.startsWith("ollama/") || orchestratorModelId.startsWith("openrouter/")
301
+ ? orchestratorModelId
302
+ : orchestratorModelId.replace(/^(anthropic|openai|google)\//, "");
303
+ const resolved = resolveModel(modelLookupId, logWarn);
304
+ if (!resolved) {
305
+ logError(`Could not find model "${orchestratorModelId}"`, "Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY in your .env file, or use Ollama/OpenRouter");
306
+ process.exit(1);
307
+ }
308
+ // Initialize episodic memory if enabled
309
+ let episodicMemory;
310
+ if (config.episodic_memory_enabled) {
311
+ episodicMemory = new EpisodicMemory(config.memory_dir);
312
+ await episodicMemory.init();
313
+ }
314
+ // Initialize failure tracker for session-level agent failure tracking
315
+ const failureTracker = new FailureTracker();
316
+ // Render banner
317
+ renderBanner({
318
+ dir: args.dir,
319
+ model: resolved.model.id,
320
+ provider: resolved.provider,
321
+ agent: config.default_agent,
322
+ routing: config.auto_model_selection ? "auto" : "orchestrator-driven",
323
+ query: args.query,
324
+ dryRun: args.dryRun,
325
+ memorySize: episodicMemory?.size,
326
+ });
327
+ // Scan codebase with spinner
328
+ const spinner = new Spinner();
329
+ spinner.start("scanning codebase");
330
+ const context = scanDirectory(args.dir);
331
+ spinner.stop();
332
+ logSuccess(`Scanned codebase — ${(context.length / 1024).toFixed(1)}KB context`);
333
+ // Start REPL: PythonRepl if explicitly specified; default is declarative ActionDispatcher
334
+ const repl = args.replBackend === "python" ? new PythonRepl() : undefined;
335
+ const ac = new AbortController();
336
+ // Thread dashboard and streaming feed for live status
337
+ const dashboard = new ThreadDashboard();
338
+ const streamingFeed = new StreamingFeed();
339
+ spinner.setDashboard(dashboard);
340
+ spinner.setStreamingFeed(streamingFeed);
341
+ // Progress callback for thread events
342
+ const threadProgress = (threadId, phase, detail) => {
343
+ if (phase === "completed" || phase === "failed" || phase === "cancelled") {
344
+ dashboard.complete(threadId, phase, detail);
345
+ streamingFeed.completeThread(threadId, phase, detail);
346
+ }
347
+ else {
348
+ dashboard.update(threadId, phase, detail);
349
+ streamingFeed.updateThread(threadId, phase, detail);
350
+ }
351
+ };
352
+ // Enable OpenCode server mode for persistent connections (reduces cold-start)
353
+ if (config.default_agent === "opencode" && config.opencode_server_mode) {
354
+ opencodeMod.enableServerMode();
355
+ logVerbose("OpenCode server mode enabled");
356
+ }
357
+ // Initialize thread manager
358
+ const threadManager = new ThreadManager(args.dir, config, threadProgress, ac.signal);
359
+ threadManager.setThreadOutputCallback((threadId, chunk) => {
360
+ streamingFeed.appendOutput(threadId, chunk);
361
+ });
362
+ await threadManager.init();
363
+ if (episodicMemory) {
364
+ threadManager.setEpisodicMemory(episodicMemory);
365
+ }
366
+ const abortAndExit = () => {
367
+ spinner.stop();
368
+ dashboard.clear();
369
+ logWarn("Aborting...");
370
+ ac.abort();
371
+ };
372
+ process.on("SIGINT", abortAndExit);
373
+ process.on("SIGTERM", abortAndExit);
374
+ try {
375
+ if (repl) {
376
+ await repl.start(ac.signal);
377
+ }
378
+ // Register LLM summarizer for llm-summary compression strategy
379
+ if (config.compression_strategy === "llm-summary") {
380
+ const { setSummarizer } = await import("./compression/compressor.js");
381
+ const { completeSimple } = await import("@mariozechner/pi-ai");
382
+ setSummarizer(async (text, instruction) => {
383
+ const response = await completeSimple(resolved.model, {
384
+ systemPrompt: instruction,
385
+ messages: [
386
+ {
387
+ role: "user",
388
+ content: text,
389
+ timestamp: Date.now(),
390
+ },
391
+ ],
392
+ });
393
+ return response.content
394
+ .filter((b) => b.type === "text")
395
+ .map((b) => b.text)
396
+ .join("");
397
+ });
398
+ }
399
+ // Build system prompt
400
+ const agentDesc = await describeAvailableAgents();
401
+ let systemPrompt = buildSwarmSystemPrompt(config, agentDesc, repl ? repl.getLanguage() : undefined);
402
+ if (args.dryRun) {
403
+ systemPrompt +=
404
+ "\n\n## DRY RUN MODE\nDo NOT call thread() or async_thread(). Instead, describe what threads you WOULD spawn (task, files, model). Call FINAL() with your execution plan.";
405
+ }
406
+ // Add episodic memory hints
407
+ if (episodicMemory && episodicMemory.size > 0) {
408
+ const hints = episodicMemory.getStrategyHints(args.query);
409
+ if (hints) {
410
+ systemPrompt += `\n\n## Episodic Memory\n${hints}\nConsider these strategies when decomposing your task.`;
411
+ }
412
+ }
413
+ // Thread handler
414
+ const threadHandler = async (task, threadContext, agentBackend, model, files) => {
415
+ // Context-size guard: warn and truncate if orchestrator sends too much context
416
+ const MAX_THREAD_CONTEXT = 50_000;
417
+ if (threadContext.length > MAX_THREAD_CONTEXT) {
418
+ logWarn(`Thread context too large (${(threadContext.length / 1024).toFixed(0)}KB) — truncating to ${MAX_THREAD_CONTEXT / 1000}KB. Agents have full worktree access; pass only relevant excerpts.`);
419
+ threadContext = `${threadContext.slice(0, MAX_THREAD_CONTEXT)}\n\n[... truncated — ${threadContext.length - MAX_THREAD_CONTEXT} chars removed ...]`;
420
+ }
421
+ let resolvedAgent = agentBackend || config.default_agent;
422
+ let resolvedModel = model || config.default_model;
423
+ let routeSlot = "";
424
+ let routeComplexity = "";
425
+ if (config.auto_model_selection && !agentBackend && !model) {
426
+ const route = await routeTask(task, config, episodicMemory, failureTracker);
427
+ resolvedAgent = route.agent;
428
+ resolvedModel = route.model;
429
+ routeSlot = route.slot;
430
+ routeComplexity = classifyTaskComplexity(task);
431
+ logRouter(`${route.reason} [slot: ${route.slot}]`);
432
+ }
433
+ const threadId = randomBytes(6).toString("hex");
434
+ // Update dashboard and streaming feed with task info
435
+ dashboard.update(threadId, "queued", undefined, {
436
+ task,
437
+ agent: resolvedAgent,
438
+ model: resolvedModel,
439
+ });
440
+ streamingFeed.updateThread(threadId, "queued", undefined, {
441
+ task,
442
+ agent: resolvedAgent,
443
+ model: resolvedModel,
444
+ });
445
+ const result = await threadManager.spawnThread({
446
+ id: threadId,
447
+ task,
448
+ context: threadContext,
449
+ agent: {
450
+ backend: resolvedAgent,
451
+ model: resolvedModel,
452
+ },
453
+ files,
454
+ });
455
+ // Run post-thread hooks (typecheck, lint, etc.) — success is silent, only errors surface
456
+ if (result.success && hooks.post_thread.length > 0) {
457
+ try {
458
+ const worktreePath = path.join(args.dir, config.worktree_base_dir, `wt-${threadId}`);
459
+ if (fs.existsSync(worktreePath)) {
460
+ runHooks(hooks.post_thread, worktreePath, "post_thread", allowHooks);
461
+ }
462
+ }
463
+ catch (hookErr) {
464
+ logWarn(`Post-thread hook failed: ${hookErr.message}`);
465
+ }
466
+ }
467
+ // Track failure in the failure tracker for routing adjustments
468
+ if (!result.success) {
469
+ failureTracker.recordFailure(resolvedAgent, resolvedModel, task, result.summary || "unknown error");
470
+ }
471
+ // Record episode
472
+ if (episodicMemory && result.success && routeSlot) {
473
+ episodicMemory
474
+ .record({
475
+ task,
476
+ agent: resolvedAgent,
477
+ model: resolvedModel,
478
+ slot: routeSlot,
479
+ complexity: routeComplexity,
480
+ success: true,
481
+ durationMs: result.durationMs,
482
+ estimatedCostUsd: result.estimatedCostUsd,
483
+ filesChanged: result.filesChanged,
484
+ summary: result.summary,
485
+ })
486
+ .catch(() => { });
487
+ }
488
+ return {
489
+ result: result.summary,
490
+ success: result.success,
491
+ filesChanged: result.filesChanged,
492
+ durationMs: result.durationMs,
493
+ };
494
+ };
495
+ // Merge handler
496
+ const mergeHandler = async () => {
497
+ spinner.update("merging thread branches");
498
+ const threads = threadManager.getThreads();
499
+ const mergeOpts = { continueOnConflict: true };
500
+ const results = await mergeAllThreads(args.dir, threads, mergeOpts);
501
+ const merged = results.filter((r) => r.success).length;
502
+ const failed = results.filter((r) => !r.success).length;
503
+ if (failed > 0) {
504
+ logWarn(`Merged ${merged} branches, ${failed} failed`);
505
+ }
506
+ else if (merged > 0) {
507
+ logSuccess(`Merged ${merged} branches`);
508
+ }
509
+ const summary = results
510
+ .map((r) => (r.success ? `Merged ${r.branch}: ${r.message}` : `FAILED ${r.branch}: ${r.message}`))
511
+ .join("\n");
512
+ // Run post-merge hooks (tests, etc.) — success is silent
513
+ if (merged > 0 && hooks.post_merge.length > 0) {
514
+ try {
515
+ const hookResults = runHooks(hooks.post_merge, args.dir, "post_merge", allowHooks);
516
+ const hookFailures = hookResults.filter((r) => !r.success);
517
+ if (hookFailures.length > 0) {
518
+ const hookOutput = hookFailures.map((r) => r.output).join("\n");
519
+ return {
520
+ result: `${summary}\n\nPost-merge verification failed:\n${hookOutput}`,
521
+ success: false,
522
+ };
523
+ }
524
+ }
525
+ catch (hookErr) {
526
+ return {
527
+ result: `${summary}\n\nPost-merge hook blocked: ${hookErr.message}`,
528
+ success: false,
529
+ };
530
+ }
531
+ }
532
+ return {
533
+ result: summary || "No threads to merge",
534
+ success: results.every((r) => r.success),
535
+ };
536
+ };
537
+ // Wire declarative ActionDispatcher for production orchestration
538
+ const dispatcher = new ActionDispatcher({
539
+ async spawn(action) {
540
+ return threadHandler(action.task, "", config.default_agent, action.model || config.default_model, action.writeScope);
541
+ },
542
+ async wait(action) {
543
+ const threads = threadManager.getThreads();
544
+ return {
545
+ threads: threads.filter((t) => action.threadIds.includes(t.id)).map((t) => ({ id: t.id, status: t.status })),
546
+ };
547
+ },
548
+ async inspectDiff(action) {
549
+ const threads = threadManager.getThreads();
550
+ const thread = threads.find((t) => t.id === action.threadId);
551
+ if (!thread)
552
+ return { error: `Thread ${action.threadId} not found` };
553
+ const wm = threadManager.getWorktreeManager();
554
+ const diff = await wm.getDiff(action.threadId);
555
+ return { threadId: action.threadId, diff: redactSecrets(diff) };
556
+ },
557
+ async review(action) {
558
+ return { threadId: action.threadId, status: "reviewed" };
559
+ },
560
+ async merge(_action) {
561
+ return mergeHandler();
562
+ },
563
+ async finish(action) {
564
+ return { finished: true, summary: action.summary };
565
+ },
566
+ });
567
+ // Run the orchestrator
568
+ spinner.start();
569
+ const startTime = Date.now();
570
+ const result = await runRlmLoop({
571
+ context: redactSecrets(context),
572
+ query: redactSecrets(args.query),
573
+ model: resolved.model,
574
+ repl,
575
+ dispatcher,
576
+ signal: ac.signal,
577
+ systemPrompt,
578
+ threadHandler: args.dryRun ? undefined : threadHandler,
579
+ mergeHandler: args.dryRun ? undefined : mergeHandler,
580
+ onProgress: (info) => {
581
+ spinner.update(`iteration ${info.iteration}/${info.maxIterations}` +
582
+ (info.subQueries > 0 ? ` · ${info.subQueries} queries` : ""));
583
+ logVerbose(`Iteration ${info.iteration}/${info.maxIterations} | ` +
584
+ `Sub-queries: ${info.subQueries} | Phase: ${info.phase}`);
585
+ },
586
+ });
587
+ spinner.stop();
588
+ dashboard.clear();
589
+ const elapsed = (Date.now() - startTime) / 1000;
590
+ // Render summary
591
+ const summary = {
592
+ elapsed,
593
+ iterations: result.iterations,
594
+ subQueries: result.totalSubQueries,
595
+ completed: result.completed,
596
+ answer: result.answer,
597
+ threads: threadManager.getThreads(),
598
+ budget: threadManager.getBudgetState(),
599
+ cacheStats: threadManager.getCacheStats(),
600
+ episodeCount: episodicMemory?.size,
601
+ };
602
+ renderSummary(summary);
603
+ // Output the answer
604
+ if (isJsonMode()) {
605
+ // Already output via renderSummary
606
+ }
607
+ else {
608
+ process.stderr.write("\n");
609
+ logAnswer(result.answer);
610
+ }
611
+ }
612
+ finally {
613
+ spinner.stop();
614
+ dashboard.clear();
615
+ streamingFeed.clear();
616
+ process.removeListener("SIGINT", abortAndExit);
617
+ process.removeListener("SIGTERM", abortAndExit);
618
+ repl?.shutdown();
619
+ await threadManager.cleanup();
620
+ // Shut down any managed OpenCode server instances
621
+ await opencodeMod.disableServerMode();
622
+ }
623
+ }
624
+ //# sourceMappingURL=swarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../src/swarm.ts"],"names":[],"mappings":"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"}