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,631 @@
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 * as fs from "node:fs";
16
+ import * as http from "node:http";
17
+ import * as os from "node:os";
18
+ import * as path from "node:path";
19
+ import { commandExists } from "../utils/command-exists.js";
20
+ import { RollingBuffer } from "../utils/rolling-buffer.js";
21
+ import { safeSpawn } from "../utils/safe-spawn.js";
22
+ import { registerAgent } from "./provider.js";
23
+ // ── Helpers ──────────────────────────────────────────────────────────────────
24
+ /**
25
+ * Ensure model string is in `provider/model` format as required by OpenCode.
26
+ * If no provider prefix is present, infer it from the model name.
27
+ */
28
+ function normalizeModelForOpenCode(model) {
29
+ if (model.includes("/"))
30
+ return model;
31
+ // Infer provider from model name prefix patterns
32
+ if (model.startsWith("gpt-") || model.startsWith("o1") || model.startsWith("o3") || model.startsWith("o4")) {
33
+ return `openai/${model}`;
34
+ }
35
+ if (model.startsWith("claude-")) {
36
+ return `anthropic/${model}`;
37
+ }
38
+ if (model.startsWith("gemini-")) {
39
+ return `google/${model}`;
40
+ }
41
+ if (model.startsWith("deepseek-")) {
42
+ return `deepseek/${model}`;
43
+ }
44
+ if (model.startsWith("llama-") || model.startsWith("codellama-")) {
45
+ return `ollama/${model}`;
46
+ }
47
+ // Can't infer — return as-is and let OpenCode handle it
48
+ return model;
49
+ }
50
+ /** Extract JSON object from mixed stdout (may contain non-JSON lines before/after). */
51
+ function extractJson(raw) {
52
+ try {
53
+ return JSON.parse(raw);
54
+ }
55
+ catch {
56
+ /* mixed output — try extraction */
57
+ }
58
+ const firstBrace = raw.indexOf("{");
59
+ const lastBrace = raw.lastIndexOf("}");
60
+ if (firstBrace === -1 || lastBrace === -1 || lastBrace <= firstBrace)
61
+ return null;
62
+ try {
63
+ return JSON.parse(raw.slice(firstBrace, lastBrace + 1));
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /** Extract output text, file changes, and token usage from parsed JSON. */
70
+ function extractFromParsed(parsed) {
71
+ if (parsed.error) {
72
+ return { output: parsed.error, filesChanged: [], error: parsed.error };
73
+ }
74
+ let output = "";
75
+ const filesChanged = [];
76
+ if (parsed.messages) {
77
+ const assistantMsgs = parsed.messages.filter((m) => m.role === "assistant");
78
+ if (assistantMsgs.length > 0) {
79
+ output = assistantMsgs[assistantMsgs.length - 1].content;
80
+ }
81
+ for (const msg of parsed.messages) {
82
+ if (msg.tool_calls) {
83
+ for (const tc of msg.tool_calls) {
84
+ if (tc.name === "write" || tc.name === "edit") {
85
+ const filePath = tc.input.file_path || tc.input.path;
86
+ if (typeof filePath === "string") {
87
+ filesChanged.push(filePath);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ // Extract token usage from various possible locations
95
+ let usage;
96
+ const u = (parsed.usage || parsed.total_usage);
97
+ if (u) {
98
+ const inputTokens = u.input_tokens ?? u.prompt_tokens ?? 0;
99
+ const outputTokens = u.output_tokens ?? u.completion_tokens ?? 0;
100
+ if (inputTokens > 0 || outputTokens > 0) {
101
+ usage = {
102
+ inputTokens,
103
+ outputTokens,
104
+ totalTokens: u.total_tokens || inputTokens + outputTokens,
105
+ };
106
+ }
107
+ }
108
+ return { output, filesChanged: [...new Set(filesChanged)], usage };
109
+ }
110
+ /** Whitelist of env vars safe to pass to agent subprocess. */
111
+ function buildAgentEnv() {
112
+ const homeDir = os.homedir();
113
+ // Isolate OpenCode's data dir to prevent stale auth tokens (e.g. expired
114
+ // OAuth) from causing "Model not found" errors on startup.
115
+ const agentDataDir = path.join(homeDir, ".swarm", "agent-data");
116
+ try {
117
+ fs.mkdirSync(agentDataDir, { recursive: true });
118
+ }
119
+ catch {
120
+ // Non-fatal
121
+ }
122
+ return {
123
+ PATH: process.env.PATH,
124
+ HOME: homeDir,
125
+ USERPROFILE: homeDir,
126
+ SHELL: process.env.SHELL,
127
+ TERM: process.env.TERM,
128
+ LANG: process.env.LANG,
129
+ TMPDIR: process.env.TMPDIR,
130
+ XDG_DATA_HOME: agentDataDir,
131
+ ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
132
+ OPENAI_API_KEY: process.env.OPENAI_API_KEY,
133
+ GEMINI_API_KEY: process.env.GEMINI_API_KEY,
134
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY,
135
+ GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME,
136
+ GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL,
137
+ GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME,
138
+ GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL,
139
+ ...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
140
+ ...(process.env.SYSTEMROOT ? { SYSTEMROOT: process.env.SYSTEMROOT } : {}),
141
+ };
142
+ }
143
+ /**
144
+ * Manages a pool of `opencode serve` processes.
145
+ * One server per unique working directory (worktree).
146
+ * Servers are started lazily and reused across thread invocations.
147
+ */
148
+ class OpenCodeServerPool {
149
+ servers = new Map();
150
+ pendingStarts = new Map();
151
+ nextPort = 14096; // Start from a high port to avoid conflicts
152
+ shuttingDown = false;
153
+ /**
154
+ * Get or create a server for the given working directory.
155
+ * Returns the server URL if successful, null if server mode is unavailable.
156
+ * Uses pendingStarts to prevent race conditions from concurrent getServer() calls.
157
+ */
158
+ async getServer(cwd) {
159
+ if (this.shuttingDown)
160
+ return null;
161
+ const existing = this.servers.get(cwd);
162
+ if (existing) {
163
+ // Wait for it to be ready
164
+ try {
165
+ await existing.readyPromise;
166
+ // Verify still alive
167
+ if (existing.process.exitCode === null) {
168
+ return existing.url;
169
+ }
170
+ // Dead — clean up and retry
171
+ this.servers.delete(cwd);
172
+ }
173
+ catch {
174
+ this.servers.delete(cwd);
175
+ }
176
+ }
177
+ // Prevent concurrent startServer for the same cwd
178
+ const pending = this.pendingStarts.get(cwd);
179
+ if (pending)
180
+ return pending;
181
+ const startPromise = this.startServer(cwd).finally(() => {
182
+ this.pendingStarts.delete(cwd);
183
+ });
184
+ this.pendingStarts.set(cwd, startPromise);
185
+ return startPromise;
186
+ }
187
+ async startServer(cwd) {
188
+ const port = this.nextPort++;
189
+ const hostname = "127.0.0.1";
190
+ let resolveReady;
191
+ let rejectReady;
192
+ const readyPromise = new Promise((resolve, reject) => {
193
+ resolveReady = resolve;
194
+ rejectReady = reject;
195
+ });
196
+ // Prevent unhandled rejection crash — timeout/exit rejections are
197
+ // communicated via the null return from startServer(), not via this promise.
198
+ readyPromise.catch(() => { });
199
+ let proc;
200
+ try {
201
+ proc = await safeSpawn("opencode", ["serve", "--port", String(port), "--hostname", hostname], {
202
+ cwd,
203
+ stdio: ["ignore", "pipe", "pipe"],
204
+ env: buildAgentEnv(),
205
+ });
206
+ }
207
+ catch (err) {
208
+ process.stderr.write(`[opencode] Failed to spawn opencode server: ${err instanceof Error ? err.message : String(err)}\n`);
209
+ return null;
210
+ }
211
+ const server = {
212
+ process: proc,
213
+ url: `http://${hostname}:${port}`,
214
+ port,
215
+ cwd,
216
+ ready: false,
217
+ readyPromise,
218
+ };
219
+ this.servers.set(cwd, server);
220
+ // Listen for stderr to detect "listening on" or ready signal
221
+ let stderr = "";
222
+ proc.stderr?.on("data", (chunk) => {
223
+ stderr += chunk.toString();
224
+ });
225
+ proc.on("error", () => {
226
+ rejectReady(new Error("Failed to start opencode serve"));
227
+ this.servers.delete(cwd);
228
+ });
229
+ proc.on("exit", () => {
230
+ if (!server.ready) {
231
+ rejectReady(new Error(`opencode serve exited early: ${stderr.slice(0, 200)}`));
232
+ }
233
+ this.servers.delete(cwd);
234
+ });
235
+ // Poll for health endpoint readiness (up to 10s)
236
+ const startTime = Date.now();
237
+ const maxWait = 10000;
238
+ const pollInterval = 200;
239
+ while (Date.now() - startTime < maxWait) {
240
+ if (proc.exitCode !== null) {
241
+ rejectReady(new Error("opencode serve exited during startup"));
242
+ return null;
243
+ }
244
+ try {
245
+ const healthy = await this.healthCheck(server.url);
246
+ if (healthy) {
247
+ server.ready = true;
248
+ resolveReady();
249
+ return server.url;
250
+ }
251
+ }
252
+ catch {
253
+ // Not ready yet
254
+ }
255
+ await new Promise((r) => setTimeout(r, pollInterval));
256
+ }
257
+ // Timeout — kill and return null (will fall back to subprocess mode)
258
+ this.killServer(server);
259
+ rejectReady(new Error("opencode serve startup timeout"));
260
+ return null;
261
+ }
262
+ healthCheck(baseUrl) {
263
+ return new Promise((resolve) => {
264
+ const req = http.get(`${baseUrl}/global/health`, { timeout: 2000 }, (res) => {
265
+ let body = "";
266
+ res.on("data", (d) => {
267
+ body += d;
268
+ });
269
+ res.on("end", () => {
270
+ try {
271
+ const data = JSON.parse(body);
272
+ resolve(data.healthy === true);
273
+ }
274
+ catch {
275
+ resolve(false);
276
+ }
277
+ });
278
+ });
279
+ req.on("error", () => resolve(false));
280
+ req.on("timeout", () => {
281
+ req.destroy();
282
+ resolve(false);
283
+ });
284
+ });
285
+ }
286
+ killServer(server) {
287
+ try {
288
+ server.process.kill("SIGTERM");
289
+ setTimeout(() => {
290
+ try {
291
+ if (server.process.exitCode === null)
292
+ server.process.kill("SIGKILL");
293
+ }
294
+ catch {
295
+ /* ok */
296
+ }
297
+ }, 3000);
298
+ }
299
+ catch {
300
+ /* already dead */
301
+ }
302
+ this.servers.delete(server.cwd);
303
+ }
304
+ /** Shut down all managed servers. */
305
+ async shutdown() {
306
+ this.shuttingDown = true;
307
+ for (const [, server] of this.servers) {
308
+ this.killServer(server);
309
+ }
310
+ this.servers.clear();
311
+ }
312
+ get activeCount() {
313
+ return this.servers.size;
314
+ }
315
+ }
316
+ // Module-level server pool (shared across all opencode agent invocations)
317
+ const serverPool = new OpenCodeServerPool();
318
+ // ── HTTP API execution ───────────────────────────────────────────────────────
319
+ /**
320
+ * Execute a task via the OpenCode HTTP API (server mode).
321
+ * Creates a session, sends the message, waits for response.
322
+ */
323
+ async function runViaHttpApi(serverUrl, task, model, signal) {
324
+ try {
325
+ // 1. Create session
326
+ const sessionRes = await httpPost(`${serverUrl}/session`, {});
327
+ if (!sessionRes || !sessionRes.id)
328
+ return null;
329
+ const sessionId = sessionRes.id;
330
+ // 2. Send message
331
+ const msgBody = {
332
+ parts: [{ type: "text", text: task }],
333
+ };
334
+ if (model)
335
+ msgBody.model = normalizeModelForOpenCode(model);
336
+ const msgRes = await httpPost(`${serverUrl}/session/${sessionId}/message`, msgBody, signal);
337
+ if (!msgRes)
338
+ return null;
339
+ // 3. Extract output from response
340
+ let output = "";
341
+ const filesChanged = [];
342
+ if (msgRes.parts) {
343
+ for (const part of msgRes.parts) {
344
+ if (part.type === "text" && typeof part.text === "string") {
345
+ output += part.text;
346
+ }
347
+ if (part.type === "tool_use" || part.type === "tool_call") {
348
+ const name = part.name;
349
+ const input = part.input;
350
+ if ((name === "write" || name === "edit") && input) {
351
+ const fp = input.file_path || input.path;
352
+ if (typeof fp === "string")
353
+ filesChanged.push(fp);
354
+ }
355
+ }
356
+ }
357
+ }
358
+ // Also check info.content for assistant messages
359
+ const info = msgRes.info;
360
+ if (info?.content && typeof info.content === "string") {
361
+ if (!output)
362
+ output = info.content;
363
+ }
364
+ // Extract token usage from response (may be in usage, total_usage, or info.usage)
365
+ let usage;
366
+ const u = (msgRes.usage ?? msgRes.total_usage ?? info?.usage);
367
+ if (u) {
368
+ const inputTokens = u.input_tokens ?? u.prompt_tokens ?? 0;
369
+ const outputTokens = u.output_tokens ?? u.completion_tokens ?? 0;
370
+ if (inputTokens > 0 || outputTokens > 0) {
371
+ usage = {
372
+ inputTokens,
373
+ outputTokens,
374
+ totalTokens: u.total_tokens ?? inputTokens + outputTokens,
375
+ };
376
+ }
377
+ }
378
+ return { output, filesChanged: [...new Set(filesChanged)], sessionId: sessionId, usage };
379
+ }
380
+ catch {
381
+ return null;
382
+ }
383
+ }
384
+ function httpPost(url, body, signal) {
385
+ return new Promise((resolve) => {
386
+ const data = JSON.stringify(body);
387
+ const parsed = new URL(url);
388
+ const req = http.request({
389
+ hostname: parsed.hostname,
390
+ port: parsed.port,
391
+ path: parsed.pathname,
392
+ method: "POST",
393
+ headers: {
394
+ "Content-Type": "application/json",
395
+ "Content-Length": Buffer.byteLength(data),
396
+ },
397
+ timeout: 300000, // 5 min for long tasks
398
+ }, (res) => {
399
+ let responseBody = "";
400
+ res.on("data", (d) => {
401
+ responseBody += d;
402
+ });
403
+ res.on("end", () => {
404
+ // Reject non-2xx status codes
405
+ const status = res.statusCode ?? 0;
406
+ if (status < 200 || status >= 300) {
407
+ resolve(null);
408
+ return;
409
+ }
410
+ try {
411
+ resolve(JSON.parse(responseBody));
412
+ }
413
+ catch {
414
+ resolve(null);
415
+ }
416
+ });
417
+ });
418
+ req.on("error", () => resolve(null));
419
+ req.on("timeout", () => {
420
+ req.destroy();
421
+ resolve(null);
422
+ });
423
+ if (signal) {
424
+ const onAbort = () => req.destroy();
425
+ if (signal.aborted) {
426
+ req.destroy();
427
+ resolve(null);
428
+ return;
429
+ }
430
+ signal.addEventListener("abort", onAbort, { once: true });
431
+ req.on("close", () => signal.removeEventListener("abort", onAbort));
432
+ }
433
+ req.write(data);
434
+ req.end();
435
+ });
436
+ }
437
+ // ── Attach mode execution ────────────────────────────────────────────────────
438
+ /**
439
+ * Execute via `opencode run --attach <url>` — connects to a running server
440
+ * but uses the CLI's output parsing.
441
+ */
442
+ function runViaAttach(serverUrl, task, workDir, model, signal, onOutput) {
443
+ const startTime = Date.now();
444
+ const args = ["run", "--attach", serverUrl, "--format", "json"];
445
+ if (model)
446
+ args.push("--model", normalizeModelForOpenCode(model));
447
+ args.push(task);
448
+ return runSubprocess(args, workDir, startTime, signal, onOutput);
449
+ }
450
+ // ── Subprocess mode execution ────────────────────────────────────────────────
451
+ /**
452
+ * Execute via cold-start `opencode run` subprocess.
453
+ * Always-available fallback.
454
+ */
455
+ function runViaSubprocess(task, workDir, model, signal, onOutput) {
456
+ const startTime = Date.now();
457
+ const args = ["run", "--format", "json"];
458
+ if (model)
459
+ args.push("--model", normalizeModelForOpenCode(model));
460
+ args.push(task);
461
+ return runSubprocess(args, workDir, startTime, signal, onOutput);
462
+ }
463
+ /** Shared subprocess runner for both attach and cold-start modes. */
464
+ async function runSubprocess(args, workDir, startTime, signal, onOutput) {
465
+ let proc;
466
+ try {
467
+ proc = await safeSpawn("opencode", args, {
468
+ cwd: workDir,
469
+ stdio: ["ignore", "pipe", "pipe"],
470
+ env: buildAgentEnv(),
471
+ });
472
+ }
473
+ catch (err) {
474
+ return {
475
+ success: false,
476
+ output: "",
477
+ filesChanged: [],
478
+ diff: "",
479
+ error: `Failed to spawn opencode: ${err instanceof Error ? err.message : String(err)}`,
480
+ durationMs: 0,
481
+ };
482
+ }
483
+ return new Promise((resolve) => {
484
+ const stdoutBuf = new RollingBuffer(2 * 1024 * 1024); // 2MB
485
+ const stderrBuf = new RollingBuffer(512 * 1024); // 512KB
486
+ let resolved = false;
487
+ const doResolve = (result) => {
488
+ if (resolved)
489
+ return;
490
+ resolved = true;
491
+ resolve(result);
492
+ };
493
+ proc.stdout?.on("data", (chunk) => {
494
+ const text = chunk.toString();
495
+ stdoutBuf.append(text);
496
+ onOutput?.(text);
497
+ });
498
+ proc.stderr?.on("data", (chunk) => {
499
+ stderrBuf.append(chunk.toString());
500
+ });
501
+ if (signal) {
502
+ const onAbort = () => {
503
+ proc.kill("SIGTERM");
504
+ const killTimer = setTimeout(() => {
505
+ try {
506
+ if (proc.exitCode === null)
507
+ proc.kill("SIGKILL");
508
+ }
509
+ catch {
510
+ /* dead */
511
+ }
512
+ }, 3000);
513
+ proc.on("exit", () => clearTimeout(killTimer));
514
+ };
515
+ if (signal.aborted) {
516
+ onAbort();
517
+ }
518
+ else {
519
+ signal.addEventListener("abort", onAbort, { once: true });
520
+ proc.on("exit", () => signal.removeEventListener("abort", onAbort));
521
+ }
522
+ }
523
+ proc.on("close", (code) => {
524
+ const stdout = stdoutBuf.toString();
525
+ const stderr = stderrBuf.toString();
526
+ const durationMs = Date.now() - startTime;
527
+ let filesChanged = [];
528
+ let output = stdout;
529
+ const parsed = extractJson(stdout);
530
+ let usage;
531
+ if (parsed) {
532
+ const extracted = extractFromParsed(parsed);
533
+ if (extracted.error) {
534
+ doResolve({
535
+ success: false,
536
+ output: extracted.error,
537
+ filesChanged: [],
538
+ diff: "",
539
+ durationMs,
540
+ error: extracted.error,
541
+ usage: extracted.usage,
542
+ });
543
+ return;
544
+ }
545
+ if (extracted.output)
546
+ output = extracted.output;
547
+ filesChanged = extracted.filesChanged;
548
+ usage = extracted.usage;
549
+ }
550
+ doResolve({
551
+ success: code === 0,
552
+ output,
553
+ filesChanged,
554
+ diff: "",
555
+ durationMs,
556
+ error: code !== 0 ? `opencode exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}` : undefined,
557
+ usage,
558
+ });
559
+ });
560
+ proc.on("error", (err) => {
561
+ doResolve({
562
+ success: false,
563
+ output: "",
564
+ filesChanged: [],
565
+ diff: "",
566
+ durationMs: Date.now() - startTime,
567
+ error: `Failed to spawn opencode: ${err.message}`,
568
+ });
569
+ });
570
+ });
571
+ }
572
+ // ── Provider ─────────────────────────────────────────────────────────────────
573
+ // Whether server mode is enabled (set via enableServerMode)
574
+ let _serverModeEnabled = false;
575
+ /** Enable server mode for the OpenCode agent. Call before spawning threads. */
576
+ export function enableServerMode() {
577
+ _serverModeEnabled = true;
578
+ }
579
+ /** Disable server mode and shut down all managed servers. */
580
+ export async function disableServerMode() {
581
+ _serverModeEnabled = false;
582
+ await serverPool.shutdown();
583
+ }
584
+ /** Get the number of active server instances. */
585
+ export function getActiveServerCount() {
586
+ return serverPool.activeCount;
587
+ }
588
+ const openCodeProvider = {
589
+ name: "opencode",
590
+ async isAvailable() {
591
+ return commandExists("opencode");
592
+ },
593
+ async run(options) {
594
+ const { task, workDir, model, signal, onOutput } = options;
595
+ const startTime = Date.now();
596
+ // Strategy 1: Server mode (HTTP API)
597
+ if (_serverModeEnabled) {
598
+ try {
599
+ const serverUrl = await serverPool.getServer(workDir);
600
+ if (serverUrl) {
601
+ const apiResult = await runViaHttpApi(serverUrl, task, model, signal);
602
+ if (apiResult) {
603
+ return {
604
+ success: true,
605
+ output: apiResult.output,
606
+ filesChanged: apiResult.filesChanged,
607
+ diff: "",
608
+ durationMs: Date.now() - startTime,
609
+ usage: apiResult.usage,
610
+ };
611
+ }
612
+ // API call failed — try attach mode with the same server
613
+ try {
614
+ return await runViaAttach(serverUrl, task, workDir, model, signal, onOutput);
615
+ }
616
+ catch {
617
+ // Fall through to subprocess
618
+ }
619
+ }
620
+ }
621
+ catch {
622
+ // Server mode unavailable — fall through
623
+ }
624
+ }
625
+ // Strategy 2: Subprocess mode (always-available fallback)
626
+ return runViaSubprocess(task, workDir, model, signal, onOutput);
627
+ },
628
+ };
629
+ registerAgent(openCodeProvider);
630
+ export default openCodeProvider;
631
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Agent provider interface and registry.
3
+ *
4
+ * Each agent backend (OpenCode, Claude Code, etc.) implements AgentProvider.
5
+ * The registry maps backend names to providers.
6
+ */
7
+ import type { AgentProvider } from "../core/types.js";
8
+ export declare function registerAgent(provider: AgentProvider): void;
9
+ export declare function getAgent(name: string): AgentProvider;
10
+ export declare function listAgents(): string[];
11
+ export declare function getAvailableAgents(): Promise<string[]>;