mcp-subagents-opencode 1.0.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +602 -0
  3. package/build/config/timeouts.d.ts +9 -0
  4. package/build/config/timeouts.d.ts.map +1 -0
  5. package/build/config/timeouts.js +18 -0
  6. package/build/config/timeouts.js.map +1 -0
  7. package/build/helpers.d.ts +6 -0
  8. package/build/helpers.d.ts.map +1 -0
  9. package/build/helpers.js +47 -0
  10. package/build/helpers.js.map +1 -0
  11. package/build/index.d.ts +3 -0
  12. package/build/index.d.ts.map +1 -0
  13. package/build/index.js +245 -0
  14. package/build/index.js.map +1 -0
  15. package/build/models.d.ts +32 -0
  16. package/build/models.d.ts.map +1 -0
  17. package/build/models.js +58 -0
  18. package/build/models.js.map +1 -0
  19. package/build/server/register-notifications.d.ts +3 -0
  20. package/build/server/register-notifications.d.ts.map +1 -0
  21. package/build/server/register-notifications.js +77 -0
  22. package/build/server/register-notifications.js.map +1 -0
  23. package/build/server/register-resources.d.ts +3 -0
  24. package/build/server/register-resources.d.ts.map +1 -0
  25. package/build/server/register-resources.js +210 -0
  26. package/build/server/register-resources.js.map +1 -0
  27. package/build/server/register-retry-execution.d.ts +2 -0
  28. package/build/server/register-retry-execution.d.ts.map +1 -0
  29. package/build/server/register-retry-execution.js +28 -0
  30. package/build/server/register-retry-execution.js.map +1 -0
  31. package/build/server/register-tasks.d.ts +3 -0
  32. package/build/server/register-tasks.d.ts.map +1 -0
  33. package/build/server/register-tasks.js +52 -0
  34. package/build/server/register-tasks.js.map +1 -0
  35. package/build/server/register-tools.d.ts +3 -0
  36. package/build/server/register-tools.d.ts.map +1 -0
  37. package/build/server/register-tools.js +32 -0
  38. package/build/server/register-tools.js.map +1 -0
  39. package/build/server/resource-helpers.d.ts +21 -0
  40. package/build/server/resource-helpers.d.ts.map +1 -0
  41. package/build/server/resource-helpers.js +84 -0
  42. package/build/server/resource-helpers.js.map +1 -0
  43. package/build/services/account-manager.d.ts +88 -0
  44. package/build/services/account-manager.d.ts.map +1 -0
  45. package/build/services/account-manager.js +239 -0
  46. package/build/services/account-manager.js.map +1 -0
  47. package/build/services/claude-code-runner.d.ts +15 -0
  48. package/build/services/claude-code-runner.d.ts.map +1 -0
  49. package/build/services/claude-code-runner.js +475 -0
  50. package/build/services/claude-code-runner.js.map +1 -0
  51. package/build/services/client-context.d.ts +31 -0
  52. package/build/services/client-context.d.ts.map +1 -0
  53. package/build/services/client-context.js +44 -0
  54. package/build/services/client-context.js.map +1 -0
  55. package/build/services/exhaustion-fallback.d.ts +27 -0
  56. package/build/services/exhaustion-fallback.d.ts.map +1 -0
  57. package/build/services/exhaustion-fallback.js +30 -0
  58. package/build/services/exhaustion-fallback.js.map +1 -0
  59. package/build/services/fallback-orchestrator.d.ts +16 -0
  60. package/build/services/fallback-orchestrator.d.ts.map +1 -0
  61. package/build/services/fallback-orchestrator.js +48 -0
  62. package/build/services/fallback-orchestrator.js.map +1 -0
  63. package/build/services/opencode-client.d.ts +40 -0
  64. package/build/services/opencode-client.d.ts.map +1 -0
  65. package/build/services/opencode-client.js +147 -0
  66. package/build/services/opencode-client.js.map +1 -0
  67. package/build/services/opencode-spawner.d.ts +56 -0
  68. package/build/services/opencode-spawner.d.ts.map +1 -0
  69. package/build/services/opencode-spawner.js +426 -0
  70. package/build/services/opencode-spawner.js.map +1 -0
  71. package/build/services/output-file.d.ts +24 -0
  72. package/build/services/output-file.d.ts.map +1 -0
  73. package/build/services/output-file.js +90 -0
  74. package/build/services/output-file.js.map +1 -0
  75. package/build/services/progress-registry.d.ts +12 -0
  76. package/build/services/progress-registry.d.ts.map +1 -0
  77. package/build/services/progress-registry.js +97 -0
  78. package/build/services/progress-registry.js.map +1 -0
  79. package/build/services/question-registry.d.ts +79 -0
  80. package/build/services/question-registry.d.ts.map +1 -0
  81. package/build/services/question-registry.js +249 -0
  82. package/build/services/question-registry.js.map +1 -0
  83. package/build/services/retry-queue.d.ts +41 -0
  84. package/build/services/retry-queue.d.ts.map +1 -0
  85. package/build/services/retry-queue.js +195 -0
  86. package/build/services/retry-queue.js.map +1 -0
  87. package/build/services/sdk-client-manager.d.ts +149 -0
  88. package/build/services/sdk-client-manager.d.ts.map +1 -0
  89. package/build/services/sdk-client-manager.js +632 -0
  90. package/build/services/sdk-client-manager.js.map +1 -0
  91. package/build/services/sdk-session-adapter.d.ts +203 -0
  92. package/build/services/sdk-session-adapter.d.ts.map +1 -0
  93. package/build/services/sdk-session-adapter.js +1088 -0
  94. package/build/services/sdk-session-adapter.js.map +1 -0
  95. package/build/services/sdk-spawner.d.ts +42 -0
  96. package/build/services/sdk-spawner.d.ts.map +1 -0
  97. package/build/services/sdk-spawner.js +488 -0
  98. package/build/services/sdk-spawner.js.map +1 -0
  99. package/build/services/session-hooks.d.ts +24 -0
  100. package/build/services/session-hooks.d.ts.map +1 -0
  101. package/build/services/session-hooks.js +130 -0
  102. package/build/services/session-hooks.js.map +1 -0
  103. package/build/services/session-snapshot.d.ts +19 -0
  104. package/build/services/session-snapshot.d.ts.map +1 -0
  105. package/build/services/session-snapshot.js +203 -0
  106. package/build/services/session-snapshot.js.map +1 -0
  107. package/build/services/subscription-registry.d.ts +12 -0
  108. package/build/services/subscription-registry.d.ts.map +1 -0
  109. package/build/services/subscription-registry.js +27 -0
  110. package/build/services/subscription-registry.js.map +1 -0
  111. package/build/services/task-manager.d.ts +150 -0
  112. package/build/services/task-manager.d.ts.map +1 -0
  113. package/build/services/task-manager.js +765 -0
  114. package/build/services/task-manager.js.map +1 -0
  115. package/build/services/task-persistence.d.ts +29 -0
  116. package/build/services/task-persistence.d.ts.map +1 -0
  117. package/build/services/task-persistence.js +159 -0
  118. package/build/services/task-persistence.js.map +1 -0
  119. package/build/services/task-status-mapper.d.ts +21 -0
  120. package/build/services/task-status-mapper.d.ts.map +1 -0
  121. package/build/services/task-status-mapper.js +171 -0
  122. package/build/services/task-status-mapper.js.map +1 -0
  123. package/build/templates/index.d.ts +22 -0
  124. package/build/templates/index.d.ts.map +1 -0
  125. package/build/templates/index.js +147 -0
  126. package/build/templates/index.js.map +1 -0
  127. package/build/templates/overlays/coder-csharp.mdx +58 -0
  128. package/build/templates/overlays/coder-go.mdx +53 -0
  129. package/build/templates/overlays/coder-java.mdx +54 -0
  130. package/build/templates/overlays/coder-kotlin.mdx +56 -0
  131. package/build/templates/overlays/coder-nextjs.mdx +65 -0
  132. package/build/templates/overlays/coder-python.mdx +53 -0
  133. package/build/templates/overlays/coder-react.mdx +55 -0
  134. package/build/templates/overlays/coder-ruby.mdx +59 -0
  135. package/build/templates/overlays/coder-rust.mdx +48 -0
  136. package/build/templates/overlays/coder-supabase.mdx +268 -0
  137. package/build/templates/overlays/coder-supastarter.mdx +313 -0
  138. package/build/templates/overlays/coder-swift.mdx +56 -0
  139. package/build/templates/overlays/coder-tauri.mdx +566 -0
  140. package/build/templates/overlays/coder-triggerdev.mdx +296 -0
  141. package/build/templates/overlays/coder-typescript.mdx +45 -0
  142. package/build/templates/overlays/coder-vue.mdx +62 -0
  143. package/build/templates/overlays/planner-architecture.mdx +78 -0
  144. package/build/templates/overlays/planner-bugfix.mdx +36 -0
  145. package/build/templates/overlays/planner-feature.mdx +38 -0
  146. package/build/templates/overlays/planner-migration.mdx +50 -0
  147. package/build/templates/overlays/planner-refactor.mdx +57 -0
  148. package/build/templates/overlays/researcher-library.mdx +59 -0
  149. package/build/templates/overlays/researcher-performance.mdx +68 -0
  150. package/build/templates/overlays/researcher-security.mdx +86 -0
  151. package/build/templates/overlays/tester-graphql.mdx +191 -0
  152. package/build/templates/overlays/tester-playwright.mdx +621 -0
  153. package/build/templates/overlays/tester-rest.mdx +101 -0
  154. package/build/templates/overlays/tester-suite.mdx +177 -0
  155. package/build/templates/super-coder.mdx +529 -0
  156. package/build/templates/super-planner.mdx +568 -0
  157. package/build/templates/super-researcher.mdx +406 -0
  158. package/build/templates/super-tester.mdx +243 -0
  159. package/build/tools/answer-question.d.ts +30 -0
  160. package/build/tools/answer-question.d.ts.map +1 -0
  161. package/build/tools/answer-question.js +108 -0
  162. package/build/tools/answer-question.js.map +1 -0
  163. package/build/tools/cancel-task.d.ts +44 -0
  164. package/build/tools/cancel-task.d.ts.map +1 -0
  165. package/build/tools/cancel-task.js +144 -0
  166. package/build/tools/cancel-task.js.map +1 -0
  167. package/build/tools/send-message.d.ts +39 -0
  168. package/build/tools/send-message.d.ts.map +1 -0
  169. package/build/tools/send-message.js +124 -0
  170. package/build/tools/send-message.js.map +1 -0
  171. package/build/tools/shared-spawn.d.ts +56 -0
  172. package/build/tools/shared-spawn.d.ts.map +1 -0
  173. package/build/tools/shared-spawn.js +114 -0
  174. package/build/tools/shared-spawn.js.map +1 -0
  175. package/build/tools/spawn-agent.d.ts +85 -0
  176. package/build/tools/spawn-agent.d.ts.map +1 -0
  177. package/build/tools/spawn-agent.js +133 -0
  178. package/build/tools/spawn-agent.js.map +1 -0
  179. package/build/tools/spawn-coder.d.ts +70 -0
  180. package/build/tools/spawn-coder.d.ts.map +1 -0
  181. package/build/tools/spawn-coder.js +71 -0
  182. package/build/tools/spawn-coder.js.map +1 -0
  183. package/build/tools/spawn-planner.d.ts +70 -0
  184. package/build/tools/spawn-planner.d.ts.map +1 -0
  185. package/build/tools/spawn-planner.js +71 -0
  186. package/build/tools/spawn-planner.js.map +1 -0
  187. package/build/tools/spawn-researcher.d.ts +70 -0
  188. package/build/tools/spawn-researcher.d.ts.map +1 -0
  189. package/build/tools/spawn-researcher.js +70 -0
  190. package/build/tools/spawn-researcher.js.map +1 -0
  191. package/build/tools/spawn-task.d.ts +74 -0
  192. package/build/tools/spawn-task.d.ts.map +1 -0
  193. package/build/tools/spawn-task.js +107 -0
  194. package/build/tools/spawn-task.js.map +1 -0
  195. package/build/tools/spawn-tester.d.ts +70 -0
  196. package/build/tools/spawn-tester.d.ts.map +1 -0
  197. package/build/tools/spawn-tester.js +69 -0
  198. package/build/tools/spawn-tester.js.map +1 -0
  199. package/build/types.d.ts +101 -0
  200. package/build/types.d.ts.map +1 -0
  201. package/build/types.js +28 -0
  202. package/build/types.js.map +1 -0
  203. package/build/utils/brief-validator.d.ts +30 -0
  204. package/build/utils/brief-validator.d.ts.map +1 -0
  205. package/build/utils/brief-validator.js +254 -0
  206. package/build/utils/brief-validator.js.map +1 -0
  207. package/build/utils/format.d.ts +34 -0
  208. package/build/utils/format.d.ts.map +1 -0
  209. package/build/utils/format.js +55 -0
  210. package/build/utils/format.js.map +1 -0
  211. package/build/utils/sanitize.d.ts +240 -0
  212. package/build/utils/sanitize.d.ts.map +1 -0
  213. package/build/utils/sanitize.js +89 -0
  214. package/build/utils/sanitize.js.map +1 -0
  215. package/build/utils/task-id-generator.d.ts +10 -0
  216. package/build/utils/task-id-generator.d.ts.map +1 -0
  217. package/build/utils/task-id-generator.js +22 -0
  218. package/build/utils/task-id-generator.js.map +1 -0
  219. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/fallback-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAKpE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAqDtG"}
