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,564 @@
1
+ /**
2
+ * RLM Loop — implements Algorithm 1 from "Recursive Language Models" (arXiv:2512.24601).
3
+ * Extended for swarm-code with thread handler wiring.
4
+ *
5
+ * The loop works as follows:
6
+ * 1. Inject the full context into a persistent Python REPL as a variable.
7
+ * 2. Send the LLM metadata about the context plus the user's query.
8
+ * The LLM writes Python code that can inspect/slice/query `context`,
9
+ * call `llm_query()` recursively, call `thread()` to spawn agents,
10
+ * and call FINAL() when done.
11
+ * 3. Execute the code, capture stdout.
12
+ * 4. If FINAL is set, return it. Otherwise loop.
13
+ */
14
+ import { completeSimple, } from "@mariozechner/pi-ai";
15
+ import { loadConfig } from "../config.js";
16
+ // ── Load config ─────────────────────────────────────────────────────────────
17
+ const config = loadConfig();
18
+ // ── Default system prompt (RLM text-processing mode) ────────────────────────
19
+ // ── Default system prompt (RLM text-processing mode) ────────────────────────
20
+ function buildDefaultSystemPrompt(language = "javascript") {
21
+ if (language === "javascript") {
22
+ return `You are a Recursive Language Model (RLM) agent. You process large contexts by writing JavaScript code that runs in a persistent V8 REPL.
23
+
24
+ ## Available in the REPL
25
+
26
+ 1. A \`context\` variable containing the full input text (string). Check \`context.length\` to understand what you are working with.
27
+
28
+ 2. An \`await llm_query(subContext, instruction)\` function that sends a sub-piece of the context to an LLM with an instruction and returns the response. Use this for summarization, extraction, classification, etc. on chunks. For parallel queries, use \`await Promise.all([...])\`.
29
+
30
+ 3. Functions to return your answer:
31
+ - \`FINAL("your answer")\` — provide the answer as a string
32
+ - \`FINAL_VAR(variable)\` — return a variable you built up in the REPL
33
+
34
+ ## Rules
35
+
36
+ 1. Write valid modern JavaScript. You have access to built-in objects (JSON, Math, Array, Map, Set, Promise, etc.).
37
+ 2. Use \`print()\` or \`console.log()\` to output intermediate results visible in the next iteration.
38
+ 3. Use \`context.length\` and string slicing to inspect context size before processing.
39
+ 4. For large contexts, split into chunks and use \`await llm_query()\` on each chunk, then aggregate.
40
+ 5. Call \`FINAL("answer")\` only when you have a complete answer.
41
+ 6. Print output will be truncated to last ${config.truncate_len} characters. Keep printed output concise.
42
+
43
+ ## Output format
44
+
45
+ Respond with ONLY a JavaScript code block. No explanation before or after.
46
+
47
+ \`\`\`javascript
48
+ // Your working JavaScript code
49
+ print(\`Context length: \${context.length} chars\`);
50
+ \`\`\``;
51
+ }
52
+ return `You are a Recursive Language Model (RLM) agent. You process large contexts by writing Python code that runs in a persistent REPL.
53
+
54
+ ## Available in the REPL
55
+
56
+ 1. A \`context\` variable containing the full input text (may be very large). You should check the content of the \`context\` variable to understand what you are working with.
57
+
58
+ 2. A \`llm_query(sub_context, instruction)\` function that sends a sub-piece of the context to an LLM with an instruction and returns the response. Use this for summarization, extraction, classification, etc. on chunks. For parallel queries, use \`async_llm_query()\` with \`asyncio.gather()\`.
59
+
60
+ 3. Two functions to return your answer:
61
+ - \`FINAL("your answer")\` — provide the answer as a string
62
+ - \`FINAL_VAR(variable)\` — return a variable you built up in the REPL
63
+
64
+ ## Rules
65
+
66
+ 1. Write valid Python 3 code. You have access to the standard library.
67
+ 2. Use \`print()\` to output metadata/intermediate results visible in the next iteration.
68
+ 3. Use \`len(context)\` and slicing to understand the context size before processing.
69
+ 4. For large contexts, split into chunks and use \`llm_query()\` on each chunk, then aggregate.
70
+ 5. Call \`FINAL("answer")\` or \`FINAL_VAR(var)\` only when you have a complete answer.
71
+ 6. Do NOT call FINAL prematurely — if you need more iterations, just print your intermediate state.
72
+ 7. Be efficient: minimize the number of \`llm_query()\` calls by using smart chunking.
73
+ 8. Print output will be truncated to last ${config.truncate_len} characters. Keep printed output concise.
74
+
75
+ ## How to control sub-agent behavior
76
+
77
+ - When calling \`llm_query()\`, give clear instructions at the beginning of the context. If you only pass context without instructions, the sub-agent cannot do its task.
78
+ - To extract data verbatim: instruct the sub-agent to use \`FINAL_VAR\` and slice important sections.
79
+ - To summarize or analyze: instruct the sub-agent to explore and generate the answer.
80
+ - Help sub-agents by describing the data format (dict, list, etc.) — clarity is important!
81
+
82
+ ## Important notes
83
+
84
+ - This is a multi-turn environment. You do NOT need to answer in one shot.
85
+ - Before returning via FINAL, it is advisable to print the answer first to inspect formatting.
86
+ - The REPL persists state like a Jupyter notebook — past variables and code are maintained. Do NOT rewrite old code or accidentally delete the \`context\` variable.
87
+ - You will only see truncated outputs, so use \`llm_query()\` for semantic analysis of large text.
88
+ - You can use variables as buffers to build up your final answer across iterations.
89
+
90
+ ## Output format
91
+
92
+ Respond with ONLY a Python code block. No explanation before or after.
93
+
94
+ \`\`\`python
95
+ # Your working python code
96
+ print(f"Context length: {len(context)} chars")
97
+ \`\`\`
98
+
99
+ ## Example strategies
100
+
101
+ **Chunking for large contexts:**
102
+ \`\`\`python
103
+ chunk_size = len(context) // 5
104
+ buffers = []
105
+ for i in range(5):
106
+ start = i * chunk_size
107
+ end = (i + 1) * chunk_size if i < 4 else len(context)
108
+ chunk = context[start:end]
109
+ result = llm_query(chunk, f"Extract key information relevant to: {query}")
110
+ buffers.append(result)
111
+ print(f"Chunk {i+1}/5 done: {len(result)} chars")
112
+ \`\`\`
113
+
114
+ **Parallel queries with asyncio:**
115
+ \`\`\`python
116
+ import asyncio
117
+ tasks = []
118
+ for i, chunk in enumerate(chunks):
119
+ tasks.append(async_llm_query(chunk, f"Summarize chunk {i}"))
120
+ results = await asyncio.gather(*tasks)
121
+ \`\`\`
122
+
123
+ **Building up a final answer:**
124
+ \`\`\`python
125
+ # After collecting all results in a buffer
126
+ final_answer = llm_query("\\n".join(buffers), f"Synthesize these summaries to answer: {query}")
127
+ FINAL(final_answer)
128
+ \`\`\``;
129
+ }
130
+ // ── Abort helper ────────────────────────────────────────────────────────
131
+ /** Race a promise against an AbortSignal so Ctrl+C cancels long API calls. */
132
+ function raceAbort(promise, signal) {
133
+ if (!signal)
134
+ return promise;
135
+ if (signal.aborted)
136
+ return Promise.reject(new Error("Aborted"));
137
+ let onAbort;
138
+ const abortPromise = new Promise((_, reject) => {
139
+ onAbort = () => reject(new Error("Aborted"));
140
+ signal.addEventListener("abort", onAbort, { once: true });
141
+ });
142
+ return Promise.race([promise, abortPromise]).finally(() => {
143
+ if (onAbort)
144
+ signal.removeEventListener("abort", onAbort);
145
+ });
146
+ }
147
+ // ── Helpers ─────────────────────────────────────────────────────────────────
148
+ function buildContextMetadata(context) {
149
+ const lines = context.split("\n");
150
+ const charCount = context.length;
151
+ const lineCount = lines.length;
152
+ const previewStart = lines.slice(0, config.metadata_preview_lines).join("\n");
153
+ const previewEnd = lines.slice(-config.metadata_preview_lines).join("\n");
154
+ return [
155
+ `Context statistics:`,
156
+ ` - ${charCount.toLocaleString()} characters`,
157
+ ` - ${lineCount.toLocaleString()} lines`,
158
+ ``,
159
+ `First ${config.metadata_preview_lines} lines:`,
160
+ previewStart,
161
+ ``,
162
+ `Last ${config.metadata_preview_lines} lines:`,
163
+ previewEnd,
164
+ ].join("\n");
165
+ }
166
+ function extractCodeFromResponse(response) {
167
+ for (const block of response.content) {
168
+ if (block.type !== "text")
169
+ continue;
170
+ const text = block.text;
171
+ // Try ```javascript, ```js, ```typescript, ```ts, ```python, or ```repl blocks
172
+ const fenceMatch = text.match(/```(?:javascript|js|typescript|ts|python|repl)?\s*\n([\s\S]*?)```/);
173
+ if (fenceMatch)
174
+ return fenceMatch[1].trim();
175
+ // Fallback: if the response looks like raw code
176
+ const trimmed = text.trim();
177
+ if (trimmed &&
178
+ !trimmed.startsWith("#") &&
179
+ (trimmed.includes("print(") ||
180
+ trimmed.includes("console.log(") ||
181
+ trimmed.includes("const ") ||
182
+ trimmed.includes("let ") ||
183
+ trimmed.includes("var ") ||
184
+ trimmed.includes("await ") ||
185
+ trimmed.includes("import ") ||
186
+ (trimmed.includes("for ") && trimmed.includes(":")) ||
187
+ (trimmed.includes("def ") && trimmed.includes(":")) ||
188
+ trimmed.includes("FINAL(") ||
189
+ trimmed.includes("llm_query(") ||
190
+ trimmed.includes("thread(") ||
191
+ trimmed.includes("async_thread(") ||
192
+ trimmed.includes("merge_threads("))) {
193
+ return trimmed;
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+ function truncateOutput(text) {
199
+ if (text.length <= config.truncate_len) {
200
+ if (text.length === 0)
201
+ return "[EMPTY OUTPUT]";
202
+ return text;
203
+ }
204
+ return `[TRUNCATED: Last ${config.truncate_len} chars shown].. ${text.slice(-config.truncate_len)}`;
205
+ }
206
+ function extractActionPayload(text) {
207
+ const jsonBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
208
+ if (jsonBlockMatch) {
209
+ try {
210
+ return JSON.parse(jsonBlockMatch[1].trim());
211
+ }
212
+ catch { }
213
+ }
214
+ const firstBrace = text.indexOf("{");
215
+ const lastBrace = text.lastIndexOf("}");
216
+ if (firstBrace !== -1 && lastBrace > firstBrace) {
217
+ try {
218
+ return JSON.parse(text.slice(firstBrace, lastBrace + 1));
219
+ }
220
+ catch { }
221
+ }
222
+ return null;
223
+ }
224
+ // ── Main loop ───────────────────────────────────────────────────────────────
225
+ export async function runRlmLoop(options) {
226
+ const { context, query, model, repl, dispatcher, signal, onProgress, onSubQueryStart, onSubQuery, systemPrompt, threadHandler, mergeHandler, } = options;
227
+ if (!repl && !dispatcher) {
228
+ throw new Error("runRlmLoop requires either a repl or a dispatcher");
229
+ }
230
+ let totalSubQueries = 0;
231
+ let iterationSubQueries = 0;
232
+ let mergedAlready = false;
233
+ const llmQueryHandler = async (subContext, instruction) => {
234
+ if (signal?.aborted)
235
+ throw new Error("Aborted");
236
+ if (totalSubQueries >= config.max_sub_queries) {
237
+ return `[ERROR] Maximum sub-query limit (${config.max_sub_queries}) reached. Call FINAL() with your best answer.`;
238
+ }
239
+ ++totalSubQueries;
240
+ const queryIndex = ++iterationSubQueries;
241
+ const sqStart = Date.now();
242
+ onSubQueryStart?.({
243
+ index: queryIndex,
244
+ contextLength: subContext.length,
245
+ instruction,
246
+ });
247
+ const response = await raceAbort(completeSimple(model, {
248
+ systemPrompt: `You are a helpful assistant. Answer the user's question based on the provided context. Respond in natural language (not code). Be concise but thorough.`,
249
+ messages: [
250
+ {
251
+ role: "user",
252
+ content: `Context:\n${subContext}\n\nInstruction: ${instruction}`,
253
+ timestamp: Date.now(),
254
+ },
255
+ ],
256
+ }), signal);
257
+ const textParts = response.content.filter((b) => b.type === "text").map((b) => b.text);
258
+ const result = textParts.join("\n");
259
+ onSubQuery?.({
260
+ index: queryIndex,
261
+ contextLength: subContext.length,
262
+ instruction,
263
+ resultLength: result.length,
264
+ resultPreview: result,
265
+ elapsedMs: Date.now() - sqStart,
266
+ });
267
+ return result;
268
+ };
269
+ /** Set up (or re-set up) the REPL with context and handler. */
270
+ async function initRepl() {
271
+ if (!repl)
272
+ return;
273
+ await repl.setContext(context);
274
+ await repl.resetFinal();
275
+ repl.setLlmQueryHandler(llmQueryHandler);
276
+ // Wire thread and merge handlers if provided (swarm mode)
277
+ if (threadHandler) {
278
+ repl.setThreadHandler(threadHandler);
279
+ }
280
+ if (mergeHandler) {
281
+ repl.setMergeHandler(async () => {
282
+ mergedAlready = true;
283
+ return mergeHandler();
284
+ });
285
+ }
286
+ }
287
+ if (repl) {
288
+ await initRepl();
289
+ }
290
+ const replLang = repl && typeof repl.getLanguage === "function" ? repl.getLanguage() : "javascript";
291
+ const activeSystemPrompt = systemPrompt || buildDefaultSystemPrompt(replLang);
292
+ const metadata = buildContextMetadata(context);
293
+ const conversationHistory = [
294
+ {
295
+ role: "user",
296
+ content: `${metadata}\n\nQuery: ${query}`,
297
+ timestamp: Date.now(),
298
+ },
299
+ ];
300
+ for (let iteration = 1; iteration <= config.max_iterations; iteration++) {
301
+ iterationSubQueries = 0;
302
+ if (signal?.aborted) {
303
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
304
+ }
305
+ const lastUserMsg = conversationHistory.filter((m) => m.role === "user").at(-1);
306
+ const userMsgText = typeof lastUserMsg?.content === "string" ? lastUserMsg.content : "";
307
+ onProgress?.({
308
+ iteration,
309
+ maxIterations: config.max_iterations,
310
+ subQueries: totalSubQueries,
311
+ phase: "generating_code",
312
+ userMessage: userMsgText,
313
+ systemPrompt: iteration === 1 ? activeSystemPrompt : undefined,
314
+ });
315
+ let response;
316
+ try {
317
+ response = await raceAbort(completeSimple(model, {
318
+ systemPrompt: activeSystemPrompt,
319
+ messages: conversationHistory,
320
+ }), signal);
321
+ }
322
+ catch (apiErr) {
323
+ if (signal?.aborted) {
324
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
325
+ }
326
+ const errMsg = apiErr instanceof Error ? apiErr.message : String(apiErr);
327
+ return {
328
+ answer: `[API Error] ${errMsg}`,
329
+ iterations: iteration,
330
+ totalSubQueries,
331
+ completed: false,
332
+ };
333
+ }
334
+ if (signal?.aborted) {
335
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
336
+ }
337
+ // Surface API errors — bail immediately on unrecoverable errors
338
+ if ("errorMessage" in response && response.errorMessage) {
339
+ const errMsg = response.errorMessage;
340
+ const isAuth = errMsg.includes("authentication") || errMsg.includes("401");
341
+ const isQuota = errMsg.includes("quota") || errMsg.includes("billing") || errMsg.includes("429") || errMsg.includes("rate");
342
+ const isServer = errMsg.includes("500") || errMsg.includes("502") || errMsg.includes("503") || errMsg.includes("overloaded");
343
+ if (isAuth) {
344
+ return {
345
+ answer: `[API Error] ${errMsg}\n\nCheck your API key in .env or run /provider to reconfigure.`,
346
+ iterations: iteration,
347
+ totalSubQueries,
348
+ completed: false,
349
+ };
350
+ }
351
+ if (isQuota) {
352
+ return {
353
+ answer: `[API Error] ${errMsg}\n\nCheck your plan and billing at your provider's dashboard.`,
354
+ iterations: iteration,
355
+ totalSubQueries,
356
+ completed: false,
357
+ };
358
+ }
359
+ if (isServer) {
360
+ return {
361
+ answer: `[API Error] ${errMsg}\n\nThe provider's API is currently unavailable. Try again later.`,
362
+ iterations: iteration,
363
+ totalSubQueries,
364
+ completed: false,
365
+ };
366
+ }
367
+ // Unknown API error — still bail, don't waste iterations
368
+ return {
369
+ answer: `[API Error] ${errMsg}`,
370
+ iterations: iteration,
371
+ totalSubQueries,
372
+ completed: false,
373
+ };
374
+ }
375
+ const rawResponseText = response.content
376
+ .filter((b) => b.type === "text")
377
+ .map((b) => b.text)
378
+ .join("\n");
379
+ if (dispatcher) {
380
+ const actionPayload = extractActionPayload(rawResponseText);
381
+ if (!actionPayload) {
382
+ conversationHistory.push(response);
383
+ conversationHistory.push({
384
+ role: "user",
385
+ content: 'Error: Could not extract action payload. Respond with a valid JSON action (e.g. { "version": 1, "action": "spawn" | "wait" | "inspect_diff" | "review" | "merge" | "finish" }).',
386
+ timestamp: Date.now(),
387
+ });
388
+ continue;
389
+ }
390
+ conversationHistory.push(response);
391
+ onProgress?.({
392
+ iteration,
393
+ maxIterations: config.max_iterations,
394
+ subQueries: totalSubQueries,
395
+ phase: "executing",
396
+ rawResponse: rawResponseText,
397
+ });
398
+ try {
399
+ const actionResult = await dispatcher.dispatch(actionPayload);
400
+ if (typeof actionPayload === "object" && actionPayload !== null && actionPayload.action === "finish") {
401
+ return {
402
+ answer: actionPayload.summary || "",
403
+ iterations: iteration,
404
+ totalSubQueries,
405
+ completed: true,
406
+ };
407
+ }
408
+ conversationHistory.push({
409
+ role: "user",
410
+ content: `Action Result:\n${JSON.stringify(actionResult, null, 2)}`,
411
+ timestamp: Date.now(),
412
+ });
413
+ continue;
414
+ }
415
+ catch (err) {
416
+ if (signal?.aborted) {
417
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
418
+ }
419
+ const errorMsg = err instanceof Error ? err.message : String(err);
420
+ conversationHistory.push({
421
+ role: "user",
422
+ content: `Action Error: ${errorMsg}\n\nPlease correct the action and try again.`,
423
+ timestamp: Date.now(),
424
+ });
425
+ continue;
426
+ }
427
+ }
428
+ if (!repl) {
429
+ return {
430
+ answer: "[Error: No REPL or dispatcher available for execution]",
431
+ iterations: iteration,
432
+ totalSubQueries,
433
+ completed: false,
434
+ };
435
+ }
436
+ const code = extractCodeFromResponse(response);
437
+ if (!code) {
438
+ // No code block found — might be a direct answer or extraction failure
439
+ conversationHistory.push(response);
440
+ conversationHistory.push({
441
+ role: "user",
442
+ content: "Error: Could not extract code. Make sure to wrap your code in ```python ... ``` blocks.",
443
+ timestamp: Date.now(),
444
+ });
445
+ continue;
446
+ }
447
+ conversationHistory.push(response);
448
+ onProgress?.({
449
+ iteration,
450
+ maxIterations: config.max_iterations,
451
+ subQueries: totalSubQueries,
452
+ phase: "executing",
453
+ code,
454
+ rawResponse: rawResponseText,
455
+ });
456
+ let execResult;
457
+ try {
458
+ execResult = await repl.execute(code);
459
+ }
460
+ catch (err) {
461
+ if (signal?.aborted) {
462
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
463
+ }
464
+ const errorMsg = err instanceof Error ? err.message : String(err);
465
+ // If the REPL timed out or crashed, restart it so next iteration works
466
+ if (errorMsg.includes("Timeout") || errorMsg.includes("not running") || errorMsg.includes("shut down")) {
467
+ try {
468
+ repl.shutdown();
469
+ await repl.start(signal);
470
+ await initRepl();
471
+ }
472
+ catch {
473
+ return {
474
+ answer: "[REPL crashed and could not restart]",
475
+ iterations: iteration,
476
+ totalSubQueries,
477
+ completed: false,
478
+ };
479
+ }
480
+ }
481
+ conversationHistory.push({
482
+ role: "user",
483
+ content: `Execution error: ${errorMsg}\n\nPlease fix the code and try again.`,
484
+ timestamp: Date.now(),
485
+ });
486
+ continue;
487
+ }
488
+ if (signal?.aborted) {
489
+ return { answer: "[Aborted]", iterations: iteration, totalSubQueries, completed: false };
490
+ }
491
+ onProgress?.({
492
+ iteration,
493
+ maxIterations: config.max_iterations,
494
+ subQueries: totalSubQueries,
495
+ phase: "checking_final",
496
+ stdout: execResult.stdout,
497
+ stderr: execResult.stderr,
498
+ });
499
+ if (execResult.hasFinal && execResult.finalValue !== null) {
500
+ // Auto-merge any unmerged thread branches before returning
501
+ if (mergeHandler && !mergedAlready) {
502
+ try {
503
+ await mergeHandler();
504
+ }
505
+ catch {
506
+ // Non-fatal — merge may have already been done by the LLM
507
+ }
508
+ }
509
+ return {
510
+ answer: execResult.finalValue,
511
+ iterations: iteration,
512
+ totalSubQueries,
513
+ completed: true,
514
+ };
515
+ }
516
+ // Build next user message with truncated output
517
+ const parts = [];
518
+ if (execResult.stdout) {
519
+ parts.push(`Output:\n${truncateOutput(execResult.stdout)}`);
520
+ }
521
+ if (execResult.stderr) {
522
+ parts.push(`Stderr:\n${execResult.stderr.slice(0, 5000)}`);
523
+ }
524
+ if (parts.length === 0) {
525
+ parts.push("(No output produced. The code ran without printing anything.)");
526
+ }
527
+ parts.push(`\nIteration ${iteration}/${config.max_iterations}. Sub-queries used: ${totalSubQueries}/${config.max_sub_queries}.`);
528
+ const remaining = config.max_iterations - iteration;
529
+ if (remaining <= 2) {
530
+ parts.push("⚠️ CRITICAL: Only " +
531
+ remaining +
532
+ " iteration(s) remaining! Call merge_threads() then FINAL() NOW with your best result. Any unmerged work will be lost.");
533
+ }
534
+ else if (remaining <= Math.ceil(config.max_iterations * 0.25)) {
535
+ parts.push("⚠️ WARNING: " +
536
+ remaining +
537
+ " iterations remaining. Wrap up: merge_threads() → FINAL(). Don't start new threads.");
538
+ }
539
+ else {
540
+ parts.push("Continue processing or call FINAL() when you have the answer.");
541
+ }
542
+ conversationHistory.push({
543
+ role: "user",
544
+ content: parts.join("\n\n"),
545
+ timestamp: Date.now(),
546
+ });
547
+ }
548
+ // Auto-merge any remaining thread branches even though FINAL was never called
549
+ if (mergeHandler && !mergedAlready) {
550
+ try {
551
+ await mergeHandler();
552
+ }
553
+ catch {
554
+ // Non-fatal
555
+ }
556
+ }
557
+ return {
558
+ answer: "[Maximum iterations reached without calling FINAL]",
559
+ iterations: config.max_iterations,
560
+ totalSubQueries,
561
+ completed: false,
562
+ };
563
+ }
564
+ //# sourceMappingURL=rlm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlm.js","sourceRoot":"","sources":["../../src/core/rlm.ts"],"names":[],"mappings":"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"}