@open330/oac 2026.4.3 → 2026.220.2

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 (38) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +2 -2
  3. package/dist/{chunk-YWIB3TRI.js → chunk-6A37SKAJ.js} +15 -2
  4. package/dist/chunk-6A37SKAJ.js.map +1 -0
  5. package/dist/{chunk-HDMLNOND.js → chunk-6JEFW6B7.js} +92 -20
  6. package/dist/chunk-6JEFW6B7.js.map +1 -0
  7. package/dist/{chunk-ZRYAHZQJ.js → chunk-7C7SC4TZ.js} +1 -1
  8. package/dist/{chunk-XUW3XWTX.js → chunk-LRTQCVQK.js} +145 -121
  9. package/dist/chunk-LRTQCVQK.js.map +1 -0
  10. package/dist/{chunk-CJAJ4MBO.js → chunk-OS3XDHOJ.js} +57 -18
  11. package/dist/chunk-OS3XDHOJ.js.map +1 -0
  12. package/dist/{chunk-7FWC3Z4W.js → chunk-QPVNC7S4.js} +479 -196
  13. package/dist/chunk-QPVNC7S4.js.map +1 -0
  14. package/dist/cli/cli.js +6 -6
  15. package/dist/cli/index.js +6 -6
  16. package/dist/completion/index.d.ts +5 -0
  17. package/dist/completion/index.js +49 -8
  18. package/dist/completion/index.js.map +1 -1
  19. package/dist/core/index.d.ts +16 -1
  20. package/dist/core/index.js +8 -4
  21. package/dist/dashboard/index.js +33 -24
  22. package/dist/dashboard/index.js.map +1 -1
  23. package/dist/discovery/index.d.ts +18 -2
  24. package/dist/discovery/index.js +4 -2
  25. package/dist/execution/index.d.ts +45 -1
  26. package/dist/execution/index.js +7 -3
  27. package/dist/repo/index.d.ts +2 -2
  28. package/dist/repo/index.js +1 -1
  29. package/dist/{types-CYCwgojB.d.ts → types-3_IAAxh5.d.ts} +1 -0
  30. package/docs/config-reference.md +271 -0
  31. package/docs/multi-agent-support-technical-spec.md +312 -0
  32. package/package.json +23 -18
  33. package/dist/chunk-7FWC3Z4W.js.map +0 -1
  34. package/dist/chunk-CJAJ4MBO.js.map +0 -1
  35. package/dist/chunk-HDMLNOND.js.map +0 -1
  36. package/dist/chunk-XUW3XWTX.js.map +0 -1
  37. package/dist/chunk-YWIB3TRI.js.map +0 -1
  38. /package/dist/{chunk-ZRYAHZQJ.js.map → chunk-7C7SC4TZ.js.map} +0 -0
