@open330/oac 2026.220.2 → 2026.221.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -358,7 +358,8 @@ var ClaudeCodeAdapter = class {
358
358
  env: processEnv,
359
359
  extendEnv: false,
360
360
  reject: false,
361
- timeout: params.timeoutMs
361
+ timeout: params.timeoutMs,
362
+ stdin: "ignore"
362
363
  });
363
364
  this.runningExecutions.set(params.executionId, subprocess);
364
365
  const consumeStream = async (stream, streamName) => {
@@ -578,6 +579,16 @@ function parseFileEditFromPayload2(payload) {
578
579
  };
579
580
  }
580
581
  }
582
+ if (payload.type === "item.completed") {
583
+ const item = isRecord(payload.item) ? payload.item : void 0;
584
+ if (item?.type === "file_change") {
585
+ const action = normalizeFileAction2(item.action) ?? "modify";
586
+ const path = readString(item.path ?? item.filename);
587
+ if (path) {
588
+ return { type: "file_edit", action, path };
589
+ }
590
+ }
591
+ }
581
592
  const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);
582
593
  const input = isRecord(payload.input) ? payload.input : void 0;
583
594
  const inputPath = readString(input?.path ?? input?.file_path ?? input?.filePath);
@@ -596,6 +607,15 @@ function parseFileEditFromPayload2(payload) {
596
607
  return void 0;
597
608
  }
