feat: sub-agent streaming progress — TaskTool emits real-time status events
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

- Rust: LoopEvent::SubtaskStatus variant added to loop_runner.rs
- Rust: ToolContext.event_sender field for streaming tool progress
- Rust: TaskTool emits started/running/completed/failed via event_sender
- Rust: StreamChatEvent::SubtaskStatus mapped in Tauri chat command
- TS: StreamEventSubtaskStatus type + onSubtaskStatus callback added
- TS: kernel-chat.ts handles subtaskStatus event from Tauri
- TS: streamStore.ts wires callback, maps backend→frontend status,
  updates assistant message subtasks array in real-time
This commit is contained in:
iven
2026-04-06 13:05:37 +08:00
parent 15a1849255
commit 9871c254be
7 changed files with 116 additions and 1 deletions

View File

@@ -382,6 +382,35 @@ export const useStreamStore = create<StreamState>()(
}
}
},
onSubtaskStatus: (description: string, status: string, detail?: string) => {
// Map backend status to frontend Subtask status
const statusMap: Record<string, Subtask['status']> = {
started: 'pending',
running: 'in_progress',
completed: 'completed',
failed: 'failed',
};
const mappedStatus = statusMap[status] || 'in_progress';
_chat?.updateMessages(msgs =>
msgs.map(m => {
if (m.id !== assistantId) return m;
const subtasks = [...(m.subtasks || [])];
const existingIdx = subtasks.findIndex(st => st.description === description);
if (existingIdx >= 0) {
subtasks[existingIdx] = { ...subtasks[existingIdx], status: mappedStatus, result: detail };
} else {
subtasks.push({
id: `subtask_${Date.now()}_${generateRandomString(4)}`,
description,
status: mappedStatus,
result: detail,
});
}
return { ...m, subtasks };
})
);
},
onComplete: (inputTokens?: number, outputTokens?: number) => {
const currentMsgs = _chat?.getMessages();