@@ -0,0 +1,312 @@
1
+ # OAC Multi-Agent Support Technical Specification
2
+
3
+ ## 1. Objective
4
+ Add production-grade multi-agent execution to OAC with these outcomes:
5
+ 1. Claude Code adapter runs real `claude` CLI subprocesses (non-interactive, stream parsing, abort support).
6
+ 2. OpenCode adapter is added and runs real `opencode` CLI subprocesses.
7
+ 3. Tasks are routed by complexity:
8
+ - `trivial`, `simple` -> `codex`
9
+ - `moderate`, `complex` -> `claude-code`
10
+ 4. `oac run --provider` accepts comma-separated providers (example: `codex,claude-code`).
11
+ 5. Agent health checks and automatic fallback retries are applied when an agent fails.
12
+
13
+ ## 2. Current State Summary
14
+ 1. `CodexAdapter` is implemented and functional in `packages/execution/src/agents/codex.adapter.ts`.
15
+ 2. `ClaudeCodeAdapter` exists but is not integrated into `oac run` execution path.
16
+ 3. `ExecutionEngine` currently round-robins agents and has no routing-by-complexity or provider health state.
17
+ 4. `oac run` currently executes only Codex (or simulated execution) and accepts a single `--provider` string.
18
+ 5. Provider IDs are inconsistent (`codex` vs `codex-cli`) across packages.
19
+
20
+ ## 3. Design Decisions
21
+ 1. Canonical runtime provider IDs for execution will be:
22
+ - `codex`
23
+ - `claude-code`
24
+ - `opencode`
25
+ 2. Legacy alias `codex-cli` will remain accepted at CLI/config boundaries and normalized to `codex`.
26
+ 3. Routing happens per task, using complexity-first preference and user-selected provider availability.
27
+ 4. Fallback is provider-level: if provider A fails, retry task on provider B before final failure.
28
+ 5. Health checking is run-level with lightweight in-memory state, not persisted.
29
+
30
+ ## 4. External CLI Contracts
31
+
32
+ ### 4.1 Claude Code subprocess contract
33
+ Use:
34
+ ```bash
35
+ claude -p "<prompt>" --output-format stream-json --verbose
36
+ ```
37
+ Process options:
38
+ - `cwd = params.workingDirectory`
39
+ - `env` includes inherited env + `params.env` + `OAC_TOKEN_BUDGET` + `OAC_ALLOW_COMMITS`
40
+ - `timeout = params.timeoutMs`
41
+
42
+ Parsing:
43
+ - Parse stream JSON lines when available.
44
+ - Emit `output`, `tokens`, `file_edit`, `tool_use`, and `error` events.
45
+ - Fall back to regex parsing for plain-text lines.
46
+
47
+ ### 4.2 OpenCode subprocess contract
48
+ Use:
49
+ ```bash
50
+ opencode run --format json "<prompt>"
51
+ ```
52
+ Process options:
53
+ - `cwd = params.workingDirectory`
54
+ - `env` includes inherited env + `params.env` + `OAC_TOKEN_BUDGET` + `OAC_ALLOW_COMMITS`
55
+ - `timeout = params.timeoutMs`
56
+
57
+ Parsing:
58
+ - Primary: JSON event lines from `--format json`.
59
+ - Fallback: plain text line heuristics for token/file/error events.
60
+
61
+ ## 5. File-by-File Changes
62
+
63
+ ### 5.1 `packages/core/src/types.ts`
64
+ 1. Update provider type for canonical + compatibility:
65
+ ```ts
66
+ export type AgentProviderId =
67
+ | "claude-code"
68
+ | "codex"
69
+ | "codex-cli"
70
+ | "opencode"
71
+ | (string & {});
72
+ ```
73
+ 2. No runtime behavior change in core.
74
+
75
+ ### 5.2 `packages/execution/src/agents/claude-code.adapter.ts`
76
+ 1. Keep `id = "claude-code"`.
77
+ 2. Ensure `execute()` uses `claude` CLI subprocess and structured output flags.
78
+ 3. Keep error normalization pattern aligned with Codex adapter:
79
+ - timeout -> `AGENT_TIMEOUT`
80
+ - OOM -> `AGENT_OOM`
81
+ - network -> `NETWORK_ERROR`
82
+ - default -> `AGENT_EXECUTION_FAILED`
83
+ 4. Keep `checkAvailability()` as `claude --version` with non-throwing availability object.
84
+ 5. Keep `abort()` SIGTERM then SIGKILL escalation with timer.
85
+
86
+ ### 5.3 `packages/execution/src/agents/opencode.adapter.ts` (new)
87
+ 1. Add new class implementing `AgentProvider`:
88
+ ```ts
89
+ export class OpenCodeAdapter implements AgentProvider {
90
+ public readonly id: AgentProviderId = "opencode";
91
+ public readonly name = "OpenCode CLI";
92
+
93
+ public async checkAvailability(): Promise<AgentAvailability>;
94
+ public execute(params: AgentExecuteParams): AgentExecution;
95
+ public async estimateTokens(params: TokenEstimateParams): Promise<TokenEstimate>;
96
+ public async abort(executionId: string): Promise<void>;
97
+ }
98
+ ```
99
+ 2. Implementation mirrors Codex/Claude adapter behavior:
100
+ - subprocess lifecycle map (`runningExecutions`)
101
+ - async event queue streaming
102
+ - structured + heuristic parsing
103
+ - normalized `AgentResult`
104
+ 3. `checkAvailability()` command: `opencode --version`.
105
+ 4. `execute()` command: `opencode run --format json <prompt>`.
106
+
107
+ ### 5.4 `packages/execution/src/index.ts`
108
+ 1. Export new adapter:
109
+ ```ts
110
+ export * from "./agents/opencode.adapter.js";
111
+ ```
112
+
113
+ ### 5.5 `packages/execution/src/engine.ts`
114
+ Add routing + health + fallback behavior.
115
+
116
+ #### 5.5.1 Type updates
117
+ 1. Extend `Job`:
118
+ ```ts
119
+ attemptedProviders: AgentProviderId[];
120
+ preferredProviders: AgentProviderId[];
121
+ ```
122
+ 2. Add internal health state:
123
+ ```ts
124
+ interface ProviderHealthState {
125
+ providerId: AgentProviderId;
126
+ available: boolean;
127
+ version?: string;
128
+ lastError?: string;
129
+ consecutiveFailures: number;
130
+ checkedAt: number;
131
+ }
132
+ ```
133
+
134
+ #### 5.5.2 New private members
135
+ ```ts
136
+ private readonly providerById: Map<AgentProviderId, AgentProvider>;
137
+ private readonly providerHealth: Map<AgentProviderId, ProviderHealthState>;
138
+ ```
139
+
140
+ #### 5.5.3 New private methods
141
+ ```ts
142
+ private async initializeProviderHealth(): Promise<void>;
143
+ private computePreferredProviders(task: Task): AgentProviderId[];
144
+ private selectAgentForJob(job: Job): AgentProvider;
145
+ private recordProviderSuccess(providerId: AgentProviderId): void;
146
+ private recordProviderFailure(providerId: AgentProviderId, error: OacError): void;
147
+ private canFallback(job: Job): boolean;
148
+ private scheduleFallback(job: Job): boolean;
149
+ ```
150
+
151
+ #### 5.5.4 Routing logic
152
+ 1. `computePreferredProviders(task)` returns ordered list:
153
+ - `trivial/simple`: `["codex", "claude-code", "opencode"]`
154
+ - `moderate/complex`: `["claude-code", "codex", "opencode"]`
155
+ 2. Order is filtered by providers passed into engine constructor and current health.
156
+ 3. On each job attempt, `selectAgentForJob(job)` picks first provider not already in `job.attemptedProviders`.
157
+
158
+ #### 5.5.5 Fallback logic
159
+ 1. If execution fails and any untried healthy provider remains, schedule immediate retry on fallback provider.
160
+ 2. If no untried provider remains, apply existing transient retry rules.
161
+ 3. Mark provider health failures on:
162
+ - `AGENT_TIMEOUT`
163
+ - `AGENT_OOM`
164
+ - `AGENT_RATE_LIMITED`
165
+ - `NETWORK_ERROR`
166
+ - `AGENT_EXECUTION_FAILED`
167
+ 4. Reset consecutive failures after a successful task on that provider.
168
+
169
+ ### 5.6 `packages/cli/src/commands/run.ts`
170
+
171
+ #### 5.6.1 Option parsing
172
+ 1. Keep flag name, change semantics:
173
+ ```ts
174
+ .option("--provider <ids>", "Comma-separated provider ids (e.g. codex,claude-code)")
175
+ ```
176
+ 2. Replace single-provider resolver:
177
+ ```ts
178
+ function resolveProviderIds(providerOption: string | undefined, config: OacConfig | null): AgentProviderId[];
179
+ function parseProviderIds(input: string): AgentProviderId[];
180
+ function normalizeProviderId(input: string): AgentProviderId;
181
+ ```
182
+ 3. Supported user inputs:
183
+ - `codex`, `codex-cli` -> `codex`
184
+ - `claude-code`
185
+ - `opencode`
186
+ 4. Deduplicate providers while preserving order.
187
+ 5. Validation errors are user-facing, fail fast.
188
+
189
+ #### 5.6.2 Adapter bootstrap
190
+ 1. Add provider factory:
191
+ ```ts
192
+ function createRequestedAdapters(providerIds: AgentProviderId[]): AgentProvider[];
193
+ ```
194
+ 2. Instantiate only requested adapters.
195
+ 3. Run `checkAvailability()` for all requested providers at start.
196
+
197
+ #### 5.6.3 Health-aware execution setup
198
+ 1. Build `healthyProviders` list from availability checks.
199
+ 2. Fail run if none are healthy.
200
+ 3. If subset healthy, continue and print warning listing disabled providers.
201
+
202
+ #### 5.6.4 Routing during execution stage
203
+ 1. Replace Codex-only path with provider-routed path:
204
+ ```ts
205
+ async function executeWithRouting(input: {
206
+ task: Task;
207
+ estimate: TokenEstimate;
208
+ providerIds: AgentProviderId[];
209
+ adapters: Map<AgentProviderId, AgentProvider>;
210
+ repoPath: string;
211
+ baseBranch: string;
212
+ timeoutSeconds: number;
213
+ }): Promise<{ execution: ExecutionOutcome; sandbox: SandboxInfo }>;
214
+ ```
215
+ 2. `executeWithRouting()` chooses preferred provider by task complexity and fallbacks if needed.
216
+ 3. Preserve existing sandbox + commit + PR flow.
217
+
218
+ #### 5.6.5 Token estimation changes
219
+ 1. Replace `estimateTaskMap(tasks, providerId)` with provider-aware selection:
220
+ ```ts
221
+ async function estimateTaskMap(
222
+ tasks: Task[],
223
+ providerSelector: (task: Task) => AgentProviderId,
224
+ ): Promise<Map<string, TokenEstimate>>;
225
+ ```
226
+ 2. For each task, estimate using preferred provider selected by complexity and provider availability.
227
+
228
+ #### 5.6.6 CLI UX changes
229
+ 1. Startup output includes:
230
+ - requested providers
231
+ - availability status per provider
232
+ - routing policy summary
233
+ 2. Per-task verbose output includes selected provider.
234
+ 3. On fallback, log one-line message:
235
+ - `Task <id>: <failed-provider> failed (<code>), retrying with <fallback-provider>`
236
+ 4. Summary output changes:
237
+ - `provider` -> comma-joined provider list for text mode
238
+ - JSON summary adds `providers: string[]`
239
+
240
+ ### 5.7 `packages/budget/src/estimator.ts`
241
+ 1. Update local provider type alias to include `codex` and legacy alias.
242
+ 2. Keep counter selection:
243
+ - `claude-code` -> Claude counter
244
+ - `codex`, `codex-cli`, `opencode` -> Codex counter (initially)
245
+
246
+ ## 6. Error Handling Patterns
247
+
248
+ ### 6.1 Adapter-level patterns
249
+ 1. `checkAvailability()` never throws; returns `{ available: false, error }`.
250
+ 2. `execute()` may reject with normalized `OacError` only.
251
+ 3. Non-zero exit code without throw returns `success: false` result with extracted error text.
252
+ 4. Timeouts map to `AGENT_TIMEOUT`.
253
+
254
+ ### 6.2 Engine/CLI fallback patterns
255
+ 1. Retry with alternate provider first when available.
256
+ 2. Use backoff only when cycling retry attempts after fallback options are exhausted.
257
+ 3. Fail final job with last normalized `OacError` and include context:
258
+ - `attempt`
259
+ - `providersTried`
260
+ - `taskId`
261
+ - `jobId`
262
+
263
+ ### 6.3 Input validation errors (`oac run`)
264
+ 1. Unknown provider ID -> throw with allowed values list.
265
+ 2. Empty provider list after parsing -> throw.
266
+ 3. Duplicate IDs are silently deduplicated.
267
+
268
+ ## 7. Test Plan
269
+
270
+ ### 7.1 New tests
271
+ 1. `packages/execution/tests/claude-code-adapter.test.ts`
272
+ - availability success/failure
273
+ - subprocess args
274
+ - stream parsing
275
+ - timeout normalization
276
+ - abort behavior
277
+ 2. `packages/execution/tests/opencode-adapter.test.ts`
278
+ - same coverage shape as Codex/Claude adapters
279
+
280
+ ### 7.2 Engine tests update
281
+ File: `packages/execution/tests/engine.test.ts`
282
+ 1. Routes trivial/simple tasks to Codex first.
283
+ 2. Routes moderate/complex tasks to Claude first.
284
+ 3. Falls back to alternate provider on provider failure.
285
+ 4. Marks unavailable providers out of routing after failed health checks.
286
+
287
+ ### 7.3 CLI tests
288
+ Add: `packages/cli/tests/run.test.ts`
289
+ 1. Parses `--provider codex,claude-code` correctly.
290
+ 2. Normalizes `codex-cli` to `codex`.
291
+ 3. Rejects unknown providers.
292
+ 4. Uses available provider when one is unhealthy.
293
+ 5. Emits fallback message when first provider fails.
294
+
295
+ ## 8. Migration and Compatibility
296
+ 1. Backward compatibility:
297
+ - `codex-cli` accepted and normalized to `codex`.
298
+ 2. No breaking change to existing single-provider usage:
299
+ - `--provider claude-code` still valid.
300
+ 3. If config has `provider.id = "codex-cli"`, runtime behaves as `codex`.
301
+
302
+ ## 9. Implementation Order
303
+ 1. Add provider normalization and ID compatibility (`core`, `budget`, `cli`).
304
+ 2. Implement `OpenCodeAdapter` and finalize Claude subprocess flags/parsing.
305
+ 3. Add routing/fallback internals to `ExecutionEngine`.
306
+ 4. Update `oac run` to multi-provider parse, health check, routing, and fallback.
307
+ 5. Add tests and adjust README command examples.
308
+
309
+ ## 10. Out of Scope
310
+ 1. Dashboard multi-agent wiring (`packages/dashboard`) in this change set.
311
+ 2. Persisted cross-run health state.
312
+ 3. Cost-based dynamic routing (future enhancement).
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@open330/oac",
3
- "version": "2026.4.3",
3
+ "version": "2026.220.2",
4
4
  "description": "Open Agent Contribution - automate open source contributions with AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/Open330/open-agent-contribution.git"
8
+ "url": "https://github.com/open330/open-agent-contribution.git"
9
9
  },
