diff --git a/src/trpc/router.ts b/src/trpc/router.ts index 0047440..8fdbe2b 100644 --- a/src/trpc/router.ts +++ b/src/trpc/router.ts @@ -16,6 +16,7 @@ import type { PhaseRepository } from '../db/repositories/phase-repository.js'; import type { DispatchManager } from '../dispatch/types.js'; import type { CoordinationManager } from '../coordination/types.js'; import type { Phase } from '../db/schema.js'; +import { buildDiscussPrompt, buildBreakdownPrompt } from '../agent/prompts.js'; /** * Initialize tRPC with our context type. @@ -839,6 +840,74 @@ export const appRouter = router({ } return created; }), + + // =========================================================================== + // Architect Spawn Procedures + // =========================================================================== + + /** + * Spawn architect in discuss mode. + * Uses comprehensive discuss prompt to gather context from user. + */ + spawnArchitectDiscuss: publicProcedure + .input(z.object({ + name: z.string().min(1), + initiativeId: z.string().min(1), + context: z.string().optional(), + })) + .mutation(async ({ ctx, input }) => { + const agentManager = requireAgentManager(ctx); + const initiativeRepo = requireInitiativeRepository(ctx); + + const initiative = await initiativeRepo.findById(input.initiativeId); + if (!initiative) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: `Initiative '${input.initiativeId}' not found`, + }); + } + + const prompt = buildDiscussPrompt(initiative, input.context); + + return agentManager.spawn({ + name: input.name, + taskId: input.initiativeId, + prompt, + mode: 'discuss', + }); + }), + + /** + * Spawn architect in breakdown mode. + * Uses comprehensive breakdown prompt to decompose initiative into phases. + */ + spawnArchitectBreakdown: publicProcedure + .input(z.object({ + name: z.string().min(1), + initiativeId: z.string().min(1), + contextSummary: z.string().optional(), + })) + .mutation(async ({ ctx, input }) => { + const agentManager = requireAgentManager(ctx); + const initiativeRepo = requireInitiativeRepository(ctx); + + const initiative = await initiativeRepo.findById(input.initiativeId); + if (!initiative) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: `Initiative '${input.initiativeId}' not found`, + }); + } + + const prompt = buildBreakdownPrompt(initiative, input.contextSummary); + + return agentManager.spawn({ + name: input.name, + taskId: input.initiativeId, + prompt, + mode: 'breakdown', + }); + }), }); /**