subharness 0.0.4 → 0.0.7
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.
- package/README.md +95 -9
- package/dist/adapters/claude-process.d.ts +3 -0
- package/dist/adapters/claude-process.js +19 -2
- package/dist/adapters/claude-process.js.map +1 -1
- package/dist/adapters/claude-result.d.ts +2 -0
- package/dist/adapters/claude-result.js +22 -0
- package/dist/adapters/claude-result.js.map +1 -0
- package/dist/adapters/claude-tools.d.ts +6 -2
- package/dist/adapters/claude-tools.js +14 -12
- package/dist/adapters/claude-tools.js.map +1 -1
- package/dist/adapters/claude-worker-client.d.ts +49 -0
- package/dist/adapters/claude-worker-client.js +359 -0
- package/dist/adapters/claude-worker-client.js.map +1 -0
- package/dist/adapters/claude-worker-process.d.ts +20 -0
- package/dist/adapters/claude-worker-process.js +76 -0
- package/dist/adapters/claude-worker-process.js.map +1 -0
- package/dist/adapters/claude-worker-protocol.d.ts +38 -0
- package/dist/adapters/claude-worker-protocol.js +2 -0
- package/dist/adapters/claude-worker-protocol.js.map +1 -0
- package/dist/adapters/claude-worker.d.ts +1 -0
- package/dist/adapters/claude-worker.js +126 -0
- package/dist/adapters/claude-worker.js.map +1 -0
- package/dist/adapters/claude.d.ts +16 -6
- package/dist/adapters/claude.js +164 -75
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.js +4 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot-permissions.d.ts +26 -0
- package/dist/adapters/copilot-permissions.js +121 -0
- package/dist/adapters/copilot-permissions.js.map +1 -0
- package/dist/adapters/copilot-tools.d.ts +12 -0
- package/dist/adapters/copilot-tools.js +61 -0
- package/dist/adapters/copilot-tools.js.map +1 -0
- package/dist/adapters/copilot.d.ts +108 -0
- package/dist/adapters/copilot.js +819 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
- package/dist/adapters/cursor-cli-approvals.js +83 -0
- package/dist/adapters/cursor-cli-approvals.js.map +1 -0
- package/dist/adapters/cursor-cli-model.d.ts +4 -0
- package/dist/adapters/cursor-cli-model.js +64 -0
- package/dist/adapters/cursor-cli-model.js.map +1 -0
- package/dist/adapters/cursor-cli-session.d.ts +32 -0
- package/dist/adapters/cursor-cli-session.js +316 -0
- package/dist/adapters/cursor-cli-session.js.map +1 -0
- package/dist/adapters/cursor-cli-tools.d.ts +20 -0
- package/dist/adapters/cursor-cli-tools.js +181 -0
- package/dist/adapters/cursor-cli-tools.js.map +1 -0
- package/dist/adapters/cursor-cli.d.ts +2 -0
- package/dist/adapters/cursor-cli.js +306 -0
- package/dist/adapters/cursor-cli.js.map +1 -0
- package/dist/adapters/cursor-model.d.ts +7 -0
- package/dist/adapters/cursor-model.js +67 -0
- package/dist/adapters/cursor-model.js.map +1 -0
- package/dist/adapters/cursor-rpc.d.ts +42 -0
- package/dist/adapters/cursor-rpc.js +271 -0
- package/dist/adapters/cursor-rpc.js.map +1 -0
- package/dist/adapters/cursor-session.d.ts +4 -0
- package/dist/adapters/cursor-session.js +327 -0
- package/dist/adapters/cursor-session.js.map +1 -0
- package/dist/adapters/cursor-startup.d.ts +16 -0
- package/dist/adapters/cursor-startup.js +74 -0
- package/dist/adapters/cursor-startup.js.map +1 -0
- package/dist/adapters/cursor-tools.d.ts +11 -0
- package/dist/adapters/cursor-tools.js +49 -0
- package/dist/adapters/cursor-tools.js.map +1 -0
- package/dist/adapters/cursor.d.ts +6 -0
- package/dist/adapters/cursor.js +17 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/fx-auth.d.ts +12 -2
- package/dist/adapters/fx-auth.js +51 -61
- package/dist/adapters/fx-auth.js.map +1 -1
- package/dist/adapters/fx-profile.d.ts +8 -0
- package/dist/adapters/fx-profile.js +101 -0
- package/dist/adapters/fx-profile.js.map +1 -0
- package/dist/adapters/fx-rpc.d.ts +2 -0
- package/dist/adapters/fx-rpc.js +30 -4
- package/dist/adapters/fx-rpc.js.map +1 -1
- package/dist/adapters/fx-status.d.ts +2 -0
- package/dist/adapters/fx-status.js +96 -0
- package/dist/adapters/fx-status.js.map +1 -0
- package/dist/adapters/fx.js +28 -12
- package/dist/adapters/fx.js.map +1 -1
- package/dist/adapters/opencode-access.d.ts +13 -0
- package/dist/adapters/opencode-access.js +76 -0
- package/dist/adapters/opencode-access.js.map +1 -0
- package/dist/adapters/opencode-config.d.ts +11 -0
- package/dist/adapters/opencode-config.js +238 -0
- package/dist/adapters/opencode-config.js.map +1 -0
- package/dist/adapters/opencode-http.d.ts +28 -0
- package/dist/adapters/opencode-http.js +297 -0
- package/dist/adapters/opencode-http.js.map +1 -0
- package/dist/adapters/opencode-tools.d.ts +19 -0
- package/dist/adapters/opencode-tools.js +127 -0
- package/dist/adapters/opencode-tools.js.map +1 -0
- package/dist/adapters/opencode.d.ts +2 -0
- package/dist/adapters/opencode.js +569 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/rpc.d.ts +3 -0
- package/dist/adapters/rpc.js +45 -4
- package/dist/adapters/rpc.js.map +1 -1
- package/dist/adapters/types.d.ts +5 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/approvals/types.d.ts +1 -1
- package/dist/approvals/types.js.map +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.js +4 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/catalog-worker.js.map +1 -1
- package/dist/cli/dashboard-client.js +20 -31
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/dashboard-controller.d.ts +7 -0
- package/dist/cli/dashboard-controller.js +27 -0
- package/dist/cli/dashboard-controller.js.map +1 -0
- package/dist/cli/dashboard-detail-view.d.ts +1 -1
- package/dist/cli/dashboard-detail-view.js +3 -4
- package/dist/cli/dashboard-detail-view.js.map +1 -1
- package/dist/cli/dashboard-history-view.js.map +1 -1
- package/dist/cli/dashboard-input.d.ts +1 -1
- package/dist/cli/dashboard-input.js +11 -1
- package/dist/cli/dashboard-input.js.map +1 -1
- package/dist/cli/dashboard-layout.js +3 -3
- package/dist/cli/dashboard-layout.js.map +1 -1
- package/dist/cli/dashboard-renderer.js.map +1 -1
- package/dist/cli/dashboard-style.js +2 -2
- package/dist/cli/dashboard-style.js.map +1 -1
- package/dist/cli/dashboard.d.ts +2 -2
- package/dist/cli/dashboard.js +7 -32
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +30 -12
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +55 -43
- package/dist/cli/main.js.map +1 -1
- package/dist/config/access-provenance.d.ts +10 -0
- package/dist/config/access-provenance.js +31 -0
- package/dist/config/access-provenance.js.map +1 -0
- package/dist/config/access.d.ts +12 -2
- package/dist/config/access.js +125 -27
- package/dist/config/access.js.map +1 -1
- package/dist/config/loader.js +1 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/oidc.js +4 -2
- package/dist/config/oidc.js.map +1 -1
- package/dist/config/project.js +2 -1
- package/dist/config/project.js.map +1 -1
- package/dist/config/resolve-access.js +24 -10
- package/dist/config/resolve-access.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/process-diagnostics.d.ts +2 -0
- package/dist/process-diagnostics.js +11 -0
- package/dist/process-diagnostics.js.map +1 -0
- package/dist/runtime/access-errors.d.ts +4 -0
- package/dist/runtime/access-errors.js +25 -0
- package/dist/runtime/access-errors.js.map +1 -0
- package/dist/runtime/approval-registry.d.ts +9 -0
- package/dist/runtime/approval-registry.js +144 -5
- package/dist/runtime/approval-registry.js.map +1 -1
- package/dist/runtime/capture.d.ts +22 -0
- package/dist/runtime/capture.js +320 -0
- package/dist/runtime/capture.js.map +1 -0
- package/dist/runtime/catalog.d.ts +39 -0
- package/dist/runtime/catalog.js +84 -0
- package/dist/runtime/catalog.js.map +1 -0
- package/dist/runtime/client.d.ts +2 -1
- package/dist/runtime/client.js +74 -47
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/coordinator.d.ts +44 -7
- package/dist/runtime/coordinator.js +265 -31
- package/dist/runtime/coordinator.js.map +1 -1
- package/dist/runtime/daemon.js +12 -6
- package/dist/runtime/daemon.js.map +1 -1
- package/dist/runtime/dashboard-sanitize.d.ts +2 -0
- package/dist/runtime/dashboard-sanitize.js +7 -0
- package/dist/runtime/dashboard-sanitize.js.map +1 -0
- package/dist/runtime/dashboard-workspace.js +5 -1
- package/dist/runtime/dashboard-workspace.js.map +1 -1
- package/dist/runtime/dashboard.d.ts +1 -1
- package/dist/runtime/dashboard.js +2 -3
- package/dist/runtime/dashboard.js.map +1 -1
- package/dist/runtime/definition.d.ts +6 -1
- package/dist/runtime/definition.js +42 -2
- package/dist/runtime/definition.js.map +1 -1
- package/dist/runtime/native-owner.js +7 -1
- package/dist/runtime/native-owner.js.map +1 -1
- package/dist/runtime/pagination.d.ts +9 -0
- package/dist/runtime/pagination.js +36 -0
- package/dist/runtime/pagination.js.map +1 -0
- package/dist/runtime/sdk-observation.d.ts +8 -0
- package/dist/runtime/sdk-observation.js +75 -0
- package/dist/runtime/sdk-observation.js.map +1 -0
- package/dist/runtime/sdk-projection.d.ts +8 -0
- package/dist/runtime/sdk-projection.js +19 -0
- package/dist/runtime/sdk-projection.js.map +1 -0
- package/dist/runtime/sdk-service.d.ts +11 -0
- package/dist/runtime/sdk-service.js +109 -0
- package/dist/runtime/sdk-service.js.map +1 -0
- package/dist/runtime/select-native.d.ts +4 -1
- package/dist/runtime/select-native.js +28 -13
- package/dist/runtime/select-native.js.map +1 -1
- package/dist/runtime/service.d.ts +11 -1
- package/dist/runtime/service.js +178 -3
- package/dist/runtime/service.js.map +1 -1
- package/dist/runtime/session-launcher.js +1 -1
- package/dist/runtime/session-launcher.js.map +1 -1
- package/dist/runtime/snapshots.d.ts +103 -0
- package/dist/runtime/snapshots.js +124 -0
- package/dist/runtime/snapshots.js.map +1 -0
- package/dist/runtime/state.d.ts +26 -0
- package/dist/runtime/state.js +86 -17
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/task-data.d.ts +38 -0
- package/dist/runtime/task-data.js +2 -0
- package/dist/runtime/task-data.js.map +1 -0
- package/dist/runtime/transport.d.ts +13 -0
- package/dist/runtime/transport.js +166 -0
- package/dist/runtime/transport.js.map +1 -0
- package/dist/runtime/types.d.ts +28 -9
- package/dist/runtime/types.js.map +1 -1
- package/dist/runtime/worker-client.js +40 -13
- package/dist/runtime/worker-client.js.map +1 -1
- package/dist/runtime/worker-server.js +105 -24
- package/dist/runtime/worker-server.js.map +1 -1
- package/dist/sdk/connected-types.d.ts +42 -0
- package/dist/sdk/connected-types.js +2 -0
- package/dist/sdk/connected-types.js.map +1 -0
- package/dist/sdk/connected.d.ts +3 -0
- package/dist/sdk/connected.js +232 -0
- package/dist/sdk/connected.js.map +1 -0
- package/dist/sdk/definitions.d.ts +4 -1
- package/dist/sdk/definitions.js +16 -2
- package/dist/sdk/definitions.js.map +1 -1
- package/dist/sdk/execution-definition.d.ts +3 -0
- package/dist/sdk/execution-definition.js +59 -0
- package/dist/sdk/execution-definition.js.map +1 -0
- package/dist/sdk/execution-driver.d.ts +6 -0
- package/dist/sdk/execution-driver.js +86 -0
- package/dist/sdk/execution-driver.js.map +1 -0
- package/dist/sdk/execution-observation.d.ts +3 -0
- package/dist/sdk/execution-observation.js +35 -0
- package/dist/sdk/execution-observation.js.map +1 -0
- package/dist/sdk/execution-options.d.ts +17 -0
- package/dist/sdk/execution-options.js +115 -0
- package/dist/sdk/execution-options.js.map +1 -0
- package/dist/sdk/execution-types.d.ts +72 -0
- package/dist/sdk/execution-types.js +2 -0
- package/dist/sdk/execution-types.js.map +1 -0
- package/dist/sdk/execution.d.ts +3 -0
- package/dist/sdk/execution.js +3 -0
- package/dist/sdk/execution.js.map +1 -0
- package/dist/sdk/hosted-error.d.ts +3 -0
- package/dist/sdk/hosted-error.js +14 -0
- package/dist/sdk/hosted-error.js.map +1 -0
- package/dist/sdk/hosted.d.ts +23 -0
- package/dist/sdk/hosted.js +204 -0
- package/dist/sdk/hosted.js.map +1 -0
- package/dist/sdk/permission-validation.js +10 -1
- package/dist/sdk/permission-validation.js.map +1 -1
- package/dist/sdk/runner.d.ts +5 -0
- package/dist/sdk/runner.js +107 -0
- package/dist/sdk/runner.js.map +1 -0
- package/dist/sdk/tools.js +4 -1
- package/dist/sdk/tools.js.map +1 -1
- package/dist/sdk/types.d.ts +29 -1
- package/dist/sdk/types.js.map +1 -1
- package/package.json +6 -3
- package/sdk/access-config.md +60 -4
- package/sdk/adapter-contract.md +13 -3
- package/sdk/additional-harnesses.md +43 -0
- package/sdk/agent-skill.md +2 -2
- package/sdk/agent.md +6 -4
- package/sdk/approvals.md +5 -1
- package/sdk/authentication.md +1 -1
- package/sdk/cli/dashboard-design.md +6 -0
- package/sdk/cli/index.md +9 -6
- package/sdk/cli/output.md +3 -1
- package/sdk/completion-notifications.md +2 -0
- package/sdk/config.md +1 -1
- package/sdk/copilot.md +53 -0
- package/sdk/cursor.md +68 -0
- package/sdk/diagnostics.md +29 -0
- package/sdk/distribution.md +5 -3
- package/sdk/evals.md +1 -1
- package/sdk/examples/chat-tool.ts +126 -0
- package/sdk/execution.md +743 -0
- package/sdk/fx.md +50 -5
- package/sdk/harnesses.md +13 -13
- package/sdk/index.md +45 -20
- package/sdk/message-delivery.md +2 -0
- package/sdk/opencode.md +57 -0
- package/sdk/permissions.md +6 -2
- package/sdk/plugins/sub-agents.md +4 -2
- package/sdk/project-team.md +25 -1
- package/sdk/sessions.md +2 -0
- package/sdk/tools.md +4 -2
- package/sdk/v1-runtime.md +8 -6
- package/dist/cli/catalog.d.ts +0 -26
- package/dist/cli/catalog.js +0 -41
- package/dist/cli/catalog.js.map +0 -1
|
@@ -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"]}
|
package/dist/adapters/rpc.d.ts
CHANGED
|
@@ -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 {};
|
package/dist/adapters/rpc.js
CHANGED
|
@@ -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", () =>
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/adapters/rpc.js.map
CHANGED
|
@@ -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"]}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export type AccessType = "subscription" | "api-key" | "vercel-api-key" | "vercel
|
|
|
10
10
|
export interface ResolvedAccess {
|
|
11
11
|
type: AccessType;
|
|
12
12
|
token?: string;
|
|
13
|
+
provider?: string;
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
wireApi?: "completions" | "responses";
|
|
16
|
+
apiVersion?: string;
|
|
17
|
+
wireModel?: string;
|
|
13
18
|
}
|
|
14
19
|
export interface AdapterOptions {
|
|
15
20
|
agent: ExecutionDefinition;
|
|
@@ -1 +1 @@
|
|
|
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}\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"]}
|
|
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"]}
|
|
@@ -38,7 +38,7 @@ export interface ApprovalSchema {
|
|
|
38
38
|
}
|
|
39
39
|
export interface NativeApprovalRequest {
|
|
40
40
|
kind: "permission";
|
|
41
|
-
harness: "codex" | "claudeCode" | "fx";
|
|
41
|
+
harness: "codex" | "claudeCode" | "fx" | "opencode" | "copilot" | "cursor";
|
|
42
42
|
message: string;
|
|
43
43
|
requestedSchema: ApprovalSchema;
|
|
44
44
|
context?: Record<string, unknown>;
|
|
@@ -1 +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\";\n message: string;\n requestedSchema: ApprovalSchema;\n context?: Record<string, unknown>;\n}\nexport type ApprovalHandler = (request: NativeApprovalRequest, signal: AbortSignal) => Promise<ApprovalContent>;\n"]}
|
|
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"]}
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ 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';
|
package/dist/cli/args.js
CHANGED
|
@@ -5,7 +5,7 @@ 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
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)
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolve } from 'node:path';\nimport { AgentError } from '../errors.js';\nimport { MAX_PROMPT_BYTES, readPromptInput, readApprovalInput, type PromptStream } from './input.js';\n\nexport type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'respond' | 'help' | 'version';\nexport interface Arguments {\n command: Command; id?: string; cwd: string; prompt?: string; after?: string;\n delivery: 'queue' | 'steer' | 'interrupt'; format: 'text' | 'jsonl'; full: boolean; detach: boolean;\n harness?: 'codex' | 'claudeCode' | 'fx'; model?: string; effort?: string;\n helpCommand?: 'run' | 'check';\n content?: Record<string,unknown>;\n}\nconst options: Record<string, string[]> = {\n list: ['cwd'], dashboard: [], check: ['cwd','model','effort'], run: ['cwd','prompt','prompt-file','model','effort','detach'], send: ['delivery','prompt','prompt-file','detach'],\n wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [], respond:['content','content-file'],\n};\nconst directTargets = {codex:'codex',claude:'claudeCode',fx:'fx'} as const;\nconst claudeEfforts = new Set(['low','medium','high','xhigh','max']);\nconst fail = (message: string): never => { throw new AgentError('INVALID_ARGUMENT', message); };\n\nexport async function parseArgs(\n argv: string[], cwd = process.cwd(), dependencies: {stdin?: PromptStream} = {},\n): Promise<Arguments> {\n if (!argv.length) return defaults('help', cwd);\n if (argv[0] === '--help' || argv[0] === '--version') {\n if (argv.length !== 1) fail(`${argv[0]} cannot be combined with other options.`);\n return defaults(argv[0] === '--help' ? 'help' : 'version', cwd);\n }\n const command = argv[0]!;\n if (!Object.hasOwn(options, command)) fail(`Unknown command: ${command}. Use subharness --help.`);\n const values: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n let parseOptions = true;\n for (let i = 1; i < argv.length; i++) {\n const argument = argv[i]!;\n if (parseOptions && argument === '--') { parseOptions = false; continue; }\n if (!parseOptions || !argument.startsWith('--')) { positionals.push(argument); continue; }\n const name = argument.slice(2);\n if ((name !== 'format' || command === 'dashboard') && name !== 'help' && !options[command]!.includes(name)) fail(`Unknown option: ${argument}`);\n if (name in values) fail(`Duplicate option: ${argument}`);\n if (name === 'full' || name === 'help' || name === 'detach') values[name] = true;\n else {\n const value = argv[++i];\n if (value === undefined || (name !== 'prompt' && value.startsWith('--'))) fail(`Missing value for ${argument}`);\n values[name] = value!;\n }\n }\n if (command === 'dashboard' && positionals.length) fail('Expected no identifier for dashboard.');\n if (values.help === true) {\n if (Object.keys(values).some(name => name !== 'help')) fail('--help cannot be combined with other options.');\n const target = (command === 'run' || command === 'check') && positionals[0] && Object.hasOwn(directTargets, positionals[0])\n ? directTargets[positionals[0] as keyof typeof directTargets] : undefined;\n return {...defaults('help', cwd), ...(target ? {id: positionals[0], harness: target, helpCommand: command as 'run' | 'check'} : {})};\n }\n const promptCommand = command === 'run' || command === 'send';\n const identifierCount = command === 'list' || command === 'dashboard' ? 0 : 1;\n if (positionals.length < identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (!promptCommand && positionals.length !== identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (promptCommand && positionals.length > 2) fail(`Expected one positional prompt for ${command}.`);\n const format = values.format ?? 'text';\n if (format !== 'text' && format !== 'jsonl') fail('Format must be text or jsonl.');\n const delivery = values.delivery ?? 'queue';\n if (!['queue','steer','interrupt'].includes(String(delivery))) fail('Delivery must be queue, steer, or interrupt.');\n if (values.detach === true && delivery === 'steer') fail('--detach cannot be combined with --delivery steer.');\n const result = {...defaults(command as Command, cwd), id: positionals[0], format, delivery,\n cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true, detach: values.detach === true} as Arguments;\n if (command === 'run' || command === 'check') {\n const direct = Object.hasOwn(directTargets, result.id!)\n ? directTargets[result.id! as keyof typeof directTargets] : undefined;\n if (direct) result.harness = direct;\n if ('model' in values || 'effort' in values) {\n if (!direct) fail('--model and --effort are available only for direct harness targets.');\n if ('model' in values && !String(values.model).trim()) fail('Model must contain text.');\n if ('effort' in values && !String(values.effort).trim()) fail('Effort must contain text.');\n if (direct === 'claudeCode' && 'effort' in values && !claudeEfforts.has(String(values.effort))) {\n fail('Claude effort must be low, medium, high, xhigh, or max.');\n }\n if ('model' in values) result.model = String(values.model);\n if ('effort' in values) result.effort = String(values.effort);\n }\n }\n if (command === 'run' || command === 'send') {\n const positionalPrompt = positionals[1];\n if (Number(positionalPrompt !== undefined) + Number('prompt' in values) + Number('prompt-file' in values) !== 1) {\n fail('Supply exactly one prompt source: one positional prompt, --prompt, or --prompt-file.');\n }\n if ('prompt-file' in values) {\n result.prompt = await readPromptInput(String(values['prompt-file']), cwd, dependencies.stdin);\n } else result.prompt = positionalPrompt ?? String(values.prompt);\n if (!result.prompt?.trim()) fail('Prompt must contain text.');\n if (Buffer.byteLength(result.prompt!) > MAX_PROMPT_BYTES) fail('Prompt exceeds 1 MiB.');\n }\n if (command === 'wait') {\n if ('after' in values) {\n if (!values.after) fail('wait requires --after <response-id>.');\n result.after = String(values.after);\n }\n }\n if (command === 'respond') {\n if (Number('content' in values) + Number('content-file' in values) !== 1)\n fail('Supply exactly one approval response source: --content or --content-file.');\n const text = 'content-file' in values\n ? await readApprovalInput(String(values['content-file']),cwd,dependencies.stdin) : String(values.content);\n if (Buffer.byteLength(text) > 16 * 1024) fail('Approval content exceeds 16 KiB.');\n let content: unknown;\n try { content = JSON.parse(text); } catch { fail('Approval content must be valid JSON.'); }\n if (!content || typeof content !== 'object' || Array.isArray(content)) fail('Approval content must be a JSON object.');\n result.content = content as Record<string,unknown>;\n }\n return result;\n}\nfunction defaults(command: Command, cwd: string): Arguments {\n return {command,cwd,delivery:'queue',format:'text',full:false,detach:false};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolve } from 'node:path';\nimport { AgentError } from '../errors.js';\nimport { MAX_PROMPT_BYTES, readPromptInput, readApprovalInput, type PromptStream } from './input.js';\n\nexport type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'respond' | 'help' | 'version';\nexport interface Arguments {\n command: Command; id?: string; cwd: string; prompt?: string; after?: string;\n delivery: 'queue' | 'steer' | 'interrupt'; format: 'text' | 'jsonl'; full: boolean; detach: boolean;\n harness?: 'codex' | 'claudeCode' | 'fx' | 'opencode' | 'copilot' | 'cursor'; model?: string; effort?: string;\n helpCommand?: 'run' | 'check';\n content?: Record<string,unknown>;\n}\nconst options: Record<string, string[]> = {\n list: ['cwd'], dashboard: [], check: ['cwd','model','effort'], run: ['cwd','prompt','prompt-file','model','effort','detach'], send: ['delivery','prompt','prompt-file','detach'],\n wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [], respond:['content','content-file'],\n};\nconst directTargets = {codex:'codex',claude:'claudeCode',fx:'fx',opencode:'opencode',copilot:'copilot',cursor:'cursor'} as const;\nconst claudeEfforts = new Set(['low','medium','high','xhigh','max']);\nconst fail = (message: string): never => { throw new AgentError('INVALID_ARGUMENT', message); };\n\nexport async function parseArgs(\n argv: string[], cwd = process.cwd(), dependencies: {stdin?: PromptStream} = {},\n): Promise<Arguments> {\n if (!argv.length) return defaults('help', cwd);\n if (argv[0] === '--help' || argv[0] === '--version') {\n if (argv.length !== 1) fail(`${argv[0]} cannot be combined with other options.`);\n return defaults(argv[0] === '--help' ? 'help' : 'version', cwd);\n }\n const command = argv[0]!;\n if (!Object.hasOwn(options, command)) fail(`Unknown command: ${command}. Use subharness --help.`);\n const values: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n let parseOptions = true;\n for (let i = 1; i < argv.length; i++) {\n const argument = argv[i]!;\n if (parseOptions && argument === '--') { parseOptions = false; continue; }\n if (!parseOptions || !argument.startsWith('--')) { positionals.push(argument); continue; }\n const name = argument.slice(2);\n if ((name !== 'format' || command === 'dashboard') && name !== 'help' && !options[command]!.includes(name)) fail(`Unknown option: ${argument}`);\n if (name in values) fail(`Duplicate option: ${argument}`);\n if (name === 'full' || name === 'help' || name === 'detach') values[name] = true;\n else {\n const value = argv[++i];\n if (value === undefined || (name !== 'prompt' && value.startsWith('--'))) fail(`Missing value for ${argument}`);\n values[name] = value!;\n }\n }\n if (command === 'dashboard' && positionals.length) fail('Expected no identifier for dashboard.');\n if (values.help === true) {\n if (Object.keys(values).some(name => name !== 'help')) fail('--help cannot be combined with other options.');\n const target = (command === 'run' || command === 'check') && positionals[0] && Object.hasOwn(directTargets, positionals[0])\n ? directTargets[positionals[0] as keyof typeof directTargets] : undefined;\n return {...defaults('help', cwd), ...(target ? {id: positionals[0], harness: target, helpCommand: command as 'run' | 'check'} : {})};\n }\n const promptCommand = command === 'run' || command === 'send';\n const identifierCount = command === 'list' || command === 'dashboard' ? 0 : 1;\n if (positionals.length < identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (!promptCommand && positionals.length !== identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (promptCommand && positionals.length > 2) fail(`Expected one positional prompt for ${command}.`);\n const format = values.format ?? 'text';\n if (format !== 'text' && format !== 'jsonl') fail('Format must be text or jsonl.');\n const delivery = values.delivery ?? 'queue';\n if (!['queue','steer','interrupt'].includes(String(delivery))) fail('Delivery must be queue, steer, or interrupt.');\n if (values.detach === true && delivery === 'steer') fail('--detach cannot be combined with --delivery steer.');\n const result = {...defaults(command as Command, cwd), id: positionals[0], format, delivery,\n cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true, detach: values.detach === true} as Arguments;\n if (command === 'run' || command === 'check') {\n const direct = Object.hasOwn(directTargets, result.id!)\n ? directTargets[result.id! as keyof typeof directTargets] : undefined;\n if (direct) result.harness = direct;\n if ('model' in values || 'effort' in values) {\n if (!direct) fail('--model and --effort are available only for direct harness targets.');\n if ('model' in values && !String(values.model).trim()) fail('Model must contain text.');\n if ('effort' in values && !String(values.effort).trim()) fail('Effort must contain text.');\n if (direct === 'claudeCode' && 'effort' in values && !claudeEfforts.has(String(values.effort))) {\n fail('Claude effort must be low, medium, high, xhigh, or max.');\n }\n if ((direct === 'opencode' || direct === 'copilot' || direct === 'cursor') && 'effort' in values) {\n fail(`${result.id} does not support --effort.`);\n }\n if ('model' in values) result.model = String(values.model);\n if ('effort' in values) result.effort = String(values.effort);\n }\n }\n if (command === 'run' || command === 'send') {\n const positionalPrompt = positionals[1];\n if (Number(positionalPrompt !== undefined) + Number('prompt' in values) + Number('prompt-file' in values) !== 1) {\n fail('Supply exactly one prompt source: one positional prompt, --prompt, or --prompt-file.');\n }\n if ('prompt-file' in values) {\n result.prompt = await readPromptInput(String(values['prompt-file']), cwd, dependencies.stdin);\n } else result.prompt = positionalPrompt ?? String(values.prompt);\n if (!result.prompt?.trim()) fail('Prompt must contain text.');\n if (Buffer.byteLength(result.prompt!) > MAX_PROMPT_BYTES) fail('Prompt exceeds 1 MiB.');\n }\n if (command === 'wait') {\n if ('after' in values) {\n if (!values.after) fail('wait requires --after <response-id>.');\n result.after = String(values.after);\n }\n }\n if (command === 'respond') {\n if (Number('content' in values) + Number('content-file' in values) !== 1)\n fail('Supply exactly one approval response source: --content or --content-file.');\n const text = 'content-file' in values\n ? await readApprovalInput(String(values['content-file']),cwd,dependencies.stdin) : String(values.content);\n if (Buffer.byteLength(text) > 16 * 1024) fail('Approval content exceeds 16 KiB.');\n let content: unknown;\n try { content = JSON.parse(text); } catch { fail('Approval content must be valid JSON.'); }\n if (!content || typeof content !== 'object' || Array.isArray(content)) fail('Approval content must be a JSON object.');\n result.content = content as Record<string,unknown>;\n }\n return result;\n}\nfunction defaults(command: Command, cwd: string): Arguments {\n return {command,cwd,delivery:'queue',format:'text',full:false,detach:false};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-worker.js","sourceRoot":"","sources":["../../src/cli/catalog-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAoE,EAAE,EAAE;IACnJ,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc;YAC5B,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,UAAU,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChI,KAAK,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAAC,CAAC;IACxD,6FAA6F;IAC7F,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAmB,EAAE,EAAE,GAAG,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC","sourcesContent":["import { discover, loadDefinition } from \"../config/loader.js\";\nimport { errorInfo } from \"../errors.js\";\nimport type { ExecutionReference } from \"../runtime/types.js\";\nimport type { CatalogReply } from \"
|
|
1
|
+
{"version":3,"file":"catalog-worker.js","sourceRoot":"","sources":["../../src/cli/catalog-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAoE,EAAE,EAAE;IACnJ,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc;YAC5B,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,UAAU,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChI,KAAK,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAAC,CAAC;IACxD,6FAA6F;IAC7F,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAmB,EAAE,EAAE,GAAG,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC","sourcesContent":["import { discover, loadDefinition } from \"../config/loader.js\";\nimport { errorInfo } from \"../errors.js\";\nimport type { ExecutionReference } from \"../runtime/types.js\";\nimport type { CatalogReply } from \"../runtime/catalog.js\";\n\nprocess.on(\"disconnect\", () => process.exit());\nprocess.once(\"message\", async ({ cwd, parent, discover: shouldDiscover = true }: { cwd: string; parent?: ExecutionReference; discover?: boolean }) => {\n let reply: CatalogReply;\n try {\n const entries = shouldDiscover\n ? (await discover(cwd)).map(({ id, name, description, scope, file }) => ({ id, name, description, scope, file }))\n : [];\n const definition = parent && 'file' in parent ? await loadDefinition(parent.file, parent.subagents) : undefined;\n const children = Object.entries(definition?.subagents ?? {}).map(([name, child]) => ({ name, description: child.description }));\n reply = { result: { entries, children } };\n } catch (error) { reply = { error: errorInfo(error) }; }\n // Wait until the caller receives the result, then end any timers created by trusted modules.\n process.once(\"message\", () => process.exit());\n process.send?.(reply, (error: Error | null) => { if (error) process.exit(1); });\n});\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isAbsolute } from 'node:path';
|
|
2
2
|
import { AgentError } from '../errors.js';
|
|
3
|
-
|
|
3
|
+
import { CoordinatorTransport } from '../runtime/transport.js';
|
|
4
|
+
const harnesses = new Set(['codex', 'claude', 'fx', 'opencode', 'copilot', 'cursor', 'pending']);
|
|
4
5
|
const states = new Set(['queued', 'running', 'waiting', 'awaiting_approval', 'completed', 'failed', 'cancelled', 'interrupted']);
|
|
5
6
|
const finishedStates = new Set(['completed', 'cancelled', 'interrupted']);
|
|
6
7
|
const timestamp = (value) => value === undefined || (typeof value === 'number' && Number.isFinite(value) && value >= 0);
|
|
@@ -145,15 +146,7 @@ function outdatedCoordinator(endpoint, capability = 'overview') {
|
|
|
145
146
|
export async function fetchDashboardSession(endpoint, id, signal, timeoutMs = 5_000) {
|
|
146
147
|
const bounded = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
147
148
|
try {
|
|
148
|
-
const
|
|
149
|
-
method: 'POST', headers: { authorization: `Bearer ${endpoint.token}`, 'content-type': 'application/json' },
|
|
150
|
-
body: JSON.stringify({ command: 'dashboard-session', id }), signal: bounded,
|
|
151
|
-
});
|
|
152
|
-
if (!response.ok) {
|
|
153
|
-
await response.body?.cancel();
|
|
154
|
-
throw new Error('Rejected session');
|
|
155
|
-
}
|
|
156
|
-
const session = JSON.parse(await response.text());
|
|
149
|
+
const session = await dashboardRecord(endpoint, { command: 'dashboard-session', id }, bounded);
|
|
157
150
|
if (isLegacyUnknownOperation(session))
|
|
158
151
|
throw outdatedCoordinator(endpoint, 'session');
|
|
159
152
|
if (!isSession(session, id))
|
|
@@ -161,7 +154,7 @@ export async function fetchDashboardSession(endpoint, id, signal, timeoutMs = 5_
|
|
|
161
154
|
return session;
|
|
162
155
|
}
|
|
163
156
|
catch (error) {
|
|
164
|
-
if (error instanceof AgentError)
|
|
157
|
+
if (error instanceof AgentError && error.code !== 'OBSERVATION_CLOSED')
|
|
165
158
|
throw error;
|
|
166
159
|
throw new AgentError('COORDINATOR_UNAVAILABLE', 'The dashboard lost its connection to the local coordinator or received invalid session history.');
|
|
167
160
|
}
|
|
@@ -169,15 +162,7 @@ export async function fetchDashboardSession(endpoint, id, signal, timeoutMs = 5_
|
|
|
169
162
|
export async function fetchDashboardSnapshot(endpoint, signal, timeoutMs = 5_000) {
|
|
170
163
|
const bounded = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
171
164
|
try {
|
|
172
|
-
const
|
|
173
|
-
method: 'POST', headers: { authorization: `Bearer ${endpoint.token}`, 'content-type': 'application/json' },
|
|
174
|
-
body: JSON.stringify({ command: 'dashboard' }), signal: bounded,
|
|
175
|
-
});
|
|
176
|
-
if (!response.ok) {
|
|
177
|
-
await response.body?.cancel();
|
|
178
|
-
throw new Error('Rejected snapshot');
|
|
179
|
-
}
|
|
180
|
-
const snapshot = JSON.parse(await response.text());
|
|
165
|
+
const snapshot = await dashboardRecord(endpoint, { command: 'dashboard' }, bounded);
|
|
181
166
|
if (isLegacyUnknownOperation(snapshot))
|
|
182
167
|
throw outdatedCoordinator(endpoint);
|
|
183
168
|
if (!isSnapshot(snapshot))
|
|
@@ -188,7 +173,7 @@ export async function fetchDashboardSnapshot(endpoint, signal, timeoutMs = 5_000
|
|
|
188
173
|
return { ...snapshot, history: true, grouping: true };
|
|
189
174
|
}
|
|
190
175
|
catch (error) {
|
|
191
|
-
if (error instanceof AgentError)
|
|
176
|
+
if (error instanceof AgentError && error.code !== 'OBSERVATION_CLOSED')
|
|
192
177
|
throw error;
|
|
193
178
|
throw new AgentError('COORDINATOR_UNAVAILABLE', 'The dashboard lost its connection to the local coordinator or received an invalid snapshot.');
|
|
194
179
|
}
|
|
@@ -201,15 +186,7 @@ export async function fetchDashboardDetail(endpoint, id, signal, includePrompt =
|
|
|
201
186
|
if (knownResponseId !== undefined)
|
|
202
187
|
request.knownResponseId = knownResponseId;
|
|
203
188
|
try {
|
|
204
|
-
const
|
|
205
|
-
method: 'POST', headers: { authorization: `Bearer ${endpoint.token}`, 'content-type': 'application/json' },
|
|
206
|
-
body: JSON.stringify(request), signal: bounded,
|
|
207
|
-
});
|
|
208
|
-
if (!response.ok) {
|
|
209
|
-
await response.body?.cancel();
|
|
210
|
-
throw new Error('Rejected detail');
|
|
211
|
-
}
|
|
212
|
-
const detail = JSON.parse(await response.text());
|
|
189
|
+
const detail = await dashboardRecord(endpoint, request, bounded);
|
|
213
190
|
if (isLegacyUnknownOperation(detail))
|
|
214
191
|
throw outdatedCoordinator(endpoint, 'inspection');
|
|
215
192
|
if (!isDetail(detail, id, includePrompt, knownResponseId))
|
|
@@ -217,9 +194,21 @@ export async function fetchDashboardDetail(endpoint, id, signal, includePrompt =
|
|
|
217
194
|
return detail;
|
|
218
195
|
}
|
|
219
196
|
catch (error) {
|
|
220
|
-
if (error instanceof AgentError)
|
|
197
|
+
if (error instanceof AgentError && error.code !== 'OBSERVATION_CLOSED')
|
|
221
198
|
throw error;
|
|
222
199
|
throw new AgentError('COORDINATOR_UNAVAILABLE', 'The dashboard lost its connection to the local coordinator or received invalid task details.');
|
|
223
200
|
}
|
|
224
201
|
}
|
|
202
|
+
async function dashboardRecord(endpoint, body, signal) {
|
|
203
|
+
const transport = new CoordinatorTransport(endpoint);
|
|
204
|
+
let value;
|
|
205
|
+
let count = 0;
|
|
206
|
+
for await (const record of transport.records(body, signal, { allowFinalRecord: true })) {
|
|
207
|
+
value = record;
|
|
208
|
+
count++;
|
|
209
|
+
}
|
|
210
|
+
if (count !== 1)
|
|
211
|
+
throw new Error('Invalid dashboard response record count.');
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
225
214
|
//# sourceMappingURL=dashboard-client.js.map
|