10
- "homepage": "https://github.com/Open330/open-agent-contribution",
10
+ "homepage": "https://github.com/open330/open-agent-contribution",
11
11
  "bugs": {
12
- "url": "https://github.com/Open330/open-agent-contribution/issues"
12
+ "url": "https://github.com/open330/open-agent-contribution/issues"
13
13
  },
14
14
  "type": "module",
15
15
  "main": "./dist/core/index.js",
@@ -25,13 +25,29 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
- "README.md"
28
+ "README.md",
29
+ "LICENSE",
30
+ "CHANGELOG.md",
31
+ "docs"
29
32
  ],
30
33
  "publishConfig": {
31
34
  "access": "public"
32
35
  },
33
36
  "engines": {
34
- "node": ">=24.0.0"
37
+ "node": ">=20.0.0"
38
+ },
39
+ "packageManager": "pnpm@9.15.4",
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "test": "vitest run",
43
+ "test:coverage": "vitest run --coverage",
44
+ "lint": "biome check .",
45
+ "lint:fix": "biome check --write .",
46
+ "format": "biome format --write .",
47
+ "typecheck": "tsc --noEmit",
48
+ "dev:dashboard": "tsx src/dashboard/dev.ts",
49
+ "clean": "rm -rf dist coverage",
50
+ "prepublishOnly": "pnpm build && pnpm test"
35
51
  },
36
52
  "dependencies": {
37
53
  "@fastify/cors": "^10.0.2",
@@ -64,16 +80,5 @@
64
80
  "tsx": "^4.19.0",
65
81
  "typescript": "^5.7.3",
66
82
  "vitest": "^3.0.5"
67
- },
68
- "scripts": {
69
- "build": "tsup",
70
- "test": "vitest run",
71
- "test:coverage": "vitest run --coverage",
72
- "lint": "biome check .",
73
- "lint:fix": "biome check --write .",
74
- "format": "biome format --write .",
75
- "typecheck": "tsc --noEmit",
76
- "dev:dashboard": "tsx src/dashboard/dev.ts",
77
- "clean": "rm -rf dist coverage"
78
83
  }
