feat(06-03): add coordination tRPC procedures

- Add coordinationManager to TRPCContext and CreateContextOptions
- Add requireCoordinationManager helper function
- Add queueMerge mutation for queuing tasks for merge
- Add processMerges mutation for processing merges in dependency order
- Add getMergeQueueStatus query for queue state inspection
- Add getNextMergeable query for next mergeable task
This commit is contained in:
Lukas May
2026-01-30 21:12:48 +01:00
parent 37a90db28c
commit 1a4de26966
2 changed files with 73 additions and 0 deletions

View File

@@ -10,6 +10,7 @@ import type { AgentManager } from '../agent/types.js';
import type { TaskRepository } from '../db/repositories/task-repository.js';
import type { MessageRepository } from '../db/repositories/message-repository.js';
import type { DispatchManager } from '../dispatch/types.js';
import type { CoordinationManager } from '../coordination/types.js';
// Re-export for convenience
export type { EventBus, DomainEvent };
@@ -32,6 +33,8 @@ export interface TRPCContext {
messageRepository?: MessageRepository;
/** Dispatch manager for task queue operations (optional until server wiring complete) */
dispatchManager?: DispatchManager;
/** Coordination manager for merge queue operations (optional until server wiring complete) */
coordinationManager?: CoordinationManager;
}
/**
@@ -45,6 +48,7 @@ export interface CreateContextOptions {
taskRepository?: TaskRepository;
messageRepository?: MessageRepository;
dispatchManager?: DispatchManager;
coordinationManager?: CoordinationManager;
}
/**
@@ -62,5 +66,6 @@ export function createContext(options: CreateContextOptions): TRPCContext {
taskRepository: options.taskRepository,
messageRepository: options.messageRepository,
dispatchManager: options.dispatchManager,
coordinationManager: options.coordinationManager,
};
}

View File

@@ -12,6 +12,7 @@ import type { AgentInfo, AgentResult } from '../agent/types.js';
import type { TaskRepository } from '../db/repositories/task-repository.js';
import type { MessageRepository } from '../db/repositories/message-repository.js';
import type { DispatchManager } from '../dispatch/types.js';
import type { CoordinationManager } from '../coordination/types.js';
/**
* Initialize tRPC with our context type.
@@ -218,6 +219,19 @@ function requireDispatchManager(ctx: TRPCContext): DispatchManager {
return ctx.dispatchManager;
}
/**
* Helper to ensure coordinationManager is available in context.
*/
function requireCoordinationManager(ctx: TRPCContext): CoordinationManager {
if (!ctx.coordinationManager) {
throw new TRPCError({
code: 'INTERNAL_SERVER_ERROR',
message: 'Coordination manager not available',
});
}
return ctx.coordinationManager;
}
// =============================================================================
// Application Router with Procedures
// =============================================================================
@@ -245,6 +259,10 @@ function requireDispatchManager(ctx: TRPCContext): DispatchManager {
* - dispatchNext: Dispatch next available task
* - getQueueState: Get dispatch queue state
* - completeTask: Mark a task as complete
* - queueMerge: Queue a completed task for merge
* - processMerges: Process all ready merges in dependency order
* - getMergeQueueStatus: Get merge queue status
* - getNextMergeable: Get next task ready to merge
*/
export const appRouter = router({
/**
@@ -565,6 +583,56 @@ export const appRouter = router({
await dispatchManager.completeTask(input.taskId);
return { success: true };
}),
// ===========================================================================
// Coordination Procedures
// ===========================================================================
/**
* Queue a completed task for merge.
* Task will be merged when all dependencies complete.
*/
queueMerge: publicProcedure
.input(z.object({ taskId: z.string().min(1) }))
.mutation(async ({ ctx, input }) => {
const coordinationManager = requireCoordinationManager(ctx);
await coordinationManager.queueMerge(input.taskId);
return { success: true };
}),
/**
* Process all ready merges in dependency order.
* Returns results of all merge operations.
*/
processMerges: publicProcedure
.input(z.object({
targetBranch: z.string().default('main'),
}))
.mutation(async ({ ctx, input }) => {
const coordinationManager = requireCoordinationManager(ctx);
const results = await coordinationManager.processMerges(input.targetBranch);
return { results };
}),
/**
* Get merge queue status.
* Shows queued, in-progress, merged, and conflicted tasks.
*/
getMergeQueueStatus: publicProcedure
.query(async ({ ctx }) => {
const coordinationManager = requireCoordinationManager(ctx);
return coordinationManager.getQueueState();
}),
/**
* Get next task ready to merge.
* Returns task with all dependencies resolved.
*/
getNextMergeable: publicProcedure
.query(async ({ ctx }) => {
const coordinationManager = requireCoordinationManager(ctx);
return coordinationManager.getNextMergeable();
}),
});
/**