subharness 0.0.3 → 0.0.5

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 (241) hide show
  1. package/README.md +39 -9
  2. package/dist/adapters/approval-context.d.ts +2 -0
  3. package/dist/adapters/approval-context.js +9 -0
  4. package/dist/adapters/approval-context.js.map +1 -0
  5. package/dist/adapters/approval-lifetime.d.ts +8 -0
  6. package/dist/adapters/approval-lifetime.js +50 -0
  7. package/dist/adapters/approval-lifetime.js.map +1 -0
  8. package/dist/adapters/claude-approvals.d.ts +4 -0
  9. package/dist/adapters/claude-approvals.js +32 -0
  10. package/dist/adapters/claude-approvals.js.map +1 -0
  11. package/dist/adapters/claude-permissions.js +1 -1
  12. package/dist/adapters/claude-permissions.js.map +1 -1
  13. package/dist/adapters/claude-process.d.ts +3 -0
  14. package/dist/adapters/claude-process.js +11 -1
  15. package/dist/adapters/claude-process.js.map +1 -1
  16. package/dist/adapters/claude-result.d.ts +2 -0
  17. package/dist/adapters/claude-result.js +22 -0
  18. package/dist/adapters/claude-result.js.map +1 -0
  19. package/dist/adapters/claude.js +60 -12
  20. package/dist/adapters/claude.js.map +1 -1
  21. package/dist/adapters/codex-approvals.d.ts +6 -0
  22. package/dist/adapters/codex-approvals.js +111 -0
  23. package/dist/adapters/codex-approvals.js.map +1 -0
  24. package/dist/adapters/codex.js +36 -3
  25. package/dist/adapters/codex.js.map +1 -1
  26. package/dist/adapters/copilot-permissions.d.ts +26 -0
  27. package/dist/adapters/copilot-permissions.js +121 -0
  28. package/dist/adapters/copilot-permissions.js.map +1 -0
  29. package/dist/adapters/copilot-tools.d.ts +12 -0
  30. package/dist/adapters/copilot-tools.js +61 -0
  31. package/dist/adapters/copilot-tools.js.map +1 -0
  32. package/dist/adapters/copilot.d.ts +108 -0
  33. package/dist/adapters/copilot.js +819 -0
  34. package/dist/adapters/copilot.js.map +1 -0
  35. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  36. package/dist/adapters/cursor-cli-approvals.js +83 -0
  37. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  38. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  39. package/dist/adapters/cursor-cli-model.js +64 -0
  40. package/dist/adapters/cursor-cli-model.js.map +1 -0
  41. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  42. package/dist/adapters/cursor-cli-session.js +316 -0
  43. package/dist/adapters/cursor-cli-session.js.map +1 -0
  44. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  45. package/dist/adapters/cursor-cli-tools.js +181 -0
  46. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  47. package/dist/adapters/cursor-cli.d.ts +2 -0
  48. package/dist/adapters/cursor-cli.js +306 -0
  49. package/dist/adapters/cursor-cli.js.map +1 -0
  50. package/dist/adapters/cursor-model.d.ts +7 -0
  51. package/dist/adapters/cursor-model.js +67 -0
  52. package/dist/adapters/cursor-model.js.map +1 -0
  53. package/dist/adapters/cursor-rpc.d.ts +42 -0
  54. package/dist/adapters/cursor-rpc.js +271 -0
  55. package/dist/adapters/cursor-rpc.js.map +1 -0
  56. package/dist/adapters/cursor-session.d.ts +4 -0
  57. package/dist/adapters/cursor-session.js +327 -0
  58. package/dist/adapters/cursor-session.js.map +1 -0
  59. package/dist/adapters/cursor-startup.d.ts +16 -0
  60. package/dist/adapters/cursor-startup.js +74 -0
  61. package/dist/adapters/cursor-startup.js.map +1 -0
  62. package/dist/adapters/cursor-tools.d.ts +11 -0
  63. package/dist/adapters/cursor-tools.js +49 -0
  64. package/dist/adapters/cursor-tools.js.map +1 -0
  65. package/dist/adapters/cursor.d.ts +6 -0
  66. package/dist/adapters/cursor.js +17 -0
  67. package/dist/adapters/cursor.js.map +1 -0
  68. package/dist/adapters/fx-approvals.d.ts +2 -0
  69. package/dist/adapters/fx-approvals.js +14 -0
  70. package/dist/adapters/fx-approvals.js.map +1 -0
  71. package/dist/adapters/fx-auth.d.ts +12 -2
  72. package/dist/adapters/fx-auth.js +51 -61
  73. package/dist/adapters/fx-auth.js.map +1 -1
  74. package/dist/adapters/fx-profile.d.ts +8 -0
  75. package/dist/adapters/fx-profile.js +101 -0
  76. package/dist/adapters/fx-profile.js.map +1 -0
  77. package/dist/adapters/fx-rpc.d.ts +2 -0
  78. package/dist/adapters/fx-rpc.js +30 -4
  79. package/dist/adapters/fx-rpc.js.map +1 -1
  80. package/dist/adapters/fx-status.d.ts +2 -0
  81. package/dist/adapters/fx-status.js +96 -0
  82. package/dist/adapters/fx-status.js.map +1 -0
  83. package/dist/adapters/fx.js +77 -30
  84. package/dist/adapters/fx.js.map +1 -1
  85. package/dist/adapters/opencode-access.d.ts +13 -0
  86. package/dist/adapters/opencode-access.js +76 -0
  87. package/dist/adapters/opencode-access.js.map +1 -0
  88. package/dist/adapters/opencode-config.d.ts +11 -0
  89. package/dist/adapters/opencode-config.js +238 -0
  90. package/dist/adapters/opencode-config.js.map +1 -0
  91. package/dist/adapters/opencode-http.d.ts +28 -0
  92. package/dist/adapters/opencode-http.js +297 -0
  93. package/dist/adapters/opencode-http.js.map +1 -0
  94. package/dist/adapters/opencode-tools.d.ts +19 -0
  95. package/dist/adapters/opencode-tools.js +127 -0
  96. package/dist/adapters/opencode-tools.js.map +1 -0
  97. package/dist/adapters/opencode.d.ts +2 -0
  98. package/dist/adapters/opencode.js +569 -0
  99. package/dist/adapters/opencode.js.map +1 -0
  100. package/dist/adapters/rpc.d.ts +3 -0
  101. package/dist/adapters/rpc.js +45 -4
  102. package/dist/adapters/rpc.js.map +1 -1
  103. package/dist/adapters/types.d.ts +7 -0
  104. package/dist/adapters/types.js.map +1 -1
  105. package/dist/approvals/schema.d.ts +4 -0
  106. package/dist/approvals/schema.js +70 -0
  107. package/dist/approvals/schema.js.map +1 -0
  108. package/dist/approvals/types.d.ts +47 -0
  109. package/dist/approvals/types.js +2 -0
  110. package/dist/approvals/types.js.map +1 -0
  111. package/dist/cli/args.d.ts +3 -2
  112. package/dist/cli/args.js +24 -3
  113. package/dist/cli/args.js.map +1 -1
  114. package/dist/cli/dashboard-client.d.ts +5 -1
  115. package/dist/cli/dashboard-client.js +162 -15
  116. package/dist/cli/dashboard-client.js.map +1 -1
  117. package/dist/cli/dashboard-controller.d.ts +7 -0
  118. package/dist/cli/dashboard-controller.js +27 -0
  119. package/dist/cli/dashboard-controller.js.map +1 -0
  120. package/dist/cli/dashboard-detail-view.d.ts +16 -0
  121. package/dist/cli/dashboard-detail-view.js +162 -0
  122. package/dist/cli/dashboard-detail-view.js.map +1 -0
  123. package/dist/cli/dashboard-history-view.d.ts +29 -0
  124. package/dist/cli/dashboard-history-view.js +211 -0
  125. package/dist/cli/dashboard-history-view.js.map +1 -0
  126. package/dist/cli/dashboard-input.d.ts +14 -0
  127. package/dist/cli/dashboard-input.js +128 -0
  128. package/dist/cli/dashboard-input.js.map +1 -0
  129. package/dist/cli/dashboard-layout.d.ts +12 -1
  130. package/dist/cli/dashboard-layout.js +32 -30
  131. package/dist/cli/dashboard-layout.js.map +1 -1
  132. package/dist/cli/dashboard-renderer.d.ts +30 -2
  133. package/dist/cli/dashboard-renderer.js +125 -7
  134. package/dist/cli/dashboard-renderer.js.map +1 -1
  135. package/dist/cli/dashboard-style.d.ts +9 -0
  136. package/dist/cli/dashboard-style.js +36 -0
  137. package/dist/cli/dashboard-style.js.map +1 -0
  138. package/dist/cli/dashboard.d.ts +5 -3
  139. package/dist/cli/dashboard.js +102 -12
  140. package/dist/cli/dashboard.js.map +1 -1
  141. package/dist/cli/help.d.ts +1 -1
  142. package/dist/cli/help.js +37 -12
  143. package/dist/cli/help.js.map +1 -1
  144. package/dist/cli/input.d.ts +1 -0
  145. package/dist/cli/input.js +23 -17
  146. package/dist/cli/input.js.map +1 -1
  147. package/dist/cli/main.js +6 -2
  148. package/dist/cli/main.js.map +1 -1
  149. package/dist/cli/output.js +17 -1
  150. package/dist/cli/output.js.map +1 -1
  151. package/dist/config/access-provenance.d.ts +10 -0
  152. package/dist/config/access-provenance.js +31 -0
  153. package/dist/config/access-provenance.js.map +1 -0
  154. package/dist/config/access.d.ts +12 -2
  155. package/dist/config/access.js +125 -27
  156. package/dist/config/access.js.map +1 -1
  157. package/dist/config/loader.js +1 -0
  158. package/dist/config/loader.js.map +1 -1
  159. package/dist/config/oidc.js +4 -2
  160. package/dist/config/oidc.js.map +1 -1
  161. package/dist/config/project.js +2 -1
  162. package/dist/config/project.js.map +1 -1
  163. package/dist/config/resolve-access.js +24 -10
  164. package/dist/config/resolve-access.js.map +1 -1
  165. package/dist/index.d.ts +2 -2
  166. package/dist/index.js +1 -1
  167. package/dist/index.js.map +1 -1
  168. package/dist/process-diagnostics.d.ts +2 -0
  169. package/dist/process-diagnostics.js +11 -0
  170. package/dist/process-diagnostics.js.map +1 -0
  171. package/dist/runtime/access-errors.d.ts +4 -0
  172. package/dist/runtime/access-errors.js +25 -0
  173. package/dist/runtime/access-errors.js.map +1 -0
  174. package/dist/runtime/approval-registry.d.ts +27 -0
  175. package/dist/runtime/approval-registry.js +126 -0
  176. package/dist/runtime/approval-registry.js.map +1 -0
  177. package/dist/runtime/client.js +54 -14
  178. package/dist/runtime/client.js.map +1 -1
  179. package/dist/runtime/coordinator.d.ts +17 -1
  180. package/dist/runtime/coordinator.js +124 -6
  181. package/dist/runtime/coordinator.js.map +1 -1
  182. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  183. package/dist/runtime/dashboard-sanitize.js +7 -0
  184. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  185. package/dist/runtime/dashboard.d.ts +43 -1
  186. package/dist/runtime/dashboard.js +2 -3
  187. package/dist/runtime/dashboard.js.map +1 -1
  188. package/dist/runtime/definition.js +11 -1
  189. package/dist/runtime/definition.js.map +1 -1
  190. package/dist/runtime/select-native.d.ts +2 -1
  191. package/dist/runtime/select-native.js +28 -10
  192. package/dist/runtime/select-native.js.map +1 -1
  193. package/dist/runtime/service.js +24 -1
  194. package/dist/runtime/service.js.map +1 -1
  195. package/dist/runtime/types.d.ts +9 -1
  196. package/dist/runtime/types.js.map +1 -1
  197. package/dist/runtime/worker-approvals.d.ts +21 -0
  198. package/dist/runtime/worker-approvals.js +51 -0
  199. package/dist/runtime/worker-approvals.js.map +1 -0
  200. package/dist/runtime/worker-client.js +73 -20
  201. package/dist/runtime/worker-client.js.map +1 -1
  202. package/dist/runtime/worker-server.d.ts +2 -0
  203. package/dist/runtime/worker-server.js +39 -10
  204. package/dist/runtime/worker-server.js.map +1 -1
  205. package/dist/sdk/definitions.d.ts +4 -1
  206. package/dist/sdk/definitions.js +16 -2
  207. package/dist/sdk/definitions.js.map +1 -1
  208. package/dist/sdk/permission-validation.js +10 -1
  209. package/dist/sdk/permission-validation.js.map +1 -1
  210. package/dist/sdk/types.d.ts +29 -1
  211. package/dist/sdk/types.js.map +1 -1
  212. package/package.json +4 -1
  213. package/sdk/access-config.md +86 -4
  214. package/sdk/adapter-contract.md +7 -13
  215. package/sdk/additional-harnesses.md +43 -0
  216. package/sdk/agent-skill.md +7 -4
  217. package/sdk/agent.md +5 -3
  218. package/sdk/approvals.md +120 -0
  219. package/sdk/authentication.md +1 -1
  220. package/sdk/cli/dashboard-design.md +44 -4
  221. package/sdk/cli/dashboard-inspection.md +25 -0
  222. package/sdk/cli/index.md +20 -11
  223. package/sdk/cli/output.md +10 -4
  224. package/sdk/completion-notifications.md +2 -0
  225. package/sdk/config.md +1 -1
  226. package/sdk/copilot.md +53 -0
  227. package/sdk/cursor.md +68 -0
  228. package/sdk/diagnostics.md +29 -0
  229. package/sdk/distribution.md +53 -1
  230. package/sdk/evals.md +10 -4
  231. package/sdk/fx.md +51 -6
  232. package/sdk/harnesses.md +13 -13
  233. package/sdk/index.md +4 -2
  234. package/sdk/message-delivery.md +1 -1
  235. package/sdk/opencode.md +57 -0
  236. package/sdk/permissions.md +7 -5
  237. package/sdk/pr-integration.md +1 -1
  238. package/sdk/project-team.md +2 -0
  239. package/sdk/sessions.md +4 -1
  240. package/sdk/tools.md +1 -1
  241. package/sdk/v1-runtime.md +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { verifyFxPermissionMode } from \"./fx-permissions.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n if (options.harness.kind !== \"fx\") throw new AgentError(\"INVALID_CONFIG\", \"fx received configuration for a different harness.\");\n const env = fxEnvironment(options);\n const baseline = await fxSettingsFingerprint(env);\n await verifyFxAccess(options.cwd, env, options.access.type);\n await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== \"gateway\") {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized Gateway route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected Gateway model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.id !== undefined) {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