79
- }
84
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/execution/agents/claude-code.adapter.ts","../src/execution/agents/codex.adapter.ts","../src/execution/sandbox.ts","../src/execution/worker.ts","../src/execution/engine.ts"],"sourcesContent":["import { createInterface } from \"node:readline\";\n\nimport { execa } from \"execa\";\nimport {\n type AgentProviderId,\n OacError,\n type TokenEstimate,\n executionError,\n} from \"../../core/index.js\";\n\nimport type {\n AgentAvailability,\n AgentEvent,\n AgentExecuteParams,\n AgentExecution,\n AgentProvider,\n AgentResult,\n TokenEstimateParams,\n} from \"./agent.interface.js\";\n\ntype RunningProcess = ReturnType<typeof execa>;\n\ninterface TokenState {\n inputTokens: number;\n outputTokens: number;\n cumulativeTokens: number;\n}\n\ninterface TokenPatch {\n inputTokens?: number;\n outputTokens?: number;\n cumulativeTokens?: number;\n}\n\nclass AsyncEventQueue<T> implements AsyncIterable<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private done = false;\n private pendingError: unknown;\n\n public push(value: T): void {\n if (this.done) {\n return;\n }\n\n const nextResolver = this.resolvers.shift();\n if (nextResolver) {\n nextResolver({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n public close(): void {\n if (this.done) {\n return;\n }\n\n this.done = true;\n this.flush();\n }\n\n public fail(error: unknown): void {\n this.pendingError = error;\n this.done = true;\n this.flush();\n }\n\n public [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: async (): Promise<IteratorResult<T>> => {\n if (this.values.length > 0) {\n const value = this.values.shift();\n if (value === undefined) {\n return { done: true, value: undefined };\n }\n return { done: false, value };\n }\n\n if (this.pendingError !== undefined) {\n throw this.pendingError;\n }\n\n if (this.done) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n\n private flush(): void {\n for (const resolve of this.resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction parseJsonPayload(line: string): Record<string, unknown> | undefined {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n const candidates = [trimmed];\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const fragment = trimmed.slice(start, end + 1);\n if (fragment !== trimmed) {\n candidates.push(fragment);\n }\n }\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (isRecord(parsed)) {\n return parsed;\n }\n } catch {}\n }\n\n return undefined;\n}\n\nfunction patchTokenState(state: TokenState, patch: TokenPatch): AgentEvent | undefined {\n if (\n patch.inputTokens === undefined &&\n patch.outputTokens === undefined &&\n patch.cumulativeTokens === undefined\n ) {\n return undefined;\n }\n\n state.inputTokens = patch.inputTokens ?? state.inputTokens;\n state.outputTokens = patch.outputTokens ?? state.outputTokens;\n const computedTotal = state.inputTokens + state.outputTokens;\n state.cumulativeTokens = Math.max(\n state.cumulativeTokens,\n patch.cumulativeTokens ?? computedTotal,\n );\n\n return {\n type: \"tokens\",\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n cumulativeTokens: state.cumulativeTokens,\n };\n}\n\nfunction parseTokenPatchFromPayload(payload: Record<string, unknown>): TokenPatch {\n const usage = isRecord(payload.usage) ? payload.usage : undefined;\n return {\n inputTokens: readNumber(\n payload.inputTokens ??\n payload.input_tokens ??\n payload.promptTokens ??\n payload.prompt_tokens ??\n usage?.inputTokens ??\n usage?.input_tokens ??\n usage?.promptTokens ??\n usage?.prompt_tokens,\n ),\n outputTokens: readNumber(\n payload.outputTokens ??\n payload.output_tokens ??\n payload.completionTokens ??\n payload.completion_tokens ??\n usage?.outputTokens ??\n usage?.output_tokens ??\n usage?.completionTokens ??\n usage?.completion_tokens,\n ),\n cumulativeTokens: readNumber(\n payload.cumulativeTokens ??\n payload.cumulative_tokens ??\n payload.totalTokens ??\n payload.total_tokens ??\n usage?.cumulativeTokens ??\n usage?.cumulative_tokens ??\n usage?.totalTokens ??\n usage?.total_tokens,\n ),\n };\n}\n\nfunction parseTokenPatchFromLine(line: string): TokenPatch {\n const inputMatch = line.match(/(?:input|prompt)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n const outputMatch = line.match(/(?:output|completion)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n const totalMatch = line.match(/(?:total|cumulative|used)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n\n return {\n inputTokens: inputMatch ? Number.parseInt(inputMatch[1], 10) : undefined,\n outputTokens: outputMatch ? Number.parseInt(outputMatch[1], 10) : undefined,\n cumulativeTokens: totalMatch ? Number.parseInt(totalMatch[1], 10) : undefined,\n };\n}\n\nfunction parseTokenEvent(line: string, state: TokenState): AgentEvent | undefined {\n const payload = parseJsonPayload(line);\n const patch = payload ? parseTokenPatchFromPayload(payload) : parseTokenPatchFromLine(line);\n return patchTokenState(state, patch);\n}\n\nfunction normalizeFileAction(value: unknown): \"create\" | \"modify\" | \"delete\" | undefined {\n if (value !== \"create\" && value !== \"modify\" && value !== \"delete\") {\n return undefined;\n }\n return value;\n}\n\nfunction parseFileEditFromPayload(\n payload: Record<string, unknown>,\n): Extract<AgentEvent, { type: \"file_edit\" }> | undefined {\n if (payload.type === \"file_edit\") {\n const action = normalizeFileAction(payload.action);\n const path = readString(payload.path);\n if (action && path) {\n return {\n type: \"file_edit\",\n action,\n path,\n };\n }\n }\n\n const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);\n const input = isRecord(payload.input) ? payload.input : undefined;\n const inputPath = readString(input?.path ?? input?.file_path ?? input?.filePath);\n if (!tool || !inputPath) {\n return undefined;\n }\n\n if (tool === \"create_file\") {\n return { type: \"file_edit\", action: \"create\", path: inputPath };\n }\n if (tool === \"delete_file\") {\n return { type: \"file_edit\", action: \"delete\", path: inputPath };\n }\n if (tool === \"write_file\" || tool === \"edit_file\" || tool === \"replace_file\") {\n return { type: \"file_edit\", action: \"modify\", path: inputPath };\n }\n\n return undefined;\n}\n\nfunction parseFileEditFromLine(\n line: string,\n): Extract<AgentEvent, { type: \"file_edit\" }> | undefined {\n const fileActionMatch = line.match(/\\b(created|modified|deleted)\\s+(?:file\\s+)?([^\\s\"'`]+)/i);\n if (!fileActionMatch) {\n return undefined;\n }\n\n const actionMap: Record<string, \"create\" | \"modify\" | \"delete\"> = {\n created: \"create\",\n modified: \"modify\",\n deleted: \"delete\",\n };\n\n const action = actionMap[fileActionMatch[1].toLowerCase()];\n const path = fileActionMatch[2]?.trim();\n if (!action || !path) {\n return undefined;\n }\n\n return {\n type: \"file_edit\",\n action,\n path,\n };\n}\n\nfunction parseFileEditEvent(line: string): Extract<AgentEvent, { type: \"file_edit\" }> | undefined {\n const payload = parseJsonPayload(line);\n return payload ? parseFileEditFromPayload(payload) : parseFileEditFromLine(line);\n}\n\nfunction parseToolUseEvent(line: string): Extract<AgentEvent, { type: \"tool_use\" }> | undefined {\n const payload = parseJsonPayload(line);\n if (!payload) {\n return undefined;\n }\n\n const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);\n if (!tool) {\n return undefined;\n }\n\n return {\n type: \"tool_use\",\n tool,\n input: payload.input,\n };\n}\n\nfunction parseErrorEvent(\n line: string,\n stream: \"stdout\" | \"stderr\",\n): Extract<AgentEvent, { type: \"error\" }> | undefined {\n const payload = parseJsonPayload(line);\n if (payload?.type === \"error\") {\n const message = readString(payload.message) ?? \"Unknown Claude CLI error\";\n const recoverable = payload.recoverable !== false;\n return { type: \"error\", message, recoverable };\n }\n\n if (stream === \"stderr\" && /error|failed|exception/i.test(line)) {\n return { type: \"error\", message: line.trim(), recoverable: true };\n }\n\n return undefined;\n}\n\nfunction estimateTokenCount(text: string): number {\n if (text.length === 0) {\n return 0;\n }\n\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction normalizeUnknownError(error: unknown, executionId: string): OacError {\n if (error instanceof OacError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `Claude execution timed out for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n }\n\n if (/out of memory|ENOMEM|heap/i.test(message)) {\n return executionError(\"AGENT_OOM\", `Claude execution ran out of memory for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n }\n\n if (/network|ECONN|ENOTFOUND|EAI_AGAIN/i.test(message)) {\n return new OacError(\n \"Claude execution failed due to network issues\",\n \"NETWORK_ERROR\",\n \"recoverable\",\n {\n executionId,\n message,\n },\n error,\n );\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `Claude execution failed for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n}\n\nfunction computeTotalTokens(state: TokenState): number {\n return Math.max(state.cumulativeTokens, state.inputTokens + state.outputTokens);\n}\n\nfunction normalizeExitCode(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return 1;\n}\n\nfunction hasBooleanFlag(value: unknown, key: string): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n return value[key] === true;\n}\n\nfunction buildFailureMessage(stdout: string, stderr: string): string {\n const trimmedStderr = stderr.trim();\n if (trimmedStderr.length > 0) {\n return trimmedStderr;\n }\n\n const trimmedStdout = stdout.trim();\n if (trimmedStdout.length > 0) {\n return trimmedStdout;\n }\n\n return \"Claude CLI process exited with a non-zero status.\";\n}\n\nexport class ClaudeCodeAdapter implements AgentProvider {\n public readonly id: AgentProviderId = \"claude-code\";\n public readonly name = \"Claude Code\";\n\n private readonly runningExecutions = new Map<string, RunningProcess>();\n\n public async checkAvailability(): Promise<AgentAvailability> {\n try {\n const result = await execa(\"claude\", [\"--version\"], { reject: false });\n const version = result.stdout.trim().split(\"\\n\")[0];\n if (result.exitCode === 0) {\n return {\n available: true,\n version: version.length > 0 ? version : undefined,\n };\n }\n\n return {\n available: false,\n error: result.stderr.trim() || `claude --version exited with code ${result.exitCode}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n available: false,\n error: message,\n };\n }\n }\n\n public execute(params: AgentExecuteParams): AgentExecution {\n const startedAt = Date.now();\n const filesChanged = new Set<string>();\n const tokenState: TokenState = {\n inputTokens: 0,\n outputTokens: 0,\n cumulativeTokens: 0,\n };\n const eventQueue = new AsyncEventQueue<AgentEvent>();\n\n const processEnv: Record<string, string> = {\n ...Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\" &&\n // Strip Claude Code session markers to allow spawning a fresh Claude subprocess\n entry[0] !== \"CLAUDECODE\" &&\n entry[0] !== \"CLAUDE_CODE_SESSION\",\n ),\n ),\n ...params.env,\n OAC_TOKEN_BUDGET: `${params.tokenBudget}`,\n OAC_ALLOW_COMMITS: `${params.allowCommits}`,\n };\n\n const subprocess = execa(\"claude\", [\"-p\", params.prompt], {\n cwd: params.workingDirectory,\n env: processEnv,\n extendEnv: false,\n reject: false,\n timeout: params.timeoutMs,\n });\n\n this.runningExecutions.set(params.executionId, subprocess);\n\n const consumeStream = async (\n stream: NodeJS.ReadableStream | undefined,\n streamName: \"stdout\" | \"stderr\",\n ): Promise<void> => {\n if (!stream) {\n return;\n }\n\n const lineReader = createInterface({\n input: stream,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of lineReader) {\n eventQueue.push({\n type: \"output\",\n content: line,\n stream: streamName,\n });\n\n const tokenEvent = parseTokenEvent(line, tokenState);\n if (tokenEvent?.type === \"tokens\") {\n eventQueue.push(tokenEvent);\n }\n\n const fileEvent = parseFileEditEvent(line);\n if (fileEvent) {\n filesChanged.add(fileEvent.path);\n eventQueue.push(fileEvent);\n }\n\n const toolEvent = parseToolUseEvent(line);\n if (toolEvent) {\n eventQueue.push(toolEvent);\n }\n\n const errorEvent = parseErrorEvent(line, streamName);\n if (errorEvent) {\n eventQueue.push(errorEvent);\n }\n }\n };\n\n const stdoutDone = consumeStream(subprocess.stdout ?? undefined, \"stdout\");\n const stderrDone = consumeStream(subprocess.stderr ?? undefined, \"stderr\");\n\n const resultPromise = (async (): Promise<AgentResult> => {\n try {\n const settled = await subprocess;\n await Promise.all([stdoutDone, stderrDone]);\n\n const timedOut = hasBooleanFlag(settled, \"timedOut\");\n if (timedOut) {\n const timeoutError = executionError(\n \"AGENT_TIMEOUT\",\n `Claude execution timed out for ${params.executionId}`,\n {\n context: {\n executionId: params.executionId,\n timeoutMs: params.timeoutMs,\n },\n },\n );\n eventQueue.push({\n type: \"error\",\n message: timeoutError.message,\n recoverable: true,\n });\n throw timeoutError;\n }\n\n const canceled = hasBooleanFlag(settled, \"isCanceled\");\n if (canceled) {\n return {\n success: false,\n exitCode: normalizeExitCode(settled.exitCode),\n totalTokensUsed: computeTotalTokens(tokenState),\n filesChanged: [...filesChanged],\n duration: Date.now() - startedAt,\n error: \"Claude execution was cancelled.\",\n };\n }\n\n const exitCode = normalizeExitCode(settled.exitCode);\n const success = exitCode === 0;\n return {\n success,\n exitCode,\n totalTokensUsed: computeTotalTokens(tokenState),\n filesChanged: [...filesChanged],\n duration: Date.now() - startedAt,\n error: success ? undefined : buildFailureMessage(settled.stdout, settled.stderr),\n };\n } catch (error) {\n const normalized = normalizeUnknownError(error, params.executionId);\n eventQueue.push({\n type: \"error\",\n message: normalized.message,\n recoverable: normalized.severity !== \"fatal\",\n });\n eventQueue.fail(normalized);\n throw normalized;\n } finally {\n this.runningExecutions.delete(params.executionId);\n eventQueue.close();\n }\n })();\n\n return {\n executionId: params.executionId,\n providerId: this.id,\n events: eventQueue,\n result: resultPromise,\n pid: subprocess.pid,\n };\n }\n\n public async estimateTokens(params: TokenEstimateParams): Promise<TokenEstimate> {\n const contextTokens =\n params.contextTokens ?? params.targetFiles.length * 80 + params.targetFiles.join(\"\\n\").length;\n const promptTokens = estimateTokenCount(params.prompt);\n const expectedOutputTokens =\n params.expectedOutputTokens ?? Math.max(128, Math.ceil(promptTokens * 0.6));\n const totalEstimatedTokens = contextTokens + promptTokens + expectedOutputTokens;\n\n return {\n taskId: params.taskId,\n providerId: this.id,\n contextTokens,\n promptTokens,\n expectedOutputTokens,\n totalEstimatedTokens,\n confidence: 0.6,\n feasible: true,\n };\n }\n\n public async abort(executionId: string): Promise<void> {\n const running = this.runningExecutions.get(executionId);\n if (!running) {\n return;\n }\n\n running.kill(\"SIGTERM\");\n const forceKillTimer = setTimeout(() => {\n running.kill(\"SIGKILL\");\n }, 5_000);\n forceKillTimer.unref();\n\n try {\n await running;\n } catch {\n // Swallow process errors caused by shutdown.\n } finally {\n clearTimeout(forceKillTimer);\n }\n }\n}\n","import { stat } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\n\nimport { execa } from \"execa\";\nimport {\n type AgentProviderId,\n OacError,\n type TokenEstimate,\n executionError,\n} from \"../../core/index.js\";\n\nimport type {\n AgentAvailability,\n AgentEvent,\n AgentExecuteParams,\n AgentExecution,\n AgentProvider,\n AgentResult,\n TokenEstimateParams,\n} from \"./agent.interface.js\";\n\ntype RunningProcess = ReturnType<typeof execa>;\n\ninterface TokenState {\n inputTokens: number;\n outputTokens: number;\n cumulativeTokens: number;\n}\n\ninterface TokenPatch {\n inputTokens?: number;\n outputTokens?: number;\n cumulativeTokens?: number;\n}\n\nclass AsyncEventQueue<T> implements AsyncIterable<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private done = false;\n private pendingError: unknown;\n\n public push(value: T): void {\n if (this.done) {\n return;\n }\n\n const nextResolver = this.resolvers.shift();\n if (nextResolver) {\n nextResolver({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n public close(): void {\n if (this.done) {\n return;\n }\n\n this.done = true;\n this.flush();\n }\n\n public fail(error: unknown): void {\n this.pendingError = error;\n this.done = true;\n this.flush();\n }\n\n public [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: async (): Promise<IteratorResult<T>> => {\n if (this.values.length > 0) {\n const value = this.values.shift();\n if (value === undefined) {\n return { done: true, value: undefined };\n }\n return { done: false, value };\n }\n\n if (this.pendingError !== undefined) {\n throw this.pendingError;\n }\n\n if (this.done) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n\n private flush(): void {\n for (const resolve of this.resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction parseJsonPayload(line: string): Record<string, unknown> | undefined {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n if (isRecord(parsed)) {\n return parsed;\n }\n } catch {}\n\n return undefined;\n}\n\nfunction parseTokenPatchFromPayload(payload: Record<string, unknown>): TokenPatch {\n const usage = isRecord(payload.usage) ? payload.usage : undefined;\n return {\n inputTokens: readNumber(\n payload.inputTokens ??\n payload.input_tokens ??\n payload.promptTokens ??\n payload.prompt_tokens ??\n usage?.inputTokens ??\n usage?.input_tokens ??\n usage?.promptTokens ??\n usage?.prompt_tokens,\n ),\n outputTokens: readNumber(\n payload.outputTokens ??\n payload.output_tokens ??\n payload.completionTokens ??\n payload.completion_tokens ??\n usage?.outputTokens ??\n usage?.output_tokens ??\n usage?.completionTokens ??\n usage?.completion_tokens,\n ),\n cumulativeTokens: readNumber(\n payload.cumulativeTokens ??\n payload.cumulative_tokens ??\n payload.totalTokens ??\n payload.total_tokens ??\n usage?.cumulativeTokens ??\n usage?.cumulative_tokens ??\n usage?.totalTokens ??\n usage?.total_tokens,\n ),\n };\n}\n\nfunction patchTokenState(state: TokenState, patch: TokenPatch): AgentEvent | undefined {\n if (\n patch.inputTokens === undefined &&\n patch.outputTokens === undefined &&\n patch.cumulativeTokens === undefined\n ) {\n return undefined;\n }\n\n state.inputTokens = patch.inputTokens ?? state.inputTokens;\n state.outputTokens = patch.outputTokens ?? state.outputTokens;\n const computedTotal = state.inputTokens + state.outputTokens;\n state.cumulativeTokens = Math.max(\n state.cumulativeTokens,\n patch.cumulativeTokens ?? computedTotal,\n );\n\n return {\n type: \"tokens\",\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n cumulativeTokens: state.cumulativeTokens,\n };\n}\n\nfunction parseTokenEvent(\n line: string,\n payload: Record<string, unknown> | undefined,\n state: TokenState,\n): AgentEvent | undefined {\n if (payload) {\n return patchTokenState(state, parseTokenPatchFromPayload(payload));\n }\n\n const inputMatch = line.match(/(?:input|prompt)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n const outputMatch = line.match(/(?:output|completion)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n const totalMatch = line.match(/(?:total|cumulative|used)\\s*tokens?\\s*[:=]\\s*(\\d+)/i);\n\n return patchTokenState(state, {\n inputTokens: inputMatch ? Number.parseInt(inputMatch[1], 10) : undefined,\n outputTokens: outputMatch ? Number.parseInt(outputMatch[1], 10) : undefined,\n cumulativeTokens: totalMatch ? Number.parseInt(totalMatch[1], 10) : undefined,\n });\n}\n\nfunction normalizeFileAction(value: unknown): \"create\" | \"modify\" | \"delete\" | undefined {\n if (value !== \"create\" && value !== \"modify\" && value !== \"delete\") {\n return undefined;\n }\n return value;\n}\n\nfunction parseFileEditFromPayload(\n payload: Record<string, unknown>,\n): Extract<AgentEvent, { type: \"file_edit\" }> | undefined {\n if (payload.type === \"file_edit\") {\n const action = normalizeFileAction(payload.action);\n const path = readString(payload.path);\n if (action && path) {\n return {\n type: \"file_edit\",\n action,\n path,\n };\n }\n }\n\n const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);\n const input = isRecord(payload.input) ? payload.input : undefined;\n const inputPath = readString(input?.path ?? input?.file_path ?? input?.filePath);\n if (!tool || !inputPath) {\n return undefined;\n }\n\n if (tool === \"create_file\") {\n return { type: \"file_edit\", action: \"create\", path: inputPath };\n }\n if (tool === \"delete_file\") {\n return { type: \"file_edit\", action: \"delete\", path: inputPath };\n }\n if (tool === \"write_file\" || tool === \"edit_file\" || tool === \"replace_file\") {\n return { type: \"file_edit\", action: \"modify\", path: inputPath };\n }\n\n return undefined;\n}\n\nfunction parseToolUseFromPayload(\n payload: Record<string, unknown>,\n): Extract<AgentEvent, { type: \"tool_use\" }> | undefined {\n const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);\n if (!tool) {\n return undefined;\n }\n\n return {\n type: \"tool_use\",\n tool,\n input: payload.input,\n };\n}\n\nfunction parseErrorFromPayload(\n payload: Record<string, unknown>,\n): Extract<AgentEvent, { type: \"error\" }> | undefined {\n if (payload.type !== \"error\") {\n return undefined;\n }\n\n return {\n type: \"error\",\n message: readString(payload.message) ?? \"Unknown Codex CLI error\",\n recoverable: payload.recoverable !== false,\n };\n}\n\nfunction estimateTokenCount(text: string): number {\n if (text.length === 0) {\n return 0;\n }\n\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction normalizeUnknownError(error: unknown, executionId: string): OacError {\n if (error instanceof OacError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `Codex execution timed out for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n }\n\n if (/out of memory|ENOMEM|heap/i.test(message)) {\n return executionError(\"AGENT_OOM\", `Codex execution ran out of memory for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n }\n\n if (/rate.limit|429|too many requests|throttl/i.test(message)) {\n return executionError(\"AGENT_RATE_LIMITED\", `Codex execution rate-limited for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n }\n\n if (/network|ECONN|ENOTFOUND|EAI_AGAIN/i.test(message)) {\n return new OacError(\n \"Codex execution failed due to network issues\",\n \"NETWORK_ERROR\",\n \"recoverable\",\n {\n executionId,\n message,\n },\n error,\n );\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `Codex execution failed for ${executionId}`, {\n context: { executionId, message },\n cause: error,\n });\n}\n\nfunction computeTotalTokens(state: TokenState): number {\n return Math.max(state.cumulativeTokens, state.inputTokens + state.outputTokens);\n}\n\nfunction normalizeExitCode(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return 1;\n}\n\nfunction hasBooleanFlag(value: unknown, key: string): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n return value[key] === true;\n}\n\nfunction buildFailureMessage(stdout: string, stderr: string): string {\n const trimmedStderr = stderr.trim();\n if (trimmedStderr.length > 0) {\n return trimmedStderr;\n }\n\n const trimmedStdout = stdout.trim();\n if (trimmedStdout.length > 0) {\n return trimmedStdout;\n }\n\n return \"Codex CLI process exited with a non-zero status.\";\n}\n\nfunction parseVersion(output: string): string | undefined {\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n if (!match) {\n return undefined;\n }\n return match[1];\n}\n\nasync function estimateContextTokens(targetFiles: string[]): Promise<number> {\n let totalBytes = 0;\n for (const filePath of targetFiles) {\n try {\n const fileStat = await stat(filePath);\n if (fileStat.isFile()) {\n totalBytes += fileStat.size;\n }\n } catch {\n // Ignore missing files and treat as zero-context for estimation.\n }\n }\n\n return Math.ceil(totalBytes / 4);\n}\n\nexport class CodexAdapter implements AgentProvider {\n public readonly id: AgentProviderId = \"codex\";\n public readonly name = \"Codex CLI\";\n\n private readonly runningExecutions = new Map<string, RunningProcess>();\n\n public async checkAvailability(): Promise<AgentAvailability> {\n try {\n const result = await execa(\"codex\", [\"--version\"], { reject: false });\n if (result.exitCode === 0) {\n const versionLine = result.stdout.trim().split(\"\\n\")[0] ?? \"\";\n return {\n available: true,\n version: parseVersion(versionLine),\n };\n }\n\n return {\n available: false,\n error:\n result.stderr.trim() ||\n result.stdout.trim() ||\n `codex --version exited with code ${result.exitCode}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n available: false,\n error: message,\n };\n }\n }\n\n public execute(params: AgentExecuteParams): AgentExecution {\n const startedAt = Date.now();\n const filesChanged = new Set<string>();\n const tokenState: TokenState = {\n inputTokens: 0,\n outputTokens: 0,\n cumulativeTokens: 0,\n };\n const eventQueue = new AsyncEventQueue<AgentEvent>();\n\n const processEnv: Record<string, string> = {\n ...Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n ),\n ...params.env,\n OAC_TOKEN_BUDGET: `${params.tokenBudget}`,\n OAC_ALLOW_COMMITS: `${params.allowCommits}`,\n };\n\n const subprocess = execa(\n \"codex\",\n [\"exec\", \"--full-auto\", \"-C\", params.workingDirectory, params.prompt],\n {\n cwd: params.workingDirectory,\n env: processEnv,\n reject: false,\n timeout: params.timeoutMs,\n },\n );\n\n this.runningExecutions.set(params.executionId, subprocess);\n\n const processStdoutLine = (line: string): void => {\n const payload = parseJsonPayload(line);\n const tokenEvent = parseTokenEvent(line, payload, tokenState);\n if (tokenEvent?.type === \"tokens\") {\n eventQueue.push(tokenEvent);\n }\n\n if (!payload) return;\n\n const fileEvent = parseFileEditFromPayload(payload);\n if (fileEvent) {\n filesChanged.add(fileEvent.path);\n eventQueue.push(fileEvent);\n }\n\n const toolEvent = parseToolUseFromPayload(payload);\n if (toolEvent) {\n eventQueue.push(toolEvent);\n }\n\n const errorEvent = parseErrorFromPayload(payload);\n if (errorEvent) {\n eventQueue.push(errorEvent);\n }\n };\n\n const consumeStream = async (\n stream: NodeJS.ReadableStream | undefined,\n streamName: \"stdout\" | \"stderr\",\n ): Promise<void> => {\n if (!stream) {\n return;\n }\n\n const lineReader = createInterface({\n input: stream,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of lineReader) {\n eventQueue.push({ type: \"output\", content: line, stream: streamName });\n\n if (streamName === \"stdout\") {\n processStdoutLine(line);\n } else if (/error|failed|exception/i.test(line)) {\n eventQueue.push({ type: \"error\", message: line.trim(), recoverable: true });\n }\n }\n };\n\n const stdoutDone = consumeStream(subprocess.stdout ?? undefined, \"stdout\");\n const stderrDone = consumeStream(subprocess.stderr ?? undefined, \"stderr\");\n\n const resultPromise = (async (): Promise<AgentResult> => {\n try {\n const settled = await subprocess;\n await Promise.all([stdoutDone, stderrDone]);\n\n const timedOut = hasBooleanFlag(settled, \"timedOut\");\n if (timedOut) {\n const timeoutError = executionError(\n \"AGENT_TIMEOUT\",\n `Codex execution timed out for ${params.executionId}`,\n {\n context: {\n executionId: params.executionId,\n timeoutMs: params.timeoutMs,\n },\n },\n );\n eventQueue.push({\n type: \"error\",\n message: timeoutError.message,\n recoverable: true,\n });\n throw timeoutError;\n }\n\n const canceled = hasBooleanFlag(settled, \"isCanceled\");\n if (canceled) {\n return {\n success: false,\n exitCode: normalizeExitCode(settled.exitCode),\n totalTokensUsed: computeTotalTokens(tokenState),\n filesChanged: [...filesChanged],\n duration: Date.now() - startedAt,\n error: \"Codex execution was cancelled.\",\n };\n }\n\n const exitCode = normalizeExitCode(settled.exitCode);\n const success = exitCode === 0;\n return {\n success,\n exitCode,\n totalTokensUsed: computeTotalTokens(tokenState),\n filesChanged: [...filesChanged],\n duration: Date.now() - startedAt,\n error: success ? undefined : buildFailureMessage(settled.stdout, settled.stderr),\n };\n } catch (error) {\n const normalized = normalizeUnknownError(error, params.executionId);\n eventQueue.push({\n type: \"error\",\n message: normalized.message,\n recoverable: normalized.severity !== \"fatal\",\n });\n eventQueue.fail(normalized);\n throw normalized;\n } finally {\n this.runningExecutions.delete(params.executionId);\n eventQueue.close();\n }\n })();\n\n return {\n executionId: params.executionId,\n providerId: this.id,\n events: eventQueue,\n result: resultPromise,\n pid: subprocess.pid,\n };\n }\n\n public async estimateTokens(params: TokenEstimateParams): Promise<TokenEstimate> {\n const baseTokens = params.targetFiles.length * 2_000;\n const promptTokens = estimateTokenCount(params.prompt);\n const contextTokens = await estimateContextTokens(params.targetFiles);\n const expectedOutputTokens = baseTokens;\n const totalEstimatedTokens = contextTokens + promptTokens + expectedOutputTokens;\n\n return {\n taskId: params.taskId,\n providerId: this.id,\n contextTokens,\n promptTokens,\n expectedOutputTokens,\n totalEstimatedTokens,\n confidence: 0.6,\n feasible: totalEstimatedTokens < 200_000,\n };\n }\n\n public async abort(executionId: string): Promise<void> {\n const running = this.runningExecutions.get(executionId);\n if (!running) {\n return;\n }\n\n running.kill(\"SIGTERM\");\n const forceKillTimer = setTimeout(() => {\n running.kill(\"SIGKILL\");\n }, 2_000);\n forceKillTimer.unref();\n\n try {\n await running;\n } catch {\n // Swallow process errors caused by shutdown.\n } finally {\n clearTimeout(forceKillTimer);\n }\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport { simpleGit } from \"simple-git\";\n\nexport interface SandboxContext {\n path: string;\n branchName: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Mutex that serializes all git worktree operations (add/remove/prune)\n * to avoid .git/config lock races when running concurrent tasks.\n */\nlet worktreeLock = Promise.resolve();\n\nfunction withWorktreeLock<T>(fn: () => Promise<T>): Promise<T> {\n const next = worktreeLock.catch(() => {}).then(fn);\n worktreeLock = next.then(\n () => {},\n () => {},\n );\n return next;\n}\n\nfunction getWorktreePath(repoPath: string, branchName: string): string {\n return resolve(join(repoPath, \"..\", \".oac-worktrees\", branchName));\n}\n\nexport async function createSandbox(\n repoPath: string,\n branchName: string,\n baseBranch: string,\n): Promise<SandboxContext> {\n const worktreePath = getWorktreePath(repoPath, branchName);\n const worktreeRoot = resolve(join(repoPath, \"..\", \".oac-worktrees\"));\n const git = simpleGit(repoPath);\n\n await withWorktreeLock(async () => {\n await mkdir(worktreeRoot, { recursive: true });\n await git.raw([\"worktree\", \"add\", worktreePath, \"-b\", branchName, `origin/${baseBranch}`]);\n });\n\n let cleanedUp = false;\n\n return {\n path: worktreePath,\n branchName,\n cleanup: async (): Promise<void> => {\n if (cleanedUp) {\n return;\n }\n\n cleanedUp = true;\n\n await withWorktreeLock(async () => {\n try {\n await git.raw([\"worktree\", \"remove\", worktreePath, \"--force\"]);\n } finally {\n try {\n await git.raw([\"worktree\", \"prune\"]);\n } catch {\n // Ignore cleanup pruning errors.\n }\n }\n });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport {\n type Epic,\n type ExecutionResult,\n OacError,\n type OacEventBus,\n type Task,\n executionError,\n} from \"../core/index.js\";\n\nimport type { AgentEvent, AgentProvider, AgentResult } from \"./agents/agent.interface.js\";\nimport type { SandboxContext } from \"./sandbox.js\";\n\nconst DEFAULT_TOKEN_BUDGET = 50_000;\nconst DEFAULT_TIMEOUT_MS = 300_000;\n\nexport interface ExecuteTaskOptions {\n executionId?: string;\n tokenBudget?: number;\n timeoutMs?: number;\n allowCommits?: boolean;\n}\n\nfunction readPositiveNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return undefined;\n }\n\n return Math.floor(value);\n}\n\nfunction readMetadataNumber(task: Task, key: string): number | undefined {\n return readPositiveNumber(task.metadata[key]);\n}\n\nfunction buildTaskPrompt(task: Task): string {\n const fileList = task.targetFiles.length > 0 ? task.targetFiles.join(\"\\n\") : \"(none provided)\";\n\n const lines = [\n \"You are implementing a scoped repository contribution task.\",\n `Task ID: ${task.id}`,\n `Title: ${task.title}`,\n `Source: ${task.source}`,\n `Priority: ${task.priority}`,\n `Complexity: ${task.complexity}`,\n `Execution mode: ${task.executionMode}`,\n ];\n\n if (task.linkedIssue) {\n lines.push(\n \"\",\n `GitHub Issue #${task.linkedIssue.number}: ${task.linkedIssue.url}`,\n task.linkedIssue.labels.length > 0 ? `Labels: ${task.linkedIssue.labels.join(\", \")}` : \"\",\n \"Resolve this issue completely. Read the issue description carefully and implement the fix.\",\n );\n }\n\n lines.push(\n \"\",\n \"Description:\",\n task.description,\n \"\",\n \"Target files:\",\n fileList,\n \"\",\n \"Apply minimal, safe changes and ensure the repository remains buildable.\",\n );\n\n return lines.filter((l) => l !== undefined).join(\"\\n\");\n}\n\nfunction stageFromEvent(event: AgentEvent): string {\n switch (event.type) {\n case \"output\":\n return event.stream;\n case \"tokens\":\n return \"tokens\";\n case \"file_edit\":\n return `file:${event.action}`;\n case \"tool_use\":\n return `tool:${event.tool}`;\n case \"error\":\n return event.recoverable ? \"agent-warning\" : \"agent-error\";\n default:\n return \"running\";\n }\n}\n\nfunction mergeExecutionResult(\n result: AgentResult,\n observedTokens: number,\n observedFiles: Set<string>,\n startedAt: number,\n): ExecutionResult {\n for (const changedFile of result.filesChanged) {\n observedFiles.add(changedFile);\n }\n\n return {\n success: result.success,\n exitCode: result.exitCode,\n totalTokensUsed: Math.max(result.totalTokensUsed, observedTokens),\n filesChanged: [...observedFiles],\n duration: result.duration > 0 ? result.duration : Date.now() - startedAt,\n error: result.error,\n };\n}\n\nfunction normalizeExecutionError(error: unknown, task: Task, executionId: string): OacError {\n if (error instanceof OacError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `Task ${task.id} timed out during execution.`, {\n context: {\n taskId: task.id,\n executionId,\n message,\n },\n cause: error,\n });\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `Task ${task.id} failed during execution.`, {\n context: {\n taskId: task.id,\n executionId,\n message,\n },\n cause: error,\n });\n}\n\nexport async function executeTask(\n agent: AgentProvider,\n task: Task,\n sandbox: SandboxContext,\n eventBus: OacEventBus,\n options: ExecuteTaskOptions = {},\n): Promise<ExecutionResult> {\n const executionId = options.executionId ?? randomUUID();\n const tokenBudget =\n options.tokenBudget ?? readMetadataNumber(task, \"tokenBudget\") ?? DEFAULT_TOKEN_BUDGET;\n const timeoutMs =\n options.timeoutMs ?? readMetadataNumber(task, \"timeoutMs\") ?? DEFAULT_TIMEOUT_MS;\n const allowCommits = options.allowCommits ?? true;\n\n const startedAt = Date.now();\n let observedTokens = 0;\n const observedFiles = new Set<string>();\n\n const execution = agent.execute({\n executionId,\n workingDirectory: sandbox.path,\n prompt: buildTaskPrompt(task),\n targetFiles: task.targetFiles,\n tokenBudget,\n allowCommits,\n timeoutMs,\n });\n\n const streamPromise = (async (): Promise<void> => {\n for await (const event of execution.events) {\n if (event.type === \"tokens\") {\n observedTokens = Math.max(observedTokens, event.cumulativeTokens);\n }\n\n if (event.type === \"file_edit\") {\n observedFiles.add(event.path);\n }\n\n eventBus.emit(\"execution:progress\", {\n jobId: executionId,\n tokensUsed: observedTokens,\n stage: stageFromEvent(event),\n });\n }\n })();\n\n try {\n const result = await execution.result;\n await streamPromise;\n return mergeExecutionResult(result, observedTokens, observedFiles, startedAt);\n } catch (error) {\n try {\n await streamPromise;\n } catch {\n // Ignore stream failures and surface the primary execution error.\n }\n throw normalizeExecutionError(error, task, executionId);\n }\n}\n\n// ── Epic support ────────────────────────────────────────────\n\n/**\n * Build a context-aware prompt for an entire epic, including all subtasks\n * and module context.\n */\nexport function buildEpicPrompt(epic: Epic): string {\n const lines = [\n \"You are implementing a coherent set of changes as a single epic.\",\n `Epic: ${epic.title}`,\n `Scope: ${epic.scope} module`,\n \"\",\n \"Description:\",\n epic.description,\n \"\",\n `Subtasks (${epic.subtasks.length}):`,\n ];\n\n for (let i = 0; i < epic.subtasks.length; i++) {\n const task = epic.subtasks[i];\n const files = task.targetFiles.length > 0 ? ` [${task.targetFiles.join(\", \")}]` : \"\";\n lines.push(` ${i + 1}. ${task.title}${files}`);\n if (task.description) {\n lines.push(` ${task.description}`);\n }\n }\n\n if (epic.contextFiles.length > 0) {\n lines.push(\n \"\",\n \"Context files to read for understanding:\",\n ...epic.contextFiles.map((f) => ` - ${f}`),\n );\n }\n\n lines.push(\n \"\",\n \"Instructions:\",\n \"- Apply all changes in a single coherent commit.\",\n \"- Ensure the repository remains buildable after changes.\",\n \"- Address all subtasks listed above.\",\n );\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert an Epic into a Task for backward compatibility with executeTask().\n */\nexport function epicAsTask(epic: Epic): Task {\n const allTargetFiles = [...new Set(epic.subtasks.flatMap((t) => t.targetFiles))];\n\n return {\n id: epic.id,\n source: epic.subtasks[0]?.source ?? \"custom\",\n title: epic.title,\n description: buildEpicPrompt(epic),\n targetFiles: allTargetFiles,\n priority: epic.priority,\n complexity:\n epic.subtasks.length >= 7 ? \"complex\" : epic.subtasks.length >= 4 ? \"moderate\" : \"simple\",\n executionMode: \"new-pr\",\n metadata: { epicId: epic.id, subtaskCount: epic.subtasks.length },\n discoveredAt: epic.createdAt,\n parentEpicId: undefined,\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport PQueue from \"p-queue\";\nimport {\n type ExecutionPlan,\n type ExecutionResult,\n OacError,\n type OacEventBus,\n type Task,\n type TokenEstimate,\n executionError,\n} from \"../core/index.js\";\n\nimport type { AgentProvider } from \"./agents/agent.interface.js\";\nimport { createSandbox } from \"./sandbox.js\";\nimport { executeTask } from \"./worker.js\";\n\nconst DEFAULT_CONCURRENCY = 2;\nconst DEFAULT_MAX_ATTEMPTS = 2;\nconst DEFAULT_TIMEOUT_MS = 300_000;\nconst DEFAULT_TOKEN_BUDGET = 50_000;\n\nexport type JobStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"retrying\" | \"aborted\";\n\nexport interface Job {\n id: string;\n task: Task;\n estimate: TokenEstimate;\n status: JobStatus;\n attempts: number;\n maxAttempts: number;\n createdAt: number;\n startedAt?: number;\n completedAt?: number;\n result?: ExecutionResult;\n error?: OacError;\n workerId?: string;\n}\n\nexport interface ExecutionEngineConfig {\n concurrency?: number;\n maxAttempts?: number;\n repoPath?: string;\n baseBranch?: string;\n branchPrefix?: string;\n taskTimeoutMs?: number;\n defaultTokenBudget?: number;\n}\n\nexport interface RunResult {\n jobs: Job[];\n completed: Job[];\n failed: Job[];\n aborted: Job[];\n}\n\ninterface ActiveJobState {\n job: Job;\n agent: AgentProvider;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction sanitizeBranchSegment(value: string): string {\n const sanitized = value\n .toLowerCase()\n .replace(/[^a-z0-9/_-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-/]+|[-/]+$/g, \"\");\n return sanitized || \"task\";\n}\n\nexport function isTransientError(error: OacError): boolean {\n return (\n error.code === \"AGENT_TIMEOUT\" ||\n error.code === \"AGENT_OOM\" ||\n error.code === \"AGENT_RATE_LIMITED\" ||\n error.code === \"NETWORK_ERROR\" ||\n error.code === \"GIT_LOCK_FAILED\"\n );\n}\n\nexport class ExecutionEngine {\n private readonly queue: PQueue;\n private readonly jobs = new Map<string, Job>();\n private readonly activeJobs = new Map<string, ActiveJobState>();\n private readonly concurrency: number;\n private readonly maxAttempts: number;\n private readonly repoPath: string;\n private readonly baseBranch: string;\n private readonly branchPrefix: string;\n private readonly taskTimeoutMs: number;\n private readonly defaultTokenBudget: number;\n\n private aborted = false;\n private nextAgentIndex = 0;\n\n public constructor(\n private readonly agents: AgentProvider[],\n private readonly eventBus: OacEventBus,\n config: ExecutionEngineConfig = {},\n ) {\n if (agents.length === 0) {\n throw executionError(\n \"AGENT_NOT_AVAILABLE\",\n \"ExecutionEngine requires at least one agent provider\",\n );\n }\n\n this.concurrency = Math.max(1, config.concurrency ?? DEFAULT_CONCURRENCY);\n this.maxAttempts = Math.max(1, config.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);\n this.repoPath = config.repoPath ?? process.cwd();\n this.baseBranch = config.baseBranch ?? \"main\";\n this.branchPrefix = config.branchPrefix ?? \"oac\";\n this.taskTimeoutMs = Math.max(1, config.taskTimeoutMs ?? DEFAULT_TIMEOUT_MS);\n this.defaultTokenBudget = Math.max(1, config.defaultTokenBudget ?? DEFAULT_TOKEN_BUDGET);\n\n this.queue = new PQueue({\n concurrency: this.concurrency,\n autoStart: false,\n });\n }\n\n public enqueue(plan: ExecutionPlan): Job[] {\n const enqueuedJobs: Job[] = [];\n\n for (const { task, estimate } of plan.selectedTasks) {\n const job: Job = {\n id: randomUUID(),\n task,\n estimate,\n status: \"queued\",\n attempts: 0,\n maxAttempts: this.maxAttempts,\n createdAt: Date.now(),\n };\n\n this.jobs.set(job.id, job);\n enqueuedJobs.push(job);\n this.schedule(job);\n }\n\n return enqueuedJobs;\n }\n\n public async run(): Promise<RunResult> {\n this.aborted = false;\n this.queue.start();\n await this.queue.onIdle();\n return this.buildRunResult();\n }\n\n public async abort(): Promise<void> {\n this.aborted = true;\n this.queue.pause();\n this.queue.clear();\n\n const abortError = executionError(\"AGENT_EXECUTION_FAILED\", \"Execution aborted by user.\");\n\n for (const job of this.jobs.values()) {\n if (job.status === \"queued\" || job.status === \"retrying\") {\n job.status = \"aborted\";\n job.completedAt = Date.now();\n job.error = abortError;\n }\n }\n\n await Promise.all(\n [...this.activeJobs.values()].map(async ({ job, agent }) => {\n job.status = \"aborted\";\n job.completedAt = Date.now();\n job.error = abortError;\n this.eventBus.emit(\"execution:failed\", {\n jobId: job.id,\n error: abortError,\n });\n\n try {\n await agent.abort(job.id);\n } catch {\n // Ignore agent abort errors and continue shutdown.\n }\n }),\n );\n }\n\n private schedule(job: Job, delayMs = 0): void {\n void this.queue\n .add(\n async () => {\n if (delayMs > 0) {\n await delay(delayMs);\n }\n await this.runJob(job);\n },\n { priority: job.task.priority },\n )\n .catch((error: unknown) => {\n const normalized = this.normalizeError(error, job);\n job.status = \"failed\";\n job.completedAt = Date.now();\n job.error = normalized;\n this.eventBus.emit(\"execution:failed\", {\n jobId: job.id,\n error: normalized,\n });\n });\n }\n\n private async runJob(job: Job): Promise<void> {\n if (this.aborted || job.status === \"aborted\") {\n return;\n }\n\n job.attempts += 1;\n job.status = \"running\";\n job.startedAt ??= Date.now();\n\n const agent = this.selectAgent();\n job.workerId = agent.id;\n this.activeJobs.set(job.id, { job, agent });\n\n this.eventBus.emit(\"execution:started\", {\n jobId: job.id,\n task: job.task,\n agent: agent.id,\n });\n\n let sandboxCleanup: (() => Promise<void>) | undefined;\n\n try {\n const branchName = this.createBranchName(job);\n const sandbox = await createSandbox(this.repoPath, branchName, this.baseBranch);\n sandboxCleanup = sandbox.cleanup;\n\n const result = await executeTask(agent, job.task, sandbox, this.eventBus, {\n executionId: job.id,\n tokenBudget:\n job.estimate.totalEstimatedTokens > 0\n ? job.estimate.totalEstimatedTokens\n : this.defaultTokenBudget,\n timeoutMs: this.taskTimeoutMs,\n allowCommits: true,\n });\n\n job.result = result;\n job.completedAt = Date.now();\n\n if (result.success) {\n job.status = \"completed\";\n this.eventBus.emit(\"execution:completed\", {\n jobId: job.id,\n result,\n });\n return;\n }\n\n const failure = executionError(\n \"AGENT_EXECUTION_FAILED\",\n result.error ?? `Task ${job.task.id} exited with code ${result.exitCode}.`,\n {\n context: {\n taskId: job.task.id,\n jobId: job.id,\n exitCode: result.exitCode,\n attempt: job.attempts,\n },\n },\n );\n await this.handleFailure(job, failure);\n } catch (error) {\n const normalized = this.normalizeError(error, job);\n await this.handleFailure(job, normalized);\n } finally {\n this.activeJobs.delete(job.id);\n\n if (sandboxCleanup) {\n try {\n await sandboxCleanup();\n } catch (cleanupError) {\n const cleanupMessage = toErrorMessage(cleanupError);\n job.error ??= executionError(\n \"AGENT_EXECUTION_FAILED\",\n `Sandbox cleanup failed for job ${job.id}`,\n {\n context: {\n jobId: job.id,\n cleanupError: cleanupMessage,\n },\n cause: cleanupError,\n },\n );\n }\n }\n }\n }\n\n private async handleFailure(job: Job, error: OacError): Promise<void> {\n job.error = error;\n\n if (this.aborted || job.status === \"aborted\") {\n job.status = \"aborted\";\n job.completedAt = Date.now();\n return;\n }\n\n if (job.attempts < job.maxAttempts && isTransientError(error)) {\n job.status = \"retrying\";\n const retryDelay =\n error.code === \"AGENT_RATE_LIMITED\"\n ? Math.min(60_000, 10_000 * 2 ** (job.attempts - 1))\n : Math.min(5_000, job.attempts * 1_000);\n this.schedule(job, retryDelay);\n return;\n }\n\n job.status = \"failed\";\n job.completedAt = Date.now();\n this.eventBus.emit(\"execution:failed\", {\n jobId: job.id,\n error,\n });\n }\n\n private selectAgent(): AgentProvider {\n const agent = this.agents[this.nextAgentIndex % this.agents.length];\n this.nextAgentIndex = (this.nextAgentIndex + 1) % this.agents.length;\n return agent;\n }\n\n private createBranchName(job: Job): string {\n const dateSegment = new Date().toISOString().slice(0, 10).replaceAll(\"-\", \"\");\n const taskSegment = sanitizeBranchSegment(job.task.id);\n return `${this.branchPrefix}/${dateSegment}/${taskSegment}-${job.id.slice(0, 8)}-a${job.attempts}`;\n }\n\n private normalizeError(error: unknown, job: Job): OacError {\n if (error instanceof OacError) {\n return error;\n }\n\n const message = toErrorMessage(error);\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `Job ${job.id} timed out.`, {\n context: {\n jobId: job.id,\n taskId: job.task.id,\n message,\n attempt: job.attempts,\n },\n cause: error,\n });\n }\n\n if (/out of memory|ENOMEM|heap/i.test(message)) {\n return executionError(\"AGENT_OOM\", `Job ${job.id} ran out of memory.`, {\n context: {\n jobId: job.id,\n taskId: job.task.id,\n message,\n attempt: job.attempts,\n },\n cause: error,\n });\n }\n\n if (/network|ECONN|ENOTFOUND|EAI_AGAIN/i.test(message)) {\n return new OacError(\n `Job ${job.id} failed due to a network error.`,\n \"NETWORK_ERROR\",\n \"recoverable\",\n {\n jobId: job.id,\n taskId: job.task.id,\n message,\n attempt: job.attempts,\n },\n error,\n );\n }\n\n if (/index\\.lock|cannot lock ref|Unable to create '.+?\\.git\\/index\\.lock'/i.test(message)) {\n return new OacError(\n `Job ${job.id} failed due to a git lock conflict.`,\n \"GIT_LOCK_FAILED\",\n \"recoverable\",\n {\n jobId: job.id,\n taskId: job.task.id,\n message,\n attempt: job.attempts,\n },\n error,\n );\n }\n\n if (isRecord(error) && error.name === \"AbortError\") {\n return executionError(\"AGENT_EXECUTION_FAILED\", `Job ${job.id} was aborted.`, {\n context: {\n jobId: job.id,\n taskId: job.task.id,\n attempt: job.attempts,\n },\n cause: error,\n });\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `Job ${job.id} failed unexpectedly.`, {\n context: {\n jobId: job.id,\n taskId: job.task.id,\n message,\n attempt: job.attempts,\n },\n cause: error,\n });\n }\n\n private buildRunResult(): RunResult {\n const jobs = [...this.jobs.values()];\n\n return {\n jobs,\n completed: jobs.filter((job) => job.status === \"completed\"),\n failed: jobs.filter((job) => job.status === \"failed\"),\n aborted: jobs.filter((job) => job.status === \"aborted\"),\n };\n }\n}\n"],"mappings":"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","names":["resolve","createInterface","execa","AsyncEventQueue","resolve","isRecord","readString","readNumber","parseJsonPayload","parseTokenPatchFromPayload","patchTokenState","parseTokenEvent","normalizeFileAction","parseFileEditFromPayload","estimateTokenCount","normalizeUnknownError","computeTotalTokens","normalizeExitCode","hasBooleanFlag","buildFailureMessage","execa","createInterface","randomUUID","DEFAULT_TIMEOUT_MS","DEFAULT_TOKEN_BUDGET","isRecord","randomUUID"]}