Revert "fix: Spawn chat agent in background to avoid blocking event loop"
This reverts commit 8ee02f6013.
This commit is contained in:
@@ -8,6 +8,8 @@ import type { ProcedureBuilder } from '../trpc.js';
|
||||
import {
|
||||
requireAgentManager,
|
||||
requireInitiativeRepository,
|
||||
requirePhaseRepository,
|
||||
requirePageRepository,
|
||||
requireTaskRepository,
|
||||
requireChatSessionRepository,
|
||||
} from './_helpers.js';
|
||||
@@ -81,12 +83,22 @@ export function chatSessionProcedures(publicProcedure: ProcedureBuilder) {
|
||||
}
|
||||
}
|
||||
|
||||
// Gather data needed for spawn (fast DB reads) before returning
|
||||
// Spawn fresh agent with chat history + context
|
||||
const messages = await chatRepo.findMessagesBySessionId(session.id);
|
||||
const chatHistory: ChatHistoryEntry[] = messages
|
||||
.slice(-MAX_HISTORY_MESSAGES)
|
||||
.map(m => ({ role: m.role as 'user' | 'assistant' | 'system', content: m.content }));
|
||||
|
||||
const context = await gatherInitiativeContext(
|
||||
ctx.phaseRepository,
|
||||
ctx.taskRepository,
|
||||
ctx.pageRepository,
|
||||
input.initiativeId,
|
||||
);
|
||||
|
||||
const prompt = buildChatPrompt(input.targetType, input.targetId, chatHistory, input.message);
|
||||
|
||||
// Create a task for the chat agent
|
||||
const targetName = input.targetType === 'phase'
|
||||
? (await ctx.phaseRepository?.findById(input.targetId))?.name ?? input.targetId
|
||||
: (await ctx.taskRepository?.findById(input.targetId))?.name ?? input.targetId;
|
||||
@@ -99,21 +111,7 @@ export function chatSessionProcedures(publicProcedure: ProcedureBuilder) {
|
||||
status: 'in_progress',
|
||||
});
|
||||
|
||||
const prompt = buildChatPrompt(input.targetType, input.targetId, chatHistory, input.message);
|
||||
|
||||
// Spawn agent in background — worktree creation + file I/O is heavy
|
||||
// and blocks the event loop, causing ECONNREFUSED on the SSE connection.
|
||||
// The UI detects the agent via SSE events (agent:spawned) + query invalidation.
|
||||
const sessionId = session.id;
|
||||
void (async () => {
|
||||
try {
|
||||
const context = await gatherInitiativeContext(
|
||||
ctx.phaseRepository,
|
||||
ctx.taskRepository,
|
||||
ctx.pageRepository,
|
||||
input.initiativeId,
|
||||
);
|
||||
|
||||
// Determine target phase/task for input context
|
||||
const targetPhase = input.targetType === 'phase'
|
||||
? await ctx.phaseRepository?.findById(input.targetId)
|
||||
: undefined;
|
||||
@@ -137,30 +135,10 @@ export function chatSessionProcedures(publicProcedure: ProcedureBuilder) {
|
||||
},
|
||||
});
|
||||
|
||||
await chatRepo.updateSession(sessionId, { agentId: agent.id });
|
||||
// Link agent to session
|
||||
await chatRepo.updateSession(session.id, { agentId: agent.id });
|
||||
|
||||
ctx.eventBus.emit({
|
||||
type: 'chat:message_created' as const,
|
||||
timestamp: new Date(),
|
||||
payload: { chatSessionId: sessionId, role: 'system' as const },
|
||||
});
|
||||
} catch (err) {
|
||||
const msg = err instanceof Error ? err.message : String(err);
|
||||
// Store error as system message so the UI can display it
|
||||
await chatRepo.createMessage({
|
||||
chatSessionId: sessionId,
|
||||
role: 'system',
|
||||
content: `Failed to start agent: ${msg}`,
|
||||
});
|
||||
ctx.eventBus.emit({
|
||||
type: 'chat:message_created' as const,
|
||||
timestamp: new Date(),
|
||||
payload: { chatSessionId: sessionId, role: 'system' as const },
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
return { sessionId: session.id, agentId: null, action: 'spawned' as const };
|
||||
return { sessionId: session.id, agentId: agent.id, action: 'spawned' as const };
|
||||
}),
|
||||
|
||||
getChatSession: publicProcedure
|
||||
|
||||
Reference in New Issue
Block a user