feat: aggregate task progress updates

This commit is contained in:
2026-08-03 16:17:15 +08:00
parent 9312b09e76
commit 10d95c4a5e
11 changed files with 273 additions and 13 deletions
+12
View File
@@ -116,6 +116,13 @@ const rendererContext = new TrustedDOMRendererContext(messages, presence, {
loadDraft(callID) { return conversationStore.getToolDraft(callID); },
saveDraft(callID, values) { conversationStore.saveToolDraft(callID, values); },
clearDraft(callID) { conversationStore.clearToolDraft(callID); },
}, {
requestCancel(operationID) {
const transition = interactionKernel.requestTaskCancel(operationID, new Date().toISOString());
conversationStore.replaceTasks(interactionKernel.snapshot().tasks);
return transition.disposition === "accepted";
},
read(operationID) { return interactionKernel.snapshot().tasks.find(task => task.operation_id === operationID); },
});
const rendererRegistry = new RendererRegistry<TrustedDOMRendererContext>();
rendererRegistry.register("user-message", (item, context) => context.renderUserMessage(item));
@@ -186,6 +193,9 @@ async function syncLoop(): Promise<void> {
if (result.items.some(item => item.kind === "tool-call" || item.kind === "tool-result" || item.kind === "tool-cancel")) {
conversationStore.replaceToolCalls(result.snapshot.tool_calls);
}
if (result.items.some(item => item.kind === "progress" && item.task)) {
conversationStore.replaceTasks(result.snapshot.tasks);
}
for (const item of result.items) {
if (conversationStore.recordIncoming(item, message.message_seq, new Date().toISOString())) renderIncoming(item);
}
@@ -233,7 +243,9 @@ $<HTMLFormElement>("#login-form").addEventListener("submit", async event => {
session = { ...session, uid: body.uid, agentUID: body.agent_uid || session.agentUID, channelID: body.channel_id || session.channelID, channelType: body.channel_type || session.channelType, lastSeq: 0, active: true };
const snapshot = conversationStore.open(currentConversationKey());
interactionKernel.restoreToolCalls(snapshot.tool_calls, new Date().toISOString());
interactionKernel.restoreTasks(snapshot.tasks);
conversationStore.replaceToolCalls(interactionKernel.snapshot().tool_calls);
conversationStore.replaceTasks(interactionKernel.snapshot().tasks);
session.lastSeq = snapshot.cursor;
messages.replaceChildren(); rendererContext.reset();
loginView.hidden = true; chatView.hidden = false;