@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 @@
|
|
|
1
|
+
import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{S as p,u as j,I as c,f as y,h as g,N as S,d as f,E as b,b as z,a1 as k,i as C,F as T}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as x,b as v}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{R as P}from"./refresh-ccw-CHMprsm5.js";import{P as E}from"./power-DP5x_SRF.js";import{P as F}from"./power-off-NOJRLAIs.js";import{F as R}from"./file-text-B-g8H227.js";function Q(){return e.jsxs(p,{gap:4,"data-testid":"misc-view",children:[e.jsx(w,{title:"Misc",description:"Global search + Tailscale."}),e.jsx(B,{}),e.jsx(N,{})]})}function B(){var i,l,n;const[a,t]=d.useState(""),r=j(`/api/search?q=${encodeURIComponent(a)}`);return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Search"}),e.jsxs(c,{gap:2,align:"center",style:{marginTop:"var(--space-2)"},children:[e.jsx(y,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:a,onChange:s=>t(s.target.value),placeholder:"Search projects / tasks / artifacts / agents…","data-testid":"misc-search-input"})]}),a.trim()===""?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Type a query to search."}):r.loading&&!r.data?e.jsxs(p,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:24}}),e.jsx(g,{style:{height:24}})]}):(((l=(i=r.data)==null?void 0:i.results)==null?void 0:l.length)??0)===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No results."}):e.jsx(p,{gap:1,style:{marginTop:"var(--space-2)"},children:(((n=r.data)==null?void 0:n.results)??[]).slice(0,30).map((s,o)=>e.jsxs("div",{"data-testid":`misc-search-result-${o}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(q,{kind:s.kind}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:s.title||s.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:s.kind}),s.projectId&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s.projectId]})]}),s.snippet&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.snippet})]},o))})]})})}function q({kind:a}){const t=a==="task"?b:a==="agent"?z:a==="project"?k:R;return e.jsx(t,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}})}function N(){var o,u;const a=j("/api/tailscale/status"),[t,r]=d.useState(!1),[i,l]=d.useState(null),n=d.useCallback(()=>{a.refetch()},[a]),s=async m=>{r(!0),l(null);try{await C(m?"/api/tailscale/enable":"/api/tailscale/disable",{method:"POST"}),n()}catch(h){l((h instanceof T,h.message))}finally{r(!1)}};return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsxs(c,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(S,{size:16,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Tailscale"}),a.data&&e.jsx("span",{"data-testid":"misc-tailscale-state",style:{fontSize:"var(--fs-12)",color:a.data.running?"var(--success)":"var(--fg-muted)"},children:a.data.running?`running · ${a.data.hostname??"?"}`:"stopped"})]}),e.jsxs(c,{gap:1,children:[i!==null&&e.jsx("span",{role:"alert","data-testid":"misc-tailscale-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{variant:"ghost",onClick:()=>void n(),"data-testid":"misc-tailscale-refresh",children:[e.jsx(P,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!0),disabled:t,"data-testid":"misc-tailscale-enable",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Enable"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!1),disabled:t,"data-testid":"misc-tailscale-disable",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Disable"]})]})]}),((o=a.data)==null?void 0:o.url)&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx("a",{href:a.data.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-12)",color:"var(--accent)"},children:a.data.url})}),((u=a.data)==null?void 0:u.error)&&e.jsx("span",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:a.data.error})]})})}export{Q as MiscView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiscView-BBcpUbZZ.js","sources":["../../src/web/v8/views/Misc/MiscView.tsx"],"sourcesContent":["/**\n * v8/views/Misc/MiscView.tsx — Sprint S43, v9.3.0.\n *\n * The \"doesn't fit anywhere else\" surface: global fuzzy search\n * (GET /api/search) + Tailscale card (GET /api/tailscale/status,\n * POST /api/tailscale/{enable,disable}).\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Search, Network, Power, PowerOff, RefreshCcw, FileText, CheckSquare, Bot, Folder } 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 { 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 SearchResult {\n kind?: string;\n id?: string;\n title?: string;\n projectId?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface SearchResponse {\n query?: string;\n results?: SearchResult[];\n total?: number;\n}\n\ninterface TailscaleStatus {\n enabled?: boolean;\n running?: boolean;\n hostname?: string;\n url?: string;\n error?: string;\n}\n\nexport function MiscView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"misc-view\">\n <ViewHeader title=\"Misc\" description=\"Global search + Tailscale.\" />\n <SearchPanel />\n <TailscalePanel />\n </Stack>\n );\n}\n\nfunction SearchPanel(): JSX.Element {\n const [q, setQ] = useState<string>('');\n const payload = useFetch<SearchResponse>(`/api/search?q=${encodeURIComponent(q)}`);\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Search</strong>\n <Inline gap={2} align=\"center\" style={{ marginTop: 'var(--space-2)' }}>\n <Search size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <Input value={q} onChange={(e) => setQ((e.target as HTMLInputElement).value)} placeholder=\"Search projects / tasks / artifacts / agents…\" data-testid=\"misc-search-input\" />\n </Inline>\n {q.trim() === '' ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>Type a query to search.</span>\n ) : payload.loading && !payload.data ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 24 }} />\n <Skeleton style={{ height: 24 }} />\n </Stack>\n ) : (payload.data?.results?.length ?? 0) === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>No results.</span>\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {(payload.data?.results ?? []).slice(0, 30).map((r, i) => (\n <div key={i} data-testid={`misc-search-result-${i}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <KindIcon kind={r.kind} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{r.title || r.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{r.kind}</code>\n {r.projectId && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {r.projectId}</span>}\n </Inline>\n {r.snippet && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.snippet}</span>}\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n );\n}\n\nfunction KindIcon({ kind }: { kind?: string }): JSX.Element {\n const Icon = (kind === 'task' ? CheckSquare : kind === 'agent' ? Bot : kind === 'project' ? Folder : FileText) as typeof Folder;\n return <Icon size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />;\n}\n\nfunction TailscalePanel(): JSX.Element {\n const payload = useFetch<TailscaleStatus>('/api/tailscale/status');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const toggle = async (enable: boolean): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(enable ? '/api/tailscale/enable' : '/api/tailscale/disable', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden style={{ color: 'var(--accent)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>Tailscale</strong>\n {payload.data && (\n <span data-testid=\"misc-tailscale-state\" style={{ fontSize: 'var(--fs-12)', color: payload.data.running ? 'var(--success)' : 'var(--fg-muted)' }}>\n {payload.data.running ? `running · ${payload.data.hostname ?? '?'}` : 'stopped'}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"misc-tailscale-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"misc-tailscale-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(true)} disabled={busy} data-testid=\"misc-tailscale-enable\">\n <Power size={14} aria-hidden /> Enable\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(false)} disabled={busy} data-testid=\"misc-tailscale-disable\">\n <PowerOff size={14} aria-hidden /> Disable\n </Button>\n </Inline>\n </Inline>\n {payload.data?.url && (\n <div style={{ marginTop: 'var(--space-2)' }}>\n <a href={payload.data.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-12)', color: 'var(--accent)' }}>{payload.data.url}</a>\n </div>\n )}\n {payload.data?.error && (\n <span role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{payload.data.error}</span>\n )}\n </CardBody>\n </Card>\n );\n}"],"names":["MiscView","jsxs","Stack","jsx","ViewHeader","SearchPanel","TailscalePanel","q","setQ","useState","payload","useFetch","Card","CardBody","Inline","Search","Input","e","Skeleton","_b","_a","r","i","KindIcon","kind","Icon","CheckSquare","Bot","Folder","FileText","busy","setBusy","error","setError","refresh","useCallback","toggle","enable","fetchJson","err","FetchError","Network","Button","RefreshCcw","Power","PowerOff"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as o,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as C,S as c,I as h,d as i,h as z,Y as U,Z as F,i as f,F as m}from"./main-CdOm1Pj9.js";import{V as L}from"./ViewHeader-BqIPVKuG.js";import{L as O}from"./ListHeader-BGjm11Z0.js";import{C as w,b as k}from"./Card-Tyboihu7.js";import{I as B}from"./Input-BbFUDQnS.js";import{S as V,a as A}from"./Sheet-DH-WNJ3Y.js";import{E as $}from"./EmptyState-DZ2ouKwd.js";import{R as H}from"./refresh-ccw-CHMprsm5.js";import{P as W}from"./plus-M6LYiKX8.js";import{P as q}from"./power-DP5x_SRF.js";import{P as J}from"./power-off-NOJRLAIs.js";import{R as N}from"./rotate-ccw-DJRekBbi.js";import{T as Y}from"./trash-2-CL4khSRv.js";import{D as I}from"./download-BdHlstUY.js";import{U as Z}from"./upload-Cww6MvFq.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 G=D("FilePen",[["path",{d:"M12.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v9.5",key:"1couwa"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M13.378 15.626a1 1 0 1 0-3.004-3.004l-5.01 5.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z",key:"1y4qbx"}]]);function ge(){const p=C("/api/mods"),g=C("/api/mods/registry"),[n,v]=o.useState(null),[y,x]=o.useState(!1),[j,r]=o.useState(null),l=o.useMemo(()=>{var a;return((a=p.data)==null?void 0:a.mods)??[]},[p.data]),u=o.useMemo(()=>{var a;return((a=g.data)==null?void 0:a.mods)??[]},[g.data]),t=o.useCallback(()=>{p.refetch(),g.refetch()},[p,g]),E=async a=>{r(null);try{await f(`/api/mods/${a}`,{method:"DELETE"}),v(null),t()}catch(s){r((s instanceof m,s.message))}},P=async(a,s)=>{r(null);try{await f(`/api/mods/${a}`,{method:"PUT",body:{enabled:s}}),t()}catch(d){r((d instanceof m,d.message))}},R=async a=>{r(null);try{await f(`/api/mods/${a}/upgrade`,{method:"POST"}),t()}catch(s){r((s instanceof m,s.message))}},T=async a=>{r(null);try{await f(`/api/mods/${a}/instructions/reinstall`,{method:"POST"}),t()}catch(s){r((s instanceof m,s.message))}},M=async a=>{const s=window.prompt(`Edit mod file content for ${a} (JSON or YAML)`);if(s!==null){r(null);try{await f(`/api/mods/${a}/mod-file/content`,{method:"PUT",body:{content:s}}),t()}catch(d){r((d instanceof m,d.message))}}};return e.jsxs(c,{gap:4,"data-testid":"mods-view",children:[e.jsx(L,{title:"Mods",description:"Installed + registry-installed mods. Each mod ships its own UI view(s).",actions:e.jsxs(h,{align:"center",gap:2,children:[j!==null&&e.jsx("span",{role:"alert","data-testid":"mods-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:j}),e.jsxs(i,{variant:"ghost",onClick:()=>void t(),"data-testid":"mods-refresh",children:[e.jsx(H,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(i,{variant:"primary",onClick:()=>x(!0),"data-testid":"mods-install",children:[e.jsx(W,{size:14,"aria-hidden":!0})," Install"]})]})}),e.jsx(O,{title:"Installed",count:l.length,testid:"mods-list-header"}),e.jsx(w,{variant:"default",children:e.jsxs(k,{children:[e.jsxs("strong",{style:{fontSize:"var(--fs-13)"},children:["Installed (",l.length,")"]}),p.loading&&l.length===0?e.jsx(c,{gap:1,style:{marginTop:"var(--space-2)"},children:e.jsx(z,{style:{height:40}})}):l.length===0?e.jsx($,{icon:e.jsx(U,{size:28,"aria-hidden":!0}),title:"No mods installed",description:"Install one from the registry or a local path."}):e.jsx(c,{gap:1,style:{marginTop:"var(--space-2)"},children:l.map(a=>{const s=n===a.id,d=u.find(S=>S.id===a.id),b=(d==null?void 0:d.upgradeAvailable)??null;return e.jsxs("div",{"data-testid":`mod-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[e.jsxs(h,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{gap:0,style:{minWidth:0},children:[e.jsxs(h,{align:"center",gap:2,children:[e.jsx("strong",{children:a.name||a.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.id}),a.version&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["v",a.version]}),a.enabled===!1&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--warning)",fontWeight:600},children:"DISABLED"}),b&&e.jsxs("span",{"data-testid":`mod-upgrade-available-${a.id}`,style:{fontSize:"var(--fs-11)",color:"var(--accent)",fontWeight:600},children:["↑ v",b," available"]})]}),a.description&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.description})]}),e.jsxs(h,{gap:1,children:[b&&e.jsxs(i,{variant:"ghost",onClick:()=>void R(a.id),"data-testid":`mod-upgrade-${a.id}`,"aria-label":`Upgrade ${a.id}`,children:[e.jsx(F,{size:14,"aria-hidden":!0})," Upgrade"]}),e.jsx(i,{variant:"ghost",onClick:()=>void P(a.id,!(a.enabled??!0)),"data-testid":`mod-toggle-${a.id}`,"aria-label":a.enabled===!1?`Enable ${a.id}`:`Disable ${a.id}`,children:a.enabled===!1?e.jsx(q,{size:14,"aria-hidden":!0}):e.jsx(J,{size:14,"aria-hidden":!0})}),e.jsx(i,{variant:"ghost",onClick:()=>void T(a.id),"data-testid":`mod-reinstall-instructions-${a.id}`,"aria-label":`Reinstall instructions ${a.id}`,children:e.jsx(N,{size:14,"aria-hidden":!0})}),e.jsx(i,{variant:"ghost",onClick:()=>void M(a.id),"data-testid":`mod-edit-${a.id}`,"aria-label":`Edit mod file ${a.id}`,children:e.jsx(G,{size:14,"aria-hidden":!0})}),e.jsx(i,{variant:"ghost",onClick:()=>v(S=>S===a.id?null:a.id),"data-testid":`mod-uninstall-${a.id}`,"aria-label":`Uninstall ${a.id}`,children:e.jsx(Y,{size:14,"aria-hidden":!0})})]})]}),s&&e.jsxs(h,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(i,{variant:"danger",onClick:()=>void E(a.id),"data-testid":`mod-confirm-uninstall-${a.id}`,children:"Confirm uninstall"}),e.jsx(i,{variant:"ghost",onClick:()=>v(null),children:"Cancel"})]})]},a.id)})})]})}),e.jsx(w,{variant:"default",children:e.jsxs(k,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Registry"}),g.loading&&u.length===0?e.jsx(c,{gap:1,style:{marginTop:"var(--space-2)"},children:e.jsx(z,{style:{height:40}})}):u.length===0?e.jsx($,{icon:e.jsx(I,{size:28,"aria-hidden":!0}),title:"Registry unreachable",description:"Cannot reach the public mod registry right now."}):e.jsx(c,{gap:1,style:{marginTop:"var(--space-2)"},children:u.slice(0,30).map(a=>e.jsxs("div",{"data-testid":`mod-registry-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",display:"flex",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs(c,{gap:0,style:{minWidth:0},children:[e.jsxs(h,{align:"center",gap:2,children:[e.jsx("strong",{children:a.name||a.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.id}),e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["v",a.latest]}),a.installed&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--success)"},children:"installed"})]}),a.description&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.description})]}),!a.installed&&e.jsxs(i,{variant:"ghost",onClick:async()=>{r(null);try{await f("/api/mods",{method:"POST",body:{id:a.id}}),t()}catch(s){r((s instanceof m,s.message))}},"data-testid":`mod-registry-install-${a.id}`,children:[e.jsx(I,{size:14,"aria-hidden":!0})," Install"]})]},a.id))})]})}),e.jsx(V,{open:y,onOpenChange:x,children:e.jsx(A,{side:"right",title:"Install mod",description:"From registry id or local path.",children:e.jsx(K,{onSubmit:async a=>{await f("/api/mods",{method:"POST",body:a}),x(!1),t()},onCancel:()=>x(!1)})})})]})}function K({onSubmit:p,onCancel:g}){const[n,v]=o.useState("registry"),[y,x]=o.useState(""),[j,r]=o.useState(!1),[l,u]=o.useState(null);return e.jsxs(c,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs(h,{gap:1,role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":n==="registry",onClick:()=>v("registry"),"data-testid":"mod-install-mode-registry",style:{padding:"var(--space-1) var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:n==="registry"?"var(--accent-soft)":"var(--surface-0)",color:n==="registry"?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:"Registry id"}),e.jsx("button",{type:"button",role:"tab","aria-selected":n==="path",onClick:()=>v("path"),"data-testid":"mod-install-mode-path",style:{padding:"var(--space-1) var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:n==="path"?"var(--accent-soft)":"var(--surface-0)",color:n==="path"?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:"Local path"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:n==="registry"?"Registry id (e.g. @bizar/mod-foo)":"Local path (e.g. /abs/path/to/mod)"}),e.jsx(B,{value:y,onChange:t=>x(t.target.value),placeholder:n==="registry"?"@org/mod-name":"/abs/path/to/mod","data-testid":"mod-install-input"})]}),l!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:l}),e.jsxs(h,{justify:"end",gap:2,children:[e.jsx(i,{variant:"ghost",onClick:g,children:"Cancel"}),e.jsxs(i,{variant:"primary",disabled:j||!y.trim(),"data-testid":"mod-install-submit",onClick:async()=>{r(!0),u(null);try{const t=n==="registry"?{id:y.trim()}:{path:y.trim()};await p(t)}catch(t){u((t instanceof m,t.message))}finally{r(!1)}},children:[e.jsx(Z,{size:14,"aria-hidden":!0})," ",j?"Installing…":"Install"]})]})]})}export{ge as ModsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModsView-CU4cAmIz.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-pen.js","../../src/web/v8/views/Mods/ModsView.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 FilePen = createLucideIcon(\"FilePen\", [\n [\"path\", { d: \"M12.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v9.5\", key: \"1couwa\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\n \"path\",\n {\n d: \"M13.378 15.626a1 1 0 1 0-3.004-3.004l-5.01 5.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z\",\n key: \"1y4qbx\"\n }\n ]\n]);\n\nexport { FilePen as default };\n//# sourceMappingURL=file-pen.js.map\n","/**\n * v8/views/Mods/ModsView.tsx — Sprint S42, v9.3.0.\n *\n * Two-section mod manager:\n * - Installed (GET /api/mods): list with enable toggle (PUT\n * /api/mods/:id {enabled}) and inline-confirm Uninstall (DELETE\n * /api/mods/:id). Upgrade button if registry reports a newer\n * version (POST /api/mods/:id/upgrade).\n * - Registry (GET /api/mods/registry): list of available mods from\n * the public registry, with Install button for un-installed ones.\n *\n * Install Sheet accepts either `path` (local) or `id` (registry).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Boxes, Download, FileEdit, Plus, Power, PowerOff, RefreshCcw, RotateCcw, Trash2, Upload, ArrowUpCircle } 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 { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.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 Mod {\n id: string;\n name?: string;\n version?: string;\n enabled?: boolean;\n description?: string;\n installed?: boolean;\n installedVersion?: string | null;\n upgradeAvailable?: string | null;\n latest?: string;\n}\n\ninterface RegistryResponse {\n registry?: { version?: number; updatedAt?: string; source?: string };\n mods?: Mod[];\n}\n\nexport function ModsView(): JSX.Element {\n const payload = useFetch<{ mods: Mod[] }>('/api/mods');\n const registryPayload = useFetch<RegistryResponse>('/api/mods/registry');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [installing, setInstalling] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const mods = useMemo<Mod[]>(() => payload.data?.mods ?? [], [payload.data]);\n const registryMods = useMemo<Mod[]>(() => registryPayload.data?.mods ?? [], [registryPayload.data]);\n const refresh = useCallback(() => { void payload.refetch(); void registryPayload.refetch(); }, [payload, registryPayload]);\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/mods/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const toggle = async (id: string, enabled: boolean): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/mods/${id}`, { method: 'PUT', body: { enabled } });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const upgrade = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/mods/${id}/upgrade`, { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const reinstallInstructions = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/mods/${id}/instructions/reinstall`, { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const editModFile = async (id: string): Promise<void> => {\n const content = window.prompt(`Edit mod file content for ${id} (JSON or YAML)`);\n if (content === null) return;\n setError(null);\n try {\n await fetchJson(`/api/mods/${id}/mod-file/content`, { method: 'PUT', body: { content } });\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=\"mods-view\">\n <ViewHeader\n title=\"Mods\"\n description=\"Installed + registry-installed mods. Each mod ships its own UI view(s).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"mods-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"mods-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setInstalling(true)} data-testid=\"mods-install\">\n <Plus size={14} aria-hidden /> Install\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Installed\" count={mods.length} testid=\"mods-list-header\" />\n\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Installed ({mods.length})</strong>\n {payload.loading && mods.length === 0 ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 40 }} />\n </Stack>\n ) : mods.length === 0 ? (\n <EmptyState icon={<Boxes size={28} aria-hidden />} title=\"No mods installed\" description=\"Install one from the registry or a local path.\" />\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {mods.map((m) => {\n const isConfirming = confirmDelete === m.id;\n const registryMatch = registryMods.find((r) => r.id === m.id);\n const upgradeTarget = registryMatch?.upgradeAvailable ?? null;\n return (\n <div\n key={m.id}\n data-testid={`mod-row-${m.id}`}\n style={{\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong>{m.name || m.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{m.id}</code>\n {m.version && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>v{m.version}</span>}\n {m.enabled === false && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--warning)', fontWeight: 600 }}>DISABLED</span>\n )}\n {upgradeTarget && (\n <span data-testid={`mod-upgrade-available-${m.id}`} style={{ fontSize: 'var(--fs-11)', color: 'var(--accent)', fontWeight: 600 }}>\n ↑ v{upgradeTarget} available\n </span>\n )}\n </Inline>\n {m.description && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{m.description}</span>\n )}\n </Stack>\n <Inline gap={1}>\n {upgradeTarget && (\n <Button variant=\"ghost\" onClick={() => void upgrade(m.id)} data-testid={`mod-upgrade-${m.id}`} aria-label={`Upgrade ${m.id}`}>\n <ArrowUpCircle size={14} aria-hidden /> Upgrade\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => void toggle(m.id, !(m.enabled ?? true))} data-testid={`mod-toggle-${m.id}`} aria-label={m.enabled === false ? `Enable ${m.id}` : `Disable ${m.id}`}>\n {m.enabled === false ? <Power size={14} aria-hidden /> : <PowerOff size={14} aria-hidden />}\n </Button>\n <Button variant=\"ghost\" onClick={() => void reinstallInstructions(m.id)} data-testid={`mod-reinstall-instructions-${m.id}`} aria-label={`Reinstall instructions ${m.id}`}>\n <RotateCcw size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => void editModFile(m.id)} data-testid={`mod-edit-${m.id}`} aria-label={`Edit mod file ${m.id}`}>\n <FileEdit size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === m.id ? null : m.id))} data-testid={`mod-uninstall-${m.id}`} aria-label={`Uninstall ${m.id}`}>\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(m.id)} data-testid={`mod-confirm-uninstall-${m.id}`}>\n Confirm uninstall\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 <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Registry</strong>\n {registryPayload.loading && registryMods.length === 0 ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 40 }} />\n </Stack>\n ) : registryMods.length === 0 ? (\n <EmptyState icon={<Download size={28} aria-hidden />} title=\"Registry unreachable\" description=\"Cannot reach the public mod registry right now.\" />\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {registryMods.slice(0, 30).map((m) => (\n <div\n key={m.id}\n data-testid={`mod-registry-row-${m.id}`}\n style={{\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n display: 'flex',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <Stack gap={0} style={{ minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong>{m.name || m.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{m.id}</code>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>v{m.latest}</span>\n {m.installed && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--success)' }}>installed</span>}\n </Inline>\n {m.description && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{m.description}</span>\n )}\n </Stack>\n {!m.installed && (\n <Button variant=\"ghost\" onClick={async () => {\n setError(null);\n try {\n await fetchJson('/api/mods', { method: 'POST', body: { id: m.id } });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n }} data-testid={`mod-registry-install-${m.id}`}>\n <Download size={14} aria-hidden /> Install\n </Button>\n )}\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={installing} onOpenChange={setInstalling}>\n <SheetContent side=\"right\" title=\"Install mod\" description=\"From registry id or local path.\">\n <InstallForm\n onSubmit={async (body) => {\n await fetchJson('/api/mods', { method: 'POST', body });\n setInstalling(false);\n refresh();\n }}\n onCancel={() => setInstalling(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction InstallForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { id?: string; path?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [mode, setMode] = useState<'registry' | 'path'>('registry');\n const [value, setValue] = 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 <Inline gap={1} role=\"tablist\">\n <button type=\"button\" role=\"tab\" aria-selected={mode === 'registry'} onClick={() => setMode('registry')} data-testid=\"mod-install-mode-registry\"\n style={{ padding: 'var(--space-1) var(--space-3)', borderRadius: 'var(--radius-md)', border: '1px solid var(--border)', background: mode === 'registry' ? 'var(--accent-soft)' : 'var(--surface-0)', color: mode === 'registry' ? 'var(--accent)' : 'var(--fg-muted)', fontSize: 'var(--fs-12)', cursor: 'pointer' }}>\n Registry id\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={mode === 'path'} onClick={() => setMode('path')} data-testid=\"mod-install-mode-path\"\n style={{ padding: 'var(--space-1) var(--space-3)', borderRadius: 'var(--radius-md)', border: '1px solid var(--border)', background: mode === 'path' ? 'var(--accent-soft)' : 'var(--surface-0)', color: mode === 'path' ? 'var(--accent)' : 'var(--fg-muted)', fontSize: 'var(--fs-12)', cursor: 'pointer' }}>\n Local path\n </button>\n </Inline>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {mode === 'registry' ? 'Registry id (e.g. @bizar/mod-foo)' : 'Local path (e.g. /abs/path/to/mod)'}\n </span>\n <Input\n value={value}\n onChange={(e) => setValue((e.target as HTMLInputElement).value)}\n placeholder={mode === 'registry' ? '@org/mod-name' : '/abs/path/to/mod'}\n data-testid=\"mod-install-input\"\n />\n </label>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !value.trim()}\n data-testid=\"mod-install-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n const body = mode === 'registry' ? { id: value.trim() } : { path: value.trim() };\n await onSubmit(body);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n }}\n >\n <Upload size={14} aria-hidden /> {busy ? 'Installing…' : 'Install'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["FilePen","createLucideIcon","ModsView","payload","useFetch","registryPayload","confirmDelete","setConfirmDelete","useState","installing","setInstalling","error","setError","mods","useMemo","_a","registryMods","refresh","useCallback","drop","id","fetchJson","err","FetchError","toggle","enabled","upgrade","reinstallInstructions","editModFile","content","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","ListHeader","Card","CardBody","Skeleton","EmptyState","Boxes","m","isConfirming","registryMatch","r","upgradeTarget","ArrowUpCircle","Power","PowerOff","RotateCcw","FileEdit","cur","Trash2","Download","Sheet","SheetContent","InstallForm","body","onSubmit","onCancel","mode","setMode","value","setValue","busy","setBusy","Input","e","Upload"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as c,j as t}from"./cmdk-DVxytz9i.js";import{c as b,u as w,a as S,S as d,I as f,d as h,h as g,y as E,B as z,i as m,F as p}from"./main-CdOm1Pj9.js";import{V as R}from"./ViewHeader-BqIPVKuG.js";import{C as $,b as B}from"./Card-Tyboihu7.js";import{E as I}from"./EmptyState-DZ2ouKwd.js";import{R as M}from"./refresh-cw-1RBqDKgJ.js";import{T as N}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 D=b("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]);function T(s){return s.tone&&["info","success","warning","danger","neutral"].includes(s.tone)?s.tone:"neutral"}function F(s){if(!s)return"";const r=Date.parse(s);if(Number.isNaN(r))return"";const i=Math.max(0,Date.now()-r);return i<6e4?"just now":i<36e5?`${Math.round(i/6e4)}m ago`:i<864e5?`${Math.round(i/36e5)}h ago`:new Date(r).toLocaleString()}function W(){const s=w("/api/notifications?limit=200"),[r,i]=c.useState([]),[u,n]=c.useState(null),[x,o]=c.useState(null);c.useEffect(()=>{var e;(e=s.data)!=null&&e.notifications&&i(s.data.notifications)},[s.data]);const y=c.useCallback(e=>{e.type==="notifications:change"&&s.refetch()},[s]);S("notifications:change",y);const k=async e=>{n(e),o(null);try{await m(`/api/notifications/${encodeURIComponent(e)}/read`,{method:"POST"}),i(a=>a.map(l=>l.id===e?{...l,read:!0}:l))}catch(a){o((a instanceof p,a.message))}finally{n(null)}},v=async()=>{n("all"),o(null);try{await m("/api/notifications/read-all",{method:"POST"}),i(e=>e.map(a=>({...a,read:!0})))}catch(e){o((e instanceof p,e.message))}finally{n(null)}},C=async e=>{n(e),o(null);try{await m(`/api/notifications/${encodeURIComponent(e)}`,{method:"DELETE"}),i(a=>a.filter(l=>l.id!==e))}catch(a){o((a instanceof p,a.message))}finally{n(null)}},j=r.filter(e=>!e.read).length;return t.jsxs(d,{gap:5,"data-testid":"notifications-view",children:[t.jsx(R,{title:"Notifications",description:`${j} unread of ${r.length} total. Backed by ~/.config/bizar/notifications.jsonl.`,actions:t.jsxs(f,{gap:2,align:"center",children:[x!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),t.jsxs(h,{variant:"ghost",onClick:()=>void s.refetch(),"data-testid":"notifications-refresh",children:[t.jsx(M,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(h,{variant:"secondary",onClick:()=>void v(),disabled:u==="all"||j===0,"data-testid":"notifications-mark-all",children:[t.jsx(D,{size:14,"aria-hidden":!0})," Mark all read"]})]})}),s.loading&&r.length===0?t.jsxs(d,{gap:2,children:[t.jsx(g,{style:{height:64}}),t.jsx(g,{style:{height:64}}),t.jsx(g,{style:{height:64}})]}):r.length===0?t.jsx(I,{icon:t.jsx(E,{size:32,"aria-hidden":!0}),title:"No notifications",description:"Agent runs, task moves, and CI results will land here."}):t.jsx(d,{gap:2,children:r.map(e=>{const a=T(e);return t.jsx($,{variant:"default",style:{opacity:e.read?.7:1},children:t.jsx(B,{children:t.jsxs(f,{align:"start",justify:"between",gap:3,children:[t.jsxs(d,{gap:1,style:{flex:1,minWidth:0},children:[t.jsxs(f,{align:"center",gap:2,children:[!e.read&&t.jsx("span",{"aria-label":"Unread",style:{width:8,height:8,borderRadius:"var(--radius-pill)",background:"var(--accent)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.source||e.id}),e.source&&t.jsx(z,{tone:a,children:e.source}),t.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:F(e.createdAt)})]}),e.body&&t.jsx("span",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:e.body})]}),t.jsxs(f,{gap:1,children:[!e.read&&t.jsx(h,{variant:"ghost",onClick:()=>void k(e.id),disabled:u===e.id,"data-testid":`notification-read-${e.id}`,children:"Mark read"}),t.jsxs(h,{variant:"ghost",onClick:()=>void C(e.id),disabled:u===e.id,"data-testid":`notification-dismiss-${e.id}`,children:[t.jsx(N,{size:12,"aria-hidden":!0})," Dismiss"]})]})]})})},e.id)})})]})}export{W as NotificationsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationsView-BYffvthq.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/check-check.js","../../src/web/v8/views/Notifications/NotificationsView.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 CheckCheck = createLucideIcon(\"CheckCheck\", [\n [\"path\", { d: \"M18 6 7 17l-5-5\", key: \"116fxf\" }],\n [\"path\", { d: \"m22 10-7.5 7.5L13 16\", key: \"ke71qq\" }]\n]);\n\nexport { CheckCheck as default };\n//# sourceMappingURL=check-check.js.map\n","import { useCallback, useEffect, useState } from 'react';\nimport { Bell, CheckCheck, Trash2, RefreshCw } 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 { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * NotificationsView — Sprint S35. Per-user notification stream backed\n * by `/api/notifications`. Pulls unread + read mixed, supports\n * mark-one-read, mark-all-read, and dismiss.\n */\n\ntype Tone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\ninterface NotificationItem {\n id: string;\n title?: string;\n body?: string;\n source?: string;\n tone?: Tone;\n read?: boolean;\n createdAt?: string;\n}\n\ninterface NotificationsResponse {\n notifications: NotificationItem[];\n stats?: { total: number; unread: number };\n}\n\nfunction toneFor(item: NotificationItem): Tone {\n if (item.tone && ['info', 'success', 'warning', 'danger', 'neutral'].includes(item.tone)) {\n return item.tone as Tone;\n }\n return 'neutral';\n}\n\nfunction fmtRel(iso: string | undefined): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const delta = Math.max(0, Date.now() - t);\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.round(delta / 60_000)}m ago`;\n if (delta < 86_400_000) return `${Math.round(delta / 3_600_000)}h ago`;\n return new Date(t).toLocaleString();\n}\n\nexport function NotificationsView(): JSX.Element {\n const res = useFetch<NotificationsResponse>('/api/notifications?limit=200');\n const [items, setItems] = useState<NotificationItem[]>([]);\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (res.data?.notifications) setItems(res.data.notifications);\n }, [res.data]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type === 'notifications:change') res.refetch();\n }, [res]);\n useWsMessage('notifications:change', onChange);\n\n const markRead = async (id: string): Promise<void> => {\n setBusy(id);\n setError(null);\n try {\n await fetchJson(`/api/notifications/${encodeURIComponent(id)}/read`, { method: 'POST' });\n setItems((prev) => prev.map((n) => (n.id === id ? { ...n, read: true } : n)));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const markAll = async (): Promise<void> => {\n setBusy('all');\n setError(null);\n try {\n await fetchJson('/api/notifications/read-all', { method: 'POST' });\n setItems((prev) => prev.map((n) => ({ ...n, read: true })));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const dismiss = async (id: string): Promise<void> => {\n setBusy(id);\n setError(null);\n try {\n await fetchJson(`/api/notifications/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setItems((prev) => prev.filter((n) => n.id !== id));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const unread = items.filter((n) => !n.read).length;\n\n return (\n <Stack gap={5} data-testid=\"notifications-view\">\n <ViewHeader\n title=\"Notifications\"\n description={`${unread} unread of ${items.length} total. Backed by ~/.config/bizar/notifications.jsonl.`}\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => void res.refetch()} data-testid=\"notifications-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"secondary\" onClick={() => void markAll()} disabled={busy === 'all' || unread === 0} data-testid=\"notifications-mark-all\">\n <CheckCheck size={14} aria-hidden /> Mark all read\n </Button>\n </Inline>\n }\n />\n {res.loading && items.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 64 }} />\n <Skeleton style={{ height: 64 }} />\n <Skeleton style={{ height: 64 }} />\n </Stack>\n ) : items.length === 0 ? (\n <EmptyState\n icon={<Bell size={32} aria-hidden />}\n title=\"No notifications\"\n description=\"Agent runs, task moves, and CI results will land here.\"\n />\n ) : (\n <Stack gap={2}>\n {items.map((n) => {\n const tone = toneFor(n);\n return (\n <Card key={n.id} variant=\"default\" style={{ opacity: n.read ? 0.7 : 1 }}>\n <CardBody>\n <Inline align=\"start\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n {!n.read && <span aria-label=\"Unread\" style={{ width: 8, height: 8, borderRadius: 'var(--radius-pill)', background: 'var(--accent)' }} />}\n <strong style={{ fontSize: 'var(--fs-13)' }}>{n.title || n.source || n.id}</strong>\n {n.source && <Badge tone={tone}>{n.source}</Badge>}\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>{fmtRel(n.createdAt)}</span>\n </Inline>\n {n.body && <span style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{n.body}</span>}\n </Stack>\n <Inline gap={1}>\n {!n.read && (\n <Button variant=\"ghost\" onClick={() => void markRead(n.id)} disabled={busy === n.id} data-testid={`notification-read-${n.id}`}>\n Mark read\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => void dismiss(n.id)} disabled={busy === n.id} data-testid={`notification-dismiss-${n.id}`}>\n <Trash2 size={12} aria-hidden /> Dismiss\n </Button>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["CheckCheck","createLucideIcon","toneFor","item","fmtRel","iso","t","delta","NotificationsView","res","useFetch","items","setItems","useState","busy","setBusy","error","setError","useEffect","_a","onChange","useCallback","msg","useWsMessage","markRead","id","fetchJson","prev","n","err","FetchError","markAll","dismiss","unread","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Skeleton","EmptyState","Bell","tone","Card","CardBody","Badge","Trash2"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{u as f,S as l,I as r,d as o,a0 as y,f as F,h as g,i as C,F as S}from"./main-CdOm1Pj9.js";import{V as D}from"./ViewHeader-BqIPVKuG.js";import{C as w,b as z}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{E as N}from"./EmptyState-DZ2ouKwd.js";import{R as V}from"./refresh-ccw-CHMprsm5.js";import{R as B}from"./rotate-ccw-DJRekBbi.js";import{F as L}from"./file-text-B-g8H227.js";import{T as O}from"./trash-2-CL4khSRv.js";function X(){const t=f("/api/obsidian"),s=f("/api/obsidian/notes"),[k,c]=i.useState(null),[E,v]=i.useState(null),[h,R]=i.useState(""),[j,m]=i.useState(!1),[b,d]=i.useState(null),p=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.notes)??[]},[s.data]),u=i.useCallback(()=>{t.refetch(),s.refetch()},[t,s]),T=async a=>{d(null);try{await C(`/api/obsidian/notes/${a}`,{method:"DELETE"}),c(null),v(null),u()}catch(n){d((n instanceof S,n.message))}},$=async()=>{m(!0),d(null);try{await C("/api/obsidian/index",{method:"POST"}),u()}catch(a){d((a instanceof S,a.message))}finally{m(!1)}};return e.jsxs(l,{gap:4,"data-testid":"obsidian-view",children:[e.jsx(D,{title:"Obsidian",description:"Vault explorer + index. Notes stored as markdown.",actions:e.jsxs(r,{align:"center",gap:2,children:[b!==null&&e.jsx("span",{role:"alert","data-testid":"obsidian-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:b}),e.jsxs(o,{variant:"ghost",onClick:()=>void u(),"data-testid":"obsidian-refresh",children:[e.jsx(V,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(o,{variant:"primary",onClick:()=>void $(),disabled:j,"data-testid":"obsidian-reindex",children:[e.jsx(B,{size:14,"aria-hidden":!0})," ",j?"Indexing…":"Rebuild index"]})]})}),t.data&&e.jsx(w,{variant:"default",children:e.jsx(z,{children:e.jsxs(r,{align:"center",gap:3,children:[e.jsx(y,{size:18,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsxs(l,{gap:0,children:[e.jsx("strong",{children:t.data.exists?`${t.data.noteCount??0} notes`:"No vault"}),t.data.exists&&t.data.vaultDir&&e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.data.vaultDir})]}),t.data.exists&&e.jsxs(r,{align:"center",gap:3,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsxs("span",{children:[(t.data.totalSize??0).toLocaleString()," bytes"]}),t.data.folderCount!==void 0&&e.jsxs("span",{children:["· ",t.data.folderCount," folders"]})]})]})})}),e.jsx(w,{variant:"default",children:e.jsxs(z,{children:[e.jsxs(r,{gap:2,align:"center",children:[e.jsx(F,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:h,onChange:a=>R(a.target.value),placeholder:"Filter notes by path…","data-testid":"obsidian-search"})]}),s.loading&&p.length===0?e.jsxs(l,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:28}}),e.jsx(g,{style:{height:28}})]}):p.length===0?e.jsx(N,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No notes",description:"Vault is empty or not initialized."}):e.jsx(l,{gap:1,style:{marginTop:"var(--space-2)"},children:p.filter(a=>!h||a.path.toLowerCase().includes(h.toLowerCase())).slice(0,200).map(a=>{const n=k===a.path;return e.jsxs("div",{"data-testid":`obsidian-row-${a.path}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsxs(r,{align:"center",gap:2,children:[e.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("button",{type:"button",onClick:()=>v(x=>x===a.path?null:a.path),"data-testid":`obsidian-view-${a.path}`,style:{background:"transparent",border:"none",color:"var(--fg)",cursor:"pointer",padding:0,fontFamily:"inherit",fontSize:"inherit"},children:e.jsx("code",{children:a.path})}),a.size!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[a.size," B"]})]}),e.jsx(o,{variant:"ghost",onClick:()=>c(x=>x===a.path?null:a.path),"data-testid":`obsidian-delete-${a.path}`,"aria-label":`Delete ${a.path}`,children:e.jsx(O,{size:14,"aria-hidden":!0})})]}),n&&e.jsxs(r,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(o,{variant:"danger",onClick:()=>void T(a.path),"data-testid":`obsidian-confirm-delete-${a.path}`,children:"Confirm delete"}),e.jsx(o,{variant:"ghost",onClick:()=>c(null),children:"Cancel"})]}),E===a.path&&e.jsx(P,{path:a.path})]},a.path)})})]})})]})}function P({path:t}){const s=f(`/api/obsidian/notes/${t}`);return e.jsx("div",{"data-testid":`obsidian-note-view-${t}`,style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:s.loading&&s.data===null?e.jsx(g,{style:{height:60}}):s.data?e.jsx("pre",{style:{margin:0,fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",color:"var(--fg)"},children:s.data.raw??s.data.body??""}):e.jsx("span",{style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:"Failed to load"})})}export{X as ObsidianView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObsidianView-D3bI0row.js","sources":["../../src/web/v8/views/Obsidian/ObsidianView.tsx"],"sourcesContent":["/**\n * v8/views/Obsidian/ObsidianView.tsx — Sprint S43, v9.3.0.\n *\n * Vault explorer. Stats card (GET /api/obsidian), notes list\n * (GET /api/obsidian/notes), per-note view (GET /api/obsidian/notes/*),\n * per-note delete (DELETE /api/obsidian/notes/*), Index button\n * (POST /api/obsidian/index), and search (GET /api/obsidian/search?q).\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { BookOpen, FileText, RefreshCcw, Trash2, Search, RotateCcw } 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 { 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 VaultStats {\n exists: boolean;\n vaultDir?: string;\n noteCount?: number;\n totalSize?: number;\n folderCount?: number;\n}\n\ninterface NoteMeta {\n path: string;\n relPath: string;\n mtime?: number | string;\n size?: number;\n}\n\nexport function ObsidianView(): JSX.Element {\n const statsPayload = useFetch<VaultStats>('/api/obsidian');\n const notesPayload = useFetch<{ notes: NoteMeta[] }>('/api/obsidian/notes');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [activeNote, setActiveNote] = useState<string | null>(null);\n const [search, setSearch] = useState<string>('');\n const [indexing, setIndexing] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const notes = useMemo<NoteMeta[]>(() => notesPayload.data?.notes ?? [], [notesPayload.data]);\n const refresh = useCallback(() => { void statsPayload.refetch(); void notesPayload.refetch(); }, [statsPayload, notesPayload]);\n\n const drop = async (path: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/obsidian/notes/${path}`, { method: 'DELETE' });\n setConfirmDelete(null);\n setActiveNote(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const reindex = async (): Promise<void> => {\n setIndexing(true);\n setError(null);\n try {\n await fetchJson('/api/obsidian/index', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setIndexing(false);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"obsidian-view\">\n <ViewHeader\n title=\"Obsidian\"\n description=\"Vault explorer + index. Notes stored as markdown.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"obsidian-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"obsidian-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void reindex()} disabled={indexing} data-testid=\"obsidian-reindex\">\n <RotateCcw size={14} aria-hidden /> {indexing ? 'Indexing…' : 'Rebuild index'}\n </Button>\n </Inline>\n }\n />\n\n {statsPayload.data && (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" gap={3}>\n <BookOpen size={18} aria-hidden style={{ color: 'var(--accent)' }} />\n <Stack gap={0}>\n <strong>{statsPayload.data.exists ? `${statsPayload.data.noteCount ?? 0} notes` : 'No vault'}</strong>\n {statsPayload.data.exists && statsPayload.data.vaultDir && (\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{statsPayload.data.vaultDir}</code>\n )}\n </Stack>\n {statsPayload.data.exists && (\n <Inline align=\"center\" gap={3} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n <span>{(statsPayload.data.totalSize ?? 0).toLocaleString()} bytes</span>\n {statsPayload.data.folderCount !== undefined && <span>· {statsPayload.data.folderCount} folders</span>}\n </Inline>\n )}\n </Inline>\n </CardBody>\n </Card>\n )}\n\n <Card variant=\"default\">\n <CardBody>\n <Inline gap={2} align=\"center\">\n <Search size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <Input value={search} onChange={(e) => setSearch((e.target as HTMLInputElement).value)} placeholder=\"Filter notes by path…\" data-testid=\"obsidian-search\" />\n </Inline>\n {notesPayload.loading && notes.length === 0 ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 28 }} />\n <Skeleton style={{ height: 28 }} />\n </Stack>\n ) : notes.length === 0 ? (\n <EmptyState icon={<BookOpen size={28} aria-hidden />} title=\"No notes\" description=\"Vault is empty or not initialized.\" />\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {notes\n .filter((n) => !search || n.path.toLowerCase().includes(search.toLowerCase()))\n .slice(0, 200)\n .map((n) => {\n const isConfirming = confirmDelete === n.path;\n return (\n <div\n key={n.path}\n data-testid={`obsidian-row-${n.path}`}\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 <Inline align=\"center\" gap={2}>\n <FileText size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <button\n type=\"button\"\n onClick={() => setActiveNote((cur) => (cur === n.path ? null : n.path))}\n data-testid={`obsidian-view-${n.path}`}\n style={{ background: 'transparent', border: 'none', color: 'var(--fg)', cursor: 'pointer', padding: 0, fontFamily: 'inherit', fontSize: 'inherit' }}\n >\n <code>{n.path}</code>\n </button>\n {n.size !== undefined && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{n.size} B</span>}\n </Inline>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === n.path ? null : n.path))} data-testid={`obsidian-delete-${n.path}`} aria-label={`Delete ${n.path}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(n.path)} data-testid={`obsidian-confirm-delete-${n.path}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n {activeNote === n.path && <NoteView path={n.path} />}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nfunction NoteView({ path }: { path: string }): JSX.Element {\n const payload = useFetch<{ relPath: string; body?: string; frontmatter?: Record<string, unknown>; raw?: string }>(`/api/obsidian/notes/${path}`);\n return (\n <div data-testid={`obsidian-note-view-${path}`} style={{ marginTop: 'var(--space-2)', padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n {payload.loading && payload.data === null ? (\n <Skeleton style={{ height: 60 }} />\n ) : payload.data ? (\n <pre style={{ margin: 0, fontSize: 'var(--fs-12)', whiteSpace: 'pre-wrap', color: 'var(--fg)' }}>{payload.data.raw ?? payload.data.body ?? ''}</pre>\n ) : (\n <span style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>Failed to load</span>\n )}\n </div>\n );\n}"],"names":["ObsidianView","statsPayload","useFetch","notesPayload","confirmDelete","setConfirmDelete","useState","activeNote","setActiveNote","search","setSearch","indexing","setIndexing","error","setError","notes","useMemo","_a","refresh","useCallback","drop","path","fetchJson","err","FetchError","reindex","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","RotateCcw","Card","CardBody","BookOpen","Search","Input","e","Skeleton","EmptyState","n","isConfirming","FileText","cur","Trash2","NoteView","payload"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as g,j as e}from"./cmdk-DVxytz9i.js";import{u as h,a as I,S as m,B as A,A as y,W as L,b as M}from"./main-CdOm1Pj9.js";import{S as E,a as u,A as F}from"./ActivityFeed-Da-JCrE6.js";import{C as f,a as x,b as j}from"./Card-Tyboihu7.js";import{V as G}from"./ViewHeader-BqIPVKuG.js";import{S as q}from"./Sparkline-CYtAn82j.js";import{C as z}from"./circle-check-rVKMQmZp.js";import{T as k}from"./triangle-alert-BPLb7uLt.js";import{G as C,a as B}from"./git-pull-request-ByH0YuVz.js";import"./trending-up-CSJJhWTS.js";const O={"git.merge":C,"git.pull-request":B,"git.merge.pr":C,"task.completed":z,"task.failed":k,"agent.run":M,"agent.tool":L,"agent.message":y};function P(t){const i=O[t||""]||y;return e.jsx(i,{size:14,"aria-hidden":"true"})}function V(t,i){const n=typeof t.ts=="number"?t.ts:Date.now(),c=t.meta||(n?new Date(n).toLocaleString():"");return{id:t.id||`${n}-${i}`,icon:P(t.iconKey||t.kind),title:t.title||t.description||t.kind||"event",description:t.description,meta:c,tone:t.tone}}function Z(){var S,$;const t=h("/api/snapshot"),i=h("/api/activity?limit=10"),n=h("/api/usage?range=7d"),c=g.useMemo(()=>{var a;const s=((a=n.data)==null?void 0:a.daily)??[];return s.length<2?[]:s.map(r=>typeof r.tokens=="number"?r.tokens:0)},[n.data]),[b,T]=g.useState([]),R=g.useCallback(s=>{const a=s.event;a&&T(r=>[...r.slice(-19),a])},[]);I("activity:new",R);const w=g.useMemo(()=>{var a;return[...b.slice(-10).reverse(),...(((a=i.data)==null?void 0:a.events)||[]).slice(0,10)].map(V)},[i.data,b]),o=((S=t.data)==null?void 0:S.overview)||{},l=o.tasks||{},v=o.goals||{},d=o.agents||{},p=o.tokens||{};return e.jsxs(m,{gap:5,"data-testid":"overview-view",children:[e.jsx(G,{title:"Overview",description:"What's moving in the harness right now.",actions:e.jsx(A,{tone:t.error?"danger":"success",dot:!0,children:t.loading?"Loading":t.error?"Offline":"Live"})}),e.jsxs(E,{cols:4,children:[e.jsx(u,{label:"Active tasks",value:String((l.queued||0)+(l.active||0)),trend:(l.active||0)>(l.queued||0)?"up":"flat",delta:`${l.done||0} done · ${l.blocked||0} blocked`}),e.jsx(u,{label:"Goals at risk",value:`${v.atRisk||0} / ${v.total||0}`,trend:(v.atRisk||0)>0?"down":"flat",delta:`${v.done||0} done`}),e.jsx(u,{label:"Agents running",value:`${d.running||0} / ${d.total||0}`,trend:(d.running||0)>0?"up":"flat",delta:`${d.idle||0} idle · ${d.error||0} error`}),e.jsx(u,{label:"Tokens (24h)",value:p.last24h?`${(p.last24h/1e6).toFixed(1)}M`:"—",trend:p.trend||"flat",delta:"last 24h",sparkline:c.length>=2?e.jsx("span",{"data-testid":"overview-tokens-sparkline",children:e.jsx(q,{data:c,width:140,height:28})}):void 0})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"var(--space-4)"},children:[e.jsxs(f,{children:[e.jsx(x,{title:"Recent activity"}),e.jsx(j,{children:e.jsx(F,{items:w.length?w:[]})})]}),e.jsxs(f,{children:[e.jsx(x,{title:"Needs attention"}),e.jsx(j,{children:e.jsx(m,{gap:2,children:(o.needsAttention||[]).length===0?e.jsxs("div",{role:"status",style:{padding:"var(--space-3)",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",background:"color-mix(in oklch, var(--success) 8%, var(--surface-0))",color:"var(--success)",fontSize:"var(--fs-13)",display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx(z,{size:14,"aria-hidden":!0}),"All clear — nothing needs attention."]}):(o.needsAttention||[]).map((s,a)=>{const r=String(s.label||"").toLowerCase().includes("fail")?"danger":String(s.label||"").toLowerCase().includes("block")||String(s.label||"").toLowerCase().includes("risk")?"warning":"info",W=r==="danger"?k:r==="warning"?k:y;return e.jsxs("div",{role:"alert",style:{padding:"var(--space-3)",border:`1px solid color-mix(in oklch, var(--${r}) 40%, var(--border))`,borderRadius:"var(--radius-md)",background:`color-mix(in oklch, var(--${r}) 8%, var(--surface-0))`,display:"flex",alignItems:"flex-start",gap:"var(--space-2)"},children:[e.jsx(W,{size:16,"aria-hidden":!0,style:{color:`var(--${r})`,marginTop:2,flexShrink:0}}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:s.label}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:s.value}),typeof s.hint=="string"&&s.hint.length>0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:s.hint})]})]},a)})})})]})]}),Array.isArray(($=t.data)==null?void 0:$.projects)&&t.data.projects.length>0&&e.jsxs(f,{children:[e.jsx(x,{title:"Active projects"}),e.jsx(j,{children:e.jsx(m,{gap:1,children:t.data.projects.map(s=>{var a,r;return e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-0)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:s.name||s.id}),e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.cwd})]}),((r=(a=t.data)==null?void 0:a.activeProject)==null?void 0:r.id)===s.id&&e.jsx(A,{tone:"success",dot:!0,children:"active"})]},s.id)})})})]})]})}export{Z as OverviewView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverviewView-0tq8f-Y0.js","sources":["../../src/web/v8/views/Overview/OverviewView.tsx"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { StatTile, StatGrid } from '../../ui/data/StatTile.js';\nimport { Card, CardBody, CardHeader } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { ActivityFeed, type ActivityItem } from '../../ui/activity/ActivityFeed.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { ActivityEvent, Snapshot } from '../../data/types.js';\n\n/**\n * OverviewView — the home/dashboard landing page.\n *\n * S10 — pulls `/api/snapshot` for the headline counts and `/api/activity`\n * for the recent feed. Live-tails via `useWsMessage('activity:new', …)`\n * so a new event lands in the feed without a re-fetch.\n */\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n 'git.merge': GitMerge,\n 'git.pull-request': GitPullRequest,\n 'git.merge.pr': GitMerge,\n 'task.completed': CheckCircle2,\n 'task.failed': AlertTriangle,\n 'agent.run': Bot,\n 'agent.tool': Wrench,\n 'agent.message': ActivityIcon,\n};\n\nfunction iconFor(key: string | undefined): JSX.Element {\n const Icon = ICON_MAP[key || ''] || ActivityIcon;\n return <Icon size={14} aria-hidden=\"true\" />;\n}\n\nfunction eventToItem(e: ActivityEvent, idx: number): ActivityItem {\n const ts = typeof e.ts === 'number' ? e.ts : Date.now();\n const meta = e.meta || (ts ? new Date(ts).toLocaleString() : '');\n return {\n id: e.id || `${ts}-${idx}`,\n icon: iconFor(e.iconKey || e.kind),\n title: e.title || e.description || e.kind || 'event',\n description: e.description,\n meta,\n tone: e.tone,\n };\n}\n\nexport function OverviewView(): JSX.Element {\n const snapshot = useFetch<Snapshot>('/api/snapshot');\n const activity = useFetch<{ events?: ActivityEvent[] }>('/api/activity?limit=10');\n\n // v10-S2 — real time-series trends. `/api/usage?range=24h` returns a\n // `daily` array (one bucket per day). We thread the token counts into\n // a Sparkline slot on the Tokens StatTile so the KPI isn't point-in-\n // time any more. Snapshot / activity / usage are independent requests\n // — if usage 500s the tile still renders.\n interface UsageDay { date?: string; tokens?: number }\n interface UsageResponse { daily?: UsageDay[]; totals?: { tokens?: number } }\n // v10.0.3-S2 — `range=24h` only ever returns 1 daily bucket so the\n // sparkline never renders. Use 7d so the time-series trends have ≥2\n // points even on freshly seeded servers (umbrella criterion #5).\n const usage = useFetch<UsageResponse>('/api/usage?range=7d');\n const tokenSeries = useMemo<readonly number[]>(() => {\n const days = usage.data?.daily ?? [];\n if (days.length < 2) return [];\n return days.map((d) => (typeof d.tokens === 'number' ? d.tokens : 0));\n }, [usage.data]);\n\n // Live-tail new events. Keep them in a small in-memory ring buffer.\n const [liveEvents, setLiveEvents] = useState<ActivityEvent[]>([]);\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n const ev = msg.event;\n if (!ev) return;\n setLiveEvents((prev) => [...prev.slice(-19), ev]);\n }, []);\n useWsMessage('activity:new', onEvent);\n\n const items = useMemo<ActivityItem[]>(() => {\n const list = [\n ...liveEvents.slice(-10).reverse(),\n ...((activity.data?.events || []).slice(0, 10)),\n ];\n return list.map(eventToItem);\n }, [activity.data, liveEvents]);\n\n const ov = snapshot.data?.overview || {};\n const tasks = ov.tasks || {};\n const goals = ov.goals || {};\n const agents = ov.agents || {};\n const tokens = ov.tokens || {};\n\n return (\n <Stack gap={5} data-testid=\"overview-view\">\n <ViewHeader\n title=\"Overview\"\n description=\"What's moving in the harness right now.\"\n actions={\n <Badge tone={snapshot.error ? 'danger' : 'success'} dot>\n {snapshot.loading ? 'Loading' : snapshot.error ? 'Offline' : 'Live'}\n </Badge>\n }\n />\n\n <StatGrid cols={4}>\n <StatTile\n label=\"Active tasks\"\n value={String((tasks.queued || 0) + (tasks.active || 0))}\n trend={(tasks.active || 0) > (tasks.queued || 0) ? 'up' : 'flat'}\n delta={`${tasks.done || 0} done · ${tasks.blocked || 0} blocked`}\n />\n <StatTile\n label=\"Goals at risk\"\n value={`${goals.atRisk || 0} / ${goals.total || 0}`}\n trend={(goals.atRisk || 0) > 0 ? 'down' : 'flat'}\n delta={`${goals.done || 0} done`}\n />\n <StatTile\n label=\"Agents running\"\n value={`${agents.running || 0} / ${agents.total || 0}`}\n trend={(agents.running || 0) > 0 ? 'up' : 'flat'}\n delta={`${agents.idle || 0} idle · ${agents.error || 0} error`}\n />\n <StatTile\n label=\"Tokens (24h)\"\n value={tokens.last24h ? `${(tokens.last24h / 1_000_000).toFixed(1)}M` : '—'}\n trend={tokens.trend || 'flat'}\n delta=\"last 24h\"\n sparkline={\n tokenSeries.length >= 2 ? (\n <span data-testid=\"overview-tokens-sparkline\">\n <Sparkline data={tokenSeries} width={140} height={28} />\n </span>\n ) : undefined\n }\n />\n </StatGrid>\n\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 'var(--space-4)' }}>\n <Card>\n <CardHeader title=\"Recent activity\" />\n <CardBody>\n <ActivityFeed items={items.length ? items : []} />\n </CardBody>\n </Card>\n <Card>\n <CardHeader title=\"Needs attention\" />\n <CardBody>\n <Stack gap={2}>\n {(ov.needsAttention || []).length === 0 ? (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-3)',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n background: 'color-mix(in oklch, var(--success) 8%, var(--surface-0))',\n color: 'var(--success)',\n fontSize: 'var(--fs-13)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n }}\n >\n <CheckCircle2 size={14} aria-hidden />\n All clear — nothing needs attention.\n </div>\n ) : (\n (ov.needsAttention || []).map((n, i) => {\n const tone =\n String(n.label || '').toLowerCase().includes('fail') ? 'danger' :\n String(n.label || '').toLowerCase().includes('block') ? 'warning' :\n String(n.label || '').toLowerCase().includes('risk') ? 'warning' :\n 'info';\n const Icon =\n tone === 'danger' ? AlertTriangle :\n tone === 'warning' ? AlertTriangle :\n ActivityIcon;\n return (\n <div\n key={i}\n role=\"alert\"\n style={{\n padding: 'var(--space-3)',\n border: `1px solid color-mix(in oklch, var(--${tone}) 40%, var(--border))`,\n borderRadius: 'var(--radius-md)',\n background: `color-mix(in oklch, var(--${tone}) 8%, var(--surface-0))`,\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-2)',\n }}\n >\n <Icon size={16} aria-hidden style={{ color: `var(--${tone})`, marginTop: 2, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600, color: 'var(--fg)' }}>{n.label}</div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>{n.value}</div>\n {typeof n.hint === 'string' && n.hint.length > 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>{n.hint}</div>\n )}\n </div>\n </div>\n );\n })\n )}\n </Stack>\n </CardBody>\n </Card>\n </div>\n\n {Array.isArray(snapshot.data?.projects) && snapshot.data.projects.length > 0 && (\n <Card>\n <CardHeader title=\"Active projects\" />\n <CardBody>\n <Stack gap={1}>\n {snapshot.data.projects.map((p) => (\n <div\n key={p.id}\n style={{\n padding: 'var(--space-2) var(--space-3)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-0)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{p.name || p.id}</div>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{p.cwd}</code>\n </div>\n {snapshot.data?.activeProject?.id === p.id && (\n <Badge tone=\"success\" dot>active</Badge>\n )}\n </div>\n ))}\n </Stack>\n </CardBody>\n </Card>\n )}\n </Stack>\n );\n}"],"names":["ICON_MAP","GitMerge","GitPullRequest","CheckCircle2","AlertTriangle","Bot","Wrench","ActivityIcon","iconFor","key","Icon","jsx","eventToItem","e","idx","ts","meta","OverviewView","snapshot","useFetch","activity","usage","tokenSeries","useMemo","days","_a","d","liveEvents","setLiveEvents","useState","onEvent","useCallback","msg","ev","prev","useWsMessage","items","ov","tasks","goals","agents","tokens","jsxs","Stack","ViewHeader","Badge","StatGrid","StatTile","Sparkline","Card","CardHeader","CardBody","ActivityFeed","n","i","tone","_b","p"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as v,j as r}from"./cmdk-DVxytz9i.js";import{g}from"./main-CdOm1Pj9.js";const h={accent:"var(--accent)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},x=v.forwardRef(function(s,e){const{value:t,max:i=1,tone:n="accent",showLabel:o,height:c=6,className:d,style:l,...u}=s,a=Math.min(100,Math.max(0,t/i*100));return r.jsxs("div",{ref:e,className:g("v8-progress",d),style:{position:"relative",display:"flex",alignItems:"center",gap:"var(--space-2)",...l},...u,children:[r.jsx("div",{style:{flex:1,height:c,background:"var(--surface-2)",borderRadius:"var(--radius-pill)",overflow:"hidden"},children:r.jsx("div",{style:{width:`${a}%`,height:"100%",background:h[n],borderRadius:"var(--radius-pill)",transition:"width var(--motion-base) var(--ease-out)"}})}),o===!0&&r.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums",minWidth:32,textAlign:"right"},children:[Math.round(a),"%"]})]})});export{x as P};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar-B-h60LKA.js","sources":["../../src/web/v8/ui/data/ProgressBar.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ProgressBar — linear progress indicator.\n *\n * Use cases: Goal progress, task completion, capacity usage.\n * For circular progress use the inline circle ring (S9) or a third-party.\n */\n\nexport interface ProgressBarProps extends HTMLAttributes<HTMLDivElement> {\n /** 0..1 (or 0..100 if `max` is 100). */\n value: number;\n max?: number;\n /** Tone color for the filled portion. */\n tone?: 'accent' | 'info' | 'success' | 'warning' | 'danger';\n /** Render the value as a percentage label on the right. */\n showLabel?: boolean;\n /** Bar height in px. */\n height?: number;\n}\n\nconst TONE_BG: Record<NonNullable<ProgressBarProps['tone']>, string> = {\n accent: 'var(--accent)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ProgressBar = forwardRef<HTMLDivElement, ProgressBarProps>(function ProgressBar(\n props,\n ref,\n) {\n const {\n value,\n max = 1,\n tone = 'accent',\n showLabel,\n height = 6,\n className,\n style,\n ...rest\n } = props;\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n return (\n <div\n ref={ref}\n className={cx('v8-progress', className)}\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n ...style,\n }}\n {...rest}\n >\n <div\n style={{\n flex: 1,\n height,\n background: 'var(--surface-2)',\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${pct}%`,\n height: '100%',\n background: TONE_BG[tone],\n borderRadius: 'var(--radius-pill)',\n transition: 'width var(--motion-base) var(--ease-out)',\n }}\n />\n </div>\n {showLabel === true && (\n <span\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n minWidth: 32,\n textAlign: 'right',\n }}\n >\n {Math.round(pct)}%\n </span>\n )}\n </div>\n );\n});"],"names":["TONE_BG","ProgressBar","forwardRef","props","ref","value","max","tone","showLabel","height","className","style","rest","pct","jsxs","cx","jsx"],"mappings":"gFAsBA,MAAMA,EAAiE,CACrE,OAAQ,gBACR,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEaC,EAAcC,EAAAA,WAA6C,SACtEC,EACAC,EACA,CACA,KAAM,CACJ,MAAAC,EACA,IAAAC,EAAM,EACN,KAAAC,EAAO,SACP,UAAAC,EACA,OAAAC,EAAS,EACT,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDT,EACEU,EAAM,KAAK,IAAI,IAAK,KAAK,IAAI,EAAIR,EAAQC,EAAO,GAAG,CAAC,EAC1D,OACEQ,EAAAA,KAAC,MAAA,CACC,IAAAV,EACA,UAAWW,EAAG,cAAeL,CAAS,EACtC,MAAO,CACL,SAAU,WACV,QAAS,OACT,WAAY,SACZ,IAAK,iBACL,GAAGC,CAAA,EAEJ,GAAGC,EAEJ,SAAA,CAAAI,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,KAAM,EACN,OAAAP,EACA,WAAY,mBACZ,aAAc,qBACd,SAAU,QAAA,EAGZ,SAAAO,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO,GAAGH,CAAG,IACb,OAAQ,OACR,WAAYb,EAAQO,CAAI,EACxB,aAAc,qBACd,WAAY,0CAAA,CACd,CAAA,CACF,CAAA,EAEDC,IAAc,IACbM,EAAAA,KAAC,OAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,mBAAoB,eACpB,SAAU,GACV,UAAW,OAAA,EAGZ,SAAA,CAAA,KAAK,MAAMD,CAAG,EAAE,GAAA,CAAA,CAAA,CACnB,CAAA,CAAA,CAIR,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{r as n,j as e}from"./cmdk-DVxytz9i.js";import{c as P,u as B,a as L,S as d,I as o,d as r,w as N,h as w,B as V,i as l,F as h}from"./main-CdOm1Pj9.js";import{V as q}from"./ViewHeader-BqIPVKuG.js";import{L as H}from"./ListHeader-BGjm11Z0.js";import{C as W,b as J}from"./Card-Tyboihu7.js";import{I as b}from"./Input-BbFUDQnS.js";import{S as Z,a as G,b as K}from"./Sheet-DH-WNJ3Y.js";import{E as Q}from"./EmptyState-DZ2ouKwd.js";import{R as U}from"./refresh-ccw-CHMprsm5.js";import{T as X}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 z=P("FolderPlus",[["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"M9 13h6",key:"1uhe8q"}],["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);/**
|
|
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 Y=P("ScanSearch",[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"m16 16-1.9-1.9",key:"1dq9hf"}]]);function de(){var k,C;const p=B("/api/projects"),[A,j]=n.useState(!1),[m,v]=n.useState(""),[g,x]=n.useState(""),[f,y]=n.useState(!1),[S,s]=n.useState(null),[R,u]=n.useState(null),c=((k=p.data)==null?void 0:k.projects)??[],E=((C=c.find(t=>t.active))==null?void 0:C.id)??null,i=n.useCallback(()=>{p.refetch()},[p]);L("project:change",i);const M=async()=>{const t=m.trim();if(!(!t||f)){y(!0),s(null);try{await l("/api/projects",{method:"POST",body:{path:t,name:g.trim()||null}}),v(""),x(""),j(!1),i()}catch(a){s((a instanceof h,a.message))}finally{y(!1)}}},D=async t=>{s(null);try{await l(`/api/projects/${t}/activate`,{method:"POST",body:{}}),i()}catch(a){s((a instanceof h,a.message))}},I=async t=>{s(null);try{await l(`/api/projects/${t}`,{method:"DELETE"}),u(null),i()}catch(a){s((a instanceof h,a.message))}},T=async()=>{s(null);try{await l("/api/projects/auto-detect",{method:"POST",body:{}}),i()}catch(t){s((t instanceof h,t.message))}},$=async()=>{s(null);try{await l("/api/projects/scan",{method:"POST",body:{}}),i()}catch(t){s((t instanceof h,t.message))}};return e.jsxs(d,{gap:4,"data-testid":"projects-view",children:[e.jsx(q,{title:"Projects",description:"Registered project roots. One is active at a time — every active-project endpoint scopes to it.",actions:e.jsxs(o,{align:"center",gap:2,children:[S!==null&&e.jsx("span",{role:"alert","data-testid":"projects-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:S}),e.jsxs(r,{variant:"ghost",onClick:()=>void $(),"data-testid":"projects-scan",children:[e.jsx(Y,{size:14,"aria-hidden":!0})," Scan configured dir"]}),e.jsxs(r,{variant:"ghost",onClick:()=>void T(),"data-testid":"projects-auto-detect",children:[e.jsx(N,{size:14,"aria-hidden":!0})," Auto-detect cwd"]}),e.jsxs(r,{variant:"ghost",onClick:()=>void i(),"data-testid":"projects-refresh",children:[e.jsx(U,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(r,{variant:"primary",onClick:()=>j(!0),"data-testid":"projects-add",children:[e.jsx(z,{size:14,"aria-hidden":!0})," Add project"]})]})}),e.jsx(H,{title:"Registered",count:c.length,testid:"projects-list-header"}),e.jsx(W,{variant:"default",children:e.jsx(J,{children:p.loading&&c.length===0?e.jsxs(d,{gap:2,children:[e.jsx(w,{style:{height:36}}),e.jsx(w,{style:{height:36}})]}):c.length===0?e.jsx(Q,{icon:e.jsx(z,{size:28,"aria-hidden":!0}),title:"No projects yet",description:"Add a path, auto-detect the server cwd, or scan the configured projects directory."}):e.jsx(d,{gap:2,children:c.map(t=>{const a=t.id===E,F=R===t.id;return e.jsxs("div",{"data-testid":`project-row-${t.id}`,style:{padding:"var(--space-3)",borderRadius:"var(--radius-md)",border:a?"1px solid var(--accent)":"1px solid var(--border)",background:a?"color-mix(in oklch, var(--accent) 12%, transparent)":"var(--surface-0)"},children:[e.jsxs(o,{align:"center",justify:"between",gap:3,children:[e.jsxs(d,{gap:1,style:{minWidth:0},children:[e.jsxs(o,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.name||t.path.split("/").pop()||t.id}),a&&e.jsx(V,{tone:"success",children:"Active"})]}),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",overflowWrap:"anywhere"},children:t.path})]}),e.jsxs(o,{gap:1,children:[!a&&e.jsx(r,{variant:"primary",onClick:()=>void D(t.id),"data-testid":`project-activate-${t.id}`,children:"Activate"}),e.jsxs(r,{variant:"ghost",onClick:()=>u(O=>O===t.id?null:t.id),"data-testid":`project-delete-${t.id}`,"aria-label":`Remove project ${t.id}`,children:[e.jsx(X,{size:14,"aria-hidden":!0})," Remove"]})]})]}),F&&e.jsxs(o,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(r,{variant:"danger",onClick:()=>void I(t.id),"data-testid":`project-confirm-delete-${t.id}`,children:"Confirm remove"}),e.jsx(r,{variant:"ghost",onClick:()=>u(null),"data-testid":`project-cancel-delete-${t.id}`,children:"Cancel"})]})]},t.id)})})})}),e.jsx(Z,{open:A,onOpenChange:j,children:e.jsx(G,{side:"right",title:"Add project",description:"Register an existing directory as a project root.",children:e.jsxs(d,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Path"}),e.jsx(b,{placeholder:"/absolute/path/to/project",value:m,"data-testid":"projects-add-path",onChange:t=>v(t.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Display name (optional)"}),e.jsx(b,{placeholder:"My project",value:g,"data-testid":"projects-add-name",onChange:t=>x(t.target.value)})]}),e.jsxs(o,{justify:"end",gap:2,children:[e.jsx(K,{asChild:!0,children:e.jsx(r,{variant:"ghost","data-testid":"projects-add-cancel",children:"Cancel"})}),e.jsx(r,{variant:"primary",onClick:()=>void M(),disabled:f||m.trim()==="","data-testid":"projects-add-submit",children:"Add"})]})]})})})]})}export{de as ProjectsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsView-DhX5lzHS.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/folder-plus.js","../../../node_modules/lucide-react/dist/esm/icons/scan-search.js","../../src/web/v8/views/Projects/ProjectsView.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 FolderPlus = createLucideIcon(\"FolderPlus\", [\n [\"path\", { d: \"M12 10v6\", key: \"1bos4e\" }],\n [\"path\", { d: \"M9 13h6\", key: \"1uhe8q\" }],\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n]);\n\nexport { FolderPlus as default };\n//# sourceMappingURL=folder-plus.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 ScanSearch = createLucideIcon(\"ScanSearch\", [\n [\"path\", { d: \"M3 7V5a2 2 0 0 1 2-2h2\", key: \"aa7l1z\" }],\n [\"path\", { d: \"M17 3h2a2 2 0 0 1 2 2v2\", key: \"4qcy5o\" }],\n [\"path\", { d: \"M21 17v2a2 2 0 0 1-2 2h-2\", key: \"6vwrx8\" }],\n [\"path\", { d: \"M7 21H5a2 2 0 0 1-2-2v-2\", key: \"ioqczr\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"path\", { d: \"m16 16-1.9-1.9\", key: \"1dq9hf\" }]\n]);\n\nexport { ScanSearch as default };\n//# sourceMappingURL=scan-search.js.map\n","/**\n * v8/views/Projects/ProjectsView.tsx — Sprint S39, v9.3.0.\n *\n * The project registry surface. Shows every registered project,\n * lets the user mark one active, add by path (Sheet form), and\n * remove (inline confirm). Two utility actions sit in the header:\n * - Auto-detect: POST /api/projects/auto-detect (adds cwd)\n * - Scan: POST /api/projects/scan (walks the configured\n * dashboard.projectsDirectory and adds any new\n * roots it finds).\n *\n * Live refresh on the `project:change` WS event the server already\n * broadcasts from routes/projects.mjs.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { FolderPlus, RefreshCcw, ScanSearch, Sparkles, Trash2 } 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 { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.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 { Project, WsMessage } from '../../data/types.js';\n\ninterface ProjectsPayload {\n projects: Project[];\n}\n\nexport function ProjectsView(): JSX.Element {\n const payload = useFetch<ProjectsPayload>('/api/projects');\n const [adding, setAdding] = useState<boolean>(false);\n const [newPath, setNewPath] = useState<string>('');\n const [newName, setNewName] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const projects = payload.data?.projects ?? [];\n const activeId = projects.find((p) => p.active)?.id ?? null;\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n useWsMessage('project:change', refresh);\n\n const add = async (): Promise<void> => {\n const path = newPath.trim();\n if (!path || busy) return;\n setBusy(true);\n setError(null);\n try {\n await fetchJson<Project>('/api/projects', {\n method: 'POST',\n body: { path, name: newName.trim() || null },\n });\n setNewPath('');\n setNewName('');\n setAdding(false);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const activate = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/projects/${id}/activate`, { method: 'POST', body: {} });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const remove = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/projects/${id}`, { method: 'DELETE' });\n setConfirmDeleteId(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const autoDetect = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/projects/auto-detect', { method: 'POST', body: {} });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const scan = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/projects/scan', { method: 'POST', body: {} });\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=\"projects-view\">\n <ViewHeader\n title=\"Projects\"\n description=\"Registered project roots. One is active at a time — every active-project endpoint scopes to it.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"projects-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void scan()} data-testid=\"projects-scan\">\n <ScanSearch size={14} aria-hidden /> Scan configured dir\n </Button>\n <Button variant=\"ghost\" onClick={() => void autoDetect()} data-testid=\"projects-auto-detect\">\n <Sparkles size={14} aria-hidden /> Auto-detect cwd\n </Button>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"projects-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"projects-add\">\n <FolderPlus size={14} aria-hidden /> Add project\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Registered\" count={projects.length} testid=\"projects-list-header\" />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && projects.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : projects.length === 0 ? (\n <EmptyState\n icon={<FolderPlus size={28} aria-hidden />}\n title=\"No projects yet\"\n description=\"Add a path, auto-detect the server cwd, or scan the configured projects directory.\"\n />\n ) : (\n <Stack gap={2}>\n {projects.map((p) => {\n const isActive = p.id === activeId;\n const isConfirmingDelete = confirmDeleteId === p.id;\n return (\n <div\n key={p.id}\n data-testid={`project-row-${p.id}`}\n style={{\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-md)',\n border: isActive ? '1px solid var(--accent)' : '1px solid var(--border)',\n background: isActive ? 'color-mix(in oklch, var(--accent) 12%, transparent)' : 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>\n {p.name || p.path.split('/').pop() || p.id}\n </strong>\n {isActive && <Badge tone=\"success\">Active</Badge>}\n </Inline>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', overflowWrap: 'anywhere' }}>\n {p.path}\n </span>\n </Stack>\n <Inline gap={1}>\n {!isActive && (\n <Button variant=\"primary\" onClick={() => void activate(p.id)} data-testid={`project-activate-${p.id}`}>\n Activate\n </Button>\n )}\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDeleteId((cur) => (cur === p.id ? null : p.id))}\n data-testid={`project-delete-${p.id}`}\n aria-label={`Remove project ${p.id}`}\n >\n <Trash2 size={14} aria-hidden /> Remove\n </Button>\n </Inline>\n </Inline>\n {isConfirmingDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Button variant=\"danger\" onClick={() => void remove(p.id)} data-testid={`project-confirm-delete-${p.id}`}>\n Confirm remove\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDeleteId(null)} data-testid={`project-cancel-delete-${p.id}`}>\n Cancel\n </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 project\" description=\"Register an existing directory as a project root.\">\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)' }}>Path</span>\n <Input\n placeholder=\"/absolute/path/to/project\"\n value={newPath}\n data-testid=\"projects-add-path\"\n onChange={(e) => setNewPath((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Display name (optional)</span>\n <Input\n placeholder=\"My project\"\n value={newName}\n data-testid=\"projects-add-name\"\n onChange={(e) => setNewName((e.target as HTMLInputElement).value)}\n />\n </label>\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" data-testid=\"projects-add-cancel\">Cancel</Button>\n </SheetClose>\n <Button variant=\"primary\" onClick={() => void add()} disabled={busy || newPath.trim() === ''} data-testid=\"projects-add-submit\">\n Add\n </Button>\n </Inline>\n </Stack>\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["FolderPlus","createLucideIcon","ScanSearch","ProjectsView","payload","useFetch","adding","setAdding","useState","newPath","setNewPath","newName","setNewName","busy","setBusy","error","setError","confirmDeleteId","setConfirmDeleteId","projects","_a","activeId","_b","p","refresh","useCallback","useWsMessage","add","path","fetchJson","err","FetchError","activate","id","remove","autoDetect","scan","jsxs","Stack","jsx","ViewHeader","Inline","Button","Sparkles","RefreshCcw","ListHeader","Card","CardBody","Skeleton","EmptyState","isActive","isConfirmingDelete","Badge","cur","Trash2","Sheet","SheetContent","Input","e","SheetClose"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{r as c,j as r}from"./cmdk-DVxytz9i.js";import{c as P,u as R,i as n,S as m,I as l,d,w as B,h as z,j as M,F as u}from"./main-CdOm1Pj9.js";import{V as N}from"./ViewHeader-BqIPVKuG.js";import{L as F}from"./ListHeader-BGjm11Z0.js";import{C as x,b as j}from"./Card-Tyboihu7.js";import{E as H}from"./EmptyState-DZ2ouKwd.js";import{R as _}from"./refresh-ccw-CHMprsm5.js";import{P as J}from"./plus-M6LYiKX8.js";import{R as W}from"./rotate-cw-DHooc0Tx.js";import{P as Y}from"./pencil-BanqaMw7.js";import{P as q}from"./power-off-NOJRLAIs.js";import{P as G}from"./power-DP5x_SRF.js";import{T as Q}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 $=P("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);/**
|
|
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 X=P("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);function he(){var S;const f=R("/api/providers"),o=R("/api/providers/active"),[L,g]=c.useState(null),[E,b]=c.useState({}),[k,s]=c.useState(null),[y,I]=c.useState(null),[w,C]=c.useState(!1),v=c.useMemo(()=>{var e;return((e=f.data)==null?void 0:e.providers)??[]},[f.data]),h=c.useCallback(()=>{f.refetch(),o.refetch()},[f,o]);c.useEffect(()=>{if(!v.length)return;let e=!1;return(async()=>{const a=await Promise.all(v.map(async t=>{try{const i=await n(`/api/providers/${t.id}/active-key`);return[t.id,"active"in i?i.active:null]}catch{return[t.id,null]}}));if(!e){const t={};for(const[i,p]of a)t[i]=p;b(t)}})(),()=>{e=!0}},[v]);const A=async e=>{s(null);try{await n(`/api/providers/${e}/rotate`,{method:"POST"}),g(null),h();try{const a=await n(`/api/providers/${e}/active-key`);b(t=>({...t,[e]:a.active}))}catch{}}catch(a){s((a instanceof u,a.message))}},U=async e=>{const a=window.prompt(`Env var name to add to ${e} (e.g. ${e.toUpperCase()}_KEY_2)`);if(!(a!=null&&a.trim()))return;const t=window.prompt("Label (optional)")||void 0;s(null);try{await n(`/api/providers/${e}/keys`,{method:"POST",body:{envVar:a,label:t}}),h()}catch(i){s((i instanceof u,i.message))}},T=async()=>{C(!0),s(null);try{const e=await n("/api/providers/auto-detect");I({providers:e.providers})}catch(e){s((e instanceof u,e.message))}finally{C(!1)}},D=async()=>{const e=window.prompt("Provider id (lowercase, e.g. openai)");if(!(e!=null&&e.trim()))return;const a=window.prompt("Display name")||e,t=window.prompt("Base URL (optional)")||"",i=window.prompt("API key or env:VAR marker")||"";s(null);try{await n("/api/providers",{method:"POST",body:{id:e,name:a,baseURL:t,apiKey:i}}),h()}catch(p){s((p instanceof u,p.message))}},K=async e=>{const a=window.prompt(`Rename ${e.id}`,e.name||e.id);if(!(a!=null&&a.trim()))return;const t=window.prompt("Base URL",e.baseURL||"");s(null);try{await n(`/api/providers/${encodeURIComponent(e.id)}`,{method:"PUT",body:{name:a,baseURL:t??""}}),h()}catch(i){s((i instanceof u,i.message))}},V=async e=>{s(null);try{await n(`/api/providers/${encodeURIComponent(e)}`,{method:"DELETE"}),h()}catch(a){s((a instanceof u,a.message))}},O=async(e,a)=>{s(null);try{await n(`/api/providers/${encodeURIComponent(e)}/${a?"disable":"enable"}`,{method:"POST"}),h()}catch(t){s((t instanceof u,t.message))}};return r.jsxs(m,{gap:4,"data-testid":"providers-view",children:[r.jsx(N,{title:"Providers",description:"Configured LLM providers + active key rotation.",actions:r.jsxs(l,{align:"center",gap:2,children:[k!==null&&r.jsx("span",{role:"alert","data-testid":"providers-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:k}),r.jsxs(d,{variant:"ghost",onClick:()=>void h(),"data-testid":"providers-refresh",children:[r.jsx(_,{size:14,"aria-hidden":!0})," Refresh"]}),r.jsxs(d,{variant:"primary",onClick:()=>void T(),disabled:w,"data-testid":"providers-auto-detect",children:[r.jsx(B,{size:14,"aria-hidden":!0})," ",w?"Probing…":"Auto-detect"]}),r.jsxs(d,{variant:"primary",onClick:()=>void D(),"data-testid":"providers-create",children:[r.jsx(J,{size:14,"aria-hidden":!0})," New provider"]})]})}),r.jsx(F,{title:"Configured",count:v.length,description:(S=o.data)!=null&&S.providerId?`active: ${o.data.providerId}`:void 0,testid:"providers-list-header"}),o.data&&(o.data.providerId!==null||o.data.modelId!==null)&&r.jsx(x,{variant:"default",children:r.jsx(j,{children:r.jsx(l,{align:"center",justify:"between",gap:2,children:r.jsxs(l,{align:"center",gap:2,children:[r.jsx(X,{size:14,"aria-hidden":!0,style:{color:"var(--accent)"}}),r.jsx("strong",{children:"Active default:"}),r.jsx("code",{"data-testid":"providers-active-provider",children:o.data.providerId??"—"}),r.jsx("span",{style:{color:"var(--fg-muted)"},children:"·"}),r.jsx("code",{"data-testid":"providers-active-model",children:o.data.modelId??"—"}),o.data.source&&r.jsxs("span",{style:{color:"var(--fg-subtle)",fontSize:"var(--fs-12)"},children:["(",o.data.source,")"]})]})})})}),y!==null&&r.jsx(x,{variant:"default",children:r.jsx(j,{children:r.jsxs(m,{gap:1,children:[r.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Auto-detect result"}),r.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[y.providers.length," candidate",y.providers.length===1?"":"s"," from env + config."]})]})})}),r.jsx(x,{variant:"default",children:r.jsx(j,{children:f.loading&&v.length===0?r.jsxs(m,{gap:1,children:[r.jsx(z,{style:{height:56}}),r.jsx(z,{style:{height:56}})]}):v.length===0?r.jsx(H,{icon:r.jsx(M,{size:28,"aria-hidden":!0}),title:"No providers",description:"Run Auto-detect or add via Config → Providers."}):r.jsx(m,{gap:1,children:v.map(e=>{const a=L===e.id,t=E[e.id];return r.jsxs("div",{"data-testid":`provider-row-${e.id}`,style:{padding:"var(--space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[r.jsxs(l,{align:"center",justify:"between",gap:2,children:[r.jsxs(m,{gap:0,children:[r.jsxs(l,{align:"center",gap:2,children:[r.jsx("strong",{children:e.name||e.id}),r.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.id}),e.source&&r.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",e.source]}),e.active&&r.jsx("span",{"data-testid":`provider-active-${e.id}`,style:{fontSize:"var(--fs-11)",color:"var(--success)",fontWeight:600},children:"ACTIVE"})]}),e.baseURL&&r.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.baseURL})]}),r.jsxs(l,{gap:1,children:[r.jsxs(d,{variant:"ghost",onClick:()=>g(i=>i===e.id?null:e.id),"data-testid":`provider-rotate-${e.id}`,"aria-label":`Rotate ${e.id}`,disabled:!e.keys||e.keys.length<2,title:!e.keys||e.keys.length<2?"Need ≥2 keys to rotate":"Rotate active key",children:[r.jsx(W,{size:14,"aria-hidden":!0})," Rotate"]}),r.jsxs(d,{variant:"primary",onClick:()=>void U(e.id),"data-testid":`provider-add-key-${e.id}`,"aria-label":`Add key to ${e.id}`,children:[r.jsx($,{size:14,"aria-hidden":!0})," Add key"]}),r.jsx(d,{variant:"ghost",onClick:()=>void K(e),"data-testid":`provider-edit-${e.id}`,"aria-label":`Edit ${e.id}`,children:r.jsx(Y,{size:14,"aria-hidden":!0})}),r.jsx(d,{variant:"ghost",onClick:()=>void O(e.id,e.enabled??!0),"data-testid":`provider-toggle-${e.id}`,"aria-label":e.enabled??!0?`Disable ${e.id}`:`Enable ${e.id}`,children:e.enabled??!0?r.jsx(q,{size:14,"aria-hidden":!0}):r.jsx(G,{size:14,"aria-hidden":!0})}),r.jsx(d,{variant:"ghost",onClick:()=>void V(e.id),"data-testid":`provider-delete-${e.id}`,"aria-label":`Delete ${e.id}`,children:r.jsx(Q,{size:14,"aria-hidden":!0})})]})]}),r.jsx("div",{"data-testid":`provider-active-key-${e.id}`,style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:r.jsxs(l,{align:"center",gap:2,children:[r.jsx($,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t===void 0?r.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Probing active key…"}):t===null?r.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No active key"}):r.jsxs(l,{align:"center",gap:2,"data-testid":`provider-active-key-detail-${e.id}`,children:[r.jsx("code",{style:{fontSize:"var(--fs-12)"},children:t.envVar}),t.label&&r.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",t.label]}),t.status&&r.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",t.status]}),r.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.keyPreview})]})]})}),a&&r.jsxs(l,{gap:1,style:{marginTop:"var(--space-1)"},children:[r.jsx(d,{variant:"primary",onClick:()=>void A(e.id),"data-testid":`provider-confirm-rotate-${e.id}`,children:"Confirm rotate"}),r.jsx(d,{variant:"ghost",onClick:()=>g(null),children:"Cancel"})]})]},e.id)})})})})]})}export{he as ProvidersView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvidersView-CJMX7jm9.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/key-round.js","../../../node_modules/lucide-react/dist/esm/icons/star.js","../../src/web/v8/views/Providers/ProvidersView.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 KeyRound = createLucideIcon(\"KeyRound\", [\n [\n \"path\",\n {\n d: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n]);\n\nexport { KeyRound as default };\n//# sourceMappingURL=key-round.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 Star = createLucideIcon(\"Star\", [\n [\n \"path\",\n {\n d: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n]);\n\nexport { Star as default };\n//# sourceMappingURL=star.js.map\n","/**\n * v8/views/Providers/ProvidersView.tsx — Sprint S42, v9.3.0.\n *\n * Provider list pulled from /api/providers (aggregated). Per-row:\n * - active-key card (GET /api/providers/:id/active-key) with masked\n * key preview + label + status\n * - rotate button (POST /api/providers/:id/rotate) with inline confirm\n *\n * Header actions:\n * - Active default card (GET /api/providers/active)\n * - Auto-detect (GET /api/providers/auto-detect)\n *\n * Inline confirm row pattern; no window.confirm.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { KeyRound, Pencil, Plus, Power, PowerOff, RotateCw, Sparkles, Star, Trash2, RefreshCcw, Cpu } 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 { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.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 Provider {\n id: string;\n name?: string;\n source?: string;\n baseURL?: string;\n models?: string[];\n keys?: ProviderKey[];\n active?: boolean;\n enabled?: boolean;\n}\n\ninterface ProviderKey {\n envVar?: string;\n label?: string;\n status?: string;\n}\n\ninterface ActiveKey {\n envVar: string;\n label?: string;\n status?: string;\n keyPreview: string;\n keySet: boolean;\n}\n\ninterface ActiveDefault {\n providerId: string | null;\n modelId: string | null;\n source?: string | null;\n}\n\nexport function ProvidersView(): JSX.Element {\n const payload = useFetch<{ providers: Provider[]; count: number }>('/api/providers');\n const activePayload = useFetch<ActiveDefault>('/api/providers/active');\n const [confirmRotate, setConfirmRotate] = useState<string | null>(null);\n const [activeKeys, setActiveKeys] = useState<Record<string, ActiveKey | null>>({});\n const [error, setError] = useState<string | null>(null);\n const [autoDetect, setAutoDetect] = useState<{ providers: Provider[] } | null>(null);\n const [probing, setProbing] = useState<boolean>(false);\n\n const providers = useMemo<Provider[]>(() => payload.data?.providers ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); void activePayload.refetch(); }, [payload, activePayload]);\n\n // Fetch the active key for each provider (lazy, in parallel).\n useEffect(() => {\n if (!providers.length) return;\n let cancelled = false;\n (async () => {\n const results = await Promise.all(\n providers.map(async (p) => {\n try {\n const r = await fetchJson<{ ok: boolean; active: ActiveKey } | { ok: false; error: string }>(`/api/providers/${p.id}/active-key`);\n return [p.id, ('active' in r ? r.active : null)] as const;\n } catch {\n return [p.id, null] as const;\n }\n }),\n );\n if (!cancelled) {\n const map: Record<string, ActiveKey | null> = {};\n for (const [id, ak] of results) map[id] = ak;\n setActiveKeys(map);\n }\n })();\n return () => { cancelled = true; };\n }, [providers]);\n\n const rotate = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/providers/${id}/rotate`, { method: 'POST' });\n setConfirmRotate(null);\n refresh();\n // Re-fetch the new active key for this row.\n try {\n const r = await fetchJson<{ ok: boolean; active: ActiveKey }>(`/api/providers/${id}/active-key`);\n setActiveKeys((m) => ({ ...m, [id]: r.active }));\n } catch { /* ignore */ }\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const addKey = async (id: string): Promise<void> => {\n const envVar = window.prompt(`Env var name to add to ${id} (e.g. ${id.toUpperCase()}_KEY_2)`);\n if (!envVar?.trim()) return;\n const label = window.prompt('Label (optional)') || undefined;\n setError(null);\n try {\n await fetchJson(`/api/providers/${id}/keys`, { method: 'POST', body: { envVar, label } });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const runAutoDetect = async (): Promise<void> => {\n setProbing(true);\n setError(null);\n try {\n const r = await fetchJson<{ providers: Provider[] }>('/api/providers/auto-detect');\n setAutoDetect({ providers: r.providers });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setProbing(false);\n }\n };\n\n const createProvider = async (): Promise<void> => {\n const id = window.prompt('Provider id (lowercase, e.g. openai)');\n if (!id?.trim()) return;\n const name = window.prompt('Display name') || id;\n const baseURL = window.prompt('Base URL (optional)') || '';\n const apiKey = window.prompt('API key or env:VAR marker') || '';\n setError(null);\n try {\n await fetchJson('/api/providers', { method: 'POST', body: { id, name, baseURL, apiKey } });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const editProvider = async (p: Provider): Promise<void> => {\n const name = window.prompt(`Rename ${p.id}`, p.name || p.id);\n if (!name?.trim()) return;\n const baseURL = window.prompt('Base URL', p.baseURL || '');\n setError(null);\n try {\n await fetchJson(`/api/providers/${encodeURIComponent(p.id)}`, {\n method: 'PUT',\n body: { name, baseURL: baseURL ?? '' },\n });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const deleteProvider = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/providers/${encodeURIComponent(id)}`, { method: 'DELETE' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const toggleEnabled = async (id: string, currentlyEnabled: boolean): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/providers/${encodeURIComponent(id)}/${currentlyEnabled ? 'disable' : 'enable'}`, { method: 'POST' });\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=\"providers-view\">\n <ViewHeader\n title=\"Providers\"\n description=\"Configured LLM providers + active key rotation.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"providers-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"providers-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void runAutoDetect()} disabled={probing} data-testid=\"providers-auto-detect\">\n <Sparkles size={14} aria-hidden /> {probing ? 'Probing…' : 'Auto-detect'}\n </Button>\n <Button variant=\"primary\" onClick={() => void createProvider()} data-testid=\"providers-create\">\n <Plus size={14} aria-hidden /> New provider\n </Button>\n </Inline>\n }\n />\n <ListHeader\n title=\"Configured\"\n count={providers.length}\n description={activePayload.data?.providerId ? `active: ${activePayload.data.providerId}` : undefined}\n testid=\"providers-list-header\"\n />\n\n {activePayload.data && (activePayload.data.providerId !== null || activePayload.data.modelId !== null) && (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Star size={14} aria-hidden style={{ color: 'var(--accent)' }} />\n <strong>Active default:</strong>\n <code data-testid=\"providers-active-provider\">{activePayload.data.providerId ?? '—'}</code>\n <span style={{ color: 'var(--fg-muted)' }}>·</span>\n <code data-testid=\"providers-active-model\">{activePayload.data.modelId ?? '—'}</code>\n {activePayload.data.source && (\n <span style={{ color: 'var(--fg-subtle)', fontSize: 'var(--fs-12)' }}>({activePayload.data.source})</span>\n )}\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n )}\n\n {autoDetect !== null && (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Auto-detect result</strong>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {autoDetect.providers.length} candidate{autoDetect.providers.length === 1 ? '' : 's'} from env + config.\n </span>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && providers.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 56 }} />\n <Skeleton style={{ height: 56 }} />\n </Stack>\n ) : providers.length === 0 ? (\n <EmptyState icon={<Cpu size={28} aria-hidden />} title=\"No providers\" description=\"Run Auto-detect or add via Config → Providers.\" />\n ) : (\n <Stack gap={1}>\n {providers.map((p) => {\n const isConfirming = confirmRotate === p.id;\n const ak = activeKeys[p.id];\n return (\n <div\n key={p.id}\n data-testid={`provider-row-${p.id}`}\n style={{\n padding: 'var(--space-3)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0}>\n <Inline align=\"center\" gap={2}>\n <strong>{p.name || p.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{p.id}</code>\n {p.source && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {p.source}</span>}\n {p.active && (\n <span data-testid={`provider-active-${p.id}`} style={{ fontSize: 'var(--fs-11)', color: 'var(--success)', fontWeight: 600 }}>ACTIVE</span>\n )}\n </Inline>\n {p.baseURL && <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{p.baseURL}</code>}\n </Stack>\n <Inline gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmRotate((cur) => (cur === p.id ? null : p.id))}\n data-testid={`provider-rotate-${p.id}`}\n aria-label={`Rotate ${p.id}`}\n disabled={!p.keys || p.keys.length < 2}\n title={!p.keys || p.keys.length < 2 ? 'Need ≥2 keys to rotate' : 'Rotate active key'}\n >\n <RotateCw size={14} aria-hidden /> Rotate\n </Button>\n <Button\n variant=\"primary\"\n onClick={() => void addKey(p.id)}\n data-testid={`provider-add-key-${p.id}`}\n aria-label={`Add key to ${p.id}`}\n >\n <KeyRound size={14} aria-hidden /> Add key\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => void editProvider(p)}\n data-testid={`provider-edit-${p.id}`}\n aria-label={`Edit ${p.id}`}\n >\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => void toggleEnabled(p.id, p.enabled ?? true)}\n data-testid={`provider-toggle-${p.id}`}\n aria-label={(p.enabled ?? true) ? `Disable ${p.id}` : `Enable ${p.id}`}\n >\n {(p.enabled ?? true) ? <PowerOff size={14} aria-hidden /> : <Power size={14} aria-hidden />}\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => void deleteProvider(p.id)}\n data-testid={`provider-delete-${p.id}`}\n aria-label={`Delete ${p.id}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n\n {/* Active-key sub-row */}\n <div data-testid={`provider-active-key-${p.id}`} style={{ marginTop: 'var(--space-2)', padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <KeyRound size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n {ak === undefined ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>Probing active key…</span>\n ) : ak === null ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>No active key</span>\n ) : (\n <Inline align=\"center\" gap={2} data-testid={`provider-active-key-detail-${p.id}`}>\n <code style={{ fontSize: 'var(--fs-12)' }}>{ak.envVar}</code>\n {ak.label && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {ak.label}</span>}\n {ak.status && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {ak.status}</span>}\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{ak.keyPreview}</code>\n </Inline>\n )}\n </Inline>\n </div>\n\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"primary\" onClick={() => void rotate(p.id)} data-testid={`provider-confirm-rotate-${p.id}`}>\n Confirm rotate\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmRotate(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["KeyRound","createLucideIcon","Star","ProvidersView","payload","useFetch","activePayload","confirmRotate","setConfirmRotate","useState","activeKeys","setActiveKeys","error","setError","autoDetect","setAutoDetect","probing","setProbing","providers","useMemo","_a","refresh","useCallback","useEffect","cancelled","results","p","r","fetchJson","map","id","ak","rotate","m","err","FetchError","addKey","envVar","label","runAutoDetect","createProvider","name","baseURL","apiKey","editProvider","deleteProvider","toggleEnabled","currentlyEnabled","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Sparkles","Plus","ListHeader","Card","CardBody","Skeleton","EmptyState","Cpu","isConfirming","cur","RotateCw","Pencil","PowerOff","Power","Trash2"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as d,j as e}from"./cmdk-DVxytz9i.js";import{u as P,a as U,S as r,d as l,h as $,I as m,B as u,i as p,F as f}from"./main-CdOm1Pj9.js";import{G as A}from"./Grid-CiRyhAgR.js";import{V as B}from"./ViewHeader-BqIPVKuG.js";import{C as b,b as T}from"./Card-Tyboihu7.js";import{S as D}from"./Switch-BItGrPqr.js";import{T as L}from"./Textarea-qYDf3yds.js";import{S as N,a as O}from"./Sheet-DH-WNJ3Y.js";import{I as x}from"./Input-BbFUDQnS.js";import{P as H}from"./plus-M6LYiKX8.js";import{C as y}from"./clock-OuficfgH.js";import{P as k}from"./play-CawUZ02_.js";import{R as V}from"./refresh-cw-1RBqDKgJ.js";import{T as G}from"./trash-2-CL4khSRv.js";import"./index-CASP1n-5.js";const w={interval:"Interval",cron:"Cron",once:"One-time"},M={interval:V,cron:y,once:k};function Y({sched:i}){return i.enabled?i.lastError?e.jsx(u,{tone:"danger",children:"error"}):i.lastRun===null?e.jsx(u,{tone:"info",children:"never run"}):e.jsx(u,{tone:"success",children:"active"}):e.jsx(u,{tone:"neutral",children:"disabled"})}function oe(){const i=P("/api/schedules"),[j,_]=d.useState([]),[a,s]=d.useState(null),[o,c]=d.useState(!1),[S,z]=d.useState(null),[C,h]=d.useState(null);U("schedules:change",d.useCallback(()=>{i.refetch()},[i]));const v=d.useMemo(()=>[...j,...i.data||[]],[j,i.data]),g=()=>{i.refetch()},E=async t=>{h(null);try{await p(`/api/schedules/${encodeURIComponent(t.id)}`,{method:"PATCH",body:{enabled:!t.enabled}}),g()}catch(n){h(n instanceof f?n.message:String(n))}},R=async t=>{h(null),c(!0);try{await p(`/api/schedules/${encodeURIComponent(t.id)}/run`,{method:"POST"}),g()}catch(n){h(n instanceof f?n.message:String(n))}finally{c(!1)}},I=async t=>{h(null),c(!0);try{await p(`/api/schedules/${encodeURIComponent(t)}`,{method:"DELETE"}),g()}catch(n){h(n instanceof f?n.message:String(n))}finally{c(!1)}},F=async()=>{if(!(!a||!a.name.trim()||!a.schedule.trim())){c(!0),z(null);try{const t={type:a.actionType};a.actionType==="agent"&&(t.prompt=a.prompt),a.actionType==="command"&&(t.command=a.prompt),a.id?await p(`/api/schedules/${encodeURIComponent(a.id)}`,{method:"PATCH",body:{name:a.name,type:a.type,schedule:a.schedule,timezone:a.timezone||"UTC",action:t}}):await p("/api/schedules",{method:"POST",body:{name:a.name,type:a.type,schedule:a.schedule,timezone:a.timezone||"UTC",action:t,enabled:!0}}),s(null),g()}catch(t){z(t instanceof f?t.message:String(t))}finally{c(!1)}}};return e.jsxs(r,{gap:5,"data-testid":"schedules-view",children:[e.jsx(B,{title:"Schedules",description:"Recurring and one-time jobs. Toggle enabled, run on demand, or create new.",actions:e.jsxs(l,{variant:"primary",size:"sm",onClick:()=>s({name:"",type:"interval",schedule:"1h",timezone:"UTC",actionType:"agent",prompt:""}),"data-testid":"schedules-new",children:[e.jsx(H,{size:14,"aria-hidden":!0})," New schedule"]})}),C!==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 var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:C}),i.loading&&v.length===0?e.jsx($,{style:{height:240}}):v.length===0?e.jsx(b,{children:e.jsx(T,{children:e.jsxs(r,{gap:1,align:"center",children:[e.jsx(y,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No schedules yet"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Create one with the button above."})]})})}):e.jsx(r,{gap:3,children:v.map(t=>{const n=M[t.type]??y;return e.jsx(b,{"data-testid":`schedule-${t.id}`,children:e.jsx(T,{children:e.jsxs(A,{cols:4,gap:3,style:{alignItems:"center"},children:[e.jsxs(r,{gap:1,children:[e.jsxs(m,{align:"center",gap:2,children:[e.jsx(n,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:t.name})]}),e.jsxs(m,{gap:2,children:[e.jsx(u,{tone:"neutral",children:w[t.type]}),e.jsx(Y,{sched:t})]})]}),e.jsxs(r,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Schedule"}),e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:t.schedule}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:t.timezone})]}),e.jsxs(r,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Next run"}),t.nextRun?e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:new Date(t.nextRun).toLocaleString()}):e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"—"}),t.lastRun&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Last: ",new Date(t.lastRun).toLocaleDateString()]})]}),e.jsxs(m,{align:"center",gap:2,justify:"end",children:[e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>s({id:t.id,name:t.name,type:t.type,schedule:t.schedule,timezone:t.timezone||"UTC",actionType:"agent",prompt:t.action&&t.action.prompt||""}),"data-testid":`schedule-edit-${t.id}`,title:"Edit",children:"Edit"}),e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{R(t)},disabled:o,"data-testid":`schedule-run-${t.id}`,title:"Run now",children:e.jsx(k,{size:12,"aria-hidden":!0})}),e.jsx(D,{checked:t.enabled,onCheckedChange:()=>{E(t)},"aria-label":`Toggle ${t.name} enabled`}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>{I(t.id)},disabled:o,"data-testid":`schedule-delete-${t.id}`,title:"Delete",children:e.jsx(G,{size:12,"aria-hidden":!0})})]})]})})},t.id)})}),e.jsx(N,{open:a!==null,onOpenChange:t=>{t||s(null)},children:e.jsx(O,{side:"right",title:a!=null&&a.id?"Edit schedule":"New schedule",children:a!==null&&e.jsxs(r,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-name",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(x,{id:"sched-name",value:a.name,onChange:t=>s({...a,name:t.target.value}),placeholder:"Daily digest",disabled:o})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-type",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Type"}),e.jsx(m,{gap:2,children:["interval","cron","once"].map(t=>e.jsx(l,{variant:a.type===t?"primary":"ghost",size:"sm",onClick:()=>s({...a,type:t}),children:w[t]},t))})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-expr",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.type==="interval"?"Interval (e.g. 1h, 30m)":a.type==="cron"?"Cron expr":"ISO timestamp"}),e.jsx(x,{id:"sched-expr",value:a.schedule,onChange:t=>s({...a,schedule:t.target.value}),placeholder:a.type==="interval"?"1h":a.type==="cron"?"0 9 * * *":"2026-07-14T09:00:00Z",disabled:o,"data-testid":"sched-expr"})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-tz",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Timezone"}),e.jsx(x,{id:"sched-tz",value:a.timezone,onChange:t=>s({...a,timezone:t.target.value}),placeholder:"UTC",disabled:o})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Action type"}),e.jsxs(m,{gap:2,children:[e.jsx(l,{variant:a.actionType==="agent"?"primary":"ghost",size:"sm",onClick:()=>s({...a,actionType:"agent"}),children:"Agent prompt"}),e.jsx(l,{variant:a.actionType==="command"?"primary":"ghost",size:"sm",onClick:()=>s({...a,actionType:"command"}),children:"Shell command"})]})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-prompt",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.actionType==="agent"?"Agent prompt":"Command"}),e.jsx(L,{id:"sched-prompt",value:a.prompt,onChange:t=>s({...a,prompt:t.target.value}),placeholder:a.actionType==="agent"?"Run the daily digest report…":'echo "hello from cron"',rows:4,disabled:o})]}),S!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:S}),e.jsxs(m,{gap:2,children:[e.jsx(l,{variant:"primary",onClick:()=>{F()},disabled:o||!a.name.trim()||!a.schedule.trim(),children:a!=null&&a.id?"Save":"Create"}),e.jsx(l,{variant:"ghost",onClick:()=>s(null),disabled:o,children:"Cancel"})]})]})})})]})}export{oe as SchedulesView};
|