@@ -0,0 +1,48 @@
1
+ import { taskManager } from './task-manager.js';
2
+ import { isTerminalStatus } from '../types.js';
3
+ import { TASK_TIMEOUT_DEFAULT_MS } from '../config/timeouts.js';
4
+ import { buildHandoffPromptFromSession } from './session-snapshot.js';
5
+ import { runClaudeCodeSession } from './claude-code-runner.js';
6
+ /**
7
+ * Start Claude fallback exactly once per task.
8
+ * Uses task.fallbackAttempted as the single-flight guard.
9
+ */
10
+ export async function triggerClaudeFallback(taskId, request) {
11
+ const task = taskManager.getTask(taskId);
12
+ if (!task || isTerminalStatus(task.status)) {
13
+ return false;
14
+ }
15
+ if (task.fallbackAttempted) {
16
+ return false;
17
+ }
18
+ taskManager.updateTask(taskId, {
19
+ fallbackAttempted: true,
20
+ switchAttempted: true,
21
+ });
22
+ const freshTask = taskManager.getTask(taskId);
23
+ if (!freshTask || isTerminalStatus(freshTask.status)) {
24
+ return false;
25
+ }
26
+ const cwd = request.cwd || freshTask.cwd || process.cwd();
27
+ const taskTimeout = freshTask.timeout ?? TASK_TIMEOUT_DEFAULT_MS;
28
+ const elapsed = Date.now() - new Date(freshTask.startTime).getTime();
29
+ const timeoutRemaining = Math.max(1000, taskTimeout - elapsed);
30
+ const fallbackPrompt = request.promptOverride ?? await buildHandoffPromptFromSession(freshTask, request.session, 5, request.reason);
31
+ if (request.errorMessage) {
32
+ taskManager.appendOutput(taskId, `\n[system] Copilot error: ${request.errorMessage}\n[system] Switching to Claude Agent SDK...\n`);
33
+ }
34
+ const run = runClaudeCodeSession(taskId, fallbackPrompt, cwd, timeoutRemaining, {
35
+ fallbackReason: request.reason,
36
+ preferredModel: freshTask.model,
37
+ });
38
+ if (request.awaitCompletion) {
39
+ await run;
40
+ }
41
+ else {
42
+ run.catch((err) => {
43
+ console.error(`[fallback-orchestrator] Claude fallback failed for ${taskId}:`, err);
44
+ });
45
+ }
46
+ return true;
47
+ }
48
+ //# sourceMappingURL=fallback-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-orchestrator.js","sourceRoot":"","sources":["../../src/services/fallback-orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAW/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,OAAwB;IAClF,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE;QAC7B,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,IAAI,uBAAuB,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;IAE/D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,MAAM,6BAA6B,CAClF,SAAS,EACT,OAAO,CAAC,OAAO,EACf,CAAC,EACD,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,WAAW,CAAC,YAAY,CACtB,MAAM,EACN,6BAA6B,OAAO,CAAC,YAAY,+CAA+C,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,EAAE;QAC9E,cAAc,EAAE,OAAO,CAAC,MAAM;QAC9B,cAAc,EAAE,SAAS,CAAC,KAAK;KAChC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,sDAAsD,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * HTTP client wrapper for the OpenCode headless server API.
3
+ * Supports retry, Basic auth, SSE streaming, and health checks.
4
+ */
5
+ export interface OpenCodeClientOptions {
6
+ baseUrl: string;
7
+ username?: string;
8
+ password?: string;
9
+ }
10
+ export declare class OpenCodeError extends Error {
11
+ readonly status: number;
12
+ readonly method: string;
13
+ readonly path: string;
14
+ readonly body: string;
15
+ constructor(message: string, status: number, method: string, path: string, body: string);
16
+ get isTransient(): boolean;
17
+ get isNotFound(): boolean;
18
+ get isAuth(): boolean;
19
+ }
20
+ export declare class OpenCodeClient {
21
+ private baseUrl;
22
+ private authHeader?;
23
+ constructor(options: OpenCodeClientOptions);
24
+ getBaseUrl(): string;
25
+ private buildUrl;
26
+ private headers;
27
+ private request;
28
+ get<T = unknown>(path: string, query?: Record<string, string>, directory?: string): Promise<T>;
29
+ post<T = unknown>(path: string, body?: unknown, opts?: {
30
+ timeout?: number;
31
+ directory?: string;
32
+ }): Promise<T>;
33
+ patch<T = unknown>(path: string, body?: unknown, directory?: string): Promise<T>;
34
+ delete<T = unknown>(path: string, query?: Record<string, string>, directory?: string): Promise<T>;
35
+ /**
36
+ * Check if the OpenCode server is healthy.
37
+ */
38
+ isHealthy(): Promise<boolean>;
39
+ }
40
+ //# sourceMappingURL=opencode-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,MAAM;gBAJ5B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAM9B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAKD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,EAAE,qBAAqB;IAQ1C,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,OAAO;YAcD,OAAO;IAwEf,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9F,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5G,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvG;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAWpC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * HTTP client wrapper for the OpenCode headless server API.
3
+ * Supports retry, Basic auth, SSE streaming, and health checks.
4
+ */
5
+ export class OpenCodeError extends Error {
6
+ status;
7
+ method;
8
+ path;
9
+ body;
10
+ constructor(message, status, method, path, body) {
11
+ super(message);
12
+ this.status = status;
13
+ this.method = method;
14
+ this.path = path;
15
+ this.body = body;
16
+ this.name = 'OpenCodeError';
17
+ }
18
+ get isTransient() {
19
+ return this.status === 429 || this.status === 502 || this.status === 503 || this.status === 504;
20
+ }
21
+ get isNotFound() {
22
+ return this.status === 404;
23
+ }
24
+ get isAuth() {
25
+ return this.status === 401 || this.status === 403;
26
+ }
27
+ }
28
+ const MAX_RETRIES = 2;
29
+ const BASE_DELAY_MS = 500;
30
+ export class OpenCodeClient {
31
+ baseUrl;
32
+ authHeader;
33
+ constructor(options) {
34
+ this.baseUrl = options.baseUrl.replace(/\/$/, '');
35
+ if (options.password) {
36
+ const username = options.username ?? 'opencode';
37
+ this.authHeader = 'Basic ' + Buffer.from(`${username}:${options.password}`).toString('base64');
38
+ }
39
+ }
40
+ getBaseUrl() {
41
+ return this.baseUrl;
42
+ }
43
+ buildUrl(path, query) {
44
+ const url = new URL(path, this.baseUrl);
45
+ if (query) {
46
+ for (const [key, value] of Object.entries(query)) {
47
+ if (value !== undefined && value !== '') {
48
+ url.searchParams.set(key, value);
49
+ }
50
+ }
51
+ }
52
+ return url.toString();
53
+ }
54
+ headers(accept, directory) {
55
+ const h = {
56
+ 'Content-Type': 'application/json',
57
+ 'Accept': accept ?? 'application/json',
58
+ };
59
+ if (this.authHeader) {
60
+ h['Authorization'] = this.authHeader;
61
+ }
62
+ if (directory) {
63
+ h['x-opencode-directory'] = directory;
64
+ }
65
+ return h;
66
+ }
67
+ async request(method, path, opts) {
68
+ const url = this.buildUrl(path, opts?.query);
69
+ let lastError;
70
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
71
+ if (attempt > 0) {
72
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1);
73
+ await new Promise((r) => setTimeout(r, delay));
74
+ }
75
+ try {
76
+ const controller = new AbortController();
77
+ const timeoutId = opts?.timeout
78
+ ? setTimeout(() => controller.abort(), opts.timeout)
79
+ : undefined;
80
+ const res = await fetch(url, {
81
+ method,
82
+ headers: this.headers(undefined, opts?.directory),
83
+ body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,
84
+ signal: controller.signal,
85
+ });
86
+ if (timeoutId)
87
+ clearTimeout(timeoutId);
88
+ if (!res.ok) {
89
+ const text = await res.text();
90
+ const err = new OpenCodeError(`${method} ${path} failed (${res.status}): ${text}`, res.status, method, path, text);
91
+ if (err.isTransient && attempt < MAX_RETRIES) {
92
+ lastError = err;
93
+ continue;
94
+ }
95
+ throw err;
96
+ }
97
+ if (res.status === 204)
98
+ return undefined;
99
+ const contentType = res.headers.get('content-type') ?? '';
100
+ const text = await res.text();
101
+ // Handle empty response body (OpenCode returns 200 with empty body for some async operations)
102
+ if (!text || text.trim() === '')
103
+ return undefined;
104
+ if (contentType.includes('application/json')) {
105
+ return JSON.parse(text);
106
+ }
107
+ return text;
108
+ }
109
+ catch (e) {
110
+ if (e instanceof OpenCodeError)
111
+ throw e;
112
+ lastError = e;
113
+ if (attempt >= MAX_RETRIES)
114
+ break;
115
+ }
116
+ }
117
+ throw lastError ?? new Error(`${method} ${path} failed after retries`);
118
+ }
119
+ async get(path, query, directory) {
120
+ return this.request('GET', path, { query, directory });
121
+ }
122
+ async post(path, body, opts) {
123
+ return this.request('POST', path, { body, timeout: opts?.timeout, directory: opts?.directory });
124
+ }
125
+ async patch(path, body, directory) {
126
+ return this.request('PATCH', path, { body, directory });
127
+ }
128
+ async delete(path, query, directory) {
129
+ return this.request('DELETE', path, { query, directory });
130
+ }
131
+ /**
132
+ * Check if the OpenCode server is healthy.
133
+ */
134
+ async isHealthy() {
135
+ try {
136
+ const res = await fetch(`${this.baseUrl}/session`, {
137
+ headers: { 'Accept': 'application/json' },
138
+ signal: AbortSignal.timeout(5000),
139
+ });
140
+ return res.ok;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ }
147
+ //# sourceMappingURL=opencode-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IACA;IACA;IALlB,YACE,OAAe,EACC,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;IAClG,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;IACpD,CAAC;CACF;AAED,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,UAAU,CAAU;IAE5B,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;YAChD,IAAI,CAAC,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,KAA8B;QAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,OAAO,CAAC,MAAe,EAAE,SAAkB;QACjD,MAAM,CAAC,GAA2B;YAChC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,MAAM,IAAI,kBAAkB;SACvC,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACvC,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,CAAC,CAAC,sBAAsB,CAAC,GAAG,SAAS,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAKC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,IAAI,EAAE,OAAO;oBAC7B,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC;oBACpD,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAC3B,MAAM;oBACN,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;oBACjD,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACtE,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,IAAI,SAAS;oBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;gBAEvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,IAAI,aAAa,CAC3B,GAAG,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,EACnD,GAAG,CAAC,MAAM,EACV,MAAM,EACN,IAAI,EACJ,IAAI,CACL,CAAC;oBACF,IAAI,GAAG,CAAC,WAAW,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;wBAC7C,SAAS,GAAG,GAAG,CAAC;wBAChB,SAAS;oBACX,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,SAAc,CAAC;gBAE9C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAE9B,8FAA8F;gBAC9F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,OAAO,SAAc,CAAC;gBAEvD,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;gBAC/B,CAAC;gBACD,OAAO,IAAoB,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,aAAa;oBAAE,MAAM,CAAC,CAAC;gBACxC,SAAS,GAAG,CAAU,CAAC;gBACvB,IAAI,OAAO,IAAI,WAAW;oBAAE,MAAM;YACpC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,uBAAuB,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,IAAY,EAAE,KAA8B,EAAE,SAAkB;QACrF,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,IAAY,EAAE,IAAc,EAAE,IAA+C;QACnG,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,KAAK,CAAc,IAAY,EAAE,IAAc,EAAE,SAAkB;QACvE,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,IAAY,EAAE,KAA8B,EAAE,SAAkB;QACxF,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,EAAE;gBACjD,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;gBACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * OpenCode Spawner - Spawns and manages tasks using the OpenCode headless server HTTP API.
3
+ *
4
+ * OpenCode Spawner - Spawns and manages tasks using the OpenCode headless server HTTP API.
5
+ *
6
+ * Uses the OpenCode HTTP API to:
7
+ * - Create sessions
8
+ * - Send messages/prompts
9
+ * - Poll for completion
10
+ * - Get results
11
+ */
12
+ import { type SpawnOptions, type TaskState } from '../types.js';
13
+ import type { OpenCodeClient } from './opencode-client.js';
14
+ /**
15
+ * Initialize the spawner with the OpenCode client instance.
16
+ */
17
+ export declare function initSpawner(client: OpenCodeClient): void;
18
+ /**
19
+ * Spawn a new task using the OpenCode headless server.
20
+ */
21
+ export declare function spawnOpenCodeTask(options: SpawnOptions): Promise<string>;
22
+ /**
23
+ * Execute a waiting task (called when dependencies are satisfied).
24
+ */
25
+ export declare function executeWaitingTask(task: TaskState): Promise<void>;
26
+ /**
27
+ * Cancel a running task. Aliased as both cancelOpenCodeTask and cancelTask.
28
+ */
29
+ export declare function cancelOpenCodeTask(taskId: string): Promise<boolean>;
30
+ export { cancelOpenCodeTask as cancelTask };
31
+ /**
32
+ * Send a follow-up message to an existing session.
33
+ */
34
+ export declare function sendMessageToSession(taskId: string, message: string): Promise<{
35
+ success: boolean;
36
+ error?: string;
37
+ response?: string;
38
+ }>;
39
+ /**
40
+ * Check if the OpenCode server is healthy.
41
+ */
42
+ export declare function checkOpenCodeAvailable(): Promise<boolean>;
43
+ /**
44
+ * Shutdown the spawner - cancel all active pollers.
45
+ */
46
+ export declare function shutdownSpawner(): void;
47
+ /**
48
+ * Get spawner statistics.
49
+ */
50
+ export declare function getSpawnerStats(): {
51
+ activeTasks: number;
52
+ activePollers: number;
53
+ clientInitialized: boolean;
54
+ baseUrl: string;
55
+ };
56
+ //# sourceMappingURL=opencode-spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-spawner.d.ts","sourceRoot":"","sources":["../../src/services/opencode-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,SAAS,EAAoB,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAW3D;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAExD;AAmBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C9E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvE;AAyPD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzE;AAED,OAAO,EAAE,kBAAkB,IAAI,UAAU,EAAE,CAAC;AAE5C;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC5I;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAOA"}