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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/adapters/opencode.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { realpath } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { NativeApprovalRequest } from \"../approvals/types.js\";\nimport { AgentError } from \"../errors.js\";\nimport { NativeApprovals } from \"./approval-lifetime.js\";\nimport { resolveOpencodeRoute, type OpencodeRoute } from \"./opencode-access.js\";\nimport { createOpencodeRuntime, gatewayBaseUrl } from \"./opencode-config.js\";\nimport { OpencodeHttp, startOpencodeProcess, supportedOpencodeVersion } from \"./opencode-http.js\";\nimport { startOpencodeTools } from \"./opencode-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype OpencodeHarness = { readonly kind: \"opencode\"; readonly model: string };\ntype Json = Record<string, any>;\ninterface ActiveTurn {\n completion: Promise<string>;\n readonly lifecycle: AbortController;\n interrupted: boolean;\n closing: boolean;\n settled: boolean;\n failure?: AgentError;\n}\n\nexport async function openOpencode(options: AdapterOptions): Promise<NativeSession> {\n const harness = options.harness as OpencodeHarness;\n if (harness.kind !== \"opencode\") throw new AgentError(\"INVALID_CONFIG\", \"OpenCode received configuration for a different harness.\");\n const model = harness.model;\n const route = resolveOpencodeRoute(model, options.access);\n\n const cwd = await realpath(options.cwd).catch(() => resolve(options.cwd));\n const runtime = await createOpencodeRuntime(options, route);\n const tools = await startOpencodeTools(options.agent).catch(async error => { await runtime.close(); throw error; });\n const password = randomBytes(32).toString(\"base64url\");\n runtime.env.OPENCODE_SERVER_PASSWORD = password;\n let native: Awaited<ReturnType<typeof startOpencodeProcess>> | undefined;\n let eventController: AbortController | undefined;\n let sessionID: string | undefined;\n try {\n native = await startOpencodeProcess(cwd, runtime.env);\n const http = new OpencodeHttp(native.url, cwd, password);\n await verifyStartup(http, runtime.config, options, route);\n const approvals = new NativeApprovals();\n const pendingApprovals = new Set<string>();\n const approvalTasks = new Set<Promise<void>>();\n let active: ActiveTurn | undefined;\n let closed = false;\n let first = true;\n let closing: Promise<void> | undefined;\n let fatalEventError: AgentError | undefined;\n\n const abortNative = async () => {\n if (!sessionID) return;\n await http.json(`/session/${encodeURIComponent(sessionID)}/abort`, { method: \"POST\", timeout: 1_000 }).catch(() => {});\n };\n const fail = (error: AgentError) => {\n const current = active;\n if (!current) { fatalEventError ??= error; return; }\n current.failure ??= error;\n tools.stopAdmission();\n current.lifecycle.abort();\n approvals.clear();\n void abortNative();\n };\n const pendingNativePermissions = async (): Promise<Set<string>> => {\n const value = await http.json(\"/permission\");\n if (!Array.isArray(value)) protocol(\"OpenCode returned malformed native permission data.\");\n const result = new Set<string>();\n for (const item of value) {\n const id = string(record(item).id);\n if (!id) protocol(\"OpenCode returned malformed native permission data.\");\n result.add(id);\n }\n return result;\n };\n const reconcilePermissions = async () => {\n const nativePending = await pendingNativePermissions();\n for (const id of [...pendingApprovals]) {\n if (nativePending.has(id)) continue;\n pendingApprovals.delete(id);\n approvals.withdraw(id);\n }\n };\n const replyPermission = async (id: string, decision: \"once\" | \"reject\") => {\n const nativePending = await pendingNativePermissions();\n if (!nativePending.has(id)) {\n pendingApprovals.delete(id);\n approvals.withdraw(id);\n return;\n }\n await http.json(`/permission/${encodeURIComponent(id)}/reply`, { body: { reply: decision } });\n pendingApprovals.delete(id);\n approvals.withdraw(id);\n if (decision === \"reject\") await reconcilePermissions();\n };\n const handlePermission = (input: unknown) => {\n const task = (async () => {\n const request = record(input);\n const id = string(request.id);\n const nativeSession = string(request.sessionID);\n const permission = string(request.permission);\n if (!id || !nativeSession || !permission || !strings(request.patterns) || !strings(request.always)\n || !record(request.metadata, true)) {\n fail(new AgentError(\"INPUT_REQUIRED\", \"OpenCode returned an unsupported native permission request.\"));\n return;\n }\n const current = active;\n if (!current) {\n fatalEventError ??= new AgentError(\"INPUT_REQUIRED\", \"OpenCode requested permission during startup.\");\n await http.json(`/permission/${encodeURIComponent(id)}/reply`, { body: { reply: \"reject\" } }).catch(() => {});\n return;\n }\n if (!options.onApproval) {\n fail(new AgentError(\"INPUT_REQUIRED\", \"OpenCode requested permission but no approval handler is available.\"));\n await replyPermission(id, \"reject\").catch(() => {});\n return;\n }\n const context = {\n permission,\n patterns: [...request.patterns],\n metadata: request.metadata,\n always: [...request.always],\n ...(request.tool === undefined ? {} : { tool: request.tool }),\n };\n const approval: NativeApprovalRequest = {\n kind: \"permission\",\n harness: \"opencode\",\n message: permissionMessage(permission, request.patterns),\n requestedSchema: {\n type: \"object\",\n properties: {\n decision: { type: \"string\", oneOf: [\n { const: \"once\", title: \"Allow once\" },\n { const: \"reject\", title: \"Deny\" },\n ] },\n },\n required: [\"decision\"],\n additionalProperties: false,\n },\n context,\n };\n pendingApprovals.add(id);\n try {\n const answer = await approvals.request(id, approval, options.onApproval, current.lifecycle.signal);\n if (answer.decision !== \"once\" && answer.decision !== \"reject\") {\n throw new AgentError(\"INVALID_APPROVAL_RESPONSE\", \"The approval response does not match the requested schema.\");\n }\n await replyPermission(id, answer.decision);\n } catch (error) {\n if (error instanceof AgentError && error.code === \"REQUEST_EXPIRED\") return;\n const safe = error instanceof AgentError\n ? error\n : new AgentError(\"INPUT_REQUIRED\", \"The OpenCode permission response could not be completed.\");\n fail(safe);\n await replyPermission(id, \"reject\").catch(() => {});\n } finally {\n pendingApprovals.delete(id);\n }\n })();\n approvalTasks.add(task);\n void task.then(\n () => approvalTasks.delete(task),\n error => {\n approvalTasks.delete(task);\n fail(error instanceof AgentError ? error : new AgentError(\"PROTOCOL_ERROR\", \"OpenCode returned malformed native permission data.\"));\n },\n );\n };\n const handleEvent = (value: unknown) => {\n const event = record(value);\n if (event.type === \"permission.asked\") { handlePermission(event.properties); return; }\n if (event.type === \"permission.replied\") {\n const properties = record(event.properties);\n const id = string(properties.requestID);\n if (!id) { fail(new AgentError(\"PROTOCOL_ERROR\", \"OpenCode returned malformed native permission settlement data.\")); return; }\n pendingApprovals.delete(id);\n approvals.withdraw(id);\n if (properties.reply === \"reject\") void reconcilePermissions().catch(() => {});\n return;\n }\n if (event.type === \"question.asked\") {\n fail(new AgentError(\"INPUT_REQUIRED\", \"OpenCode requested unsupported interactive input.\"));\n return;\n }\n if (event.type === \"session.error\") {\n const properties = record(event.properties);\n if (properties.sessionID === undefined || properties.sessionID === sessionID) {\n fail(new AgentError(\"HARNESS_ERROR\", \"OpenCode reported a native execution error.\"));\n }\n }\n };\n\n eventController = new AbortController();\n let eventReady!: () => void;\n const eventEstablished = new Promise<void>(resolveReady => { eventReady = resolveReady; });\n const eventTask = http.events(eventController.signal, handleEvent, eventReady).catch(error => {\n if (!eventController!.signal.aborted) fail(error instanceof AgentError ? error : new AgentError(\"PROTOCOL_ERROR\", \"The OpenCode native event stream failed.\"));\n });\n await Promise.race([\n eventEstablished,\n eventTask.then(() => { throw fatalEventError ?? new AgentError(\"PROTOCOL_ERROR\", \"OpenCode could not establish its native event stream.\"); }),\n ]);\n if (fatalEventError) throw fatalEventError;\n\n if (tools.descriptor) {\n const added = record(await http.json(\"/mcp\", { body: tools.descriptor }));\n if (record(added[tools.descriptor.name], true)?.status !== \"connected\") {\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"OpenCode could not connect the private MCP tool endpoint.\");\n }\n const status = record(await http.json(\"/mcp\"));\n if (record(status[tools.descriptor.name], true)?.status !== \"connected\") {\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"OpenCode did not retain the private MCP tool connection.\");\n }\n }\n\n const created = record(await http.json(\"/session\", { body: { title: \"Subharness\", model: { providerID: route.providerID, id: route.modelID } } }));\n sessionID = string(created.id);\n if (!sessionID || !samePath(string(created.directory), cwd)\n || !selection(created.model, \"id\", route)) protocol(\"OpenCode returned malformed native session data.\");\n if (fatalEventError) throw fatalEventError;\n tools.onFailure(fail);\n\n const session: NativeSession = {\n async turn(prompt) {\n if (closed) throw new AgentError(\"SESSION_CLOSED\", \"The OpenCode session has closed.\");\n if (fatalEventError) throw fatalEventError;\n if (active) throw new AgentError(\"SESSION_BUSY\", \"OpenCode already has an active turn.\");\n const includeInstructions = first && Boolean(options.agent.instructions);\n const current: ActiveTurn = {\n completion: undefined as unknown as Promise<string>,\n lifecycle: new AbortController(),\n interrupted: false,\n closing: false,\n settled: false,\n };\n active = current;\n current.completion = (async () => {\n tools.beginTurn();\n try {\n const response = await http.json(`/session/${encodeURIComponent(sessionID!)}/message`, {\n timeout: false,\n body: {\n model: { providerID: route.providerID, modelID: route.modelID },\n parts: [{ type: \"text\", text: prompt }],\n ...(includeInstructions ? { system: options.agent.instructions } : {}),\n },\n });\n first = false;\n if (current.closing) throw new AgentError(\"SESSION_CLOSED\", \"The OpenCode session closed during the turn.\");\n if (current.interrupted) throw new AgentError(\"INTERRUPTED\", \"The OpenCode turn was interrupted.\");\n if (current.failure) throw current.failure;\n return terminalText(response, sessionID!, route);\n } catch (error) {\n if (current.closing) throw new AgentError(\"SESSION_CLOSED\", \"The OpenCode session closed during the turn.\");\n if (current.interrupted) throw new AgentError(\"INTERRUPTED\", \"The OpenCode turn was interrupted.\");\n if (current.failure) throw current.failure;\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_ERROR\", \"OpenCode could not complete the native turn.\");\n } finally {\n current.settled = true;\n current.lifecycle.abort();\n approvals.clear();\n tools.stopAdmission();\n await Promise.allSettled([...approvalTasks]);\n await tools.drain();\n if (active === current) active = undefined;\n }\n })();\n return await current.completion;\n },\n async steer() { throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"OpenCode does not expose verified active steering.\"); },\n async interrupt() {\n const current = active;\n if (!current) return;\n current.interrupted = true;\n current.lifecycle.abort();\n approvals.clear();\n tools.stopAdmission();\n try {\n const admitted = await bounded(waitForAdmission(http, sessionID!, current), 5_000);\n if (admitted) {\n const acknowledged = await http.json(`/session/${encodeURIComponent(sessionID!)}/abort`, { method: \"POST\", timeout: 2_000 });\n if (acknowledged !== true) throw new Error();\n }\n await bounded(waitForNativeStop(http, sessionID!, current), 5_000);\n } catch {\n throw new AgentError(\"CANCELLATION_FAILED\", \"OpenCode did not confirm native cancellation.\");\n }\n await current.completion.catch(() => {});\n },\n async resume() { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"OpenCode cannot retry failed execution without replaying input.\"); },\n async close() {\n if (closing) return await closing;\n closed = true;\n closing = (async () => {\n const current = active;\n if (current) {\n current.closing = true;\n current.lifecycle.abort();\n }\n approvals.clear();\n tools.stopAdmission();\n try {\n const admitted = current ? await bounded(waitForAdmission(http, sessionID!, current), 1_000).catch(() => false) : false;\n if (current && admitted) await http.json(`/session/${encodeURIComponent(sessionID!)}/abort`, { method: \"POST\", timeout: 1_000 }).catch(() => {});\n if (current) await bounded(current.completion.catch(() => {}), 5_000).catch(() => {});\n eventController!.abort();\n if (sessionID) await http.json(`/session/${encodeURIComponent(sessionID)}`, { method: \"DELETE\", timeout: 1_000 }).catch(() => {});\n } finally {\n const cleanupFailures: unknown[] = [];\n for (const cleanup of [\n () => native!.close(),\n async () => { await eventTask; },\n () => tools.close(),\n () => runtime.close(),\n ]) {\n try { await cleanup(); }\n catch (error) { cleanupFailures.push(error); }\n }\n if (cleanupFailures.length > 0) throw cleanupFailures[0];\n }\n })();\n return await closing;\n },\n };\n return session;\n } catch (error) {\n eventController?.abort();\n if (sessionID && native) {\n const http = new OpencodeHttp(native.url, cwd, password);\n await http.json(`/session/${encodeURIComponent(sessionID)}`, { method: \"DELETE\", timeout: 1_000 }).catch(() => {});\n }\n await native?.close().catch(() => {});\n await tools.close().catch(() => {});\n await runtime.close().catch(() => {});\n throw error;\n }\n}\n\nasync function verifyStartup(http: OpencodeHttp, expected: Json, options: AdapterOptions, route: OpencodeRoute): Promise<void> {\n const health = record(await http.json(\"/global/health\"));\n if (health.healthy !== true || typeof health.version !== \"string\") protocol(\"OpenCode returned malformed native health data.\");\n if (health.version !== supportedOpencodeVersion) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode native server version does not match the verified isolated execution profile.\");\n }\n\n const config = record(await http.json(\"/config\"));\n const configuredProviders = record(config.provider, true) ?? {};\n if (!onlyString(config.enabled_providers, route.providerID) || config.model !== expected.model || config.small_model !== expected.small_model\n || config.share !== \"disabled\" || config.autoupdate !== false || !Array.isArray(config.plugin) || config.plugin.length !== 0\n || config.lsp !== false || config.formatter !== false\n || !sameOptionalStrings(config.instructions, expected.instructions)\n || !onlyKey(record(config.permission), \"*\", \"ask\")\n || config.permission?.[\"*\"] !== \"ask\") {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode did not apply the isolated native configuration.\");\n }\n if (route.kind === \"subscription\") {\n if (Object.hasOwn(configuredProviders, route.providerID) || Object.keys(configuredProviders).length !== 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode loaded provider configuration that conflicts with native subscription access.\");\n }\n } else {\n const providerConfig = record(configuredProviders[route.providerID]);\n const providerOptions = record(providerConfig.options);\n const expectedOptionKeys = route.kind === \"gateway\"\n ? options.access.type === \"vercel-api-key\" ? [\"apiKey\", \"baseURL\"] : [\"baseURL\"]\n : route.baseUrl === undefined ? [\"apiKey\"] : [\"apiKey\", \"baseURL\"];\n const expectedKey = options.access.type === \"vercel-api-key\" || options.access.type === \"api-key\" ? options.access.token : undefined;\n if (Object.keys(configuredProviders).length !== 1 || providerConfig.npm !== route.configPackage\n || !Array.isArray(providerConfig.env) || providerConfig.env.length !== 0\n || providerOptions.apiKey !== expectedKey\n || (route.kind === \"gateway\" ? providerOptions.baseURL !== gatewayBaseUrl : providerOptions.baseURL !== route.baseUrl)\n || !sameStrings(Object.keys(providerOptions).sort(), expectedOptionKeys)) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode did not retain the selected explicit provider configuration.\");\n }\n }\n for (const field of [\"agent\", \"mode\", \"command\", \"tools\"] as const) {\n if (record(config[field], true) && Object.keys(config[field]).length > 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode loaded excluded native configuration.\");\n }\n }\n if (record(config.mcp, true) && Object.keys(config.mcp).length > 0) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode loaded an unexpected native MCP configuration.\");\n\n const providers = record(await http.json(\"/provider\"));\n if (!Array.isArray(providers.connected) || !providers.connected.every((value: unknown) => typeof value === \"string\") || !Array.isArray(providers.all)) {\n protocol(\"OpenCode returned malformed native provider data.\");\n }\n if (route.kind === \"subscription\" && providers.all.length === 0 && providers.connected.length === 0) {\n const defaults = record(providers.default);\n if (Object.keys(defaults).length !== 0) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode returned conflicting native subscription defaults.\");\n throw new AgentError(\"ACCESS_UNAVAILABLE\", \"The selected OpenCode native subscription login is unavailable.\");\n }\n if (providers.all.length !== 1 || record(providers.all[0]).id !== route.providerID) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode enabled an unexpected native provider.\");\n }\n const selectedProvider = providers.all.find((value: unknown) => record(value, true)?.id === route.providerID);\n if (!selectedProvider) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode did not enable the selected native provider.\");\n const provider = record(selectedProvider);\n const providerOptions = record(provider.options);\n if (route.kind !== \"subscription\" && (provider.source !== \"config\"\n || providerOptions.apiKey !== (options.access.type === \"vercel-oidc\" ? undefined : options.access.token))) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode selected an incompatible explicit provider route.\");\n }\n if (route.kind === \"gateway\" && providerOptions.baseURL !== gatewayBaseUrl) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode selected an incompatible Gateway endpoint.\");\n }\n if (route.kind === \"direct\" && route.baseUrl !== undefined && providerOptions.baseURL !== route.baseUrl) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode did not retain the selected direct provider endpoint override.\");\n }\n const selectedModel = record(record(provider.models)[route.modelID], true);\n if (!selectedModel) throw new AgentError(\"INVALID_CONFIG\", \"The selected model is absent from OpenCode's native catalog.\");\n const api = record(selectedModel.api);\n const apiID = string(api.id);\n if (selectedModel.id !== route.modelID || selectedModel.providerID !== route.providerID || !apiID) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode selected incompatible native model metadata.\");\n }\n if (route.kind === \"gateway\" && apiID !== route.modelID) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode changed the selected Gateway model route.\");\n if (!record(selectedModel.capabilities, true) || !record(selectedModel.limit, true)) {\n throw new AgentError(\"INVALID_CONFIG\", \"The selected model has incomplete native metadata.\");\n }\n if (route.kind === \"subscription\") {\n if (providers.connected.length === 0) {\n const defaults = record(providers.default);\n const defaultModel = string(defaults[route.providerID]);\n if (provider.source === \"custom\" && Object.keys(providerOptions).length === 0\n && Object.keys(defaults).length === 1 && defaultModel\n && route.unavailablePackages?.includes(api.npm)) {\n throw new AgentError(\"ACCESS_UNAVAILABLE\", \"The selected OpenCode native subscription login is unavailable.\");\n }\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode returned conflicting native subscription state.\");\n }\n if (!onlyString(providers.connected, route.providerID)) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode returned ambiguous native subscription state.\");\n if (provider.source !== \"custom\" || providerOptions.apiKey !== route.oauthMarker || !route.packages.includes(api.npm)) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode could not verify the selected native OAuth subscription route.\");\n }\n } else if (!onlyString(providers.connected, route.providerID)) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode did not retain the selected explicit provider route.\");\n } else if (!route.packages.includes(api.npm)) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode selected incompatible native model metadata.\");\n }\n\n const agents = await http.json(\"/agent\");\n if (!Array.isArray(agents)) protocol(\"OpenCode returned malformed native agent data.\");\n for (const agent of agents) {\n const entry = record(agent);\n if (entry.model !== undefined && !selection(entry.model, \"modelID\", route)) {\n throw new AgentError(\"INVALID_CONFIG\", \"OpenCode loaded a native agent with a conflicting model override.\");\n }\n }\n}\n\nfunction terminalText(value: unknown, sessionID: string, route: OpencodeRoute): string {\n const response = record(value);\n const info = record(response.info);\n if (info.role !== \"assistant\" || info.sessionID !== sessionID || typeof info.time?.completed !== \"number\" || typeof info.finish !== \"string\" || !Array.isArray(response.parts)) {\n protocol(\"OpenCode returned malformed or unfinished terminal data.\");\n }\n if (info.providerID !== route.providerID || info.modelID !== route.modelID) throw new AgentError(\"INVALID_CONFIG\", \"OpenCode changed the requested provider or model during execution.\");\n if (info.error !== undefined) throw new AgentError(\"HARNESS_ERROR\", \"OpenCode reported a native execution error.\");\n const text = response.parts.filter((part: unknown) => record(part, true)?.type === \"text\").map((part: Json) => {\n if (typeof part.text !== \"string\") protocol(\"OpenCode returned malformed terminal text.\");\n return part.text;\n }).join(\"\");\n if (Buffer.byteLength(text, \"utf8\") > 1024 * 1024) throw new AgentError(\"RESPONSE_TOO_LARGE\", \"The OpenCode response exceeds 1 MiB.\");\n return text;\n}\n\nfunction record(value: unknown, optional = false): Json {\n if (value && typeof value === \"object\" && !Array.isArray(value)) return value as Json;\n if (optional && value === undefined) return undefined as unknown as Json;\n protocol(\"OpenCode returned malformed native protocol data.\");\n}\nfunction string(value: unknown): string | undefined { return typeof value === \"string\" && value.length > 0 ? value : undefined; }\nfunction strings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === \"string\") && new Set(value).size === value.length;\n}\nfunction onlyString(value: unknown, expected: string): boolean { return Array.isArray(value) && value.length === 1 && value[0] === expected; }\nfunction sameStrings(left: unknown, right: unknown): boolean {\n return Array.isArray(left) && Array.isArray(right) && left.length === right.length\n && left.every((value, index) => typeof value === \"string\" && value === right[index]);\n}\nfunction sameOptionalStrings(left: unknown, right: unknown): boolean {\n return left === undefined && right === undefined || sameStrings(left, right);\n}\nfunction onlyKey(value: Json, key: string, expected: unknown): boolean {\n return Object.keys(value).length === 1 && value[key] === expected;\n}\nfunction selection(value: unknown, modelField: string, route: OpencodeRoute): boolean {\n const selected = record(value, true);\n return Boolean(selected && selected.providerID === route.providerID && selected[modelField] === route.modelID);\n}\nfunction samePath(left: string | undefined, right: string): boolean { return left !== undefined && resolve(left) === resolve(right); }\nfunction permissionMessage(permission: string, patterns: string[]): string {\n const details = patterns.length === 0 ? \"\" : ` for ${patterns.join(\", \")}`;\n const message = `Allow OpenCode ${permission}${details}?`;\n return message.length <= 4_096 ? message : `Allow OpenCode ${permission}?`;\n}\nasync function waitForNativeStop(http: OpencodeHttp, sessionID: string, current: ActiveTurn): Promise<void> {\n for (;;) {\n const statuses = record(await http.json(\"/session/status\"));\n const status = record(statuses[sessionID], true);\n if (status === undefined && current.settled) return;\n await new Promise(resolveDelay => setTimeout(resolveDelay, 25));\n }\n}\nasync function waitForAdmission(http: OpencodeHttp, sessionID: string, current: ActiveTurn): Promise<boolean> {\n for (;;) {\n if (current.settled) return false;\n const statuses = record(await http.json(\"/session/status\"));\n const status = record(statuses[sessionID], true);\n if (status?.type === \"busy\" || status?.type === \"retry\") return true;\n await new Promise(resolveDelay => setTimeout(resolveDelay, 10));\n }\n}\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"OpenCode did not reach a native terminal outcome.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { if (timer) clearTimeout(timer); }\n}\nfunction protocol(message: string): never { throw new AgentError(\"PROTOCOL_ERROR\", message); }\n"]}
@@ -6,6 +6,7 @@ type Envelope = {
6
6
  result?: any;
7
7
  error?: unknown;
8
8
  };
