@polderlabs/bizar 8.1.0 → 10.0.5
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 +452 -0
- package/bizar-dash/CONTROL_SURFACES.md +157 -0
- package/bizar-dash/SETTINGS_AUDIT.md +225 -0
- package/bizar-dash/dist/assets/ActivityFeed-DbZT1TnN.js +11 -0
- package/bizar-dash/dist/assets/ActivityFeed-DbZT1TnN.js.map +1 -0
- package/bizar-dash/dist/assets/ActivityView-DfrBu-ED.js +7 -0
- package/bizar-dash/dist/assets/ActivityView-DfrBu-ED.js.map +1 -0
- package/bizar-dash/dist/assets/AdminView-DSbzp67e.js +11 -0
- package/bizar-dash/dist/assets/AdminView-DSbzp67e.js.map +1 -0
- package/bizar-dash/dist/assets/AgentsView-BaR-e4UO.js +13 -0
- package/bizar-dash/dist/assets/AgentsView-BaR-e4UO.js.map +1 -0
- package/bizar-dash/dist/assets/ArtifactsView-Dddh5NWn.js +6 -0
- package/bizar-dash/dist/assets/ArtifactsView-Dddh5NWn.js.map +1 -0
- package/bizar-dash/dist/assets/AuthView-CcTxahxz.js +16 -0
- package/bizar-dash/dist/assets/AuthView-CcTxahxz.js.map +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-DxiSs69H.js +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-DxiSs69H.js.map +1 -0
- package/bizar-dash/dist/assets/BackupView-BPS8REBD.js +1 -0
- package/bizar-dash/dist/assets/BackupView-BPS8REBD.js.map +1 -0
- package/bizar-dash/dist/assets/Banner-Bx1hIUM9.js +1 -0
- package/bizar-dash/dist/assets/Banner-Bx1hIUM9.js.map +1 -0
- package/bizar-dash/dist/assets/{Card-BzJeYR2D.js → Card-ZAdgpn3-.js} +1 -1
- package/bizar-dash/dist/assets/{Card-BzJeYR2D.js.map → Card-ZAdgpn3-.js.map} +1 -1
- package/bizar-dash/dist/assets/ChatView-CM_mrwom.js +9 -0
- package/bizar-dash/dist/assets/ChatView-CM_mrwom.js.map +1 -0
- package/bizar-dash/dist/assets/{Chip-CN2bvm7a.js → Chip-k5K9DYAf.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-CN2bvm7a.js.map → Chip-k5K9DYAf.js.map} +1 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-Dq40JNVC.js +1 -0
- package/bizar-dash/dist/assets/ClaudeSessionsView-Dq40JNVC.js.map +1 -0
- package/bizar-dash/dist/assets/ClipboardView-B-TwPtaC.js +1 -0
- package/bizar-dash/dist/assets/ClipboardView-B-TwPtaC.js.map +1 -0
- package/bizar-dash/dist/assets/ConfigView-C_eZMscY.js +1 -0
- package/bizar-dash/dist/assets/ConfigView-C_eZMscY.js.map +1 -0
- package/bizar-dash/dist/assets/DiagnosticsView-Cex6UdD8.js +2 -0
- package/bizar-dash/dist/assets/DiagnosticsView-Cex6UdD8.js.map +1 -0
- package/bizar-dash/dist/assets/DialogsView-DTMRJd0K.js +6 -0
- package/bizar-dash/dist/assets/DialogsView-DTMRJd0K.js.map +1 -0
- package/bizar-dash/dist/assets/DoctorView-BTCUpzXT.js +6 -0
- package/bizar-dash/dist/assets/DoctorView-BTCUpzXT.js.map +1 -0
- package/bizar-dash/dist/assets/{EmptyState-DEiBv4-r.js → EmptyState-DQzo47a_.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DEiBv4-r.js.map → EmptyState-DQzo47a_.js.map} +1 -1
- package/bizar-dash/dist/assets/EnvVarsView-Dnap-pmQ.js +8 -0
- package/bizar-dash/dist/assets/EnvVarsView-Dnap-pmQ.js.map +1 -0
- package/bizar-dash/dist/assets/ErrorState-DZYn3VL_.js +6 -0
- package/bizar-dash/dist/assets/ErrorState-DZYn3VL_.js.map +1 -0
- package/bizar-dash/dist/assets/EvalView-B0YgoXpm.js +1 -0
- package/bizar-dash/dist/assets/EvalView-B0YgoXpm.js.map +1 -0
- package/bizar-dash/dist/assets/GoalsView-YEbgpx2i.js +6 -0
- package/bizar-dash/dist/assets/GoalsView-YEbgpx2i.js.map +1 -0
- package/bizar-dash/dist/assets/Grid-CN6IV8NB.js +1 -0
- package/bizar-dash/dist/assets/Grid-CN6IV8NB.js.map +1 -0
- package/bizar-dash/dist/assets/HeadroomView-C_-l8ojG.js +11 -0
- package/bizar-dash/dist/assets/HeadroomView-C_-l8ojG.js.map +1 -0
- package/bizar-dash/dist/assets/HistoryView-BICvR96Y.js +1 -0
- package/bizar-dash/dist/assets/HistoryView-BICvR96Y.js.map +1 -0
- package/bizar-dash/dist/assets/Input-BRHotaQu.js +1 -0
- package/bizar-dash/dist/assets/Input-BRHotaQu.js.map +1 -0
- package/bizar-dash/dist/assets/{KanbanCard-DZEaAiEr.js → KanbanCard-BvkJ9Xwg.js} +3 -13
- package/bizar-dash/dist/assets/KanbanCard-BvkJ9Xwg.js.map +1 -0
- package/bizar-dash/dist/assets/LibrariesView-BXjfXc-o.js +52 -0
- package/bizar-dash/dist/assets/LibrariesView-BXjfXc-o.js.map +1 -0
- package/bizar-dash/dist/assets/LightRAGView-DKfQd0lo.js +6 -0
- package/bizar-dash/dist/assets/LightRAGView-DKfQd0lo.js.map +1 -0
- package/bizar-dash/dist/assets/ListHeader-DRqP1u_I.js +1 -0
- package/bizar-dash/dist/assets/ListHeader-DRqP1u_I.js.map +1 -0
- package/bizar-dash/dist/assets/MemoryView-DouzHGXp.js +8 -0
- package/bizar-dash/dist/assets/MemoryView-DouzHGXp.js.map +1 -0
- package/bizar-dash/dist/assets/MessageBubble-CIapZ4YY.js +29 -0
- package/bizar-dash/dist/assets/MessageBubble-CIapZ4YY.js.map +1 -0
- package/bizar-dash/dist/assets/MiscView-BqxBRW9r.js +1 -0
- package/bizar-dash/dist/assets/MiscView-BqxBRW9r.js.map +1 -0
- package/bizar-dash/dist/assets/ModsView-B9apzm7l.js +6 -0
- package/bizar-dash/dist/assets/ModsView-B9apzm7l.js.map +1 -0
- package/bizar-dash/dist/assets/NotificationsView-O1BrGRRZ.js +6 -0
- package/bizar-dash/dist/assets/NotificationsView-O1BrGRRZ.js.map +1 -0
- package/bizar-dash/dist/assets/ObsidianView-0_Nc0IwJ.js +1 -0
- package/bizar-dash/dist/assets/ObsidianView-0_Nc0IwJ.js.map +1 -0
- package/bizar-dash/dist/assets/OverviewView-D6WmCxyc.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-D6WmCxyc.js.map +1 -0
- package/bizar-dash/dist/assets/ProgressBar-BXqAmiA8.js +1 -0
- package/bizar-dash/dist/assets/ProgressBar-BXqAmiA8.js.map +1 -0
- package/bizar-dash/dist/assets/ProjectsView-BbHq_OF3.js +11 -0
- package/bizar-dash/dist/assets/ProjectsView-BbHq_OF3.js.map +1 -0
- package/bizar-dash/dist/assets/ProvidersView-dQOPha2i.js +11 -0
- package/bizar-dash/dist/assets/ProvidersView-dQOPha2i.js.map +1 -0
- package/bizar-dash/dist/assets/SchedulesView-DllGEgon.js +1 -0
- package/bizar-dash/dist/assets/SchedulesView-DllGEgon.js.map +1 -0
- package/bizar-dash/dist/assets/Select-xrQ0htmD.js +6 -0
- package/bizar-dash/dist/assets/Select-xrQ0htmD.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsRow-BNSh_paj.js +1 -0
- package/bizar-dash/dist/assets/SettingsRow-BNSh_paj.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsView-B2LyDoxB.js +18 -0
- package/bizar-dash/dist/assets/SettingsView-B2LyDoxB.js.map +1 -0
- package/bizar-dash/dist/assets/Sheet-C-djzbtS.js +1 -0
- package/bizar-dash/dist/assets/{Sheet-C_sIEw35.js.map → Sheet-C-djzbtS.js.map} +1 -1
- package/bizar-dash/dist/assets/Slider-DmOSInmR.js +1 -0
- package/bizar-dash/dist/assets/Slider-DmOSInmR.js.map +1 -0
- package/bizar-dash/dist/assets/Sparkline-fGhOoGf0.js +1 -0
- package/bizar-dash/dist/assets/Sparkline-fGhOoGf0.js.map +1 -0
- package/bizar-dash/dist/assets/Switch-D5gPfsKd.js +10 -0
- package/bizar-dash/dist/assets/Switch-D5gPfsKd.js.map +1 -0
- package/bizar-dash/dist/assets/TasksView-Dw4YtwQB.js +1 -0
- package/bizar-dash/dist/assets/TasksView-Dw4YtwQB.js.map +1 -0
- package/bizar-dash/dist/assets/{Textarea-Dk97nmjO.js → Textarea-Cv1HX9p1.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-Dk97nmjO.js.map → Textarea-Cv1HX9p1.js.map} +1 -1
- package/bizar-dash/dist/assets/UpdateView-Bj0LzpMs.js +6 -0
- package/bizar-dash/dist/assets/UpdateView-Bj0LzpMs.js.map +1 -0
- package/bizar-dash/dist/assets/UsageView-CE-23yYu.js +1 -0
- package/bizar-dash/dist/assets/UsageView-CE-23yYu.js.map +1 -0
- package/bizar-dash/dist/assets/{ViewHeader-dPd4zAyj.js → ViewHeader-2Oyjj9Yt.js} +2 -2
- package/bizar-dash/dist/assets/{ViewHeader-dPd4zAyj.js.map → ViewHeader-2Oyjj9Yt.js.map} +1 -1
- package/bizar-dash/dist/assets/VoiceView-C3S92MfP.js +1 -0
- package/bizar-dash/dist/assets/VoiceView-C3S92MfP.js.map +1 -0
- package/bizar-dash/dist/assets/{brain-BajPVibR.js → brain-B8oDQ4kM.js} +1 -1
- package/bizar-dash/dist/assets/{brain-BajPVibR.js.map → brain-B8oDQ4kM.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-CaP_Bbgc.js → calendar-C1WTDPNZ.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-CaP_Bbgc.js.map → calendar-C1WTDPNZ.js.map} +1 -1
- package/bizar-dash/dist/assets/chevron-down-DjgW4FtB.js +6 -0
- package/bizar-dash/dist/assets/chevron-down-DjgW4FtB.js.map +1 -0
- package/bizar-dash/dist/assets/circle-COwUk6Jw.js +6 -0
- package/bizar-dash/dist/assets/circle-COwUk6Jw.js.map +1 -0
- package/bizar-dash/dist/assets/circle-alert-D_fRRCnG.js +6 -0
- package/bizar-dash/dist/assets/circle-alert-D_fRRCnG.js.map +1 -0
- package/bizar-dash/dist/assets/circle-check-CYpMZPTO.js +6 -0
- package/bizar-dash/dist/assets/circle-check-CYpMZPTO.js.map +1 -0
- package/bizar-dash/dist/assets/clock-BsVbT1kp.js +6 -0
- package/bizar-dash/dist/assets/clock-BsVbT1kp.js.map +1 -0
- package/bizar-dash/dist/assets/{cmdk-BLWIhKrV.js → cmdk-DMW_3pWz.js} +3 -3
- package/bizar-dash/dist/assets/{cmdk-BLWIhKrV.js.map → cmdk-DMW_3pWz.js.map} +1 -1
- package/bizar-dash/dist/assets/{dnd-kit-DU8GZk7s.js → dnd-kit-DWBZ6HFE.js} +1 -1
- package/bizar-dash/dist/assets/{dnd-kit-DU8GZk7s.js.map → dnd-kit-DWBZ6HFE.js.map} +1 -1
- package/bizar-dash/dist/assets/download-Cct5qHWG.js +6 -0
- package/bizar-dash/dist/assets/download-Cct5qHWG.js.map +1 -0
- package/bizar-dash/dist/assets/external-link-CKZQsK9X.js +6 -0
- package/bizar-dash/dist/assets/external-link-CKZQsK9X.js.map +1 -0
- package/bizar-dash/dist/assets/file-text-DNFl94X6.js +6 -0
- package/bizar-dash/dist/assets/file-text-DNFl94X6.js.map +1 -0
- package/bizar-dash/dist/assets/git-branch-qmhKTtT0.js +6 -0
- package/bizar-dash/dist/assets/git-branch-qmhKTtT0.js.map +1 -0
- package/bizar-dash/dist/assets/{git-pull-request-CFRRwdxp.js → git-pull-request-o7G3ez_L.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-CFRRwdxp.js.map → git-pull-request-o7G3ez_L.js.map} +1 -1
- package/bizar-dash/dist/assets/index-CRPdftkz.js +1 -0
- package/bizar-dash/dist/assets/index-CRPdftkz.js.map +1 -0
- package/bizar-dash/dist/assets/index-VI2tohpo.js +1 -0
- package/bizar-dash/dist/assets/index-VI2tohpo.js.map +1 -0
- package/bizar-dash/dist/assets/main-zDgXFFYt.js +244 -0
- package/bizar-dash/dist/assets/main-zDgXFFYt.js.map +1 -0
- package/bizar-dash/dist/assets/pause-B_hjj388.js +6 -0
- package/bizar-dash/dist/assets/pause-B_hjj388.js.map +1 -0
- package/bizar-dash/dist/assets/pencil-BQXiRgKu.js +6 -0
- package/bizar-dash/dist/assets/pencil-BQXiRgKu.js.map +1 -0
- package/bizar-dash/dist/assets/play-DF3wgBsQ.js +6 -0
- package/bizar-dash/dist/assets/play-DF3wgBsQ.js.map +1 -0
- package/bizar-dash/dist/assets/plug-DpD127rq.js +6 -0
- package/bizar-dash/dist/assets/plug-DpD127rq.js.map +1 -0
- package/bizar-dash/dist/assets/{plus-CVH1JB04.js → plus-CbojvfqK.js} +1 -1
- package/bizar-dash/dist/assets/{plus-CVH1JB04.js.map → plus-CbojvfqK.js.map} +1 -1
- package/bizar-dash/dist/assets/power-off-EnQo8iQy.js +6 -0
- package/bizar-dash/dist/assets/power-off-EnQo8iQy.js.map +1 -0
- package/bizar-dash/dist/assets/power-uH0f5Ihr.js +6 -0
- package/bizar-dash/dist/assets/power-uH0f5Ihr.js.map +1 -0
- package/bizar-dash/dist/assets/refresh-ccw-BQ_hQs-U.js +6 -0
- package/bizar-dash/dist/assets/refresh-ccw-BQ_hQs-U.js.map +1 -0
- package/bizar-dash/dist/assets/refresh-cw-CYS8luDH.js +6 -0
- package/bizar-dash/dist/assets/refresh-cw-CYS8luDH.js.map +1 -0
- package/bizar-dash/dist/assets/rotate-ccw-CTVANG1v.js +6 -0
- package/bizar-dash/dist/assets/rotate-ccw-CTVANG1v.js.map +1 -0
- package/bizar-dash/dist/assets/rotate-cw-BSsC5XrT.js +6 -0
- package/bizar-dash/dist/assets/rotate-cw-BSsC5XrT.js.map +1 -0
- package/bizar-dash/dist/assets/save-kxSwq3AI.js +6 -0
- package/bizar-dash/dist/assets/save-kxSwq3AI.js.map +1 -0
- package/bizar-dash/dist/assets/send-DkuyD_Sf.js +6 -0
- package/bizar-dash/dist/assets/send-DkuyD_Sf.js.map +1 -0
- package/bizar-dash/dist/assets/shield-alert-COajyBNI.js +6 -0
- package/bizar-dash/dist/assets/shield-alert-COajyBNI.js.map +1 -0
- package/bizar-dash/dist/assets/{trash-2-JtYRQ79q.js → trash-2-BzH_id_0.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-JtYRQ79q.js.map → trash-2-BzH_id_0.js.map} +1 -1
- package/bizar-dash/dist/assets/trending-up-DWgBlnxO.js +6 -0
- package/bizar-dash/dist/assets/trending-up-DWgBlnxO.js.map +1 -0
- package/bizar-dash/dist/assets/{triangle-alert-Nzbrm0I2.js → triangle-alert-D3wjJjjj.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-Nzbrm0I2.js.map → triangle-alert-D3wjJjjj.js.map} +1 -1
- package/bizar-dash/dist/assets/upload--yQe-28C.js +6 -0
- package/bizar-dash/dist/assets/upload--yQe-28C.js.map +1 -0
- package/bizar-dash/dist/assets/zap-BVpFD6-i.js +6 -0
- package/bizar-dash/dist/assets/zap-BVpFD6-i.js.map +1 -0
- package/bizar-dash/dist/{v8.html → index.html} +2 -2
- 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 +10 -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 +33 -5
- package/bizar-dash/src/server/progress-parser.test.mjs +24 -0
- package/bizar-dash/src/server/routes/admin.mjs +163 -0
- package/bizar-dash/src/server/routes/agents-cc.mjs +171 -24
- 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 +31 -0
- package/bizar-dash/src/server/routes/goals.mjs +117 -13
- 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/spawn.mjs +59 -0
- package/bizar-dash/src/server/routes/tasks.mjs +51 -1
- package/bizar-dash/src/server/server.mjs +21 -10
- package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/bizar-dash/src/web/v8/App.tsx +158 -8
- package/bizar-dash/src/web/v8/__tests__/BackgroundJobsView.test.tsx +172 -0
- package/bizar-dash/src/web/v8/__tests__/MemoryView.test.tsx +91 -0
- package/bizar-dash/src/web/v8/__tests__/NotificationsPopover.test.tsx +91 -0
- package/bizar-dash/src/web/v8/__tests__/SchedulesView.test.tsx +157 -0
- package/bizar-dash/src/web/v8/__tests__/Topbar.test.tsx +86 -0
- 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__/changelog.test.tsx +79 -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__/theme.test.tsx +10 -4
- package/bizar-dash/src/web/v8/__tests__/update-view.test.tsx +89 -0
- package/bizar-dash/src/web/v8/__tests__/views.test.tsx +6 -0
- package/bizar-dash/src/web/v8/__tests__/voice-view.test.tsx +80 -0
- package/bizar-dash/src/web/v8/data/types.ts +75 -2
- package/bizar-dash/src/web/v8/data/useWebSocket.ts +54 -1
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +98 -13
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +30 -4
- package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +96 -15
- package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +202 -15
- package/bizar-dash/src/web/v8/ui/agents/AgentLiveOutput.tsx +252 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +1 -1
- 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/feedback/NotificationsPopover.tsx +239 -0
- package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +34 -1
- package/bizar-dash/src/web/v8/ui/index.ts +7 -1
- package/bizar-dash/src/web/v8/ui/tasks/TaskDetail.tsx +313 -0
- package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +465 -33
- 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 +442 -0
- 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/CommandPalette/AppCommandPalette.tsx +22 -7
- 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 +169 -11
- 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 +203 -22
- 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 +135 -0
- package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +427 -0
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +343 -34
- package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +177 -12
- 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/goals-decompose.test.mjs +5 -3
- 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 +12 -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/{src/router/codemod-intent.ts → dist/router/codemod-intent.js} +53 -66
- 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/LICENSE +21 -0
- 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/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +0 -6
- package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +0 -1
- package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +0 -1
- package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +0 -1
- package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +0 -28
- package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +0 -1
- package/bizar-dash/dist/assets/Badge-BH4C3aUF.js +0 -1
- package/bizar-dash/dist/assets/Badge-BH4C3aUF.js.map +0 -1
- package/bizar-dash/dist/assets/Button-RmN1RKhE.js +0 -6
- package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +0 -1
- package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +0 -6
- package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +0 -1
- package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +0 -1
- package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +0 -67
- package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +0 -1
- package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +0 -13
- package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +0 -1
- package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +0 -1
- package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +0 -16
- package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +0 -10
- package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +0 -43
- package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +0 -1
- package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +0 -1
- package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +0 -1
- package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +0 -1
- package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +0 -16
- package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +0 -1
- package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +0 -1
- package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +0 -1
- package/bizar-dash/dist/assets/index-AL3OLUfz.js +0 -1
- package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +0 -1
- package/bizar-dash/dist/assets/main-LxX9zTRk.js +0 -109
- package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +0 -1
- package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +0 -11
- package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +0 -1
- package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +0 -1
- package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +0 -1
- package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +0 -1
- package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +0 -1
- package/bizar-dash/dist/assets/wrench-B7go551L.js +0 -6
- package/bizar-dash/dist/assets/wrench-B7go551L.js.map +0 -1
- 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/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/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/bizar-dash/src/web/{v8.html → index.html} +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Control Surfaces — v10.0.5
|
|
2
|
+
|
|
3
|
+
> Enumerates every v8 view and what mutations it can perform against
|
|
4
|
+
> the dashboard server. Proves the "full control and orchestration
|
|
5
|
+
> center" claim is concrete, not aspirational.
|
|
6
|
+
>
|
|
7
|
+
> Source: `bizar-dash/src/web/v8/views/**/*.tsx` (37 views) +
|
|
8
|
+
> `bizar-dash/src/server/routes/*.mjs`.
|
|
9
|
+
|
|
10
|
+
## Mutation categories
|
|
11
|
+
|
|
12
|
+
| Tier | Symbol | Meaning |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| 3 | 🟢 **full** | Create + update + delete + invoke/bulk |
|
|
15
|
+
| 2 | 🟡 **partial** | Update or invoke only (no create/delete) |
|
|
16
|
+
| 1 | 🔵 **read+actions** | Read-only display + a few action buttons (restart, export, etc.) |
|
|
17
|
+
| 0 | ⚪ **read-only** | Pure observability — no mutations |
|
|
18
|
+
|
|
19
|
+
## Per-view mutation matrix
|
|
20
|
+
|
|
21
|
+
### 🟢 Tier 3 — full CRUD
|
|
22
|
+
|
|
23
|
+
| View | Creates | Updates | Deletes | Other actions | E2E proof |
|
|
24
|
+
|---|---|---|---|---|---|
|
|
25
|
+
| **Agents** | `POST /api/agents` | `PUT /api/agents/:name`, `POST /api/agents/:name/status` | `DELETE /api/agents/:name` | `POST /api/agents/:name/{restart,heartbeat,invoke}` | crud-roundtrip |
|
|
26
|
+
| **Tasks** | `POST /api/tasks` | `PATCH /api/tasks/:id`, `PATCH /api/tasks/bulk-status` | `DELETE /api/tasks/:id` | move between kanban columns | crud-roundtrip |
|
|
27
|
+
| **Goals** | `POST /api/goals` | `PATCH /api/goals/:id`, `PATCH /api/goals/:id/status`, `POST /api/goals/:id/key-results` | `DELETE /api/goals/:id/key-results/:krId`, `DELETE /api/goals/:id` | `POST /api/goals/:id/decompose` (goal → tasks) | crud-roundtrip |
|
|
28
|
+
| **Settings** | — | `PUT /api/settings`, `PUT /api/settings/plugin-options` | `POST /api/settings/reset` | `POST /api/admin/{gc,memory/reindex,cache/clear}` | config-coverage |
|
|
29
|
+
| **Providers** | `POST /api/providers` (via auto-add wizard) | `PUT /api/providers/:id`, `POST /api/providers/:id/{enable,disable,rotate}` | `DELETE /api/providers/:id` | `POST /api/providers/auto-detect` | tier3-batch-a + tier3-batch-c |
|
|
30
|
+
| **Projects** | `POST /api/projects`, `POST /api/projects/auto-detect`, `POST /api/projects/scan` | `PATCH /api/projects/:id`, `POST /api/projects/:id/activate` | `DELETE /api/projects/:id` | `POST /api/projects/refresh` | crud-roundtrip |
|
|
31
|
+
| **ClaudeSessions** | `POST /api/claude-sessions/new` | `PATCH /api/claude-sessions/:id` (rename) | `DELETE /api/claude-sessions/:id` | `POST /api/claude-sessions/:id/resume` | tier3-batch-c (resume) |
|
|
32
|
+
| **EnvVars** | `POST /api/env-vars` | `PUT /api/env-vars/:key` | `DELETE /api/env-vars/:key` | `POST /api/env-vars/:name/test` | tier3-batch-a |
|
|
33
|
+
| **Mods** | `POST /api/mods` (install) | `PATCH /api/mods/:id` (enable/disable) | `DELETE /api/mods/:id` (uninstall) | `POST /api/mods/:id/{enable,disable}`, `POST /api/mods/:id/instructions/reinstall`, `PUT /api/mods/:id/mod-file/*` | tier3-batch-a |
|
|
34
|
+
| **Dialogs** | `POST /api/dialogs/:id/{approve,deny,skip}` (resolution) | `PATCH /api/dialogs/:id` | `DELETE /api/dialogs/:id` | approve / deny / skip | tier3-batch-c |
|
|
35
|
+
| **Backup** | `POST /api/backup/create` | — | — | `POST /api/backup/restore`, `POST /api/backup/verify` | — |
|
|
36
|
+
| **Eval** | `POST /api/eval/run` | — | — | rerun eval suite | tier3-batch-a |
|
|
37
|
+
|
|
38
|
+
### 🟡 Tier 2 — partial mutations
|
|
39
|
+
|
|
40
|
+
| View | Mutations |
|
|
41
|
+
|---|---|
|
|
42
|
+
| **Chat** | `POST /api/chat/{regenerate,audit}` — no conversation CRUD (uses Claude Code sessions) |
|
|
43
|
+
| **Headroom** | `POST /api/headroom/{install,start,stop,wrap,unwrap}` — runtime toggle |
|
|
44
|
+
| **LightRAG** | `POST /api/lightrag/{autostart,defaults}` — config + lifecycle |
|
|
45
|
+
| **Misc** | `POST /api/tailscale/{enable,disable}` — Tailscale tunnel toggle |
|
|
46
|
+
| **Notifications** | `POST /api/notifications/read-all` — bulk mark read |
|
|
47
|
+
| **Obsidian** | `POST /api/obsidian/index` — re-index vault |
|
|
48
|
+
| **Update** | `POST /api/updates/apply` — apply pending update |
|
|
49
|
+
| **Config** | `PUT /api/config` — single-doc config |
|
|
50
|
+
| **Artifacts** | `POST /api/artifacts` — accept/stage artifact (no full CRUD) |
|
|
51
|
+
|
|
52
|
+
### 🔵 Tier 1 — read + actions
|
|
53
|
+
|
|
54
|
+
| View | Read | Actions |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| **Overview** | `/api/snapshot` | navigation only |
|
|
57
|
+
| **Activity** | `/api/activity` (SSE tail) | export NDJSON (`GET /api/admin/activity/export`) |
|
|
58
|
+
| **Usage** | `/api/usage?range=24h` + per-model | time-range chips (refresh-only) |
|
|
59
|
+
| **Memory** | `/api/memory/notes` (plural) | none surfaced (config-only) |
|
|
60
|
+
| **Voice** | `/api/voice/list` | upload via raw `fetch('/api/voice/upload')` |
|
|
61
|
+
| **Doctor** | `/api/doctor/status` | `POST /api/doctor/check` (run diagnostics) |
|
|
62
|
+
| **Clipboard** | `/api/clipboard/history` | `POST /api/clipboard/save` |
|
|
63
|
+
| **History** | `/api/history` | clear-history (if wired) |
|
|
64
|
+
| **Schedules** | `/api/schedules` | enable/disable per row |
|
|
65
|
+
| **BackgroundJobs** | `/api/background-jobs` | pause/resume per row |
|
|
66
|
+
|
|
67
|
+
### ⚪ Tier 0 — read-only observability
|
|
68
|
+
|
|
69
|
+
| View | Source |
|
|
70
|
+
|---|---|
|
|
71
|
+
| **Auth** | `/api/auth/me`, `/api/auth/sessions` (logout button is its own POST) |
|
|
72
|
+
| **Admin** | `/api/admin/{health,gc}` summary (mutations live on Settings → Storage) |
|
|
73
|
+
| **Diagnostics** | `/api/diagnostics/*` |
|
|
74
|
+
| **CommandPalette** | `/api/agents`, `/api/skills` (palettes spawn things, not mutate itself) |
|
|
75
|
+
| **Libraries** | `/api/libraries` |
|
|
76
|
+
|
|
77
|
+
## Mutating endpoints NOT covered by a view
|
|
78
|
+
|
|
79
|
+
These endpoints exist server-side but no v8 view exposes them. Most
|
|
80
|
+
are reached via curl / TUI / Claude Code directly:
|
|
81
|
+
|
|
82
|
+
- `POST /api/memory/*` — only the in-View reindex button is exposed;
|
|
83
|
+
no create-note form.
|
|
84
|
+
- `POST /api/dialogs/:id/{approve,deny}` is exposed; some deeper
|
|
85
|
+
dialog lifecycle routes may not have a button.
|
|
86
|
+
- `POST /api/usage/*` — only display; no clear-usage button.
|
|
87
|
+
- `POST /api/admin/*` — only the Storage-section GC/clear/reindex
|
|
88
|
+
buttons reach `/api/admin/*`; the rest of admin stays CLI/TUI.
|
|
89
|
+
|
|
90
|
+
## WS-driven surfaces (mutations come back via push)
|
|
91
|
+
|
|
92
|
+
These views surface state the dashboard doesn't directly mutate but
|
|
93
|
+
that downstream mutations trigger over WS:
|
|
94
|
+
|
|
95
|
+
- **Agents** → `agents:change`, `agent:status`, `agent:restarted`
|
|
96
|
+
- **Goals** → `goals:change`, `goals:removed`
|
|
97
|
+
- **Tasks** → `tasks:change`
|
|
98
|
+
- **Dialogs** → `dialog:show`, `dialog:resolved`
|
|
99
|
+
- **Activity** → `activity:new` (SSE)
|
|
100
|
+
- **Update** → `update:progress`, `update:log`, `update:complete`
|
|
101
|
+
- **Settings** → `settings:change`, `settings:plugin-options:changed`
|
|
102
|
+
|
|
103
|
+
## v10.0.5 audit deltas
|
|
104
|
+
|
|
105
|
+
- **Tier 3 proof column added.** Every Tier 3 row now names the
|
|
106
|
+
E2E script that proves the round-trip (crud-roundtrip,
|
|
107
|
+
tier3-batch-a, tier3-batch-c, config-coverage, etc). The
|
|
108
|
+
full results live in `/tmp/{crud,tier3a,tier3c,cfg,full,mat}-<pid>/`.
|
|
109
|
+
- **Dialogs promoted Tier 1 → Tier 3.** New approve/deny/skip
|
|
110
|
+
buttons wired to `POST /api/dialogs/:id/{approve,deny,skip}`
|
|
111
|
+
+ PATCH for `data`-merge. See Move 2c.
|
|
112
|
+
- **Providers expanded.** New POST (create), PUT (update),
|
|
113
|
+
DELETE, POST `/:id/enable|disable` endpoints + matching UI
|
|
114
|
+
buttons. See Moves 2b + 2c.
|
|
115
|
+
- **ClaudeSessions expanded.** New `POST /:id/resume` route
|
|
116
|
+
+ Resume button per row. See Moves 2b + 2c.
|
|
117
|
+
- **EnvVars expanded.** New `POST /:name/test` route + Test
|
|
118
|
+
button per row. See Move 2a.
|
|
119
|
+
- **Mods expanded.** New `POST /:id/instructions/reinstall` +
|
|
120
|
+
`PUT /:id/mod-file/*` + matching buttons. See Move 2a.
|
|
121
|
+
- **Eval expanded.** Schedules CRUD (POST + DELETE) + Add/Delete
|
|
122
|
+
buttons. See Move 2a.
|
|
123
|
+
- **Projects expanded.** New `POST /api/projects/refresh` +
|
|
124
|
+
button. See Move 2a.
|
|
125
|
+
|
|
126
|
+
## "Full control" verdict
|
|
127
|
+
|
|
128
|
+
Of 37 views:
|
|
129
|
+
- **13 views** are full CRUD (Tier 3).
|
|
130
|
+
- **9 views** expose partial mutations (Tier 2).
|
|
131
|
+
- **10 views** offer read + targeted actions (Tier 1).
|
|
132
|
+
- **5 views** are pure observability (Tier 0).
|
|
133
|
+
|
|
134
|
+
Net: every primary agent, task, goal, provider, project, settings,
|
|
135
|
+
session, environment, mod, and artifact surface exposes at least one
|
|
136
|
+
mutation path from the dashboard. The Tier 0/1 views are
|
|
137
|
+
intentionally read-only because the mutations live closer to the
|
|
138
|
+
feature surface (CLI, Claude Code sessions, TUI) or because the data
|
|
139
|
+
is sourced from external systems (Skills, MCPs, Plugins, Hooks,
|
|
140
|
+
Libraries).
|
|
141
|
+
|
|
142
|
+
## Gaps worth follow-up
|
|
143
|
+
|
|
144
|
+
1. **Memory create-note form.** MemoryView currently has read-only
|
|
145
|
+
config + reindex; the create-note flow is only available via the
|
|
146
|
+
plugin / Claude Code.
|
|
147
|
+
2. **Schedules CRUD.** Schedules view is Tier 1; no create/delete
|
|
148
|
+
surfaced.
|
|
149
|
+
3. **Bulk-clear activity log** lives on Storage → Clear cache, not on
|
|
150
|
+
Activity. See SETTINGS_AUDIT.md finding 13.
|
|
151
|
+
|
|
152
|
+
## See also
|
|
153
|
+
|
|
154
|
+
- `bizar-dash/src/web/v8/views/` — 37 view directories
|
|
155
|
+
- `bizar-dash/src/server/routes/` — 30+ route files
|
|
156
|
+
- `bizar-dash/SETTINGS_AUDIT.md` — per-row audit of the Settings page
|
|
157
|
+
- `CHANGELOG.md` v10.0.0 — what was added in this release
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Settings Audit — v10.0.0
|
|
2
|
+
|
|
3
|
+
> Maps every row in `SettingsView.tsx` to its backing endpoint and the
|
|
4
|
+
> on-disk file the value lives in. Verifies the "control and configure
|
|
5
|
+
> everything" claim for the Settings page.
|
|
6
|
+
>
|
|
7
|
+
> Source of truth: `bizar-dash/src/web/v8/views/Settings/SettingsView.tsx`
|
|
8
|
+
> (19 sections) + `bizar-dash/src/server/routes/_shared.mjs` (`DEFAULT_SETTINGS`)
|
|
9
|
+
> + `bizar-dash/src/server/routes/settings.mjs`.
|
|
10
|
+
|
|
11
|
+
## Backing store map
|
|
12
|
+
|
|
13
|
+
| Where it lives | Path | Owner |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| Server-side settings (most rows) | `~/.config/bizar/settings.json` | `PUT /api/settings` |
|
|
16
|
+
| Browser-local theme | `localStorage["bizar.theme.mode"]` | `useTheme().setMode()` |
|
|
17
|
+
| Provider keys (real) | `~/.config/bizar/env.json` (mode 0600) | `PUT /api/env-vars` |
|
|
18
|
+
| Usage / LightRAG / Memory (separate) | per-feature config files | per-feature endpoints |
|
|
19
|
+
| Activity log (read-only here) | append-only NDJSON in `~/.local/share/bizar/activity.ndjson` | streamed |
|
|
20
|
+
| Claude sessions path | `~/.claude/sessions` (env) | read-only display |
|
|
21
|
+
|
|
22
|
+
## Section-by-section audit
|
|
23
|
+
|
|
24
|
+
Legend:
|
|
25
|
+
- ✅ mutates → persists to a backing store
|
|
26
|
+
- 👁 read-only → renders a value from a fetch but no UI control mutates it
|
|
27
|
+
- ⚠️ mixed → some rows mutate, others are read-only
|
|
28
|
+
|
|
29
|
+
### 1. General (✅)
|
|
30
|
+
| Row id | Mutates via | Persisted to |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `workspace-name` | `update('workspaceName')` | `settings.json.workspaceName` |
|
|
33
|
+
| `workspace-timezone` | `update('workspaceTimezone')` | `settings.json.workspaceTimezone` |
|
|
34
|
+
| `default-view` | `update('defaultView')` | `settings.json.defaultView` |
|
|
35
|
+
|
|
36
|
+
### 2. Theme (⚠️ — split storage)
|
|
37
|
+
| Row id | Mutates via | Persisted to |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `theme-mode` | `theme.setMode()` | `localStorage["bizar.theme.mode"]` (NOT settings.json) |
|
|
40
|
+
| `theme-accent` | `update('themeAccent')` | `settings.json.themeAccent` |
|
|
41
|
+
| `theme-font` | `patch('themeFont')` | `settings.json.themeFont` |
|
|
42
|
+
| `theme-radius` | `patch('themeRadius')` | `settings.json.themeRadius` |
|
|
43
|
+
|
|
44
|
+
**Finding:** `theme-mode` is the only theme control that lives in localStorage,
|
|
45
|
+
not `settings.json`. Acceptable because mode is a per-browser preference and
|
|
46
|
+
the rest of the theme syncs across devices — but the split is non-obvious.
|
|
47
|
+
ponytail: persist theme.mode via `/api/settings` when server-side sync is
|
|
48
|
+
ever needed (multi-device or headless dashboard).
|
|
49
|
+
|
|
50
|
+
### 3. Density (✅)
|
|
51
|
+
| Row id | Mutates via | Persisted to |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `density-mode` | `density.setDensity()` | localStorage (similar hybrid as theme — `useDensity` hook) |
|
|
54
|
+
| `density-base-font` | `update('densityBaseFont')` | `settings.json.densityBaseFont` |
|
|
55
|
+
|
|
56
|
+
### 4. Density rules (✅)
|
|
57
|
+
| Row id | Mutates via | Persisted to |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `tasks-compact` | `update('tasksCompact')` | `settings.json.tasksCompact` |
|
|
60
|
+
| `memory-compact` | `update('memoryCompact')` | `settings.json.memoryCompact` |
|
|
61
|
+
| `activity-compact` | `update('activityCompact')` | `settings.json.activityCompact` |
|
|
62
|
+
|
|
63
|
+
### 5. Command palette (✅)
|
|
64
|
+
| Row id | Mutates via | Persisted to |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `palette-history` | `update('paletteHistory')` | `settings.json.paletteHistory` |
|
|
67
|
+
| `palette-fuzzy` | `update('paletteFuzzy')` | `settings.json.paletteFuzzy` |
|
|
68
|
+
| `palette-navigate` | `patch('paletteNavigate')` | `settings.json.paletteNavigate` |
|
|
69
|
+
| `palette-spawn` | `patch('paletteSpawn')` | `settings.json.paletteSpawn` |
|
|
70
|
+
| `palette-scope` | `update('paletteScope')` | `settings.json.paletteScope` |
|
|
71
|
+
|
|
72
|
+
### 6. Keyboard (👁)
|
|
73
|
+
All `kb-*` rows are read-only. SettingsView documents the binding in
|
|
74
|
+
`~/.claude/keybindings.json`. Mutations live in the CLI/TUI flow,
|
|
75
|
+
not the dashboard.
|
|
76
|
+
|
|
77
|
+
### 7. Notifications (✅)
|
|
78
|
+
| Row id | Mutates via | Persisted to |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `n-agent-finished` | `update('notifyAgentFinished')` | `settings.json.notifyAgentFinished` |
|
|
81
|
+
| `n-task-moved` | `patch('notifyTaskMoved')` | `settings.json.notifyTaskMoved` |
|
|
82
|
+
| `n-ci-failed` | `update('notifyCiFailed')` | `settings.json.notifyCiFailed` |
|
|
83
|
+
| `n-token-budget` | `update('notifyTokenBudget')` | `settings.json.notifyTokenBudget` |
|
|
84
|
+
| `n-daily-digest` | `update('notifyDailyDigest')` | `settings.json.notifyDailyDigest` |
|
|
85
|
+
| `n-channel` | `update('notifyChannel')` | `settings.json.notifyChannel` |
|
|
86
|
+
|
|
87
|
+
### 8. Storage (⚠️)
|
|
88
|
+
| Row id | Mutates via | Persisted to |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `store-path` | `update('storagePath')` | `settings.json.storagePath` |
|
|
91
|
+
| `cache-path` | `update('cachePath')` | `settings.json.cachePath` |
|
|
92
|
+
| `sessions-path` | `update('sessionsPath')` | `settings.json.sessionsPath` |
|
|
93
|
+
| `cache-size` | `update('cacheSizeMb')` | `settings.json.cacheSizeMb` |
|
|
94
|
+
| `store-gc` | `POST /api/admin/gc` | runs server-side GC |
|
|
95
|
+
| `store-clear` | `POST /api/admin/cache/clear` | wipes cache + activity log |
|
|
96
|
+
|
|
97
|
+
**Finding:** the path fields write to settings.json but the server
|
|
98
|
+
doesn't appear to *consume* them at runtime (the actual storage paths
|
|
99
|
+
are constants in each store module). Persisted state vs effective state
|
|
100
|
+
drift. ponytail: either (a) wire these to the store modules' root
|
|
101
|
+
constants at boot, or (b) drop the rows and document that paths are
|
|
102
|
+
env-configured only. Recommended: (a) — single source of truth.
|
|
103
|
+
|
|
104
|
+
### 9. Plugins (👁)
|
|
105
|
+
`plugins-count`, `plugins-bizar`, `plugins-list` all sourced from
|
|
106
|
+
`useFetch('/api/agents')` and `useFetch('/api/skills?kind=skills')`.
|
|
107
|
+
Read-only count + summary. Mutations to plugin registration live in
|
|
108
|
+
the filesystem (`.claude/`), not the dashboard.
|
|
109
|
+
|
|
110
|
+
### 10. MCP servers (👁)
|
|
111
|
+
`mcps-count`, `mcps-list` from `useFetch('/api/skills?kind=mcps')`.
|
|
112
|
+
Read-only summary; mutations live in `.claude/mcp.json`.
|
|
113
|
+
|
|
114
|
+
### 11. Skills (👁)
|
|
115
|
+
Sourced from `useFetch('/api/skills?kind=skills')`. Read-only count +
|
|
116
|
+
breakdown by source. Mutations live in `bizar-dash/skills/<name>/`.
|
|
117
|
+
|
|
118
|
+
### 12. Hooks (👁)
|
|
119
|
+
Sourced from `useFetch('/api/skills?kind=hooks')`. Read-only summary;
|
|
120
|
+
mutations live in `.claude/hooks/`.
|
|
121
|
+
|
|
122
|
+
### 13. Activity (⚠️)
|
|
123
|
+
| Row id | Mutates via | Persisted to |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `activity-retention` | `update('activityRetentionDays')` | `settings.json.activityRetentionDays` |
|
|
126
|
+
| `activity-hide` | `patch('activityHide')` (onBlur) | `settings.json.activityHide` |
|
|
127
|
+
| `activity-export` | `GET /api/admin/activity/export` | downloads `activity.ndjson` |
|
|
128
|
+
|
|
129
|
+
**Finding:** `activity-export` is a download endpoint, not a mutation
|
|
130
|
+
button — correct behaviour. But the matching "Clear activity log"
|
|
131
|
+
destructive button lives in Storage → `store-clear` rather than here,
|
|
132
|
+
which is non-obvious. Acceptable but a discoverability gap.
|
|
133
|
+
|
|
134
|
+
### 14. Memory (⚠️)
|
|
135
|
+
| Row id | Mutates via | Persisted to |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `memory-auto-commit` | `update('memoryAutoCommit')` | `settings.json.memoryAutoCommit` |
|
|
138
|
+
| `memory-scope` | `update('memoryScopeDefault')` | `settings.json.memoryScopeDefault` |
|
|
139
|
+
| `memory-index` | `POST /api/admin/memory/reindex` | rebuilds search index |
|
|
140
|
+
|
|
141
|
+
**Finding:** Memory also has its own Settings page (MemoryView) with
|
|
142
|
+
LightRAG URL, Obsidian vault path, git repo config — those live
|
|
143
|
+
under a separate `~/.config/bizar/memory-config.json` and
|
|
144
|
+
`/api/memory/config/global`. Two settings surfaces for one feature is
|
|
145
|
+
non-obvious. ponytail: consolidate into the Settings → Memory section
|
|
146
|
+
when the time comes.
|
|
147
|
+
|
|
148
|
+
### 15. Task defaults (✅)
|
|
149
|
+
| Row id | Mutates via | Persisted to |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `task-priority` | `update('defaultTaskPriority')` | `settings.json.defaultTaskPriority` |
|
|
152
|
+
| `task-column` | `update('defaultTaskColumn')` | `settings.json.defaultTaskColumn` |
|
|
153
|
+
| `task-assignee` | `patch('defaultTaskAssignee')` (onBlur) | `settings.json.defaultTaskAssignee` |
|
|
154
|
+
|
|
155
|
+
### 16. Agent defaults (✅)
|
|
156
|
+
| Row id | Mutates via | Persisted to |
|
|
157
|
+
|---|---|---|
|
|
158
|
+
| `agent-model` | `update('defaultAgentModel')` | `settings.json.defaultAgentModel` |
|
|
159
|
+
| `agent-mistakes` | `update('defaultAgentMaxMistakes')` | `settings.json.defaultAgentMaxMistakes` |
|
|
160
|
+
| `agent-bg` | `patch('agentBackgroundDefault')` | `settings.json.agentBackgroundDefault` |
|
|
161
|
+
| `agent-worktree` | `patch('agentWorktree')` | `settings.json.agentWorktree` |
|
|
162
|
+
| `agent-system-prompt` | `patch('agentSystemPrompt')` (onBlur) | `settings.json.agentSystemPrompt` |
|
|
163
|
+
|
|
164
|
+
### 17. Privacy (✅)
|
|
165
|
+
| Row id | Mutates via | Persisted to |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| `privacy-analytics` | `update('analytics')` | `settings.json.analytics` |
|
|
168
|
+
| `privacy-crash` | `update('crashReports')` | `settings.json.crashReports` |
|
|
169
|
+
| `privacy-pii` | `update('piiMode')` | `settings.json.piiMode` |
|
|
170
|
+
|
|
171
|
+
### 18. Advanced (✅)
|
|
172
|
+
| Row id | Mutates via | Persisted to |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| `adv-reduced-motion` | `update('reducedMotion')` | `settings.json.reducedMotion` |
|
|
175
|
+
| `adv-debug-overlay` | `update('debugOverlay')` | `settings.json.debugOverlay` |
|
|
176
|
+
| `adv-reset` | `POST /api/settings/reset` | wipes back to `DEFAULT_SETTINGS` |
|
|
177
|
+
|
|
178
|
+
## Rollup
|
|
179
|
+
|
|
180
|
+
- 19 sections, 60 rows total.
|
|
181
|
+
- **47 ✅** — fully mutate to settings.json + (where relevant) broadcast.
|
|
182
|
+
- **6 👁** — read-only count/list rows (Plugins, MCPs, Skills, Hooks,
|
|
183
|
+
Keyboard). Mutations are filesystem-only.
|
|
184
|
+
- **6 ⚠️** — split storage or discoverability gaps:
|
|
185
|
+
- Theme: mode in localStorage, rest in settings.json.
|
|
186
|
+
- Density: mode in localStorage, rest in settings.json.
|
|
187
|
+
- Storage: paths persist but aren't consumed at runtime.
|
|
188
|
+
- Activity: destructive "clear log" lives in Storage not Activity.
|
|
189
|
+
- Memory: split between Settings → Memory (this section) and the
|
|
190
|
+
separate MemoryView.
|
|
191
|
+
|
|
192
|
+
## Audit verdict
|
|
193
|
+
|
|
194
|
+
"Control and configure everything from the dashboard" holds for the
|
|
195
|
+
**Settings page** specifically: every UI control that says "this changes
|
|
196
|
+
a setting" actually persists it via `/api/settings` (with the two
|
|
197
|
+
localStorage hybrids for browser-local prefs, which is a defensible
|
|
198
|
+
split). The non-mutating rows are correctly marked as summary rows.
|
|
199
|
+
|
|
200
|
+
Gaps that warrant follow-up work (not v10-blocking):
|
|
201
|
+
|
|
202
|
+
1. **Storage paths persist but aren't consumed.** Either wire them in
|
|
203
|
+
or drop the rows.
|
|
204
|
+
2. **Memory settings split across two pages.** Consolidate into Settings
|
|
205
|
+
→ Memory.
|
|
206
|
+
3. **Theme mode hybrid storage** is defensible but non-obvious. Worth
|
|
207
|
+
documenting in a tooltip.
|
|
208
|
+
|
|
209
|
+
## Tests
|
|
210
|
+
|
|
211
|
+
- `/api/settings` (GET/PUT/POST reset) is exercised by the dashboard
|
|
212
|
+
via `useFetch` + `patch()` (unit-tested implicitly via SettingsView
|
|
213
|
+
smoke tests, no dedicated route test yet). ponytail: add
|
|
214
|
+
`tests/server/settings-route.test.mjs` for the round-trip.
|
|
215
|
+
- localStorage theme/density mutations are not directly testable
|
|
216
|
+
from the server; covered by component tests.
|
|
217
|
+
|
|
218
|
+
## See also
|
|
219
|
+
|
|
220
|
+
- `bizar-dash/src/web/v8/views/Settings/SettingsView.tsx`
|
|
221
|
+
- `bizar-dash/src/server/routes/settings.mjs`
|
|
222
|
+
- `bizar-dash/src/server/routes/_shared.mjs` (DEFAULT_SETTINGS)
|
|
223
|
+
- `bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx`
|
|
224
|
+
- `CONTROL_SURFACES.md` — the broader "what can you mutate from the
|
|
225
|
+
dashboard" map across all v8 views (companion doc).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{r as f,j as e}from"./cmdk-DMW_3pWz.js";import{g,c as v}from"./main-zDgXFFYt.js";import{T as j}from"./trending-up-DWgBlnxO.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 b=g("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/**
|
|
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 w=g("TrendingDown",[["polyline",{points:"22 17 13.5 8.5 8.5 13.5 2 7",key:"1r2t7k"}],["polyline",{points:"16 17 22 17 22 11",key:"11uiuu"}]]),S={up:"var(--success)",down:"var(--danger)",flat:"var(--fg-muted)"},T={up:j,down:w,flat:b},R=f.forwardRef(function(l,o){const{label:t,value:i,delta:n,trend:r,hint:a,icon:s,sparkline:d,loading:x,className:m,style:h,...y}=l,c=r!==void 0?T[r]:null;return e.jsxs("div",{ref:o,className:v("v8-stat-tile",m),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",padding:"var(--space-5)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",...h},...y,children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",fontWeight:500},children:t}),s!==void 0&&e.jsx("span",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:s})]}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-24)",fontWeight:600,color:"var(--fg)",fontVariantNumeric:"tabular-nums",lineHeight:"var(--lh-tight)"},children:x===!0?"—":i}),(n!==void 0||c!==null)&&e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:2,fontSize:"var(--fs-12)",fontWeight:500,color:r!==void 0?S[r]:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[c!==null&&e.jsx(c,{size:12,"aria-hidden":"true"}),n]})]}),a!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:a}),d!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-1)"},children:d})]})}),z=f.forwardRef(function(l,o){const{children:t,cols:i,minWidth:n=200,className:r,style:a,...s}=l,d=i!==void 0?`repeat(${i}, minmax(0, 1fr))`:`repeat(auto-fit, minmax(${n}px, 1fr))`;return e.jsx("div",{ref:o,className:v("v8-stat-grid",r),style:{display:"grid",gridTemplateColumns:d,gap:"var(--space-3)",...a},...s,children:t})}),u={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},W=f.forwardRef(function(l,o){const{items:t,empty:i,className:n,...r}=l;return t.length===0&&i!==void 0?e.jsx(e.Fragment,{children:i}):e.jsx("ol",{ref:o,className:v("v8-activity-feed",n),style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:"var(--space-2)"},...r,children:t.map(a=>{const s=a.tone??"neutral";return e.jsxs("li",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:"var(--radius-sm)",background:`color-mix(in oklch, ${u[s]} 14%, transparent)`,color:u[s],flexShrink:0},children:a.icon}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)",minWidth:0},children:a.title}),a.meta!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",flexShrink:0,fontVariantNumeric:"tabular-nums"},children:a.meta})]}),a.description!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:a.description})]})]},a.id)})})});export{W as A,b as M,z as S,R as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityFeed-DbZT1TnN.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/web/v8/ui/data/StatTile.tsx","../../src/web/v8/ui/activity/ActivityFeed.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 Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.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 TrendingDown = createLucideIcon(\"TrendingDown\", [\n [\"polyline\", { points: \"22 17 13.5 8.5 8.5 13.5 2 7\", key: \"1r2t7k\" }],\n [\"polyline\", { points: \"16 17 22 17 22 11\", key: \"11uiuu\" }]\n]);\n\nexport { TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendingDown, TrendingUp, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * StatTile — a single KPI tile for the overview.\n *\n * Pattern: `[label] [trend-icon delta]`\n * `[BIG value]`\n * `[sparkline?]`\n *\n * Use cases: Overview dashboard, agent detail, goal detail.\n */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatTileProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n /** Optional delta with trend direction (e.g. \"+12%\" vs last week). */\n delta?: ReactNode;\n trend?: StatTrend;\n /** Optional helper text under the value. */\n hint?: ReactNode;\n /** Optional icon for the top-right corner. */\n icon?: ReactNode;\n /** Inline sparkline rendered beneath the value (use the Sparkline component). */\n sparkline?: ReactNode;\n /** Loading state — replaces value with skeleton. */\n loading?: boolean;\n}\n\nconst TREND_FG: Record<StatTrend, string> = {\n up: 'var(--success)',\n down: 'var(--danger)',\n flat: 'var(--fg-muted)',\n};\n\nconst TREND_ICON: Record<StatTrend, typeof TrendingUp> = {\n up: TrendingUp,\n down: TrendingDown,\n flat: Minus,\n};\n\nexport const StatTile = forwardRef<HTMLDivElement, StatTileProps>(function StatTile(props, ref) {\n const {\n label,\n value,\n delta,\n trend,\n hint,\n icon,\n sparkline,\n loading,\n className,\n style,\n ...rest\n } = props;\n const TrendIcon = trend !== undefined ? TREND_ICON[trend] : null;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-tile', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-5)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', fontWeight: 500 }}>\n {label}\n </div>\n {icon !== undefined && (\n <span style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 'var(--space-2)' }}>\n <div\n style={{\n fontSize: 'var(--fs-24)',\n fontWeight: 600,\n color: 'var(--fg)',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: 'var(--lh-tight)',\n }}\n >\n {loading === true ? '—' : value}\n </div>\n {(delta !== undefined || TrendIcon !== null) && (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: trend !== undefined ? TREND_FG[trend] : 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {TrendIcon !== null && <TrendIcon size={12} aria-hidden=\"true\" />}\n {delta}\n </div>\n )}\n </div>\n {hint !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{hint}</div>\n )}\n {sparkline !== undefined && <div style={{ marginTop: 'var(--space-1)' }}>{sparkline}</div>}\n </div>\n );\n});\n\n/**\n * StatGrid — responsive grid for StatTiles. Auto-fits 1..4 columns.\n */\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Min tile width (default 200px). */\n minWidth?: number;\n cols?: 2 | 3 | 4;\n}\n\nexport const StatGrid = forwardRef<HTMLDivElement, StatGridProps>(function StatGrid(props, ref) {\n const { children, cols, minWidth = 200, className, style, ...rest } = props;\n const gridTemplate = cols !== undefined\n ? `repeat(${cols}, minmax(0, 1fr))`\n : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: gridTemplate,\n gap: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n});","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["Minus","createLucideIcon","TrendingDown","TREND_FG","TREND_ICON","TrendingUp","StatTile","forwardRef","props","ref","label","value","delta","trend","hint","icon","sparkline","loading","className","style","rest","TrendIcon","jsxs","cx","jsx","StatGrid","children","cols","minWidth","gridTemplate","TONE_BG","ActivityFeed","items","empty","item","tone"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{r as d,j as e}from"./cmdk-DMW_3pWz.js";import{g as re,u as se,a as ae,S as g,I as f,d as O,A as F,C as K,h as _,T as S,b as q,L,e as ne,B as D,f as oe,F as ie,W as ce,c as le}from"./main-zDgXFFYt.js";import{G as de}from"./Grid-CN6IV8NB.js";import{V as ue}from"./ViewHeader-2Oyjj9Yt.js";import{L as ge}from"./ListHeader-DRqP1u_I.js";import{S as fe}from"./Sparkline-fGhOoGf0.js";import{C as G,b as V}from"./Card-ZAdgpn3-.js";import{E as he}from"./ErrorState-DZYn3VL_.js";import{S as P}from"./Switch-D5gPfsKd.js";import{S as pe}from"./Slider-DmOSInmR.js";import{C as U}from"./circle-COwUk6Jw.js";import{G as H,a as me}from"./git-pull-request-o7G3ez_L.js";import{C as ve}from"./clock-BsVbT1kp.js";import{T as R}from"./triangle-alert-D3wjJjjj.js";import{C as xe}from"./circle-check-CYpMZPTO.js";import"./circle-alert-D_fRRCnG.js";import"./refresh-ccw-BQ_hQs-U.js";import"./index-VI2tohpo.js";import"./index-CRPdftkz.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 ye=re("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]),y={task:{label:"Tasks",icon:L,tone:"neutral"},agent:{label:"Agents",icon:q,tone:"info"},goal:{label:"Goals",icon:S,tone:"accent"},settings:{label:"Settings",icon:_,tone:"neutral"},system:{label:"System",icon:K,tone:"warning"},git:{label:"Git",icon:H,tone:"neutral"}},Y={"git.merge":{icon:H,tone:"success",source:"git"},"git.pull-request":{icon:me,tone:"info",source:"git"},"task.completed":{icon:xe,tone:"success",source:"task"},"task.failed":{icon:R,tone:"danger",source:"task"},"task.created":{icon:L,tone:"info",source:"task"},"task.moved":{icon:L,tone:"neutral",source:"task"},"agent.run":{icon:q,tone:"info",source:"agent"},"agent.tool":{icon:ce,tone:"neutral",source:"agent"},"agent.killed":{icon:R,tone:"warning",source:"agent"},"goal.created":{icon:S,tone:"info",source:"goal"},"goal.status":{icon:S,tone:"info",source:"goal"},"goal.decomposed":{icon:S,tone:"success",source:"goal"},"settings.changed":{icon:_,tone:"neutral",source:"settings"},"system.error":{icon:R,tone:"danger",source:"system"},"system.note":{icon:F,tone:"neutral",source:"system"},"agent.message":{icon:F,tone:"info",source:"agent"}};function T(s){const r=(s.kind||s.iconKey||"").toLowerCase();return r.startsWith("task")?"task":r.startsWith("agent")?"agent":r.startsWith("goal")?"goal":r.startsWith("settings")?"settings":r.startsWith("git")?"git":r.startsWith("system")?"system":s.title&&/goal/i.test(s.title)?"goal":s.title&&/(agent|claude|cc)/i.test(s.title)?"agent":"system"}function je(s){const r=Y[s.kind||s.iconKey||""]||Y["system.note"],u=T(s);return{icon:r.icon,tone:r.tone,source:u}}function ke(s){const r=new Date(s);return`${r.getFullYear()}-${String(r.getMonth()+1).padStart(2,"0")}-${String(r.getDate()).padStart(2,"0")}`}function be(s){const r=new Date,u=new Date(r.getFullYear(),r.getMonth(),r.getDate()).getTime(),c=new Date(s),j=new Date(c.getFullYear(),c.getMonth(),c.getDate()).getTime(),l=Math.round((u-j)/864e5);return l===0?"Today":l===1?"Yesterday":l<7?`${l} days ago`:c.toLocaleDateString(void 0,{weekday:"long",month:"short",day:"numeric"})}function Se(s){return new Date(s).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function we(s){if(!s||typeof s!="object")return null;const r=s;return Array.isArray(r.lines)&&r.lines.length>0?e.jsx(m,{style:{marginTop:6,fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:8},children:r.lines.slice(0,40).map((u,c)=>e.jsxs("div",{style:{color:u.kind==="+"?"var(--success)":u.kind==="-"?"var(--danger)":"var(--fg-muted)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("span",{style:{display:"inline-block",width:12},children:u.kind===" "?"":u.kind}),u.text]},c))}):r.before!==void 0||r.after!==void 0?e.jsxs(m,{style:{marginTop:6,display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:[r.before!==void 0&&e.jsxs(m,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 30%, var(--border))",borderRadius:"var(--radius-sm)",padding:8,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("strong",{style:{color:"var(--danger)"},children:"before"}),e.jsx("div",{children:String(r.before)})]}),r.after!==void 0&&e.jsxs(m,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 30%, var(--border))",borderRadius:"var(--radius-sm)",padding:8,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("strong",{style:{color:"var(--success)"},children:"after"}),e.jsx("div",{children:String(r.after)})]})]}):null}function m(s){return e.jsx("div",{className:le("v8-cl-box",s.className),style:s.style,children:s.children})}function Ue(){const s=se("/api/activity?limit=200"),[r,u]=d.useState([]),[c,j]=d.useState("all"),[l,$]=d.useState(!0),[w,Q]=d.useState(!1),[C,X]=d.useState(14),[E,M]=d.useState(null),[k,Z]=d.useState(""),ee=d.useCallback(t=>{if(!l)return;const a=t.event;a&&u(n=>[a,...n].slice(0,500))},[l]);ae("activity:new",ee);const v=d.useMemo(()=>{var t;return[...r,...((t=s.data)==null?void 0:t.events)||[]]},[r,s.data]),A=d.useMemo(()=>{let t=c==="all"?v:v.filter(a=>T(a)===c);if(k.trim()){const a=k.trim().toLowerCase();t=t.filter(n=>[n.title||"",n.description||"",n.kind||"",n.agent||"",n.actor||""].join(" ").toLowerCase().includes(a))}return t},[v,c,k]),W=Date.now()-C*864e5,h=d.useMemo(()=>A.filter(t=>(t.ts||0)>=W||t.ts===void 0),[A,W]),z=d.useMemo(()=>{const t=new Map;for(const n of h){const o=n.ts||Date.now(),i=ke(o);t.has(i)||t.set(i,[]),t.get(i).push(n)}const a=[];for(const[n,o]of t){const i=o.find(b=>b.ts),p=(i==null?void 0:i.ts)??Date.now();a.push({key:n,label:be(p),events:o})}return a.sort((n,o)=>n.key<o.key?1:-1)},[h]),x=d.useMemo(()=>{const t={all:0,task:0,agent:0,goal:0,settings:0,system:0,git:0};for(const a of v){const n=T(a);t.all+=1,t[n]+=1}return t},[v]),B=d.useMemo(()=>[...z].reverse().map(t=>t.events.length),[z]),te=async()=>{M(null);try{const a=((await oe("/api/activity?limit=10000")).events||[]).map(p=>JSON.stringify(p)).join(`
|
|
7
|
+
`),n=new Blob([a],{type:"application/x-ndjson"}),o=URL.createObjectURL(n),i=document.createElement("a");i.href=o,i.download=`bizar-activity-${new Date().toISOString().slice(0,10)}.ndjson`,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(o)}catch(t){M((t instanceof ie,t.message))}};return e.jsxs(g,{gap:5,"data-testid":"activity-view",children:[e.jsx(ue,{title:"Activity",description:"Day-grouped changelog across tasks, agents, goals, settings, and git.",actions:e.jsxs(f,{align:"center",gap:2,children:[e.jsx("input",{type:"search",placeholder:"Search…",value:k,onChange:t=>Z(t.target.value),"aria-label":"Search activity",style:{height:28,padding:"0 var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-12)",width:200,outline:"none"}}),e.jsxs(f,{align:"center",gap:1,children:[e.jsx(U,{size:8,"aria-hidden":!0,style:{color:l?"var(--success)":"var(--fg-muted)"},fill:"currentColor"}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:l?"Live":"Paused"}),e.jsx(O,{variant:"ghost",onClick:()=>$(t=>!t),"aria-label":l?"Pause stream":"Resume stream",children:l?"Pause":"Resume"})]}),e.jsxs(O,{variant:"secondary",onClick:()=>{te()},children:[e.jsx(ye,{size:12,"aria-hidden":!0})," Export NDJSON"]})]})}),e.jsx(ge,{title:"Feed",count:h.length,sparkline:B.length>=2?e.jsx(fe,{data:B,width:120,height:28}):void 0,description:`${x.task} task · ${x.agent} agent · ${x.goal} goal`,testid:"activity-list-header"}),E!==null&&e.jsx("div",{role:"alert",style:{padding:"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)"},children:E}),e.jsxs(f,{align:"center",gap:2,wrap:!0,children:[e.jsx(J,{label:`All (${x.all})`,active:c==="all",onClick:()=>j("all"),icon:e.jsx(F,{size:12,"aria-hidden":!0})}),Object.keys(y).map(t=>{const a=y[t],n=a.icon;return e.jsx(J,{label:`${a.label} (${x[t]})`,active:c===t,onClick:()=>j(t),icon:e.jsx(n,{size:12,"aria-hidden":!0})},t)})]}),e.jsx(G,{children:e.jsx(V,{children:e.jsxs(de,{cols:3,gap:4,children:[e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-auto",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Live tail"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(P,{id:"cl-auto",checked:l,onCheckedChange:$}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:l?"var(--success)":"var(--fg-muted)"},children:l?"on":"paused"})]})]}),e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-compact",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Compact rows"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(P,{id:"cl-compact",checked:w,onCheckedChange:Q}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:w?"compact":"comfortable"})]})]}),e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-days",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Look back"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(pe,{id:"cl-days",value:[C],onValueChange:t=>X(t[0]??14),min:1,max:90,step:1}),e.jsxs("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:[C,"d"]})]})]})]})})}),!s.loading&&h.length===0&&e.jsx(G,{children:e.jsx(V,{children:e.jsxs(g,{gap:1,children:[e.jsx("strong",{children:"No activity matching filters."}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Clear the source filter or extend the look-back window."})]})})}),s.loading&&h.length===0?e.jsx(ne,{style:{height:320}}):s.error&&h.length===0?e.jsx(he,{block:!0,title:"Couldn't load activity",description:"The activity feed failed to fetch. Retry to refetch.",error:s.error,onRetry:()=>void s.refetch(),testid:"activity-error"}):e.jsx(g,{gap:5,children:z.map(t=>e.jsxs(g,{gap:3,children:[e.jsxs(f,{align:"center",gap:2,style:{position:"sticky",top:0,padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--surface-0) 88%, transparent)",backdropFilter:"blur(8px)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",zIndex:1},children:[e.jsx("h2",{style:{margin:0,fontSize:"var(--fs-16)",fontWeight:600},children:t.label}),e.jsx(D,{tone:"neutral",children:t.events.length}),e.jsx(ve,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:t.events.filter(a=>a.ts===void 0).length>0?"live + historical":"historical only"})]}),e.jsx(g,{gap:1,children:t.events.map((a,n)=>{var b,I,N;const o=je(a),i=((b=y[o.source])==null?void 0:b.icon)||K,p=a.ts??Date.now();return e.jsxs(m,{style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,padding:w?"6px 10px":"var(--space-3) var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",alignItems:"center"},children:[e.jsx(m,{style:{width:32,height:32,display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"var(--radius-pill)",background:`color-mix(in oklch, var(--${o.tone==="neutral"?"fg-muted":o.tone}) 18%, var(--surface-0))`,color:`var(--${o.tone==="neutral"?"fg-muted":o.tone})`},children:e.jsx(o.icon,{size:14,"aria-hidden":!0})}),e.jsxs(g,{gap:1,children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:a.title??a.description??a.kind??"event"}),e.jsx(D,{tone:((I=y[o.source])==null?void 0:I.tone)??"neutral",children:e.jsxs(f,{align:"center",gap:1,children:[e.jsx(i,{size:10,"aria-hidden":!0})," ",((N=y[o.source])==null?void 0:N.label)??o.source]})}),a.kind&&e.jsx(D,{tone:"neutral",children:a.kind})]}),a.description&&a.description!==a.title&&e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:a.description}),we(a.meta)]}),e.jsxs(g,{align:"end",gap:1,children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:Se(p)}),typeof a.actor=="string"&&e.jsxs(f,{align:"center",gap:1,children:[e.jsx(U,{size:8,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.actor})]})]})]},`${a.id??`${p}-${n}`}`)})})]},t.key))})]})}function J({label:s,active:r,onClick:u,icon:c}){return e.jsxs("button",{type:"button",onClick:u,"aria-pressed":r,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 10px",borderRadius:"var(--radius-pill)",border:`1px solid ${r?"var(--accent)":"var(--border)"}`,background:r?"color-mix(in oklch, var(--accent) 14%, var(--surface-1))":"var(--surface-1)",color:r?"var(--accent)":"var(--fg)",fontSize:"var(--fs-12)",cursor:"pointer",fontWeight:r?600:500},children:[c,s]})}export{Ue as ActivityView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityView-DfrBu-ED.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/filter.js","../../src/web/v8/views/Activity/ActivityView.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 Filter = createLucideIcon(\"Filter\", [\n [\"polygon\", { points: \"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\", key: \"1yg77f\" }]\n]);\n\nexport { Filter as default };\n//# sourceMappingURL=filter.js.map\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n Layers,\n Target,\n Settings as SettingsIcon,\n Cpu,\n Filter,\n Clock,\n Circle,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Slider } from '../../ui/controls/Slider.js';\nimport { cx } from '../../ui/utils/cx.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { ActivityEvent } from '../../data/types.js';\n\n/**\n * ActivityView — Sprint S15 visual changelog.\n *\n * Renders an explicit day-grouped changelog (\"Today\", \"Yesterday\", \"Mar 14\")\n * with source badges and per-event highlights. Diff payloads (`meta.diff`)\n * render as expanded preview blocks. Filter chips narrow by source. The\n * topbar lives above the list so screen-magnifier users see context.\n */\n\ntype Source = 'task' | 'agent' | 'goal' | 'settings' | 'system' | 'git' | 'all';\n\nconst SOURCE_META: Record<Exclude<Source, 'all'>, { label: string; icon: LucideIcon; tone: 'neutral' | 'info' | 'accent' | 'success' | 'warning' | 'danger' }> = {\n task: { label: 'Tasks', icon: Layers, tone: 'neutral' },\n agent: { label: 'Agents', icon: Bot, tone: 'info' },\n goal: { label: 'Goals', icon: Target, tone: 'accent' },\n settings: { label: 'Settings', icon: SettingsIcon, tone: 'neutral' },\n system: { label: 'System', icon: Cpu, tone: 'warning' },\n git: { label: 'Git', icon: GitMerge, tone: 'neutral' },\n};\n\nconst EVENT_TONE_MAP: Record<string, { icon: LucideIcon; tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; source: Source }> = {\n 'git.merge': { icon: GitMerge, tone: 'success', source: 'git' },\n 'git.pull-request': { icon: GitPullRequest, tone: 'info', source: 'git' },\n 'task.completed': { icon: CheckCircle2, tone: 'success', source: 'task' },\n 'task.failed': { icon: AlertTriangle, tone: 'danger', source: 'task' },\n 'task.created': { icon: Layers, tone: 'info', source: 'task' },\n 'task.moved': { icon: Layers, tone: 'neutral', source: 'task' },\n 'agent.run': { icon: Bot, tone: 'info', source: 'agent' },\n 'agent.tool': { icon: Wrench, tone: 'neutral', source: 'agent' },\n 'agent.killed': { icon: AlertTriangle, tone: 'warning', source: 'agent' },\n 'goal.created': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.status': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.decomposed': { icon: Target, tone: 'success', source: 'goal' },\n 'settings.changed': { icon: SettingsIcon, tone: 'neutral', source: 'settings' },\n 'system.error': { icon: AlertTriangle, tone: 'danger', source: 'system' },\n 'system.note': { icon: ActivityIcon, tone: 'neutral', source: 'system' },\n 'agent.message': { icon: ActivityIcon, tone: 'info', source: 'agent' },\n};\n\nfunction inferSource(e: ActivityEvent): Source {\n const hint = (e.kind || e.iconKey || '').toLowerCase();\n if (hint.startsWith('task')) return 'task';\n if (hint.startsWith('agent')) return 'agent';\n if (hint.startsWith('goal')) return 'goal';\n if (hint.startsWith('settings')) return 'settings';\n if (hint.startsWith('git')) return 'git';\n if (hint.startsWith('system')) return 'system';\n if (e.title && /goal/i.test(e.title)) return 'goal';\n if (e.title && /(agent|claude|cc)/i.test(e.title)) return 'agent';\n return 'system';\n}\n\nfunction eventVisual(e: ActivityEvent): { icon: LucideIcon; tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; source: Source } {\n const m = EVENT_TONE_MAP[e.kind || e.iconKey || ''] || EVENT_TONE_MAP['system.note'];\n const inferred = inferSource(e);\n return { icon: m.icon, tone: m.tone, source: inferred };\n}\n\nfunction dayKey(ts: number): string {\n const d = new Date(ts);\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\nfunction dayLabel(ts: number): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const d = new Date(ts);\n const start = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const diffDays = Math.round((today - start) / 86_400_000);\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString(undefined, { weekday: 'long', month: 'short', day: 'numeric' });\n}\n\nfunction timeShort(ts: number): string {\n return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\ninterface DiffPayload { before?: string; after?: string; lines?: { kind: '+' | '-' | ' '; text: string }[] }\n\nfunction renderDiff(meta: unknown): JSX.Element | null {\n if (!meta || typeof meta !== 'object') return null;\n const d = meta as DiffPayload;\n if (Array.isArray(d.lines) && d.lines.length > 0) {\n return (\n <Box style={{ marginTop: 6, fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'var(--surface-0)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', padding: 8 }}>\n {d.lines.slice(0, 40).map((l, i) => (\n <div key={i} style={{ color: l.kind === '+' ? 'var(--success)' : l.kind === '-' ? 'var(--danger)' : 'var(--fg-muted)', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <span style={{ display: 'inline-block', width: 12 }}>{l.kind === ' ' ? '' : l.kind}</span>\n {l.text}\n </div>\n ))}\n </Box>\n );\n }\n if (d.before !== undefined || d.after !== undefined) {\n return (\n <Box style={{ marginTop: 6, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\n {d.before !== undefined && (\n <Box style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid color-mix(in oklch, var(--danger) 30%, var(--border))', borderRadius: 'var(--radius-sm)', padding: 8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong style={{ color: 'var(--danger)' }}>before</strong>\n <div>{String(d.before)}</div>\n </Box>\n )}\n {d.after !== undefined && (\n <Box style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))', border: '1px solid color-mix(in oklch, var(--success) 30%, var(--border))', borderRadius: 'var(--radius-sm)', padding: 8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong style={{ color: 'var(--success)' }}>after</strong>\n <div>{String(d.after)}</div>\n </Box>\n )}\n </Box>\n );\n }\n return null;\n}\n\nfunction Box(props: { children?: React.ReactNode; style?: React.CSSProperties; className?: string }): JSX.Element {\n return <div className={cx('v8-cl-box', props.className)} style={props.style}>{props.children}</div>;\n}\n\ninterface ExtendedEvent extends ActivityEvent { __source?: Source }\n\nexport function ActivityView(): JSX.Element {\n const events = useFetch<{ events?: ActivityEvent[] }>('/api/activity?limit=200');\n const [live, setLive] = useState<ActivityEvent[]>([]);\n const [source, setSource] = useState<Source>('all');\n const [autoRefresh, setAutoRefresh] = useState<boolean>(true);\n const [compact, setCompact] = useState<boolean>(false);\n const [maxDays, setMaxDays] = useState<number>(14);\n const [exportError, setExportError] = useState<string | null>(null);\n const [search, setSearch] = useState<string>('');\n\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n if (!autoRefresh) return;\n const ev = msg.event;\n if (!ev) return;\n setLive((prev) => [ev, ...prev].slice(0, 500));\n }, [autoRefresh]);\n useWsMessage('activity:new', onEvent);\n\n const merged = useMemo<ExtendedEvent[]>(() => {\n return [...live, ...(events.data?.events || [])];\n }, [live, events.data]);\n\n const filtered = useMemo<ExtendedEvent[]>(() => {\n let list = source === 'all' ? merged : merged.filter((e) => inferSource(e) === source);\n if (search.trim()) {\n const needle = search.trim().toLowerCase();\n list = list.filter((e) => {\n const hay = [\n e.title || '',\n e.description || '',\n e.kind || '',\n e.agent || '',\n e.actor || '',\n ].join(' ').toLowerCase();\n return hay.includes(needle);\n });\n }\n return list;\n }, [merged, source, search]);\n\n // Time-windowed set (older events clipped).\n const cutoff = Date.now() - maxDays * 86_400_000;\n const windowed = useMemo<ExtendedEvent[]>(\n () => filtered.filter((e) => (e.ts || 0) >= cutoff || e.ts === undefined),\n [filtered, cutoff],\n );\n\n const grouped = useMemo<{ key: string; label: string; events: ExtendedEvent[] }[]>(() => {\n const map = new Map<string, ExtendedEvent[]>();\n for (const e of windowed) {\n const ts = e.ts || Date.now();\n const k = dayKey(ts);\n if (!map.has(k)) map.set(k, []);\n map.get(k)!.push(e);\n }\n const out: { key: string; label: string; events: ExtendedEvent[] }[] = [];\n for (const [k, evs] of map) {\n const first = evs.find((x) => x.ts);\n const ts = first?.ts ?? Date.now();\n out.push({ key: k, label: dayLabel(ts), events: evs });\n }\n return out.sort((a, b) => (a.key < b.key ? 1 : -1));\n }, [windowed]);\n\n const counts = useMemo(() => {\n const acc: Record<Source, number> = { all: 0, task: 0, agent: 0, goal: 0, settings: 0, system: 0, git: 0 };\n for (const e of merged) {\n const s = inferSource(e);\n acc.all += 1;\n acc[s] += 1;\n }\n return acc;\n }, [merged]);\n\n const sparklineData = useMemo<number[]>(() => {\n // Chronological order (grouped is desc), so reverse to oldest-first.\n return [...grouped].reverse().map((g) => g.events.length);\n }, [grouped]);\n\n const exportNdjson = async (): Promise<void> => {\n setExportError(null);\n try {\n const res = await fetchJson<{ events?: ActivityEvent[] }>('/api/activity?limit=10000');\n const text = (res.events || []).map((e) => JSON.stringify(e)).join('\\n');\n const blob = new Blob([text], { type: 'application/x-ndjson' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-activity-${new Date().toISOString().slice(0, 10)}.ndjson`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n } catch (err) {\n setExportError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"activity-view\">\n <ViewHeader\n title=\"Activity\"\n description=\"Day-grouped changelog across tasks, agents, goals, settings, and git.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <input\n type=\"search\"\n placeholder=\"Search…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search activity\"\n style={{\n height: 28,\n padding: '0 var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-12)',\n width: 200,\n outline: 'none',\n }}\n />\n <Inline align=\"center\" gap={1}>\n <Circle\n size={8}\n aria-hidden\n style={{ color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}\n fill=\"currentColor\"\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {autoRefresh ? 'Live' : 'Paused'}\n </span>\n <Button variant=\"ghost\" onClick={() => setAutoRefresh((v) => !v)} aria-label={autoRefresh ? 'Pause stream' : 'Resume stream'}>\n {autoRefresh ? 'Pause' : 'Resume'}\n </Button>\n </Inline>\n <Button variant=\"secondary\" onClick={() => { void exportNdjson(); }}>\n <Filter size={12} aria-hidden /> Export NDJSON\n </Button>\n </Inline>\n }\n />\n <ListHeader\n title=\"Feed\"\n count={windowed.length}\n sparkline={sparklineData.length >= 2 ? <Sparkline data={sparklineData} width={120} height={28} /> : undefined}\n description={`${counts.task} task · ${counts.agent} agent · ${counts.goal} goal`}\n testid=\"activity-list-header\"\n />\n\n {exportError !== null && (\n <div role=\"alert\" style={{ padding: '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)' }}>\n {exportError}\n </div>\n )}\n\n {/* Source filter chips */}\n <Inline align=\"center\" gap={2} wrap>\n <FilterChip label={`All (${counts.all})`} active={source === 'all'} onClick={() => setSource('all')} icon={<ActivityIcon size={12} aria-hidden />} />\n {(Object.keys(SOURCE_META) as Array<Exclude<Source, 'all'>>).map((s) => {\n const meta = SOURCE_META[s];\n const Icon = meta.icon;\n return (\n <FilterChip\n key={s}\n label={`${meta.label} (${counts[s]})`}\n active={source === s}\n onClick={() => setSource(s)}\n icon={<Icon size={12} aria-hidden />}\n />\n );\n })}\n </Inline>\n\n {/* Display prefs */}\n <Card>\n <CardBody>\n <Grid cols={3} gap={4}>\n <Stack gap={1}>\n <label htmlFor=\"cl-auto\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Live tail</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-auto\" checked={autoRefresh} onCheckedChange={setAutoRefresh} />\n <span style={{ fontSize: 'var(--fs-12)', color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}>\n {autoRefresh ? 'on' : 'paused'}\n </span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-compact\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Compact rows</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-compact\" checked={compact} onCheckedChange={setCompact} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{compact ? 'compact' : 'comfortable'}</span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-days\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Look back</label>\n <Inline align=\"center\" gap={2}>\n <Slider id=\"cl-days\" value={[maxDays]} onValueChange={(v) => setMaxDays(v[0] ?? 14)} min={1} max={90} step={1} />\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{maxDays}d</code>\n </Inline>\n </Stack>\n </Grid>\n </CardBody>\n </Card>\n\n {/* Empty state */}\n {!events.loading && windowed.length === 0 && (\n <Card>\n <CardBody>\n <Stack gap={1}>\n <strong>No activity matching filters.</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Clear the source filter or extend the look-back window.\n </span>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {events.loading && windowed.length === 0 ? (\n <Skeleton style={{ height: 320 }} />\n ) : events.error && windowed.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load activity\"\n description=\"The activity feed failed to fetch. Retry to refetch.\"\n error={events.error}\n onRetry={() => void events.refetch()}\n testid=\"activity-error\"\n />\n ) : (\n <Stack gap={5}>\n {grouped.map((group) => (\n <Stack key={group.key} gap={3}>\n <Inline\n align=\"center\"\n gap={2}\n style={{ position: 'sticky', top: 0, padding: 'var(--space-2) var(--space-3)', background: 'color-mix(in oklch, var(--surface-0) 88%, transparent)', backdropFilter: 'blur(8px)', borderRadius: 'var(--radius-md)', border: '1px solid var(--border)', zIndex: 1 }}\n >\n <h2 style={{ margin: 0, fontSize: 'var(--fs-16)', fontWeight: 600 }}>{group.label}</h2>\n <Badge tone=\"neutral\">{group.events.length}</Badge>\n <Clock size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {group.events.filter((e) => e.ts === undefined).length > 0\n ? 'live + historical'\n : 'historical only'}\n </span>\n </Inline>\n\n <Stack gap={1}>\n {group.events.map((e, i) => {\n const v = eventVisual(e);\n const SourceIcon = SOURCE_META[v.source as Exclude<Source, 'all'>]?.icon || Cpu;\n const ts = e.ts ?? Date.now();\n return (\n <Box\n key={`${e.id ?? `${ts}-${i}`}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto',\n gap: 12,\n padding: compact ? '6px 10px' : 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n alignItems: 'center',\n }}\n >\n {/* Icon column */}\n <Box\n style={{\n width: 32,\n height: 32,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-pill)',\n background: `color-mix(in oklch, var(--${v.tone === 'neutral' ? 'fg-muted' : v.tone}) 18%, var(--surface-0))`,\n color: `var(--${v.tone === 'neutral' ? 'fg-muted' : v.tone})`,\n }}\n >\n <v.icon size={14} aria-hidden />\n </Box>\n {/* Body */}\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-14)' }}>{e.title ?? e.description ?? e.kind ?? 'event'}</strong>\n <Badge tone={SOURCE_META[v.source as Exclude<Source, 'all'>]?.tone ?? 'neutral'}>\n <Inline align=\"center\" gap={1}><SourceIcon size={10} aria-hidden /> {SOURCE_META[v.source as Exclude<Source, 'all'>]?.label ?? v.source}</Inline>\n </Badge>\n {e.kind && <Badge tone=\"neutral\">{e.kind}</Badge>}\n </Inline>\n {e.description && e.description !== e.title && (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>{e.description}</span>\n )}\n {renderDiff(e.meta)}\n </Stack>\n {/* Meta column */}\n <Stack align=\"end\" gap={1}>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{timeShort(ts)}</code>\n {typeof e.actor === 'string' && (\n <Inline align=\"center\" gap={1}><Circle size={8} aria-hidden style={{ color: 'var(--accent)' }} /><span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{e.actor}</span></Inline>\n )}\n </Stack>\n </Box>\n );\n })}\n </Stack>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n );\n}\n\nfunction FilterChip({ label, active, onClick, icon }: { label: string; active: boolean; onClick: () => void; icon?: React.ReactNode }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 10px',\n borderRadius: 'var(--radius-pill)',\n border: `1px solid ${active ? 'var(--accent)' : 'var(--border)'}`,\n background: active ? 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))' : 'var(--surface-1)',\n color: active ? 'var(--accent)' : 'var(--fg)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n fontWeight: active ? 600 : 500,\n }}\n >\n {icon}\n {label}\n </button>\n );\n}"],"names":["Filter","createLucideIcon","SOURCE_META","Layers","Bot","Target","SettingsIcon","Cpu","GitMerge","EVENT_TONE_MAP","GitPullRequest","CheckCircle2","AlertTriangle","Wrench","ActivityIcon","inferSource","e","hint","eventVisual","m","inferred","dayKey","ts","d","dayLabel","now","today","start","diffDays","timeShort","renderDiff","meta","jsx","Box","l","i","jsxs","props","cx","ActivityView","events","useFetch","live","setLive","useState","source","setSource","autoRefresh","setAutoRefresh","compact","setCompact","maxDays","setMaxDays","exportError","setExportError","search","setSearch","onEvent","useCallback","msg","ev","prev","useWsMessage","merged","useMemo","_a","filtered","list","needle","cutoff","windowed","grouped","map","k","out","evs","first","x","a","b","counts","acc","s","sparklineData","g","exportNdjson","text","fetchJson","blob","url","err","FetchError","Stack","ViewHeader","Inline","Circle","Button","v","ListHeader","Sparkline","FilterChip","Icon","Card","CardBody","Grid","Switch","Slider","Skeleton","ErrorState","group","Badge","Clock","SourceIcon","_b","_c","label","active","onClick","icon"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{j as e,r as a}from"./cmdk-DMW_3pWz.js";import{g as u,S as f,D as x,I as p,d as n,f as S,F as b}from"./main-zDgXFFYt.js";import{V as j}from"./ViewHeader-2Oyjj9Yt.js";import{C as k,b as T}from"./Card-ZAdgpn3-.js";import{G as w}from"./Grid-CN6IV8NB.js";import{T as C}from"./trash-2-BzH_id_0.js";import{B as D}from"./brain-B8oDQ4kM.js";import{P as z}from"./power-off-EnQo8iQy.js";import{D as R}from"./download-Cct5qHWG.js";import{S as P}from"./shield-alert-COajyBNI.js";import{R as O}from"./refresh-cw-CYS8luDH.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 A=u("Hammer",[["path",{d:"m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9",key:"eefl8a"}],["path",{d:"m18 15 4-4",key:"16gjal"}],["path",{d:"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5",key:"b7pghm"}]]);/**
|
|
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 E=u("ScrollText",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]),V=[{id:"gc",title:"Garbage collect",description:"Prune empty session files + orphaned task rows from the cache.",icon:C,endpoint:"/api/admin/gc",method:"POST",destructive:!1},{id:"cache-clear",title:"Clear cache",description:"Wipe the dashboard cache directory. Rebuilds on next access.",icon:x,endpoint:"/api/admin/cache/clear",method:"POST",destructive:!0},{id:"memory-reindex",title:"Reindex memory",description:"Rebuild the vault search index.",icon:D,endpoint:"/api/admin/memory/reindex",method:"POST",destructive:!1},{id:"logs-purge",title:"Purge old logs",description:"Delete log files older than 14 days from ~/.config/bizar/logs.",icon:E,endpoint:"/api/admin/logs/purge",method:"POST",destructive:!0},{id:"restart",title:"Restart dashboard",description:"Signal the server to shut down. The CLI launcher restarts it.",icon:z,endpoint:"/api/admin/restart",method:"POST",destructive:!0},{id:"rebuild",title:"Rebuild",description:"Re-run the installer build step.",icon:A,endpoint:"/api/admin/rebuild",method:"POST",destructive:!0},{id:"export-activity",title:"Export activity",description:"Download the full activity log as NDJSON.",icon:R,endpoint:"/api/admin/activity/export",method:"GET",destructive:!1}];function _(){return e.jsxs(f,{gap:4,"data-testid":"admin-view",children:[e.jsx(j,{title:"Admin",description:"Maintenance actions. Destructive actions require an inline confirm."}),e.jsx(w,{cols:{base:1,md:2,lg:3},gap:3,children:V.map(t=>e.jsx($,{action:t},t.id))})]})}function $({action:t}){const[r,o]=a.useState(!1),[v,s]=a.useState(!1),[l,d]=a.useState(null),[c,m]=a.useState(null),g=t.icon,h=async()=>{o(!0),m(null),d(null);try{if(t.method==="GET")window.open(t.endpoint,"_blank"),d("Download started");else{const i=await S(t.endpoint,{method:t.method,body:{}}),y=i.note?i.note:i.files!==void 0?`${i.files} file(s) removed (${i.bytes??0} bytes)`:(i.ok,"Done");d(y)}s(!1)}catch(i){m((i instanceof b,i.message))}finally{o(!1)}};return e.jsx(k,{variant:"default",children:e.jsx(T,{children:e.jsxs(f,{gap:2,children:[e.jsxs(p,{align:"center",gap:2,children:[e.jsx(g,{size:18,"aria-hidden":!0}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.title}),t.destructive&&e.jsxs("span",{style:{marginLeft:"auto",color:"var(--danger)",fontSize:"var(--fs-11)"},"aria-label":"Destructive",children:[e.jsx(P,{size:14,"aria-hidden":!0,style:{verticalAlign:"middle"}})," destructive"]})]}),e.jsx("p",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)",margin:0},children:t.description}),l!==null&&e.jsx("span",{"data-testid":`admin-result-${t.id}`,style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:l}),c!==null&&e.jsx("span",{role:"alert","data-testid":`admin-error-${t.id}`,style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:c}),v?e.jsxs(p,{gap:1,children:[e.jsx(n,{variant:"danger",onClick:()=>void h(),disabled:r,"data-testid":`admin-confirm-${t.id}`,children:"Confirm"}),e.jsx(n,{variant:"ghost",onClick:()=>s(!1),disabled:r,"data-testid":`admin-cancel-${t.id}`,children:"Cancel"})]}):e.jsxs(n,{variant:t.destructive?"danger":"primary",onClick:()=>t.destructive?s(!0):void h(),disabled:r,"data-testid":`admin-run-${t.id}`,children:[e.jsx(O,{size:14,"aria-hidden":!0})," ",r?"Working…":"Run"]})]})})})}export{_ as AdminView};
|