@polderlabs/bizar 9.0.0 → 10.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bizar-dash/BROWSER_VERIFICATION.md +190 -0
- package/bizar-dash/CHANGELOG.md +572 -0
- package/bizar-dash/CONTROL_SURFACES.md +157 -0
- package/bizar-dash/SETTINGS_AUDIT.md +225 -0
- package/bizar-dash/dist/assets/ActivityFeed-Da-JCrE6.js +11 -0
- package/bizar-dash/dist/assets/ActivityFeed-Da-JCrE6.js.map +1 -0
- package/bizar-dash/dist/assets/ActivityView-nIRsSETb.js +2 -0
- package/bizar-dash/dist/assets/ActivityView-nIRsSETb.js.map +1 -0
- package/bizar-dash/dist/assets/AdminView-DP1NMxmG.js +11 -0
- package/bizar-dash/dist/assets/AdminView-DP1NMxmG.js.map +1 -0
- package/bizar-dash/dist/assets/AgentActivity-lSPkOr-O.js +67 -0
- package/bizar-dash/dist/assets/AgentActivity-lSPkOr-O.js.map +1 -0
- package/bizar-dash/dist/assets/AgentsView-BIWGkz7w.js +13 -0
- package/bizar-dash/dist/assets/AgentsView-BIWGkz7w.js.map +1 -0
- package/bizar-dash/dist/assets/Alert-DN0UysMg.js +6 -0
- package/bizar-dash/dist/assets/Alert-DN0UysMg.js.map +1 -0
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +6 -0
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +1 -0
- package/bizar-dash/dist/assets/AuthView-DW5cs7ma.js +16 -0
- package/bizar-dash/dist/assets/AuthView-DW5cs7ma.js.map +1 -0
- package/bizar-dash/dist/assets/Avatar-DZPv9pvd.js +6 -0
- package/bizar-dash/dist/assets/Avatar-DZPv9pvd.js.map +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-D8O-EyMD.js +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-D8O-EyMD.js.map +1 -0
- package/bizar-dash/dist/assets/BackupView-uwXkhxOV.js +1 -0
- package/bizar-dash/dist/assets/BackupView-uwXkhxOV.js.map +1 -0
- package/bizar-dash/dist/assets/Card-Tyboihu7.js +1 -0
- package/bizar-dash/dist/assets/Card-Tyboihu7.js.map +1 -0
- package/bizar-dash/dist/assets/ChatView-DRBHzgay.js +9 -0
- package/bizar-dash/dist/assets/ChatView-DRBHzgay.js.map +1 -0
- package/bizar-dash/dist/assets/Chip-BrXIlR9w.js +1 -0
- package/bizar-dash/dist/assets/Chip-BrXIlR9w.js.map +1 -0
- package/bizar-dash/dist/assets/ClaudeSessionsView-Ck62jaOr.js +1 -0
- package/bizar-dash/dist/assets/ClaudeSessionsView-Ck62jaOr.js.map +1 -0
- package/bizar-dash/dist/assets/ClipboardView-DfND6xL6.js +1 -0
- package/bizar-dash/dist/assets/ClipboardView-DfND6xL6.js.map +1 -0
- package/bizar-dash/dist/assets/ConfigView-DjJmSrOJ.js +1 -0
- package/bizar-dash/dist/assets/ConfigView-DjJmSrOJ.js.map +1 -0
- package/bizar-dash/dist/assets/DiagnosticsView-CKgItf0J.js +2 -0
- package/bizar-dash/dist/assets/DiagnosticsView-CKgItf0J.js.map +1 -0
- package/bizar-dash/dist/assets/DialogsView-DHYF8dE1.js +6 -0
- package/bizar-dash/dist/assets/DialogsView-DHYF8dE1.js.map +1 -0
- package/bizar-dash/dist/assets/DoctorView-DDLHrSKk.js +6 -0
- package/bizar-dash/dist/assets/DoctorView-DDLHrSKk.js.map +1 -0
- package/bizar-dash/dist/assets/EmptyState-DZ2ouKwd.js +1 -0
- package/bizar-dash/dist/assets/EmptyState-DZ2ouKwd.js.map +1 -0
- package/bizar-dash/dist/assets/EnvVarsView-D1cx83mB.js +8 -0
- package/bizar-dash/dist/assets/EnvVarsView-D1cx83mB.js.map +1 -0
- package/bizar-dash/dist/assets/ErrorState-DwwJ2-Jq.js +1 -0
- package/bizar-dash/dist/assets/ErrorState-DwwJ2-Jq.js.map +1 -0
- package/bizar-dash/dist/assets/EvalView-C9aYixXW.js +1 -0
- package/bizar-dash/dist/assets/EvalView-C9aYixXW.js.map +1 -0
- package/bizar-dash/dist/assets/GoalsView-DZa_mGmh.js +6 -0
- package/bizar-dash/dist/assets/GoalsView-DZa_mGmh.js.map +1 -0
- package/bizar-dash/dist/assets/Grid-CiRyhAgR.js +1 -0
- package/bizar-dash/dist/assets/Grid-CiRyhAgR.js.map +1 -0
- package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js +11 -0
- package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js.map +1 -0
- package/bizar-dash/dist/assets/HistoryView-Dv7aPxJE.js +1 -0
- package/bizar-dash/dist/assets/HistoryView-Dv7aPxJE.js.map +1 -0
- package/bizar-dash/dist/assets/Input-BbFUDQnS.js +1 -0
- package/bizar-dash/dist/assets/Input-BbFUDQnS.js.map +1 -0
- package/bizar-dash/dist/assets/LibrariesView-DBQ83TNa.js +6 -0
- package/bizar-dash/dist/assets/LibrariesView-DBQ83TNa.js.map +1 -0
- package/bizar-dash/dist/assets/LightRAGView-JYpE5u9p.js +6 -0
- package/bizar-dash/dist/assets/LightRAGView-JYpE5u9p.js.map +1 -0
- package/bizar-dash/dist/assets/ListHeader-BGjm11Z0.js +1 -0
- package/bizar-dash/dist/assets/ListHeader-BGjm11Z0.js.map +1 -0
- package/bizar-dash/dist/assets/MemoryView-CnOP2MvM.js +8 -0
- package/bizar-dash/dist/assets/MemoryView-CnOP2MvM.js.map +1 -0
- package/bizar-dash/dist/assets/MessageBubble-5vUAquDx.js +29 -0
- package/bizar-dash/dist/assets/MessageBubble-5vUAquDx.js.map +1 -0
- package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js +1 -0
- package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js.map +1 -0
- package/bizar-dash/dist/assets/ModsView-CU4cAmIz.js +6 -0
- package/bizar-dash/dist/assets/ModsView-CU4cAmIz.js.map +1 -0
- package/bizar-dash/dist/assets/NotificationsView-BYffvthq.js +6 -0
- package/bizar-dash/dist/assets/NotificationsView-BYffvthq.js.map +1 -0
- package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js +1 -0
- package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js.map +1 -0
- package/bizar-dash/dist/assets/OverviewView-0tq8f-Y0.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-0tq8f-Y0.js.map +1 -0
- package/bizar-dash/dist/assets/ProgressBar-B-h60LKA.js +1 -0
- package/bizar-dash/dist/assets/ProgressBar-B-h60LKA.js.map +1 -0
- package/bizar-dash/dist/assets/ProjectsView-DhX5lzHS.js +11 -0
- package/bizar-dash/dist/assets/ProjectsView-DhX5lzHS.js.map +1 -0
- package/bizar-dash/dist/assets/ProvidersView-CJMX7jm9.js +11 -0
- package/bizar-dash/dist/assets/ProvidersView-CJMX7jm9.js.map +1 -0
- package/bizar-dash/dist/assets/SchedulesView-CcwDQ9Nm.js +1 -0
- package/bizar-dash/dist/assets/SchedulesView-CcwDQ9Nm.js.map +1 -0
- package/bizar-dash/dist/assets/Select-Cw7Qtz2M.js +6 -0
- package/bizar-dash/dist/assets/Select-Cw7Qtz2M.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsRow-DgsgbPSI.js +1 -0
- package/bizar-dash/dist/assets/SettingsRow-DgsgbPSI.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsView-DTAFdKyK.js +18 -0
- package/bizar-dash/dist/assets/SettingsView-DTAFdKyK.js.map +1 -0
- package/bizar-dash/dist/assets/Sheet-DH-WNJ3Y.js +1 -0
- package/bizar-dash/dist/assets/Sheet-DH-WNJ3Y.js.map +1 -0
- package/bizar-dash/dist/assets/Slider-DXbJuQ7y.js +1 -0
- package/bizar-dash/dist/assets/Slider-DXbJuQ7y.js.map +1 -0
- package/bizar-dash/dist/assets/Sparkline-CYtAn82j.js +1 -0
- package/bizar-dash/dist/assets/Sparkline-CYtAn82j.js.map +1 -0
- package/bizar-dash/dist/assets/Switch-BItGrPqr.js +10 -0
- package/bizar-dash/dist/assets/Switch-BItGrPqr.js.map +1 -0
- package/bizar-dash/dist/assets/TasksView-i5tm6CkX.js +6 -0
- package/bizar-dash/dist/assets/TasksView-i5tm6CkX.js.map +1 -0
- package/bizar-dash/dist/assets/Textarea-qYDf3yds.js +1 -0
- package/bizar-dash/dist/assets/Textarea-qYDf3yds.js.map +1 -0
- package/bizar-dash/dist/assets/UpdateView-Xln-ej26.js +6 -0
- package/bizar-dash/dist/assets/UpdateView-Xln-ej26.js.map +1 -0
- package/bizar-dash/dist/assets/UsageView-BGuZSUZ6.js +1 -0
- package/bizar-dash/dist/assets/UsageView-BGuZSUZ6.js.map +1 -0
- package/bizar-dash/dist/assets/ViewHeader-BqIPVKuG.js +6 -0
- package/bizar-dash/dist/assets/ViewHeader-BqIPVKuG.js.map +1 -0
- package/bizar-dash/dist/assets/VoiceView-CWUOCQs_.js +1 -0
- package/bizar-dash/dist/assets/VoiceView-CWUOCQs_.js.map +1 -0
- package/bizar-dash/dist/assets/brain-fsBSDl2g.js +6 -0
- package/bizar-dash/dist/assets/brain-fsBSDl2g.js.map +1 -0
- package/bizar-dash/dist/assets/calendar-DsHTZoCU.js +6 -0
- package/bizar-dash/dist/assets/calendar-DsHTZoCU.js.map +1 -0
- package/bizar-dash/dist/assets/circle-CqSxqqeJ.js +6 -0
- package/bizar-dash/dist/assets/circle-CqSxqqeJ.js.map +1 -0
- package/bizar-dash/dist/assets/circle-alert-BsLl001l.js +6 -0
- package/bizar-dash/dist/assets/circle-alert-BsLl001l.js.map +1 -0
- package/bizar-dash/dist/assets/circle-check-rVKMQmZp.js +6 -0
- package/bizar-dash/dist/assets/circle-check-rVKMQmZp.js.map +1 -0
- package/bizar-dash/dist/assets/clock-OuficfgH.js +6 -0
- package/bizar-dash/dist/assets/clock-OuficfgH.js.map +1 -0
- package/bizar-dash/dist/assets/cmdk-DVxytz9i.js +80 -0
- package/bizar-dash/dist/assets/cmdk-DVxytz9i.js.map +1 -0
- package/bizar-dash/dist/assets/dnd-kit-DrHErSkw.js +5 -0
- package/bizar-dash/dist/assets/dnd-kit-DrHErSkw.js.map +1 -0
- package/bizar-dash/dist/assets/download-BdHlstUY.js +6 -0
- package/bizar-dash/dist/assets/download-BdHlstUY.js.map +1 -0
- package/bizar-dash/dist/assets/external-link-DA3_VGm-.js +6 -0
- package/bizar-dash/dist/assets/external-link-DA3_VGm-.js.map +1 -0
- package/bizar-dash/dist/assets/file-text-B-g8H227.js +6 -0
- package/bizar-dash/dist/assets/file-text-B-g8H227.js.map +1 -0
- package/bizar-dash/dist/assets/filter-D9B8s5CG.js +6 -0
- package/bizar-dash/dist/assets/filter-D9B8s5CG.js.map +1 -0
- package/bizar-dash/dist/assets/git-pull-request-ByH0YuVz.js +11 -0
- package/bizar-dash/dist/assets/git-pull-request-ByH0YuVz.js.map +1 -0
- package/bizar-dash/dist/assets/index-C4Vq_2LM.js +1 -0
- package/bizar-dash/dist/assets/index-C4Vq_2LM.js.map +1 -0
- package/bizar-dash/dist/assets/index-CASP1n-5.js +1 -0
- package/bizar-dash/dist/assets/index-CASP1n-5.js.map +1 -0
- package/bizar-dash/dist/assets/main-CdOm1Pj9.js +249 -0
- package/bizar-dash/dist/assets/main-CdOm1Pj9.js.map +1 -0
- package/bizar-dash/dist/assets/pause-C9hgd8wX.js +6 -0
- package/bizar-dash/dist/assets/pause-C9hgd8wX.js.map +1 -0
- package/bizar-dash/dist/assets/pencil-BanqaMw7.js +6 -0
- package/bizar-dash/dist/assets/pencil-BanqaMw7.js.map +1 -0
- package/bizar-dash/dist/assets/play-CawUZ02_.js +6 -0
- package/bizar-dash/dist/assets/play-CawUZ02_.js.map +1 -0
- package/bizar-dash/dist/assets/plug-Cmv0-T_e.js +6 -0
- package/bizar-dash/dist/assets/plug-Cmv0-T_e.js.map +1 -0
- package/bizar-dash/dist/assets/plus-M6LYiKX8.js +6 -0
- package/bizar-dash/dist/assets/plus-M6LYiKX8.js.map +1 -0
- package/bizar-dash/dist/assets/power-DP5x_SRF.js +6 -0
- package/bizar-dash/dist/assets/power-DP5x_SRF.js.map +1 -0
- package/bizar-dash/dist/assets/power-off-NOJRLAIs.js +6 -0
- package/bizar-dash/dist/assets/power-off-NOJRLAIs.js.map +1 -0
- package/bizar-dash/dist/assets/refresh-ccw-CHMprsm5.js +6 -0
- package/bizar-dash/dist/assets/refresh-ccw-CHMprsm5.js.map +1 -0
- package/bizar-dash/dist/assets/refresh-cw-1RBqDKgJ.js +6 -0
- package/bizar-dash/dist/assets/refresh-cw-1RBqDKgJ.js.map +1 -0
- package/bizar-dash/dist/assets/rotate-ccw-DJRekBbi.js +6 -0
- package/bizar-dash/dist/assets/rotate-ccw-DJRekBbi.js.map +1 -0
- package/bizar-dash/dist/assets/rotate-cw-DHooc0Tx.js +6 -0
- package/bizar-dash/dist/assets/rotate-cw-DHooc0Tx.js.map +1 -0
- package/bizar-dash/dist/assets/save-DQKCKyZK.js +6 -0
- package/bizar-dash/dist/assets/save-DQKCKyZK.js.map +1 -0
- package/bizar-dash/dist/assets/send-xgy3RAi7.js +6 -0
- package/bizar-dash/dist/assets/send-xgy3RAi7.js.map +1 -0
- package/bizar-dash/dist/assets/shield-alert-CWV2F5ab.js +6 -0
- package/bizar-dash/dist/assets/shield-alert-CWV2F5ab.js.map +1 -0
- package/bizar-dash/dist/assets/trash-2-CL4khSRv.js +6 -0
- package/bizar-dash/dist/assets/trash-2-CL4khSRv.js.map +1 -0
- package/bizar-dash/dist/assets/trending-up-CSJJhWTS.js +6 -0
- package/bizar-dash/dist/assets/trending-up-CSJJhWTS.js.map +1 -0
- package/bizar-dash/dist/assets/triangle-alert-BPLb7uLt.js +6 -0
- package/bizar-dash/dist/assets/triangle-alert-BPLb7uLt.js.map +1 -0
- package/bizar-dash/dist/assets/upload-Cww6MvFq.js +6 -0
- package/bizar-dash/dist/assets/upload-Cww6MvFq.js.map +1 -0
- package/bizar-dash/dist/assets/zap-DmhVUzRA.js +6 -0
- package/bizar-dash/dist/assets/zap-DmhVUzRA.js.map +1 -0
- package/bizar-dash/dist/index.html +19 -0
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/agents-store.mjs +1 -0
- package/bizar-dash/src/server/api.mjs +7 -2
- package/bizar-dash/src/server/artifact-mint.mjs +69 -0
- package/bizar-dash/src/server/claude-runner.mjs +5 -0
- package/bizar-dash/src/server/dialog-store.mjs +84 -2
- package/bizar-dash/src/server/memory-lightrag.mjs +14 -9
- package/bizar-dash/src/server/progress-parser.mjs +13 -1
- package/bizar-dash/src/server/progress-parser.test.mjs +24 -0
- package/bizar-dash/src/server/routes/activity.mjs +22 -2
- package/bizar-dash/src/server/routes/admin.mjs +163 -0
- package/bizar-dash/src/server/routes/agents-cc.mjs +196 -26
- package/bizar-dash/src/server/routes/agents.mjs +20 -5
- package/bizar-dash/src/server/routes/claude-session-detail.mjs +38 -0
- package/bizar-dash/src/server/routes/dialogs.mjs +49 -1
- package/bizar-dash/src/server/routes/goals.mjs +125 -4
- package/bizar-dash/src/server/routes/overview.mjs +131 -4
- package/bizar-dash/src/server/routes/overview.test.mjs +65 -0
- package/bizar-dash/src/server/routes/providers.mjs +53 -0
- package/bizar-dash/src/server/routes/skills.mjs +6 -1
- package/bizar-dash/src/server/routes/tasks.mjs +51 -1
- package/bizar-dash/src/server/server.mjs +20 -9
- package/bizar-dash/src/server/skills-store.mjs +2 -0
- package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/web/v8/App.tsx +113 -1
- package/bizar-dash/src/web/v8/__tests__/admin-view.test.tsx +105 -0
- package/bizar-dash/src/web/v8/__tests__/agent-card-metrics.test.tsx +54 -0
- package/bizar-dash/src/web/v8/__tests__/agent-detail-tasks.test.tsx +68 -0
- package/bizar-dash/src/web/v8/__tests__/agent-hierarchy.test.tsx +79 -0
- package/bizar-dash/src/web/v8/__tests__/agents-stuck-banner.test.tsx +142 -0
- package/bizar-dash/src/web/v8/__tests__/artifacts-view.test.tsx +102 -0
- package/bizar-dash/src/web/v8/__tests__/audit-fixes.test.tsx +139 -0
- package/bizar-dash/src/web/v8/__tests__/auth-view.test.tsx +94 -0
- package/bizar-dash/src/web/v8/__tests__/chat-types.test.ts +55 -0
- package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +142 -0
- package/bizar-dash/src/web/v8/__tests__/claude-sessions-view.test.tsx +159 -0
- package/bizar-dash/src/web/v8/__tests__/clipboard-view.test.tsx +90 -0
- package/bizar-dash/src/web/v8/__tests__/config-view.test.tsx +111 -0
- package/bizar-dash/src/web/v8/__tests__/dialogs-view.test.tsx +81 -0
- package/bizar-dash/src/web/v8/__tests__/env-vars-view.test.tsx +123 -0
- package/bizar-dash/src/web/v8/__tests__/goals-cc-roundtrip.test.tsx +94 -0
- package/bizar-dash/src/web/v8/__tests__/history-view.test.tsx +96 -0
- package/bizar-dash/src/web/v8/__tests__/lightrag-view.test.tsx +90 -0
- package/bizar-dash/src/web/v8/__tests__/misc-view.test.tsx +79 -0
- package/bizar-dash/src/web/v8/__tests__/mods-view.test.tsx +123 -0
- package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +177 -0
- package/bizar-dash/src/web/v8/__tests__/obsidian-view.test.tsx +82 -0
- package/bizar-dash/src/web/v8/__tests__/overview-trends.test.tsx +87 -0
- package/bizar-dash/src/web/v8/__tests__/projects-view.test.tsx +134 -0
- package/bizar-dash/src/web/v8/__tests__/providers-view.test.tsx +100 -0
- package/bizar-dash/src/web/v8/__tests__/update-view.test.tsx +89 -0
- package/bizar-dash/src/web/v8/__tests__/voice-view.test.tsx +80 -0
- package/bizar-dash/src/web/v8/data/types.ts +86 -3
- package/bizar-dash/src/web/v8/data/useViewNavigate.ts +54 -0
- package/bizar-dash/src/web/v8/data/useWebSocket.ts +45 -0
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +111 -14
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +100 -8
- package/bizar-dash/src/web/v8/ui/activity/ActivityLane.tsx +315 -0
- package/bizar-dash/src/web/v8/ui/activity/ActivityLanes.tsx +51 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +96 -15
- package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +168 -12
- package/bizar-dash/src/web/v8/ui/agents/AgentLiveOutput.tsx +252 -0
- package/bizar-dash/src/web/v8/ui/chat/ChatDrawer.tsx +208 -0
- package/bizar-dash/src/web/v8/ui/chat/EventStream.tsx +83 -0
- package/bizar-dash/src/web/v8/ui/chat/MessageBubble.tsx +174 -0
- package/bizar-dash/src/web/v8/ui/data/ListHeader.tsx +94 -0
- package/bizar-dash/src/web/v8/ui/feedback/ErrorState.tsx +116 -0
- package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +27 -0
- package/bizar-dash/src/web/v8/ui/index.ts +49 -2
- package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +61 -27
- package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +156 -12
- package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +5 -10
- package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +4 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanDetailDialog.tsx +638 -0
- package/bizar-dash/src/web/v8/ui/tasks/TaskDetail.tsx +313 -0
- package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +203 -178
- package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +210 -0
- package/bizar-dash/src/web/v8/views/Agents/AgentHierarchy.tsx +212 -0
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +328 -21
- package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +241 -0
- package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +175 -0
- package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Backup/BackupView.tsx +204 -0
- package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +356 -0
- package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +133 -0
- package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx +331 -0
- package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +210 -0
- package/bizar-dash/src/web/v8/views/Config/ConfigView.tsx +364 -0
- package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +160 -0
- package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +196 -0
- package/bizar-dash/src/web/v8/views/Doctor/DoctorView.tsx +181 -0
- package/bizar-dash/src/web/v8/views/EnvVars/EnvVarsView.tsx +365 -0
- package/bizar-dash/src/web/v8/views/Eval/EvalView.tsx +278 -0
- package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +168 -10
- package/bizar-dash/src/web/v8/views/Headroom/HeadroomView.tsx +201 -0
- package/bizar-dash/src/web/v8/views/History/HistoryView.tsx +227 -0
- package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +13 -3
- package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +183 -0
- package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +30 -3
- package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +159 -0
- package/bizar-dash/src/web/v8/views/Mods/ModsView.tsx +348 -0
- package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +178 -0
- package/bizar-dash/src/web/v8/views/Obsidian/ObsidianView.tsx +193 -0
- package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +114 -11
- package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +253 -0
- package/bizar-dash/src/web/v8/views/Providers/ProvidersView.tsx +371 -0
- package/bizar-dash/src/web/v8/views/Router.tsx +125 -0
- package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +46 -14
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +322 -29
- package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +229 -10
- package/bizar-dash/src/web/v8/views/Update/UpdateView.tsx +270 -0
- package/bizar-dash/src/web/v8/views/Usage/UsageView.tsx +210 -0
- package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +192 -0
- package/bizar-dash/tests/tasks-patch-routes.test.mjs +194 -0
- package/bizar-dash/vite.config.ts +11 -3
- package/cli/__tests__/esm-no-require.test.mjs +97 -0
- package/cli/commands/tailscale.mjs +1 -3
- package/cli/commands/voice.mjs +2 -2
- package/cli/service-env.mjs +4 -5
- package/package.json +13 -3
- package/packages/sdk/dist/agent-registry.d.ts +134 -0
- package/packages/sdk/dist/agent-registry.js +228 -0
- package/packages/sdk/dist/consensus/byzantine.d.ts +159 -0
- package/packages/sdk/dist/consensus/byzantine.js +507 -0
- package/packages/sdk/dist/consensus/index.d.ts +60 -0
- package/packages/sdk/dist/consensus/index.js +76 -0
- package/packages/sdk/dist/consensus/queen.d.ts +86 -0
- package/packages/sdk/dist/consensus/queen.js +158 -0
- package/packages/sdk/dist/consensus/types.d.ts +155 -0
- package/packages/sdk/dist/consensus/types.js +29 -0
- package/packages/sdk/dist/dangerous-patterns.d.ts +27 -0
- package/packages/sdk/dist/dangerous-patterns.js +107 -0
- package/packages/sdk/dist/federation/audit.d.ts +71 -0
- package/packages/sdk/dist/federation/audit.js +133 -0
- package/packages/sdk/dist/federation/budget.d.ts +111 -0
- package/packages/sdk/dist/federation/budget.js +227 -0
- package/packages/sdk/dist/federation/envelope.d.ts +83 -0
- package/packages/sdk/dist/federation/envelope.js +92 -0
- package/packages/sdk/dist/federation/hmac.d.ts +61 -0
- package/packages/sdk/dist/federation/hmac.js +120 -0
- package/packages/sdk/dist/federation/index.d.ts +108 -0
- package/packages/sdk/dist/federation/index.js +275 -0
- package/packages/sdk/dist/federation/pii.d.ts +72 -0
- package/packages/sdk/dist/federation/pii.js +178 -0
- package/packages/sdk/dist/federation/policy.d.ts +50 -0
- package/packages/sdk/dist/federation/policy.js +76 -0
- package/packages/sdk/dist/federation/trust.d.ts +80 -0
- package/packages/sdk/dist/federation/trust.js +126 -0
- package/packages/sdk/dist/fingerprint.d.ts +18 -0
- package/packages/sdk/dist/fingerprint.js +0 -0
- package/packages/sdk/dist/index.d.ts +25 -0
- package/packages/sdk/dist/index.js +25 -0
- package/packages/sdk/dist/mcp/bin.d.ts +16 -0
- package/packages/sdk/dist/mcp/bin.js +46 -0
- package/packages/sdk/dist/mcp/server.d.ts +105 -0
- package/packages/sdk/dist/mcp/server.js +682 -0
- package/packages/sdk/dist/memory/index.d.ts +43 -0
- package/packages/sdk/dist/memory/index.js +159 -0
- package/packages/sdk/dist/router/codemod-intent.d.ts +68 -0
- package/packages/sdk/dist/router/codemod-intent.js +112 -0
- package/packages/sdk/dist/router/index.d.ts +100 -0
- package/packages/sdk/dist/router/index.js +149 -0
- package/packages/sdk/dist/router/memory-distillation.d.ts +58 -0
- package/packages/sdk/dist/router/memory-distillation.js +195 -0
- package/packages/sdk/dist/router/model-router.d.ts +83 -0
- package/packages/sdk/dist/router/model-router.js +207 -0
- package/packages/sdk/dist/router/q-learning-router.d.ts +85 -0
- package/packages/sdk/dist/router/q-learning-router.js +273 -0
- package/packages/sdk/dist/swarm-topology.d.ts +87 -0
- package/packages/sdk/dist/swarm-topology.js +219 -0
- package/packages/sdk/dist/version.d.ts +5 -0
- package/packages/sdk/dist/version.js +5 -0
- package/packages/sdk/package.json +1 -1
- package/plugins/bizar/dist/index.d.ts +25 -0
- package/plugins/bizar/dist/index.js +32 -0
- package/plugins/bizar/package.json +18 -0
- package/.claude/CLAUDE.md +0 -15
- package/.claude/agents/_shared/AGENT_BASELINE.md +0 -168
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +0 -412
- package/.claude/agents/_shared/SKILLS.md +0 -109
- package/.claude/agents/agent-browser.md +0 -80
- package/.claude/agents/baldr.md +0 -49
- package/.claude/agents/forseti.md +0 -51
- package/.claude/agents/frigg.md +0 -42
- package/.claude/agents/heimdall.md +0 -33
- package/.claude/agents/hermod.md +0 -53
- package/.claude/agents/mimir.md +0 -49
- package/.claude/agents/odin.md +0 -287
- package/.claude/agents/quick.md +0 -34
- package/.claude/agents/semble-search.md +0 -50
- package/.claude/agents/thor.md +0 -53
- package/.claude/agents/tyr.md +0 -56
- package/.claude/agents/vidarr.md +0 -54
- package/.claude/agents/vor.md +0 -53
- package/.claude/commands/audit.md +0 -25
- package/.claude/commands/bizar.md +0 -22
- package/.claude/commands/explain.md +0 -17
- package/.claude/commands/goal.md +0 -98
- package/.claude/commands/init.md +0 -29
- package/.claude/commands/learn.md +0 -44
- package/.claude/commands/plan.md +0 -35
- package/.claude/commands/plow-through.md +0 -50
- package/.claude/commands/pr-review.md +0 -49
- package/.claude/commands/setup-provider.md +0 -96
- package/.claude/commands/tailscale-serve.md +0 -100
- package/.claude/commands/team.md +0 -132
- package/.claude/commands/test.md +0 -62
- package/.claude/commands/validate.md +0 -68
- package/.claude/commands/visual-plan.md +0 -24
- package/.claude/hooks/README.md +0 -92
- package/.claude/hooks/posttooluse-editwrite.mjs +0 -91
- package/.claude/hooks/pretooluse-bash.mjs +0 -81
- package/.claude/hooks/pretooluse-editwrite.mjs +0 -139
- package/.claude/hooks/sessionend-recall.mjs +0 -74
- package/.claude/hooks/sessionstart-prime.mjs +0 -80
- package/.claude/hooks/userpromptsubmit-tag.mjs +0 -80
- package/.claude/hooks/worker-suggest.mjs +0 -110
- package/.claude/settings.json +0 -125
- package/.claude/settings.local.json +0 -7
- package/.claude/skills/9router/SKILL.md +0 -80
- package/.claude/skills/9router-chat/SKILL.md +0 -73
- package/.claude/skills/9router-embeddings/SKILL.md +0 -69
- package/.claude/skills/9router-image/SKILL.md +0 -86
- package/.claude/skills/9router-stt/SKILL.md +0 -79
- package/.claude/skills/9router-tts/SKILL.md +0 -80
- package/.claude/skills/9router-web-fetch/SKILL.md +0 -99
- package/.claude/skills/9router-web-search/SKILL.md +0 -91
- package/.claude/skills/bizar/README.md +0 -9
- package/.claude/skills/bizar/SKILL.md +0 -450
- package/.claude/skills/cpp-coding-standards/README.md +0 -28
- package/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
- package/.claude/skills/cpp-testing/README.md +0 -28
- package/.claude/skills/cpp-testing/SKILL.md +0 -304
- package/.claude/skills/cpp-testing/references/coverage.md +0 -370
- package/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
- package/.claude/skills/cpp-testing/references/mocking.md +0 -364
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
- package/.claude/skills/cubesandbox/SKILL.md +0 -148
- package/.claude/skills/embedded-esp-idf/README.md +0 -41
- package/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
- package/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
- package/.claude/skills/glyph/SKILL.md +0 -163
- package/.claude/skills/harness-engineering/SKILL.md +0 -143
- package/.claude/skills/lightrag/SKILL.md +0 -81
- package/.claude/skills/memory-protocol/SKILL.md +0 -105
- package/.claude/skills/obsidian/SKILL.md +0 -306
- package/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
- package/.claude/skills/self-improvement/SKILL.md +0 -64
- package/.claude/worktrees/kanban-overhaul/.claude/CLAUDE.md +0 -15
- package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/AGENT_BASELINE.md +0 -168
- package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/CLAUDE_TOOLS.md +0 -412
- package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/SKILLS.md +0 -109
- package/.claude/worktrees/kanban-overhaul/.claude/agents/agent-browser.md +0 -80
- package/.claude/worktrees/kanban-overhaul/.claude/agents/baldr.md +0 -49
- package/.claude/worktrees/kanban-overhaul/.claude/agents/forseti.md +0 -51
- package/.claude/worktrees/kanban-overhaul/.claude/agents/frigg.md +0 -42
- package/.claude/worktrees/kanban-overhaul/.claude/agents/heimdall.md +0 -33
- package/.claude/worktrees/kanban-overhaul/.claude/agents/hermod.md +0 -53
- package/.claude/worktrees/kanban-overhaul/.claude/agents/mimir.md +0 -49
- package/.claude/worktrees/kanban-overhaul/.claude/agents/odin.md +0 -287
- package/.claude/worktrees/kanban-overhaul/.claude/agents/quick.md +0 -34
- package/.claude/worktrees/kanban-overhaul/.claude/agents/semble-search.md +0 -50
- package/.claude/worktrees/kanban-overhaul/.claude/agents/thor.md +0 -53
- package/.claude/worktrees/kanban-overhaul/.claude/agents/tyr.md +0 -56
- package/.claude/worktrees/kanban-overhaul/.claude/agents/vidarr.md +0 -54
- package/.claude/worktrees/kanban-overhaul/.claude/agents/vor.md +0 -53
- package/.claude/worktrees/kanban-overhaul/.claude/commands/audit.md +0 -25
- package/.claude/worktrees/kanban-overhaul/.claude/commands/bizar.md +0 -22
- package/.claude/worktrees/kanban-overhaul/.claude/commands/explain.md +0 -17
- package/.claude/worktrees/kanban-overhaul/.claude/commands/init.md +0 -29
- package/.claude/worktrees/kanban-overhaul/.claude/commands/learn.md +0 -44
- package/.claude/worktrees/kanban-overhaul/.claude/commands/plan.md +0 -35
- package/.claude/worktrees/kanban-overhaul/.claude/commands/plow-through.md +0 -50
- package/.claude/worktrees/kanban-overhaul/.claude/commands/pr-review.md +0 -49
- package/.claude/worktrees/kanban-overhaul/.claude/commands/setup-provider.md +0 -96
- package/.claude/worktrees/kanban-overhaul/.claude/commands/tailscale-serve.md +0 -100
- package/.claude/worktrees/kanban-overhaul/.claude/commands/team.md +0 -132
- package/.claude/worktrees/kanban-overhaul/.claude/commands/test.md +0 -62
- package/.claude/worktrees/kanban-overhaul/.claude/commands/validate.md +0 -68
- package/.claude/worktrees/kanban-overhaul/.claude/commands/visual-plan.md +0 -24
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/README.md +0 -92
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/posttooluse-editwrite.mjs +0 -91
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/pretooluse-bash.mjs +0 -81
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/pretooluse-editwrite.mjs +0 -139
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/sessionend-recall.mjs +0 -74
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/sessionstart-prime.mjs +0 -80
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/userpromptsubmit-tag.mjs +0 -80
- package/.claude/worktrees/kanban-overhaul/.claude/hooks/worker-suggest.mjs +0 -110
- package/.claude/worktrees/kanban-overhaul/.claude/settings.json +0 -125
- package/.claude/worktrees/kanban-overhaul/.claude/settings.local.json +0 -8
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-chat/SKILL.md +0 -73
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-embeddings/SKILL.md +0 -69
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-image/SKILL.md +0 -86
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-stt/SKILL.md +0 -79
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-tts/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-web-fetch/SKILL.md +0 -99
- package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-web-search/SKILL.md +0 -91
- package/.claude/worktrees/kanban-overhaul/.claude/skills/bizar/README.md +0 -9
- package/.claude/worktrees/kanban-overhaul/.claude/skills/bizar/SKILL.md +0 -450
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/README.md +0 -28
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/README.md +0 -28
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/SKILL.md +0 -304
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/coverage.md +0 -370
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/mocking.md +0 -364
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
- package/.claude/worktrees/kanban-overhaul/.claude/skills/cubesandbox/SKILL.md +0 -148
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/README.md +0 -41
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
- package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
- package/.claude/worktrees/kanban-overhaul/.claude/skills/glyph/SKILL.md +0 -163
- package/.claude/worktrees/kanban-overhaul/.claude/skills/harness-engineering/SKILL.md +0 -143
- package/.claude/worktrees/kanban-overhaul/.claude/skills/lightrag/SKILL.md +0 -81
- package/.claude/worktrees/kanban-overhaul/.claude/skills/memory-protocol/SKILL.md +0 -105
- package/.claude/worktrees/kanban-overhaul/.claude/skills/obsidian/SKILL.md +0 -306
- package/.claude/worktrees/kanban-overhaul/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
- package/.claude/worktrees/kanban-overhaul/.claude/skills/self-improvement/SKILL.md +0 -64
- package/.claude/worktrees/kanban-overhaul/.dockerignore +0 -31
- package/.claude/worktrees/kanban-overhaul/.gitattributes +0 -27
- package/.claude/worktrees/kanban-overhaul/.harness/agents.json +0 -17
- package/.claude/worktrees/kanban-overhaul/.harness/arch-rules.json +0 -69
- package/.claude/worktrees/kanban-overhaul/.harness/topology.json +0 -4
- package/.claude/worktrees/kanban-overhaul/.nvmrc +0 -1
- package/.claude/worktrees/kanban-overhaul/.serena/project.yml +0 -159
- package/.claude/worktrees/kanban-overhaul/AGENTS.md +0 -250
- package/.claude/worktrees/kanban-overhaul/CHANGELOG.md +0 -5410
- package/.claude/worktrees/kanban-overhaul/CLAUDE.md +0 -260
- package/.claude/worktrees/kanban-overhaul/CURRENT_ISSUES_ AND_NEW_FEATURES.md +0 -18
- package/.claude/worktrees/kanban-overhaul/DECISIONS.md +0 -66
- package/.claude/worktrees/kanban-overhaul/Dockerfile +0 -48
- package/.claude/worktrees/kanban-overhaul/FINAL_GOAL.md +0 -397
- package/.claude/worktrees/kanban-overhaul/IMPLEMENTATION_PLAN.md +0 -250
- package/.claude/worktrees/kanban-overhaul/MILESTONES.md +0 -257
- package/.claude/worktrees/kanban-overhaul/Makefile +0 -93
- package/.claude/worktrees/kanban-overhaul/PROGRESS.md +0 -1406
- package/.claude/worktrees/kanban-overhaul/README.md +0 -483
- package/.claude/worktrees/kanban-overhaul/ROADMAP.md +0 -609
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.graphifyignore +0 -40
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/README.md +0 -14
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/daily/2026-06-25.md +0 -9
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/vault.json +0 -7
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +0 -103
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +0 -338
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +0 -81
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +0 -172
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +0 -44
- package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +0 -247
- package/.claude/worktrees/kanban-overhaul/bizar-dash/ARCHITECTURE.md +0 -197
- package/.claude/worktrees/kanban-overhaul/bizar-dash/CHANGELOG.md +0 -235
- package/.claude/worktrees/kanban-overhaul/bizar-dash/DESIGN.md +0 -912
- package/.claude/worktrees/kanban-overhaul/bizar-dash/GLYPH.md +0 -418
- package/.claude/worktrees/kanban-overhaul/bizar-dash/PLAN.md +0 -1135
- package/.claude/worktrees/kanban-overhaul/bizar-dash/critique.json +0 -26
- package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/comments.json +0 -1
- package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/meta.json +0 -10
- package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/plan.json +0 -174
- package/.claude/worktrees/kanban-overhaul/bizar-dash/scripts/smoke-bg-retry.mjs +0 -246
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/agent-baseline/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/agent-browser/SKILL.md +0 -181
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/bizar/SKILL.md +0 -116
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/chat/SKILL.md +0 -74
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/eval/SKILL.md +0 -237
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/headroom/SKILL.md +0 -94
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/lightrag/SKILL.md +0 -86
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/minimax/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/obsidian/SKILL.md +0 -68
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/providers/SKILL.md +0 -75
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/publishing/SKILL.md +0 -146
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/sdk/SKILL.md +0 -138
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/self-improvement/SKILL.md +0 -53
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/skills-cli/SKILL.md +0 -94
- package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/usage/SKILL.md +0 -62
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/cli/dashboard-ports.mjs +0 -488
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/cli.mjs +0 -537
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/activity-log.mjs +0 -174
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/agents-store.mjs +0 -465
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/api.mjs +0 -223
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/artifact-template.html +0 -810
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/artifacts-store.mjs +0 -733
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/auth.mjs +0 -548
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/background-store.mjs +0 -446
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/backup-store.mjs +0 -530
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-poller.mjs +0 -375
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-retry.mjs +0 -446
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-spawner.mjs +0 -390
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/browser.mjs +0 -40
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-bg-spawner.mjs +0 -390
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-info.mjs +0 -412
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-runner.mjs +0 -284
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-sdk.mjs +0 -191
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/diagnostics-store.mjs +0 -598
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/dialog-poller.mjs +0 -105
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/dialog-store.mjs +0 -177
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/digest-store.mjs +0 -558
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/eval-store.mjs +0 -281
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/eval.mjs +0 -500
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/glyphs/mdx-compiler.mjs +0 -596
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/headroom.mjs +0 -649
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/lib/path-safe.mjs +0 -283
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/lib/rate-limit.mjs +0 -122
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/logger.mjs +0 -71
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-consolidator.mjs +0 -225
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-distillation.mjs +0 -296
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-git.mjs +0 -473
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-lightrag.mjs +0 -1478
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-obsidian.mjs +0 -230
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-schema.mjs +0 -145
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-secrets.mjs +0 -84
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-store.mjs +0 -1093
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/metrics.mjs +0 -268
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/minimax-usage-store.mjs +0 -372
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/minimax.mjs +0 -683
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/mod-security.mjs +0 -398
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/mods-loader.mjs +0 -1243
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/notifications-store.mjs +0 -243
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/obsidian-store.mjs +0 -318
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/ocr.mjs +0 -55
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/otel.mjs +0 -260
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/pair-store.mjs +0 -138
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/progress-parser.mjs +0 -221
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/projects-store.mjs +0 -364
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/providers-store.mjs +0 -1801
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/_shared.mjs +0 -447
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/activity.mjs +0 -195
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/agents-cc.mjs +0 -194
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/agents.mjs +0 -134
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/artifacts.mjs +0 -279
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/auth.mjs +0 -69
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/background.mjs +0 -422
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/backup.mjs +0 -112
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/chat.mjs +0 -727
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/claude-session-detail.mjs +0 -329
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/claude-sessions.mjs +0 -259
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/clipboard.mjs +0 -173
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/config.mjs +0 -180
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/diagnostics.mjs +0 -50
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/dialogs.mjs +0 -86
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/digests.mjs +0 -82
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/distill.mjs +0 -129
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/doctor.mjs +0 -71
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/env-vars.mjs +0 -231
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/eval.mjs +0 -187
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/fs.mjs +0 -429
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/goal-planner.mjs +0 -236
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/goals.mjs +0 -212
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/headroom.mjs +0 -126
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/history.mjs +0 -78
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/lightrag.mjs +0 -169
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/memory.mjs +0 -1524
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/minimax.mjs +0 -133
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/misc.mjs +0 -90
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/mods.mjs +0 -359
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/notifications.mjs +0 -54
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/obsidian.mjs +0 -239
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/ocr.mjs +0 -182
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/overview.mjs +0 -92
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/pair.mjs +0 -67
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/projects.mjs +0 -175
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/providers.mjs +0 -308
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/schedules.mjs +0 -159
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/settings.mjs +0 -51
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/skills.mjs +0 -65
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/tailscale.mjs +0 -46
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/tasks.mjs +0 -518
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/themes.mjs +0 -51
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/update.mjs +0 -340
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/usage.mjs +0 -136
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/users.mjs +0 -102
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/voice.mjs +0 -167
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/workspaces.mjs +0 -299
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/auth.mjs +0 -59
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/events.mjs +0 -121
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/health.mjs +0 -21
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/index.mjs +0 -90
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/sessions.mjs +0 -111
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/schedules-runner.mjs +0 -556
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/schedules-store.mjs +0 -268
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/search-store.mjs +0 -220
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/serve-info.mjs +0 -1110
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/server.mjs +0 -966
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/settings-store.mjs +0 -45
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/skills-store.mjs +0 -190
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/state.mjs +0 -437
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tailscale-store.mjs +0 -113
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/task-delegator.mjs +0 -969
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tasks-store.mjs +0 -556
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tui.mjs +0 -923
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/update-store.mjs +0 -168
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/v2-auth-file.mjs +0 -99
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/v2-event-bus.mjs +0 -128
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/voice-store.mjs +0 -229
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/voice-transcribe.mjs +0 -72
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/watcher.mjs +0 -81
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/workers/transcription-worker.mjs +0 -213
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/workspaces.mjs +0 -626
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/yaml.mjs +0 -238
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/App.tsx +0 -200
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/fetcher.ts +0 -59
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/types.ts +0 -168
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/useFetch.ts +0 -62
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/useWebSocket.ts +0 -153
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/main.tsx +0 -28
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/AppShell.tsx +0 -90
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +0 -29
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/Sidebar.tsx +0 -361
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/StatusBar.tsx +0 -63
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/Topbar.tsx +0 -113
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/index.ts +0 -15
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +0 -137
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +0 -101
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +0 -158
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +0 -232
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Button.tsx +0 -141
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +0 -32
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +0 -49
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Field.tsx +0 -78
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Form.tsx +0 -23
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +0 -112
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Input.tsx +0 -94
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +0 -74
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Select.tsx +0 -171
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Slider.tsx +0 -68
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Switch.tsx +0 -56
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +0 -64
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +0 -36
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +0 -85
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Accordion.tsx +0 -134
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Avatar.tsx +0 -175
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Badge.tsx +0 -93
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/BarList.tsx +0 -101
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Card.tsx +0 -140
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Chip.tsx +0 -96
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Kbd.tsx +0 -42
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +0 -93
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +0 -98
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/StatTile.tsx +0 -150
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Table.tsx +0 -170
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Timeline.tsx +0 -130
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +0 -122
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +0 -95
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +0 -39
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +0 -143
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +0 -149
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +0 -8
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +0 -231
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +0 -48
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +0 -56
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +0 -103
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +0 -67
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +0 -30
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +0 -66
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +0 -89
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +0 -176
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +0 -245
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +0 -115
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/index.ts +0 -349
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +0 -115
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +0 -391
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +0 -181
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +0 -126
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanDetailDialog.tsx +0 -638
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +0 -141
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +0 -30
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +0 -161
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +0 -144
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +0 -224
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +0 -81
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +0 -164
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +0 -128
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Box.tsx +0 -144
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Center.tsx +0 -40
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +0 -67
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +0 -104
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +0 -77
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +0 -33
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +0 -62
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +0 -42
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +0 -73
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +0 -49
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +0 -91
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +0 -88
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +0 -109
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/globals.css +0 -220
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/reset.css +0 -57
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/tokens.css +0 -217
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +0 -66
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +0 -94
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +0 -88
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/useDensity.ts +0 -15
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/useTheme.ts +0 -16
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/utils/cx.ts +0 -19
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +0 -71
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +0 -172
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +0 -247
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +0 -137
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +0 -108
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +0 -77
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +0 -152
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Router.tsx +0 -72
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +0 -330
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +0 -106
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +0 -792
- package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/vite-env.d.ts +0 -15
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/FORMAT.md +0 -76
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/README.md +0 -19
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/agents/greeter.md +0 -8
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/commands/hello.md +0 -6
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/mod.json +0 -20
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +0 -9
- package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +0 -10
- package/.claude/worktrees/kanban-overhaul/bizar-dash/tests/setup.ts +0 -63
- package/.claude/worktrees/kanban-overhaul/bizar-dash/tests/smoke-v2.mjs +0 -212
- package/.claude/worktrees/kanban-overhaul/bizar-dash/tsconfig.json +0 -23
- package/.claude/worktrees/kanban-overhaul/bizar-dash/vite.config.ts +0 -66
- package/.claude/worktrees/kanban-overhaul/bizar-dash/vitest.config.ts +0 -20
- package/.claude/worktrees/kanban-overhaul/bizar-plugins/registry.json +0 -62
- package/.claude/worktrees/kanban-overhaul/bookmarklet/bizar-clipper.js +0 -48
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/README.md +0 -43
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/background.js +0 -95
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/content.js +0 -170
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-128.png +0 -0
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-16.png +0 -0
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-48.png +0 -0
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon.svg +0 -4
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/manifest.json +0 -32
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/popup.html +0 -66
- package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/popup.js +0 -110
- package/.claude/worktrees/kanban-overhaul/bun.lock +0 -1558
- package/.claude/worktrees/kanban-overhaul/cli/agent-browser-up.sh +0 -152
- package/.claude/worktrees/kanban-overhaul/cli/agent-browser-update.mjs +0 -322
- package/.claude/worktrees/kanban-overhaul/cli/artifact-cli.mjs +0 -605
- package/.claude/worktrees/kanban-overhaul/cli/artifact-render.mjs +0 -621
- package/.claude/worktrees/kanban-overhaul/cli/artifact-server.mjs +0 -847
- package/.claude/worktrees/kanban-overhaul/cli/artifact-templates.mjs +0 -523
- package/.claude/worktrees/kanban-overhaul/cli/artifact.mjs +0 -63
- package/.claude/worktrees/kanban-overhaul/cli/atomic.mjs +0 -73
- package/.claude/worktrees/kanban-overhaul/cli/audit.mjs +0 -141
- package/.claude/worktrees/kanban-overhaul/cli/banner.mjs +0 -41
- package/.claude/worktrees/kanban-overhaul/cli/bg.mjs +0 -471
- package/.claude/worktrees/kanban-overhaul/cli/bin.mjs +0 -698
- package/.claude/worktrees/kanban-overhaul/cli/bootstrap.mjs +0 -77
- package/.claude/worktrees/kanban-overhaul/cli/commands/artifact.mjs +0 -20
- package/.claude/worktrees/kanban-overhaul/cli/commands/claim.mjs +0 -282
- package/.claude/worktrees/kanban-overhaul/cli/commands/claude-cmd.mjs +0 -348
- package/.claude/worktrees/kanban-overhaul/cli/commands/clip.mjs +0 -163
- package/.claude/worktrees/kanban-overhaul/cli/commands/cost.mjs +0 -279
- package/.claude/worktrees/kanban-overhaul/cli/commands/dash.mjs +0 -193
- package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/cloudflare.mjs +0 -250
- package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/docker.mjs +0 -222
- package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/fly.mjs +0 -161
- package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/vercel.mjs +0 -225
- package/.claude/worktrees/kanban-overhaul/cli/commands/deploy.mjs +0 -240
- package/.claude/worktrees/kanban-overhaul/cli/commands/eval.mjs +0 -396
- package/.claude/worktrees/kanban-overhaul/cli/commands/headroom.mjs +0 -204
- package/.claude/worktrees/kanban-overhaul/cli/commands/install.mjs +0 -170
- package/.claude/worktrees/kanban-overhaul/cli/commands/lightrag.mjs +0 -170
- package/.claude/worktrees/kanban-overhaul/cli/commands/marketplace.mjs +0 -64
- package/.claude/worktrees/kanban-overhaul/cli/commands/memory.mjs +0 -25
- package/.claude/worktrees/kanban-overhaul/cli/commands/minimax.mjs +0 -288
- package/.claude/worktrees/kanban-overhaul/cli/commands/mod.mjs +0 -185
- package/.claude/worktrees/kanban-overhaul/cli/commands/ocr.mjs +0 -182
- package/.claude/worktrees/kanban-overhaul/cli/commands/plugin.mjs +0 -358
- package/.claude/worktrees/kanban-overhaul/cli/commands/rca.mjs +0 -198
- package/.claude/worktrees/kanban-overhaul/cli/commands/sandbox.mjs +0 -220
- package/.claude/worktrees/kanban-overhaul/cli/commands/service.mjs +0 -79
- package/.claude/worktrees/kanban-overhaul/cli/commands/setup-provider.mjs +0 -466
- package/.claude/worktrees/kanban-overhaul/cli/commands/tailscale.mjs +0 -258
- package/.claude/worktrees/kanban-overhaul/cli/commands/usage.mjs +0 -113
- package/.claude/worktrees/kanban-overhaul/cli/commands/util.mjs +0 -577
- package/.claude/worktrees/kanban-overhaul/cli/commands/validate.mjs +0 -541
- package/.claude/worktrees/kanban-overhaul/cli/commands/voice.mjs +0 -211
- package/.claude/worktrees/kanban-overhaul/cli/commands/workspace.mjs +0 -247
- package/.claude/worktrees/kanban-overhaul/cli/copy.mjs +0 -586
- package/.claude/worktrees/kanban-overhaul/cli/cost-gate.mjs +0 -501
- package/.claude/worktrees/kanban-overhaul/cli/dev-link.mjs +0 -191
- package/.claude/worktrees/kanban-overhaul/cli/digest.mjs +0 -149
- package/.claude/worktrees/kanban-overhaul/cli/doctor.mjs +0 -217
- package/.claude/worktrees/kanban-overhaul/cli/export.mjs +0 -95
- package/.claude/worktrees/kanban-overhaul/cli/feature-list-bridge.mjs +0 -400
- package/.claude/worktrees/kanban-overhaul/cli/heads-up.mjs +0 -295
- package/.claude/worktrees/kanban-overhaul/cli/init.mjs +0 -368
- package/.claude/worktrees/kanban-overhaul/cli/install.mjs +0 -640
- package/.claude/worktrees/kanban-overhaul/cli/memory-constants.mjs +0 -76
- package/.claude/worktrees/kanban-overhaul/cli/memory.mjs +0 -1850
- package/.claude/worktrees/kanban-overhaul/cli/plugin-runtime-deps.mjs +0 -250
- package/.claude/worktrees/kanban-overhaul/cli/post-install-smoke.mjs +0 -256
- package/.claude/worktrees/kanban-overhaul/cli/prompts.mjs +0 -168
- package/.claude/worktrees/kanban-overhaul/cli/providers-detect.mjs +0 -233
- package/.claude/worktrees/kanban-overhaul/cli/provision-claude.mjs +0 -1176
- package/.claude/worktrees/kanban-overhaul/cli/provision.mjs +0 -2233
- package/.claude/worktrees/kanban-overhaul/cli/repair.mjs +0 -209
- package/.claude/worktrees/kanban-overhaul/cli/service-controller.mjs +0 -927
- package/.claude/worktrees/kanban-overhaul/cli/service-env.mjs +0 -139
- package/.claude/worktrees/kanban-overhaul/cli/service.mjs +0 -492
- package/.claude/worktrees/kanban-overhaul/cli/update.mjs +0 -29
- package/.claude/worktrees/kanban-overhaul/cli/utils.mjs +0 -221
- package/.claude/worktrees/kanban-overhaul/cli/worker-dispatcher.mjs +0 -259
- package/.claude/worktrees/kanban-overhaul/config/AGENTS.md +0 -595
- package/.claude/worktrees/kanban-overhaul/config/agents/_shared/AGENT_BASELINE.md +0 -155
- package/.claude/worktrees/kanban-overhaul/config/agents/_shared/CLINE_TOOLS.md +0 -398
- package/.claude/worktrees/kanban-overhaul/config/agents/_shared/SKILLS.md +0 -109
- package/.claude/worktrees/kanban-overhaul/config/agents/agent-browser.md +0 -90
- package/.claude/worktrees/kanban-overhaul/config/agents/baldr.md +0 -60
- package/.claude/worktrees/kanban-overhaul/config/agents/forseti.md +0 -60
- package/.claude/worktrees/kanban-overhaul/config/agents/frigg.md +0 -52
- package/.claude/worktrees/kanban-overhaul/config/agents/heimdall.md +0 -44
- package/.claude/worktrees/kanban-overhaul/config/agents/hermod.md +0 -64
- package/.claude/worktrees/kanban-overhaul/config/agents/mimir.md +0 -60
- package/.claude/worktrees/kanban-overhaul/config/agents/odin.md +0 -310
- package/.claude/worktrees/kanban-overhaul/config/agents/quick.md +0 -47
- package/.claude/worktrees/kanban-overhaul/config/agents/semble-search.md +0 -59
- package/.claude/worktrees/kanban-overhaul/config/agents/thor.md +0 -64
- package/.claude/worktrees/kanban-overhaul/config/agents/tyr.md +0 -67
- package/.claude/worktrees/kanban-overhaul/config/agents/vidarr.md +0 -65
- package/.claude/worktrees/kanban-overhaul/config/agents/vor.md +0 -62
- package/.claude/worktrees/kanban-overhaul/config/commands/audit.md +0 -5
- package/.claude/worktrees/kanban-overhaul/config/commands/bizar.md +0 -22
- package/.claude/worktrees/kanban-overhaul/config/commands/explain.md +0 -5
- package/.claude/worktrees/kanban-overhaul/config/commands/init.md +0 -26
- package/.claude/worktrees/kanban-overhaul/config/commands/learn.md +0 -5
- package/.claude/worktrees/kanban-overhaul/config/commands/plan.md +0 -30
- package/.claude/worktrees/kanban-overhaul/config/commands/plow-through.md +0 -47
- package/.claude/worktrees/kanban-overhaul/config/commands/pr-review.md +0 -5
- package/.claude/worktrees/kanban-overhaul/config/commands/setup-provider.md +0 -95
- package/.claude/worktrees/kanban-overhaul/config/commands/tailscale-serve.md +0 -97
- package/.claude/worktrees/kanban-overhaul/config/commands/team.md +0 -124
- package/.claude/worktrees/kanban-overhaul/config/commands/test.md +0 -60
- package/.claude/worktrees/kanban-overhaul/config/commands/validate.md +0 -66
- package/.claude/worktrees/kanban-overhaul/config/commands/visual-plan.md +0 -19
- package/.claude/worktrees/kanban-overhaul/config/hooks/PostToolUse +0 -66
- package/.claude/worktrees/kanban-overhaul/config/hooks/PreToolUse +0 -82
- package/.claude/worktrees/kanban-overhaul/config/hooks/README.md +0 -68
- package/.claude/worktrees/kanban-overhaul/config/hooks/TaskResume +0 -48
- package/.claude/worktrees/kanban-overhaul/config/hooks/TaskStart +0 -47
- package/.claude/worktrees/kanban-overhaul/config/hooks/UserPromptSubmit +0 -55
- package/.claude/worktrees/kanban-overhaul/config/rules/general.md +0 -9
- package/.claude/worktrees/kanban-overhaul/config/rules/git.md +0 -11
- package/.claude/worktrees/kanban-overhaul/config/rules/javascript.md +0 -10
- package/.claude/worktrees/kanban-overhaul/config/rules/python.md +0 -10
- package/.claude/worktrees/kanban-overhaul/config/rules/testing.md +0 -10
- package/.claude/worktrees/kanban-overhaul/config/rules/thinking.md +0 -56
- package/.claude/worktrees/kanban-overhaul/config/rules/uncertainty.md +0 -70
- package/.claude/worktrees/kanban-overhaul/config/skills/9router/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-chat/SKILL.md +0 -73
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-embeddings/SKILL.md +0 -69
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-image/SKILL.md +0 -86
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-stt/SKILL.md +0 -79
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-tts/SKILL.md +0 -80
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-web-fetch/SKILL.md +0 -99
- package/.claude/worktrees/kanban-overhaul/config/skills/9router-web-search/SKILL.md +0 -91
- package/.claude/worktrees/kanban-overhaul/config/skills/bizar/README.md +0 -9
- package/.claude/worktrees/kanban-overhaul/config/skills/bizar/SKILL.md +0 -447
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/README.md +0 -28
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/SKILL.md +0 -634
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/agents/openai.yaml +0 -4
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/concurrency.md +0 -320
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/error-handling.md +0 -229
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/memory-safety.md +0 -216
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/review-checklist.md +0 -96
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/README.md +0 -28
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/SKILL.md +0 -304
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/agents/openai.yaml +0 -4
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/coverage.md +0 -370
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/framework-compare.md +0 -175
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/mocking.md +0 -364
- package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/tdd-workflow.md +0 -308
- package/.claude/worktrees/kanban-overhaul/config/skills/cubesandbox/SKILL.md +0 -148
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/README.md +0 -41
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/SKILL.md +0 -439
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/agents/openai.yaml +0 -4
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/host-tests.md +0 -164
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/kconfig.md +0 -159
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/nvs.md +0 -121
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/packed-structs.md +0 -192
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
- package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
- package/.claude/worktrees/kanban-overhaul/config/skills/glyph/SKILL.md +0 -163
- package/.claude/worktrees/kanban-overhaul/config/skills/harness-engineering/SKILL.md +0 -142
- package/.claude/worktrees/kanban-overhaul/config/skills/lightrag/SKILL.md +0 -81
- package/.claude/worktrees/kanban-overhaul/config/skills/memory-protocol/SKILL.md +0 -105
- package/.claude/worktrees/kanban-overhaul/config/skills/obsidian/SKILL.md +0 -306
- package/.claude/worktrees/kanban-overhaul/config/skills/read-the-damn-docs/SKILL.md +0 -113
- package/.claude/worktrees/kanban-overhaul/config/skills/self-improvement/SKILL.md +0 -64
- package/.claude/worktrees/kanban-overhaul/config/trigger-patterns.json +0 -186
- package/.claude/worktrees/kanban-overhaul/docker-compose.yml +0 -50
- package/.claude/worktrees/kanban-overhaul/docs/A11Y.md +0 -81
- package/.claude/worktrees/kanban-overhaul/docs/DEPLOY.md +0 -360
- package/.claude/worktrees/kanban-overhaul/docs/DOCKER.md +0 -250
- package/.claude/worktrees/kanban-overhaul/docs/INDEX.md +0 -223
- package/.claude/worktrees/kanban-overhaul/docs/PLUGIN_REGISTRY.md +0 -107
- package/.claude/worktrees/kanban-overhaul/docs/RELEASING.md +0 -693
- package/.claude/worktrees/kanban-overhaul/docs/architecture.md +0 -317
- package/.claude/worktrees/kanban-overhaul/docs/code-review.md +0 -242
- package/.claude/worktrees/kanban-overhaul/docs/curator.md +0 -144
- package/.claude/worktrees/kanban-overhaul/docs/dashboard-ui-migration.md +0 -807
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-001-cline-rewrite.md +0 -114
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-002-in-process-clinecore.md +0 -139
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-003-in-process-memory-vault.md +0 -101
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-004-cline-agent-teams.md +0 -112
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-005-bg-agents-via-dashboard.md +0 -77
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-006-kanban-board.md +0 -69
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-007-tool-approval-gate.md +0 -147
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-008-skill-curator.md +0 -100
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-009-pre-compaction-flush.md +0 -106
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-010-knowledge-graph-tools.md +0 -95
- package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-011-claude-code-migration.md +0 -172
- package/.claude/worktrees/kanban-overhaul/docs/graph-tools.md +0 -130
- package/.claude/worktrees/kanban-overhaul/docs/migration-guide.md +0 -471
- package/.claude/worktrees/kanban-overhaul/docs/migrations/cline-replacement.md +0 -118
- package/.claude/worktrees/kanban-overhaul/docs/postmortems/2026-06-18-plugin-state-deadlock.md +0 -250
- package/.claude/worktrees/kanban-overhaul/docs/quality-document.md +0 -74
- package/.claude/worktrees/kanban-overhaul/docs/releases/v0.5.2.md +0 -66
- package/.claude/worktrees/kanban-overhaul/docs/releases/v0.5.4.md +0 -85
- package/.claude/worktrees/kanban-overhaul/docs/releases/v2.3.0.md +0 -96
- package/.claude/worktrees/kanban-overhaul/docs/releases/v3.24.0.md +0 -155
- package/.claude/worktrees/kanban-overhaul/docs/releases/v4.0.0.md +0 -123
- package/.claude/worktrees/kanban-overhaul/docs/releases/v7.0.0.md +0 -173
- package/.claude/worktrees/kanban-overhaul/docs/safety.md +0 -216
- package/.claude/worktrees/kanban-overhaul/feature_list.json +0 -1297
- package/.claude/worktrees/kanban-overhaul/init.sh +0 -211
- package/.claude/worktrees/kanban-overhaul/install.sh +0 -498
- package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/INSTRUCTIONS.md +0 -82
- package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/mod.json +0 -37
- package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/route.mjs +0 -136
- package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/web/index.html +0 -180
- package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/INSTRUCTIONS.md +0 -81
- package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/mod.json +0 -61
- package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/route.mjs +0 -461
- package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/web/index.html +0 -263
- package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/INSTRUCTIONS.md +0 -87
- package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/agents/thor.md +0 -64
- package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/mod.json +0 -36
- package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/route.mjs +0 -98
- package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/web/index.html +0 -126
- package/.claude/worktrees/kanban-overhaul/package.json +0 -154
- package/.claude/worktrees/kanban-overhaul/packages/sdk/ARCHITECTURE.md +0 -70
- package/.claude/worktrees/kanban-overhaul/packages/sdk/LICENSE +0 -21
- package/.claude/worktrees/kanban-overhaul/packages/sdk/README.md +0 -80
- package/.claude/worktrees/kanban-overhaul/packages/sdk/package.json +0 -30
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/agent-registry.ts +0 -304
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/byzantine.ts +0 -587
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/index.ts +0 -147
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/queen.ts +0 -173
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/types.ts +0 -199
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/dangerous-patterns.ts +0 -127
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/audit.ts +0 -156
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/budget.ts +0 -269
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/envelope.ts +0 -144
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/hmac.ts +0 -160
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/index.ts +0 -443
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/pii.ts +0 -241
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/policy.ts +0 -112
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/trust.ts +0 -146
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/fingerprint.ts +0 -0
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/index.ts +0 -114
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/mcp/bin.ts +0 -51
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/mcp/server.ts +0 -848
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/memory/index.ts +0 -160
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/codemod-intent.ts +0 -125
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/index.ts +0 -247
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/memory-distillation-shim.mjs +0 -18
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/memory-distillation.ts +0 -249
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/model-router.ts +0 -235
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/q-learning-router.ts +0 -304
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/swarm-topology.ts +0 -279
- package/.claude/worktrees/kanban-overhaul/packages/sdk/src/version.ts +0 -4
- package/.claude/worktrees/kanban-overhaul/packages/sdk/tsconfig.json +0 -25
- package/.claude/worktrees/kanban-overhaul/packages/sdk/vitest.config.ts +0 -9
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/ARCHITECTURE.md +0 -72
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/CONSTRAINTS.md +0 -62
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/LICENSE +0 -21
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/README.md +0 -46
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/index.ts +0 -50
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/package.json +0 -18
- package/.claude/worktrees/kanban-overhaul/plugins/bizar/tsconfig.json +0 -29
- package/.claude/worktrees/kanban-overhaul/scripts/bh-full-e2e.mjs +0 -298
- package/.claude/worktrees/kanban-overhaul/scripts/check-agents.mjs +0 -73
- package/.claude/worktrees/kanban-overhaul/scripts/check-arch.sh +0 -80
- package/.claude/worktrees/kanban-overhaul/scripts/check-deps.mjs +0 -492
- package/.claude/worktrees/kanban-overhaul/scripts/clean-state-check.sh +0 -81
- package/.claude/worktrees/kanban-overhaul/scripts/git-hooks/pre-commit +0 -59
- package/.claude/worktrees/kanban-overhaul/scripts/git-hooks/pre-push +0 -54
- package/.claude/worktrees/kanban-overhaul/scripts/install-hooks.sh +0 -29
- package/.claude/worktrees/kanban-overhaul/scripts/install-service.mjs +0 -190
- package/.claude/worktrees/kanban-overhaul/scripts/mirror-claude-md.sh +0 -78
- package/.claude/worktrees/kanban-overhaul/scripts/session-trace.sh +0 -52
- package/.claude/worktrees/kanban-overhaul/scripts/test-in-container.sh +0 -157
- package/.claude/worktrees/kanban-overhaul/scripts/verify-feature.sh +0 -102
- package/.claude/worktrees/kanban-overhaul/skills-lock.json +0 -11
- package/.claude/worktrees/kanban-overhaul/templates/clean-state-checklist.md +0 -55
- package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/README.md +0 -32
- package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/functions-index.template.js +0 -15
- package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/wrangler.toml.template +0 -9
- package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/.env.template +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/README.md +0 -58
- package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/docker-compose.template.yml +0 -23
- package/.claude/worktrees/kanban-overhaul/templates/deploy/fly/README.md +0 -35
- package/.claude/worktrees/kanban-overhaul/templates/deploy/fly/fly.toml.template +0 -28
- package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/README.md +0 -29
- package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/api-index.template.js +0 -18
- package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/vercel.json.template +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/README.md +0 -58
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/citation.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/code-review.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/code-search-basic.json +0 -28
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/concise-output.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/context-window.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/error-recovery.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/json-output.json +0 -20
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/latency-bounds.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/multi-language.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/regression-suite.json +0 -79
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/response-format.json +0 -30
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/safe-paths.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/tool-call-correctness.json +0 -24
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/tool-call-multi-step.json +0 -18
- package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/unicode-handling.json +0 -16
- package/.claude/worktrees/kanban-overhaul/templates/evaluator-rubric.md +0 -50
- package/.claude/worktrees/kanban-overhaul/templates/plan/htmx.min.js +0 -1
- package/.claude/worktrees/kanban-overhaul/templates/plan/library/bug-investigation.mdx +0 -79
- package/.claude/worktrees/kanban-overhaul/templates/plan/library/decision-record.mdx +0 -71
- package/.claude/worktrees/kanban-overhaul/templates/plan/library/feature-design.mdx +0 -92
- package/.claude/worktrees/kanban-overhaul/templates/plan/meta.json.template +0 -8
- package/.claude/worktrees/kanban-overhaul/templates/plan/plan.mdx.template +0 -46
- package/.claude/worktrees/kanban-overhaul/templates/plugin-template/README.md +0 -121
- package/.claude/worktrees/kanban-overhaul/templates/plugin-template/index.js +0 -66
- package/.claude/worktrees/kanban-overhaul/templates/plugin-template/plugin.json +0 -42
- package/.claude/worktrees/kanban-overhaul/templates/plugin-template/tests/plugin.test.js +0 -83
- package/.claude/worktrees/kanban-overhaul/templates/schedules/daily-backup.json +0 -12
- package/.claude/worktrees/kanban-overhaul/templates/schedules/daily-cleanup.json +0 -12
- package/.claude/worktrees/kanban-overhaul/templates/schedules/hourly-health-check.json +0 -12
- package/.claude/worktrees/kanban-overhaul/templates/schedules/webhook-on-push.json +0 -13
- package/.claude/worktrees/kanban-overhaul/templates/schedules/weekly-digest.json +0 -13
- package/.claude/worktrees/kanban-overhaul/templates/sprint-contract.md +0 -47
- package/.claude/worktrees/kanban-overhaul/tsconfig.json +0 -44
- package/.claude/worktrees/kanban-overhaul/vite.config.ts +0 -51
- package/bizar-dash/dist/assets/ActivityFeed-BXIkGGQ1.js +0 -16
- package/bizar-dash/dist/assets/ActivityFeed-BXIkGGQ1.js.map +0 -1
- package/bizar-dash/dist/assets/ActivityView-CBxNNrZa.js +0 -12
- package/bizar-dash/dist/assets/ActivityView-CBxNNrZa.js.map +0 -1
- package/bizar-dash/dist/assets/AgentsView-uv4l21AH.js +0 -23
- package/bizar-dash/dist/assets/AgentsView-uv4l21AH.js.map +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-CB4WXIpk.js +0 -6
- package/bizar-dash/dist/assets/BackgroundJobsView-CB4WXIpk.js.map +0 -1
- package/bizar-dash/dist/assets/Card-CeZsWlcP.js +0 -1
- package/bizar-dash/dist/assets/Card-CeZsWlcP.js.map +0 -1
- package/bizar-dash/dist/assets/Chip-OPjSKl2I.js +0 -1
- package/bizar-dash/dist/assets/Chip-OPjSKl2I.js.map +0 -1
- package/bizar-dash/dist/assets/EmptyState-BrLA8mbE.js +0 -1
- package/bizar-dash/dist/assets/EmptyState-BrLA8mbE.js.map +0 -1
- package/bizar-dash/dist/assets/GoalsView-B8R-kxQr.js +0 -11
- package/bizar-dash/dist/assets/GoalsView-B8R-kxQr.js.map +0 -1
- package/bizar-dash/dist/assets/Grid-B7NgNtff.js +0 -1
- package/bizar-dash/dist/assets/Grid-B7NgNtff.js.map +0 -1
- package/bizar-dash/dist/assets/Input-BW_5Sl6N.js +0 -1
- package/bizar-dash/dist/assets/Input-BW_5Sl6N.js.map +0 -1
- package/bizar-dash/dist/assets/KanbanCard-B-NOSfMN.js +0 -21
- package/bizar-dash/dist/assets/KanbanCard-B-NOSfMN.js.map +0 -1
- package/bizar-dash/dist/assets/LibrariesView-D6eB7B2A.js +0 -67
- package/bizar-dash/dist/assets/LibrariesView-D6eB7B2A.js.map +0 -1
- package/bizar-dash/dist/assets/MemoryView-MK4m1KbR.js +0 -13
- package/bizar-dash/dist/assets/MemoryView-MK4m1KbR.js.map +0 -1
- package/bizar-dash/dist/assets/OverviewView-CHavfYBa.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-CHavfYBa.js.map +0 -1
- package/bizar-dash/dist/assets/SchedulesView-zV-0pbsz.js +0 -1
- package/bizar-dash/dist/assets/SchedulesView-zV-0pbsz.js.map +0 -1
- package/bizar-dash/dist/assets/Select-B6Ho36Tq.js +0 -11
- package/bizar-dash/dist/assets/Select-B6Ho36Tq.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsRow-Br21uRFz.js +0 -1
- package/bizar-dash/dist/assets/SettingsRow-Br21uRFz.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsView-Cx3uJrus.js +0 -38
- package/bizar-dash/dist/assets/SettingsView-Cx3uJrus.js.map +0 -1
- package/bizar-dash/dist/assets/Sheet-Cmu_4Zea.js +0 -1
- package/bizar-dash/dist/assets/Sheet-Cmu_4Zea.js.map +0 -1
- package/bizar-dash/dist/assets/Slider-B_jPr-SR.js +0 -1
- package/bizar-dash/dist/assets/Slider-B_jPr-SR.js.map +0 -1
- package/bizar-dash/dist/assets/Sparkline-Cmqw0N39.js +0 -1
- package/bizar-dash/dist/assets/Sparkline-Cmqw0N39.js.map +0 -1
- package/bizar-dash/dist/assets/Switch-C7Qyu50Y.js +0 -10
- package/bizar-dash/dist/assets/Switch-C7Qyu50Y.js.map +0 -1
- package/bizar-dash/dist/assets/TasksView-BXADmjgb.js +0 -1
- package/bizar-dash/dist/assets/TasksView-BXADmjgb.js.map +0 -1
- package/bizar-dash/dist/assets/Textarea-KIN98DVH.js +0 -1
- package/bizar-dash/dist/assets/Textarea-KIN98DVH.js.map +0 -1
- package/bizar-dash/dist/assets/ViewHeader-CPbqI-w8.js +0 -6
- package/bizar-dash/dist/assets/ViewHeader-CPbqI-w8.js.map +0 -1
- package/bizar-dash/dist/assets/brain-jN_ldx3U.js +0 -6
- package/bizar-dash/dist/assets/brain-jN_ldx3U.js.map +0 -1
- package/bizar-dash/dist/assets/calendar-DZGgPP2_.js +0 -6
- package/bizar-dash/dist/assets/calendar-DZGgPP2_.js.map +0 -1
- package/bizar-dash/dist/assets/circle-check-XhUtiACZ.js +0 -6
- package/bizar-dash/dist/assets/circle-check-XhUtiACZ.js.map +0 -1
- package/bizar-dash/dist/assets/clock-BXBnSbox.js +0 -6
- package/bizar-dash/dist/assets/clock-BXBnSbox.js.map +0 -1
- package/bizar-dash/dist/assets/cmdk-D15rXxc5.js +0 -80
- package/bizar-dash/dist/assets/cmdk-D15rXxc5.js.map +0 -1
- package/bizar-dash/dist/assets/dnd-kit-Bormfg7j.js +0 -5
- package/bizar-dash/dist/assets/dnd-kit-Bormfg7j.js.map +0 -1
- package/bizar-dash/dist/assets/git-pull-request-BCt0CEjc.js +0 -11
- package/bizar-dash/dist/assets/git-pull-request-BCt0CEjc.js.map +0 -1
- package/bizar-dash/dist/assets/index-C0JBGB5M.js +0 -1
- package/bizar-dash/dist/assets/index-C0JBGB5M.js.map +0 -1
- package/bizar-dash/dist/assets/index-CrWI7sQR.js +0 -1
- package/bizar-dash/dist/assets/index-CrWI7sQR.js.map +0 -1
- package/bizar-dash/dist/assets/main-CCimEcWH.js +0 -134
- package/bizar-dash/dist/assets/main-CCimEcWH.js.map +0 -1
- package/bizar-dash/dist/assets/play-B0rTjpSg.js +0 -6
- package/bizar-dash/dist/assets/play-B0rTjpSg.js.map +0 -1
- package/bizar-dash/dist/assets/plus-BaTQsS9G.js +0 -6
- package/bizar-dash/dist/assets/plus-BaTQsS9G.js.map +0 -1
- package/bizar-dash/dist/assets/refresh-cw-CoatVcs3.js +0 -6
- package/bizar-dash/dist/assets/refresh-cw-CoatVcs3.js.map +0 -1
- package/bizar-dash/dist/assets/terminal-k-1HFHcN.js +0 -11
- package/bizar-dash/dist/assets/terminal-k-1HFHcN.js.map +0 -1
- package/bizar-dash/dist/assets/trash-2-DtpKnAn2.js +0 -6
- package/bizar-dash/dist/assets/trash-2-DtpKnAn2.js.map +0 -1
- package/bizar-dash/dist/assets/triangle-alert-FHSs_e5b.js +0 -6
- package/bizar-dash/dist/assets/triangle-alert-FHSs_e5b.js.map +0 -1
- package/bizar-dash/dist/assets/wrench-CbBE0oQ0.js +0 -6
- package/bizar-dash/dist/assets/wrench-CbBE0oQ0.js.map +0 -1
- package/bizar-dash/dist/v8.html +0 -19
- package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +0 -106
- package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +0 -62
- package/bizar-dash/src/web/v8.html +0 -17
- package/packages/sdk/.harness/agents.json +0 -17
- package/packages/sdk/.harness/topology.json +0 -4
- package/packages/sdk/ARCHITECTURE.md +0 -70
- package/packages/sdk/README.md +0 -80
- package/packages/sdk/src/agent-registry.ts +0 -304
- package/packages/sdk/src/consensus/byzantine.ts +0 -587
- package/packages/sdk/src/consensus/index.ts +0 -147
- package/packages/sdk/src/consensus/queen.ts +0 -173
- package/packages/sdk/src/consensus/types.ts +0 -199
- package/packages/sdk/src/dangerous-patterns.ts +0 -127
- package/packages/sdk/src/federation/audit.ts +0 -156
- package/packages/sdk/src/federation/budget.ts +0 -269
- package/packages/sdk/src/federation/envelope.ts +0 -144
- package/packages/sdk/src/federation/hmac.ts +0 -160
- package/packages/sdk/src/federation/index.ts +0 -443
- package/packages/sdk/src/federation/pii.ts +0 -241
- package/packages/sdk/src/federation/policy.ts +0 -112
- package/packages/sdk/src/federation/trust.ts +0 -146
- package/packages/sdk/src/fingerprint.ts +0 -0
- package/packages/sdk/src/index.ts +0 -114
- package/packages/sdk/src/mcp/bin.ts +0 -51
- package/packages/sdk/src/mcp/server.ts +0 -848
- package/packages/sdk/src/memory/index.ts +0 -160
- package/packages/sdk/src/router/codemod-intent.ts +0 -125
- package/packages/sdk/src/router/index.ts +0 -247
- package/packages/sdk/src/router/memory-distillation-shim.mjs +0 -18
- package/packages/sdk/src/router/memory-distillation.ts +0 -249
- package/packages/sdk/src/router/model-router.ts +0 -235
- package/packages/sdk/src/router/q-learning-router.ts +0 -304
- package/packages/sdk/src/swarm-topology.ts +0 -279
- package/packages/sdk/src/version.ts +0 -4
- package/packages/sdk/tests/agent-registry.test.ts +0 -285
- package/packages/sdk/tests/consensus.test.ts +0 -376
- package/packages/sdk/tests/federation/audit.test.ts +0 -164
- package/packages/sdk/tests/federation/budget.test.ts +0 -189
- package/packages/sdk/tests/federation/envelope.test.ts +0 -120
- package/packages/sdk/tests/federation/hmac.test.ts +0 -194
- package/packages/sdk/tests/federation/orchestrator.test.ts +0 -176
- package/packages/sdk/tests/federation/pii.test.ts +0 -106
- package/packages/sdk/tests/federation/policy.test.ts +0 -140
- package/packages/sdk/tests/federation/trust.test.ts +0 -124
- package/packages/sdk/tests/mcp-tools.test.ts +0 -204
- package/packages/sdk/tests/memory-distillation.test.mjs +0 -186
- package/packages/sdk/tests/model-router.test.mjs +0 -108
- package/packages/sdk/tests/q-learning-router.test.mjs +0 -100
- package/packages/sdk/tests/router-orchestrator.test.mjs +0 -172
- package/packages/sdk/tests/router.test.mjs +0 -91
- package/packages/sdk/tests/sdk.test.mjs +0 -172
- package/packages/sdk/tests/swarm-topology.test.ts +0 -258
- package/packages/sdk/tsconfig.json +0 -25
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8.html → bizar-dash/src/web/index.html} +0 -0
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanCardBadges.tsx +0 -0
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanEmptyColumn.tsx +0 -0
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanProgress.tsx +0 -0
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanToolbar.tsx +0 -0
- /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/useKanbanSelection.ts +0 -0
- /package/{.claude/worktrees/kanban-overhaul → plugins/bizar}/LICENSE +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{c as oe,B as L,A as te,g as ye,S as A,I as $,d as E,u as _,h as U,i as J,a as se,N as xe,C as je,b as be,j as Se,F as q}from"./main-CdOm1Pj9.js";import{G as re}from"./Grid-CiRyhAgR.js";import{C as ke,V as we}from"./ViewHeader-BqIPVKuG.js";import{L as Ce}from"./ListHeader-BGjm11Z0.js";import{A as ie,G as ze,B as Re}from"./Avatar-DZPv9pvd.js";import{P as Te}from"./ProgressBar-B-h60LKA.js";import{Z as $e}from"./zap-DmhVUzRA.js";import{S as le,a as de}from"./Sheet-DH-WNJ3Y.js";import{T as Ie}from"./Textarea-qYDf3yds.js";import{C as ce,b as ue}from"./Card-Tyboihu7.js";import{P as ge}from"./play-CawUZ02_.js";import{P as ae}from"./pause-C9hgd8wX.js";import{R as Ee}from"./refresh-cw-1RBqDKgJ.js";import{S as Ae}from"./send-xgy3RAi7.js";import{R as fe}from"./rotate-cw-DHooc0Tx.js";import{C as X}from"./Chip-BrXIlR9w.js";import{E as Me}from"./ErrorState-DwwJ2-Jq.js";import{I as ne}from"./Input-BbFUDQnS.js";import{E as Le}from"./EmptyState-DZ2ouKwd.js";import{P as Oe}from"./plus-M6LYiKX8.js";import{T as Pe}from"./triangle-alert-BPLb7uLt.js";import"./Alert-DN0UysMg.js";import"./circle-alert-BsLl001l.js";import"./circle-check-rVKMQmZp.js";import"./refresh-ccw-CHMprsm5.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Be=oe("ClipboardCopy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]);/**
|
|
7
|
+
* @license lucide-react v0.460.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Ne=oe("Octagon",[["path",{d:"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z",key:"2d38gg"}]]),De={idle:"Idle",busy:"Busy",error:"Error",paused:"Paused"},Fe={idle:"neutral",busy:"info",error:"danger",paused:"neutral"},Ue={idle:"var(--fg-subtle)",busy:"var(--info)",error:"var(--danger)",paused:"var(--warning)"};function He(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function We(t){return t>=.8?"success":t>=.5?"warning":"danger"}function Je(t){return typeof t!="number"||!Number.isFinite(t)||t<=0?"neutral":(Date.now()-t)/864e5>1?"danger":"neutral"}function _e(t){const{name:a,role:r,status:n,lastActivity:c,currentTask:f,tasksToday:o,tasksSucceeded:w,tasksTotal:h,successRate:v,lastSeenMs:S,onOpen:R,badges:b,className:m}=t,u=typeof w=="number"&&typeof h=="number"||typeof v=="number"||typeof S=="number";return e.jsxs("button",{type:"button",onClick:R,className:ye("v8-agent-card",`v8-agent-card--${n}`,m),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[e.jsx(ie,{name:a,status:n==="busy"||n==="error"?"busy":n==="idle"?"online":"away"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:a}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:r})]}),e.jsx(L,{tone:Fe[n],dot:!0,children:De[n]})]}),f!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-2) var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},title:f,children:f}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[c!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(te,{size:12,"aria-hidden":"true",style:{color:Ue[n]}}),c]}),o!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx($e,{size:12,"aria-hidden":"true"}),o," today"]})]}),u&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-2)"},children:[typeof w=="number"&&typeof h=="number"&&h>0&&e.jsxs("div",{"data-testid":"agent-card-tasks",style:{display:"flex",flexDirection:"column",gap:2},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"tasks"}),e.jsxs("code",{style:{fontFamily:"var(--font-mono)",color:"var(--fg)"},children:[w," / ",h]})]}),e.jsx(Te,{value:w,max:h,tone:"accent",height:4})]}),typeof v=="number"&&e.jsxs("div",{"data-testid":"agent-card-success",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"success"}),e.jsxs(L,{"data-testid":"agent-card-success-badge",tone:We(v),children:[Math.round(v*100),"% success"]})]}),typeof S=="number"&&e.jsxs("div",{"data-testid":"agent-card-lastseen",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"last seen"}),e.jsx(L,{"data-testid":"agent-card-lastseen-badge",tone:Je(S),children:He(S)})]})]}),b!==void 0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:b}),e.jsx("style",{children:`
|
|
12
|
+
.v8-agent-card:hover { border-color: var(--accent); }
|
|
13
|
+
`})]})}const ee=500;function Ke(t){const{sessionId:a,paused:r}=t,[n,c]=d.useState([]),[f,o]=d.useState("connecting"),[w,h]=d.useState(null),[v,S]=d.useState(!1),[R,b]=d.useState(!0),m=d.useRef(null),u=d.useRef(null);d.useEffect(()=>{if(r||v){u.current&&(u.current.close(),u.current=null),o("paused");return}if(typeof window>"u"||typeof EventSource>"u"){o("error"),h("EventSource not available in this environment.");return}o("connecting"),h(null);const i=`/api/agent-stream/live?sessionId=${encodeURIComponent(a)}`,p=new EventSource(i);u.current=p;const I=x=>{try{const C=JSON.parse(x.data);Array.isArray(C.events)&&c(C.events.slice(-ee)),o("live")}catch{}},O=x=>{try{const C=JSON.parse(x.data);c(B=>{const N=B.length>=ee?B.slice(B.length-ee+1):B.slice();return N.push(C),N}),o("live")}catch{}},T=x=>{try{const C=JSON.parse(x.data);o("closed"),h(C.reason?`Stream ended: ${C.reason}`:null)}catch{}},P=x=>{try{const C=JSON.parse(x.data);o("error"),h(C.error||"stream error")}catch{}};return p.addEventListener("snapshot",I),p.addEventListener("event",O),p.addEventListener("agent:event",O),p.addEventListener("end",T),p.addEventListener("error",P),p.onerror=()=>{o("error"),h("Connection dropped. Click Retry to reconnect.")},()=>{p.close(),u.current=null}},[a,r,v]),d.useEffect(()=>{if(!R||!m.current)return;const i=m.current;i.scrollTop=i.scrollHeight},[n,R]);const k=(i,p)=>{var P,x,C;const I=i.role==="user"?"user":i.role==="assistant"?"assistant":(P=i.tool)!=null&&P.name?"tool":"system",O=(x=i.tool)!=null&&x.name?`${i.tool.name}`:i.role?i.role:i.type||"event",T=typeof i.content=="string"?i.content:(C=i.tool)!=null&&C.input?JSON.stringify(i.tool.input).slice(0,240):typeof i.message=="string"?i.message:i.result?JSON.stringify(i.result).slice(0,240):JSON.stringify(i).slice(0,240);return e.jsxs("div",{style:{padding:"4px 8px",borderRadius:"var(--radius-sm)",background:I==="user"?"color-mix(in oklch, var(--accent) 8%, var(--surface-0))":I==="tool"?"color-mix(in oklch, var(--warning) 8%, var(--surface-0))":I==="system"?"var(--surface-1)":"var(--surface-0)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsxs("span",{style:{color:"var(--fg-muted)"},children:[O,": "]}),e.jsx("span",{style:{color:"var(--fg)"},children:T})]},p)};return e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",justify:"between",children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx("span",{"aria-hidden":!0,style:{width:8,height:8,borderRadius:"50%",background:f==="live"?"var(--success)":f==="connecting"?"var(--warning)":f==="paused"||f==="closed"?"var(--fg-muted)":"var(--danger)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[f==="live"?"Live":f==="connecting"?"Connecting…":f==="paused"?"Paused":f==="closed"?"Closed":"Error"," · ",n.length," events"]})]}),e.jsxs($,{align:"center",gap:1,children:[e.jsx(E,{variant:"ghost",onClick:()=>S(i=>!i),title:v?"Resume stream":"Pause stream","aria-label":v?"Resume stream":"Pause stream",children:v?e.jsx(ge,{size:12,"aria-hidden":!0}):e.jsx(ae,{size:12,"aria-hidden":!0})}),e.jsx(E,{variant:"ghost",onClick:()=>c([]),title:"Clear buffer","aria-label":"Clear output",children:"Clear"}),e.jsxs(E,{variant:"ghost",onClick:()=>{c([]),S(!1)},title:"Reconnect","aria-label":"Reconnect stream",children:[e.jsx(Ee,{size:12,"aria-hidden":!0})," Retry"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--fs-12)",color:"var(--fg-muted)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:R,onChange:i=>b(i.target.checked)}),"follow"]})]})]}),w!==null&&e.jsx("div",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:w}),e.jsx("div",{ref:m,onScroll:i=>{const p=i.currentTarget,I=p.scrollHeight-p.scrollTop-p.clientHeight<20;b(I)},style:{maxHeight:280,minHeight:120,overflowY:"auto",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",display:"flex",flexDirection:"column",gap:4,background:"var(--surface-1)"},role:"log","aria-live":"polite","aria-label":"Agent live output",children:n.length===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:f==="connecting"?"Connecting to agent stream…":"No events yet."}):n.map(k)})]})}function Ve(t){return t.startsWith("bizar:")?{source:"bizar",key:t.slice(6)}:t.startsWith("cc:")?{source:"claude-code",key:t.slice(3)}:{source:"bizar",key:t}}function Ge(t){const{agentId:a,name:r,role:n,status:c,currentTask:f,open:o,onOpenChange:w,startedAt:h,messageCount:v,lastMessageSnippet:S,successRate:R,tasksTotal:b}=t,{source:m,key:u}=Ve(a),[k,i]=d.useState(""),[p,I]=d.useState(null),[O,T]=d.useState(null),[P,x]=d.useState(null),[C,B]=d.useState(null),N=_(o?"/api/tasks":null),H=d.useMemo(()=>{var z;return o?(((z=N.data)==null?void 0:z.tasks)??[]).filter(F=>{const W=F.metadata??{};return typeof F.workedBy=="string"&&F.workedBy===u||W.agent===u}):[]},[o,N.data,u]);d.useEffect(()=>{o&&(i(""),T(null),x(null),B(null))},[o,a]);const D=async(j,z,F,W)=>{I(j),T(null),x(null);try{const M=await J(F,{method:z,body:W});if(M.ok){const G=M.sessionId?` (session ${M.sessionId.slice(0,8)})`:"";M.processId&&B(M.processId),T(`${j} succeeded${G}`)}else x(M.error||`${j} failed`)}catch(M){x(M instanceof Error?M.message:String(M))}finally{I(null)}},K=async()=>{if(!k.trim())return;const j=k.trim();i(""),m==="claude-code"?await D("Send prompt","POST",`/api/cc-agents/${encodeURIComponent(u)}/send`,{prompt:j}):await D("Invoke agent","POST",`/api/agents/${encodeURIComponent(u)}/invoke`,{prompt:j})},V=async()=>{if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Restart ${r}? The current session will be killed and a fresh one spawned.`)){if(m==="claude-code"){const z=k.trim()||"continue from the last checkpoint";await D("Restart","POST",`/api/cc-agents/${encodeURIComponent(u)}/restart`,{prompt:z});return}await D("Restart","POST",`/api/agents/${encodeURIComponent(u)}/restart`)}},Y=async()=>{if(m==="claude-code"){await D("Kill","POST",`/api/cc-agents/${encodeURIComponent(u)}/kill`);return}if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Delete Bizar agent "${u}"? This is irreversible.`)){I("Kill"),T(null),x(null);try{await J(`/api/agents/${encodeURIComponent(u)}`,{method:"DELETE"}),T(`Killed ${r}`),w(!1)}catch(z){x(z instanceof Error?z.message:String(z))}finally{I(null)}}},Z=async()=>{try{await navigator.clipboard.writeText(u),T(`Copied "${u}"`)}catch{x("Clipboard unavailable")}};return e.jsx(le,{open:o,onOpenChange:w,children:e.jsx(de,{side:"right",title:r,children:e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs($,{gap:3,align:"center",children:[e.jsx(ie,{name:r,status:c==="busy"||c==="error"?"busy":"online"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:n}),e.jsxs($,{gap:2,style:{marginTop:4},wrap:!0,children:[e.jsx(L,{tone:c==="busy"?"info":c==="error"?"danger":"neutral",dot:!0,children:c}),e.jsx(L,{tone:"accent",children:m==="bizar"?"Bizar agent":"Claude Code"}),h!==void 0&&e.jsxs(L,{tone:"neutral",title:new Date(h).toLocaleString(),children:["up ",qe(Date.now()-h)]}),typeof v=="number"&&e.jsxs(L,{tone:"neutral",children:[v," msg"]}),typeof b=="number"&&e.jsxs(L,{tone:"neutral",children:[b," tasks"]}),typeof R=="number"&&e.jsxs(L,{tone:R>=.8?"success":R>=.5?"warning":"danger",children:[Math.round(R*100),"% success"]})]})]})]}),typeof S=="string"&&S.length>0&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontStyle:"italic"},title:S,children:["“",S.length>240?`${S.slice(0,240)}…`:S,"”"]}),f!==void 0&&e.jsxs("div",{style:{padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-13)"},children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginBottom:4},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Current task"]}),f]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:`agent-prompt-${a}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Send a prompt"}),e.jsx(Ie,{id:`agent-prompt-${a}`,value:k,onChange:j=>i(j.target.value),placeholder:m==="claude-code"?"Type a follow-up for this background agent…":"Invoke this Bizar agent with…",rows:3,disabled:p!==null}),e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"primary",onClick:()=>{K()},disabled:!k.trim()||p!==null,children:[e.jsx(Ae,{size:14,"aria-hidden":!0})," ",p==="Send prompt"||p==="Invoke agent"?e.jsx(U,{style:{width:60,height:14}}):"Send"]}),e.jsxs(E,{variant:"secondary",onClick:()=>{V()},disabled:p!==null||m==="claude-code",title:m==="claude-code"?"Use command palette to spawn a fresh agent":void 0,children:[e.jsx(fe,{size:14,"aria-hidden":!0})," Restart"]}),e.jsxs(E,{variant:"danger",onClick:()=>{Y()},disabled:p!==null,title:m==="claude-code"?"Kill the CC background session":`Delete Bizar agent "${u}"`,children:[e.jsx(Ne,{size:14,"aria-hidden":!0})," Kill"]}),e.jsxs(E,{variant:"ghost",onClick:()=>{Z()},children:[e.jsx(Be,{size:14,"aria-hidden":!0})," Copy id"]})]})]}),O!==null&&e.jsx("div",{role:"status",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--success)"},children:O}),C!==null&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"PID"}),e.jsx("code",{"data-testid":"agent-process-id",style:{fontFamily:"var(--font-mono)",color:"var(--fg)",background:"var(--surface-1)",padding:"2px 6px",borderRadius:"var(--radius-sm)"},children:C})]}),P!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:P}),e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:["Assigned tasks (",H.length,")"]}),N.loading&&H.length===0?e.jsx(U,{style:{height:48}}):H.length===0?e.jsx(ce,{variant:"outlined",children:e.jsx(ue,{children:e.jsx("span",{"data-testid":"agent-tasks-empty",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"No tasks assigned to this agent."})})}):e.jsx(A,{gap:1,children:H.map(j=>e.jsxs("div",{"data-testid":`agent-tasks-${j.id}`,style:{display:"flex",alignItems:"center",gap:"var(--space-2)",padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-13)"},children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:j.id}),e.jsx("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:j.title}),e.jsx(L,{tone:j.status==="doing"?"info":j.status==="blocked"?"danger":"neutral",children:j.status??"queued"})]},j.id))})]}),m==="claude-code"&&e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Live output"]}),e.jsx(Ke,{sessionId:u,paused:p==="Kill"})]})]})})})}function qe(t){if(!Number.isFinite(t)||t<0)return"—";const a=Math.floor(t/1e3);if(a<60)return`${a}s`;const r=Math.floor(a/60);if(r<60)return`${r}m ${a%60}s`;const n=Math.floor(r/60);return n<24?`${n}h ${r%60}m`:`${Math.floor(n/24)}d ${n%24}h`}function Ye(t){const a=(t||"").toLowerCase();return a==="busy"||a==="working"?"info":a==="idle"?"neutral":a==="error"||a==="stuck"?"danger":a==="paused"?"warning":"neutral"}function Ze(t){const a=(t||"").toLowerCase();return a==="working"?"working":a||"idle"}function Qe(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function pe({node:t,depth:a,expanded:r,onToggle:n}){const c=t.children.length>0,f=r.has(t.name),o=t.agent,w=Ye(o==null?void 0:o.status),h=Ze(o==null?void 0:o.status);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{"data-testid":`agent-hierarchy-node-${t.name}`,style:{display:"grid",gridTemplateColumns:"auto 1fr auto auto",alignItems:"center",gap:"var(--space-3)",padding:"var(--space-2) var(--space-3)",paddingLeft:`calc(var(--space-3) + ${a*24}px)`,border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-1)"},children:[c?e.jsx("button",{type:"button","data-testid":`agent-hierarchy-toggle-${t.name}`,"aria-label":f?"Collapse":"Expand",onClick:()=>n(t.name),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:22,height:22,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--surface-0)",color:"var(--fg-muted)",cursor:"pointer",padding:0},children:f?e.jsx(je,{size:12,"aria-hidden":!0}):e.jsx(ke,{size:12,"aria-hidden":!0})}):e.jsx("span",{"aria-hidden":!0,style:{width:22,height:22,display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--fg-subtle)"},children:e.jsx(ze,{size:12})}),e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:t.name}),o&&e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[o.role||o.category||o.mode||"agent",o.parent&&o.parent!==t.name&&e.jsxs(e.Fragment,{children:[" · parent ",e.jsx("code",{style:{fontFamily:"var(--font-mono)"},children:o.parent})]})]})]}),typeof(o==null?void 0:o.lastSeen)=="number"&&o.lastSeen>0&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:Qe(o.lastSeen)}),e.jsx(L,{tone:w,dot:!0,children:h})]}),c&&f&&t.children.map(v=>e.jsx(pe,{node:v,depth:a+1,expanded:r,onToggle:n},v.name))]})}function Xe(){var v,S,R;const t=_("/api/agents/hierarchy"),[a,r]=d.useState(()=>new Set),[n,c]=d.useState(()=>new Set),f=d.useMemo(()=>{var b,m;return((m=(b=t.data)==null?void 0:b.roots)==null?void 0:m.map(u=>u.name))??[]},[t.data]);n.size===0&&f.length>0&&(c(new Set(f)),r(new Set(f)));const o=d.useCallback(()=>t.refetch(),[t]);se("agents:change",o);const w=d.useCallback(b=>{r(m=>{const u=new Set(m);return u.has(b)?u.delete(b):u.add(b),u})},[]);if(t.loading&&!t.data)return e.jsxs(A,{gap:3,children:[e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}})]});const h=((v=t.data)==null?void 0:v.roots)??[];return h.length===0?e.jsx(ce,{children:e.jsx(ue,{children:e.jsx(Le,{icon:e.jsx(xe,{size:32,"aria-hidden":!0}),title:"No hierarchy yet",description:"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.","data-testid":"agent-hierarchy-empty"})})}):e.jsxs(A,{gap:2,children:[e.jsx($,{align:"center",justify:"between",children:e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[h.length," root agent",h.length===1?"":"s"," · ",((R=(S=t.data)==null?void 0:S.all)==null?void 0:R.length)??0," total"]})}),e.jsx(A,{gap:2,children:h.map(b=>e.jsx(pe,{node:b,depth:0,expanded:a,onToggle:w},b.name))})]})}const he="bizar.agents.sourceFilter",me={all:"All",bizar:"Bizar","claude-code":"Claude Code"},et=Object.keys(me);function tt(){if(typeof localStorage>"u")return"all";const t=localStorage.getItem(he);return et.includes(t)?t:"all"}function st(t){if(!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function at(t){const a=(t.status||"idle").toLowerCase(),r=a==="busy"||a==="working"?"busy":a==="error"||a==="stuck"?"error":a==="paused"?"paused":"idle";return{id:`bizar:${t.name}`,name:t.name,role:t.role||t.category||t.mode||"agent",status:r,currentTask:t.currentTaskId?`Task ${t.currentTaskId}`:void 0,lastActivity:t.lastSeen?new Date(t.lastSeen).toLocaleTimeString():void 0,tasksToday:t.tasksTotal||0,tasksSucceeded:typeof t.tasksSucceeded=="number"?t.tasksSucceeded:void 0,tasksTotal:typeof t.tasksTotal=="number"?t.tasksTotal:void 0,successRate:typeof t.successRate=="number"?t.successRate:void 0,lastSeenMs:typeof t.lastSeen=="number"&&t.lastSeen>0?t.lastSeen:void 0,badges:t.tags||[]}}function rt(t){var n,c;const a=(t.status||t.state||"idle").toLowerCase(),r=a==="busy"||a==="working"?"busy":a==="error"?"error":a==="paused"?"paused":"idle";return{id:`cc:${t.sessionId||t.id}`,name:t.name||((n=t.sessionId)==null?void 0:n.slice(0,8))||"unknown",role:t.kind==="background"?"CC background":"CC interactive",status:r,currentTask:t.lastMessageSnippet||void 0,lastActivity:t.lastMessageAt?new Date(t.lastMessageAt).toLocaleTimeString():t.startedAt?new Date(t.startedAt).toLocaleTimeString():void 0,tasksToday:t.messageCount||0,badges:[((c=t.cwd)==null?void 0:c.split("/").slice(-2).join("/"))||""].filter(Boolean)}}function Et(){var F,W,M,G;const t=_("/api/agents"),a=_("/api/cc-agents"),r=_("/api/agents/stuck"),[n,c]=d.useState(tt),[f,o]=d.useState("roster");d.useEffect(()=>{typeof localStorage<"u"&&localStorage.setItem(he,n)},[n]);const[w,h]=d.useState([]),[v,S]=d.useState([]),[R,b]=d.useState(!1),[m,u]=d.useState(null),[k,i]=d.useState(null),[p,I]=d.useState(!1),[O,T]=d.useState(null),[P,x]=d.useState(()=>new Set),C=async()=>{if(!(k===null||!k.name.trim())){I(!0),T(null);try{await J("/api/agents",{method:"POST",body:{name:k.name.trim(),role:k.role.trim()||"agent"}}),i(null),t.refetch()}catch(s){T((s instanceof q,s.message))}finally{I(!1)}}},B=async s=>{x(l=>new Set(l).add(s));try{await J(`/api/agents/${encodeURIComponent(s)}/restart`,{method:"POST"}),r.refetch(),t.refetch()}catch(l){T((l instanceof q,l.message))}finally{x(l=>{const g=new Set(l);return g.delete(s),g})}},[N,H]=d.useState(()=>new Set),D=async(s,l)=>{H(g=>new Set(g).add(s));try{await J(`/api/agents/${encodeURIComponent(s)}/status`,{method:"POST",body:{status:l}}),r.refetch(),t.refetch()}catch(g){T((g instanceof q,g.message))}finally{H(g=>{const y=new Set(g);return y.delete(s),y})}},[K,V]=d.useState(!1),Y=async()=>{var l;const s=((l=r.data)==null?void 0:l.stuck)??[];if(s.length!==0){V(!0);try{await Promise.all(s.map(g=>J(`/api/agents/${encodeURIComponent(g.name)}/status`,{method:"POST",body:{status:"paused"}}).catch(y=>(T((y instanceof q,y.message)),null)))),r.refetch(),t.refetch()}finally{V(!1)}}};d.useEffect(()=>{var s,l;!R&&((s=t.data)==null?void 0:s.agents)!==void 0&&((l=a.data)==null?void 0:l.agents)!==void 0&&(b(!0),h(t.data.agents),S(a.data.agents))},[t.data,a.data,R]);const Z=d.useCallback(()=>{t.refetch(),a.refetch()},[t,a]);se("agents:change",Z);const j=d.useCallback(s=>{if(s.type!=="agent:status")return;const l=s.agent;!l||!l.name||h(g=>{const y=g.findIndex(ve=>ve.name===l.name);if(y===-1)return[...g,l];const Q=g.slice();return Q[y]={...Q[y],...l},Q})},[]);se("agent:status",j);const z=d.useMemo(()=>{const s=[];if(n!=="claude-code")for(const l of w)s.push({...at(l),source:"bizar"});if(n!=="bizar")for(const l of v)s.push({...rt(l),source:"claude-code"});return s},[w,v,n]);return e.jsxs(A,{gap:5,"data-testid":"agents-view",children:[e.jsx(we,{title:"Agents",description:"Bizar agents (frontmatter-driven) and Claude Code background agents.",actions:e.jsxs(E,{variant:"primary",onClick:()=>i({name:"",role:""}),"data-testid":"agent-create-open",children:[e.jsx(Oe,{size:14,"aria-hidden":!0})," New agent"]})}),e.jsx(Ce,{title:"Roster",count:z.length,description:(F=r.data)!=null&&F.stuck&&r.data.stuck.length>0?`${r.data.stuck.length} stuck`:void 0,testid:"agents-list-header"}),(((W=r.data)==null?void 0:W.stuck)??[]).length>0&&e.jsx(Re,{tone:"warning","data-testid":"agents-stuck-banner",action:e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"secondary",size:"sm",onClick:()=>{Y()},disabled:K,"data-testid":"agents-stuck-bulk-pause",title:"Pause every stuck agent at once",children:[e.jsx(ae,{size:12,"aria-hidden":!0})," ",K?"Pausing…":"Pause all"]}),e.jsx(E,{variant:"secondary",size:"sm",onClick:()=>o("hierarchy"),children:"View details"})]}),children:e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx(Pe,{size:14,"aria-hidden":!0,style:{color:"var(--warning)"}}),e.jsxs("span",{children:[(((M=r.data)==null?void 0:M.stuck)??[]).length," agent",r.data&&r.data.stuck&&r.data.stuck.length===1?"":"s"," stuck (no heartbeat >5m)"]})]}),e.jsx(A,{gap:1,children:(((G=r.data)==null?void 0:G.stuck)??[]).map(s=>{const l=P.has(s.name),g=s.status==="paused",y=l||N.has(s.name);return e.jsxs($,{align:"center",justify:"between",gap:2,"data-testid":`agents-stuck-row-${s.name}`,children:[e.jsxs($,{gap:2,align:"center",children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:s.name}),e.jsx(L,{tone:g?"warning":"danger",children:g?"paused":s.status||"stuck"}),typeof s.lastSeen=="number"&&s.lastSeen>0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["last seen ",st(s.lastSeen)]})]}),e.jsxs($,{gap:1,children:[g?e.jsxs(E,{variant:"ghost",size:"sm",disabled:y,onClick:()=>{D(s.name,"idle")},"data-testid":`agents-stuck-resume-${s.name}`,children:[e.jsx(ge,{size:12,"aria-hidden":!0})," Resume"]}):e.jsxs(E,{variant:"secondary",size:"sm",disabled:y,onClick:()=>{D(s.name,"paused")},"data-testid":`agents-stuck-pause-${s.name}`,children:[e.jsx(ae,{size:12,"aria-hidden":!0})," Pause"]}),e.jsxs(E,{variant:"primary",size:"sm",disabled:y,onClick:()=>{B(s.name)},"data-testid":`agents-stuck-restart-${s.name}`,children:[e.jsx(fe,{size:12,"aria-hidden":!0})," ",l?"Restarting…":"Restart"]})]})]},s.name)})})]})}),e.jsxs($,{align:"center",justify:"between",wrap:!0,gap:2,children:[e.jsx($,{gap:2,children:["all","bizar","claude-code"].map(s=>e.jsxs(X,{selected:n===s,onClick:()=>c(s),children:[s==="bizar"?e.jsx(be,{size:12,"aria-hidden":!0}):s==="claude-code"?e.jsx(Se,{size:12,"aria-hidden":!0}):null," ",me[s]]},s))}),e.jsxs($,{gap:2,children:[e.jsx(X,{"data-testid":"agents-mode-roster",selected:f==="roster",onClick:()=>o("roster"),children:"Roster"}),e.jsx(X,{"data-testid":"agents-mode-hierarchy",selected:f==="hierarchy",onClick:()=>o("hierarchy"),children:"Hierarchy"})]})]}),f==="hierarchy"?e.jsx(Xe,{}):z.length===0&&(t.loading||a.loading)?e.jsxs(re,{cols:3,children:[e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}})]}):z.length===0&&(t.error||a.error)?e.jsx(Me,{block:!0,title:"Couldn't load agents",description:"Both bizar and CC roster endpoints failed. Retry to refetch.",error:t.error??a.error,onRetry:()=>{t.refetch(),a.refetch()},testid:"agents-error"}):z.length===0?e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["No agents yet. Run ",e.jsx("code",{children:"/loop"})," or spawn one via the command palette."]}):e.jsx(re,{cols:3,children:z.map(s=>e.jsx(_e,{...s,onOpen:()=>u(s.id)},s.id))}),m!==null&&(()=>{const s=z.find(y=>y.id===m);if(!s)return null;const l=s.source==="claude-code"?v.find(y=>s.id===`cc:${y.sessionId||y.id}`):void 0,g=s.source==="bizar"?w.find(y=>s.id===`bizar:${y.name}`):void 0;return e.jsx(Ge,{agentId:s.id,name:s.name,role:s.role,status:s.status,currentTask:s.currentTask,startedAt:(l==null?void 0:l.startedAt)??(g==null?void 0:g.lastSeen),messageCount:l==null?void 0:l.messageCount,lastMessageSnippet:l==null?void 0:l.lastMessageSnippet,successRate:g==null?void 0:g.successRate,tasksTotal:g==null?void 0:g.tasksTotal,open:m!==null,onOpenChange:y=>{y||u(null)}})})(),e.jsx(le,{open:k!==null,onOpenChange:s=>{s||i(null)},children:e.jsx(de,{side:"right",title:"New agent",children:k!==null&&e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-name",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(ne,{id:"agent-create-name",value:k.name,onChange:s=>i({...k,name:s.target.value}),placeholder:"e.g. frigg",disabled:p,"data-testid":"agent-create-name"})]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-role",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Role (optional)"}),e.jsx(ne,{id:"agent-create-role",value:k.role,onChange:s=>i({...k,role:s.target.value}),placeholder:"e.g. code-review",disabled:p,"data-testid":"agent-create-role"})]}),O!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:O}),e.jsxs($,{gap:2,children:[e.jsx(E,{variant:"primary",onClick:()=>{C()},disabled:p||!k.name.trim(),"data-testid":"agent-create-submit",children:"Create agent"}),e.jsx(E,{variant:"ghost",onClick:()=>i(null),disabled:p,children:"Cancel"})]})]})})})]})}export{Et as AgentsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentsView-BIWGkz7w.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/clipboard-copy.js","../../../node_modules/lucide-react/dist/esm/icons/octagon.js","../../src/web/v8/ui/agents/AgentCard.tsx","../../src/web/v8/ui/agents/AgentLiveOutput.tsx","../../src/web/v8/ui/agents/AgentDetail.tsx","../../src/web/v8/views/Agents/AgentHierarchy.tsx","../../src/web/v8/views/Agents/AgentsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ClipboardCopy = createLucideIcon(\"ClipboardCopy\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\"path\", { d: \"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\", key: \"4jdomd\" }],\n [\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v4\", key: \"3hqy98\" }],\n [\"path\", { d: \"M21 14H11\", key: \"1bme5i\" }],\n [\"path\", { d: \"m15 10-4 4 4 4\", key: \"5dvupr\" }]\n]);\n\nexport { ClipboardCopy as default };\n//# sourceMappingURL=clipboard-copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Octagon = createLucideIcon(\"Octagon\", [\n [\n \"path\",\n {\n d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\",\n key: \"2d38gg\"\n }\n ]\n]);\n\nexport { Octagon as default };\n//# sourceMappingURL=octagon.js.map\n","import { type ReactNode } from 'react';\nimport { Activity, Zap } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\n\n/**\n * AgentCard — agent tile for the Agents roster.\n *\n * Per PLAN.md, agents are the orchestrator's running entities. Each card\n * shows: name, status (idle/busy/error), role, last activity, and a\n * three-row metrics strip (tasks succeeded/total, success rate, lastSeen).\n *\n * v9.4.0 S45 — replaced the dead single-point sparkline (line 140\n * guarded `tpmHistory.length > 1`, never true) with a data-driven\n * metric strip that always renders when the fields are supplied.\n */\n\nexport type AgentStatus = 'idle' | 'busy' | 'error' | 'paused';\n\nexport interface AgentCardProps {\n id: string;\n name: string;\n role: string;\n status: AgentStatus;\n /** Last activity label (\"2m ago\", \"Just now\"). */\n lastActivity?: string;\n /** Current task the agent is working on. */\n currentTask?: string;\n /** Number of tasks completed in the last 24h. */\n tasksToday?: number;\n /** Tasks succeeded (numerator of the ProgressBar). */\n tasksSucceeded?: number;\n /** Tasks total (denominator of the ProgressBar). */\n tasksTotal?: number;\n /** Success rate as 0..1. Tones the badge: >=0.8 success, >=0.5 warning, else danger. */\n successRate?: number;\n /** Last-seen timestamp in ms-since-epoch. Rendered as relative duration. */\n lastSeenMs?: number;\n /** Click handler — opens agent detail. */\n onOpen?: () => void;\n /** Custom badges row (model, owner). */\n badges?: ReactNode;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: 'Idle',\n busy: 'Busy',\n error: 'Error',\n paused: 'Paused',\n};\n\nconst STATUS_TONE: Record<AgentStatus, 'success' | 'info' | 'danger' | 'neutral'> = {\n idle: 'neutral',\n busy: 'info',\n error: 'danger',\n paused: 'neutral',\n};\n\nconst STATUS_FG: Record<AgentStatus, string> = {\n idle: 'var(--fg-subtle)',\n busy: 'var(--info)',\n error: 'var(--danger)',\n paused: 'var(--warning)',\n};\n\n/** relativeTime — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing / future timestamps. */\nfunction relativeTime(ms: number | undefined): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.floor(hr / 24);\n return `${day}d ago`;\n}\n\nfunction successTone(rate: number): 'success' | 'warning' | 'danger' {\n if (rate >= 0.8) return 'success';\n if (rate >= 0.5) return 'warning';\n return 'danger';\n}\n\nfunction lastSeenTone(ms: number | undefined): 'neutral' | 'danger' {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return 'neutral';\n const days = (Date.now() - ms) / 86_400_000;\n return days > 1 ? 'danger' : 'neutral';\n}\n\nexport function AgentCard(props: AgentCardProps): JSX.Element {\n const {\n name,\n role,\n status,\n lastActivity,\n currentTask,\n tasksToday,\n tasksSucceeded,\n tasksTotal,\n successRate,\n lastSeenMs,\n onOpen,\n badges,\n className,\n } = props;\n\n const showMetrics =\n (typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number') ||\n typeof successRate === 'number' ||\n typeof lastSeenMs === 'number';\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-agent-card', `v8-agent-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : status === 'idle' ? 'online' : 'away'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {name}\n </div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {role}\n </div>\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n {currentTask !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-2) var(--space-3)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={currentTask}\n >\n {currentTask}\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {lastActivity !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Activity size={12} aria-hidden=\"true\" style={{ color: STATUS_FG[status] }} />\n {lastActivity}\n </span>\n )}\n {tasksToday !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Zap size={12} aria-hidden=\"true\" />\n {tasksToday} today\n </span>\n )}\n </div>\n {showMetrics && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-2)' }}>\n {typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number' && tasksTotal > 0 && (\n <div data-testid=\"agent-card-tasks\" style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>tasks</span>\n <code style={{ fontFamily: 'var(--font-mono)', color: 'var(--fg)' }}>\n {tasksSucceeded} / {tasksTotal}\n </code>\n </div>\n <ProgressBar value={tasksSucceeded} max={tasksTotal} tone=\"accent\" height={4} />\n </div>\n )}\n {typeof successRate === 'number' && (\n <div\n data-testid=\"agent-card-success\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n success\n </span>\n <Badge data-testid=\"agent-card-success-badge\" tone={successTone(successRate)}>\n {Math.round(successRate * 100)}% success\n </Badge>\n </div>\n )}\n {typeof lastSeenMs === 'number' && (\n <div\n data-testid=\"agent-card-lastseen\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n last seen\n </span>\n <Badge data-testid=\"agent-card-lastseen-badge\" tone={lastSeenTone(lastSeenMs)}>{relativeTime(lastSeenMs)}</Badge>\n </div>\n )}\n </div>\n )}\n {badges !== undefined && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>{badges}</div>\n )}\n <style>{`\n .v8-agent-card:hover { border-color: var(--accent); }\n `}</style>\n </button>\n );\n}","import { useEffect, useRef, useState } from 'react';\nimport { Pause, Play, RefreshCw } from 'lucide-react';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * AgentLiveOutput — Sprint S17. Live SSE tail of a CC agent's session\n * JSONL. Subscribes to `/api/agent-stream/live?sessionId=...` and\n * appends events as they arrive. Pause freezes the buffer (connection\n * stays open). Clear wipes the buffer.\n */\n\ninterface StreamEvent {\n type?: string;\n role?: string;\n content?: string;\n name?: string;\n input?: unknown;\n tool?: { name?: string; input?: unknown };\n result?: unknown;\n ts?: number;\n message?: string;\n}\n\nexport interface AgentLiveOutputProps {\n sessionId: string;\n /** When true the parent wants us to stop connecting (e.g. agent was killed). */\n paused?: boolean;\n}\n\nconst MAX_EVENTS = 500;\n\nexport function AgentLiveOutput(props: AgentLiveOutputProps): JSX.Element {\n const { sessionId, paused } = props;\n const [events, setEvents] = useState<StreamEvent[]>([]);\n const [status, setStatus] = useState<'connecting' | 'live' | 'paused' | 'error' | 'closed'>('connecting');\n const [error, setError] = useState<string | null>(null);\n const [pausedLocal, setPausedLocal] = useState<boolean>(false);\n const [autoScroll, setAutoScroll] = useState<boolean>(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const sourceRef = useRef<EventSource | null>(null);\n\n useEffect(() => {\n if (paused || pausedLocal) {\n if (sourceRef.current) {\n sourceRef.current.close();\n sourceRef.current = null;\n }\n setStatus('paused');\n return;\n }\n if (typeof window === 'undefined' || typeof EventSource === 'undefined') {\n setStatus('error');\n setError('EventSource not available in this environment.');\n return;\n }\n setStatus('connecting');\n setError(null);\n const url = `/api/agent-stream/live?sessionId=${encodeURIComponent(sessionId)}`;\n const src = new EventSource(url);\n sourceRef.current = src;\n\n const onSnapshot = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { events?: StreamEvent[] };\n if (Array.isArray(data.events)) setEvents(data.events.slice(-MAX_EVENTS));\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEvent = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as StreamEvent;\n setEvents((prev) => {\n const next = prev.length >= MAX_EVENTS ? prev.slice(prev.length - MAX_EVENTS + 1) : prev.slice();\n next.push(data);\n return next;\n });\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEnd = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { reason?: string };\n setStatus('closed');\n setError(data.reason ? `Stream ended: ${data.reason}` : null);\n } catch { /* */ }\n };\n const onErrEv = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { error?: string };\n setStatus('error');\n setError(data.error || 'stream error');\n } catch { /* */ }\n };\n src.addEventListener('snapshot', onSnapshot);\n src.addEventListener('event', onEvent);\n src.addEventListener('agent:event', onEvent);\n src.addEventListener('end', onEnd);\n src.addEventListener('error', onErrEv);\n src.onerror = () => {\n setStatus('error');\n setError('Connection dropped. Click Retry to reconnect.');\n };\n return () => {\n src.close();\n sourceRef.current = null;\n };\n }, [sessionId, paused, pausedLocal]);\n\n useEffect(() => {\n if (!autoScroll || !containerRef.current) return;\n const el = containerRef.current;\n el.scrollTop = el.scrollHeight;\n }, [events, autoScroll]);\n\n const renderEvent = (ev: StreamEvent, idx: number): JSX.Element => {\n const tone =\n ev.role === 'user' ? 'user' :\n ev.role === 'assistant' ? 'assistant' :\n ev.tool?.name ? 'tool' :\n 'system';\n const label =\n ev.tool?.name ? `${ev.tool.name}` :\n ev.role ? ev.role : (ev.type || 'event');\n const text =\n typeof ev.content === 'string' ? ev.content :\n ev.tool?.input ? JSON.stringify(ev.tool.input).slice(0, 240) :\n typeof ev.message === 'string' ? ev.message :\n ev.result ? JSON.stringify(ev.result).slice(0, 240) :\n JSON.stringify(ev).slice(0, 240);\n return (\n <div\n key={idx}\n style={{\n padding: '4px 8px',\n borderRadius: 'var(--radius-sm)',\n background:\n tone === 'user' ? 'color-mix(in oklch, var(--accent) 8%, var(--surface-0))' :\n tone === 'tool' ? 'color-mix(in oklch, var(--warning) 8%, var(--surface-0))' :\n tone === 'system' ? 'var(--surface-1)' :\n 'var(--surface-0)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n <span style={{ color: 'var(--fg-muted)' }}>{label}: </span>\n <span style={{ color: 'var(--fg)' }}>{text}</span>\n </div>\n );\n };\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <span\n aria-hidden\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background:\n status === 'live' ? 'var(--success)' :\n status === 'connecting' ? 'var(--warning)' :\n status === 'paused' ? 'var(--fg-muted)' :\n status === 'closed' ? 'var(--fg-muted)' :\n 'var(--danger)',\n }}\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'live' ? 'Live' :\n status === 'connecting' ? 'Connecting…' :\n status === 'paused' ? 'Paused' :\n status === 'closed' ? 'Closed' :\n 'Error'}\n {' · '}{events.length} events\n </span>\n </Inline>\n <Inline align=\"center\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => setPausedLocal((p) => !p)}\n title={pausedLocal ? 'Resume stream' : 'Pause stream'}\n aria-label={pausedLocal ? 'Resume stream' : 'Pause stream'}\n >\n {pausedLocal ? <Play size={12} aria-hidden /> : <Pause size={12} aria-hidden />}\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setEvents([])}\n title=\"Clear buffer\"\n aria-label=\"Clear output\"\n >\n Clear\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => {\n setEvents([]);\n setPausedLocal(false);\n }}\n title=\"Reconnect\"\n aria-label=\"Reconnect stream\"\n >\n <RefreshCw size={12} aria-hidden /> Retry\n </Button>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', cursor: 'pointer' }}>\n <input type=\"checkbox\" checked={autoScroll} onChange={(e) => setAutoScroll(e.target.checked)} />\n follow\n </label>\n </Inline>\n </Inline>\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n <div\n ref={containerRef}\n onScroll={(e) => {\n const el = e.currentTarget;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 20;\n setAutoScroll(atBottom);\n }}\n style={{\n maxHeight: 280,\n minHeight: 120,\n overflowY: 'auto',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n background: 'var(--surface-1)',\n }}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Agent live output\"\n >\n {events.length === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'connecting' ? 'Connecting to agent stream…' : 'No events yet.'}\n </span>\n ) : (\n events.map(renderEvent)\n )}\n </div>\n </Stack>\n );\n}","import { useEffect, useMemo, useState } from 'react';\nimport { Send, RotateCw, Octagon, ClipboardCopy, Activity as ActivityIcon } from 'lucide-react';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Button } from '../controls/Button.js';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Textarea } from '../controls/Textarea.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Card, CardBody } from '../data/Card.js';\nimport { AgentStreamPanel } from './AgentStreamPanel.js';\nimport { AgentLiveOutput } from './AgentLiveOutput.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport type { Task } from '../../data/types.js';\n\n/**\n * AgentDetail — Sprint S11. Right-side Drawer with live agent\n * detail and the control plane (Send prompt / Restart / Kill).\n *\n * Two flavors per `source`:\n * - `bizar:<name>` — hits `/api/agents/:name/invoke` and `/restart`.\n * - `cc:<sessionId>` — hits `/api/cc-agents/:id/send` and `/kill`.\n */\n\nexport type AgentSource = 'bizar' | 'claude-code';\n\nexport interface AgentDetailProps {\n /** Composite id from AgentsView (`bizar:<name>` or `cc:<sessionId>`). */\n agentId: string;\n name: string;\n role: string;\n status: 'idle' | 'busy' | 'error' | 'paused';\n currentTask?: string;\n startedAt?: number;\n messageCount?: number;\n lastMessageSnippet?: string;\n successRate?: number;\n tasksTotal?: number;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nfunction parseId(agentId: string): { source: AgentSource; key: string } {\n if (agentId.startsWith('bizar:')) return { source: 'bizar', key: agentId.slice('bizar:'.length) };\n if (agentId.startsWith('cc:')) return { source: 'claude-code', key: agentId.slice('cc:'.length) };\n return { source: 'bizar', key: agentId };\n}\n\nexport function AgentDetail(props: AgentDetailProps): JSX.Element {\n const {\n agentId, name, role, status, currentTask, open, onOpenChange,\n startedAt, messageCount, lastMessageSnippet, successRate, tasksTotal,\n } = props;\n const { source, key } = parseId(agentId);\n const [prompt, setPrompt] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [lastProcessId, setLastProcessId] = useState<string | null>(null);\n\n // v9.5.0 S49 — agent↔task drilldown. `useFetch` is gated on `open` so\n // we don't burn a request every time the Sheet is mounted-hidden. We\n // client-filter for the current agent's name across both `workedBy`\n // (Bizar task-store) and `metadata.agent` (task-store progress events).\n const tasksQuery = useFetch<{ tasks?: Task[] }>(open ? '/api/tasks' : null);\n const myTasks = useMemo<Task[]>(() => {\n if (!open) return [];\n const all = tasksQuery.data?.tasks ?? [];\n return all.filter((t) => {\n const md = (t.metadata ?? {}) as { agent?: unknown };\n return (\n (typeof (t as unknown as { workedBy?: unknown }).workedBy === 'string'\n && (t as unknown as { workedBy: string }).workedBy === key)\n || md.agent === key\n );\n });\n }, [open, tasksQuery.data, key]);\n\n useEffect(() => {\n if (open) { setPrompt(''); setMessage(null); setError(null); setLastProcessId(null); }\n }, [open, agentId]);\n\n const runAction = async (\n label: string,\n method: 'POST',\n endpoint: string,\n body?: Record<string, unknown>,\n ): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; sessionId?: string; processId?: string; error?: string }>(\n endpoint,\n { method, body },\n );\n if (res.ok) {\n const sessionExtra = res.sessionId ? ` (session ${res.sessionId.slice(0, 8)})` : '';\n if (res.processId) setLastProcessId(res.processId);\n setMessage(`${label} succeeded${sessionExtra}`);\n } else {\n setError(res.error || `${label} failed`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const sendPrompt = async (): Promise<void> => {\n if (!prompt.trim()) return;\n const trimmed = prompt.trim();\n setPrompt('');\n if (source === 'claude-code') {\n await runAction('Send prompt', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/send`, { prompt: trimmed });\n } else {\n await runAction('Invoke agent', 'POST', `/api/agents/${encodeURIComponent(key)}/invoke`, { prompt: trimmed });\n }\n };\n\n const restart = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Restart ${name}? The current session will be killed and a fresh one spawned.`)\n : true;\n if (!ok) return;\n if (source === 'claude-code') {\n // v9.0.5 — server now does kill+spawn in one shot, using the current\n // prompt as the new session's seed (fallback to \"continue\").\n const seed = prompt.trim() || 'continue from the last checkpoint';\n await runAction('Restart', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/restart`, { prompt: seed });\n return;\n }\n await runAction('Restart', 'POST', `/api/agents/${encodeURIComponent(key)}/restart`);\n };\n\n const kill = async (): Promise<void> => {\n if (source === 'claude-code') {\n await runAction('Kill', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/kill`);\n return;\n }\n // Confirm before destroying — DELETE is irreversible.\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete Bizar agent \"${key}\"? This is irreversible.`)\n : true;\n if (!ok) return;\n setBusy('Kill');\n setMessage(null);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean; error?: string }>(\n `/api/agents/${encodeURIComponent(key)}`,\n { method: 'DELETE' },\n );\n setMessage(`Killed ${name}`);\n // Server broadcasts agents:change; close the drawer so the user\n // sees the agent disappear from the grid.\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const copyId = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(key);\n setMessage(`Copied \"${key}\"`);\n } catch {\n setError('Clipboard unavailable');\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title={name}>\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Inline gap={3} align=\"center\">\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : 'online'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{role}</div>\n <Inline gap={2} style={{ marginTop: 4 }} wrap>\n <Badge tone={status === 'busy' ? 'info' : status === 'error' ? 'danger' : 'neutral'} dot>\n {status}\n </Badge>\n <Badge tone=\"accent\">{source === 'bizar' ? 'Bizar agent' : 'Claude Code'}</Badge>\n {startedAt !== undefined && (\n <Badge tone=\"neutral\" title={new Date(startedAt).toLocaleString()}>\n up {formatDuration(Date.now() - startedAt)}\n </Badge>\n )}\n {typeof messageCount === 'number' && (\n <Badge tone=\"neutral\">{messageCount} msg</Badge>\n )}\n {typeof tasksTotal === 'number' && (\n <Badge tone=\"neutral\">{tasksTotal} tasks</Badge>\n )}\n {typeof successRate === 'number' && (\n <Badge tone={successRate >= 0.8 ? 'success' : successRate >= 0.5 ? 'warning' : 'danger'}>\n {Math.round(successRate * 100)}% success\n </Badge>\n )}\n </Inline>\n </div>\n </Inline>\n\n {typeof lastMessageSnippet === 'string' && lastMessageSnippet.length > 0 && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontStyle: 'italic',\n }}\n title={lastMessageSnippet}\n >\n “{lastMessageSnippet.length > 240 ? `${lastMessageSnippet.slice(0, 240)}…` : lastMessageSnippet}”\n </div>\n )}\n\n {currentTask !== undefined && (\n <div\n style={{\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginBottom: 4 }}>\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Current task\n </div>\n {currentTask}\n </div>\n )}\n\n <Stack gap={2}>\n <label\n htmlFor={`agent-prompt-${agentId}`}\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Send a prompt\n </label>\n <Textarea\n id={`agent-prompt-${agentId}`}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder={source === 'claude-code' ? 'Type a follow-up for this background agent…' : 'Invoke this Bizar agent with…'}\n rows={3}\n disabled={busy !== null}\n />\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void sendPrompt(); }}\n disabled={!prompt.trim() || busy !== null}\n >\n <Send size={14} aria-hidden /> {busy === 'Send prompt' || busy === 'Invoke agent' ? <Skeleton style={{ width: 60, height: 14 }} /> : 'Send'}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => { void restart(); }}\n disabled={busy !== null || source === 'claude-code'}\n title={source === 'claude-code' ? 'Use command palette to spawn a fresh agent' : undefined}\n >\n <RotateCw size={14} aria-hidden /> Restart\n </Button>\n <Button\n variant=\"danger\"\n onClick={() => { void kill(); }}\n disabled={busy !== null}\n title={source === 'claude-code' ? 'Kill the CC background session' : `Delete Bizar agent \"${key}\"`}\n >\n <Octagon size={14} aria-hidden /> Kill\n </Button>\n <Button variant=\"ghost\" onClick={() => { void copyId(); }}>\n <ClipboardCopy size={14} aria-hidden /> Copy id\n </Button>\n </Inline>\n </Stack>\n\n {message !== null && (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--success)',\n }}\n >\n {message}\n </div>\n )}\n {lastProcessId !== null && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>PID</span>\n <code\n data-testid=\"agent-process-id\"\n style={{\n fontFamily: 'var(--font-mono)',\n color: 'var(--fg)',\n background: 'var(--surface-1)',\n padding: '2px 6px',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n {lastProcessId}\n </code>\n </div>\n )}\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Live stream — only meaningful for Claude Code sessions (they have\n a backing JSONL log). Bizar agents have no equivalent surface. */}\n {/* v9.5.0 S49 — agent↔task drilldown. Renders the tasks this agent\n is currently working on (filtered by workedBy / metadata.agent),\n so the user can see \"what is my orchestrator doing right now\"\n without bouncing between this Sheet and the Tasks board. */}\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n Assigned tasks ({myTasks.length})\n </div>\n {tasksQuery.loading && myTasks.length === 0 ? (\n <Skeleton style={{ height: 48 }} />\n ) : myTasks.length === 0 ? (\n <Card variant=\"outlined\">\n <CardBody>\n <span data-testid=\"agent-tasks-empty\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No tasks assigned to this agent.\n </span>\n </CardBody>\n </Card>\n ) : (\n <Stack gap={1}>\n {myTasks.map((t) => (\n <div\n key={t.id}\n data-testid={`agent-tasks-${t.id}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{t.id}</code>\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.title}\n </span>\n <Badge tone={t.status === 'doing' ? 'info' : t.status === 'blocked' ? 'danger' : 'neutral'}>\n {t.status ?? 'queued'}\n </Badge>\n </div>\n ))}\n </Stack>\n )}\n </Stack>\n {source === 'claude-code' && (\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Live output\n </div>\n <AgentLiveOutput sessionId={key} paused={busy === 'Kill'} />\n </Stack>\n )}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}\n\n/** formatDuration — human-readable \"3m 12s\" / \"1h 4m\" / \"2d 5h\". */\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n const sec = Math.floor(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ${sec % 60}s`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ${min % 60}m`;\n const day = Math.floor(hr / 24);\n return `${day}d ${hr % 24}h`;\n}","import { useCallback, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronRight, GitBranch, Network } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { BizarAgent } from '../../data/types.js';\n\n/**\n * AgentHierarchy — v9.4.0 S45.\n *\n * Reads `/api/agents/hierarchy` (returns `{ roots: Array<{ name, agent,\n * children }>, all: BizarAgent[] }` from `agents-store.mjs:230-251`).\n * Renders a collapsible tree where each node is a Bizar agent. Children\n * render indented beneath their parent. Live updates via `agents:change`\n * WS event triggers refetch.\n */\n\nexport interface HierarchyNode {\n name: string;\n agent: BizarAgent | null;\n children: HierarchyNode[];\n}\n\ninterface HierarchyResponse {\n roots?: HierarchyNode[];\n all?: BizarAgent[];\n}\n\nfunction statusToTone(status: string | undefined): 'neutral' | 'info' | 'success' | 'warning' | 'danger' {\n const s = (status || '').toLowerCase();\n if (s === 'busy' || s === 'working') return 'info';\n if (s === 'idle') return 'neutral';\n if (s === 'error' || s === 'stuck') return 'danger';\n if (s === 'paused') return 'warning';\n return 'neutral';\n}\n\nfunction statusLabel(status: string | undefined): string {\n const s = (status || '').toLowerCase();\n if (s === 'working') return 'working';\n if (!s) return 'idle';\n return s;\n}\n\nfunction relativeMs(ms: number | undefined | null): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\ninterface NodeRowProps {\n node: HierarchyNode;\n depth: number;\n expanded: Set<string>;\n onToggle: (name: string) => void;\n}\n\nfunction NodeRow({ node, depth, expanded, onToggle }: NodeRowProps): JSX.Element {\n const hasChildren = node.children.length > 0;\n const isOpen = expanded.has(node.name);\n const agent = node.agent;\n const tone = statusToTone(agent?.status);\n const status = statusLabel(agent?.status);\n return (\n <>\n <div\n data-testid={`agent-hierarchy-node-${node.name}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto auto',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-2) var(--space-3)',\n paddingLeft: `calc(var(--space-3) + ${depth * 24}px)`,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-1)',\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n data-testid={`agent-hierarchy-toggle-${node.name}`}\n aria-label={isOpen ? 'Collapse' : 'Expand'}\n onClick={() => onToggle(node.name)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {isOpen ? <ChevronDown size={12} aria-hidden /> : <ChevronRight size={12} aria-hidden />}\n </button>\n ) : (\n <span aria-hidden style={{ width: 22, height: 22, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: 'var(--fg-subtle)' }}>\n <GitBranch size={12} />\n </span>\n )}\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600, color: 'var(--fg)' }}>{node.name}</div>\n {agent && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {agent.role || agent.category || agent.mode || 'agent'}\n {agent.parent && agent.parent !== node.name && (\n <> · parent <code style={{ fontFamily: 'var(--font-mono)' }}>{agent.parent}</code></>\n )}\n </div>\n )}\n </div>\n {typeof agent?.lastSeen === 'number' && agent.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n {relativeMs(agent.lastSeen)}\n </span>\n )}\n <Badge tone={tone} dot>{status}</Badge>\n </div>\n {hasChildren && isOpen && node.children.map((child) => (\n <NodeRow key={child.name} node={child} depth={depth + 1} expanded={expanded} onToggle={onToggle} />\n ))}\n </>\n );\n}\n\nexport function AgentHierarchy(): JSX.Element {\n const data = useFetch<HierarchyResponse>('/api/agents/hierarchy');\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n // Track which root names we auto-expanded on first load so subsequent\n // user toggles of those roots are honored.\n const [autoRoots, setAutoRoots] = useState<Set<string>>(() => new Set());\n\n const seenRoots = useMemo(() => data.data?.roots?.map((n) => n.name) ?? [], [data.data]);\n\n // On first successful load, auto-expand every root and remember the set so\n // a future toggle of a root is a real state change (no longer masked by\n // the auto-expand).\n if (autoRoots.size === 0 && seenRoots.length > 0) {\n setAutoRoots(new Set(seenRoots));\n setExpanded(new Set(seenRoots));\n }\n\n const onAgentsChange = useCallback(() => data.refetch(), [data]);\n useWsMessage('agents:change', onAgentsChange);\n\n const toggle = useCallback((name: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }, []);\n\n if (data.loading && !data.data) {\n return (\n <Stack gap={3}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n );\n }\n\n const roots = data.data?.roots ?? [];\n if (roots.length === 0) {\n return (\n <Card>\n <CardBody>\n <EmptyState\n icon={<Network size={32} aria-hidden />}\n title=\"No hierarchy yet\"\n description=\"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.\"\n data-testid=\"agent-hierarchy-empty\"\n />\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {roots.length} root agent{roots.length === 1 ? '' : 's'} · {data.data?.all?.length ?? 0} total\n </span>\n </Inline>\n <Stack gap={2}>\n {roots.map((root) => (\n <NodeRow key={root.name} node={root} depth={0} expanded={expanded} onToggle={toggle} />\n ))}\n </Stack>\n </Stack>\n );\n}","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { AgentCard, type AgentCardProps, type AgentStatus } from '../../ui/agents/AgentCard.js';\nimport { AgentDetail } from '../../ui/agents/AgentDetail.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Banner } from '../../ui/feedback/Banner.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';\nimport { AlertTriangle, Bot, Cpu, Pause, Play, Plus, RotateCw } from 'lucide-react';\nimport { AgentHierarchy } from './AgentHierarchy.js';\n\nconst SOURCE_STORAGE_KEY = 'bizar.agents.sourceFilter';\nconst SOURCE_LABELS = {\n all: 'All',\n bizar: 'Bizar',\n 'claude-code': 'Claude Code',\n} as const;\ntype SourceFilter = keyof typeof SOURCE_LABELS;\nconst VALID_SOURCES = Object.keys(SOURCE_LABELS) as SourceFilter[];\n\nfunction readPersistedSource(): SourceFilter {\n if (typeof localStorage === 'undefined') return 'all';\n const v = localStorage.getItem(SOURCE_STORAGE_KEY);\n return VALID_SOURCES.includes(v as SourceFilter) ? (v as SourceFilter) : 'all';\n}\n\n/** relativeTimeMs — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing/future timestamps. */\nfunction relativeTimeMs(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\n/**\n * AgentsView — Sprint S10. Unified Bizar + Claude Code agents.\n *\n * Two REST calls (Bizar agents from `/api/agents`, CC from\n * `/api/cc-agents`) merged into a single grid. A `source` filter\n * chip switches between `bizar | claude-code | all`. Live updates\n * via `agents:change` and `agent:status` WS events.\n */\n\nfunction mapBizar(a: BizarAgent): AgentCardProps {\n const raw = (a.status || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' || raw === 'stuck' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `bizar:${a.name}`,\n name: a.name,\n role: a.role || a.category || a.mode || 'agent',\n status,\n currentTask: a.currentTaskId ? `Task ${a.currentTaskId}` : undefined,\n lastActivity: a.lastSeen ? new Date(a.lastSeen).toLocaleTimeString() : undefined,\n tasksToday: a.tasksTotal || 0,\n // v9.4.0 — pass real metrics for the new AgentCard strip. The old\n // `tpmHistory` field was dead because AgentCard only renders the\n // sparkline when `length > 1` and we always passed a single point.\n tasksSucceeded: typeof a.tasksSucceeded === 'number' ? a.tasksSucceeded : undefined,\n tasksTotal: typeof a.tasksTotal === 'number' ? a.tasksTotal : undefined,\n successRate: typeof a.successRate === 'number' ? a.successRate : undefined,\n lastSeenMs: typeof a.lastSeen === 'number' && a.lastSeen > 0 ? a.lastSeen : undefined,\n badges: a.tags || [],\n };\n}\n\nfunction mapCC(a: CCAgent): AgentCardProps {\n const raw = (a.status || a.state || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `cc:${a.sessionId || a.id}`,\n name: a.name || a.sessionId?.slice(0, 8) || 'unknown',\n role: a.kind === 'background' ? 'CC background' : 'CC interactive',\n status,\n currentTask: a.lastMessageSnippet || undefined,\n lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),\n tasksToday: a.messageCount || 0,\n // CC agents don't expose successRate/tasksSucceeded — only messageCount.\n // Skip the metric strip for them; the badge + lastActivity carry the\n // signal.\n badges: [a.cwd?.split('/').slice(-2).join('/') || ''].filter(Boolean),\n };\n}\n\nexport function AgentsView(): JSX.Element {\n const bizar = useFetch<{ agents?: BizarAgent[] }>('/api/agents');\n const cc = useFetch<{ agents?: CCAgent[]; error?: string }>('/api/cc-agents');\n const stuck = useFetch<{ stuck?: BizarAgent[] }>('/api/agents/stuck');\n const [source, setSource] = useState<SourceFilter>(readPersistedSource);\n const [mode, setMode] = useState<'roster' | 'hierarchy'>('roster');\n useEffect(() => {\n if (typeof localStorage !== 'undefined') localStorage.setItem(SOURCE_STORAGE_KEY, source);\n }, [source]);\n const [bizarList, setBizarList] = useState<BizarAgent[]>([]);\n const [ccList, setCCList] = useState<CCAgent[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openId, setOpenId] = useState<string | null>(null);\n const [createDraft, setCreateDraft] = useState<{ name: string; role: string } | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [restartingNames, setRestartingNames] = useState<Set<string>>(() => new Set());\n\n const saveCreate = async (): Promise<void> => {\n if (createDraft === null || !createDraft.name.trim()) return;\n setCreating(true);\n setCreateError(null);\n try {\n await fetchJson('/api/agents', { method: 'POST', body: { name: createDraft.name.trim(), role: createDraft.role.trim() || 'agent' } });\n setCreateDraft(null);\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n // v9.5.0 S48 — inline Restart from the stuck banner. One-click recovery\n // without forcing the user to drill into the per-agent Sheet. The\n // server broadcasts agents:change on success so the banner refreshes.\n const restartStuck = async (name: string): Promise<void> => {\n setRestartingNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/restart`, { method: 'POST' });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRestartingNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — inline Pause/Resume on the stuck banner. Pause stops\n // heartbeat drain (status='paused'); Resume re-enables\n // (status='idle' so Odin picks the agent up again on the next\n // spawn). Uses the same in-flight Set pattern as restartStuck so\n // all three actions disable each other per-row while pending.\n const [busyStuckNames, setBusyStuckNames] = useState<Set<string>>(() => new Set());\n const setStuckActionStatus = async (name: string, status: 'paused' | 'idle'): Promise<void> => {\n setBusyStuckNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/status`, {\n method: 'POST',\n body: { status },\n });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusyStuckNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — bulk Pause-all-stuck. Fires status='paused' for every\n // agent currently in /api/agents/stuck. Used when a wedged cluster\n // needs to be drained before restart. Per-row actions are still\n // available for selective triage.\n const [bulkBusy, setBulkBusy] = useState<boolean>(false);\n const bulkPauseStuck = async (): Promise<void> => {\n const list = stuck.data?.stuck ?? [];\n if (list.length === 0) return;\n setBulkBusy(true);\n try {\n await Promise.all(list.map((a) =>\n fetchJson(`/api/agents/${encodeURIComponent(a.name)}/status`, {\n method: 'POST',\n body: { status: 'paused' },\n }).catch((err) => {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n return null;\n }),\n ));\n stuck.refetch();\n bizar.refetch();\n } finally {\n setBulkBusy(false);\n }\n };\n\n useEffect(() => {\n if (!initialized && bizar.data?.agents !== undefined && cc.data?.agents !== undefined) {\n setInitialized(true);\n setBizarList(bizar.data.agents);\n setCCList(cc.data.agents);\n }\n }, [bizar.data, cc.data, initialized]);\n\n const onAgentsChange = useCallback(() => {\n // Bust both caches; the next mount will re-fetch (cheap because\n // the dashboard views are lazy-mounted).\n bizar.refetch();\n cc.refetch();\n }, [bizar, cc]);\n useWsMessage('agents:change', onAgentsChange);\n\n const onAgentStatus = useCallback((msg: WsMessage) => {\n if (msg.type !== 'agent:status') return;\n const a = (msg as Extract<WsMessage, { type: 'agent:status' }>).agent;\n if (!a || !a.name) return;\n setBizarList((prev) => {\n const idx = prev.findIndex((x) => x.name === a.name);\n if (idx === -1) return [...prev, a];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...a };\n return copy;\n });\n }, []);\n useWsMessage('agent:status', onAgentStatus);\n\n const cards = useMemo(() => {\n const out: Array<AgentCardProps & { source: 'bizar' | 'claude-code' }> = [];\n if (source !== 'claude-code') {\n for (const a of bizarList) out.push({ ...mapBizar(a), source: 'bizar' });\n }\n if (source !== 'bizar') {\n for (const a of ccList) out.push({ ...mapCC(a), source: 'claude-code' });\n }\n return out;\n }, [bizarList, ccList, source]);\n\n return (\n <Stack gap={5} data-testid=\"agents-view\">\n <ViewHeader\n title=\"Agents\"\n description=\"Bizar agents (frontmatter-driven) and Claude Code background agents.\"\n actions={\n <Button variant=\"primary\" onClick={() => setCreateDraft({ name: '', role: '' })} data-testid=\"agent-create-open\">\n <Plus size={14} aria-hidden /> New agent\n </Button>\n }\n />\n <ListHeader\n title=\"Roster\"\n count={cards.length}\n description={stuck.data?.stuck && stuck.data.stuck.length > 0 ? `${stuck.data.stuck.length} stuck` : undefined}\n testid=\"agents-list-header\"\n />\n {(stuck.data?.stuck ?? []).length > 0 && (\n <Banner\n tone=\"warning\"\n data-testid=\"agents-stuck-banner\"\n action={\n <Inline gap={2}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void bulkPauseStuck(); }}\n disabled={bulkBusy}\n data-testid=\"agents-stuck-bulk-pause\"\n title=\"Pause every stuck agent at once\"\n >\n <Pause size={12} aria-hidden /> {bulkBusy ? 'Pausing…' : 'Pause all'}\n </Button>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setMode('hierarchy')}>\n View details\n </Button>\n </Inline>\n }\n >\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <AlertTriangle size={14} aria-hidden style={{ color: 'var(--warning)' }} />\n <span>\n {(stuck.data?.stuck ?? []).length} agent{stuck.data && stuck.data.stuck && stuck.data.stuck.length === 1 ? '' : 's'} stuck (no heartbeat >5m)\n </span>\n </Inline>\n <Stack gap={1}>\n {(stuck.data?.stuck ?? []).map((s) => {\n const restarting = restartingNames.has(s.name);\n const paused = s.status === 'paused';\n const busy = restarting || busyStuckNames.has(s.name);\n return (\n <Inline key={s.name} align=\"center\" justify=\"between\" gap={2} data-testid={`agents-stuck-row-${s.name}`}>\n <Inline gap={2} align=\"center\">\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{s.name}</code>\n <Badge tone={paused ? 'warning' : 'danger'}>{paused ? 'paused' : (s.status || 'stuck')}</Badge>\n {typeof s.lastSeen === 'number' && s.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n last seen {relativeTimeMs(s.lastSeen)}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {paused ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'idle'); }}\n data-testid={`agents-stuck-resume-${s.name}`}\n >\n <Play size={12} aria-hidden /> Resume\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'paused'); }}\n data-testid={`agents-stuck-pause-${s.name}`}\n >\n <Pause size={12} aria-hidden /> Pause\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void restartStuck(s.name); }}\n data-testid={`agents-stuck-restart-${s.name}`}\n >\n <RotateCw size={12} aria-hidden /> {restarting ? 'Restarting…' : 'Restart'}\n </Button>\n </Inline>\n </Inline>\n );\n })}\n </Stack>\n </Stack>\n </Banner>\n )}\n <Inline align=\"center\" justify=\"between\" wrap gap={2}>\n <Inline gap={2}>\n {(['all', 'bizar', 'claude-code'] as SourceFilter[]).map((id) => (\n <Chip\n key={id}\n selected={source === id}\n onClick={() => setSource(id)}\n >\n {id === 'bizar' ? <Bot size={12} aria-hidden /> : id === 'claude-code' ? <Cpu size={12} aria-hidden /> : null}{' '}\n {SOURCE_LABELS[id]}\n </Chip>\n ))}\n </Inline>\n <Inline gap={2}>\n <Chip\n data-testid=\"agents-mode-roster\"\n selected={mode === 'roster'}\n onClick={() => setMode('roster')}\n >\n Roster\n </Chip>\n <Chip\n data-testid=\"agents-mode-hierarchy\"\n selected={mode === 'hierarchy'}\n onClick={() => setMode('hierarchy')}\n >\n Hierarchy\n </Chip>\n </Inline>\n </Inline>\n {mode === 'hierarchy' ? (\n <AgentHierarchy />\n ) : cards.length === 0 && (bizar.loading || cc.loading) ? (\n <Grid cols={3}>\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n </Grid>\n ) : cards.length === 0 && (bizar.error || cc.error) ? (\n <ErrorState\n block\n title=\"Couldn't load agents\"\n description=\"Both bizar and CC roster endpoints failed. Retry to refetch.\"\n error={bizar.error ?? cc.error}\n onRetry={() => { void bizar.refetch(); void cc.refetch(); }}\n testid=\"agents-error\"\n />\n ) : cards.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)' }}>\n No agents yet. Run <code>/loop</code> or spawn one via the command palette.\n </span>\n ) : (\n <Grid cols={3}>\n {cards.map((c) => (\n <AgentCard key={c.id} {...c} onOpen={() => setOpenId(c.id)} />\n ))}\n </Grid>\n )}\n\n {openId !== null && (() => {\n const sel = cards.find((c) => c.id === openId);\n if (!sel) return null;\n const ccSource = sel.source === 'claude-code' ? ccList.find((a) => sel.id === `cc:${a.sessionId || a.id}`) : undefined;\n const bzSource = sel.source === 'bizar' ? bizarList.find((a) => sel.id === `bizar:${a.name}`) : undefined;\n return (\n <AgentDetail\n agentId={sel.id}\n name={sel.name}\n role={sel.role}\n status={sel.status}\n currentTask={sel.currentTask}\n startedAt={ccSource?.startedAt ?? bzSource?.lastSeen}\n messageCount={ccSource?.messageCount}\n lastMessageSnippet={ccSource?.lastMessageSnippet}\n successRate={bzSource?.successRate}\n tasksTotal={bzSource?.tasksTotal}\n open={openId !== null}\n onOpenChange={(o) => { if (!o) setOpenId(null); }}\n />\n );\n })()}\n\n {/* v9.2.0 — create-agent Sheet. Closes the audit-flagged \"no way\n to add a new agent\" HIGH gap. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New agent\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-name\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</label>\n <Input\n id=\"agent-create-name\"\n value={createDraft.name}\n onChange={(e) => setCreateDraft({ ...createDraft, name: e.target.value })}\n placeholder=\"e.g. frigg\"\n disabled={creating}\n data-testid=\"agent-create-name\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-role\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Role (optional)</label>\n <Input\n id=\"agent-create-role\"\n value={createDraft.role}\n onChange={(e) => setCreateDraft({ ...createDraft, role: e.target.value })}\n placeholder=\"e.g. code-review\"\n disabled={creating}\n data-testid=\"agent-create-role\"\n />\n </Stack>\n {createError !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{createError}</span>}\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => { void saveCreate(); }} disabled={creating || !createDraft.name.trim()} data-testid=\"agent-create-submit\">\n Create agent\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["ClipboardCopy","createLucideIcon","Octagon","STATUS_LABEL","STATUS_TONE","STATUS_FG","relativeTime","ms","delta","sec","min","hr","successTone","rate","lastSeenTone","AgentCard","props","name","role","status","lastActivity","currentTask","tasksToday","tasksSucceeded","tasksTotal","successRate","lastSeenMs","onOpen","badges","className","showMetrics","jsxs","cx","jsx","Avatar","Badge","Activity","Zap","ProgressBar","MAX_EVENTS","AgentLiveOutput","sessionId","paused","events","setEvents","useState","setStatus","error","setError","pausedLocal","setPausedLocal","autoScroll","setAutoScroll","containerRef","useRef","sourceRef","useEffect","url","src","onSnapshot","ev","data","onEvent","prev","next","onEnd","onErrEv","el","renderEvent","idx","tone","_a","label","_b","text","_c","Stack","Inline","Button","p","Play","Pause","RefreshCw","e","atBottom","parseId","agentId","AgentDetail","open","onOpenChange","startedAt","messageCount","lastMessageSnippet","source","key","prompt","setPrompt","busy","setBusy","message","setMessage","lastProcessId","setLastProcessId","tasksQuery","useFetch","myTasks","useMemo","t","md","runAction","method","endpoint","body","res","fetchJson","sessionExtra","err","sendPrompt","trimmed","restart","seed","kill","copyId","Sheet","SheetContent","formatDuration","ActivityIcon","Textarea","Send","Skeleton","RotateCw","Card","CardBody","statusToTone","s","statusLabel","relativeMs","NodeRow","node","depth","expanded","onToggle","hasChildren","isOpen","agent","Fragment","ChevronDown","ChevronRight","GitBranch","child","AgentHierarchy","setExpanded","autoRoots","setAutoRoots","seenRoots","n","onAgentsChange","useCallback","useWsMessage","toggle","roots","EmptyState","Network","root","SOURCE_STORAGE_KEY","SOURCE_LABELS","VALID_SOURCES","readPersistedSource","v","relativeTimeMs","mapBizar","a","raw","mapCC","AgentsView","bizar","cc","stuck","setSource","mode","setMode","bizarList","setBizarList","ccList","setCCList","initialized","setInitialized","openId","setOpenId","createDraft","setCreateDraft","creating","setCreating","createError","setCreateError","restartingNames","setRestartingNames","saveCreate","FetchError","restartStuck","busyStuckNames","setBusyStuckNames","setStuckActionStatus","bulkBusy","setBulkBusy","bulkPauseStuck","list","onAgentStatus","msg","x","copy","cards","out","ViewHeader","Plus","ListHeader","Banner","AlertTriangle","_d","restarting","id","Chip","Bot","Cpu","Grid","ErrorState","c","sel","ccSource","bzSource","o","Input"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as v,R as x,j as e}from"./cmdk-DVxytz9i.js";import{c as g,g as m}from"./main-CdOm1Pj9.js";import{C as u}from"./circle-alert-BsLl001l.js";import{T as h}from"./triangle-alert-BPLb7uLt.js";import{C as p}from"./circle-check-rVKMQmZp.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const k=g("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]),y={info:k,success:p,warning:h,danger:u},w={info:"color-mix(in oklch, var(--info) 12%, var(--surface-1))",success:"color-mix(in oklch, var(--success) 12%, var(--surface-1))",warning:"color-mix(in oklch, var(--warning) 12%, var(--surface-1))",danger:"color-mix(in oklch, var(--danger) 12%, var(--surface-1))"},b={info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},j={info:"color-mix(in oklch, var(--info) 30%, var(--border))",success:"color-mix(in oklch, var(--success) 30%, var(--border))",warning:"color-mix(in oklch, var(--warning) 30%, var(--border))",danger:"color-mix(in oklch, var(--danger) 30%, var(--border))"},A=v.forwardRef(function(c,l){const{tone:r="info",title:o,children:n,action:i,icon:a,className:t,...d}=c,f=a!==!1,s=a===!1?null:a??x.createElement(y[r],{size:16,"aria-hidden":!0});return e.jsxs("div",{ref:l,role:r==="danger"||r==="warning"?"alert":"status",className:m("v8-alert",`v8-alert--${r}`,t),style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3) var(--space-4)",background:w[r],border:"1px solid",borderColor:j[r],borderRadius:"var(--radius)",color:"var(--fg)"},...d,children:[f&&s!==null&&e.jsx("span",{style:{color:b[r],flexShrink:0,marginTop:1,display:"inline-flex"},children:s}),e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[o!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:o}),n!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:n})]}),i!==void 0&&e.jsx("div",{style:{flexShrink:0,display:"flex",alignItems:"center"},children:i})]})});export{A};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Alert-DN0UysMg.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/info.js","../../src/web/v8/ui/feedback/Alert.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport React from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Alert — inline contextual message.\n *\n * Tones: info | success | warning | danger.\n *\n * Use cases: empty states, inline help text, error banners inside forms.\n * For status pulses (topbar live indicator) use a small dot, not an Alert.\n */\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nconst ICON = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n} as const;\n\nconst TONE_BG = {\n info: 'color-mix(in oklch, var(--info) 12%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 12%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 12%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 12%, var(--surface-1))',\n} as const;\n\nconst TONE_FG = {\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n} as const;\n\nconst TONE_BORDER = {\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n} as const;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n /** Optional right-aligned action (button). */\n action?: ReactNode;\n /** Override the leading icon. Pass `false` to hide. */\n icon?: ReactNode | false;\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(props, ref) {\n const { tone = 'info', title, children, action, icon, className, ...rest } = props;\n const showIcon = icon !== false;\n const IconNode = icon === false ? null : (icon ?? React.createElement(ICON[tone], { size: 16, 'aria-hidden': true }));\n return (\n <div\n ref={ref}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n className={cx('v8-alert', `v8-alert--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: TONE_BG[tone],\n border: '1px solid',\n borderColor: TONE_BORDER[tone],\n borderRadius: 'var(--radius)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n {showIcon && IconNode !== null && (\n <span style={{ color: TONE_FG[tone], flexShrink: 0, marginTop: 1, display: 'inline-flex' }}>\n {IconNode}\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n {title !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{title}</div>\n )}\n {children !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{children}</div>\n )}\n </div>\n {action !== undefined && (\n <div style={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>{action}</div>\n )}\n </div>\n );\n});"],"names":["Info","createLucideIcon","ICON","CheckCircle2","AlertTriangle","AlertCircle","TONE_BG","TONE_FG","TONE_BORDER","Alert","forwardRef","props","ref","tone","title","children","action","icon","className","rest","showIcon","IconNode","React","jsxs","cx","jsx"],"mappings":"kPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,CAAC,ECGKC,EAAO,CACX,KAAMF,EACN,QAASG,EACT,QAASC,EACT,OAAQC,CACV,EAEMC,EAAU,CACd,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,0DACV,EAEMC,EAAU,CACd,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEMC,EAAc,CAClB,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,uDACV,EAYaC,EAAQC,EAAAA,WAAuC,SAAeC,EAAOC,EAAK,CACrF,KAAM,CAAE,KAAAC,EAAO,OAAQ,MAAAC,EAAO,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,EAAM,UAAAC,EAAW,GAAGC,CAAA,EAASR,EACvES,EAAWH,IAAS,GACpBI,EAAWJ,IAAS,GAAQ,KAAQA,GAAQK,EAAM,cAAcpB,EAAKW,CAAI,EAAG,CAAE,KAAM,GAAI,cAAe,GAAM,EACnH,OACEU,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,KAAMC,IAAS,UAAYA,IAAS,UAAY,QAAU,SAC1D,UAAWW,EAAG,WAAY,aAAaX,CAAI,GAAIK,CAAS,EACxD,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,gCACT,WAAYZ,EAAQO,CAAI,EACxB,OAAQ,YACR,YAAaL,EAAYK,CAAI,EAC7B,aAAc,gBACd,MAAO,WAAA,EAER,GAAGM,EAEH,SAAA,CAAAC,GAAYC,IAAa,MACxBI,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOlB,EAAQM,CAAI,EAAG,WAAY,EAAG,UAAW,EAAG,QAAS,aAAA,EACxE,SAAAQ,EACH,EAEFE,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,EAAG,QAAS,OAAQ,cAAe,SAAU,IAAK,kBAChF,SAAA,CAAAT,IAAU,QACTW,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EAEnEC,IAAa,QACZU,MAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAV,CAAA,CAAS,CAAA,EAElF,EACCC,IAAW,QACVS,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,WAAY,EAAG,QAAS,OAAQ,WAAY,QAAA,EAAa,SAAAT,CAAA,CAAO,CAAA,CAAA,CAAA,CAItF,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as i,j as t}from"./cmdk-DVxytz9i.js";import{c as $,u as S,S as f,I as g,d,h as C,L as E,i as b,F as D}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as A,b as M}from"./Card-Tyboihu7.js";import{I as y}from"./Input-BbFUDQnS.js";import{T}from"./Textarea-qYDf3yds.js";import{S as k,a as z}from"./Sheet-DH-WNJ3Y.js";import{E as F}from"./EmptyState-DZ2ouKwd.js";import{R}from"./refresh-ccw-CHMprsm5.js";import{P as O}from"./plus-M6LYiKX8.js";import{E as P}from"./external-link-DA3_VGm-.js";import{T as I}from"./trash-2-CL4khSRv.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const L=$("FileCode",[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]]);function _(){const r=S("/api/artifacts"),[a,n]=i.useState(null),[j,o]=i.useState(!1),[c,u]=i.useState(null),[m,h]=i.useState(null),x=i.useMemo(()=>{var e;return((e=r.data)==null?void 0:e.artifacts)??[]},[r.data]),p=i.useCallback(()=>{r.refetch()},[r]),v=async e=>{h(null);try{await b(`/api/artifacts/${e}`,{method:"DELETE"}),n(null),c===e&&u(null),p()}catch(l){h((l instanceof D,l.message))}};return t.jsxs(f,{gap:4,"data-testid":"artifacts-view",children:[t.jsx(w,{title:"Artifacts",description:"Generated artifacts (plans, diagrams, canvases).",actions:t.jsxs(g,{align:"center",gap:2,children:[m!==null&&t.jsx("span",{role:"alert","data-testid":"artifacts-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),t.jsxs(d,{variant:"ghost",onClick:()=>void p(),"data-testid":"artifacts-refresh",children:[t.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"artifacts-add",children:[t.jsx(O,{size:14,"aria-hidden":!0})," Add"]})]})}),t.jsx(A,{variant:"default",children:t.jsx(M,{children:r.loading&&x.length===0?t.jsxs(f,{gap:1,children:[t.jsx(C,{style:{height:48}}),t.jsx(C,{style:{height:48}})]}):x.length===0?t.jsx(F,{icon:t.jsx(E,{size:28,"aria-hidden":!0}),title:"No artifacts",description:"Create one to get started."}):t.jsx(f,{gap:1,children:x.map(e=>{const l=a===e.slug;return t.jsxs("div",{"data-testid":`artifact-row-${e.slug}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[t.jsxs(g,{align:"center",justify:"between",gap:2,children:[t.jsxs(f,{gap:0,style:{minWidth:0,flex:1},children:[t.jsxs(g,{align:"center",gap:2,children:[t.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.slug}),t.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.slug}),e.kind&&t.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",e.kind]})]}),e.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.description})]}),t.jsxs(g,{gap:1,children:[t.jsxs(d,{variant:"ghost",onClick:()=>u(s=>s===e.slug?null:e.slug),"data-testid":`artifact-open-${e.slug}`,"aria-label":`Open ${e.slug}`,children:[t.jsx(P,{size:14,"aria-hidden":!0})," Open"]}),t.jsx(d,{variant:"ghost",onClick:()=>n(s=>s===e.slug?null:e.slug),"data-testid":`artifact-delete-${e.slug}`,"aria-label":`Delete ${e.slug}`,children:t.jsx(I,{size:14,"aria-hidden":!0})})]})]}),l&&t.jsxs(g,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(d,{variant:"danger",onClick:()=>void v(e.slug),"data-testid":`artifact-confirm-delete-${e.slug}`,children:"Confirm delete"}),t.jsx(d,{variant:"ghost",onClick:()=>n(null),children:"Cancel"})]})]},e.slug)})})})}),t.jsx(k,{open:j,onOpenChange:o,children:t.jsx(z,{side:"right",title:"Add artifact",description:"Slug + title + initial MDX.",children:t.jsx(V,{onSubmit:async e=>{await b("/api/artifacts",{method:"POST",body:e}),o(!1),p()},onCancel:()=>o(!1)})})}),t.jsx(k,{open:c!==null,onOpenChange:e=>{e||u(null)},children:t.jsx(z,{side:"right",title:c??"",description:"Artifact detail",children:c!==null&&t.jsx(B,{slug:c})})})]})}function V({onSubmit:r,onCancel:a}){const[n,j]=i.useState(""),[o,c]=i.useState(""),[u,m]=i.useState(""),[h,x]=i.useState(""),[p,v]=i.useState(!1),[e,l]=i.useState(null);return t.jsxs(f,{gap:3,style:{padding:"var(--space-4)"},children:[t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Slug"}),t.jsx(y,{value:n,onChange:s=>j(s.target.value),"data-testid":"artifact-form-slug"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),t.jsx(y,{value:o,onChange:s=>c(s.target.value),"data-testid":"artifact-form-title"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),t.jsx(y,{value:u,onChange:s=>m(s.target.value),"data-testid":"artifact-form-description"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Plan MDX"}),t.jsx(T,{value:h,rows:6,onChange:s=>x(s.target.value),"data-testid":"artifact-form-mdx"})]}),e!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:e}),t.jsxs(g,{justify:"end",gap:2,children:[t.jsx(d,{variant:"ghost",onClick:a,children:"Cancel"}),t.jsx(d,{variant:"primary",disabled:p||!n.trim(),"data-testid":"artifact-form-submit",onClick:async()=>{v(!0),l(null);try{await r({slug:n.trim(),title:o.trim()||void 0,description:u.trim()||void 0,planMdx:h||void 0})}catch(s){l((s instanceof D,s.message)),v(!1)}},children:p?"Creating…":"Create"})]})]})}function B({slug:r}){const a=S(`/api/artifacts/${r}`),n=S(`/api/artifacts/${r}/render`);return t.jsx(f,{gap:2,style:{padding:"var(--space-4)"},children:a.loading&&!a.data?t.jsx(C,{style:{height:80}}):a.data?t.jsxs(f,{gap:2,children:[t.jsx("strong",{children:a.data.title||a.data.slug}),a.data.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.data.description}),a.data.frontmatter&&t.jsx("div",{"data-testid":`artifact-frontmatter-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:t.jsx("pre",{style:{margin:0,fontSize:"var(--fs-11)",fontFamily:"var(--font-mono)"},children:JSON.stringify(a.data.frontmatter,null,2)})}),a.data.planMdx&&t.jsx("pre",{"data-testid":`artifact-mdx-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-11)",maxHeight:240,overflow:"auto",fontFamily:"var(--font-mono)"},children:a.data.planMdx}),n.data&&t.jsxs("span",{"data-testid":`artifact-render-${r}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Render: ",Array.isArray(n.data.blocks)?`${n.data.blocks.length} blocks`:"no blocks"]})]}):t.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"Not found"})})}export{_ as ArtifactsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactsView-CDIhPBAx.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ArtifactsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0.\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, ...}).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: string;\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Create one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + title + initial MDX.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; planMdx?: string; frontmatter?: Record<string, unknown> }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [planMdx, setPlanMdx] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Plan MDX</span>\n <Textarea value={planMdx} rows={6} onChange={(e) => setPlanMdx((e.target as HTMLTextAreaElement).value)} data-testid=\"artifact-form-mdx\" />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n await onSubmit({ slug: slug.trim(), title: title.trim() || undefined, description: description.trim() || undefined, planMdx: planMdx || undefined });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction ArtifactDetail({ slug }: { slug: string }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<{ blocks?: unknown[]; frontmatter?: Record<string, unknown> }>(`/api/artifacts/${slug}/render`);\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n {payload.data.frontmatter && (\n <div data-testid={`artifact-frontmatter-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <pre style={{ margin: 0, fontSize: 'var(--fs-11)', fontFamily: 'var(--font-mono)' }}>{JSON.stringify(payload.data.frontmatter, null, 2)}</pre>\n </div>\n )}\n {payload.data.planMdx && (\n <pre data-testid={`artifact-mdx-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', fontSize: 'var(--fs-11)', maxHeight: 240, overflow: 'auto', fontFamily: 'var(--font-mono)' }}>{payload.data.planMdx}</pre>\n )}\n {renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ArtifactsView","payload","useFetch","confirmDelete","setConfirmDelete","useState","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","slug","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","Layers","a","isConfirming","cur","ExternalLink","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","planMdx","setPlanMdx","busy","setBusy","Input","e","Textarea","renderPayload"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{r as s,j as e}from"./cmdk-DVxytz9i.js";import{c as x,i as h,F as u,S as o,h as T,I as l,B as f,G as F,d as r}from"./main-CdOm1Pj9.js";import{V as O}from"./ViewHeader-BqIPVKuG.js";import{C as b,b as z}from"./Card-Tyboihu7.js";import{I as V}from"./Input-BbFUDQnS.js";import{S as A}from"./shield-alert-CWV2F5ab.js";import{R as L}from"./rotate-cw-DHooc0Tx.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const D=x("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/**
|
|
7
|
+
* @license lucide-react v0.460.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const G=x("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/**
|
|
12
|
+
* @license lucide-react v0.460.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const E=x("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);function W(){const[a,R]=s.useState(null),[d,y]=s.useState(null),[n,g]=s.useState(null),[p,j]=s.useState(!1),[m,v]=s.useState(!1),[B,c]=s.useState(!1),[k,S]=s.useState(!1),[C,i]=s.useState(null),w=s.useCallback(async()=>{y(null);try{const t=await h("/api/auth/status");R(t)}catch(t){y((t instanceof u,t.message))}},[]);s.useEffect(()=>{w()},[w]);const q=async()=>{j(!0),i(null);try{const t=await h("/api/auth/reveal");g(t.token)}catch(t){i((t instanceof u,t.message))}finally{j(!1)}},I=async()=>{S(!0),i(null);try{const t=await h("/api/auth/regenerate",{method:"POST",body:{}});g(t.token),v(!0),c(!1)}catch(t){i((t instanceof u,t.message))}finally{S(!1)}},M=async()=>{if(n)try{await navigator.clipboard.writeText(n)}catch{}};return e.jsxs(o,{gap:4,"data-testid":"auth-view",children:[e.jsx(O,{title:"Auth",description:"Dashboard auth status + bearer token management."}),e.jsx(b,{variant:"default",children:e.jsx(z,{children:e.jsxs(o,{gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Status"}),a===null&&d===null?e.jsx(T,{style:{height:24,width:240}}):d!==null?e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:d}):e.jsxs(l,{gap:2,wrap:!0,children:[a!=null&&a.required?e.jsxs(f,{tone:"warning","data-testid":"auth-required",children:[e.jsx(A,{size:12,"aria-hidden":!0})," Required"]}):e.jsxs(f,{tone:"success","data-testid":"auth-required",children:[e.jsx(F,{size:12,"aria-hidden":!0})," Not required"]}),(a==null?void 0:a.loopback)&&e.jsx(f,{tone:"info",children:"Loopback"}),(a==null?void 0:a.peer)&&e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.peer})]})]})})}),e.jsx(b,{variant:"default",children:e.jsx(z,{children:e.jsxs(o,{gap:3,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Bearer token"}),n===null?e.jsx(l,{gap:2,children:e.jsxs(r,{variant:"ghost",onClick:()=>void q(),disabled:p,"data-testid":"auth-reveal",children:[e.jsx(E,{size:14,"aria-hidden":!0})," ",p?"Loading…":"Reveal"]})}):e.jsxs(o,{gap:2,children:[e.jsxs(l,{gap:2,children:[e.jsx(V,{readOnly:!0,value:m?n:"••••••••••••••••••••••","data-testid":"auth-token-input",onFocus:t=>t.target.select()}),e.jsx(r,{variant:"ghost",onClick:()=>v(t=>!t),"data-testid":"auth-toggle-visibility",children:m?e.jsx(G,{size:14,"aria-hidden":!0}):e.jsx(E,{size:14,"aria-hidden":!0})}),e.jsxs(r,{variant:"ghost",onClick:()=>void M(),"data-testid":"auth-copy",children:[e.jsx(D,{size:14,"aria-hidden":!0})," Copy"]})]}),B?e.jsxs(l,{gap:1,children:[e.jsx(r,{variant:"danger",onClick:()=>void I(),disabled:k,"data-testid":"auth-confirm-regen",children:"Confirm rotate"}),e.jsx(r,{variant:"ghost",onClick:()=>c(!1),disabled:k,"data-testid":"auth-cancel-regen",children:"Cancel"})]}):e.jsxs(r,{variant:"danger",onClick:()=>c(!0),"data-testid":"auth-regen",children:[e.jsx(L,{size:14,"aria-hidden":!0})," Rotate token"]})]}),C!==null&&e.jsx("span",{role:"alert","data-testid":"auth-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:C})]})})})]})}export{W as AuthView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthView-DW5cs7ma.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/lucide-react/dist/esm/icons/eye.js","../../src/web/v8/views/Auth/AuthView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * v8/views/Auth/AuthView.tsx — Sprint S40, v9.3.0.\n *\n * Auth status + token-reveal + regenerate surface. Reads the\n * unauthed /api/auth/status on mount, then on user request hits\n * the authed /api/auth/reveal to show the current token, and\n * /api/auth/regenerate (with inline confirm) to mint a new one.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { Copy, Eye, EyeOff, RotateCw, ShieldCheck, ShieldAlert } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AuthStatus {\n required: boolean;\n loopback: boolean;\n peer?: string;\n}\n\nexport function AuthView(): JSX.Element {\n const [status, setStatus] = useState<AuthStatus | null>(null);\n const [statusError, setStatusError] = useState<string | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [revealing, setRevealing] = useState<boolean>(false);\n const [showToken, setShowToken] = useState<boolean>(false);\n const [confirmRegen, setConfirmRegen] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadStatus = useCallback(async () => {\n setStatusError(null);\n try {\n const res = await fetchJson<AuthStatus>('/api/auth/status');\n setStatus(res);\n } catch (err) {\n setStatusError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n }, []);\n\n useEffect(() => { void loadStatus(); }, [loadStatus]);\n\n const reveal = async (): Promise<void> => {\n setRevealing(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/reveal');\n setToken(res.token);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRevealing(false);\n }\n };\n\n const regenerate = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/regenerate', { method: 'POST', body: {} });\n setToken(res.token);\n setShowToken(true);\n setConfirmRegen(false);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async (): Promise<void> => {\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n } catch { /* clipboard might be blocked; the token is still on-screen */ }\n };\n\n return (\n <Stack gap={4} data-testid=\"auth-view\">\n <ViewHeader\n title=\"Auth\"\n description=\"Dashboard auth status + bearer token management.\"\n />\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n {status === null && statusError === null ? (\n <Skeleton style={{ height: 24, width: 240 }} />\n ) : statusError !== null ? (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{statusError}</span>\n ) : (\n <Inline gap={2} wrap>\n {status?.required ? (\n <Badge tone=\"warning\" data-testid=\"auth-required\">\n <ShieldAlert size={12} aria-hidden /> Required\n </Badge>\n ) : (\n <Badge tone=\"success\" data-testid=\"auth-required\">\n <ShieldCheck size={12} aria-hidden /> Not required\n </Badge>\n )}\n {status?.loopback && <Badge tone=\"info\">Loopback</Badge>}\n {status?.peer && (\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status.peer}\n </span>\n )}\n </Inline>\n )}\n </Stack>\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={3}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Bearer token</strong>\n {token === null ? (\n <Inline gap={2}>\n <Button variant=\"ghost\" onClick={() => void reveal()} disabled={revealing} data-testid=\"auth-reveal\">\n <Eye size={14} aria-hidden /> {revealing ? 'Loading…' : 'Reveal'}\n </Button>\n </Inline>\n ) : (\n <Stack gap={2}>\n <Inline gap={2}>\n <Input\n readOnly\n value={showToken ? token : '••••••••••••••••••••••'}\n data-testid=\"auth-token-input\"\n onFocus={(e) => (e.target as HTMLInputElement).select()}\n />\n <Button variant=\"ghost\" onClick={() => setShowToken((s) => !s)} data-testid=\"auth-toggle-visibility\">\n {showToken ? <EyeOff size={14} aria-hidden /> : <Eye size={14} aria-hidden />}\n </Button>\n <Button variant=\"ghost\" onClick={() => void copy()} data-testid=\"auth-copy\">\n <Copy size={14} aria-hidden /> Copy\n </Button>\n </Inline>\n {confirmRegen ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void regenerate()} disabled={busy} data-testid=\"auth-confirm-regen\">\n Confirm rotate\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmRegen(false)} disabled={busy} data-testid=\"auth-cancel-regen\">\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button variant=\"danger\" onClick={() => setConfirmRegen(true)} data-testid=\"auth-regen\">\n <RotateCw size={14} aria-hidden /> Rotate token\n </Button>\n )}\n </Stack>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid=\"auth-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Copy","createLucideIcon","EyeOff","Eye","AuthView","status","setStatus","useState","statusError","setStatusError","token","setToken","revealing","setRevealing","showToken","setShowToken","confirmRegen","setConfirmRegen","busy","setBusy","error","setError","loadStatus","useCallback","res","fetchJson","err","FetchError","useEffect","reveal","regenerate","copy","jsxs","Stack","jsx","ViewHeader","Card","CardBody","Skeleton","Inline","Badge","ShieldAlert","ShieldCheck","Button","Input","e","s","RotateCw"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as y,g as d}from"./main-CdOm1Pj9.js";import{r as f,j as t}from"./cmdk-DVxytz9i.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const R=y("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),I=f.forwardRef(function(r,a){const{tone:e="info",children:s,action:i,className:o,...l}=r;return t.jsxs("div",{ref:a,role:e==="danger"?"alert":"status",className:d("v8-banner",`v8-banner--${e}`,o),style:{display:"flex",alignItems:"center",gap:"var(--space-3)",padding:"var(--space-3) var(--space-4)",background:`color-mix(in oklch, var(--${e}) 8%, var(--surface-1))`,borderBottom:"1px solid var(--border)",fontSize:"var(--fs-13)",color:"var(--fg)"},...l,children:[t.jsx("div",{style:{flex:1,minWidth:0},children:s}),i!==void 0&&t.jsx("div",{style:{flexShrink:0},children:i})]})}),v={xs:20,sm:24,md:32,lg:40,xl:56},b={xs:"var(--fs-12)",sm:"var(--fs-12)",md:"var(--fs-13)",lg:"var(--fs-14)",xl:"var(--fs-18)"},k={online:"var(--success)",offline:"var(--fg-subtle)",busy:"var(--danger)",away:"var(--warning)"};function j(n){var s,i;const r=n.trim().split(/\s+/);if(r.length===0||r[0]===void 0)return"?";if(r.length===1)return(r[0]??"").slice(0,2).toUpperCase();const a=((s=r[0])==null?void 0:s[0])??"",e=((i=r[r.length-1])==null?void 0:i[0])??"";return`${a}${e}`.toUpperCase()}function S(n){let r=0;for(let a=0;a<n.length;a++)r=r*31+n.charCodeAt(a)|0;return Math.abs(r)}const h=["oklch(0.65 0.15 240)","oklch(0.65 0.15 30)","oklch(0.65 0.15 140)","oklch(0.65 0.15 320)","oklch(0.65 0.15 80)","oklch(0.65 0.15 200)"],M=f.forwardRef(function(r,a){const{name:e,src:s,size:i="md",initials:o,status:l,className:u,style:x,...p}=r,c=v[i],m=o??j(e),g=h[S(e)%h.length];return t.jsxs("span",{ref:a,className:d("v8-avatar",`v8-avatar--${i}`,u),style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:c,height:c,borderRadius:"var(--radius-pill)",overflow:"hidden",background:g,color:"white",fontSize:b[i],fontWeight:600,flexShrink:0,userSelect:"none",...x},"aria-label":e,...p,children:[s!==void 0?t.jsx("img",{src:s,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):m,l!==void 0&&t.jsx("span",{"aria-hidden":"true",style:{position:"absolute",bottom:0,right:0,width:Math.max(6,Math.floor(c*.28)),height:Math.max(6,Math.floor(c*.28)),borderRadius:"var(--radius-pill)",background:k[l],border:"2px solid var(--surface-0)"}})]})});f.forwardRef(function(r,a){const{children:e,size:s="sm",className:i,style:o,...l}=r;return t.jsx("div",{ref:a,className:d("v8-avatar-stack",i),style:{display:"inline-flex",alignItems:"center",...o},...l,children:t.jsx(w,{size:s,children:e})})});function w({children:n,size:r}){const a=v[r];return t.jsx(t.Fragment,{children:Array.isArray(n)?n.map((e,s)=>t.jsx("span",{style:{marginLeft:s===0?0:-Math.floor(a*.3),border:"2px solid var(--surface-0)",borderRadius:"var(--radius-pill)",display:"inline-flex"},children:e},s)):t.jsx("span",{style:{border:"2px solid var(--surface-0)",borderRadius:"var(--radius-pill)"},children:n})})}export{M as A,I as B,R as G};
|