1
+ {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeApprovals } from \"./approval-lifetime.js\";\nimport { fxApproval } from \"./fx-approvals.js\";\nimport { AgentError } from \"../errors.js\";\nimport { fxAccessRoute, fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { verifyFxPermissionMode } from \"./fx-permissions.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n approvals: NativeApprovals;\n withdrawnApprovals: Set<string | number>;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n if (options.harness.kind !== \"fx\") throw new AgentError(\"INVALID_CONFIG\", \"fx received configuration for a different harness.\");\n const route = await fxAccessRoute(options);\n const baseline = route.settingsFingerprint ?? await fxSettingsFingerprint(options.env);\n const env = fxEnvironment(options, route);\n await verifyFxAccess(options.cwd, env, route, options.harness.model);\n await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during access verification. Start a new session.\");\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, route.provider, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, route.provider, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools, route.provider, selectedModel);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedProvider: string, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== requestedProvider) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n private readonly selectedProvider: string,\n private readonly selectedModel: string,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n active?.approvals.clear();\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.method === \"$/cancel_request\" && active && (typeof params?.requestId === \"string\" || typeof params?.requestId === \"number\")) {\n active.withdrawnApprovals.add(params.requestId);\n active.approvals.withdraw(params.requestId);\n return;\n }\n if (message.id !== undefined) {\n if (active && active.submitted && !active.terminal && !active.cancelRequested && !active.failure && params?.sessionId === this.sessionId\n && message.method === \"session/request_permission\" && this.options.onApproval) {\n try {\n const request = fxApproval(params);\n void active.approvals.request(message.id, request, this.options.onApproval).then(content => {\n if (this.active === active && !active.terminal && !active.cancelRequested && !active.failure && !active.withdrawnApprovals.has(message.id!)) {\n this.rpc.send({id:message.id,result:{outcome:{outcome:\"selected\",optionId:content.decision}}});\n }\n }).catch(error => {\n if (!(error instanceof AgentError && error.code === \"REQUEST_EXPIRED\")) this.unsupportedRequest(message, active);\n });\n return;\n } catch { /* Unsupported requests retain the explicit input failure path. */ }\n }\n this.unsupportedRequest(message, active);\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (message.method === \"session/update\" && params.update?.sessionUpdate === \"config_option_update\") {\n try { verifySelection(params.update.configOptions, this.selectedProvider, this.selectedModel, this.options.harness.effort); }\n catch (error) { this.rpc.abort(error as AgentError); }\n return;\n }\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private unsupportedRequest(message: AcpEnvelope, active: ActiveTurn | undefined): void {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n active.approvals.clear();\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.approvals.clear();\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { approvals: new NativeApprovals(), withdrawnApprovals: new Set(), text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n active.approvals.clear();\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n this.active.approvals.clear();\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { ResolvedAccess } from "./types.js";
2
+ export type OpencodeRoute = {
3
+ readonly kind: "gateway" | "direct" | "subscription";
4
+ readonly providerID: string;
5
+ readonly modelID: string;
6
+ readonly nativeModel: string;
7
+ readonly packages: readonly string[];
8
+ readonly unavailablePackages?: readonly string[];
9
+ readonly configPackage?: string;
10
+ readonly baseUrl?: string;
11
+ readonly oauthMarker?: string;
12
+ };
13
+ export declare function resolveOpencodeRoute(model: string, access: ResolvedAccess): OpencodeRoute;
@@ -0,0 +1,76 @@
1
+ import { AgentError } from "../errors.js";
2
+ const directPackages = {
3
+ anthropic: ["@ai-sdk/anthropic"],
4
+ openai: ["@ai-sdk/openai"],
5
+ google: ["@ai-sdk/google"],
6
+ groq: ["@ai-sdk/groq"],
7
+ openrouter: ["@openrouter/ai-sdk-provider"],
8
+ xai: ["@ai-sdk/xai"],
9
+ mistral: ["@ai-sdk/mistral"],
10
+ cohere: ["@ai-sdk/cohere", "@ai-sdk/openai-compatible"],
11
+ opencode: ["@ai-sdk/openai-compatible", "@ai-sdk/openai", "@ai-sdk/anthropic", "@ai-sdk/google"],
12
+ "opencode-go": ["@ai-sdk/openai-compatible", "@ai-sdk/openai", "@ai-sdk/anthropic"],
13
+ };
14
+ const subscriptionPackages = {
15
+ openai: ["@ai-sdk/openai"],
16
+ "github-copilot": ["@ai-sdk/github-copilot"],
17
+ xai: ["@ai-sdk/xai"],
18
+ };
19
+ export function resolveOpencodeRoute(model, access) {
20
+ if (typeof model !== "string" || !model.trim()) {
21
+ throw new AgentError("INVALID_CONFIG", "OpenCode model must be nonempty.");
22
+ }
23
+ if (access.type === "vercel-api-key" || access.type === "vercel-oidc") {
24
+ if (!access.token?.trim())
25
+ throw new AgentError("ACCESS_UNAVAILABLE", "The selected OpenCode Gateway credential is unavailable.");
26
+ return {
27
+ kind: "gateway",
28
+ providerID: "vercel",
29
+ modelID: model,
30
+ nativeModel: `vercel/${model}`,
31
+ packages: ["@ai-sdk/gateway"],
32
+ configPackage: "@ai-sdk/gateway",
33
+ };
34
+ }
35
+ const providerID = access.provider;
36
+ const separator = model.indexOf("/");
37
+ const modelProvider = separator > 0 ? model.slice(0, separator) : "";
38
+ const modelID = separator > 0 ? model.slice(separator + 1) : "";
39
+ if (!providerID || !modelID || modelProvider !== providerID) {
40
+ throw new AgentError("INVALID_CONFIG", "OpenCode model must be an exact provider/model ID matching the selected provider.");
41
+ }
42
+ if (access.type === "api-key") {
43
+ if (!(providerID in directPackages))
44
+ throw new AgentError("UNSUPPORTED_OPTION", "OpenCode does not support the selected direct API-key provider.");
45
+ if (!access.token?.trim())
46
+ throw new AgentError("ACCESS_UNAVAILABLE", "The selected OpenCode provider credential is unavailable.");
47
+ if (access.baseUrl !== undefined && !access.baseUrl.trim())
48
+ throw new AgentError("INVALID_CONFIG", "OpenCode baseUrl must be nonempty when supplied.");
49
+ const packages = directPackages[providerID];
50
+ return {
51
+ kind: "direct",
52
+ providerID,
53
+ modelID,
54
+ nativeModel: model,
55
+ packages,
56
+ ...(access.baseUrl === undefined ? {} : { baseUrl: access.baseUrl }),
57
+ };
58
+ }
59
+ if (access.type === "subscription") {
60
+ if (!(providerID in subscriptionPackages))
61
+ throw new AgentError("UNSUPPORTED_OPTION", "OpenCode does not support the selected native subscription provider.");
62
+ if (access.baseUrl !== undefined)
63
+ throw new AgentError("UNSUPPORTED_OPTION", "OpenCode subscription access does not support baseUrl.");
64
+ return {
65
+ kind: "subscription",
66
+ providerID,
67
+ modelID,
68
+ nativeModel: model,
69
+ packages: subscriptionPackages[providerID],
70
+ unavailablePackages: providerID === "github-copilot" ? ["@ai-sdk/openai-compatible"] : subscriptionPackages[providerID],
71
+ oauthMarker: providerID === "github-copilot" ? "" : "opencode-oauth-dummy-key",
72
+ };
73
+ }
74
+ throw new AgentError("UNSUPPORTED_OPTION", "OpenCode requires explicit Gateway, direct API-key, or supported native subscription access.");
75
+ }
76
+ //# sourceMappingURL=opencode-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-access.js","sourceRoot":"","sources":["../../src/adapters/opencode-access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,cAAc,GAAG;IACrB,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,IAAI,EAAE,CAAC,cAAc,CAAC;IACtB,UAAU,EAAE,CAAC,6BAA6B,CAAC;IAC3C,GAAG,EAAE,CAAC,aAAa,CAAC;IACpB,OAAO,EAAE,CAAC,iBAAiB,CAAC;IAC5B,MAAM,EAAE,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;IACvD,QAAQ,EAAE,CAAC,2BAA2B,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IAChG,aAAa,EAAE,CAAC,2BAA2B,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;CAC3E,CAAC;AAEX,MAAM,oBAAoB,GAAG;IAC3B,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,gBAAgB,EAAE,CAAC,wBAAwB,CAAC;IAC5C,GAAG,EAAE,CAAC,aAAa,CAAC;CACZ,CAAC;AAcX,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,MAAsB;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,0DAA0D,CAAC,CAAC;QAClI,OAAO;YACL,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,UAAU,KAAK,EAAE;YAC9B,QAAQ,EAAE,CAAC,iBAAiB,CAAC;YAC7B,aAAa,EAAE,iBAAiB;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;IACnC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,mFAAmF,CAAC,CAAC;IAC9H,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,UAAU,IAAI,cAAc,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,iEAAiE,CAAC,CAAC;QACnJ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,2DAA2D,CAAC,CAAC;QACnI,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,kDAAkD,CAAC,CAAC;QACvJ,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAyC,CAAC,CAAC;QAC3E,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,OAAO;YACP,WAAW,EAAE,KAAK;YAClB,QAAQ;YACR,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,UAAU,IAAI,oBAAoB,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,sEAAsE,CAAC,CAAC;QAC9J,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,wDAAwD,CAAC,CAAC;QACvI,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,UAAU;YACV,OAAO;YACP,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,oBAAoB,CAAC,UAA+C,CAAC;YAC/E,mBAAmB,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAA+C,CAAC;YAC5J,WAAW,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0BAA0B;SAC/E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,UAAU,CAAC,oBAAoB,EAAE,8FAA8F,CAAC,CAAC;AAC7I,CAAC","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport type { ResolvedAccess } from \"./types.js\";\n\nconst directPackages = {\n anthropic: [\"@ai-sdk/anthropic\"],\n openai: [\"@ai-sdk/openai\"],\n google: [\"@ai-sdk/google\"],\n groq: [\"@ai-sdk/groq\"],\n openrouter: [\"@openrouter/ai-sdk-provider\"],\n xai: [\"@ai-sdk/xai\"],\n mistral: [\"@ai-sdk/mistral\"],\n cohere: [\"@ai-sdk/cohere\", \"@ai-sdk/openai-compatible\"],\n opencode: [\"@ai-sdk/openai-compatible\", \"@ai-sdk/openai\", \"@ai-sdk/anthropic\", \"@ai-sdk/google\"],\n \"opencode-go\": [\"@ai-sdk/openai-compatible\", \"@ai-sdk/openai\", \"@ai-sdk/anthropic\"],\n} as const;\n\nconst subscriptionPackages = {\n openai: [\"@ai-sdk/openai\"],\n \"github-copilot\": [\"@ai-sdk/github-copilot\"],\n xai: [\"@ai-sdk/xai\"],\n} as const;\n\nexport type OpencodeRoute = {\n readonly kind: \"gateway\" | \"direct\" | \"subscription\";\n readonly providerID: string;\n readonly modelID: string;\n readonly nativeModel: string;\n readonly packages: readonly string[];\n readonly unavailablePackages?: readonly string[];\n readonly configPackage?: string;\n readonly baseUrl?: string;\n readonly oauthMarker?: string;\n};\n\nexport function resolveOpencodeRoute(model: string, access: ResolvedAccess): OpencodeRoute {\n if (typeof model !== \"string\" || !model.trim()) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode model must be nonempty.\");\n }\n if (access.type === \"vercel-api-key\" || access.type === \"vercel-oidc\") {\n if (!access.token?.trim()) throw new AgentError(\"ACCESS_UNAVAILABLE\", \"The selected OpenCode Gateway credential is unavailable.\");\n return {\n kind: \"gateway\",\n providerID: \"vercel\",\n modelID: model,\n nativeModel: `vercel/${model}`,\n packages: [\"@ai-sdk/gateway\"],\n configPackage: \"@ai-sdk/gateway\",\n };\n }\n\n const providerID = access.provider;\n const separator = model.indexOf(\"/\");\n const modelProvider = separator > 0 ? model.slice(0, separator) : \"\";\n const modelID = separator > 0 ? model.slice(separator + 1) : \"\";\n if (!providerID || !modelID || modelProvider !== providerID) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode model must be an exact provider/model ID matching the selected provider.\");\n }\n\n if (access.type === \"api-key\") {\n if (!(providerID in directPackages)) throw new AgentError(\"UNSUPPORTED_OPTION\", \"OpenCode does not support the selected direct API-key provider.\");\n if (!access.token?.trim()) throw new AgentError(\"ACCESS_UNAVAILABLE\", \"The selected OpenCode provider credential is unavailable.\");\n if (access.baseUrl !== undefined && !access.baseUrl.trim()) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode baseUrl must be nonempty when supplied.\");\n const packages = directPackages[providerID as keyof typeof directPackages];\n return {\n kind: \"direct\",\n providerID,\n modelID,\n nativeModel: model,\n packages,\n ...(access.baseUrl === undefined ? {} : { baseUrl: access.baseUrl }),\n };\n }\n\n if (access.type === \"subscription\") {\n if (!(providerID in subscriptionPackages)) throw new AgentError(\"UNSUPPORTED_OPTION\", \"OpenCode does not support the selected native subscription provider.\");\n if (access.baseUrl !== undefined) throw new AgentError(\"UNSUPPORTED_OPTION\", \"OpenCode subscription access does not support baseUrl.\");\n return {\n kind: \"subscription\",\n providerID,\n modelID,\n nativeModel: model,\n packages: subscriptionPackages[providerID as keyof typeof subscriptionPackages],\n unavailablePackages: providerID === \"github-copilot\" ? [\"@ai-sdk/openai-compatible\"] : subscriptionPackages[providerID as keyof typeof subscriptionPackages],\n oauthMarker: providerID === \"github-copilot\" ? \"\" : \"opencode-oauth-dummy-key\",\n };\n }\n\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"OpenCode requires explicit Gateway, direct API-key, or supported native subscription access.\");\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { OpencodeRoute } from "./opencode-access.js";
2
+ import type { AdapterOptions } from "./types.js";
3
+ export declare const gatewayBaseUrl = "https://ai-gateway.vercel.sh/v3/ai";
4
+ export interface OpencodeRuntime {
5
+ readonly directory: string;
6
+ readonly configFile: string;
7
+ readonly config: Record<string, unknown>;
8
+ readonly env: NodeJS.ProcessEnv;
9
+ close(): Promise<void>;
10
+ }
11
+ export declare function createOpencodeRuntime(options: AdapterOptions, route: OpencodeRoute): Promise<OpencodeRuntime>;
@@ -0,0 +1,238 @@
1
+ import { mkdir, mkdtemp, readdir, realpath, rm, stat, writeFile } from "node:fs/promises";
2
+ import { homedir, tmpdir, userInfo } from "node:os";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { AgentError } from "../errors.js";
5
+ export const gatewayBaseUrl = "https://ai-gateway.vercel.sh/v3/ai";
6
+ export async function createOpencodeRuntime(options, route) {
7
+ await assertNoResidualConfiguration(options.env);
8
+ const instructions = await repositoryInstructions(options.cwd);
9
+ const directory = await mkdtemp(join(tmpdir(), "subharness-opencode-"));
10
+ const privateDirectories = [
11
+ mkdir(join(directory, "config"), { recursive: true, mode: 0o700 }),
12
+ mkdir(join(directory, "state"), { recursive: true, mode: 0o700 }),
13
+ mkdir(join(directory, "cache"), { recursive: true, mode: 0o700 }),
14
+ ];
15
+ if (route.kind !== "subscription")
16
+ privateDirectories.push(mkdir(join(directory, "data"), { recursive: true, mode: 0o700 }));
17
+ await Promise.all(privateDirectories);
18
+ const configFile = join(directory, "opencode.json");
19
+ const provider = providerConfiguration(options, route);
20
+ const config = {
21
+ $schema: "https://opencode.ai/config.json",
22
+ enabled_providers: [route.providerID],
23
+ model: route.nativeModel,
24
+ small_model: route.nativeModel,
25
+ ...(provider === undefined ? {} : { provider: { [route.providerID]: provider } }),
26
+ permission: { "*": "ask" },
27
+ plugin: [],
28
+ share: "disabled",
29
+ autoupdate: false,
30
+ lsp: false,
31
+ formatter: false,
32
+ ...(instructions.length === 0 ? {} : { instructions }),
33
+ };
34
+ await writeFile(configFile, JSON.stringify(config), { mode: 0o600, flag: "wx" });
35
+ const env = isolatedEnvironment(options.env);
36
+ env.XDG_CONFIG_HOME = join(directory, "config");
37
+ if (route.kind !== "subscription")
38
+ env.XDG_DATA_HOME = join(directory, "data");
39
+ env.XDG_STATE_HOME = join(directory, "state");
40
+ env.XDG_CACHE_HOME = join(directory, "cache");
41
+ env.OPENCODE_CONFIG = configFile;
42
+ if (route.kind !== "subscription")
43
+ env.OPENCODE_AUTH_CONTENT = "{}";
44
+ env.OPENCODE_SERVER_USERNAME = "opencode";
45
+ env.OPENCODE_DISABLE_AUTOUPDATE = "1";
46
+ env.OPENCODE_DISABLE_MODELS_FETCH = "1";
47
+ env.OPENCODE_DISABLE_PROJECT_CONFIG = "1";
48
+ if (route.kind !== "subscription")
49
+ env.OPENCODE_DISABLE_DEFAULT_PLUGINS = "1";
50
+ env.OPENCODE_DISABLE_LSP_DOWNLOAD = "1";
51
+ env.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT = "1";
52
+ env.OPENCODE_PURE = "1";
53
+ if (options.access.type === "vercel-oidc")
54
+ env.VERCEL_OIDC_TOKEN = options.access.token;
55
+ for (const name of providerCredentialEnvironment(route.providerID))
56
+ delete env[name];
57
+ let closed = false;
58
+ return {
59
+ directory,
60
+ configFile,
61
+ config,
62
+ env,
63
+ async close() {
64
+ if (closed)
65
+ return;
66
+ closed = true;
67
+ await rm(directory, { recursive: true, force: true });
68
+ },
69
+ };
70
+ }
71
+ function providerConfiguration(options, route) {
72
+ if (route.kind === "subscription")
73
+ return undefined;
74
+ const providerOptions = {};
75
+ if (route.kind === "gateway") {
76
+ providerOptions.baseURL = gatewayBaseUrl;
77
+ if (options.access.type === "vercel-api-key")
78
+ providerOptions.apiKey = options.access.token;
79
+ }
80
+ else {
81
+ providerOptions.apiKey = options.access.token;
82
+ if (route.baseUrl !== undefined)
83
+ providerOptions.baseURL = route.baseUrl;
84
+ }
85
+ return {
86
+ ...(route.configPackage === undefined ? {} : { npm: route.configPackage }),
87
+ env: [],
88
+ options: providerOptions,
89
+ };
90
+ }
91
+ function providerCredentialEnvironment(provider) {
92
+ switch (provider) {
93
+ case "anthropic": return ["ANTHROPIC_API_KEY"];
94
+ case "openai": return ["OPENAI_API_KEY"];
95
+ case "google": return ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"];
96
+ case "groq": return ["GROQ_API_KEY"];
97
+ case "openrouter": return ["OPENROUTER_API_KEY"];
98
+ case "xai": return ["XAI_API_KEY"];
99
+ case "mistral": return ["MISTRAL_API_KEY"];
100
+ case "cohere": return ["COHERE_API_KEY"];
101
+ case "opencode":
102
+ case "opencode-go": return ["OPENCODE_API_KEY"];
103
+ case "github-copilot": return ["GITHUB_TOKEN"];
104
+ default: return [];
105
+ }
106
+ }
107
+ function isolatedEnvironment(source) {
108
+ const env = { ...source };
109
+ for (const key of Object.keys(env)) {
110
+ if (key.startsWith("OPENCODE_") || key === "AI_GATEWAY_API_KEY" || key === "VERCEL_OIDC_TOKEN")
111
+ delete env[key];
112
+ }
113
+ return env;
114
+ }
115
+ async function assertNoResidualConfiguration(env) {
116
+ const home = env.HOME || homedir();
117
+ if (await hasHomeConfiguration(join(home, ".opencode")))
118
+ incompatible();
119
+ const managed = process.platform === "darwin"
120
+ ? "/Library/Application Support/opencode"
121
+ : process.platform === "win32"
122
+ ? join(env.ProgramData || "C:\\ProgramData", "opencode")
123
+ : "/etc/opencode";
124
+ for (const name of ["opencode.json", "opencode.jsonc"]) {
125
+ if (await exists(join(managed, name)))
126
+ incompatible();
127
+ }
128
+ if (process.platform === "darwin") {
129
+ let user = "user";
130
+ try {
131
+ user = userInfo().username || user;
132
+ }
133
+ catch { /* OpenCode uses the same fallback. */ }
134
+ for (const file of [
135
+ join("/Library/Managed Preferences", user, "ai.opencode.managed.plist"),
136
+ "/Library/Managed Preferences/ai.opencode.managed.plist",
137
+ ])
138
+ if (await exists(file))
139
+ incompatible();
140
+ }
141
+ }
142
+ async function hasHomeConfiguration(path) {
143
+ for (const name of ["opencode.json", "opencode.jsonc"])
144
+ if (await exists(join(path, name)))
145
+ return true;
146
+ for (const name of ["command", "commands", "agent", "agents"]) {
147
+ if (await containsMatchingFile(join(path, name), filename => filename.endsWith(".md"), true))
148
+ return true;
149
+ }
150
+ for (const name of ["mode", "modes"]) {
151
+ if (await containsMatchingFile(join(path, name), filename => filename.endsWith(".md"), false))
152
+ return true;
153
+ }
154
+ for (const name of ["plugin", "plugins"]) {
155
+ if (await containsMatchingFile(join(path, name), filename => filename.endsWith(".ts") || filename.endsWith(".js"), false))
156
+ return true;
157
+ }
158
+ return false;
159
+ }
160
+ async function containsMatchingFile(path, matches, recursive, visited = new Set()) {
161
+ let entries;
162
+ try {
163
+ entries = await readdir(path, { withFileTypes: true });
164
+ }
165
+ catch (error) {
166
+ if (error.code === "ENOENT")
167
+ return false;
168
+ throw new AgentError("INVALID_CONFIG", "OpenCode residual home configuration could not be verified before startup.");
169
+ }
170
+ const canonical = await realpath(path).catch(() => resolve(path));
171
+ if (visited.has(canonical))
172
+ return false;
173
+ visited.add(canonical);
174
+ for (const entry of entries) {
175
+ const item = join(path, entry.name);
176
+ let kind = entry;
177
+ if (entry.isSymbolicLink()) {
178
+ try {
179
+ kind = await stat(item);
180
+ }
181
+ catch (error) {
182
+ if (error.code === "ENOENT")
183
+ continue;
184
+ throw new AgentError("INVALID_CONFIG", "OpenCode residual home configuration could not be verified before startup.");
185
+ }
186
+ }
187
+ if (kind.isFile() && matches(entry.name))
188
+ return true;
189
+ if (recursive && kind.isDirectory() && await containsMatchingFile(item, matches, true, visited))
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ async function exists(path) {
195
+ try {
196
+ await stat(path);
197
+ return true;
198
+ }
199
+ catch (error) {
200
+ if (error.code === "ENOENT")
201
+ return false;
202
+ throw new AgentError("INVALID_CONFIG", "OpenCode machine-managed configuration could not be verified before startup.");
203
+ }
204
+ }
205
+ function incompatible() {
206
+ throw new AgentError("INVALID_CONFIG", "OpenCode residual home or machine-managed configuration is incompatible with the isolated native profile.");
207
+ }
208
+ async function repositoryInstructions(cwd) {
209
+ const start = await realpath(cwd).catch(() => resolve(cwd));
210
+ const root = await nearestWorktree(start);
211
+ const directories = [];
212
+ for (let current = start;; current = dirname(current)) {
213
+ directories.push(current);
214
+ if (current === (root ?? start))
215
+ break;
216
+ }
217
+ for (const filename of ["AGENTS.md", "CLAUDE.md", "CONTEXT.md"]) {
218
+ const matches = [];
219
+ for (const directory of directories) {
220
+ const file = join(directory, filename);
221
+ if (await exists(file))
222
+ matches.push(file);
223
+ }
224
+ if (matches.length > 0)
225
+ return matches;
226
+ }
227
+ return [];
228
+ }
229
+ async function nearestWorktree(start) {
230
+ for (let current = start;; current = dirname(current)) {
231
+ if (await exists(join(current, ".git")))
232
+ return current;
233
+ const parent = dirname(current);
234
+ if (parent === current)
235
+ return undefined;
236
+ }
237
+ }
238
+ //# sourceMappingURL=opencode-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/adapters/opencode-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, mkdtemp, readdir, realpath, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir, tmpdir, userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { AgentError } from \"../errors.js\";\nimport type { OpencodeRoute } from \"./opencode-access.js\";\nimport type { AdapterOptions } from \"./types.js\";\n\nexport const gatewayBaseUrl = \"https://ai-gateway.vercel.sh/v3/ai\";\n\nexport interface OpencodeRuntime {\n readonly directory: string;\n readonly configFile: string;\n readonly config: Record<string, unknown>;\n readonly env: NodeJS.ProcessEnv;\n close(): Promise<void>;\n}\n\nexport async function createOpencodeRuntime(options: AdapterOptions, route: OpencodeRoute): Promise<OpencodeRuntime> {\n await assertNoResidualConfiguration(options.env);\n const instructions = await repositoryInstructions(options.cwd);\n const directory = await mkdtemp(join(tmpdir(), \"subharness-opencode-\"));\n const privateDirectories = [\n mkdir(join(directory, \"config\"), { recursive: true, mode: 0o700 }),\n mkdir(join(directory, \"state\"), { recursive: true, mode: 0o700 }),\n mkdir(join(directory, \"cache\"), { recursive: true, mode: 0o700 }),\n ];\n if (route.kind !== \"subscription\") privateDirectories.push(mkdir(join(directory, \"data\"), { recursive: true, mode: 0o700 }));\n await Promise.all(privateDirectories);\n const configFile = join(directory, \"opencode.json\");\n const provider = providerConfiguration(options, route);\n const config = {\n $schema: \"https://opencode.ai/config.json\",\n enabled_providers: [route.providerID],\n model: route.nativeModel,\n small_model: route.nativeModel,\n ...(provider === undefined ? {} : { provider: { [route.providerID]: provider } }),\n permission: { \"*\": \"ask\" },\n plugin: [],\n share: \"disabled\",\n autoupdate: false,\n lsp: false,\n formatter: false,\n ...(instructions.length === 0 ? {} : { instructions }),\n };\n await writeFile(configFile, JSON.stringify(config), { mode: 0o600, flag: \"wx\" });\n\n const env = isolatedEnvironment(options.env);\n env.XDG_CONFIG_HOME = join(directory, \"config\");\n if (route.kind !== \"subscription\") env.XDG_DATA_HOME = join(directory, \"data\");\n env.XDG_STATE_HOME = join(directory, \"state\");\n env.XDG_CACHE_HOME = join(directory, \"cache\");\n env.OPENCODE_CONFIG = configFile;\n if (route.kind !== \"subscription\") env.OPENCODE_AUTH_CONTENT = \"{}\";\n env.OPENCODE_SERVER_USERNAME = \"opencode\";\n env.OPENCODE_DISABLE_AUTOUPDATE = \"1\";\n env.OPENCODE_DISABLE_MODELS_FETCH = \"1\";\n env.OPENCODE_DISABLE_PROJECT_CONFIG = \"1\";\n if (route.kind !== \"subscription\") env.OPENCODE_DISABLE_DEFAULT_PLUGINS = \"1\";\n env.OPENCODE_DISABLE_LSP_DOWNLOAD = \"1\";\n env.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT = \"1\";\n env.OPENCODE_PURE = \"1\";\n if (options.access.type === \"vercel-oidc\") env.VERCEL_OIDC_TOKEN = options.access.token;\n for (const name of providerCredentialEnvironment(route.providerID)) delete env[name];\n\n let closed = false;\n return {\n directory,\n configFile,\n config,\n env,\n async close() {\n if (closed) return;\n closed = true;\n await rm(directory, { recursive: true, force: true });\n },\n };\n}\n\nfunction providerConfiguration(options: AdapterOptions, route: OpencodeRoute): Record<string, unknown> | undefined {\n if (route.kind === \"subscription\") return undefined;\n const providerOptions: Record<string, string> = {};\n if (route.kind === \"gateway\") {\n providerOptions.baseURL = gatewayBaseUrl;\n if (options.access.type === \"vercel-api-key\") providerOptions.apiKey = options.access.token!;\n } else {\n providerOptions.apiKey = options.access.token!;\n if (route.baseUrl !== undefined) providerOptions.baseURL = route.baseUrl;\n }\n return {\n ...(route.configPackage === undefined ? {} : { npm: route.configPackage }),\n env: [],\n options: providerOptions,\n };\n}\n\nfunction providerCredentialEnvironment(provider: string): string[] {\n switch (provider) {\n case \"anthropic\": return [\"ANTHROPIC_API_KEY\"];\n case \"openai\": return [\"OPENAI_API_KEY\"];\n case \"google\": return [\"GOOGLE_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\", \"GEMINI_API_KEY\"];\n case \"groq\": return [\"GROQ_API_KEY\"];\n case \"openrouter\": return [\"OPENROUTER_API_KEY\"];\n case \"xai\": return [\"XAI_API_KEY\"];\n case \"mistral\": return [\"MISTRAL_API_KEY\"];\n case \"cohere\": return [\"COHERE_API_KEY\"];\n case \"opencode\":\n case \"opencode-go\": return [\"OPENCODE_API_KEY\"];\n case \"github-copilot\": return [\"GITHUB_TOKEN\"];\n default: return [];\n }\n}\n\nfunction isolatedEnvironment(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const env = { ...source };\n for (const key of Object.keys(env)) {\n if (key.startsWith(\"OPENCODE_\") || key === \"AI_GATEWAY_API_KEY\" || key === \"VERCEL_OIDC_TOKEN\") delete env[key];\n }\n return env;\n}\n\nasync function assertNoResidualConfiguration(env: NodeJS.ProcessEnv): Promise<void> {\n const home = env.HOME || homedir();\n if (await hasHomeConfiguration(join(home, \".opencode\"))) incompatible();\n\n const managed = process.platform === \"darwin\"\n ? \"/Library/Application Support/opencode\"\n : process.platform === \"win32\"\n ? join(env.ProgramData || \"C:\\\\ProgramData\", \"opencode\")\n : \"/etc/opencode\";\n for (const name of [\"opencode.json\", \"opencode.jsonc\"]) {\n if (await exists(join(managed, name))) incompatible();\n }\n if (process.platform === \"darwin\") {\n let user = \"user\";\n try { user = userInfo().username || user; } catch { /* OpenCode uses the same fallback. */ }\n for (const file of [\n join(\"/Library/Managed Preferences\", user, \"ai.opencode.managed.plist\"),\n \"/Library/Managed Preferences/ai.opencode.managed.plist\",\n ]) if (await exists(file)) incompatible();\n }\n}\n\nasync function hasHomeConfiguration(path: string): Promise<boolean> {\n for (const name of [\"opencode.json\", \"opencode.jsonc\"]) if (await exists(join(path, name))) return true;\n for (const name of [\"command\", \"commands\", \"agent\", \"agents\"]) {\n if (await containsMatchingFile(join(path, name), filename => filename.endsWith(\".md\"), true)) return true;\n }\n for (const name of [\"mode\", \"modes\"]) {\n if (await containsMatchingFile(join(path, name), filename => filename.endsWith(\".md\"), false)) return true;\n }\n for (const name of [\"plugin\", \"plugins\"]) {\n if (await containsMatchingFile(join(path, name), filename => filename.endsWith(\".ts\") || filename.endsWith(\".js\"), false)) return true;\n }\n return false;\n}\n\nasync function containsMatchingFile(\n path: string,\n matches: (filename: string) => boolean,\n recursive: boolean,\n visited = new Set<string>(),\n): Promise<boolean> {\n let entries;\n try { entries = await readdir(path, { withFileTypes: true }); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode residual home configuration could not be verified before startup.\");\n }\n const canonical = await realpath(path).catch(() => resolve(path));\n if (visited.has(canonical)) return false;\n visited.add(canonical);\n for (const entry of entries) {\n const item = join(path, entry.name);\n let kind = entry;\n if (entry.isSymbolicLink()) {\n try { kind = await stat(item) as unknown as typeof entry; }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode residual home configuration could not be verified before startup.\");\n }\n }\n if (kind.isFile() && matches(entry.name)) return true;\n if (recursive && kind.isDirectory() && await containsMatchingFile(item, matches, true, visited)) return true;\n }\n return false;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try { await stat(path); return true; }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode machine-managed configuration could not be verified before startup.\");\n }\n}\n\nfunction incompatible(): never {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode residual home or machine-managed configuration is incompatible with the isolated native profile.\");\n}\n\nasync function repositoryInstructions(cwd: string): Promise<string[]> {\n const start = await realpath(cwd).catch(() => resolve(cwd));\n const root = await nearestWorktree(start);\n const directories: string[] = [];\n for (let current = start;; current = dirname(current)) {\n directories.push(current);\n if (current === (root ?? start)) break;\n }\n for (const filename of [\"AGENTS.md\", \"CLAUDE.md\", \"CONTEXT.md\"]) {\n const matches: string[] = [];\n for (const directory of directories) {\n const file = join(directory, filename);\n if (await exists(file)) matches.push(file);\n }\n if (matches.length > 0) return matches;\n }\n return [];\n}\n\nasync function nearestWorktree(start: string): Promise<string | undefined> {\n for (let current = start;; current = dirname(current)) {\n if (await exists(join(current, \".git\"))) return current;\n const parent = dirname(current);\n if (parent === current) return undefined;\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { type ChildProcessByStdio } from "node:child_process";
2
+ import type { Readable } from "node:stream";
3
+ export declare const supportedOpencodeVersion = "1.18.32";
4
+ type OpencodeChild = ChildProcessByStdio<null, Readable, Readable>;
5
+ export interface OpencodeProcess {
6
+ readonly url: string;
7
+ readonly child: OpencodeChild;
8
+ readonly exited: Promise<{
9
+ code: number | null;
10
+ signal: NodeJS.Signals | null;
11
+ }>;
12
+ close(): Promise<void>;
13
+ }
14
+ export declare function startOpencodeProcess(cwd: string, env: NodeJS.ProcessEnv): Promise<OpencodeProcess>;
15
+ export declare class OpencodeHttp {
16
+ #private;
17
+ readonly baseUrl: string;
18
+ readonly directory: string;
19
+ constructor(baseUrl: string, directory: string, password: string);
20
+ json(path: string, init?: {
21
+ method?: string;
22
+ body?: unknown;
23
+ signal?: AbortSignal;
24
+ timeout?: number | false;
25
+ }): Promise<unknown>;
26
+ events(signal: AbortSignal, consume: (event: unknown) => void, ready?: () => void): Promise<void>;
27
+ }
28
+ export {};