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,254 @@
1
+ /**
2
+ * ContextOS Direct LLM agent backend.
3
+ *
4
+ * Enhanced version of the original direct-llm provider.
5
+ * Key improvements:
6
+ * 1. Accepts a ContextOS system prompt (project rules/standards)
7
+ * 2. Parses code blocks from LLM responses and writes them to the worktree
8
+ * 3. Builds a coding-oriented prompt that instructs the LLM to produce file edits
9
+ * 4. Reports files changed based on parsed code blocks
10
+ *
11
+ * Uses @mariozechner/pi-ai for unified access to OpenAI, Anthropic, and Gemini.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
14
+ import * as path from "node:path";
15
+ import { isPathAllowed } from "../security/file-policy.js";
16
+ import { containsSecrets, isBlockedPath, redactSecrets } from "../security/secret-filter.js";
17
+ import { registerAgent } from "./provider.js";
18
+ /**
19
+ * Parse code blocks from LLM output that include file paths.
20
+ *
21
+ * Supports formats:
22
+ * ```language:path/to/file.ts
23
+ * ```language filepath="path/to/file.ts"
24
+ * <!-- FILE: path/to/file.ts -->
25
+ * // FILE: path/to/file.ts
26
+ */
27
+ function parseCodeBlocks(output) {
28
+ const blocks = [];
29
+ const codeBlockRegex = /```(\w+)?(?::([^\n]+)|[^\S\n]+filepath="([^"]+)")?\n([\s\S]*?)```/g;
30
+ let match;
31
+ while ((match = codeBlockRegex.exec(output)) !== null) {
32
+ const language = match[1] || "";
33
+ const filePath = match[2] || match[3] || "";
34
+ const content = match[4] || "";
35
+ if (filePath && content.trim()) {
36
+ blocks.push({
37
+ filePath: filePath.trim(),
38
+ content: content,
39
+ language,
40
+ });
41
+ }
42
+ }
43
+ // Also try FILE: comment pattern
44
+ const fileCommentRegex = /(?:<!--\s*FILE:\s*(.+?)\s*-->|\/\/\s*FILE:\s*(.+))\n```\w*\n([\s\S]*?)```/g;
45
+ while ((match = fileCommentRegex.exec(output)) !== null) {
46
+ const filePath = (match[1] || match[2] || "").trim();
47
+ const content = match[3] || "";
48
+ if (filePath && content.trim()) {
49
+ // Avoid duplicates
50
+ if (!blocks.some((b) => b.filePath === filePath)) {
51
+ blocks.push({ filePath, content, language: "" });
52
+ }
53
+ }
54
+ }
55
+ return blocks;
56
+ }
57
+ /**
58
+ * Write parsed code blocks to the worktree directory.
59
+ * Creates directories as needed. Returns list of written file paths.
60
+ */
61
+ function writeCodeBlocks(workDir, blocks) {
62
+ const written = [];
63
+ for (const block of blocks) {
64
+ // Security: prevent path traversal and blocked/forbidden paths
65
+ const normalized = path.normalize(block.filePath);
66
+ if (normalized.startsWith("..") || path.isAbsolute(normalized)) {
67
+ process.stderr.write(`[contextos-agent] Skipping unsafe path (traversal): ${block.filePath}\n`);
68
+ continue;
69
+ }
70
+ if (isBlockedPath(normalized) || !isPathAllowed(normalized, workDir)) {
71
+ process.stderr.write(`[contextos-agent] Skipping forbidden/policy-blocked path: ${block.filePath}\n`);
72
+ continue;
73
+ }
74
+ const fullPath = path.join(workDir, normalized);
75
+ // Ensure parent directory exists
76
+ const dir = path.dirname(fullPath);
77
+ if (!existsSync(dir)) {
78
+ mkdirSync(dir, { recursive: true });
79
+ }
80
+ writeFileSync(fullPath, block.content, "utf-8");
81
+ written.push(normalized);
82
+ process.stderr.write(`[contextos-agent] Wrote: ${normalized}\n`);
83
+ }
84
+ return written;
85
+ }
86
+ // ── Prompt Builder ─────────────────────────────────────────────────────────
87
+ /**
88
+ * Build a coding-oriented prompt that tells the LLM to produce file edits
89
+ * in a parseable format.
90
+ */
91
+ function buildCodingPrompt(task, workDir, files, contextosPrompt) {
92
+ const sections = [];
93
+ // ContextOS project standards (if provided)
94
+ if (contextosPrompt) {
95
+ sections.push(contextosPrompt);
96
+ }
97
+ // Coding instructions
98
+ sections.push(`
99
+ ## Your Task
100
+
101
+ You are a coding agent. Your job is to implement the following task by writing code.
102
+
103
+ **Task**: ${task}
104
+
105
+ ## Output Format
106
+
107
+ For EVERY file you create or modify, output it in this exact format:
108
+
109
+ \`\`\`language:path/to/file.ts
110
+ // file contents here
111
+ \`\`\`
112
+
113
+ The path must be relative to the project root. Include the COMPLETE file contents.
114
+ Do NOT use placeholders like "// ... rest of the code". Write the full file.
115
+
116
+ ## Important Rules
117
+ - Write production-quality code
118
+ - Include proper error handling
119
+ - Follow existing code style and patterns in the project
120
+ - Do not modify files that are not related to the task
121
+ `);
122
+ // Include existing file contents for context
123
+ if (files && files.length > 0) {
124
+ sections.push("\n## Existing Files (for context)\n");
125
+ for (const file of files.slice(0, 10)) {
126
+ // Cap at 10 files
127
+ if (!isPathAllowed(file, workDir) || isBlockedPath(file)) {
128
+ process.stderr.write(`[direct-llm] Skipping blocked or out-of-boundary file: ${file}\n`);
129
+ continue;
130
+ }
131
+ const fullPath = path.resolve(workDir, file);
132
+ if (existsSync(fullPath)) {
133
+ try {
134
+ const rawContent = readFileSync(fullPath, "utf-8");
135
+ if (containsSecrets(rawContent)) {
136
+ process.stderr.write(`[direct-llm] Redacting detected secrets in: ${file}\n`);
137
+ }
138
+ const content = redactSecrets(rawContent);
139
+ // Cap per-file content at 3000 chars
140
+ const truncated = content.length > 3000 ? `${content.slice(0, 3000)}\n// ... [truncated]` : content;
141
+ sections.push(`### ${file}\n\`\`\`\n${truncated}\n\`\`\`\n`);
142
+ }
143
+ catch {
144
+ // Skip unreadable files
145
+ }
146
+ }
147
+ }
148
+ }
149
+ return sections.join("\n");
150
+ }
151
+ const contextosDirectLlm = {
152
+ name: "direct-llm",
153
+ async isAvailable() {
154
+ return !!(process.env.ANTHROPIC_API_KEY ||
155
+ process.env.OPENAI_API_KEY ||
156
+ process.env.GEMINI_API_KEY ||
157
+ process.env.OPENROUTER_API_KEY);
158
+ },
159
+ async run(options) {
160
+ const startTime = Date.now();
161
+ const extOptions = options;
162
+ try {
163
+ const { completeSimple, getModels, getProviders } = await import("@mariozechner/pi-ai");
164
+ const modelId = options.model || process.env.CONTEXTOS_DEFAULT_MODEL || process.env.RLM_MODEL || "claude-sonnet-4-6";
165
+ // Find model
166
+ let model;
167
+ for (const provider of getProviders()) {
168
+ for (const m of getModels(provider)) {
169
+ if (m.id === modelId) {
170
+ model = m;
171
+ break;
172
+ }
173
+ }
174
+ if (model)
175
+ break;
176
+ }
177
+ if (!model) {
178
+ return {
179
+ success: false,
180
+ output: "",
181
+ filesChanged: [],
182
+ diff: "",
183
+ durationMs: Date.now() - startTime,
184
+ error: `Model "${modelId}" not found. Available models depend on your API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY).`,
185
+ };
186
+ }
187
+ // Build the coding prompt with ContextOS rules
188
+ const codingPrompt = buildCodingPrompt(options.task, options.workDir, options.files, extOptions.contextosPrompt);
189
+ // Abort-aware LLM call — race against cancellation signal to stop
190
+ // spending money on abandoned requests (P1.9 fix)
191
+ const llmPromise = completeSimple(model, {
192
+ systemPrompt: "You are an expert coding agent. You write complete, production-ready code. Follow all project standards provided to you.",
193
+ messages: [
194
+ {
195
+ role: "user",
196
+ content: codingPrompt,
197
+ timestamp: Date.now(),
198
+ },
199
+ ],
200
+ });
201
+ let response;
202
+ const { signal } = options;
203
+ if (signal) {
204
+ const abortPromise = new Promise((_, reject) => {
205
+ if (signal.aborted) {
206
+ reject(new DOMException("LLM request aborted", "AbortError"));
207
+ return;
208
+ }
209
+ signal.addEventListener("abort", () => {
210
+ reject(new DOMException("LLM request aborted", "AbortError"));
211
+ }, { once: true });
212
+ });
213
+ response = await Promise.race([llmPromise, abortPromise]);
214
+ }
215
+ else {
216
+ response = await llmPromise;
217
+ }
218
+ const output = response.content
219
+ .filter((b) => b.type === "text")
220
+ .map((b) => b.text)
221
+ .join("\n");
222
+ // Parse code blocks and write to worktree
223
+ const codeBlocks = parseCodeBlocks(output);
224
+ let filesChanged = [];
225
+ if (codeBlocks.length > 0 && options.workDir) {
226
+ filesChanged = writeCodeBlocks(options.workDir, codeBlocks);
227
+ process.stderr.write(`[contextos-agent] Parsed ${codeBlocks.length} code blocks, wrote ${filesChanged.length} files\n`);
228
+ }
229
+ else {
230
+ process.stderr.write(`[contextos-agent] No code blocks found in LLM response (${output.length} chars)\n`);
231
+ }
232
+ return {
233
+ success: true,
234
+ output,
235
+ filesChanged,
236
+ diff: "", // Will be captured by WorktreeManager.getDiff()
237
+ durationMs: Date.now() - startTime,
238
+ };
239
+ }
240
+ catch (err) {
241
+ return {
242
+ success: false,
243
+ output: "",
244
+ filesChanged: [],
245
+ diff: "",
246
+ durationMs: Date.now() - startTime,
247
+ error: err instanceof Error ? err.message : String(err),
248
+ };
249
+ }
250
+ },
251
+ };
252
+ registerAgent(contextosDirectLlm);
253
+ export default contextosDirectLlm;
254
+ //# sourceMappingURL=direct-llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-llm.js","sourceRoot":"","sources":["../../src/agents/direct-llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Mock agent backend — for integration testing without real API keys.
3
+ *
4
+ * Simulates a coding agent by writing actual files in the work directory.
5
+ * Registered as "mock" and "mock-reviewer" in the agent registry.
6
+ */
7
+ import type { AgentProvider } from "../core/types.js";
8
+ declare const mockProvider: AgentProvider;
9
+ export declare const mockReviewerProvider: AgentProvider;
10
+ export default mockProvider;
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Mock agent backend — for integration testing without real API keys.
3
+ *
4
+ * Simulates a coding agent by writing actual files in the work directory.
5
+ * Registered as "mock" and "mock-reviewer" in the agent registry.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { registerAgent } from "./provider.js";
10
+ const mockProvider = {
11
+ name: "mock",
12
+ async isAvailable() {
13
+ return true;
14
+ },
15
+ async run(options) {
16
+ const { task, workDir, signal } = options;
17
+ const startTime = Date.now();
18
+ // Check for abort
19
+ if (signal?.aborted) {
20
+ return {
21
+ success: false,
22
+ output: "Aborted",
23
+ filesChanged: [],
24
+ diff: "",
25
+ durationMs: Date.now() - startTime,
26
+ error: "Aborted before start",
27
+ };
28
+ }
29
+ // Simulate work delay (20ms)
30
+ await new Promise((resolve) => setTimeout(resolve, 20));
31
+ // Check for forced failure mode
32
+ if (task.includes("__FAIL__")) {
33
+ return {
34
+ success: false,
35
+ output: "Simulated failure",
36
+ filesChanged: [],
37
+ diff: "",
38
+ durationMs: Date.now() - startTime,
39
+ error: "Mock agent forced failure",
40
+ };
41
+ }
42
+ // Handle review evaluation tasks cleanly if invoked as reviewer
43
+ if (task.includes("Independent Code Reviewer") || task.includes("specCompliance") || task.includes("codeQuality")) {
44
+ if (task.includes("__MALFORMED__")) {
45
+ return {
46
+ success: true,
47
+ output: "Unparseable non-json response",
48
+ filesChanged: [],
49
+ diff: "",
50
+ durationMs: Date.now() - startTime,
51
+ };
52
+ }
53
+ const specCompliance = task.includes("__FAIL_SPEC__") ? "FAIL" : "PASS";
54
+ const codeQuality = task.includes("__FAIL_QUALITY__") ? "FAIL" : "PASS";
55
+ return {
56
+ success: true,
57
+ output: JSON.stringify({
58
+ specCompliance,
59
+ codeQuality,
60
+ summary: `Review completed: spec=${specCompliance}, quality=${codeQuality}`,
61
+ }),
62
+ filesChanged: [],
63
+ diff: "",
64
+ durationMs: Date.now() - startTime,
65
+ usage: { inputTokens: 500, outputTokens: 200, totalTokens: 700 },
66
+ };
67
+ }
68
+ // Write actual files in the work directory to simulate agent edits
69
+ const filesChanged = [];
70
+ // Create or modify a file based on the task
71
+ const targetFile = path.join(workDir, "hello.ts");
72
+ const content = `// Generated by mock agent\n// Task: ${task}\nexport function hello(): string {\n\treturn "Hello from swarm thread!";\n}\n`;
73
+ fs.writeFileSync(targetFile, content, "utf-8");
74
+ filesChanged.push("hello.ts");
75
+ // If task mentions "multi", create additional files
76
+ if (task.toLowerCase().includes("multi")) {
77
+ const extraFile = path.join(workDir, "utils.ts");
78
+ fs.writeFileSync(extraFile, '// Utility module\nexport const VERSION = "1.0.0";\n', "utf-8");
79
+ filesChanged.push("utils.ts");
80
+ }
81
+ const output = [
82
+ "Applied edit to hello.ts",
83
+ `Created ${filesChanged.length} file(s)`,
84
+ "Result: Successfully completed task",
85
+ ].join("\n");
86
+ return {
87
+ success: true,
88
+ output,
89
+ filesChanged,
90
+ diff: "", // Diff is captured by worktree manager
91
+ durationMs: Date.now() - startTime,
92
+ // Simulate token usage for testing budget tracking
93
+ usage: {
94
+ inputTokens: 1500,
95
+ outputTokens: 800,
96
+ totalTokens: 2300,
97
+ },
98
+ };
99
+ },
100
+ };
101
+ export const mockReviewerProvider = {
102
+ name: "mock-reviewer",
103
+ async isAvailable() {
104
+ return true;
105
+ },
106
+ async run(options) {
107
+ const { task, signal } = options;
108
+ const startTime = Date.now();
109
+ if (signal?.aborted) {
110
+ return {
111
+ success: false,
112
+ output: "Aborted",
113
+ filesChanged: [],
114
+ diff: "",
115
+ durationMs: Date.now() - startTime,
116
+ error: "Aborted before start",
117
+ };
118
+ }
119
+ if (task.includes("__TIMEOUT__")) {
120
+ await new Promise((resolve) => setTimeout(resolve, 35000));
121
+ }
122
+ if (task.includes("__MALFORMED__")) {
123
+ return {
124
+ success: true,
125
+ output: "This is completely unparseable non-JSON text from the reviewer.",
126
+ filesChanged: [],
127
+ diff: "",
128
+ durationMs: Date.now() - startTime,
129
+ };
130
+ }
131
+ if (task.includes("__ERROR__") || task.includes("__FAIL__")) {
132
+ return {
133
+ success: false,
134
+ output: "",
135
+ filesChanged: [],
136
+ diff: "",
137
+ durationMs: Date.now() - startTime,
138
+ error: "Independent reviewer model execution failed",
139
+ };
140
+ }
141
+ const specCompliance = task.includes("__FAIL_SPEC__") ? "FAIL" : "PASS";
142
+ const codeQuality = task.includes("__FAIL_QUALITY__") ? "FAIL" : "PASS";
143
+ return {
144
+ success: true,
145
+ output: JSON.stringify({
146
+ specCompliance,
147
+ codeQuality,
148
+ summary: specCompliance === "PASS" && codeQuality === "PASS"
149
+ ? "Independent code review passed"
150
+ : `Independent code review verdict: spec=${specCompliance}, quality=${codeQuality}`,
151
+ }),
152
+ filesChanged: [],
153
+ diff: "",
154
+ durationMs: Date.now() - startTime,
155
+ usage: {
156
+ inputTokens: 600,
157
+ outputTokens: 250,
158
+ totalTokens: 850,
159
+ },
160
+ };
161
+ },
162
+ };
163
+ registerAgent(mockProvider);
164
+ registerAgent(mockReviewerProvider);
165
+ registerAgent({
166
+ ...mockReviewerProvider,
167
+ name: "reviewer-independent",
168
+ });
169
+ export default mockProvider;
170
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/agents/mock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,YAAY,GAAkB;IACnC,IAAI,EAAE,MAAM;IAEZ,KAAK,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAwB;QACjC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,kBAAkB;QAClB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,KAAK,EAAE,sBAAsB;aAC7B,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAExD,gCAAgC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,KAAK,EAAE,2BAA2B;aAClC,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACnH,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,+BAA+B;oBACvC,YAAY,EAAE,EAAE;oBAChB,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBAClC,CAAC;YACH,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxE,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,cAAc;oBACd,WAAW;oBACX,OAAO,EAAE,0BAA0B,cAAc,aAAa,WAAW,EAAE;iBAC3E,CAAC;gBACF,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;aAChE,CAAC;QACH,CAAC;QAED,mEAAmE;QACnE,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,wCAAwC,IAAI,gFAAgF,CAAC;QAC7I,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE9B,oDAAoD;QACpD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,sDAAsD,EAAE,OAAO,CAAC,CAAC;YAC7F,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG;YACd,0BAA0B;YAC1B,WAAW,YAAY,CAAC,MAAM,UAAU;YACxC,qCAAqC;SACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACN,OAAO,EAAE,IAAI;YACb,MAAM;YACN,YAAY;YACZ,IAAI,EAAE,EAAE,EAAE,uCAAuC;YACjD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,mDAAmD;YACnD,KAAK,EAAE;gBACN,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,GAAG;gBACjB,WAAW,EAAE,IAAI;aACjB;SACD,CAAC;IACH,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IAClD,IAAI,EAAE,eAAe;IAErB,KAAK,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAwB;QACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,KAAK,EAAE,sBAAsB;aAC7B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,iEAAiE;gBACzE,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAClC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,KAAK,EAAE,6CAA6C;aACpD,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAExE,OAAO;YACN,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;gBACtB,cAAc;gBACd,WAAW;gBACX,OAAO,EACN,cAAc,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM;oBAClD,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,yCAAyC,cAAc,aAAa,WAAW,EAAE;aACrF,CAAC;YACF,YAAY,EAAE,EAAE;YAChB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE;gBACN,WAAW,EAAE,GAAG;gBAChB,YAAY,EAAE,GAAG;gBACjB,WAAW,EAAE,GAAG;aAChB;SACD,CAAC;IACH,CAAC;CACD,CAAC;AAEF,aAAa,CAAC,YAAY,CAAC,CAAC;AAC5B,aAAa,CAAC,oBAAoB,CAAC,CAAC;AACpC,aAAa,CAAC;IACb,GAAG,oBAAoB;IACvB,IAAI,EAAE,sBAAsB;CAC5B,CAAC,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * OpenCode agent backend.
3
+ *
4
+ * Three execution modes (in priority order):
5
+ * 1. Server mode: Connects to a managed `opencode serve` instance via HTTP API.
6
+ * Avoids cold-start overhead. Server is shared across threads.
7
+ * 2. Attach mode: Uses `opencode run --attach <url>` to connect to a running server.
8
+ * Falls back here if direct HTTP API call fails.
9
+ * 3. Subprocess mode: Cold-starts `opencode run --format json` per invocation.
10
+ * Always-available fallback.
11
+ *
12
+ * The server pool manages lifecycle of `opencode serve` processes, starting them
13
+ * lazily and shutting them down when the session ends.
14
+ */
15
+ import type { AgentProvider } from "../core/types.js";
16
+ /** Enable server mode for the OpenCode agent. Call before spawning threads. */
17
+ export declare function enableServerMode(): void;
18
+ /** Disable server mode and shut down all managed servers. */
19
+ export declare function disableServerMode(): Promise<void>;
20
+ /** Get the number of active server instances. */
21
+ export declare function getActiveServerCount(): number;
22
+ declare const openCodeProvider: AgentProvider;
23
+ export default openCodeProvider;