@polderlabs/bizar 10.4.3 → 10.4.4
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/dist/assets/{ActivityFeed-DC0JiK49.js → ActivityFeed-RQeyFifx.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js.map → ActivityFeed-RQeyFifx.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js → ActivityView-CibyssPM.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js.map → ActivityView-CibyssPM.js.map} +1 -1
- package/bizar-dash/dist/assets/AdminView-BjczABeB.js +11 -0
- package/bizar-dash/dist/assets/AdminView-BjczABeB.js.map +1 -0
- package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js → AgentActivity-Bywt1twv.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js.map → AgentActivity-Bywt1twv.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-CIQkZH8_.js → AgentsView-BnOjjM74.js} +4 -4
- package/bizar-dash/dist/assets/AgentsView-BnOjjM74.js.map +1 -0
- package/bizar-dash/dist/assets/{Alert-MwVEymjy.js → Alert-BZGk39mB.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-MwVEymjy.js.map → Alert-BZGk39mB.js.map} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-B-YUwZyb.js → ArtifactsView-CfYB1le1.js} +3 -3
- package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +1 -0
- package/bizar-dash/dist/assets/{AuthView-LaQuGo4u.js → AuthView-D4frSShw.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-LaQuGo4u.js.map → AuthView-D4frSShw.js.map} +1 -1
- package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js +6 -0
- package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js.map +1 -0
- package/bizar-dash/dist/assets/{BackgroundJobsView-CO3DEG8R.js → BackgroundJobsView-DEStvILz.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-CO3DEG8R.js.map → BackgroundJobsView-DEStvILz.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js → BackupView-B875KQa4.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js.map → BackupView-B875KQa4.js.map} +1 -1
- package/bizar-dash/dist/assets/Banner-C8HEcT5l.js +1 -0
- package/bizar-dash/dist/assets/Banner-C8HEcT5l.js.map +1 -0
- package/bizar-dash/dist/assets/{Card-BmXiT4c6.js → Card-BtsmkhJa.js} +1 -1
- package/bizar-dash/dist/assets/{Card-BmXiT4c6.js.map → Card-BtsmkhJa.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js → ChatView-CkNS0SD8.js} +3 -3
- package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js.map → ChatView-CkNS0SD8.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-Dei66BLx.js → Chip-XPOk0d_E.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-Dei66BLx.js.map → Chip-XPOk0d_E.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-D-YNmzKi.js → ClaudeSessionsView-BprGo67K.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-D-YNmzKi.js.map → ClaudeSessionsView-BprGo67K.js.map} +1 -1
- package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +1 -0
- package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js.map +1 -0
- package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js → ConfigView-BntUrW7s.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js.map → ConfigView-BntUrW7s.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js → DiagnosticsView-4x0Zu3yP.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js.map → DiagnosticsView-4x0Zu3yP.js.map} +1 -1
- package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js +6 -0
- package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js.map +1 -0
- package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js → DoctorView-DepBdQGR.js} +2 -2
- package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js.map → DoctorView-DepBdQGR.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js → EmptyState-DjKtY1Qi.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js.map → EmptyState-DjKtY1Qi.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js → EnvVarsView-S4Pbm128.js} +3 -3
- package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js.map → EnvVarsView-S4Pbm128.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js → ErrorState-CBJbEQ8B.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js.map → ErrorState-CBJbEQ8B.js.map} +1 -1
- package/bizar-dash/dist/assets/EvalView-BeAyMCD1.js +1 -0
- package/bizar-dash/dist/assets/{EvalView-lgUhlGJh.js.map → EvalView-BeAyMCD1.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js → GoalsView-BZr8In4c.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js.map → GoalsView-BZr8In4c.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-BThCPJaV.js → Grid--WKvqu5h.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-BThCPJaV.js.map → Grid--WKvqu5h.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js → HistoryView-djEbzqtk.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js.map → HistoryView-djEbzqtk.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-cAQOvR8U.js → Input-h_nSOtwm.js} +1 -1
- package/bizar-dash/dist/assets/{Input-cAQOvR8U.js.map → Input-h_nSOtwm.js.map} +1 -1
- package/bizar-dash/dist/assets/LibrariesView-Vez8CvNq.js +6 -0
- package/bizar-dash/dist/assets/{LibrariesView-Ca_PRjUm.js.map → LibrariesView-Vez8CvNq.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-CMk9wOae.js → LightRAGView-DvqzQoBp.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-CMk9wOae.js.map → LightRAGView-DvqzQoBp.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js → ListHeader-CM8QoIWG.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js.map → ListHeader-CM8QoIWG.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js → MemoryView-DnL8E2vI.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js.map → MemoryView-DnL8E2vI.js.map} +1 -1
- package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js +1 -0
- package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js.map +1 -0
- package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js → ModsView-BVM3X5xc.js} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js.map → ModsView-BVM3X5xc.js.map} +1 -1
- package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js +6 -0
- package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js.map +1 -0
- package/bizar-dash/dist/assets/ObsidianView-mI3qW9OP.js +1 -0
- package/bizar-dash/dist/assets/{ObsidianView-C-AvHfpT.js.map → ObsidianView-mI3qW9OP.js.map} +1 -1
- package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js.map +1 -0
- package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js → ProgressBar-BnaBqv-W.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js.map → ProgressBar-BnaBqv-W.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js → ProjectsView-C81WTFka.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js.map → ProjectsView-C81WTFka.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js → ProvidersView-2cn-TALE.js} +2 -2
- package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js.map → ProvidersView-2cn-TALE.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-8qxH3bg7.js → SchedulesView-o9AtIsH9.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-8qxH3bg7.js.map → SchedulesView-o9AtIsH9.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-D5AuVxxV.js → Select-CiGWEN8I.js} +1 -1
- package/bizar-dash/dist/assets/{Select-D5AuVxxV.js.map → Select-CiGWEN8I.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js → SettingsRow-CflGJymA.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js.map → SettingsRow-CflGJymA.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-UD403neY.js → SettingsView-2HSFJPPK.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-UD403neY.js.map → SettingsView-2HSFJPPK.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js → Sheet-B-CMP9-_.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js.map → Sheet-B-CMP9-_.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js → Slider-Z4TP_CXY.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js.map → Slider-Z4TP_CXY.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js → Sparkline-cvkv2HbU.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js.map → Sparkline-cvkv2HbU.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js → Switch-jcYo4lmp.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js.map → Switch-jcYo4lmp.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-DseftDlx.js → TasksView-CQaSFzWY.js} +2 -2
- package/bizar-dash/dist/assets/{TasksView-DseftDlx.js.map → TasksView-CQaSFzWY.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js → Textarea-xnAybFGd.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js.map → Textarea-xnAybFGd.js.map} +1 -1
- package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js +1 -0
- package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js.map +1 -0
- package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js → UsageView-DMFbBOfH.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js.map → UsageView-DMFbBOfH.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js → ViewHeader-C-t1U2cQ.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js.map → ViewHeader-C-t1U2cQ.js.map} +1 -1
- package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +1 -0
- package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js.map +1 -0
- package/bizar-dash/dist/assets/{brain-D6tAeUDE.js → brain-DhAzcHUk.js} +1 -1
- package/bizar-dash/dist/assets/{brain-D6tAeUDE.js.map → brain-DhAzcHUk.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js → calendar-B9Wbemh7.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js.map → calendar-B9Wbemh7.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-fPTATiOs.js → circle-6NJF_Xl6.js} +1 -1
- package/bizar-dash/dist/assets/{circle-fPTATiOs.js.map → circle-6NJF_Xl6.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js → circle-alert-Dz8lGfCZ.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js.map → circle-alert-Dz8lGfCZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js → circle-check-DFB50ojt.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js.map → circle-check-DFB50ojt.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-E-G5aGua.js → clock-ClVA6-hQ.js} +1 -1
- package/bizar-dash/dist/assets/{clock-E-G5aGua.js.map → clock-ClVA6-hQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-DBkNb6oI.js → download-BvJddD8D.js} +1 -1
- package/bizar-dash/dist/assets/{download-DBkNb6oI.js.map → download-BvJddD8D.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js → external-link-DvL89gaZ.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js.map → external-link-DvL89gaZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js → file-text-BOroDtZE.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js.map → file-text-BOroDtZE.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-CEYjeWFX.js → filter-DwPjMRQt.js} +1 -1
- package/bizar-dash/dist/assets/{filter-CEYjeWFX.js.map → filter-DwPjMRQt.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js → git-pull-request-TDb1inux.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js.map → git-pull-request-TDb1inux.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-DDAMz_H5.css → main-B7D_IMTh.css} +1 -1
- package/bizar-dash/dist/assets/main-BURAlktW.js +277 -0
- package/bizar-dash/dist/assets/main-BURAlktW.js.map +1 -0
- package/bizar-dash/dist/assets/{network-BsfwrUA-.js → network-BcCoCzIY.js} +1 -1
- package/bizar-dash/dist/assets/{network-BsfwrUA-.js.map → network-BcCoCzIY.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-C8PN1_yO.js → pause-BllItT2_.js} +1 -1
- package/bizar-dash/dist/assets/{pause-C8PN1_yO.js.map → pause-BllItT2_.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil---XuvKlz.js → pencil-DAwM-CC3.js} +1 -1
- package/bizar-dash/dist/assets/{pencil---XuvKlz.js.map → pencil-DAwM-CC3.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-fMLPTihK.js → play-mJh67AXo.js} +2 -2
- package/bizar-dash/dist/assets/{play-fMLPTihK.js.map → play-mJh67AXo.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-CG8al2Kq.js → plug-BjfntCMC.js} +1 -1
- package/bizar-dash/dist/assets/{plug-CG8al2Kq.js.map → plug-BjfntCMC.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-uA5Ecuch.js → plus-Cm6-fo14.js} +1 -1
- package/bizar-dash/dist/assets/{plus-uA5Ecuch.js.map → plus-Cm6-fo14.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DSUlNIuR.js → power-CXN9y2KV.js} +1 -1
- package/bizar-dash/dist/assets/{power-DSUlNIuR.js.map → power-CXN9y2KV.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js → power-off-DUZqwMf9.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js.map → power-off-DUZqwMf9.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js → refresh-ccw-DA8_IB9l.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js.map → refresh-ccw-DA8_IB9l.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js → refresh-cw-DwlP59en.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js.map → refresh-cw-DwlP59en.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js → rotate-ccw-DMTASfAn.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js.map → rotate-ccw-DMTASfAn.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js → rotate-cw-BDX5SE2s.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js.map → rotate-cw-BDX5SE2s.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-RcZOXR0U.js → save-Y0jPK5D6.js} +1 -1
- package/bizar-dash/dist/assets/{save-RcZOXR0U.js.map → save-Y0jPK5D6.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-Bg2X_ibk.js → send-C8wwPHhR.js} +2 -2
- package/bizar-dash/dist/assets/{send-Bg2X_ibk.js.map → send-C8wwPHhR.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js → shield-alert-DEvq9UG0.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js.map → shield-alert-DEvq9UG0.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-B885GY46.js → trash-2-D6qePV_q.js} +2 -2
- package/bizar-dash/dist/assets/{trash-2-B885GY46.js.map → trash-2-D6qePV_q.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js → trending-up-BZzo_1ic.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js.map → trending-up-BZzo_1ic.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js → triangle-alert-B2oHbmoh.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js.map → triangle-alert-B2oHbmoh.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-C-oafpyE.js → upload-Dy59aZn6.js} +1 -1
- package/bizar-dash/dist/assets/{upload-C-oafpyE.js.map → upload-Dy59aZn6.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js → zap-DENVhJnO.js} +2 -2
- package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js.map → zap-DENVhJnO.js.map} +1 -1
- package/bizar-dash/dist/index.html +2 -2
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/web/v8/App.tsx +25 -4
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +8 -5
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +57 -1
- package/bizar-dash/src/web/v8/ui/styles/globals.css +14 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +11 -6
- package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +32 -5
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +11 -4
- package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +82 -13
- package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +19 -0
- package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +1 -1
- package/bizar-dash/tests/admin-run-grouping.test.mjs +42 -0
- package/bizar-dash/tests/agents-preview-truncate.test.mjs +35 -0
- package/bizar-dash/tests/empty-state-docs.test.mjs +55 -0
- package/bizar-dash/tests/focus-visible.test.mjs +30 -0
- package/bizar-dash/tests/notifications-dismiss-restore.test.mjs +85 -0
- package/bizar-dash/tests/palette-shortcut-hint.test.mjs +58 -0
- package/bizar-dash/tests/sidebar-distinct-icons.test.mjs +28 -0
- package/bizar-dash/tests/theme-toggle-icon.test.mjs +28 -0
- package/bizar-dash/tests/topbar-design-system.test.mjs +56 -0
- package/bizar-dash/vite.config.ts +8 -0
- package/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js +0 -11
- package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js.map +0 -1
- package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +0 -1
- package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js.map +0 -1
- package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js +0 -6
- package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js.map +0 -1
- package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js +0 -1
- package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js.map +0 -1
- package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js +0 -6
- package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js.map +0 -1
- package/bizar-dash/dist/assets/EvalView-lgUhlGJh.js +0 -1
- package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +0 -6
- package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js +0 -1
- package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js.map +0 -1
- package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js +0 -6
- package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js.map +0 -1
- package/bizar-dash/dist/assets/ObsidianView-C-AvHfpT.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js.map +0 -1
- package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js +0 -6
- package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js.map +0 -1
- package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js +0 -1
- package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js.map +0 -1
- package/bizar-dash/dist/assets/main-BZMmD6a8.js +0 -249
- package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +0 -1
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{j as e,r as m}from"./cmdk-C3F6LD6N.js";import{B as x,g as f,u as b,a as k,S as y,h as j}from"./main-BZMmD6a8.js";import{C as S,V as E}from"./ViewHeader-BaCWNuVX.js";import"./Grid-BThCPJaV.js";import"./AgentActivity-BLcqqkt2.js";import"./Input-cAQOvR8U.js";import"./Textarea-CcQGSgSH.js";import"./Switch-C-_zcNdl.js";import"./Select-D5AuVxxV.js";import"./Slider-hvaVD_SW.js";import"./Alert-MwVEymjy.js";import"./Avatar-Dg4OF4RD.js";import{E as T}from"./EmptyState-CdDQmfEL.js";import"./Sheet-CxXf6gvC.js";import"./Card-BmXiT4c6.js";import"./Chip-Dei66BLx.js";import"./ActivityFeed-DC0JiK49.js";import"./Sparkline-DqmQzdJH.js";import"./ProgressBar-ya2PCj8L.js";import{P as C}from"./power-DSUlNIuR.js";import"./SettingsRow-BBALf9dA.js";import"./MessageBubble-CrCJ0SYG.js";import{E as N}from"./ErrorState-BRvj8qZZ.js";import"./dnd-kit-BAOLODOI.js";import"./plus-uA5Ecuch.js";import"./calendar-BrMJf3vl.js";import"./index-B1OIS316.js";import"./index-CR0TeJmc.js";import"./circle-alert-D7jn06kH.js";import"./triangle-alert-DLmUhymD.js";import"./circle-check-DHs37Sot.js";import"./trending-up-CqUBvVxw.js";import"./refresh-ccw-BL7B0NO1.js";const I={enabled:"Enabled",disabled:"Disabled",error:"Error"},L={enabled:"success",disabled:"neutral",error:"danger"};function w(s){const{name:t,slug:i,status:r,description:o,meta:l,actions:p,onOpen:c,className:n}=s;return e.jsxs("button",{type:"button",onClick:c,className:f("v8-library-item",`v8-library-item--${r}`,n),style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",width:"100%",padding:"var(--space-3) var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius)",textAlign:"left",cursor:c!==void 0?"pointer":"default",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:28,height:28,marginTop:2,borderRadius:"var(--radius-sm)",background:r==="enabled"?"color-mix(in oklch, var(--success) 14%, transparent)":r==="error"?"color-mix(in oklch, var(--danger) 14%, transparent)":"var(--surface-2)",color:r==="enabled"?"var(--success)":r==="error"?"var(--danger)":"var(--fg-muted)",flexShrink:0},children:e.jsx(C,{size:14,"aria-hidden":"true"})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:t}),e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",fontFamily:"var(--font-mono, ui-monospace, monospace)"},children:i})]}),o!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:o}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",marginTop:6},children:[l!==void 0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:l}):e.jsx("span",{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx(x,{tone:L[r],size:"sm",children:I[r]}),p,e.jsx(S,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]})]}),e.jsx("style",{children:`
|
|
2
|
-
.v8-library-item:hover {
|
|
3
|
-
border-color: var(--accent);
|
|
4
|
-
background: var(--surface-2);
|
|
5
|
-
}
|
|
6
|
-
`})]})}function z(s){const{children:t,className:i}=s;return e.jsx("div",{className:f("v8-library-grid",i),style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(min(100%, 320px), 1fr))",gap:"var(--space-3)"},children:t})}const d={skills:"Skills",mcps:"MCPs",hooks:"Hooks"},A={skills:"Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.",mcps:"MCP server registrations under `.claude/settings.json` → `mcpServers`.",hooks:"Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd)."},P={skills:"/api/skills",mcps:"/api/skills?kind=mcps",hooks:"/api/skills?kind=hooks"},B={skills:["skills:change","agents:change"],mcps:["mcps:change","agents:change"],hooks:["hooks:change","agents:change"]},R=["skills:change","mcps:change","hooks:change","agents:change"];function _(s){const t=s.status==="enabled"||s.status==="disabled"||s.status==="error"?s.status:"disabled";return{id:s.id,name:s.name,slug:s.slug??s.id,status:t,description:s.description,meta:s.meta}}function fe(s){var u,h;const{kind:t}=s,i=P[t],r=b(i),[o,l]=m.useState(0),p=B[t],c=m.useCallback(()=>l(a=>a+1),[]);for(const a of R)k(a,p.includes(a)?c:()=>{});m.useEffect(()=>{o>0&&r.refetch()},[o,r]);const n=(((u=r.data)==null?void 0:u.skills)||((h=r.data)==null?void 0:h.items)||[]).map(_).reduce((a,g)=>(a.some(v=>v.name===g.name)||a.push(g),a),[]);return e.jsxs(y,{gap:5,"data-testid":`${t}-view`,children:[e.jsx(E,{title:d[t],description:A[t]}),r.loading?e.jsx(j,{style:{height:240}}):r.error&&n.length===0?e.jsx(N,{block:!0,title:`Couldn't load ${d[t].toLowerCase()}`,description:"The library endpoint failed. Retry to refetch.",error:r.error,onRetry:()=>void r.refetch(),testid:`libraries-${t}-error`}):n.length===0?e.jsx(T,{icon:e.jsx("span",{children:"📚"}),title:`No ${d[t].toLowerCase()} installed`,description:`${d[t]} appear here as soon as they are registered.`}):e.jsx(z,{children:n.map(a=>e.jsx(w,{...a},a.id))})]})}export{fe as LibrariesView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,r as d}from"./cmdk-C3F6LD6N.js";import{S as p,u as j,I as c,f as y,h as g,d as f,E as S,b,a0 as z,i as k,F as C}from"./main-BZMmD6a8.js";import{V as T}from"./ViewHeader-BaCWNuVX.js";import{C as x,b as m}from"./Card-BmXiT4c6.js";import{I as w}from"./Input-cAQOvR8U.js";import{N as I}from"./network-BsfwrUA-.js";import{R as P}from"./refresh-ccw-BL7B0NO1.js";import{P as E}from"./power-DSUlNIuR.js";import{P as F}from"./power-off-1CAQsHHy.js";import{F as R}from"./file-text-CEhDgLq2.js";function U(){return e.jsxs(p,{gap:4,"data-testid":"misc-view",children:[e.jsx(T,{title:"Misc",description:"Global search + Tailscale."}),e.jsx(B,{}),e.jsx(N,{})]})}function B(){var i,l,n;const[a,t]=d.useState(""),r=j(`/api/search?q=${encodeURIComponent(a)}`);return e.jsx(x,{variant:"default",children:e.jsxs(m,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Search"}),e.jsxs(c,{gap:2,align:"center",style:{marginTop:"var(--space-2)"},children:[e.jsx(y,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(w,{value:a,onChange:s=>t(s.target.value),placeholder:"Search projects / tasks / artifacts / agents…","data-testid":"misc-search-input"})]}),a.trim()===""?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Type a query to search."}):r.loading&&!r.data?e.jsxs(p,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:24}}),e.jsx(g,{style:{height:24}})]}):(((l=(i=r.data)==null?void 0:i.results)==null?void 0:l.length)??0)===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No results."}):e.jsx(p,{gap:1,style:{marginTop:"var(--space-2)"},children:(((n=r.data)==null?void 0:n.results)??[]).slice(0,30).map((s,o)=>e.jsxs("div",{"data-testid":`misc-search-result-${o}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(q,{kind:s.kind}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:s.title||s.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:s.kind}),s.projectId&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s.projectId]})]}),s.snippet&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.snippet})]},o))})]})})}function q({kind:a}){const t=a==="task"?S:a==="agent"?b:a==="project"?z:R;return e.jsx(t,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}})}function N(){var o,u;const a=j("/api/tailscale/status"),[t,r]=d.useState(!1),[i,l]=d.useState(null),n=d.useCallback(()=>{a.refetch()},[a]),s=async v=>{r(!0),l(null);try{await k(v?"/api/tailscale/enable":"/api/tailscale/disable",{method:"POST"}),n()}catch(h){l((h instanceof C,h.message))}finally{r(!1)}};return e.jsx(x,{variant:"default",children:e.jsxs(m,{children:[e.jsxs(c,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(I,{size:16,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Tailscale"}),a.data&&e.jsx("span",{"data-testid":"misc-tailscale-state",style:{fontSize:"var(--fs-12)",color:a.data.running?"var(--success)":"var(--fg-muted)"},children:a.data.running?`running · ${a.data.hostname??"?"}`:"stopped"})]}),e.jsxs(c,{gap:1,children:[i!==null&&e.jsx("span",{role:"alert","data-testid":"misc-tailscale-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{variant:"ghost",onClick:()=>void n(),"data-testid":"misc-tailscale-refresh",children:[e.jsx(P,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!0),disabled:t,"data-testid":"misc-tailscale-enable",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Enable"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!1),disabled:t,"data-testid":"misc-tailscale-disable",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Disable"]})]})]}),((o=a.data)==null?void 0:o.url)&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx("a",{href:a.data.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-12)",color:"var(--accent)"},children:a.data.url})}),((u=a.data)==null?void 0:u.error)&&e.jsx("span",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:a.data.error})]})})}export{U as MiscView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MiscView-fBT1TOXC.js","sources":["../../src/web/v8/views/Misc/MiscView.tsx"],"sourcesContent":["/**\n * v8/views/Misc/MiscView.tsx — Sprint S43, v9.3.0.\n *\n * The \"doesn't fit anywhere else\" surface: global fuzzy search\n * (GET /api/search) + Tailscale card (GET /api/tailscale/status,\n * POST /api/tailscale/{enable,disable}).\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Search, Network, Power, PowerOff, RefreshCcw, FileText, CheckSquare, Bot, Folder } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface SearchResult {\n kind?: string;\n id?: string;\n title?: string;\n projectId?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface SearchResponse {\n query?: string;\n results?: SearchResult[];\n total?: number;\n}\n\ninterface TailscaleStatus {\n enabled?: boolean;\n running?: boolean;\n hostname?: string;\n url?: string;\n error?: string;\n}\n\nexport function MiscView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"misc-view\">\n <ViewHeader title=\"Misc\" description=\"Global search + Tailscale.\" />\n <SearchPanel />\n <TailscalePanel />\n </Stack>\n );\n}\n\nfunction SearchPanel(): JSX.Element {\n const [q, setQ] = useState<string>('');\n const payload = useFetch<SearchResponse>(`/api/search?q=${encodeURIComponent(q)}`);\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Search</strong>\n <Inline gap={2} align=\"center\" style={{ marginTop: 'var(--space-2)' }}>\n <Search size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <Input value={q} onChange={(e) => setQ((e.target as HTMLInputElement).value)} placeholder=\"Search projects / tasks / artifacts / agents…\" data-testid=\"misc-search-input\" />\n </Inline>\n {q.trim() === '' ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>Type a query to search.</span>\n ) : payload.loading && !payload.data ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 24 }} />\n <Skeleton style={{ height: 24 }} />\n </Stack>\n ) : (payload.data?.results?.length ?? 0) === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>No results.</span>\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {(payload.data?.results ?? []).slice(0, 30).map((r, i) => (\n <div key={i} data-testid={`misc-search-result-${i}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <KindIcon kind={r.kind} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{r.title || r.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{r.kind}</code>\n {r.projectId && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {r.projectId}</span>}\n </Inline>\n {r.snippet && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.snippet}</span>}\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n );\n}\n\nfunction KindIcon({ kind }: { kind?: string }): JSX.Element {\n const Icon = (kind === 'task' ? CheckSquare : kind === 'agent' ? Bot : kind === 'project' ? Folder : FileText) as typeof Folder;\n return <Icon size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />;\n}\n\nfunction TailscalePanel(): JSX.Element {\n const payload = useFetch<TailscaleStatus>('/api/tailscale/status');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const toggle = async (enable: boolean): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(enable ? '/api/tailscale/enable' : '/api/tailscale/disable', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden style={{ color: 'var(--accent)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>Tailscale</strong>\n {payload.data && (\n <span data-testid=\"misc-tailscale-state\" style={{ fontSize: 'var(--fs-12)', color: payload.data.running ? 'var(--success)' : 'var(--fg-muted)' }}>\n {payload.data.running ? `running · ${payload.data.hostname ?? '?'}` : 'stopped'}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"misc-tailscale-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"misc-tailscale-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(true)} disabled={busy} data-testid=\"misc-tailscale-enable\">\n <Power size={14} aria-hidden /> Enable\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(false)} disabled={busy} data-testid=\"misc-tailscale-disable\">\n <PowerOff size={14} aria-hidden /> Disable\n </Button>\n </Inline>\n </Inline>\n {payload.data?.url && (\n <div style={{ marginTop: 'var(--space-2)' }}>\n <a href={payload.data.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-12)', color: 'var(--accent)' }}>{payload.data.url}</a>\n </div>\n )}\n {payload.data?.error && (\n <span role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{payload.data.error}</span>\n )}\n </CardBody>\n </Card>\n );\n}"],"names":["MiscView","jsxs","Stack","jsx","ViewHeader","SearchPanel","TailscalePanel","q","setQ","useState","payload","useFetch","Card","CardBody","Inline","Search","Input","e","Skeleton","_b","_a","r","i","KindIcon","kind","Icon","CheckSquare","Bot","Folder","FileText","busy","setBusy","error","setError","refresh","useCallback","toggle","enable","fetchJson","err","FetchError","Network","Button","RefreshCcw","Power","PowerOff"],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r as c,j as t}from"./cmdk-C3F6LD6N.js";import{c as b,u as w,a as S,S as d,I as f,d as h,h as g,y as E,B as z,i as m,F as p}from"./main-BZMmD6a8.js";import{V as R}from"./ViewHeader-BaCWNuVX.js";import{C as $,b as B}from"./Card-BmXiT4c6.js";import{E as I}from"./EmptyState-CdDQmfEL.js";import{R as M}from"./refresh-cw-CR9BzJik.js";import{T as N}from"./trash-2-B885GY46.js";/**
|
|
2
|
-
* @license lucide-react v0.460.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const D=b("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]);function T(s){return s.tone&&["info","success","warning","danger","neutral"].includes(s.tone)?s.tone:"neutral"}function F(s){if(!s)return"";const r=Date.parse(s);if(Number.isNaN(r))return"";const i=Math.max(0,Date.now()-r);return i<6e4?"just now":i<36e5?`${Math.round(i/6e4)}m ago`:i<864e5?`${Math.round(i/36e5)}h ago`:new Date(r).toLocaleString()}function W(){const s=w("/api/notifications?limit=200"),[r,i]=c.useState([]),[u,n]=c.useState(null),[x,o]=c.useState(null);c.useEffect(()=>{var e;(e=s.data)!=null&&e.notifications&&i(s.data.notifications)},[s.data]);const y=c.useCallback(e=>{e.type==="notifications:change"&&s.refetch()},[s]);S("notifications:change",y);const k=async e=>{n(e),o(null);try{await m(`/api/notifications/${encodeURIComponent(e)}/read`,{method:"POST"}),i(a=>a.map(l=>l.id===e?{...l,read:!0}:l))}catch(a){o((a instanceof p,a.message))}finally{n(null)}},v=async()=>{n("all"),o(null);try{await m("/api/notifications/read-all",{method:"POST"}),i(e=>e.map(a=>({...a,read:!0})))}catch(e){o((e instanceof p,e.message))}finally{n(null)}},C=async e=>{n(e),o(null);try{await m(`/api/notifications/${encodeURIComponent(e)}`,{method:"DELETE"}),i(a=>a.filter(l=>l.id!==e))}catch(a){o((a instanceof p,a.message))}finally{n(null)}},j=r.filter(e=>!e.read).length;return t.jsxs(d,{gap:5,"data-testid":"notifications-view",children:[t.jsx(R,{title:"Notifications",description:`${j} unread of ${r.length} total. Backed by ~/.config/bizar/notifications.jsonl.`,actions:t.jsxs(f,{gap:2,align:"center",children:[x!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),t.jsxs(h,{variant:"ghost",onClick:()=>void s.refetch(),"data-testid":"notifications-refresh",children:[t.jsx(M,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(h,{variant:"secondary",onClick:()=>void v(),disabled:u==="all"||j===0,"data-testid":"notifications-mark-all",children:[t.jsx(D,{size:14,"aria-hidden":!0})," Mark all read"]})]})}),s.loading&&r.length===0?t.jsxs(d,{gap:2,children:[t.jsx(g,{style:{height:64}}),t.jsx(g,{style:{height:64}}),t.jsx(g,{style:{height:64}})]}):r.length===0?t.jsx(I,{icon:t.jsx(E,{size:32,"aria-hidden":!0}),title:"No notifications",description:"Agent runs, task moves, and CI results will land here."}):t.jsx(d,{gap:2,children:r.map(e=>{const a=T(e);return t.jsx($,{variant:"default",style:{opacity:e.read?.7:1},children:t.jsx(B,{children:t.jsxs(f,{align:"start",justify:"between",gap:3,children:[t.jsxs(d,{gap:1,style:{flex:1,minWidth:0},children:[t.jsxs(f,{align:"center",gap:2,children:[!e.read&&t.jsx("span",{"aria-label":"Unread",style:{width:8,height:8,borderRadius:"var(--radius-pill)",background:"var(--accent)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.source||e.id}),e.source&&t.jsx(z,{tone:a,children:e.source}),t.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:F(e.createdAt)})]}),e.body&&t.jsx("span",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:e.body})]}),t.jsxs(f,{gap:1,children:[!e.read&&t.jsx(h,{variant:"ghost",onClick:()=>void k(e.id),disabled:u===e.id,"data-testid":`notification-read-${e.id}`,children:"Mark read"}),t.jsxs(h,{variant:"ghost",onClick:()=>void C(e.id),disabled:u===e.id,"data-testid":`notification-dismiss-${e.id}`,children:[t.jsx(N,{size:12,"aria-hidden":!0})," Dismiss"]})]})]})})},e.id)})})]})}export{W as NotificationsView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsView-BKAZLxM2.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/check-check.js","../../src/web/v8/views/Notifications/NotificationsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CheckCheck = createLucideIcon(\"CheckCheck\", [\n [\"path\", { d: \"M18 6 7 17l-5-5\", key: \"116fxf\" }],\n [\"path\", { d: \"m22 10-7.5 7.5L13 16\", key: \"ke71qq\" }]\n]);\n\nexport { CheckCheck as default };\n//# sourceMappingURL=check-check.js.map\n","import { useCallback, useEffect, useState } from 'react';\nimport { Bell, CheckCheck, Trash2, RefreshCw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * NotificationsView — Sprint S35. Per-user notification stream backed\n * by `/api/notifications`. Pulls unread + read mixed, supports\n * mark-one-read, mark-all-read, and dismiss.\n */\n\ntype Tone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\ninterface NotificationItem {\n id: string;\n title?: string;\n body?: string;\n source?: string;\n tone?: Tone;\n read?: boolean;\n createdAt?: string;\n}\n\ninterface NotificationsResponse {\n notifications: NotificationItem[];\n stats?: { total: number; unread: number };\n}\n\nfunction toneFor(item: NotificationItem): Tone {\n if (item.tone && ['info', 'success', 'warning', 'danger', 'neutral'].includes(item.tone)) {\n return item.tone as Tone;\n }\n return 'neutral';\n}\n\nfunction fmtRel(iso: string | undefined): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const delta = Math.max(0, Date.now() - t);\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.round(delta / 60_000)}m ago`;\n if (delta < 86_400_000) return `${Math.round(delta / 3_600_000)}h ago`;\n return new Date(t).toLocaleString();\n}\n\nexport function NotificationsView(): JSX.Element {\n const res = useFetch<NotificationsResponse>('/api/notifications?limit=200');\n const [items, setItems] = useState<NotificationItem[]>([]);\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (res.data?.notifications) setItems(res.data.notifications);\n }, [res.data]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type === 'notifications:change') res.refetch();\n }, [res]);\n useWsMessage('notifications:change', onChange);\n\n const markRead = async (id: string): Promise<void> => {\n setBusy(id);\n setError(null);\n try {\n await fetchJson(`/api/notifications/${encodeURIComponent(id)}/read`, { method: 'POST' });\n setItems((prev) => prev.map((n) => (n.id === id ? { ...n, read: true } : n)));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const markAll = async (): Promise<void> => {\n setBusy('all');\n setError(null);\n try {\n await fetchJson('/api/notifications/read-all', { method: 'POST' });\n setItems((prev) => prev.map((n) => ({ ...n, read: true })));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const dismiss = async (id: string): Promise<void> => {\n setBusy(id);\n setError(null);\n try {\n await fetchJson(`/api/notifications/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setItems((prev) => prev.filter((n) => n.id !== id));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const unread = items.filter((n) => !n.read).length;\n\n return (\n <Stack gap={5} data-testid=\"notifications-view\">\n <ViewHeader\n title=\"Notifications\"\n description={`${unread} unread of ${items.length} total. Backed by ~/.config/bizar/notifications.jsonl.`}\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => void res.refetch()} data-testid=\"notifications-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"secondary\" onClick={() => void markAll()} disabled={busy === 'all' || unread === 0} data-testid=\"notifications-mark-all\">\n <CheckCheck size={14} aria-hidden /> Mark all read\n </Button>\n </Inline>\n }\n />\n {res.loading && items.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 64 }} />\n <Skeleton style={{ height: 64 }} />\n <Skeleton style={{ height: 64 }} />\n </Stack>\n ) : items.length === 0 ? (\n <EmptyState\n icon={<Bell size={32} aria-hidden />}\n title=\"No notifications\"\n description=\"Agent runs, task moves, and CI results will land here.\"\n />\n ) : (\n <Stack gap={2}>\n {items.map((n) => {\n const tone = toneFor(n);\n return (\n <Card key={n.id} variant=\"default\" style={{ opacity: n.read ? 0.7 : 1 }}>\n <CardBody>\n <Inline align=\"start\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n {!n.read && <span aria-label=\"Unread\" style={{ width: 8, height: 8, borderRadius: 'var(--radius-pill)', background: 'var(--accent)' }} />}\n <strong style={{ fontSize: 'var(--fs-13)' }}>{n.title || n.source || n.id}</strong>\n {n.source && <Badge tone={tone}>{n.source}</Badge>}\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>{fmtRel(n.createdAt)}</span>\n </Inline>\n {n.body && <span style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{n.body}</span>}\n </Stack>\n <Inline gap={1}>\n {!n.read && (\n <Button variant=\"ghost\" onClick={() => void markRead(n.id)} disabled={busy === n.id} data-testid={`notification-read-${n.id}`}>\n Mark read\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => void dismiss(n.id)} disabled={busy === n.id} data-testid={`notification-dismiss-${n.id}`}>\n <Trash2 size={12} aria-hidden /> Dismiss\n </Button>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["CheckCheck","createLucideIcon","toneFor","item","fmtRel","iso","t","delta","NotificationsView","res","useFetch","items","setItems","useState","busy","setBusy","error","setError","useEffect","_a","onChange","useCallback","msg","useWsMessage","markRead","id","fetchJson","prev","n","err","FetchError","markAll","dismiss","unread","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Skeleton","EmptyState","Bell","tone","Card","CardBody","Badge","Trash2"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as i,j as e}from"./cmdk-C3F6LD6N.js";import{u as f,S as l,I as r,d as o,$ as y,f as F,h as g,i as C,F as S}from"./main-BZMmD6a8.js";import{V as D}from"./ViewHeader-BaCWNuVX.js";import{C as w,b as z}from"./Card-BmXiT4c6.js";import{I}from"./Input-cAQOvR8U.js";import{E as N}from"./EmptyState-CdDQmfEL.js";import{R as V}from"./refresh-ccw-BL7B0NO1.js";import{R as B}from"./rotate-ccw-BtnitLfb.js";import{F as L}from"./file-text-CEhDgLq2.js";import{T as O}from"./trash-2-B885GY46.js";function X(){const t=f("/api/obsidian"),s=f("/api/obsidian/notes"),[k,c]=i.useState(null),[$,v]=i.useState(null),[h,E]=i.useState(""),[j,m]=i.useState(!1),[b,d]=i.useState(null),p=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.notes)??[]},[s.data]),u=i.useCallback(()=>{t.refetch(),s.refetch()},[t,s]),R=async a=>{d(null);try{await C(`/api/obsidian/notes/${a}`,{method:"DELETE"}),c(null),v(null),u()}catch(n){d((n instanceof S,n.message))}},T=async()=>{m(!0),d(null);try{await C("/api/obsidian/index",{method:"POST"}),u()}catch(a){d((a instanceof S,a.message))}finally{m(!1)}};return e.jsxs(l,{gap:4,"data-testid":"obsidian-view",children:[e.jsx(D,{title:"Obsidian",description:"Vault explorer + index. Notes stored as markdown.",actions:e.jsxs(r,{align:"center",gap:2,children:[b!==null&&e.jsx("span",{role:"alert","data-testid":"obsidian-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:b}),e.jsxs(o,{variant:"ghost",onClick:()=>void u(),"data-testid":"obsidian-refresh",children:[e.jsx(V,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(o,{variant:"primary",onClick:()=>void T(),disabled:j,"data-testid":"obsidian-reindex",children:[e.jsx(B,{size:14,"aria-hidden":!0})," ",j?"Indexing…":"Rebuild index"]})]})}),t.data&&e.jsx(w,{variant:"default",children:e.jsx(z,{children:e.jsxs(r,{align:"center",gap:3,children:[e.jsx(y,{size:18,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsxs(l,{gap:0,children:[e.jsx("strong",{children:t.data.exists?`${t.data.noteCount??0} notes`:"No vault"}),t.data.exists&&t.data.vaultDir&&e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.data.vaultDir})]}),t.data.exists&&e.jsxs(r,{align:"center",gap:3,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsxs("span",{children:[(t.data.totalSize??0).toLocaleString()," bytes"]}),t.data.folderCount!==void 0&&e.jsxs("span",{children:["· ",t.data.folderCount," folders"]})]})]})})}),e.jsx(w,{variant:"default",children:e.jsxs(z,{children:[e.jsxs(r,{gap:2,align:"center",children:[e.jsx(F,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:h,onChange:a=>E(a.target.value),placeholder:"Filter notes by path…","data-testid":"obsidian-search"})]}),s.loading&&p.length===0?e.jsxs(l,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:28}}),e.jsx(g,{style:{height:28}})]}):p.length===0?e.jsx(N,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No notes",description:"Vault is empty or not initialized."}):e.jsx(l,{gap:1,style:{marginTop:"var(--space-2)"},children:p.filter(a=>!h||a.path.toLowerCase().includes(h.toLowerCase())).slice(0,200).map(a=>{const n=k===a.path;return e.jsxs("div",{"data-testid":`obsidian-row-${a.path}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsxs(r,{align:"center",gap:2,children:[e.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("button",{type:"button",onClick:()=>v(x=>x===a.path?null:a.path),"data-testid":`obsidian-view-${a.path}`,style:{background:"transparent",border:"none",color:"var(--fg)",cursor:"pointer",padding:0,fontFamily:"inherit",fontSize:"inherit"},children:e.jsx("code",{children:a.path})}),a.size!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[a.size," B"]})]}),e.jsx(o,{variant:"ghost",onClick:()=>c(x=>x===a.path?null:a.path),"data-testid":`obsidian-delete-${a.path}`,"aria-label":`Delete ${a.path}`,children:e.jsx(O,{size:14,"aria-hidden":!0})})]}),n&&e.jsxs(r,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(o,{variant:"danger",onClick:()=>void R(a.path),"data-testid":`obsidian-confirm-delete-${a.path}`,children:"Confirm delete"}),e.jsx(o,{variant:"ghost",onClick:()=>c(null),children:"Cancel"})]}),$===a.path&&e.jsx(P,{path:a.path})]},a.path)})})]})})]})}function P({path:t}){const s=f(`/api/obsidian/notes/${t}`);return e.jsx("div",{"data-testid":`obsidian-note-view-${t}`,style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:s.loading&&s.data===null?e.jsx(g,{style:{height:60}}):s.data?e.jsx("pre",{style:{margin:0,fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",color:"var(--fg)"},children:s.data.raw??s.data.body??""}):e.jsx("span",{style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:"Failed to load"})})}export{X as ObsidianView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as g,j as e}from"./cmdk-C3F6LD6N.js";import{u as h,a as I,S as m,B as A,A as y,W as L,b as M}from"./main-BZMmD6a8.js";import{S as E,a as u,A as F}from"./ActivityFeed-DC0JiK49.js";import{C as f,a as x,b as j}from"./Card-BmXiT4c6.js";import{V as G}from"./ViewHeader-BaCWNuVX.js";import{S as q}from"./Sparkline-DqmQzdJH.js";import{C as z}from"./circle-check-DHs37Sot.js";import{T as k}from"./triangle-alert-DLmUhymD.js";import{G as C,a as B}from"./git-pull-request-Bo_wBZZw.js";import"./trending-up-CqUBvVxw.js";const O={"git.merge":C,"git.pull-request":B,"git.merge.pr":C,"task.completed":z,"task.failed":k,"agent.run":M,"agent.tool":L,"agent.message":y};function P(t){const i=O[t||""]||y;return e.jsx(i,{size:14,"aria-hidden":"true"})}function V(t,i){const n=typeof t.ts=="number"?t.ts:Date.now(),c=t.meta||(n?new Date(n).toLocaleString():"");return{id:t.id||`${n}-${i}`,icon:P(t.iconKey||t.kind),title:t.title||t.description||t.kind||"event",description:t.description,meta:c,tone:t.tone}}function Z(){var S,$;const t=h("/api/snapshot"),i=h("/api/activity?limit=10"),n=h("/api/usage?range=7d"),c=g.useMemo(()=>{var a;const s=((a=n.data)==null?void 0:a.daily)??[];return s.length<2?[]:s.map(r=>typeof r.tokens=="number"?r.tokens:0)},[n.data]),[b,T]=g.useState([]),R=g.useCallback(s=>{const a=s.event;a&&T(r=>[...r.slice(-19),a])},[]);I("activity:new",R);const w=g.useMemo(()=>{var a;return[...b.slice(-10).reverse(),...(((a=i.data)==null?void 0:a.events)||[]).slice(0,10)].map(V)},[i.data,b]),o=((S=t.data)==null?void 0:S.overview)||{},l=o.tasks||{},v=o.goals||{},d=o.agents||{},p=o.tokens||{};return e.jsxs(m,{gap:5,"data-testid":"overview-view",children:[e.jsx(G,{title:"Overview",description:"What's moving in the harness right now.",actions:e.jsx(A,{tone:t.error?"danger":"success",dot:!0,children:t.loading?"Loading":t.error?"Offline":"Live"})}),e.jsxs(E,{cols:4,children:[e.jsx(u,{label:"Active tasks",value:String((l.queued||0)+(l.active||0)),trend:(l.active||0)>(l.queued||0)?"up":"flat",delta:`${l.done||0} done · ${l.blocked||0} blocked`}),e.jsx(u,{label:"Goals at risk",value:`${v.atRisk||0} / ${v.total||0}`,trend:(v.atRisk||0)>0?"down":"flat",delta:`${v.done||0} done`}),e.jsx(u,{label:"Agents running",value:`${d.running||0} / ${d.total||0}`,trend:(d.running||0)>0?"up":"flat",delta:`${d.idle||0} idle · ${d.error||0} error`}),e.jsx(u,{label:"Tokens (24h)",value:p.last24h?`${(p.last24h/1e6).toFixed(1)}M`:"—",trend:p.trend||"flat",delta:"last 24h",sparkline:c.length>=2?e.jsx("span",{"data-testid":"overview-tokens-sparkline",children:e.jsx(q,{data:c,width:140,height:28})}):void 0})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"var(--space-4)"},children:[e.jsxs(f,{children:[e.jsx(x,{title:"Recent activity"}),e.jsx(j,{children:e.jsx(F,{items:w.length?w:[]})})]}),e.jsxs(f,{children:[e.jsx(x,{title:"Needs attention"}),e.jsx(j,{children:e.jsx(m,{gap:2,children:(o.needsAttention||[]).length===0?e.jsxs("div",{role:"status",style:{padding:"var(--space-3)",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",background:"color-mix(in oklch, var(--success) 8%, var(--surface-0))",color:"var(--success)",fontSize:"var(--fs-13)",display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx(z,{size:14,"aria-hidden":!0}),"All clear — nothing needs attention."]}):(o.needsAttention||[]).map((s,a)=>{const r=String(s.label||"").toLowerCase().includes("fail")?"danger":String(s.label||"").toLowerCase().includes("block")||String(s.label||"").toLowerCase().includes("risk")?"warning":"info",W=r==="danger"?k:r==="warning"?k:y;return e.jsxs("div",{role:"alert",style:{padding:"var(--space-3)",border:`1px solid color-mix(in oklch, var(--${r}) 40%, var(--border))`,borderRadius:"var(--radius-md)",background:`color-mix(in oklch, var(--${r}) 8%, var(--surface-0))`,display:"flex",alignItems:"flex-start",gap:"var(--space-2)"},children:[e.jsx(W,{size:16,"aria-hidden":!0,style:{color:`var(--${r})`,marginTop:2,flexShrink:0}}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:s.label}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:s.value}),typeof s.hint=="string"&&s.hint.length>0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:s.hint})]})]},a)})})})]})]}),Array.isArray(($=t.data)==null?void 0:$.projects)&&t.data.projects.length>0&&e.jsxs(f,{children:[e.jsx(x,{title:"Active projects"}),e.jsx(j,{children:e.jsx(m,{gap:1,children:t.data.projects.map(s=>{var a,r;return e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-0)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:s.name||s.id}),e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.cwd})]}),((r=(a=t.data)==null?void 0:a.activeProject)==null?void 0:r.id)===s.id&&e.jsx(A,{tone:"success",dot:!0,children:"active"})]},s.id)})})})]})]})}export{Z as OverviewView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewView-CKYzZJe3.js","sources":["../../src/web/v8/views/Overview/OverviewView.tsx"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { StatTile, StatGrid } from '../../ui/data/StatTile.js';\nimport { Card, CardBody, CardHeader } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { ActivityFeed, type ActivityItem } from '../../ui/activity/ActivityFeed.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { ActivityEvent, Snapshot } from '../../data/types.js';\n\n/**\n * OverviewView — the home/dashboard landing page.\n *\n * S10 — pulls `/api/snapshot` for the headline counts and `/api/activity`\n * for the recent feed. Live-tails via `useWsMessage('activity:new', …)`\n * so a new event lands in the feed without a re-fetch.\n */\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n 'git.merge': GitMerge,\n 'git.pull-request': GitPullRequest,\n 'git.merge.pr': GitMerge,\n 'task.completed': CheckCircle2,\n 'task.failed': AlertTriangle,\n 'agent.run': Bot,\n 'agent.tool': Wrench,\n 'agent.message': ActivityIcon,\n};\n\nfunction iconFor(key: string | undefined): JSX.Element {\n const Icon = ICON_MAP[key || ''] || ActivityIcon;\n return <Icon size={14} aria-hidden=\"true\" />;\n}\n\nfunction eventToItem(e: ActivityEvent, idx: number): ActivityItem {\n const ts = typeof e.ts === 'number' ? e.ts : Date.now();\n const meta = e.meta || (ts ? new Date(ts).toLocaleString() : '');\n return {\n id: e.id || `${ts}-${idx}`,\n icon: iconFor(e.iconKey || e.kind),\n title: e.title || e.description || e.kind || 'event',\n description: e.description,\n meta,\n tone: e.tone,\n };\n}\n\nexport function OverviewView(): JSX.Element {\n const snapshot = useFetch<Snapshot>('/api/snapshot');\n const activity = useFetch<{ events?: ActivityEvent[] }>('/api/activity?limit=10');\n\n // v10-S2 — real time-series trends. `/api/usage?range=24h` returns a\n // `daily` array (one bucket per day). We thread the token counts into\n // a Sparkline slot on the Tokens StatTile so the KPI isn't point-in-\n // time any more. Snapshot / activity / usage are independent requests\n // — if usage 500s the tile still renders.\n interface UsageDay { date?: string; tokens?: number }\n interface UsageResponse { daily?: UsageDay[]; totals?: { tokens?: number } }\n // v10.0.3-S2 — `range=24h` only ever returns 1 daily bucket so the\n // sparkline never renders. Use 7d so the time-series trends have ≥2\n // points even on freshly seeded servers (umbrella criterion #5).\n const usage = useFetch<UsageResponse>('/api/usage?range=7d');\n const tokenSeries = useMemo<readonly number[]>(() => {\n const days = usage.data?.daily ?? [];\n if (days.length < 2) return [];\n return days.map((d) => (typeof d.tokens === 'number' ? d.tokens : 0));\n }, [usage.data]);\n\n // Live-tail new events. Keep them in a small in-memory ring buffer.\n const [liveEvents, setLiveEvents] = useState<ActivityEvent[]>([]);\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n const ev = msg.event;\n if (!ev) return;\n setLiveEvents((prev) => [...prev.slice(-19), ev]);\n }, []);\n useWsMessage('activity:new', onEvent);\n\n const items = useMemo<ActivityItem[]>(() => {\n const list = [\n ...liveEvents.slice(-10).reverse(),\n ...((activity.data?.events || []).slice(0, 10)),\n ];\n return list.map(eventToItem);\n }, [activity.data, liveEvents]);\n\n const ov = snapshot.data?.overview || {};\n const tasks = ov.tasks || {};\n const goals = ov.goals || {};\n const agents = ov.agents || {};\n const tokens = ov.tokens || {};\n\n return (\n <Stack gap={5} data-testid=\"overview-view\">\n <ViewHeader\n title=\"Overview\"\n description=\"What's moving in the harness right now.\"\n actions={\n <Badge tone={snapshot.error ? 'danger' : 'success'} dot>\n {snapshot.loading ? 'Loading' : snapshot.error ? 'Offline' : 'Live'}\n </Badge>\n }\n />\n\n <StatGrid cols={4}>\n <StatTile\n label=\"Active tasks\"\n value={String((tasks.queued || 0) + (tasks.active || 0))}\n trend={(tasks.active || 0) > (tasks.queued || 0) ? 'up' : 'flat'}\n delta={`${tasks.done || 0} done · ${tasks.blocked || 0} blocked`}\n />\n <StatTile\n label=\"Goals at risk\"\n value={`${goals.atRisk || 0} / ${goals.total || 0}`}\n trend={(goals.atRisk || 0) > 0 ? 'down' : 'flat'}\n delta={`${goals.done || 0} done`}\n />\n <StatTile\n label=\"Agents running\"\n value={`${agents.running || 0} / ${agents.total || 0}`}\n trend={(agents.running || 0) > 0 ? 'up' : 'flat'}\n delta={`${agents.idle || 0} idle · ${agents.error || 0} error`}\n />\n <StatTile\n label=\"Tokens (24h)\"\n value={tokens.last24h ? `${(tokens.last24h / 1_000_000).toFixed(1)}M` : '—'}\n trend={tokens.trend || 'flat'}\n delta=\"last 24h\"\n sparkline={\n tokenSeries.length >= 2 ? (\n <span data-testid=\"overview-tokens-sparkline\">\n <Sparkline data={tokenSeries} width={140} height={28} />\n </span>\n ) : undefined\n }\n />\n </StatGrid>\n\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 'var(--space-4)' }}>\n <Card>\n <CardHeader title=\"Recent activity\" />\n <CardBody>\n <ActivityFeed items={items.length ? items : []} />\n </CardBody>\n </Card>\n <Card>\n <CardHeader title=\"Needs attention\" />\n <CardBody>\n <Stack gap={2}>\n {(ov.needsAttention || []).length === 0 ? (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-3)',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n background: 'color-mix(in oklch, var(--success) 8%, var(--surface-0))',\n color: 'var(--success)',\n fontSize: 'var(--fs-13)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n }}\n >\n <CheckCircle2 size={14} aria-hidden />\n All clear — nothing needs attention.\n </div>\n ) : (\n (ov.needsAttention || []).map((n, i) => {\n const tone =\n String(n.label || '').toLowerCase().includes('fail') ? 'danger' :\n String(n.label || '').toLowerCase().includes('block') ? 'warning' :\n String(n.label || '').toLowerCase().includes('risk') ? 'warning' :\n 'info';\n const Icon =\n tone === 'danger' ? AlertTriangle :\n tone === 'warning' ? AlertTriangle :\n ActivityIcon;\n return (\n <div\n key={i}\n role=\"alert\"\n style={{\n padding: 'var(--space-3)',\n border: `1px solid color-mix(in oklch, var(--${tone}) 40%, var(--border))`,\n borderRadius: 'var(--radius-md)',\n background: `color-mix(in oklch, var(--${tone}) 8%, var(--surface-0))`,\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-2)',\n }}\n >\n <Icon size={16} aria-hidden style={{ color: `var(--${tone})`, marginTop: 2, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600, color: 'var(--fg)' }}>{n.label}</div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>{n.value}</div>\n {typeof n.hint === 'string' && n.hint.length > 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>{n.hint}</div>\n )}\n </div>\n </div>\n );\n })\n )}\n </Stack>\n </CardBody>\n </Card>\n </div>\n\n {Array.isArray(snapshot.data?.projects) && snapshot.data.projects.length > 0 && (\n <Card>\n <CardHeader title=\"Active projects\" />\n <CardBody>\n <Stack gap={1}>\n {snapshot.data.projects.map((p) => (\n <div\n key={p.id}\n style={{\n padding: 'var(--space-2) var(--space-3)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-0)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{p.name || p.id}</div>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{p.cwd}</code>\n </div>\n {snapshot.data?.activeProject?.id === p.id && (\n <Badge tone=\"success\" dot>active</Badge>\n )}\n </div>\n ))}\n </Stack>\n </CardBody>\n </Card>\n )}\n </Stack>\n );\n}"],"names":["ICON_MAP","GitMerge","GitPullRequest","CheckCircle2","AlertTriangle","Bot","Wrench","ActivityIcon","iconFor","key","Icon","jsx","eventToItem","e","idx","ts","meta","OverviewView","snapshot","useFetch","activity","usage","tokenSeries","useMemo","days","_a","d","liveEvents","setLiveEvents","useState","onEvent","useCallback","msg","ev","prev","useWsMessage","items","ov","tasks","goals","agents","tokens","jsxs","Stack","ViewHeader","Badge","StatGrid","StatTile","Sparkline","Card","CardHeader","CardBody","ActivityFeed","n","i","tone","_b","p"],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r,j as e}from"./cmdk-C3F6LD6N.js";import{c as V,u as B,a as g,S as c,I as t,d as i,h as f,J as F,i as w,F as A}from"./main-BZMmD6a8.js";import{V as I}from"./ViewHeader-BaCWNuVX.js";import{C as x,b as j}from"./Card-BmXiT4c6.js";import{E as M}from"./EmptyState-CdDQmfEL.js";import{R as T}from"./refresh-ccw-BL7B0NO1.js";import{D as $}from"./download-DBkNb6oI.js";import{C as D}from"./circle-check-DHs37Sot.js";import{C as H}from"./circle-alert-D7jn06kH.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 U=V("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);function Y(){const l=B("/api/updates/status"),[n,E]=r.useState(null),[m,y]=r.useState(!1),[v,h]=r.useState(!1),[k,d]=r.useState(null),[C,u]=r.useState([]),[S,p]=r.useState(null),L=r.useMemo(()=>{var a;return((a=l.data)==null?void 0:a.packages)??[]},[l.data]),z=r.useCallback(()=>{l.refetch()},[l]);g("update:progress",a=>{u(s=>[...s,{...a,type:"update:progress"}])}),g("update:log",a=>{u(s=>[...s,{...a,type:"update:log"}])}),g("update:complete",a=>{u(s=>[...s,{...a,type:"update:complete"}]),h(!1),z()});const P=async()=>{y(!0),p(null);try{const a=await w("/api/updates/check");E(a)}catch(a){p((a instanceof A,a.message))}finally{y(!1)}},b=async a=>{h(!0),p(null),d(null);try{await w("/api/updates/apply",{method:"POST",body:{packages:a}})}catch(s){p((s instanceof A,s.message)),h(!1)}},o=(n==null?void 0:n.packages)??L.map(a=>({...a,hasUpdate:!1}));return e.jsxs(c,{gap:4,"data-testid":"update-view",children:[e.jsx(I,{title:"Update",description:"Bizar package updates. Apply restarts on next launch.",actions:e.jsxs(t,{align:"center",gap:2,children:[S!==null&&e.jsx("span",{role:"alert","data-testid":"update-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:S}),e.jsxs(i,{variant:"ghost",onClick:()=>void z(),"data-testid":"update-refresh",children:[e.jsx(T,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(i,{variant:"ghost",onClick:()=>void P(),disabled:m,"data-testid":"update-check",children:[e.jsx($,{size:14,"aria-hidden":!0})," ",m?"Checking…":"Check"]}),e.jsxs(i,{variant:"primary",onClick:()=>d("all"),disabled:v||!((n==null?void 0:n.hasUpdates)??!1),"data-testid":"update-apply-all",children:[e.jsx(U,{size:14,"aria-hidden":!0})," Apply all"]})]})}),e.jsx(x,{variant:"default",children:e.jsx(j,{children:l.loading&&o.length===0?e.jsxs(c,{gap:1,children:[e.jsx(f,{style:{height:40}}),e.jsx(f,{style:{height:40}}),e.jsx(f,{style:{height:40}})]}):o.length===0?e.jsx(M,{icon:e.jsx(U,{size:28,"aria-hidden":!0}),title:"No packages",description:"Update status endpoint returned no packages."}):e.jsx(c,{gap:1,children:o.map(a=>{const s=k===a.id;return e.jsxs("div",{"data-testid":`update-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[e.jsxs(t,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{gap:0,children:[e.jsxs(t,{align:"center",gap:2,children:[e.jsx("strong",{children:a.label||a.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.id})]}),e.jsxs(t,{align:"center",gap:2,children:[e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["installed: ",e.jsx("code",{children:a.installed??"?"})]}),a.latest!==void 0&&a.latest!==null&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["latest: ",e.jsx("code",{children:a.latest})]}),a.hasUpdate&&e.jsx("span",{"data-testid":`update-available-${a.id}`,style:{fontSize:"var(--fs-11)",color:"var(--accent)",fontWeight:600},children:"UPDATE AVAILABLE"})]})]}),e.jsx(t,{gap:1,children:a.hasUpdate&&e.jsx(i,{variant:"ghost",onClick:()=>d(R=>R===a.id?null:a.id),"data-testid":`update-apply-${a.id}`,disabled:v,children:"Apply"})})]}),s&&e.jsxs(t,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(i,{variant:"primary",onClick:()=>void b([a.id]),"data-testid":`update-confirm-apply-${a.id}`,children:"Confirm apply"}),e.jsx(i,{variant:"ghost",onClick:()=>d(null),children:"Cancel"})]})]},a.id)})})})}),k==="all"&&e.jsx(x,{variant:"default",children:e.jsx(j,{children:e.jsxs(c,{gap:2,children:[e.jsx("strong",{children:"Apply all updates?"}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[o.filter(a=>a.hasUpdate).length," package(s) will update on next launch."]}),e.jsxs(t,{gap:1,children:[e.jsx(i,{variant:"primary",onClick:()=>void b(o.filter(a=>a.hasUpdate).map(a=>a.id)),"data-testid":"update-confirm-apply-all",children:"Confirm apply all"}),e.jsx(i,{variant:"ghost",onClick:()=>d(null),children:"Cancel"})]})]})})}),C.length>0&&e.jsx(x,{variant:"default",children:e.jsxs(j,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Progress"}),e.jsx("div",{"data-testid":"update-log",style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",maxHeight:240,overflow:"auto"},children:C.slice(-100).map((a,s)=>e.jsx("div",{style:{color:a.error?"var(--danger)":a.status==="done"?"var(--success)":"var(--fg)"},children:a.type==="update:complete"?e.jsxs(t,{align:"center",gap:1,children:[e.jsx(D,{size:12,"aria-hidden":!0,style:{color:"var(--success)"}})," complete"]}):a.error?e.jsxs(t,{align:"center",gap:1,children:[e.jsx(H,{size:12,"aria-hidden":!0,style:{color:"var(--danger)"}})," ",a.pkg??"?"," · ",a.error]}):e.jsxs(t,{align:"center",gap:1,children:[a.status==="installing"?e.jsx(F,{size:12,"aria-hidden":!0,style:{animation:"spin 1s linear infinite"}}):null,a.pkg??"?"," · ",a.status??a.line??""]})},s))})]})})]})}export{Y as UpdateView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateView-B9Lh4svM.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/package.js","../../src/web/v8/views/Update/UpdateView.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 Package = createLucideIcon(\"Package\", [\n [\n \"path\",\n {\n d: \"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\",\n key: \"1a0edw\"\n }\n ],\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }],\n [\"path\", { d: \"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7\", key: \"yx3hmr\" }],\n [\"path\", { d: \"m7.5 4.27 9 5.15\", key: \"1c824w\" }]\n]);\n\nexport { Package as default };\n//# sourceMappingURL=package.js.map\n","/**\n * v8/views/Update/UpdateView.tsx — Sprint S42, v9.3.0.\n *\n * Package update status + Check + Apply:\n * - GET /api/updates/status — installed versions\n * - GET /api/updates/check — installed + latest + hasUpdates\n * - POST /api/updates/apply — kick install, streams via\n * `update:progress` / `update:log` / `update:complete` WS events.\n *\n * Per-package Apply (inline-confirm) + global Apply All button. Live\n * progress list rendered from a useWsMessage subscription.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Package, RefreshCcw, Download, CheckCircle2, AlertCircle, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface UpdateEntry {\n id: string;\n installed?: string;\n latest?: string | null;\n hasUpdate?: boolean;\n label?: string;\n}\n\ninterface StatusResponse {\n packages: UpdateEntry[];\n}\n\ninterface CheckResponse {\n packages: UpdateEntry[];\n hasUpdates?: boolean;\n}\n\ninterface ProgressEvent {\n type: 'update:progress' | 'update:log' | 'update:complete';\n pkg?: string;\n status?: string;\n line?: string;\n newVersion?: string;\n error?: string;\n}\n\nexport function UpdateView(): JSX.Element {\n const statusPayload = useFetch<StatusResponse>('/api/updates/status');\n const [check, setCheck] = useState<CheckResponse | null>(null);\n const [checking, setChecking] = useState<boolean>(false);\n const [applying, setApplying] = useState<boolean>(false);\n const [confirmApply, setConfirmApply] = useState<string | null>(null);\n const [log, setLog] = useState<ProgressEvent[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const installed = useMemo<UpdateEntry[]>(() => statusPayload.data?.packages ?? [], [statusPayload.data]);\n const refresh = useCallback(() => { void statusPayload.refetch(); }, [statusPayload]);\n\n // Subscribe to live progress events. `msg.type` is the discriminator\n // (e.g. 'update:progress'); spreading first then narrowing via the\n // cast avoids the TS2783 duplicate-key error we'd hit if we tried to\n // also set `type: 'update:progress'` literally.\n useWsMessage('update:progress', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:progress' } as ProgressEvent]);\n });\n useWsMessage('update:log', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:log' } as ProgressEvent]);\n });\n useWsMessage('update:complete', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:complete' } as ProgressEvent]);\n setApplying(false);\n refresh();\n });\n\n const runCheck = async (): Promise<void> => {\n setChecking(true);\n setError(null);\n try {\n const r = await fetchJson<CheckResponse>('/api/updates/check');\n setCheck(r);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setChecking(false);\n }\n };\n\n const apply = async (ids: string[]): Promise<void> => {\n setApplying(true);\n setError(null);\n setConfirmApply(null);\n try {\n await fetchJson('/api/updates/apply', { method: 'POST', body: { packages: ids } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setApplying(false);\n }\n };\n\n const rows: UpdateEntry[] = check?.packages ?? installed.map((p) => ({ ...p, hasUpdate: false }));\n\n return (\n <Stack gap={4} data-testid=\"update-view\">\n <ViewHeader\n title=\"Update\"\n description=\"Bizar package updates. Apply restarts on next launch.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"update-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"update-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void runCheck()} disabled={checking} data-testid=\"update-check\">\n <Download size={14} aria-hidden /> {checking ? 'Checking…' : 'Check'}\n </Button>\n <Button\n variant=\"primary\"\n onClick={() => setConfirmApply('all')}\n disabled={applying || !(check?.hasUpdates ?? false)}\n data-testid=\"update-apply-all\"\n >\n <Package size={14} aria-hidden /> Apply all\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {statusPayload.loading && rows.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 40 }} />\n <Skeleton style={{ height: 40 }} />\n <Skeleton style={{ height: 40 }} />\n </Stack>\n ) : rows.length === 0 ? (\n <EmptyState icon={<Package size={28} aria-hidden />} title=\"No packages\" description=\"Update status endpoint returned no packages.\" />\n ) : (\n <Stack gap={1}>\n {rows.map((p) => {\n const isConfirming = confirmApply === p.id;\n return (\n <div\n key={p.id}\n data-testid={`update-row-${p.id}`}\n style={{\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0}>\n <Inline align=\"center\" gap={2}>\n <strong>{p.label || p.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{p.id}</code>\n </Inline>\n <Inline align=\"center\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n installed: <code>{p.installed ?? '?'}</code>\n </span>\n {p.latest !== undefined && p.latest !== null && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n latest: <code>{p.latest}</code>\n </span>\n )}\n {p.hasUpdate && (\n <span data-testid={`update-available-${p.id}`} style={{ fontSize: 'var(--fs-11)', color: 'var(--accent)', fontWeight: 600 }}>\n UPDATE AVAILABLE\n </span>\n )}\n </Inline>\n </Stack>\n <Inline gap={1}>\n {p.hasUpdate && (\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmApply((cur) => (cur === p.id ? null : p.id))}\n data-testid={`update-apply-${p.id}`}\n disabled={applying}\n >\n Apply\n </Button>\n )}\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"primary\" onClick={() => void apply([p.id])} data-testid={`update-confirm-apply-${p.id}`}>\n Confirm apply\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmApply(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n {confirmApply === 'all' && (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong>Apply all updates?</strong>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {rows.filter((p) => p.hasUpdate).length} package(s) will update on next launch.\n </span>\n <Inline gap={1}>\n <Button variant=\"primary\" onClick={() => void apply(rows.filter((p) => p.hasUpdate).map((p) => p.id))} data-testid=\"update-confirm-apply-all\">\n Confirm apply all\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmApply(null)}>Cancel</Button>\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {log.length > 0 && (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Progress</strong>\n <div\n data-testid=\"update-log\"\n style={{\n marginTop: 'var(--space-2)',\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n maxHeight: 240,\n overflow: 'auto',\n }}\n >\n {log.slice(-100).map((l, i) => (\n <div key={i} style={{ color: l.error ? 'var(--danger)' : l.status === 'done' ? 'var(--success)' : 'var(--fg)' }}>\n {l.type === 'update:complete' ? (\n <Inline align=\"center\" gap={1}><CheckCircle2 size={12} aria-hidden style={{ color: 'var(--success)' }} /> complete</Inline>\n ) : l.error ? (\n <Inline align=\"center\" gap={1}><AlertCircle size={12} aria-hidden style={{ color: 'var(--danger)' }} /> {l.pkg ?? '?'} · {l.error}</Inline>\n ) : (\n <Inline align=\"center\" gap={1}>\n {l.status === 'installing' ? <Loader2 size={12} aria-hidden style={{ animation: 'spin 1s linear infinite' }} /> : null}\n {l.pkg ?? '?'} · {l.status ?? l.line ?? ''}\n </Inline>\n )}\n </div>\n ))}\n </div>\n </CardBody>\n </Card>\n )}\n </Stack>\n );\n}"],"names":["Package","createLucideIcon","UpdateView","statusPayload","useFetch","check","setCheck","useState","checking","setChecking","applying","setApplying","confirmApply","setConfirmApply","log","setLog","error","setError","installed","useMemo","_a","refresh","useCallback","useWsMessage","msg","l","runCheck","r","fetchJson","err","FetchError","apply","ids","rows","p","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Download","Card","CardBody","Skeleton","EmptyState","isConfirming","cur","i","CheckCircle2","AlertCircle","Loader2"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as i,j as e}from"./cmdk-C3F6LD6N.js";import{u as m,S as h,I as u,d,h as j,Z as y,i as C,F as S}from"./main-BZMmD6a8.js";import{V as w}from"./ViewHeader-BaCWNuVX.js";import{C as b,b as k}from"./Card-BmXiT4c6.js";import{S as E,a as U}from"./Sheet-CxXf6gvC.js";import{E as z}from"./EmptyState-CdDQmfEL.js";import{R as $}from"./refresh-ccw-BL7B0NO1.js";import{U as F}from"./upload-C-oafpyE.js";import{T as V}from"./trash-2-B885GY46.js";function H(){const s=m("/api/voice/list"),[g,r]=i.useState(null),[v,o]=i.useState(!1),[c,p]=i.useState(null),l=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.memos)??[]},[s.data]),n=i.useCallback(()=>{s.refetch()},[s]),f=async a=>{p(null);try{await C(`/api/voice/${a}`,{method:"DELETE"}),r(null),n()}catch(t){p((t instanceof S,t.message))}};return e.jsxs(h,{gap:4,"data-testid":"voice-view",children:[e.jsx(w,{title:"Voice",description:"Voice memos. Upload a recording; play it inline.",actions:e.jsxs(u,{align:"center",gap:2,children:[c!==null&&e.jsx("span",{role:"alert","data-testid":"voice-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:c}),e.jsxs(d,{variant:"ghost",onClick:()=>void n(),"data-testid":"voice-refresh",children:[e.jsx($,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"voice-upload",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Upload"]})]})}),e.jsx(b,{variant:"default",children:e.jsx(k,{children:s.loading&&l.length===0?e.jsxs(h,{gap:1,children:[e.jsx(j,{style:{height:48}}),e.jsx(j,{style:{height:48}})]}):l.length===0?e.jsx(z,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No voice memos",description:"Upload a recording to get started."}):e.jsx(h,{gap:1,children:l.map(a=>{const t=g===a.id;return e.jsxs("div",{"data-testid":`voice-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(u,{align:"center",justify:"between",gap:2,children:[e.jsxs(h,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(u,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.filename||a.id}),a.durationMs!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[(a.durationMs/1e3).toFixed(1),"s"]}),a.createdAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.createdAt})]}),e.jsx("audio",{controls:!0,preload:"none","data-testid":`voice-audio-${a.id}`,src:`/api/voice/${a.id}/audio`,style:{width:"100%",maxWidth:480}})]}),e.jsx(d,{variant:"ghost",onClick:()=>r(x=>x===a.id?null:a.id),"data-testid":`voice-delete-${a.id}`,"aria-label":`Delete ${a.id}`,children:e.jsx(V,{size:14,"aria-hidden":!0})})]}),t&&e.jsxs(u,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(d,{variant:"danger",onClick:()=>void f(a.id),"data-testid":`voice-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(d,{variant:"ghost",onClick:()=>r(null),children:"Cancel"})]})]},a.id)})})})}),e.jsx(E,{open:v,onOpenChange:o,children:e.jsx(U,{side:"right",title:"Upload voice memo",description:"Pick a .wav / .mp3 / .m4a file.",children:e.jsx(D,{onSubmit:async a=>{const t=new FormData;t.append("file",a);const x=await fetch("/api/voice/upload",{method:"POST",body:t});if(!x.ok)throw new Error(`upload failed: ${x.status}`);o(!1),n()},onCancel:()=>o(!1)})})})]})}function D({onSubmit:s,onCancel:g}){const[r,v]=i.useState(null),[o,c]=i.useState(!1),[p,l]=i.useState(null);return e.jsxs(h,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsx("input",{type:"file",accept:"audio/*","data-testid":"voice-upload-input",onChange:n=>{var f;return v(((f=n.target.files)==null?void 0:f[0])??null)}}),p!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(u,{justify:"end",gap:2,children:[e.jsx(d,{variant:"ghost",onClick:g,children:"Cancel"}),e.jsx(d,{variant:"primary",disabled:o||!r,"data-testid":"voice-upload-submit",onClick:async()=>{if(r){c(!0),l(null);try{await s(r)}catch(n){l(n.message),c(!1)}}},children:o?"Uploading…":"Upload"})]})]})}export{H as VoiceView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceView-BwR9gm5e.js","sources":["../../src/web/v8/views/Voice/VoiceView.tsx"],"sourcesContent":["/**\n * v8/views/Voice/VoiceView.tsx — Sprint S43, v9.3.0.\n *\n * Voice memo list (GET /api/voice/list), per-row audio player\n * (GET /api/voice/:id/audio) + inline-confirm Delete\n * (DELETE /api/voice/:id), and Upload Sheet that POSTs FormData to\n * /api/voice/upload.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Mic, Upload, Trash2, RefreshCcw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface VoiceMemo {\n id: string;\n filename?: string;\n durationMs?: number;\n createdAt?: string;\n size?: number;\n contentType?: string;\n}\n\nexport function VoiceView(): JSX.Element {\n const payload = useFetch<{ memos: VoiceMemo[] }>('/api/voice/list');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [uploading, setUploading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const memos = useMemo<VoiceMemo[]>(() => payload.data?.memos ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/voice/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"voice-view\">\n <ViewHeader\n title=\"Voice\"\n description=\"Voice memos. Upload a recording; play it inline.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"voice-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"voice-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setUploading(true)} data-testid=\"voice-upload\">\n <Upload size={14} aria-hidden /> Upload\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && memos.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : memos.length === 0 ? (\n <EmptyState icon={<Mic size={28} aria-hidden />} title=\"No voice memos\" description=\"Upload a recording to get started.\" />\n ) : (\n <Stack gap={1}>\n {memos.map((m) => {\n const isConfirming = confirmDelete === m.id;\n return (\n <div\n key={m.id}\n data-testid={`voice-row-${m.id}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{m.filename || m.id}</strong>\n {m.durationMs !== undefined && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {(m.durationMs / 1000).toFixed(1)}s\n </span>\n )}\n {m.createdAt && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{m.createdAt}</span>\n )}\n </Inline>\n <audio\n controls\n preload=\"none\"\n data-testid={`voice-audio-${m.id}`}\n src={`/api/voice/${m.id}/audio`}\n style={{ width: '100%', maxWidth: 480 }}\n />\n </Stack>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === m.id ? null : m.id))} data-testid={`voice-delete-${m.id}`} aria-label={`Delete ${m.id}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(m.id)} data-testid={`voice-confirm-delete-${m.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={uploading} onOpenChange={setUploading}>\n <SheetContent side=\"right\" title=\"Upload voice memo\" description=\"Pick a .wav / .mp3 / .m4a file.\">\n <UploadForm\n onSubmit={async (file) => {\n const fd = new FormData();\n fd.append('file', file);\n const r = await fetch('/api/voice/upload', { method: 'POST', body: fd });\n if (!r.ok) throw new Error(`upload failed: ${r.status}`);\n setUploading(false);\n refresh();\n }}\n onCancel={() => setUploading(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction UploadForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (file: File) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <input\n type=\"file\"\n accept=\"audio/*\"\n data-testid=\"voice-upload-input\"\n onChange={(e) => setFile((e.target as HTMLInputElement).files?.[0] ?? null)}\n />\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !file}\n data-testid=\"voice-upload-submit\"\n onClick={async () => {\n if (!file) return;\n setBusy(true);\n setError(null);\n try { await onSubmit(file); }\n catch (err) { setError((err as Error).message); setBusy(false); }\n }}\n >\n {busy ? 'Uploading…' : 'Upload'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["VoiceView","payload","useFetch","confirmDelete","setConfirmDelete","useState","uploading","setUploading","error","setError","memos","useMemo","_a","refresh","useCallback","drop","id","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Upload","Card","CardBody","Skeleton","EmptyState","Mic","m","isConfirming","cur","Trash2","Sheet","SheetContent","UploadForm","file","fd","r","onSubmit","onCancel","setFile","busy","setBusy","e"],"mappings":"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"}
|