598
609
  function parseToolUseFromPayload(payload) {
610
+ if (payload.type === "item.completed") {
611
+ const item = isRecord(payload.item) ? payload.item : void 0;
612
+ if (item?.type === "command_execution") {
613
+ const command = readString(item.command);
614
+ if (command) {
615
+ return { type: "tool_use", tool: "shell", input: { command } };
616
+ }
617
+ }
618
+ }
599
619
  const tool = readString(payload.tool ?? payload.tool_name ?? payload.name);
600
620
  if (!tool) {
601
621
  return void 0;
@@ -695,6 +715,20 @@ function parseVersion(output) {
695
715
  }
696
716
  return match[1];
697
717
  }
718
+ async function codexBinaryFallback() {
719
+ try {
720
+ const whichResult = await execa2("which", ["codex"], {
721
+ reject: false,
722
+ timeout: 3e3,
723
+ stdin: "ignore"
724
+ });
725
+ if (whichResult.exitCode === 0 && whichResult.stdout.trim().length > 0) {
726
+ return { available: true, version: void 0 };
727
+ }
728
+ } catch {
729
+ }
730
+ return { available: false, error: "codex is not installed or not in PATH." };
731
+ }
698
732
  async function estimateContextTokens(targetFiles) {
699
733
  let totalBytes = 0;
700
734
  for (const filePath of targetFiles) {
@@ -714,7 +748,12 @@ var CodexAdapter = class {
714
748
  runningExecutions = /* @__PURE__ */ new Map();
715
749
  async checkAvailability() {
716
750
  try {
717
- const result = await execa2("codex", ["--version"], { reject: false });
751
+ const result = await execa2("codex", ["--version"], {
752
+ reject: false,
753
+ timeout: 5e3,
754
+ stdin: "ignore",
755
+ env: { ...process.env, CODEX_MANAGED_BY_NPM: "1" }
756
+ });
718
757
  if (result.exitCode === 0) {
719
758
  const versionLine = result.stdout.trim().split("\n")[0] ?? "";
720
759
  return {
@@ -722,16 +761,9 @@ var CodexAdapter = class {
722
761
  version: parseVersion(versionLine)
723
762
  };
724
763
  }
725
- return {
726
- available: false,
727
- error: result.stderr.trim() || result.stdout.trim() || `codex --version exited with code ${result.exitCode}`
728
- };
729
- } catch (error) {
730
- const message = error instanceof Error ? error.message : String(error);
731
- return {
732
- available: false,
733
- error: message
734
- };
764
+ return await codexBinaryFallback();
765
+ } catch {
766
+ return await codexBinaryFallback();
735
767
  }
736
768
  }
737
769
  execute(params) {
@@ -751,16 +783,26 @@ var CodexAdapter = class {
751
783
  ),
752
784
  ...params.env,
753
785
  OAC_TOKEN_BUDGET: `${params.tokenBudget}`,
754
- OAC_ALLOW_COMMITS: `${params.allowCommits}`
786
+ OAC_ALLOW_COMMITS: `${params.allowCommits}`,
787
+ CODEX_MANAGED_BY_NPM: "1"
755
788
  };
756
789
  const subprocess = execa2(
757
790
  "codex",
758
- ["exec", "--full-auto", "-C", params.workingDirectory, params.prompt],
791
+ [
792
+ "exec",
793
+ "--full-auto",
794
+ "--json",
795
+ "--ephemeral",
796
+ "-C",
797
+ params.workingDirectory,
798
+ params.prompt
799
+ ],
759
800
  {
760
801
  cwd: params.workingDirectory,
761
802
  env: processEnv,
762
803
  reject: false,
763
- timeout: params.timeoutMs
804
+ timeout: params.timeoutMs,
805
+ stdin: "ignore"
764
806
  }
765
807
  );
766
808
  this.runningExecutions.set(params.executionId, subprocess);
@@ -1120,7 +1162,8 @@ var OpenCodeAdapter = class {
1120
1162
  cwd: params.workingDirectory,
1121
1163
  env: processEnv,
1122
1164
  reject: false,
1123
- timeout: params.timeoutMs
1165
+ timeout: params.timeoutMs,
1166
+ stdin: "ignore"
1124
1167
  }
1125
1168
  );
1126
1169
  this.runningExecutions.set(params.executionId, subprocess);
@@ -1830,4 +1873,4 @@ export {
1830
1873
  isTransientError,
1831
1874
  ExecutionEngine
1832
1875
  };
1833
- //# sourceMappingURL=chunk-QPVNC7S4.js.map
1876
+ //# sourceMappingURL=chunk-VX3VMPD2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/execution/agents/claude-code.adapter.ts","../src/execution/agents/shared.ts","../src/execution/agents/codex.adapter.ts","../src/execution/agents/opencode.adapter.ts","../src/execution/agents/registry.ts","../src/execution/sandbox.ts","../src/execution/worker.ts","../src/execution/normalize-error.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\";\nimport {\n AsyncEventQueue,\n type TokenPatch,\n type TokenState,\n isRecord,\n readNumber,\n readString,\n} from \"./shared.js\";\n\ntype RunningProcess = ReturnType<typeof execa>;\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 {} // best-effort: agent output may not be valid JSON\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 stdin: \"ignore\",\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","/**\n * Shared utilities for agent adapters.\n *\n * Extracted from claude-code.adapter.ts and codex.adapter.ts to eliminate\n * ~100 lines of identical code duplicated between the two.\n */\n\n// ── Types ───────────────────────────────────────────────────\n\nexport interface TokenState {\n inputTokens: number;\n outputTokens: number;\n cumulativeTokens: number;\n}\n\nexport interface TokenPatch {\n inputTokens?: number;\n outputTokens?: number;\n cumulativeTokens?: number;\n}\n\n// ── AsyncEventQueue ─────────────────────────────────────────\n\nexport class 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\n// ── Utility functions ───────────────────────────────────────\n\nexport { isRecord } from \"../../core/utils.js\";\n\nexport function 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\nexport function 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\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\";\nimport {\n AsyncEventQueue,\n type TokenPatch,\n type TokenState,\n isRecord,\n readNumber,\n readString,\n} from \"./shared.js\";\n\ntype RunningProcess = ReturnType<typeof execa>;\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 {} // best-effort: agent output may not be valid JSON\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 // Codex JSONL envelope: {\"type\":\"item.completed\",\"item\":{\"type\":\"file_change\",...}}\n if (payload.type === \"item.completed\") {\n const item = isRecord(payload.item) ? payload.item : undefined;\n if (item?.type === \"file_change\") {\n const action = normalizeFileAction(item.action) ?? \"modify\";\n const path = readString(item.path ?? item.filename);\n if (path) {\n return { type: \"file_edit\", action, 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 // Codex JSONL envelope: {\"type\":\"item.completed\",\"item\":{\"type\":\"command_execution\",\"command\":\"...\"}}\n if (payload.type === \"item.completed\") {\n const item = isRecord(payload.item) ? payload.item : undefined;\n if (item?.type === \"command_execution\") {\n const command = readString(item.command);\n if (command) {\n return { type: \"tool_use\", tool: \"shell\", input: { command } };\n }\n }\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 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\n/**\n * Codex CLI v0.104+ is a native TUI binary that may not respond to `--version`\n * in headless environments. Fall back to verifying the binary exists in PATH.\n */\nasync function codexBinaryFallback(): Promise<AgentAvailability> {\n try {\n const whichResult = await execa(\"which\", [\"codex\"], {\n reject: false,\n timeout: 3_000,\n stdin: \"ignore\",\n });\n if (whichResult.exitCode === 0 && whichResult.stdout.trim().length > 0) {\n return { available: true, version: undefined };\n }\n } catch {\n // which also failed\n }\n return { available: false, error: \"codex is not installed or not in PATH.\" };\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\"], {\n reject: false,\n timeout: 5_000,\n stdin: \"ignore\",\n env: { ...process.env, CODEX_MANAGED_BY_NPM: \"1\" },\n });\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 // Codex CLI v0.104+ is a TUI binary that may hang on --version.\n // Fall back to verifying the binary exists in PATH.\n return await codexBinaryFallback();\n } catch {\n // Timeout or spawn error — try binary existence check.\n return await codexBinaryFallback();\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 CODEX_MANAGED_BY_NPM: \"1\",\n };\n\n const subprocess = execa(\n \"codex\",\n [\n \"exec\",\n \"--full-auto\",\n \"--json\",\n \"--ephemeral\",\n \"-C\",\n params.workingDirectory,\n params.prompt,\n ],\n {\n cwd: params.workingDirectory,\n env: processEnv,\n reject: false,\n timeout: params.timeoutMs,\n stdin: \"ignore\",\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 { 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\";\nimport {\n AsyncEventQueue,\n type TokenPatch,\n type TokenState,\n isRecord,\n readNumber,\n readString,\n} from \"./shared.js\";\n\ntype RunningProcess = ReturnType<typeof execa>;\n\n// ── JSON parsing helpers ─────────────────────────────────────\n\nfunction parseJsonPayload(line: string): Record<string, unknown> | undefined {\n const trimmed = line.trim();\n if (trimmed.length === 0) return undefined;\n\n try {\n const parsed = JSON.parse(trimmed);\n if (isRecord(parsed)) return parsed;\n } catch {} // best-effort: agent output may not be valid JSON\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 ?? payload.input_tokens ??\n payload.promptTokens ?? payload.prompt_tokens ??\n usage?.inputTokens ?? usage?.input_tokens ??\n usage?.promptTokens ?? usage?.prompt_tokens,\n ),\n outputTokens: readNumber(\n payload.outputTokens ?? payload.output_tokens ??\n payload.completionTokens ?? payload.completion_tokens ??\n usage?.outputTokens ?? usage?.output_tokens ??\n usage?.completionTokens ?? usage?.completion_tokens,\n ),\n cumulativeTokens: readNumber(\n payload.cumulativeTokens ?? payload.cumulative_tokens ??\n payload.totalTokens ?? payload.total_tokens ??\n usage?.cumulativeTokens ?? usage?.cumulative_tokens ??\n usage?.totalTokens ?? 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 // Fallback: heuristic text parsing\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\") return undefined;\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) return { type: \"file_edit\", action, path };\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) return undefined;\n\n if (tool === \"create_file\") return { type: \"file_edit\", action: \"create\", path: inputPath };\n if (tool === \"delete_file\") return { type: \"file_edit\", action: \"delete\", path: inputPath };\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\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) return undefined;\n return { type: \"tool_use\", tool, input: payload.input };\n}\n\nfunction parseErrorFromPayload(\n payload: Record<string, unknown>,\n): Extract<AgentEvent, { type: \"error\" }> | undefined {\n if (payload.type !== \"error\") return undefined;\n return {\n type: \"error\",\n message: readString(payload.message) ?? \"Unknown OpenCode CLI error\",\n recoverable: payload.recoverable !== false,\n };\n}\n\nfunction estimateTokenCount(text: string): number {\n if (text.length === 0) return 0;\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction normalizeUnknownError(error: unknown, executionId: string): OacError {\n if (error instanceof OacError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `OpenCode 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\", `OpenCode 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\", `OpenCode 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 \"OpenCode execution failed due to network issues\",\n \"NETWORK_ERROR\",\n \"recoverable\",\n { executionId, message },\n error,\n );\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `OpenCode 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)) return value;\n return 1;\n}\n\nfunction hasBooleanFlag(value: unknown, key: string): boolean {\n if (!isRecord(value)) return false;\n return value[key] === true;\n}\n\nfunction buildFailureMessage(stdout: string, stderr: string): string {\n const trimmedStderr = stderr.trim();\n if (trimmedStderr.length > 0) return trimmedStderr;\n const trimmedStdout = stdout.trim();\n if (trimmedStdout.length > 0) return trimmedStdout;\n return \"OpenCode 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 return match ? match[1] : undefined;\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()) totalBytes += fileStat.size;\n } catch {\n // Ignore missing files and treat as zero-context for estimation.\n }\n }\n return Math.ceil(totalBytes / 4);\n}\n\n// ── Adapter class ────────────────────────────────────────────\n\nexport class OpenCodeAdapter implements AgentProvider {\n public readonly id: AgentProviderId = \"opencode\";\n public readonly name = \"OpenCode\";\n\n private readonly runningExecutions = new Map<string, RunningProcess>();\n\n public async checkAvailability(): Promise<AgentAvailability> {\n try {\n const result = await execa(\"opencode\", [\"--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 `opencode --version exited with code ${result.exitCode}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { available: false, error: message };\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 // `opencode run --format json \"<prompt>\"` — nd-JSON output on stdout\n const subprocess = execa(\n \"opencode\",\n [\"run\", \"--format\", \"json\", params.prompt],\n {\n cwd: params.workingDirectory,\n env: processEnv,\n reject: false,\n timeout: params.timeoutMs,\n stdin: \"ignore\",\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) return;\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 `OpenCode execution timed out for ${params.executionId}`,\n { context: { executionId: params.executionId, timeoutMs: params.timeoutMs } },\n );\n eventQueue.push({ type: \"error\", message: timeoutError.message, recoverable: true });\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: \"OpenCode 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.5,\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) return;\n\n running.kill(\"SIGTERM\");\n const forceKillTimer = setTimeout(() => {\n running.kill(\"SIGKILL\");\n }, 3_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}","import type { AgentProvider } from \"./agent.interface.js\";\nimport { ClaudeCodeAdapter } from \"./claude-code.adapter.js\";\nimport { CodexAdapter } from \"./codex.adapter.js\";\nimport { OpenCodeAdapter } from \"./opencode.adapter.js\";\n\n/**\n * Factory function that creates a new adapter instance.\n *\n * Using factories (rather than singleton instances) ensures each\n * concurrent pipeline run gets its own `runningExecutions` map.\n */\nexport type AdapterFactory = () => AgentProvider;\n\n/**\n * Maintains a registry of agent adapter factories keyed by provider ID.\n *\n * Built-in adapters (claude-code, codex, opencode) are registered at\n * module load time. Custom adapters can be added at runtime with\n * `adapterRegistry.register(id, factory)`.\n */\nclass AdapterRegistry {\n private readonly factories = new Map<string, AdapterFactory>();\n\n /** Well-known aliases (e.g. legacy IDs) that map to canonical provider IDs. */\n private readonly aliases = new Map<string, string>([\n [\"codex-cli\", \"codex\"],\n ]);\n\n /** Register a new adapter factory. Replaces any previous factory for the same ID. */\n register(id: string, factory: AdapterFactory): void {\n this.factories.set(id, factory);\n }\n\n /** Add an alias that maps to an existing canonical ID. */\n alias(alias: string, canonicalId: string): void {\n this.aliases.set(alias, canonicalId);\n }\n\n /** Resolve an ID (including aliases) and return the factory, or `undefined`. */\n get(rawId: string): AdapterFactory | undefined {\n const canonicalId = this.aliases.get(rawId) ?? rawId;\n return this.factories.get(canonicalId);\n }\n\n /** Canonical ID after alias resolution. */\n resolveId(rawId: string): string {\n return this.aliases.get(rawId) ?? rawId;\n }\n\n /** All registered canonical provider IDs. */\n registeredIds(): string[] {\n return [...this.factories.keys()];\n }\n}\n\n/**\n * Global singleton registry with built-in adapters pre-registered.\n */\nexport const adapterRegistry = new AdapterRegistry();\n\n// ── Register built-in adapters ───────────────────────────────\nadapterRegistry.register(\"claude-code\", () => new ClaudeCodeAdapter());\nadapterRegistry.register(\"codex\", () => new CodexAdapter());\nadapterRegistry.register(\"opencode\", () => new OpenCodeAdapter());\n\n","import { mkdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport { simpleGit } from \"simple-git\";\nimport { executionError } from \"../core/index.js\";\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 // intentional: swallow prior rejection to serialize worktree access\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\n/**\n * Allowed characters in branch names.\n * Prevents injection of arbitrary git arguments or path traversal.\n */\nconst SAFE_BRANCH_RE = /^[a-zA-Z0-9/_.-]+$/;\n\nexport async function createSandbox(\n repoPath: string,\n branchName: string,\n baseBranch: string,\n): Promise<SandboxContext> {\n if (!SAFE_BRANCH_RE.test(branchName)) {\n throw executionError(\"AGENT_EXECUTION_FAILED\", `Invalid branch name: ${branchName}`);\n }\n if (!SAFE_BRANCH_RE.test(baseBranch)) {\n throw executionError(\"AGENT_EXECUTION_FAILED\", `Invalid base branch name: ${baseBranch}`);\n }\n\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 type OacEventBus,\n type Task,\n} from \"../core/index.js\";\n\nimport type { AgentEvent, AgentProvider, AgentResult } from \"./agents/agent.interface.js\";\nimport { normalizeExecutionError } from \"./normalize-error.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\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, { taskId: task.id, 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 { OacError, executionError } from \"../core/index.js\";\nimport { isRecord } from \"../core/utils.js\";\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport { isRecord, toErrorMessage };\n\n/**\n * Comprehensive error normalizer shared by both the execution engine and\n * the task worker. Converts arbitrary thrown values into structured\n * OacError instances with the correct error code so that the retry logic\n * in the engine can decide whether an error is transient.\n *\n * Handles: timeout, OOM, network errors, git lock conflicts, abort\n * signals, and a generic fallback.\n */\nexport function normalizeExecutionError(\n error: unknown,\n context: { jobId?: string; taskId: string; attempt?: number; executionId?: string },\n): OacError {\n if (error instanceof OacError) {\n return error;\n }\n\n const message = toErrorMessage(error);\n const { jobId, taskId, attempt, executionId } = context;\n const ctx: Record<string, unknown> = { taskId };\n if (jobId) ctx.jobId = jobId;\n if (executionId) ctx.executionId = executionId;\n if (attempt !== undefined) ctx.attempt = attempt;\n ctx.message = message;\n\n if (/timed out|timeout/i.test(message)) {\n return executionError(\"AGENT_TIMEOUT\", `Task ${taskId} timed out during execution.`, {\n context: ctx,\n cause: error,\n });\n }\n\n if (/out of memory|ENOMEM|heap/i.test(message)) {\n return executionError(\"AGENT_OOM\", `Task ${taskId} ran out of memory.`, {\n context: ctx,\n cause: error,\n });\n }\n\n if (/network|ECONN|ENOTFOUND|EAI_AGAIN/i.test(message)) {\n return new OacError(\n `Task ${taskId} failed due to a network error.`,\n \"NETWORK_ERROR\",\n \"recoverable\",\n ctx,\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 `Task ${taskId} failed due to a git lock conflict.`,\n \"GIT_LOCK_FAILED\",\n \"recoverable\",\n ctx,\n error,\n );\n }\n\n if (isRecord(error) && error.name === \"AbortError\") {\n return executionError(\"AGENT_EXECUTION_FAILED\", `Task ${taskId} was aborted.`, {\n context: ctx,\n cause: error,\n });\n }\n\n return executionError(\"AGENT_EXECUTION_FAILED\", `Task ${taskId} failed during execution.`, {\n context: ctx,\n cause: error,\n });\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 { normalizeExecutionError, toErrorMessage } from \"./normalize-error.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 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 return normalizeExecutionError(error, {\n jobId: job.id,\n taskId: job.task.id,\n attempt: job.attempts,\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","parseJsonPayload","parseTokenPatchFromPayload","patchTokenState","parseTokenEvent","normalizeFileAction","parseFileEditFromPayload","estimateTokenCount","normalizeUnknownError","computeTotalTokens","normalizeExitCode","hasBooleanFlag","buildFailureMessage","execa","createInterface","stat","createInterface","execa","parseJsonPayload","parseTokenPatchFromPayload","patchTokenState","parseTokenEvent","normalizeFileAction","parseFileEditFromPayload","parseToolUseFromPayload","parseErrorFromPayload","estimateTokenCount","normalizeUnknownError","computeTotalTokens","normalizeExitCode","hasBooleanFlag","buildFailureMessage","parseVersion","estimateContextTokens","stat","execa","createInterface","randomUUID","DEFAULT_TIMEOUT_MS","DEFAULT_TOKEN_BUDGET","randomUUID"]}
package/dist/cli/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createCliProgram,
3
3
  runCli
4
- } from "../chunk-LRTQCVQK.js";
4
+ } from "../chunk-SUN44O2W.js";
5
5
  import "../chunk-OS3XDHOJ.js";
6
6
  import "../chunk-6JEFW6B7.js";
7
7
  import "../chunk-5GAUWC3L.js";
8
- import "../chunk-QPVNC7S4.js";
8
+ import "../chunk-VX3VMPD2.js";
9
9
  import "../chunk-7C7SC4TZ.js";
10
10
  import "../chunk-6A37SKAJ.js";
11
11
  import "../chunk-LQC5DLT7.js";
package/dist/cli/index.js CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  EXIT_CONFIG_ERROR,
5
5
  EXIT_GENERAL_ERROR,
6
6
  runCli
7
- } from "../chunk-LRTQCVQK.js";
7
+ } from "../chunk-SUN44O2W.js";
8
8
  import "../chunk-OS3XDHOJ.js";
