feat(11-05): add spawnArchitect tRPC procedures

- Add spawnArchitectDiscuss for context-gathering mode
- Add spawnArchitectBreakdown for phase decomposition mode
- Both procedures validate initiative exists before spawning
- Use comprehensive prompts from agent/prompts module
This commit is contained in:
Lukas May
2026-01-31 19:16:50 +01:00
parent 773f6f92ac
commit c13985909a

View File

@@ -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',
});
}),
});
/**