{"version":3,"file":"cavecrew-runtime.d.ts","sourceRoot":"","sources":["../../src/core/cavecrew-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { WorkspaceSafety } from \"./safety/manager.js\";\nimport type { WorkspaceEdit } from \"./safety/transaction.js\";\nimport {\n\tcreateSubagentContextPacket,\n\ttype ResolvedSubagentInvocation,\n\tresolveSubagentInvocation,\n\tvalidateParentSubagentOutput,\n} from \"./subagent-runtime.js\";\n\nexport type CavecrewTerminalState =\n\t| \"completed\"\n\t| \"investigation_failed\"\n\t| \"plan_invalid\"\n\t| \"builder_scope_exceeded\"\n\t| \"builder_failed_and_rolled_back\"\n\t| \"review_changes_required\"\n\t| \"cancelled\"\n\t| \"blocked\";\n\nexport interface CavecrewInvestigationResult {\n\tobjective: string;\n\tsummary: string;\n\tflow: string[];\n\trootCauses: string[];\n\trelevantFiles: string[];\n\tunknowns: string[];\n\trecommendedNextAgent: string;\n}\n\nexport interface CavecrewPlan {\n\tscope: string[];\n\tnonGoals: string[];\n\timplementationSteps: string[];\n\tinvariants: string[];\n\tfocusedTests: string[];\n\tacceptanceCriteria: string[];\n\trollbackExpectations: string[];\n}\n\nexport interface CavecrewBuilderResult {\n\tobjective: string;\n\tstatus: \"implemented\" | \"failed\";\n\tfilesChanged: string[];\n\tvalidations: string[];\n\trollbackState: \"confirmed\" | \"rolled_back\" | \"conflict\";\n\tremainingRisks: string[];\n\ttransactionId?: string;\n\tleaseId?: string;\n\tcheckpointId?: string;\n}\n\nexport interface CavecrewReviewResult {\n\tverdict: \"pass\" | \"changes_required\";\n\tfindings: string[];\n\tmissingTests: string[];\n\tacceptanceGaps: string[];\n}\n\nexport interface CavecrewProviderFixtures {\n\tinvestigator: (assignment: string, invocation: ResolvedSubagentInvocation) => Promise<unknown>;\n\tplanner: (\n\t\tinvestigations: readonly CavecrewInvestigationResult[],\n\t\tinvocation: ResolvedSubagentInvocation,\n\t) => Promise<unknown>;\n\tbuilder: (\n\t\tplan: CavecrewPlan,\n\t\tinvocation: ResolvedSubagentInvocation,\n\t) => Promise<{ edits: WorkspaceEdit[]; output: unknown }>;\n\treviewer: (\n\t\tinput: { plan: CavecrewPlan; builder: CavecrewBuilderResult },\n\t\tinvocation: ResolvedSubagentInvocation,\n\t) => Promise<unknown>;\n}\n\nexport interface CavecrewRequest {\n\tobjective: string;\n\tassignments: string[];\n\tparentRunId?: string;\n\tcwd: string;\n\tstorageDir: string;\n\tsignal?: AbortSignal;\n\tfixtures: CavecrewProviderFixtures;\n}\n\nexport interface CavecrewResult {\n\tparentRunId: string;\n\tchildRunIds: string[];\n\tstate: CavecrewTerminalState;\n\tinvestigations: CavecrewInvestigationResult[];\n\tplan?: CavecrewPlan;\n\tbuilder?: CavecrewBuilderResult;\n\treview?: CavecrewReviewResult;\n}\n\nfunction assertNotAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new Error(\"CAVECREW_CANCELLED\");\n}\n\nfunction parseOutput<T>(value: unknown): T {\n\tif (typeof value === \"string\") return JSON.parse(value) as T;\n\treturn value as T;\n}\n\nexport async function runCavecrew(request: CavecrewRequest): Promise<CavecrewResult> {\n\tconst parentRunId = request.parentRunId ?? randomUUID();\n\tconst childRunIds = request.assignments.map(() => randomUUID());\n\tconst result: CavecrewResult = { parentRunId, childRunIds, state: \"blocked\", investigations: [] };\n\tlet phase: \"investigation\" | \"planning\" | \"builder\" | \"review\" = \"investigation\";\n\ttry {\n\t\tassertNotAborted(request.signal);\n\t\tconst investigatorResults = await Promise.all(\n\t\t\trequest.assignments.map(async (assignment, index) => {\n\t\t\t\tconst invocation = resolveSubagentInvocation({\n\t\t\t\t\trequestedAgent: \"cavecrew-investigator\",\n\t\t\t\t\tparentRunId,\n\t\t\t\t\tchildRunId: childRunIds[index],\n\t\t\t\t});\n\t\t\t\tcreateSubagentContextPacket({ invocation, objective: assignment });\n\t\t\t\tconst output = parseOutput<CavecrewInvestigationResult>(\n\t\t\t\t\tawait request.fixtures.investigator(assignment, invocation),\n\t\t\t\t);\n\t\t\t\treturn validateParentSubagentOutput({ invocation, rawOutput: output })\n\t\t\t\t\t.value as unknown as CavecrewInvestigationResult;\n\t\t\t}),\n\t\t);\n\t\tresult.investigations = investigatorResults;\n\t\tassertNotAborted(request.signal);\n\n\t\tphase = \"planning\";\n\t\tconst plannerInvocation = resolveSubagentInvocation({\n\t\t\trequestedAgent: \"planner\",\n\t\t\tparentRunId,\n\t\t\tchildRunId: randomUUID(),\n\t\t});\n\t\tconst plan = parseOutput<CavecrewPlan>(await request.fixtures.planner(investigatorResults, plannerInvocation));\n\t\tif (!Array.isArray(plan.scope) || plan.scope.length > 2) {\n\t\t\tresult.state = \"plan_invalid\";\n\t\t\treturn result;\n\t\t}\n\t\tresult.plan = plan;\n\n\t\tphase = \"builder\";\n\t\tconst builderInvocation = resolveSubagentInvocation({\n\t\t\trequestedAgent: \"cavecrew-builder\",\n\t\t\tparentRunId,\n\t\t\tchildRunId: randomUUID(),\n\t\t});\n\t\tconst fixture = await request.fixtures.builder(plan, builderInvocation);\n\t\tif (fixture.edits.length > (builderInvocation.effectiveBudget.maxAffectedFiles ?? 2)) {\n\t\t\tresult.state = \"builder_scope_exceeded\";\n\t\t\treturn result;\n\t\t}\n\t\tif (fixture.edits.some((edit) => edit.kind !== \"create_file\" && edit.kind !== \"replace_file\")) {\n\t\t\tresult.state = \"builder_failed_and_rolled_back\";\n\t\t\treturn result;\n\t\t}\n\t\tconst safety = await WorkspaceSafety.create(request.cwd, { storageDir: request.storageDir }, \"execute\");\n\t\tconst effects = {\n\t\t\treadsWorkspace: true,\n\t\t\twritesWorkspace: true,\n\t\t\tcreatesFiles: true,\n\t\t\tdeletesFiles: false,\n\t\t\texecutesProcesses: false,\n\t\t\tstartsPersistentProcesses: false,\n\t\t\taccessesNetwork: false,\n\t\t\tmutatesGit: false,\n\t\t\tmutatesExternalState: false,\n\t\t\thandlesSecrets: false,\n\t\t\tpotentiallyDestructive: false,\n\t\t\trequiresExclusiveWorkspaceLease: true,\n\t\t\tparallelSafe: false,\n\t\t\tscopes: [{ kind: \"workspace\" as const }],\n\t\t};\n\t\tconst policyInput = {\n\t\t\ttoolName: \"cavecrew-builder\",\n\t\t\teffects,\n\t\t\tresolvedPaths: fixture.edits.map((edit) => edit.path),\n\t\t};\n\t\tconst evaluatedPolicy = safety.evaluate(policyInput);\n\t\tconst policy =\n\t\t\tevaluatedPolicy.decision.outcome === \"require_approval\"\n\t\t\t\t? safety.policy.approve(\n\t\t\t\t\t\t{ ...policyInput, workspaceId: safety.workspaceId, executionMode: \"execute\" },\n\t\t\t\t\t\t\"mutation\",\n\t\t\t\t\t).decision\n\t\t\t\t: evaluatedPolicy.decision;\n\t\tconst mutation = await safety.performMutation({\n\t\t\trunId: builderInvocation.childRunId,\n\t\t\tedits: fixture.edits,\n\t\t\tpolicy,\n\t\t\tvalidation: {\n\t\t\t\tid: \"cavecrew-focused\",\n\t\t\t\tlabel: \"cavecrew-focused\",\n\t\t\t\trun: async () => ({ exitCode: 0, outputArtifact: \"fixture-pass\" }),\n\t\t\t},\n\t\t\teffects,\n\t\t});\n\t\tconst builderOutput = parseOutput<CavecrewBuilderResult>(fixture.output);\n\t\tresult.builder = {\n\t\t\t...builderOutput,\n\t\t\ttransactionId: mutation.transactionId,\n\t\t\trollbackState: mutation.stage === \"confirmed\" ? \"confirmed\" : \"rolled_back\",\n\t\t};\n\t\tif (mutation.stage !== \"confirmed\") {\n\t\t\tresult.state = \"builder_failed_and_rolled_back\";\n\t\t\treturn result;\n\t\t}\n\n\t\tphase = \"review\";\n\t\tconst reviewerInvocation = resolveSubagentInvocation({\n\t\t\trequestedAgent: \"cavecrew-reviewer\",\n\t\t\tparentRunId,\n\t\t\tchildRunId: randomUUID(),\n\t\t});\n\t\tconst review = parseOutput<CavecrewReviewResult>(\n\t\t\tawait request.fixtures.reviewer({ plan, builder: result.builder }, reviewerInvocation),\n\t\t);\n\t\tresult.review = validateParentSubagentOutput({ invocation: reviewerInvocation, rawOutput: review })\n\t\t\t.value as unknown as CavecrewReviewResult;\n\t\tresult.state = result.review.verdict === \"pass\" ? \"completed\" : \"review_changes_required\";\n\t\treturn result;\n\t} catch (error) {\n\t\tif (error instanceof Error && error.message === \"CAVECREW_CANCELLED\") {\n\t\t\tresult.state = \"cancelled\";\n\t\t} else if (phase === \"builder\") {\n\t\t\tresult.state = \"builder_failed_and_rolled_back\";\n\t\t} else if (phase === \"review\") {\n\t\t\tresult.state = \"review_changes_required\";\n\t\t} else if (phase === \"planning\") {\n\t\t\tresult.state = \"plan_invalid\";\n\t\t} else {\n\t\t\tresult.state = \"investigation_failed\";\n\t\t}\n\t\treturn result;\n\t}\n}\n"]}