import type { RuneConfig } from "../../src/types.ts"; import type { AgentRunner, AgentResult } from "./runner.ts"; import { CommandLevelRunner } from "./agent-mock.ts"; export type PlanOverride = ( projectDir: string, changeName: string, docName: string, config: RuneConfig, ) => Promise; export type BuildOverride = ( projectDir: string, changeName: string, config: RuneConfig, ) => Promise; export type ArchiveOverride = ( projectDir: string, changeName: string, config: RuneConfig, ) => Promise; export interface ScenarioOverrides { plan?: PlanOverride; build?: BuildOverride; archive?: ArchiveOverride; } export class ScenarioRunner implements AgentRunner { readonly tier = 2; private defaults: CommandLevelRunner; private overrides: ScenarioOverrides; constructor(defaults: CommandLevelRunner, overrides: ScenarioOverrides = {}) { this.defaults = defaults; this.overrides = overrides; } async runPlan( projectDir: string, changeName: string, docName: string, config: RuneConfig, ): Promise { if (this.overrides.plan) { return this.overrides.plan(projectDir, changeName, docName, config); } return this.defaults.runPlan(projectDir, changeName, docName, config); } async runBuild(projectDir: string, changeName: string, config: RuneConfig): Promise { if (this.overrides.build) { return this.overrides.build(projectDir, changeName, config); } return this.defaults.runBuild(projectDir, changeName, config); } async runArchive( projectDir: string, changeName: string, config: RuneConfig, ): Promise { if (this.overrides.archive) { return this.overrides.archive(projectDir, changeName, config); } return this.defaults.runArchive(projectDir, changeName, config); } }