feat(kanban): card detail modal and rich agent-run console

- RunEventList: grouped activity timeline. Assistant text becomes chat
  bubbles (auto-collapsing long messages); tool_start/tool_end pair into
  entries with spinners and expandable input/result blocks; bevy output
  rolls into a live console; relative timestamps on a left rail
- AgentRunBar: redesigned as a mission console. Live stats header (elapsed
  time, tool count, events), animated status banner with sweep/glow while
  running, clearer action bar. All controls preserved (run/steer/stop,
  diff/merge/bevy) so the human-only merge/complete safety model holds
- tailwind.css: vn-flow, vn-sweep, vn-dots, vn-spin keyframes
- CardModal: full card overlay (orchestrator, references, tags, comments)
- DiffModal: branch-diff review (commits, stat, capped patch)
- useOrchestrator: background polling + bevy status sync + ref-counted SSE
- KanbanCard: pulsing agent/bevy running badge on collapsed cards
This commit is contained in:
2026-06-16 18:17:35 -04:00
parent e4f0abed20
commit 72a41c2d76
11 changed files with 2248 additions and 592 deletions

View File

@@ -24,7 +24,6 @@ interface UseKanbanBoard {
ref: { label: string; type: ReferenceType; href: string },
) => Promise<void>;
removeReference: (cardId: string, href: string) => Promise<void>;
reset: () => Promise<void>;
}
export function useKanbanBoard(): UseKanbanBoard {
@@ -208,16 +207,6 @@ export function useKanbanBoard(): UseKanbanBoard {
[run],
);
const reset = useCallback(async () => {
setError(null);
try {
await kanbanApi.reset();
await reload();
} catch (e) {
setError(e instanceof Error ? e.message : 'Reset failed');
}
}, [reload]);
return {
board,
pages,
@@ -231,6 +220,5 @@ export function useKanbanBoard(): UseKanbanBoard {
removeTag,
addReference,
removeReference,
reset,
};
}