Push live updates to the UI while agent runs execute
Engine-side writes - hires, delegated tasks, chat messages, run state - only reached the renderer after a run finished: the queue worker sent one snapshot-changed at the end, and nothing fired at claim time, so the window sat frozen for the minutes a CEO run takes unless the user reloaded by hand. The execution service now takes a notifyDataChanged callback, the agent loop fires it after every tool-bearing iteration, and the worker announces the claim itself, so the UI follows the company working in real time.
This commit is contained in:
1 parent
921c5b4456
commit
de9e6a9fa3
5 files changed
+33
-10
No files matched your search
@@ -23,6 +23,8 @@ export interface AgentRunLoopResult {
|
||||
export interface AgentRunLoopDeps {
|
||||
providers: Pick<ProviderService, "runToolTurn">;
|
||||
tools: AgentToolDeps;
|
||||
/** Called after each iteration's tool calls have written their effects. */
|
||||
onToolResults?: () => void;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,6 +65,7 @@ export async function runAgentLoop(deps: AgentRunLoopDeps, input: AgentRunLoopIn
|
||||
return { toolCallId: call.id, toolName: call.name, output: dispatchAgentTool(deps.tools, input.toolContext, call) };
|
||||
});
|
||||
messages.push({ role: "tool", results });
|
||||
deps.onToolResults?.();
|
||||
}
|
||||
|
||||
throw new Error(`Agent run did not converge within ${MAX_ITERATIONS} iterations.`);
|
||||
|
||||
@@ -54,6 +54,8 @@ export class TaskExecutionService {
|
||||
private readonly db: DatabaseSync,
|
||||
private readonly providers: ProviderService = new ProviderService(db),
|
||||
private readonly skills: SkillService = new SkillService(db, ""),
|
||||
/** Invoked whenever a run writes data mid-flight, so the UI can refresh while agents work. */
|
||||
private readonly notifyDataChanged: () => void = () => undefined,
|
||||
) {
|
||||
this.audit = new AuditService(db);
|
||||
this.organization = new OrganizationService(db);
|
||||
@@ -118,7 +120,11 @@ export class TaskExecutionService {
|
||||
};
|
||||
const chatContext = this.loadChatContext(orgId, isolation);
|
||||
const result = await runAgentLoop(
|
||||
{ providers: this.providers, tools: { db: this.db, organization: this.organization, chat: this.chat } },
|
||||
{
|
||||
providers: this.providers,
|
||||
tools: { db: this.db, organization: this.organization, chat: this.chat },
|
||||
onToolResults: this.notifyDataChanged,
|
||||
},
|
||||
{
|
||||
orgId,
|
||||
providerId: provider.id,
|
||||
|
||||
Reference in new issue
Block a user