9
+ export declare function nativeRpcErrorDescription(error: unknown): string;
9
10
  /** A bidirectional JSON-lines connection to an external native process. */
10
11
  export declare class NativeRpc {
11
12
  private readonly process;
@@ -13,6 +14,7 @@ export declare class NativeRpc {
13
14
  private sequence;
14
15
  private buffer;
15
16
  private failure?;
17
+ private closing;
16
18
  private readonly exited;
17
19
  onMessage: (message: Envelope) => void;
18
20
  onFailure: (error: AgentError) => void;
@@ -24,5 +26,6 @@ export declare class NativeRpc {
24
26
  private read;
25
27
  private invalid;
26
28
  private fail;
29
+ private closedError;
27
30
  }
28
31
  export {};
@@ -1,5 +1,22 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { AgentError } from "../errors.js";
3
+ import { processExitDescription } from "../process-diagnostics.js";
4
+ const nativeErrorCategories = new Map([
5
+ [-32700, "parse error"],
6
+ [-32600, "invalid request"],
7
+ [-32601, "unavailable method"],
8
+ [-32602, "invalid parameters"],
9
+ [-32603, "internal error"],
10
+ ]);
11
+ export function nativeRpcErrorDescription(error) {
12
+ if (!error || typeof error !== "object" || Array.isArray(error))
13
+ return "";
14
+ const code = error.code;
15
+ if (typeof code !== "number" || !Number.isSafeInteger(code))
16
+ return "";
17
+ const category = nativeErrorCategories.get(code);
18
+ return ` (native error code ${code}${category ? `: ${category}` : ""})`;
19
+ }
3
20
  /** A bidirectional JSON-lines connection to an external native process. */
4
21
  export class NativeRpc {
5
22
  process;
@@ -7,6 +24,7 @@ export class NativeRpc {
7
24
  sequence = 0;
8
25
  buffer = "";
9
26
  failure;
27
+ closing = false;
10
28
  exited;
11
29
  onMessage = () => { };
12
30
  onFailure = () => { };
@@ -15,16 +33,30 @@ export class NativeRpc {
15
33
  this.process.stdout.setEncoding("utf8");
16
34
  this.process.stdout.on("data", chunk => this.read(chunk));
17
35
  this.process.stderr.resume(); // Native diagnostics can contain credentials; never forward them.
18
- this.process.stdin.on("error", () => this.fail(new AgentError("HARNESS_FAILED", "Codex input connection closed.")));
36
+ this.process.stdin.on("error", () => setImmediate(() => {
37
+ if (!this.closing && this.process.exitCode === null && this.process.signalCode === null) {
38
+ this.fail(new AgentError("HARNESS_FAILED", "Codex input connection closed."));
39
+ }
40
+ }));
19
41
  this.process.on("error", () => this.fail(new AgentError("HARNESS_UNAVAILABLE", "Cannot start Codex. Install its native CLI and make codex available on PATH.")));
20
- this.exited = new Promise(resolve => this.process.once("close", () => {
21
- this.fail(new AgentError("HARNESS_FAILED", "Codex exited before the operation completed."));
42
+ this.exited = new Promise(resolve => this.process.once("close", (code, signal) => {
43
+ if (this.closing) {
44
+ if (this.pending.size > 0)
45
+ this.fail(new AgentError("HARNESS_FAILED", "The Codex session closed before the operation completed."));
46
+ else
47
+ this.fail(this.closedError());
48
+ }
49
+ else {
50
+ this.fail(new AgentError("HARNESS_FAILED", `Codex exited before the operation completed${processExitDescription(code, signal)}.`));
51
+ }
22
52
  resolve();
23
53
  }));
24
54
  }
25
55
  request(method, params) {
26
56
  if (this.failure)
27
57
  return Promise.reject(this.failure);
58
+ if (this.closing)
59
+ return Promise.reject(this.closedError());
28
60
  const id = ++this.sequence;
29
61
  return new Promise((resolve, reject) => {
30
62
  this.pending.set(id, { resolve, reject, method });
@@ -34,6 +66,8 @@ export class NativeRpc {
34
66
  send(message) {
35
67
  if (this.failure)
36
68
  throw this.failure;
69
+ if (this.closing)
70
+ throw this.closedError();
37
71
  this.process.stdin.write(`${JSON.stringify(message)}\n`);
38
72
  }
39
73
  abort(error) {
@@ -43,6 +77,7 @@ export class NativeRpc {
43
77
  async close() {
44
78
  if (this.process.exitCode !== null || this.process.signalCode !== null)
45
79
  return this.exited;
80
+ this.closing = true;
46
81
  this.process.kill("SIGTERM");
47
82
  const timer = setTimeout(() => this.process.kill("SIGKILL"), 2_000);
48
83
  timer.unref();
@@ -77,7 +112,10 @@ export class NativeRpc {
77
112
  this.pending.delete(message.id);
78
113
  if (message.error) {
79
114
  const unsupported = pending.method === "turn/steer" && message.error.code === -32601;
80
- pending.reject(new AgentError(unsupported ? "UNSUPPORTED_DELIVERY" : "NATIVE_ERROR", unsupported ? "This Codex version does not support native steering." : `Codex rejected ${pending.method}. Check the native harness configuration.`));
115
+ const diagnostic = `Codex rejected ${pending.method}${nativeRpcErrorDescription(message.error)}.`;
116
+ pending.reject(new AgentError(unsupported ? "UNSUPPORTED_DELIVERY" : "NATIVE_ERROR", unsupported
117
+ ? `${diagnostic} This Codex version does not support native steering.`
118
+ : diagnostic));
81
119
  }
82
120
  else
83
121
  pending.resolve(message.result);
@@ -97,5 +135,8 @@ export class NativeRpc {
97
135
  this.pending.clear();
98
136
  this.onFailure(error);
99
137
  }
138
+ closedError() {
139
+ return new AgentError("HARNESS_FAILED", "The Codex session is closed.");
140
+ }
100
141
  }
101
142
  //# sourceMappingURL=rpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/adapters/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { AgentError } from \"../errors.js\";\n\ntype Envelope = { id?: string | number; method?: string; params?: any; result?: any; error?: unknown };\ntype Pending = { resolve(value: any): void; reject(error: Error): void; method: string };\n\n/** A bidirectional JSON-lines connection to an external native process. */\nexport class NativeRpc {\n private readonly process: ChildProcessWithoutNullStreams;\n private readonly pending = new Map<number, Pending>();\n private sequence = 0;\n private buffer = \"\";\n private failure?: AgentError;\n private readonly exited: Promise<void>;\n onMessage: (message: Envelope) => void = () => {};\n onFailure: (error: AgentError) => void = () => {};\n\n constructor(command: string, args: string[], cwd: string, env: NodeJS.ProcessEnv) {\n this.process = spawn(command, args, { cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n this.process.stdout.setEncoding(\"utf8\");\n this.process.stdout.on(\"data\", chunk => this.read(chunk));\n this.process.stderr.resume(); // Native diagnostics can contain credentials; never forward them.\n this.process.stdin.on(\"error\", () => this.fail(new AgentError(\"HARNESS_FAILED\", \"Codex input connection closed.\")));\n this.process.on(\"error\", () => this.fail(new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start Codex. Install its native CLI and make codex available on PATH.\")));\n this.exited = new Promise(resolve => this.process.once(\"close\", () => {\n this.fail(new AgentError(\"HARNESS_FAILED\", \"Codex exited before the operation completed.\"));\n resolve();\n }));\n }\n\n request(method: string, params: unknown): Promise<any> {\n if (this.failure) return Promise.reject(this.failure);\n const id = ++this.sequence;\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, method });\n this.send({ id, method, params });\n });\n }\n\n send(message: Envelope): void {\n if (this.failure) throw this.failure;\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n abort(error: AgentError): void {\n this.fail(error);\n void this.close();\n }\n\n async close(): Promise<void> {\n if (this.process.exitCode !== null || this.process.signalCode !== null) return this.exited;\n this.process.kill(\"SIGTERM\");\n const timer = setTimeout(() => this.process.kill(\"SIGKILL\"), 2_000);\n timer.unref();\n await this.exited;\n clearTimeout(timer);\n }\n\n private read(chunk: string): void {\n this.buffer += chunk;\n if (this.buffer.length > 16 * 1024 * 1024) return this.invalid();\n let newline: number;\n while ((newline = this.buffer.indexOf(\"\\n\")) >= 0) {\n const line = this.buffer.slice(0, newline);\n this.buffer = this.buffer.slice(newline + 1);\n if (!line.trim()) continue;\n let message: Envelope;\n try { message = JSON.parse(line); } catch { return this.invalid(); }\n if (!message || typeof message !== \"object\" || Array.isArray(message)) return this.invalid();\n if (message.method) this.onMessage(message);\n else if (typeof message.id === \"number\") {\n const pending = this.pending.get(message.id);\n if (!pending) continue;\n this.pending.delete(message.id);\n if (message.error) {\n const unsupported = pending.method === \"turn/steer\" && (message.error as { code?: number }).code === -32601;\n pending.reject(new AgentError(unsupported ? \"UNSUPPORTED_DELIVERY\" : \"NATIVE_ERROR\", unsupported ? \"This Codex version does not support native steering.\" : `Codex rejected ${pending.method}. Check the native harness configuration.`));\n }\n else pending.resolve(message.result);\n }\n }\n }\n\n private invalid(): void {\n this.fail(new AgentError(\"PROTOCOL_ERROR\", \"Codex returned invalid protocol data.\"));\n void this.close();\n }\n\n private fail(error: AgentError): void {\n if (this.failure) return;\n this.failure = error;\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n this.onFailure(error);\n }\n}\n"]}
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/adapters/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { AgentError } from \"../errors.js\";\nimport { processExitDescription } from \"../process-diagnostics.js\";\n\ntype Envelope = { id?: string | number; method?: string; params?: any; result?: any; error?: unknown };\ntype Pending = { resolve(value: any): void; reject(error: Error): void; method: string };\n\nconst nativeErrorCategories = new Map<number, string>([\n [-32700, \"parse error\"],\n [-32600, \"invalid request\"],\n [-32601, \"unavailable method\"],\n [-32602, \"invalid parameters\"],\n [-32603, \"internal error\"],\n]);\n\nexport function nativeRpcErrorDescription(error: unknown): string {\n if (!error || typeof error !== \"object\" || Array.isArray(error)) return \"\";\n const code = (error as { code?: unknown }).code;\n if (typeof code !== \"number\" || !Number.isSafeInteger(code)) return \"\";\n const category = nativeErrorCategories.get(code);\n return ` (native error code ${code}${category ? `: ${category}` : \"\"})`;\n}\n\n/** A bidirectional JSON-lines connection to an external native process. */\nexport class NativeRpc {\n private readonly process: ChildProcessWithoutNullStreams;\n private readonly pending = new Map<number, Pending>();\n private sequence = 0;\n private buffer = \"\";\n private failure?: AgentError;\n private closing = false;\n private readonly exited: Promise<void>;\n onMessage: (message: Envelope) => void = () => {};\n onFailure: (error: AgentError) => void = () => {};\n\n constructor(command: string, args: string[], cwd: string, env: NodeJS.ProcessEnv) {\n this.process = spawn(command, args, { cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n this.process.stdout.setEncoding(\"utf8\");\n this.process.stdout.on(\"data\", chunk => this.read(chunk));\n this.process.stderr.resume(); // Native diagnostics can contain credentials; never forward them.\n this.process.stdin.on(\"error\", () => setImmediate(() => {\n if (!this.closing && this.process.exitCode === null && this.process.signalCode === null) {\n this.fail(new AgentError(\"HARNESS_FAILED\", \"Codex input connection closed.\"));\n }\n }));\n this.process.on(\"error\", () => this.fail(new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start Codex. Install its native CLI and make codex available on PATH.\")));\n this.exited = new Promise(resolve => this.process.once(\"close\", (code, signal) => {\n if (this.closing) {\n if (this.pending.size > 0) this.fail(new AgentError(\"HARNESS_FAILED\",\"The Codex session closed before the operation completed.\"));\n else this.fail(this.closedError());\n } else {\n this.fail(new AgentError(\"HARNESS_FAILED\",\n `Codex exited before the operation completed${processExitDescription(code, signal)}.`));\n }\n resolve();\n }));\n }\n\n request(method: string, params: unknown): Promise<any> {\n if (this.failure) return Promise.reject(this.failure);\n if (this.closing) return Promise.reject(this.closedError());\n const id = ++this.sequence;\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, method });\n this.send({ id, method, params });\n });\n }\n\n send(message: Envelope): void {\n if (this.failure) throw this.failure;\n if (this.closing) throw this.closedError();\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n abort(error: AgentError): void {\n this.fail(error);\n void this.close();\n }\n\n async close(): Promise<void> {\n if (this.process.exitCode !== null || this.process.signalCode !== null) return this.exited;\n this.closing = true;\n this.process.kill(\"SIGTERM\");\n const timer = setTimeout(() => this.process.kill(\"SIGKILL\"), 2_000);\n timer.unref();\n await this.exited;\n clearTimeout(timer);\n }\n\n private read(chunk: string): void {\n this.buffer += chunk;\n if (this.buffer.length > 16 * 1024 * 1024) return this.invalid();\n let newline: number;\n while ((newline = this.buffer.indexOf(\"\\n\")) >= 0) {\n const line = this.buffer.slice(0, newline);\n this.buffer = this.buffer.slice(newline + 1);\n if (!line.trim()) continue;\n let message: Envelope;\n try { message = JSON.parse(line); } catch { return this.invalid(); }\n if (!message || typeof message !== \"object\" || Array.isArray(message)) return this.invalid();\n if (message.method) this.onMessage(message);\n else if (typeof message.id === \"number\") {\n const pending = this.pending.get(message.id);\n if (!pending) continue;\n this.pending.delete(message.id);\n if (message.error) {\n const unsupported = pending.method === \"turn/steer\" && (message.error as { code?: unknown }).code === -32601;\n const diagnostic = `Codex rejected ${pending.method}${nativeRpcErrorDescription(message.error)}.`;\n pending.reject(new AgentError(unsupported ? \"UNSUPPORTED_DELIVERY\" : \"NATIVE_ERROR\", unsupported\n ? `${diagnostic} This Codex version does not support native steering.`\n : diagnostic));\n }\n else pending.resolve(message.result);\n }\n }\n }\n\n private invalid(): void {\n this.fail(new AgentError(\"PROTOCOL_ERROR\", \"Codex returned invalid protocol data.\"));\n void this.close();\n }\n\n private fail(error: AgentError): void {\n if (this.failure) return;\n this.failure = error;\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n this.onFailure(error);\n }\n\n private closedError(): AgentError {\n return new AgentError(\"HARNESS_FAILED\", \"The Codex session is closed.\");\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { ApprovalHandler } from "../approvals/types.js";
1
2
  import type { AgentDefinition, HarnessConfig } from "../sdk/types.js";
2
3
  export type HarnessRequest = HarnessConfig extends infer Config ? Config extends HarnessConfig ? Omit<Config, "model"> & {
3
4
  readonly model?: Config["model"];
@@ -9,6 +10,11 @@ export type AccessType = "subscription" | "api-key" | "vercel-api-key" | "vercel
9
10
  export interface ResolvedAccess {
10
11
  type: AccessType;
11
12
  token?: string;
13
+ provider?: string;
14
+ baseUrl?: string;
15
+ wireApi?: "completions" | "responses";
16
+ apiVersion?: string;
17
+ wireModel?: string;
12
18
  }
13
19
  export interface AdapterOptions {
14
20
  agent: ExecutionDefinition;
@@ -16,6 +22,7 @@ export interface AdapterOptions {
16
22
  cwd: string;
17
23
  env: NodeJS.ProcessEnv;
18
24
  access: ResolvedAccess;
25
+ onApproval?: ApprovalHandler;
19
26
  }
20
27
  /** A native conversation. The external harness owns its reasoning and tool loop. */
21
28
  export interface NativeSession {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentDefinition, HarnessConfig } from \"../sdk/types.js\";\n\nexport type HarnessRequest = HarnessConfig extends infer Config\n ? Config extends HarnessConfig\n ? Omit<Config, \"model\"> & { readonly model?: Config[\"model\"] }\n : never\n : never;\n\nexport type ExecutionDefinition = Omit<AgentDefinition, \"harness\"> & {\n readonly harness: HarnessRequest | readonly HarnessRequest[];\n};\n\nexport type AccessType = \"subscription\" | \"api-key\" | \"vercel-api-key\" | \"vercel-oidc\";\n\nexport interface ResolvedAccess {\n type: AccessType;\n token?: string;\n}\n\nexport interface AdapterOptions {\n agent: ExecutionDefinition;\n harness: HarnessRequest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n access: ResolvedAccess;\n}\n\n/** A native conversation. The external harness owns its reasoning and tool loop. */\nexport interface NativeSession {\n turn(prompt: string): Promise<string>;\n steer(prompt: string): Promise<void>;\n /** Resolves only once active execution has stopped. */\n interrupt(): Promise<void>;\n resume(): Promise<string>;\n close(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ApprovalHandler } from \"../approvals/types.js\";\nimport type { AgentDefinition, HarnessConfig } from \"../sdk/types.js\";\n\nexport type HarnessRequest = HarnessConfig extends infer Config\n ? Config extends HarnessConfig\n ? Omit<Config, \"model\"> & { readonly model?: Config[\"model\"] }\n : never\n : never;\n\nexport type ExecutionDefinition = Omit<AgentDefinition, \"harness\"> & {\n readonly harness: HarnessRequest | readonly HarnessRequest[];\n};\n\nexport type AccessType = \"subscription\" | \"api-key\" | \"vercel-api-key\" | \"vercel-oidc\";\n\nexport interface ResolvedAccess {\n type: AccessType;\n token?: string;\n provider?: string;\n baseUrl?: string;\n wireApi?: \"completions\" | \"responses\";\n apiVersion?: string;\n wireModel?: string;\n}\n\nexport interface AdapterOptions {\n agent: ExecutionDefinition;\n harness: HarnessRequest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n access: ResolvedAccess;\n onApproval?: ApprovalHandler;\n}\n\n/** A native conversation. The external harness owns its reasoning and tool loop. */\nexport interface NativeSession {\n turn(prompt: string): Promise<string>;\n steer(prompt: string): Promise<void>;\n /** Resolves only once active execution has stopped. */\n interrupt(): Promise<void>;\n resume(): Promise<string>;\n close(): Promise<void>;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ApprovalContent, ApprovalSchema } from "./types.js";
2
+ /** Reject unsupported schema constructs before publishing a native request. */
3
+ export declare function validateApprovalSchema(schema: unknown): asserts schema is ApprovalSchema;
4
+ export declare function validateApprovalContent(schema: ApprovalSchema, content: unknown): ApprovalContent;
@@ -0,0 +1,70 @@
1
+ import { AgentError } from "../errors.js";
2
+ const invalid = () => new AgentError("INVALID_APPROVAL_RESPONSE", "The approval response does not match the requested schema.");
3
+ const unsupported = () => new AgentError("INPUT_REQUIRED", "The native permission request cannot be represented by a supported approval schema.");
4
+ function object(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value) && [Object.prototype, null].includes(Object.getPrototypeOf(value));
6
+ }
7
+ function keys(value, allowed) { return Object.keys(value).every(key => allowed.includes(key)); }
8
+ function strings(value) { return Array.isArray(value) && Object.keys(value).length === value.length && value.every(v => typeof v === "string") && new Set(value).size === value.length; }
9
+ function choices(value) {
10
+ return Array.isArray(value) && value.length > 0 && value.every(v => object(v) && keys(v, ["const", "title"]) && typeof v.const === "string" && typeof v.title === "string") && new Set(value.map(v => v.const)).size === value.length;
11
+ }
12
+ function bounds(field, lower, upper, integral = false) {
13
+ return [lower, upper].every(key => field[key] === undefined || (Number.isFinite(field[key]) && (!integral || (Number.isInteger(field[key]) && field[key] >= 0)))) && !(field[lower] !== undefined && field[upper] !== undefined && field[lower] > field[upper]);
14
+ }
15
+ function fieldValid(field) {
16
+ if (!object(field) || !["title", "description"].every(key => field[key] === undefined || typeof field[key] === "string"))
17
+ return false;
18
+ const common = ["type", "title", "description"];
19
+ switch (field.type) {
20
+ case "string": return keys(field, [...common, "enum", "oneOf", "minLength", "maxLength"]) && !(field.enum && field.oneOf)
21
+ && (field.enum === undefined || (strings(field.enum) && field.enum.length > 0)) && (field.oneOf === undefined || choices(field.oneOf)) && bounds(field, "minLength", "maxLength", true);
22
+ case "boolean": return keys(field, common);
23
+ case "number":
24
+ case "integer": return keys(field, [...common, "minimum", "maximum"]) && bounds(field, "minimum", "maximum");
25
+ case "array": return keys(field, [...common, "items", "minItems", "maxItems", "uniqueItems"]) && (field.uniqueItems === undefined || field.uniqueItems === true)
26
+ && bounds(field, "minItems", "maxItems", true) && object(field.items) && keys(field.items, ["type", "enum", "anyOf"]) && field.items.type === "string"
27
+ && ((field.items.enum !== undefined && field.items.anyOf === undefined && strings(field.items.enum) && field.items.enum.length > 0) || (field.items.enum === undefined && choices(field.items.anyOf)));
28
+ default: return false;
29
+ }
30
+ }
31
+ /** Reject unsupported schema constructs before publishing a native request. */
32
+ export function validateApprovalSchema(schema) {
33
+ if (!object(schema) || !keys(schema, ["type", "properties", "required", "additionalProperties"]) || schema.type !== "object" || !object(schema.properties)
34
+ || (schema.additionalProperties !== undefined && schema.additionalProperties !== false) || !Object.values(schema.properties).every(fieldValid)
35
+ || (schema.required !== undefined && (!strings(schema.required) || !schema.required.every((key) => Object.hasOwn(schema.properties, key)))))
36
+ throw unsupported();
37
+ }
38
+ export function validateApprovalContent(schema, content) {
39
+ validateApprovalSchema(schema);
40
+ if (!object(content) || !keys(content, Object.keys(schema.properties)) || schema.required?.some(key => !Object.hasOwn(content, key)))
41
+ throw invalid();
42
+ try {
43
+ if (Buffer.byteLength(JSON.stringify(content)) > 16 * 1024)
44
+ throw invalid();
45
+ }
46
+ catch {
47
+ throw invalid();
48
+ }
49
+ const result = {};
50
+ for (const [key, value] of Object.entries(content)) {
51
+ const field = schema.properties[key];
52
+ let valid = false;
53
+ if (field.type === "string")
54
+ valid = typeof value === "string" && (field.enum === undefined || field.enum.includes(value)) && (field.oneOf === undefined || field.oneOf.some(choice => choice.const === value))
55
+ && (field.minLength === undefined || [...value].length >= field.minLength) && (field.maxLength === undefined || [...value].length <= field.maxLength);
56
+ else if (field.type === "boolean")
57
+ valid = typeof value === "boolean";
58
+ else if (field.type === "number" || field.type === "integer")
59
+ valid = typeof value === "number" && Number.isFinite(value) && (field.type !== "integer" || Number.isInteger(value))
60
+ && (field.minimum === undefined || value >= field.minimum) && (field.maximum === undefined || value <= field.maximum);
61
+ else if (field.type === "array")
62
+ valid = strings(value) && value.every(item => field.items.enum?.includes(item) ?? field.items.anyOf.some(choice => choice.const === item))
63
+ && (field.minItems === undefined || value.length >= field.minItems) && (field.maxItems === undefined || value.length <= field.maxItems);
64
+ if (!valid)
65
+ throw invalid();
66
+ Object.defineProperty(result, key, { value: Array.isArray(value) ? [...value] : value, enumerable: true, writable: true, configurable: true });
67
+ }
68
+ return result;
69
+ }
70
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/approvals/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport type { ApprovalContent, ApprovalSchema } from \"./types.js\";\n\nconst invalid = () => new AgentError(\"INVALID_APPROVAL_RESPONSE\", \"The approval response does not match the requested schema.\");\nconst unsupported = () => new AgentError(\"INPUT_REQUIRED\", \"The native permission request cannot be represented by a supported approval schema.\");\nfunction object(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && [Object.prototype, null].includes(Object.getPrototypeOf(value));\n}\nfunction keys(value: Record<string, any>, allowed: string[]): boolean { return Object.keys(value).every(key => allowed.includes(key)); }\nfunction strings(value: unknown): value is string[] { return Array.isArray(value) && Object.keys(value).length === value.length && value.every(v => typeof v === \"string\") && new Set(value).size === value.length; }\nfunction choices(value: unknown): value is {const: string; title: string}[] {\n return Array.isArray(value) && value.length > 0 && value.every(v => object(v) && keys(v, [\"const\", \"title\"]) && typeof v.const === \"string\" && typeof v.title === \"string\") && new Set(value.map(v => v.const)).size === value.length;\n}\nfunction bounds(field: Record<string, any>, lower: string, upper: string, integral = false): boolean {\n return [lower, upper].every(key => field[key] === undefined || (Number.isFinite(field[key]) && (!integral || (Number.isInteger(field[key]) && field[key] >= 0)))) && !(field[lower] !== undefined && field[upper] !== undefined && field[lower] > field[upper]);\n}\nfunction fieldValid(field: unknown): boolean {\n if (!object(field) || ![\"title\", \"description\"].every(key => field[key] === undefined || typeof field[key] === \"string\")) return false;\n const common = [\"type\", \"title\", \"description\"];\n switch (field.type) {\n case \"string\": return keys(field, [...common, \"enum\", \"oneOf\", \"minLength\", \"maxLength\"]) && !(field.enum && field.oneOf)\n && (field.enum === undefined || (strings(field.enum) && field.enum.length > 0)) && (field.oneOf === undefined || choices(field.oneOf)) && bounds(field, \"minLength\", \"maxLength\", true);\n case \"boolean\": return keys(field, common);\n case \"number\": case \"integer\": return keys(field, [...common, \"minimum\", \"maximum\"]) && bounds(field, \"minimum\", \"maximum\");\n case \"array\": return keys(field, [...common, \"items\", \"minItems\", \"maxItems\", \"uniqueItems\"]) && (field.uniqueItems === undefined || field.uniqueItems === true)\n && bounds(field, \"minItems\", \"maxItems\", true) && object(field.items) && keys(field.items, [\"type\", \"enum\", \"anyOf\"]) && field.items.type === \"string\"\n && ((field.items.enum !== undefined && field.items.anyOf === undefined && strings(field.items.enum) && field.items.enum.length > 0) || (field.items.enum === undefined && choices(field.items.anyOf)));\n default: return false;\n }\n}\n/** Reject unsupported schema constructs before publishing a native request. */\nexport function validateApprovalSchema(schema: unknown): asserts schema is ApprovalSchema {\n if (!object(schema) || !keys(schema, [\"type\", \"properties\", \"required\", \"additionalProperties\"]) || schema.type !== \"object\" || !object(schema.properties)\n || (schema.additionalProperties !== undefined && schema.additionalProperties !== false) || !Object.values(schema.properties).every(fieldValid)\n || (schema.required !== undefined && (!strings(schema.required) || !schema.required.every((key: string) => Object.hasOwn(schema.properties, key))))) throw unsupported();\n}\nexport function validateApprovalContent(schema: ApprovalSchema, content: unknown): ApprovalContent {\n validateApprovalSchema(schema);\n if (!object(content) || !keys(content, Object.keys(schema.properties)) || schema.required?.some(key => !Object.hasOwn(content, key))) throw invalid();\n try { if (Buffer.byteLength(JSON.stringify(content)) > 16 * 1024) throw invalid(); } catch { throw invalid(); }\n const result: ApprovalContent = {};\n for (const [key, value] of Object.entries(content)) {\n const field = schema.properties[key]!;\n let valid = false;\n if (field.type === \"string\") valid = typeof value === \"string\" && (field.enum === undefined || field.enum.includes(value)) && (field.oneOf === undefined || field.oneOf.some(choice => choice.const === value))\n && (field.minLength === undefined || [...value].length >= field.minLength) && (field.maxLength === undefined || [...value].length <= field.maxLength);\n else if (field.type === \"boolean\") valid = typeof value === \"boolean\";\n else if (field.type === \"number\" || field.type === \"integer\") valid = typeof value === \"number\" && Number.isFinite(value) && (field.type !== \"integer\" || Number.isInteger(value))\n && (field.minimum === undefined || value >= field.minimum) && (field.maximum === undefined || value <= field.maximum);\n else if (field.type === \"array\") valid = strings(value) && value.every(item => field.items.enum?.includes(item) ?? field.items.anyOf!.some(choice => choice.const === item))\n && (field.minItems === undefined || value.length >= field.minItems) && (field.maxItems === undefined || value.length <= field.maxItems);\n if (!valid) throw invalid();\n Object.defineProperty(result, key, { value: Array.isArray(value) ? [...value] : value, enumerable: true, writable: true, configurable: true });\n }\n return result;\n}\n"]}
@@ -0,0 +1,47 @@
1
+ export type ApprovalContent = Record<string, string | number | boolean | string[]>;
2
+ export interface ApprovalChoice {
3
+ const: string;
4
+ title: string;
5
+ }
6
+ interface FieldDescription {
7
+ title?: string;
8
+ description?: string;
9
+ }
10
+ export type ApprovalField = FieldDescription & ({
11
+ type: "string";
12
+ enum?: readonly string[];
13
+ oneOf?: readonly ApprovalChoice[];
14
+ minLength?: number;
15
+ maxLength?: number;
16
+ } | {
17
+ type: "boolean";
18
+ } | {
19
+ type: "number" | "integer";
20
+ minimum?: number;
21
+ maximum?: number;
22
+ } | {
23
+ type: "array";
24
+ items: {
25
+ type: "string";
26
+ enum?: readonly string[];
27
+ anyOf?: readonly ApprovalChoice[];
28
+ };
29
+ minItems?: number;
30
+ maxItems?: number;
31
+ uniqueItems?: true;
32
+ });
33
+ export interface ApprovalSchema {
34
+ type: "object";
35
+ properties: Record<string, ApprovalField>;
36
+ required?: readonly string[];
37
+ additionalProperties?: false;
38
+ }
39
+ export interface NativeApprovalRequest {
40
+ kind: "permission";
41
+ harness: "codex" | "claudeCode" | "fx" | "opencode" | "copilot" | "cursor";
42
+ message: string;
43
+ requestedSchema: ApprovalSchema;
44
+ context?: Record<string, unknown>;
45
+ }
46
+ export type ApprovalHandler = (request: NativeApprovalRequest, signal: AbortSignal) => Promise<ApprovalContent>;
47
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/approvals/types.ts"],"names":[],"mappings":"","sourcesContent":["export type ApprovalContent = Record<string, string | number | boolean | string[]>;\n\nexport interface ApprovalChoice {\n const: string;\n title: string;\n}\ninterface FieldDescription { title?: string; description?: string }\nexport type ApprovalField = FieldDescription & (\n | { type: \"string\"; enum?: readonly string[]; oneOf?: readonly ApprovalChoice[]; minLength?: number; maxLength?: number }\n | { type: \"boolean\" }\n | { type: \"number\" | \"integer\"; minimum?: number; maximum?: number }\n | { type: \"array\"; items: { type: \"string\"; enum?: readonly string[]; anyOf?: readonly ApprovalChoice[] }; minItems?: number; maxItems?: number; uniqueItems?: true }\n);\nexport interface ApprovalSchema {\n type: \"object\";\n properties: Record<string, ApprovalField>;\n required?: readonly string[];\n additionalProperties?: false;\n}\nexport interface NativeApprovalRequest {\n kind: \"permission\";\n harness: \"codex\" | \"claudeCode\" | \"fx\" | \"opencode\" | \"copilot\" | \"cursor\";\n message: string;\n requestedSchema: ApprovalSchema;\n context?: Record<string, unknown>;\n}\nexport type ApprovalHandler = (request: NativeApprovalRequest, signal: AbortSignal) => Promise<ApprovalContent>;\n"]}
@@ -1,5 +1,5 @@
1
1
  import { type PromptStream } from './input.js';
2
- export type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'help' | 'version';
2
+ export type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'respond' | 'help' | 'version';
3
3
  export interface Arguments {
4
4
  command: Command;
5
5
  id?: string;
@@ -10,10 +10,11 @@ export interface Arguments {
10
10
  format: 'text' | 'jsonl';
11
11
  full: boolean;
12
12
  detach: boolean;
13
- harness?: 'codex' | 'claudeCode' | 'fx';
13
+ harness?: 'codex' | 'claudeCode' | 'fx' | 'opencode' | 'copilot' | 'cursor';
14
14
  model?: string;
15
15
  effort?: string;
16
16
  helpCommand?: 'run' | 'check';
17
+ content?: Record<string, unknown>;
17
18
  }
18
19
  export declare function parseArgs(argv: string[], cwd?: string, dependencies?: {
19
20
  stdin?: PromptStream;
package/dist/cli/args.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { resolve } from 'node:path';
2
2
  import { AgentError } from '../errors.js';
3
- import { MAX_PROMPT_BYTES, readPromptInput } from './input.js';
3
+ import { MAX_PROMPT_BYTES, readPromptInput, readApprovalInput } from './input.js';
4
4
  const options = {
5
5
  list: ['cwd'], dashboard: [], check: ['cwd', 'model', 'effort'], run: ['cwd', 'prompt', 'prompt-file', 'model', 'effort', 'detach'], send: ['delivery', 'prompt', 'prompt-file', 'detach'],
6
- wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [],
6
+ wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [], respond: ['content', 'content-file'],
7
7
  };
8
- const directTargets = { codex: 'codex', claude: 'claudeCode', fx: 'fx' };
8
+ const directTargets = { codex: 'codex', claude: 'claudeCode', fx: 'fx', opencode: 'opencode', copilot: 'copilot', cursor: 'cursor' };
9
9
  const claudeEfforts = new Set(['low', 'medium', 'high', 'xhigh', 'max']);
10
10
  const fail = (message) => { throw new AgentError('INVALID_ARGUMENT', message); };
11
11
  export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
@@ -88,6 +88,9 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
88
88
  if (direct === 'claudeCode' && 'effort' in values && !claudeEfforts.has(String(values.effort))) {
89
89
  fail('Claude effort must be low, medium, high, xhigh, or max.');
90
90
  }
91
+ if ((direct === 'opencode' || direct === 'copilot' || direct === 'cursor') && 'effort' in values) {
92
+ fail(`${result.id} does not support --effort.`);
93
+ }
91
94
  if ('model' in values)
92
95
  result.model = String(values.model);
93
96
  if ('effort' in values)
@@ -116,6 +119,24 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
116
119
  result.after = String(values.after);
117
120
  }
118
121
  }
122
+ if (command === 'respond') {
123
+ if (Number('content' in values) + Number('content-file' in values) !== 1)
124
+ fail('Supply exactly one approval response source: --content or --content-file.');
125
+ const text = 'content-file' in values
126
+ ? await readApprovalInput(String(values['content-file']), cwd, dependencies.stdin) : String(values.content);
127
+ if (Buffer.byteLength(text) > 16 * 1024)
128
+ fail('Approval content exceeds 16 KiB.');
129
+ let content;
130
+ try {
131
+ content = JSON.parse(text);
132
+ }
133
+ catch {
134
+ fail('Approval content must be valid JSON.');
135
+ }
136
+ if (!content || typeof content !== 'object' || Array.isArray(content))
137
+ fail('Approval content must be a JSON object.');
138
+ result.content = content;
139
+ }
119
140
  return result;
120
141
  }
121
142
  function defaults(command, cwd) {