- Each workflow factory takes defaultAdapter: AgentFn + adapters?: Partial<Record<RoleUnion, AgentFn>> - index.ts only overrides roles that differ from default (planner/coder use cursor, rest fallback) - Cleaner call sites, type-safe role names Refs #15
45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
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<Record<SolveIssueRole, AgentFn>>;
|
|
nerveRoot: string;
|
|
extract: LlmExtractorConfig;
|
|
};
|
|
|
|
export function createSolveIssueWorkflow({
|
|
adapters,
|
|
nerveRoot,
|
|
extract,
|
|
}: CreateSolveIssueDeps): WorkflowDefinition<WorkflowMeta> {
|
|
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,
|
|
};
|
|
}
|