@open330/oac 2026.3.6 → 2026.4.1
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.
Potentially problematic release.
This version of @open330/oac might be problematic. Click here for more details.
- package/dist/budget/index.d.ts +78 -0
- package/dist/budget/index.js +17 -0
- package/dist/chunk-LQC5DLT7.js +317 -0
- package/dist/chunk-LQC5DLT7.js.map +1 -0
- package/dist/chunk-NZEI4RPP.js +1499 -0
- package/dist/chunk-NZEI4RPP.js.map +1 -0
- package/dist/{chunk-Z7KEQPGV.js → chunk-SZUDHVBF.js} +65 -89
- package/dist/chunk-SZUDHVBF.js.map +1 -0
- package/dist/chunk-TGZ2TGDA.js +348 -0
- package/dist/chunk-TGZ2TGDA.js.map +1 -0
- package/dist/chunk-UL66HWYF.js +392 -0
- package/dist/chunk-UL66HWYF.js.map +1 -0
- package/dist/chunk-VLR2VYFW.js +475 -0
- package/dist/chunk-VLR2VYFW.js.map +1 -0
- package/dist/chunk-ZPI2VQ7U.js +1732 -0
- package/dist/chunk-ZPI2VQ7U.js.map +1 -0
- package/dist/cli/cli.js +15 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/completion/index.d.ts +91 -0
- package/dist/completion/index.js +590 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/core/index.d.ts +1403 -0
- package/dist/core/index.js +75 -0
- package/dist/core/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +14 -0
- package/dist/dashboard/index.js +1257 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/discovery/index.d.ts +115 -0
- package/dist/discovery/index.js +19 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/event-bus-CRLkpNo0.d.ts +91 -0
- package/dist/execution/index.d.ts +162 -0
- package/dist/execution/index.js +18 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/repo/index.d.ts +33 -0
- package/dist/repo/index.js +19 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/tracking/index.d.ts +357 -0
- package/dist/tracking/index.js +15 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/types-CYCwgojB.d.ts +34 -0
- package/dist/types-cJZwCZZX.d.ts +172 -0
- package/package.json +42 -20
- package/dist/chunk-Z7KEQPGV.js.map +0 -1
- package/dist/cli.js +0 -9
- package/dist/index.js +0 -12
- package/dist/index.js.map +0 -1
- /package/dist/{cli.js.map → budget/index.js.map} +0 -0
- /package/dist/{cli.d.ts → cli/cli.d.ts} +0 -0
- /package/dist/{index.d.ts → cli/index.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
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 {\n type AgentProviderId,\n OacError,\n type TokenEstimate,\n executionError,\n} from \"../../core/index.js\";\nimport { execa } from \"execa\";\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 {\n type AgentProviderId,\n OacError,\n type TokenEstimate,\n executionError,\n} from \"../../core/index.js\";\nimport { execa } from \"execa\";\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 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 if (streamName === \"stdout\") {\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) {\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 } else if (/error|failed|exception/i.test(line)) {\n eventQueue.push({\n type: \"error\",\n message: line.trim(),\n recoverable: true,\n });\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.then(fn, fn);\n worktreeLock = next.then(() => {}, () => {});\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 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\n ? `Labels: ${task.linkedIssue.labels.join(\", \")}`\n : \"\",\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","import { randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\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\";\nimport PQueue from \"p-queue\";\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","createInterface","randomUUID","DEFAULT_TIMEOUT_MS","DEFAULT_TOKEN_BUDGET","isRecord","randomUUID"]}
|
|
@@ -1,8 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
cloneRepo,
|
|
3
|
+
resolveRepo
|
|
4
|
+
} from "./chunk-VLR2VYFW.js";
|
|
5
|
+
import {
|
|
6
|
+
CompositeScanner,
|
|
7
|
+
GitHubIssuesScanner,
|
|
8
|
+
LintScanner,
|
|
9
|
+
TestGapScanner,
|
|
10
|
+
TodoScanner,
|
|
11
|
+
rankTasks
|
|
12
|
+
} from "./chunk-ZPI2VQ7U.js";
|
|
13
|
+
import {
|
|
14
|
+
buildExecutionPlan,
|
|
15
|
+
estimateTokens
|
|
16
|
+
} from "./chunk-UL66HWYF.js";
|
|
17
|
+
import {
|
|
18
|
+
ClaudeCodeAdapter,
|
|
19
|
+
CodexAdapter,
|
|
20
|
+
createSandbox,
|
|
21
|
+
executeTask
|
|
22
|
+
} from "./chunk-NZEI4RPP.js";
|
|
23
|
+
import {
|
|
24
|
+
UNLIMITED_BUDGET,
|
|
25
|
+
createEventBus,
|
|
26
|
+
loadConfig
|
|
27
|
+
} from "./chunk-TGZ2TGDA.js";
|
|
28
|
+
import {
|
|
29
|
+
contributionLogSchema,
|
|
30
|
+
writeContributionLog
|
|
31
|
+
} from "./chunk-LQC5DLT7.js";
|
|
32
|
+
|
|
33
|
+
// src/cli/cli.ts
|
|
3
34
|
import { Command as Command9 } from "commander";
|
|
4
35
|
|
|
5
|
-
// src/commands/doctor.ts
|
|
36
|
+
// src/cli/commands/doctor.ts
|
|
6
37
|
import { spawn } from "child_process";
|
|
7
38
|
import chalk, { Chalk } from "chalk";
|
|
8
39
|
import { Command } from "commander";
|
|
@@ -239,7 +270,7 @@ function runCommand(command, args) {
|
|
|
239
270
|
});
|
|
240
271
|
}
|
|
241
272
|
|
|
242
|
-
// src/commands/init.ts
|
|
273
|
+
// src/cli/commands/init.ts
|
|
243
274
|
import { constants as fsConstants } from "fs";
|
|
244
275
|
import { access, mkdir, writeFile } from "fs/promises";
|
|
245
276
|
import { resolve } from "path";
|
|
@@ -418,10 +449,9 @@ async function pathExists(path) {
|
|
|
418
449
|
}
|
|
419
450
|
}
|
|
420
451
|
|
|
421
|
-
// src/commands/leaderboard.ts
|
|
452
|
+
// src/cli/commands/leaderboard.ts
|
|
422
453
|
import { readFile, readdir } from "fs/promises";
|
|
423
454
|
import { resolve as resolve2 } from "path";
|
|
424
|
-
import { contributionLogSchema } from "@open330/oac-tracking";
|
|
425
455
|
import Table from "cli-table3";
|
|
426
456
|
import { Command as Command3 } from "commander";
|
|
427
457
|
function createLeaderboardCommand() {
|
|
@@ -628,10 +658,9 @@ function isFileNotFoundError(error) {
|
|
|
628
658
|
return error.code === "ENOENT";
|
|
629
659
|
}
|
|
630
660
|
|
|
631
|
-
// src/commands/log.ts
|
|
661
|
+
// src/cli/commands/log.ts
|
|
632
662
|
import { readFile as readFile2, readdir as readdir2 } from "fs/promises";
|
|
633
663
|
import { resolve as resolve3 } from "path";
|
|
634
|
-
import { contributionLogSchema as contributionLogSchema2 } from "@open330/oac-tracking";
|
|
635
664
|
import Table2 from "cli-table3";
|
|
636
665
|
import { Command as Command4 } from "commander";
|
|
637
666
|
function createLogCommand() {
|
|
@@ -709,7 +738,7 @@ async function readContributionLogs2(repoPath) {
|
|
|
709
738
|
try {
|
|
710
739
|
const content = await readFile2(filePath, "utf8");
|
|
711
740
|
const payload = JSON.parse(content);
|
|
712
|
-
const parsed =
|
|
741
|
+
const parsed = contributionLogSchema.safeParse(payload);
|
|
713
742
|
return parsed.success ? parsed.data : null;
|
|
714
743
|
} catch {
|
|
715
744
|
return null;
|
|
@@ -762,17 +791,7 @@ function isFileNotFoundError2(error) {
|
|
|
762
791
|
return code === "ENOENT";
|
|
763
792
|
}
|
|
764
793
|
|
|
765
|
-
// src/
|
|
766
|
-
import { buildExecutionPlan, estimateTokens } from "@open330/oac-budget";
|
|
767
|
-
import {
|
|
768
|
-
CompositeScanner,
|
|
769
|
-
LintScanner,
|
|
770
|
-
TodoScanner,
|
|
771
|
-
rankTasks
|
|
772
|
-
} from "@open330/oac-discovery";
|
|
773
|
-
import { cloneRepo, resolveRepo } from "@open330/oac-repo";
|
|
774
|
-
|
|
775
|
-
// src/github-auth.ts
|
|
794
|
+
// src/cli/github-auth.ts
|
|
776
795
|
import { execFileSync } from "child_process";
|
|
777
796
|
function ensureGitHubAuth() {
|
|
778
797
|
const githubToken = process.env.GITHUB_TOKEN?.trim();
|
|
@@ -828,18 +847,17 @@ function checkGitHubScopes(required = ["repo"]) {
|
|
|
828
847
|
}
|
|
829
848
|
}
|
|
830
849
|
|
|
831
|
-
// src/commands/plan.ts
|
|
850
|
+
// src/cli/commands/plan.ts
|
|
832
851
|
import chalk3, { Chalk as Chalk3 } from "chalk";
|
|
833
852
|
import Table3 from "cli-table3";
|
|
834
853
|
import { Command as Command5 } from "commander";
|
|
835
854
|
import ora from "ora";
|
|
836
855
|
|
|
837
|
-
// src/config-loader.ts
|
|
856
|
+
// src/cli/config-loader.ts
|
|
838
857
|
import { constants as fsConstants2 } from "fs";
|
|
839
858
|
import { access as access2, readFile as readFile3 } from "fs/promises";
|
|
840
859
|
import { resolve as resolve4 } from "path";
|
|
841
860
|
import { pathToFileURL } from "url";
|
|
842
|
-
import { loadConfig } from "@open330/oac-core";
|
|
843
861
|
var LEGACY_DEFINE_CONFIG_IMPORT = /@(?:open330\/oac-core|oac\/core)/;
|
|
844
862
|
var LEGACY_DEFINE_CONFIG_IMPORT_LINE = /^\s*import\s*\{\s*defineConfig\s*\}\s*from\s*["']@(?:open330\/oac-core|oac\/core)["'];\s*$/m;
|
|
845
863
|
var LEGACY_DEFINE_CONFIG_EXPORT = /export\s+default\s+defineConfig\s*\(/;
|
|
@@ -909,7 +927,7 @@ async function pathExists2(path) {
|
|
|
909
927
|
}
|
|
910
928
|
}
|
|
911
929
|
|
|
912
|
-
// src/commands/plan.ts
|
|
930
|
+
// src/cli/commands/plan.ts
|
|
913
931
|
function createPlanCommand() {
|
|
914
932
|
const command = new Command5("plan");
|
|
915
933
|
command.description("Build an execution plan from discovered tasks").option("--repo <owner/repo>", "Target repository (owner/repo or GitHub URL)").option("--tokens <number>", "Token budget for planning", parseInteger3).option("--provider <id>", "Agent provider id").action(async (options, cmd) => {
|
|
@@ -1117,29 +1135,8 @@ function truncate(value, maxLength) {
|
|
|
1117
1135
|
return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
|
|
1118
1136
|
}
|
|
1119
1137
|
|
|
1120
|
-
// src/commands/run.ts
|
|
1138
|
+
// src/cli/commands/run.ts
|
|
1121
1139
|
import { randomUUID } from "crypto";
|
|
1122
|
-
import { buildExecutionPlan as buildExecutionPlan2, estimateTokens as estimateTokens2 } from "@open330/oac-budget";
|
|
1123
|
-
import {
|
|
1124
|
-
UNLIMITED_BUDGET,
|
|
1125
|
-
createEventBus
|
|
1126
|
-
} from "@open330/oac-core";
|
|
1127
|
-
import {
|
|
1128
|
-
CompositeScanner as CompositeScanner2,
|
|
1129
|
-
GitHubIssuesScanner,
|
|
1130
|
-
LintScanner as LintScanner2,
|
|
1131
|
-
TestGapScanner,
|
|
1132
|
-
TodoScanner as TodoScanner2,
|
|
1133
|
-
rankTasks as rankTasks2
|
|
1134
|
-
} from "@open330/oac-discovery";
|
|
1135
|
-
import {
|
|
1136
|
-
ClaudeCodeAdapter,
|
|
1137
|
-
CodexAdapter,
|
|
1138
|
-
createSandbox,
|
|
1139
|
-
executeTask as workerExecuteTask
|
|
1140
|
-
} from "@open330/oac-execution";
|
|
1141
|
-
import { cloneRepo as cloneRepo2, resolveRepo as resolveRepo2 } from "@open330/oac-repo";
|
|
1142
|
-
import { writeContributionLog } from "@open330/oac-tracking";
|
|
1143
1140
|
import chalk4, { Chalk as Chalk4 } from "chalk";
|
|
1144
1141
|
import Table4 from "cli-table3";
|
|
1145
1142
|
import { Command as Command6 } from "commander";
|
|
@@ -1201,10 +1198,10 @@ function createRunCommand() {
|
|
|
1201
1198
|
);
|
|
1202
1199
|
}
|
|
1203
1200
|
const resolveSpinner = createSpinner2(outputJson, "Resolving repository...");
|
|
1204
|
-
const resolvedRepo = await
|
|
1201
|
+
const resolvedRepo = await resolveRepo(repoInput);
|
|
1205
1202
|
resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);
|
|
1206
1203
|
const cloneSpinner = createSpinner2(outputJson, "Preparing local clone...");
|
|
1207
|
-
await
|
|
1204
|
+
await cloneRepo(resolvedRepo);
|
|
1208
1205
|
cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);
|
|
1209
1206
|
const scanSpinner = createSpinner2(
|
|
1210
1207
|
outputJson,
|
|
@@ -1216,7 +1213,7 @@ function createRunCommand() {
|
|
|
1216
1213
|
repo: resolvedRepo
|
|
1217
1214
|
});
|
|
1218
1215
|
scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);
|
|
1219
|
-
let candidateTasks =
|
|
1216
|
+
let candidateTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);
|
|
1220
1217
|
if (options.source) {
|
|
1221
1218
|
candidateTasks = candidateTasks.filter((task) => task.source === options.source);
|
|
1222
1219
|
}
|
|
@@ -1250,7 +1247,7 @@ function createRunCommand() {
|
|
|
1250
1247
|
);
|
|
1251
1248
|
const estimates = await estimateTaskMap2(candidateTasks, providerId);
|
|
1252
1249
|
estimateSpinner?.succeed("Token estimation completed");
|
|
1253
|
-
const plan =
|
|
1250
|
+
const plan = buildExecutionPlan(candidateTasks, estimates, totalBudget);
|
|
1254
1251
|
if (options.dryRun) {
|
|
1255
1252
|
const dryRunSummary = {
|
|
1256
1253
|
runId,
|
|
@@ -1576,20 +1573,20 @@ function selectScannersFromConfig2(config, hasGitHubAuth) {
|
|
|
1576
1573
|
}
|
|
1577
1574
|
const uniqueEnabled = [...new Set(enabled)];
|
|
1578
1575
|
const scannerInstances = uniqueEnabled.map((scannerName) => {
|
|
1579
|
-
if (scannerName === "lint") return new
|
|
1576
|
+
if (scannerName === "lint") return new LintScanner();
|
|
1580
1577
|
if (scannerName === "github-issues") return new GitHubIssuesScanner();
|
|
1581
1578
|
if (scannerName === "test-gap") return new TestGapScanner();
|
|
1582
|
-
return new
|
|
1579
|
+
return new TodoScanner();
|
|
1583
1580
|
});
|
|
1584
1581
|
return {
|
|
1585
1582
|
enabled: uniqueEnabled,
|
|
1586
|
-
scanner: new
|
|
1583
|
+
scanner: new CompositeScanner(scannerInstances)
|
|
1587
1584
|
};
|
|
1588
1585
|
}
|
|
1589
1586
|
async function estimateTaskMap2(tasks, providerId) {
|
|
1590
1587
|
const entries = await Promise.all(
|
|
1591
1588
|
tasks.map(async (task) => {
|
|
1592
|
-
const estimate = await
|
|
1589
|
+
const estimate = await estimateTokens(task, providerId);
|
|
1593
1590
|
return [task.id, estimate];
|
|
1594
1591
|
})
|
|
1595
1592
|
);
|
|
@@ -1607,7 +1604,7 @@ async function executeWithAgent(input2) {
|
|
|
1607
1604
|
cleanup: sandbox.cleanup
|
|
1608
1605
|
};
|
|
1609
1606
|
try {
|
|
1610
|
-
const result = await
|
|
1607
|
+
const result = await executeTask(input2.adapter, input2.task, sandbox, eventBus, {
|
|
1611
1608
|
tokenBudget: input2.estimate.totalEstimatedTokens,
|
|
1612
1609
|
timeoutMs: input2.timeoutSeconds * 1e3
|
|
1613
1610
|
});
|
|
@@ -1966,16 +1963,7 @@ function truncate2(value, maxLength) {
|
|
|
1966
1963
|
return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
|
|
1967
1964
|
}
|
|
1968
1965
|
|
|
1969
|
-
// src/commands/scan.ts
|
|
1970
|
-
import {
|
|
1971
|
-
CompositeScanner as CompositeScanner3,
|
|
1972
|
-
GitHubIssuesScanner as GitHubIssuesScanner2,
|
|
1973
|
-
LintScanner as LintScanner3,
|
|
1974
|
-
TestGapScanner as TestGapScanner2,
|
|
1975
|
-
TodoScanner as TodoScanner3,
|
|
1976
|
-
rankTasks as rankTasks3
|
|
1977
|
-
} from "@open330/oac-discovery";
|
|
1978
|
-
import { cloneRepo as cloneRepo3, resolveRepo as resolveRepo3 } from "@open330/oac-repo";
|
|
1966
|
+
// src/cli/commands/scan.ts
|
|
1979
1967
|
import chalk5, { Chalk as Chalk5 } from "chalk";
|
|
1980
1968
|
import Table5 from "cli-table3";
|
|
1981
1969
|
import { Command as Command7 } from "commander";
|
|
@@ -2003,10 +1991,10 @@ function createScanCommand() {
|
|
|
2003
1991
|
);
|
|
2004
1992
|
}
|
|
2005
1993
|
const resolveSpinner = createSpinner3(outputJson, "Resolving repository...");
|
|
2006
|
-
const resolvedRepo = await
|
|
1994
|
+
const resolvedRepo = await resolveRepo(repoInput);
|
|
2007
1995
|
resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);
|
|
2008
1996
|
const cloneSpinner = createSpinner3(outputJson, "Preparing local clone...");
|
|
2009
|
-
await
|
|
1997
|
+
await cloneRepo(resolvedRepo);
|
|
2010
1998
|
cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);
|
|
2011
1999
|
const scanSpinner = createSpinner3(
|
|
2012
2000
|
outputJson,
|
|
@@ -2018,7 +2006,7 @@ function createScanCommand() {
|
|
|
2018
2006
|
repo: resolvedRepo
|
|
2019
2007
|
});
|
|
2020
2008
|
scanSpinner?.succeed(`Scanned ${resolvedRepo.fullName}`);
|
|
2021
|
-
const rankedTasks =
|
|
2009
|
+
const rankedTasks = rankTasks(scannedTasks).filter(
|
|
2022
2010
|
(task) => task.priority >= options.minPriority
|
|
2023
2011
|
);
|
|
2024
2012
|
if (outputJson) {
|
|
@@ -2141,15 +2129,15 @@ function selectScanners(scannerOption, config, hasGitHubAuth = false) {
|
|
|
2141
2129
|
);
|
|
2142
2130
|
}
|
|
2143
2131
|
const scannerInstances = uniqueEnabled.map((name) => {
|
|
2144
|
-
if (name === "lint") return new
|
|
2145
|
-
if (name === "github-issues") return new
|
|
2146
|
-
if (name === "test-gap") return new
|
|
2147
|
-
return new
|
|
2132
|
+
if (name === "lint") return new LintScanner();
|
|
2133
|
+
if (name === "github-issues") return new GitHubIssuesScanner();
|
|
2134
|
+
if (name === "test-gap") return new TestGapScanner();
|
|
2135
|
+
return new TodoScanner();
|
|
2148
2136
|
});
|
|
2149
2137
|
return {
|
|
2150
2138
|
enabled: uniqueEnabled,
|
|
2151
2139
|
unknown,
|
|
2152
|
-
scanner: new
|
|
2140
|
+
scanner: new CompositeScanner(scannerInstances)
|
|
2153
2141
|
};
|
|
2154
2142
|
}
|
|
2155
2143
|
function scannersFromConfig(config, hasGitHubAuth = false) {
|
|
@@ -2182,7 +2170,7 @@ function truncate3(value, maxLength) {
|
|
|
2182
2170
|
return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
|
|
2183
2171
|
}
|
|
2184
2172
|
|
|
2185
|
-
// src/commands/status.ts
|
|
2173
|
+
// src/cli/commands/status.ts
|
|
2186
2174
|
import { readFile as readFile4 } from "fs/promises";
|
|
2187
2175
|
import { resolve as resolve5 } from "path";
|
|
2188
2176
|
import { Command as Command8 } from "commander";
|
|
@@ -2349,19 +2337,7 @@ function isFileNotFoundError3(error) {
|
|
|
2349
2337
|
return error.code === "ENOENT";
|
|
2350
2338
|
}
|
|
2351
2339
|
|
|
2352
|
-
// src/cli.ts
|
|
2353
|
-
async function readCliVersion() {
|
|
2354
|
-
try {
|
|
2355
|
-
const packageJsonPath = new URL("../package.json", import.meta.url);
|
|
2356
|
-
const packageJsonRaw = await readFile5(packageJsonPath, "utf8");
|
|
2357
|
-
const packageJson = JSON.parse(packageJsonRaw);
|
|
2358
|
-
if (typeof packageJson.version === "string" && packageJson.version.length > 0) {
|
|
2359
|
-
return packageJson.version;
|
|
2360
|
-
}
|
|
2361
|
-
} catch {
|
|
2362
|
-
}
|
|
2363
|
-
return "0.0.0";
|
|
2364
|
-
}
|
|
2340
|
+
// src/cli/cli.ts
|
|
2365
2341
|
function registerCommands(program) {
|
|
2366
2342
|
program.addCommand(createInitCommand());
|
|
2367
2343
|
program.addCommand(createDoctorCommand());
|
|
@@ -2373,7 +2349,7 @@ function registerCommands(program) {
|
|
|
2373
2349
|
program.addCommand(createStatusCommand());
|
|
2374
2350
|
}
|
|
2375
2351
|
async function createCliProgram() {
|
|
2376
|
-
const version =
|
|
2352
|
+
const version = true ? "2026.4.1" : "0.0.0";
|
|
2377
2353
|
const program = new Command9();
|
|
2378
2354
|
program.name("oac").description("Open Agent Contribution CLI").version(version).option("--config <path>", "Config file path", "oac.config.ts").option("--verbose", "Enable verbose logging", false).option("--json", "Output machine-readable JSON", false).option("--no-color", "Disable ANSI colors");
|
|
2379
2355
|
registerCommands(program);
|
|
@@ -2388,4 +2364,4 @@ export {
|
|
|
2388
2364
|
createCliProgram,
|
|
2389
2365
|
runCli
|
|
2390
2366
|
};
|
|
2391
|
-
//# sourceMappingURL=chunk-
|
|
2367
|
+
//# sourceMappingURL=chunk-SZUDHVBF.js.map
|