From 2bd0bc52a31fb2bd36e7edc46e4b26811e99a144 Mon Sep 17 00:00:00 2001 From: Lukas May Date: Sun, 1 Feb 2026 11:44:40 +0100 Subject: [PATCH] feat(12-03): add decompose mode support to MockAgentManager - Import TaskBreakdown from schema.ts - Add decompose_complete status to MockAgentScenario type - Update completeAgent() to handle decompose_complete scenarios - Emit agent:stopped with reason 'decompose_complete' for E2E testing --- src/agent/mock-manager.ts | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/agent/mock-manager.ts b/src/agent/mock-manager.ts index 6e6cd2f..9dad8c7 100644 --- a/src/agent/mock-manager.ts +++ b/src/agent/mock-manager.ts @@ -16,7 +16,7 @@ import type { PendingQuestions, QuestionItem, } from './types.js'; -import type { Decision, PhaseBreakdown } from './schema.js'; +import type { Decision, PhaseBreakdown, TaskBreakdown } from './schema.js'; import type { EventBus, AgentSpawnedEvent, @@ -30,10 +30,11 @@ import type { * Scenario configuration for mock agent behavior. * Uses discriminated union on status to match agent output schema. * - * Supports all three agent modes: + * Supports all four agent modes: * - execute: done/questions/unrecoverable_error * - discuss: questions/context_complete/unrecoverable_error * - breakdown: questions/breakdown_complete/unrecoverable_error + * - decompose: questions/decompose_complete/unrecoverable_error */ export type MockAgentScenario = // Execute mode statuses @@ -66,6 +67,12 @@ export type MockAgentScenario = status: 'breakdown_complete'; phases: PhaseBreakdown[]; delay?: number; + } + // Decompose mode status + | { + status: 'decompose_complete'; + tasks: TaskBreakdown[]; + delay?: number; }; /** @@ -329,6 +336,30 @@ export class MockAgentManager implements AgentManager { this.eventBus.emit(event); } break; + + case 'decompose_complete': + // Decompose mode completion - decomposed phase into tasks + record.result = { + success: true, + message: `Decomposed into ${scenario.tasks.length} tasks`, + }; + record.info.status = 'idle'; + record.info.updatedAt = new Date(); + + if (this.eventBus) { + const event: AgentStoppedEvent = { + type: 'agent:stopped', + timestamp: new Date(), + payload: { + agentId, + name: info.name, + taskId: info.taskId, + reason: 'decompose_complete', + }, + }; + this.eventBus.emit(event); + } + break; } }