9
9
  import "../chunk-6JEFW6B7.js";
10
10
  import "../chunk-5GAUWC3L.js";
11
- import "../chunk-QPVNC7S4.js";
11
+ import "../chunk-VX3VMPD2.js";
12
12
  import "../chunk-7C7SC4TZ.js";
13
13
  import "../chunk-6A37SKAJ.js";
14
14
  import "../chunk-LQC5DLT7.js";
@@ -17,7 +17,7 @@ import {
17
17
  CodexAdapter,
18
18
  createSandbox,
19
19
  executeTask
20
- } from "../chunk-QPVNC7S4.js";
20
+ } from "../chunk-VX3VMPD2.js";
21
21
  import {
22
22
  createEventBus
23
23
  } from "../chunk-7C7SC4TZ.js";
@@ -9,7 +9,7 @@ import {
9
9
  epicAsTask,
10
10
  executeTask,
11
11
  isTransientError
12
- } from "../chunk-QPVNC7S4.js";
12
+ } from "../chunk-VX3VMPD2.js";
13
13
  import "../chunk-7C7SC4TZ.js";
14
14
  import "../chunk-6A37SKAJ.js";
15
15
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open330/oac",
3
- "version": "2026.220.2",
3
+ "version": "2026.221.0",
4
4
  "description": "Open Agent Contribution - automate open source contributions with AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,19 +36,6 @@
36
36
  "engines": {
37
37
  "node": ">=20.0.0"
38
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"
51
- },
52
39
  "dependencies": {
53
40
  "@fastify/cors": "^10.0.2",
54
41
  "@fastify/static": "^8.1.0",
@@ -80,5 +67,16 @@
80
67
  "tsx": "^4.19.0",
81
68
  "typescript": "^5.7.3",
82
69
  "vitest": "^3.0.5"
70
+ },
71
+ "scripts": {
72
+ "build": "tsup",
73
+ "test": "vitest run",
74
+ "test:coverage": "vitest run --coverage",
75
+ "lint": "biome check .",
76
+ "lint:fix": "biome check --write .",
77
+ "format": "biome format --write .",
78
+ "typecheck": "tsc --noEmit",
79
+ "dev:dashboard": "tsx src/dashboard/dev.ts",
80
+ "clean": "rm -rf dist coverage"
83
81
  }
84
- }
82
+ }