import type { AgentFn, WorkflowDefinition } from "@uncaged/nerve-core"; import type { LlmExtractorConfig } from "@uncaged/nerve-workflow-utils"; import { moderator } from "./moderator.js"; import type { WorkflowMeta } from "./moderator.js"; import { createCommitterRole } from "./roles/committer/index.js"; import { createImplementRole } from "./roles/implement/index.js"; import { createPlanRole } from "./roles/plan/index.js"; import { createPrepareRole } from "./roles/prepare/index.js"; import { createPublishRole } from "./roles/publish/index.js"; import { createReadIssueRole } from "./roles/read-issue/index.js"; import { createReviewRole } from "./roles/review/index.js"; import { createTestRole } from "./roles/test/index.js"; type SolveIssueRole = 'read-issue' | 'prepare' | 'plan' | 'implement' | 'committer' | 'review' | 'test' | 'publish'; export type CreateSolveIssueDeps = { defaultAdapter: AgentFn; adapters?: Partial>; nerveRoot: string; extract: LlmExtractorConfig; }; export function createSolveIssueWorkflow({ adapters, nerveRoot, extract, }: CreateSolveIssueDeps): WorkflowDefinition { const a = (role: SolveIssueRole) => adapters?.[role] ?? defaultAdapter; return { name: "solve-issue", roles: { "read-issue": createReadIssueRole(a("read-issue"), extract), prepare: createPrepareRole(a("prepare"), extract), plan: createPlanRole(a("plan"), { extract, nerveRoot }), implement: createImplementRole(a("implement"), { extract, nerveRoot }), committer: createCommitterRole(a("committer"), { extract, nerveRoot }), review: createReviewRole(a("review"), extract, nerveRoot), test: createTestRole(a("test"), extract), publish: createPublishRole(a("publish"), { extract, nerveRoot }), }, moderator, }; }