@polderlabs/bizar 10.4.4 → 10.5.0
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-RQeyFifx.js → ActivityFeed-Bw4Cai7r.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js.map → ActivityFeed-Bw4Cai7r.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js → ActivityView-BC0QQ_j9.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js.map → ActivityView-BC0QQ_j9.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-BjczABeB.js → AdminView-CLTNKFL4.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-BjczABeB.js.map → AdminView-CLTNKFL4.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js → AgentActivity-DBWDByjk.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js.map → AgentActivity-DBWDByjk.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js → AgentsView-DD6bCIbA.js} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js.map → AgentsView-DD6bCIbA.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-BZGk39mB.js → Alert-pzFISNtS.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-BZGk39mB.js.map → Alert-pzFISNtS.js.map} +1 -1
- package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js +21 -0
- package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js.map +1 -0
- package/bizar-dash/dist/assets/{AuthView-D4frSShw.js → AuthView-BZ-bPIOM.js} +2 -2
- package/bizar-dash/dist/assets/AuthView-BZ-bPIOM.js.map +1 -0
- package/bizar-dash/dist/assets/{Avatar-BYg0rkPA.js → Avatar-CRW81ewE.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-BYg0rkPA.js.map → Avatar-CRW81ewE.js.map} +1 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js.map +1 -0
- package/bizar-dash/dist/assets/{BackupView-B875KQa4.js → BackupView-u_O3j0TG.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-B875KQa4.js.map → BackupView-u_O3j0TG.js.map} +1 -1
- package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js → Banner-Du-3l05O.js} +1 -1
- package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js.map → Banner-Du-3l05O.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-BtsmkhJa.js → Card-Clkvh43Q.js} +1 -1
- package/bizar-dash/dist/assets/{Card-BtsmkhJa.js.map → Card-Clkvh43Q.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js → ChatView-BTjb3mIh.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js.map → ChatView-BTjb3mIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-XPOk0d_E.js → Chip-B7ovcm01.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-XPOk0d_E.js.map → Chip-B7ovcm01.js.map} +1 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js +1 -0
- package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js.map +1 -0
- package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js +1 -0
- package/bizar-dash/dist/assets/{ClipboardView-CPlTU5VG.js.map → ClipboardView-Cb6XgYZI.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js → ConfigView-DfTJk1uL.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js.map → ConfigView-DfTJk1uL.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js → DiagnosticsView-D5Wy9xlJ.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js.map → DiagnosticsView-D5Wy9xlJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js → DialogsView-HVyfrXpq.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js.map → DialogsView-HVyfrXpq.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js → DoctorView-Dm94WI2z.js} +2 -2
- package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js.map → DoctorView-Dm94WI2z.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js → EmptyState-ccT__JZG.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js.map → EmptyState-ccT__JZG.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js → EnvVarsView-BhcIuJ6V.js} +2 -2
- package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js.map → EnvVarsView-BhcIuJ6V.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js → ErrorState-BSqf65ka.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js.map → ErrorState-BSqf65ka.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js → EvalView-2cbWVBUA.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js.map → EvalView-2cbWVBUA.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js → GoalsView-C3QG5p7T.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js.map → GoalsView-C3QG5p7T.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid--WKvqu5h.js → Grid-Bojq8Sg7.js} +1 -1
- package/bizar-dash/dist/assets/{Grid--WKvqu5h.js.map → Grid-Bojq8Sg7.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js → HistoryView-Bum2TMMw.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js.map → HistoryView-Bum2TMMw.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-h_nSOtwm.js → Input-DV-vdaV8.js} +1 -1
- package/bizar-dash/dist/assets/{Input-h_nSOtwm.js.map → Input-DV-vdaV8.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.js → LibrariesView-DH2E2uNb.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.js.map → LibrariesView-DH2E2uNb.js.map} +1 -1
- package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js +6 -0
- package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js.map +1 -0
- package/bizar-dash/dist/assets/{ListHeader-CM8QoIWG.js → ListHeader-CCD_nIHb.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-CM8QoIWG.js.map → ListHeader-CCD_nIHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js → MemoryView-Cr-obIQY.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js.map → MemoryView-Cr-obIQY.js.map} +1 -1
- package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js → MiscView-CDUQpYuV.js} +1 -1
- package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js.map → MiscView-CDUQpYuV.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js → ModsView-B6OR-a4B.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js.map → ModsView-B6OR-a4B.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js → NotificationsView-CIqtY6D0.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js.map → NotificationsView-CIqtY6D0.js.map} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js → ObsidianView-Nahah8QC.js} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js.map → ObsidianView-Nahah8QC.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js → OverviewView-B6L_wa4M.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js.map → OverviewView-B6L_wa4M.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js → ProgressBar-KC4VXsl_.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js.map → ProgressBar-KC4VXsl_.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js → ProjectsView-DgxWiqHb.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js.map → ProjectsView-DgxWiqHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.js → ProvidersView-BOqN9omv.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.js.map → ProvidersView-BOqN9omv.js.map} +1 -1
- package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js +1 -0
- package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js.map +1 -0
- package/bizar-dash/dist/assets/{Select-CiGWEN8I.js → Select-Bf_P0S6H.js} +1 -1
- package/bizar-dash/dist/assets/{Select-CiGWEN8I.js.map → Select-Bf_P0S6H.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js → SettingsRow-CJb-F94Y.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js.map → SettingsRow-CJb-F94Y.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-2HSFJPPK.js → SettingsView-BvOGcgMS.js} +2 -2
- package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js.map +1 -0
- package/bizar-dash/dist/assets/{Sheet-B-CMP9-_.js → Sheet-BwMVGN-8.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-B-CMP9-_.js.map → Sheet-BwMVGN-8.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js → Slider-AjjzqI-5.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js.map → Slider-AjjzqI-5.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js → Sparkline-Z4y0YUZS.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js.map → Sparkline-Z4y0YUZS.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js → Switch-B79a2t-G.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js.map → Switch-B79a2t-G.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js → TasksView-G-s_pwwr.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js.map → TasksView-G-s_pwwr.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js → Textarea-BfXGMXQ7.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js.map → Textarea-BfXGMXQ7.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js → UpdateView-BKx3u9X8.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js.map → UpdateView-BKx3u9X8.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js → UsageView-M01G6bZQ.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js.map → UsageView-M01G6bZQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.js → ViewHeader-BsnaspKw.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.js.map → ViewHeader-BsnaspKw.js.map} +1 -1
- package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js +1 -0
- package/bizar-dash/dist/assets/{VoiceView-aoPVT6LJ.js.map → VoiceView-rWE8vziD.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-DhAzcHUk.js → brain-D7k5s8vH.js} +1 -1
- package/bizar-dash/dist/assets/{brain-DhAzcHUk.js.map → brain-D7k5s8vH.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js → calendar-CAZoDd-l.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js.map → calendar-CAZoDd-l.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js → circle-D99cZJBr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js.map → circle-D99cZJBr.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js → circle-alert-QQTU4Quz.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js.map → circle-alert-QQTU4Quz.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js → circle-check-BMbe7Kkr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js.map → circle-check-BMbe7Kkr.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js → clock-OtT5mvF3.js} +1 -1
- package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js.map → clock-OtT5mvF3.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-BvJddD8D.js → download-B-mPX5P_.js} +1 -1
- package/bizar-dash/dist/assets/{download-BvJddD8D.js.map → download-B-mPX5P_.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js → external-link-DPDQM1YO.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js.map → external-link-DPDQM1YO.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-BOroDtZE.js → file-text-BsCrv5aP.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-BOroDtZE.js.map → file-text-BsCrv5aP.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-DwPjMRQt.js → filter-Do63x17E.js} +1 -1
- package/bizar-dash/dist/assets/{filter-DwPjMRQt.js.map → filter-Do63x17E.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.js → git-pull-request-CpRAmERC.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.js.map → git-pull-request-CpRAmERC.js.map} +1 -1
- package/bizar-dash/dist/assets/main-BRmJZcHt.js +277 -0
- package/bizar-dash/dist/assets/main-BRmJZcHt.js.map +1 -0
- package/bizar-dash/dist/assets/main-D0TY0myE.css +1 -0
- package/bizar-dash/dist/assets/{network-BcCoCzIY.js → network-DJnHwHX3.js} +1 -1
- package/bizar-dash/dist/assets/{network-BcCoCzIY.js.map → network-DJnHwHX3.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-BllItT2_.js → pause-HitDUnk_.js} +1 -1
- package/bizar-dash/dist/assets/{pause-BllItT2_.js.map → pause-HitDUnk_.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js → pencil-Dkks7eIC.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js.map → pencil-Dkks7eIC.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-mJh67AXo.js → play-blqh0msT.js} +1 -1
- package/bizar-dash/dist/assets/{play-mJh67AXo.js.map → play-blqh0msT.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-BjfntCMC.js → plug-DVvSSe40.js} +1 -1
- package/bizar-dash/dist/assets/{plug-BjfntCMC.js.map → plug-DVvSSe40.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-Cm6-fo14.js → plus-Cps-8lcG.js} +1 -1
- package/bizar-dash/dist/assets/{plus-Cm6-fo14.js.map → plus-Cps-8lcG.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-CXN9y2KV.js → power-DEX4_Xoa.js} +1 -1
- package/bizar-dash/dist/assets/{power-CXN9y2KV.js.map → power-DEX4_Xoa.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js → power-off-upZ4xjaG.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js.map → power-off-upZ4xjaG.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js → refresh-ccw-DN_zCB1h.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js.map → refresh-ccw-DN_zCB1h.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js → refresh-cw-KGm5eQgv.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js.map → refresh-cw-KGm5eQgv.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js → rotate-ccw-D5fkDRgk.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js.map → rotate-ccw-D5fkDRgk.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js → rotate-cw-CClSVUaX.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js.map → rotate-cw-CClSVUaX.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-Y0jPK5D6.js → save-BY4ViPku.js} +1 -1
- package/bizar-dash/dist/assets/{save-Y0jPK5D6.js.map → save-BY4ViPku.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-C8wwPHhR.js → send-CaOL1yQD.js} +1 -1
- package/bizar-dash/dist/assets/{send-C8wwPHhR.js.map → send-CaOL1yQD.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js → shield-alert-DA9K6uZO.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js.map → shield-alert-DA9K6uZO.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js → trash-2-B_Y6HrfN.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js.map → trash-2-B_Y6HrfN.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js → trending-up-qKTUQKIT.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js.map → trending-up-qKTUQKIT.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js → triangle-alert-BeY8LAv6.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js.map → triangle-alert-BeY8LAv6.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-Dy59aZn6.js → upload-BZCtmqIh.js} +1 -1
- package/bizar-dash/dist/assets/{upload-Dy59aZn6.js.map → upload-BZCtmqIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-DENVhJnO.js → zap-Bz1Z8y1Q.js} +1 -1
- package/bizar-dash/dist/assets/{zap-DENVhJnO.js.map → zap-Bz1Z8y1Q.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/shell/Sidebar.tsx +41 -31
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +63 -23
- package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +3 -0
- package/bizar-dash/src/web/v8/ui/feedback/useFocusTrap.ts +58 -0
- package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +1 -0
- package/bizar-dash/src/web/v8/ui/styles/tokens.css +21 -0
- package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +10 -6
- package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +38 -13
- package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +16 -5
- package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +23 -2
- package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +48 -13
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +3 -3
- package/bizar-dash/tests/auth-inputs-labels.test.mjs +45 -0
- package/bizar-dash/tests/background-jobs-action-labels.test.mjs +41 -0
- package/bizar-dash/tests/background-jobs-states.test.mjs +80 -0
- package/bizar-dash/tests/banner-tones.test.mjs +50 -0
- package/bizar-dash/tests/callout-tokens.test.mjs +30 -0
- package/bizar-dash/tests/claude-session-detail-states.test.mjs +67 -0
- package/bizar-dash/tests/components/BackgroundJobsSkeleton.test.tsx +38 -0
- package/bizar-dash/tests/density-tokens.test.mjs +46 -0
- package/bizar-dash/tests/doctor-route-shape.test.mjs +67 -0
- package/bizar-dash/tests/errorstate-retry.test.mjs +42 -0
- package/bizar-dash/tests/lightrag-skeleton.test.mjs +31 -0
- package/bizar-dash/tests/lightrag-states.test.mjs +60 -0
- package/bizar-dash/tests/modal-focus-trap.test.mjs +114 -0
- package/bizar-dash/tests/orphan-tests-audit.test.mjs +80 -0
- package/bizar-dash/tests/palette-keyboard-nav.test.mjs +123 -0
- package/bizar-dash/tests/schedules-skeleton.test.mjs +25 -0
- package/bizar-dash/tests/schedules-states.test.mjs +67 -0
- package/bizar-dash/tests/sidebar-collapse-animation.test.mjs +37 -0
- package/bizar-dash/tests/sidebar-section-styles.test.mjs +55 -0
- package/bizar-dash/tests/skeleton-height.test.mjs +47 -0
- package/bizar-dash/tests/space-tokens.test.mjs +36 -0
- package/bizar-dash/tests/stattile-loading.test.mjs +28 -0
- package/bizar-dash/tests/topbar-popover-styles.test.mjs +53 -0
- package/bizar-dash/tests/update-channels.test.mjs +67 -0
- package/package.json +1 -1
- package/packages/sdk/${HOME}/.bizar_home/memory/projects/sdk/sessions/2026-07-16-e16c2f59.md +14 -0
- package/packages/sdk/.bizar/learning/instincts.jsonl +5 -0
- package/packages/sdk/package.json +1 -1
- package/scripts/loop-log.txt +29 -0
- package/scripts/loop-tasks.md +79 -0
- package/scripts/overnight-loop.mjs +60 -0
- package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js +0 -21
- package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +0 -1
- package/bizar-dash/dist/assets/AuthView-D4frSShw.js.map +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js.map +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js.map +0 -1
- package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +0 -1
- package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js +0 -6
- package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js.map +0 -1
- package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js +0 -1
- package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsView-2HSFJPPK.js.map +0 -1
- package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +0 -1
- package/bizar-dash/dist/assets/main-B7D_IMTh.css +0 -1
- package/bizar-dash/dist/assets/main-BURAlktW.js +0 -277
- package/bizar-dash/dist/assets/main-BURAlktW.js.map +0 -1
- package/bizar-dash/tests/chat-session-create.test.mjs +0 -391
- package/bizar-dash/tests/chat-session-stream.test.mjs +0 -308
- package/bizar-dash/tests/cline-runner.test.mjs +0 -172
- package/bizar-dash/tests/cline-sessions-detail.test.mjs +0 -434
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as f,j as e}from"./cmdk-C3F6LD6N.js";import{d as g,g as v}from"./main-
|
|
1
|
+
import{r as f,j as e}from"./cmdk-C3F6LD6N.js";import{d as g,g as v}from"./main-BRmJZcHt.js";import{T as j}from"./trending-up-qKTUQKIT.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js.map → ActivityFeed-Bw4Cai7r.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityFeed-RQeyFifx.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/web/v8/ui/data/StatTile.tsx","../../src/web/v8/ui/activity/ActivityFeed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TrendingDown = createLucideIcon(\"TrendingDown\", [\n [\"polyline\", { points: \"22 17 13.5 8.5 8.5 13.5 2 7\", key: \"1r2t7k\" }],\n [\"polyline\", { points: \"16 17 22 17 22 11\", key: \"11uiuu\" }]\n]);\n\nexport { TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendingDown, TrendingUp, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * StatTile — a single KPI tile for the overview.\n *\n * Pattern: `[label] [trend-icon delta]`\n * `[BIG value]`\n * `[sparkline?]`\n *\n * Use cases: Overview dashboard, agent detail, goal detail.\n */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatTileProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n /** Optional delta with trend direction (e.g. \"+12%\" vs last week). */\n delta?: ReactNode;\n trend?: StatTrend;\n /** Optional helper text under the value. */\n hint?: ReactNode;\n /** Optional icon for the top-right corner. */\n icon?: ReactNode;\n /** Inline sparkline rendered beneath the value (use the Sparkline component). */\n sparkline?: ReactNode;\n /** Loading state — replaces value with skeleton. */\n loading?: boolean;\n}\n\nconst TREND_FG: Record<StatTrend, string> = {\n up: 'var(--success)',\n down: 'var(--danger)',\n flat: 'var(--fg-muted)',\n};\n\nconst TREND_ICON: Record<StatTrend, typeof TrendingUp> = {\n up: TrendingUp,\n down: TrendingDown,\n flat: Minus,\n};\n\nexport const StatTile = forwardRef<HTMLDivElement, StatTileProps>(function StatTile(props, ref) {\n const {\n label,\n value,\n delta,\n trend,\n hint,\n icon,\n sparkline,\n loading,\n className,\n style,\n ...rest\n } = props;\n const TrendIcon = trend !== undefined ? TREND_ICON[trend] : null;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-tile', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-5)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', fontWeight: 500 }}>\n {label}\n </div>\n {icon !== undefined && (\n <span style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 'var(--space-2)' }}>\n <div\n style={{\n fontSize: 'var(--fs-24)',\n fontWeight: 600,\n color: 'var(--fg)',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: 'var(--lh-tight)',\n }}\n >\n {loading === true ? '—' : value}\n </div>\n {(delta !== undefined || TrendIcon !== null) && (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: trend !== undefined ? TREND_FG[trend] : 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {TrendIcon !== null && <TrendIcon size={12} aria-hidden=\"true\" />}\n {delta}\n </div>\n )}\n </div>\n {hint !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{hint}</div>\n )}\n {sparkline !== undefined && <div style={{ marginTop: 'var(--space-1)' }}>{sparkline}</div>}\n </div>\n );\n});\n\n/**\n * StatGrid — responsive grid for StatTiles. Auto-fits 1..4 columns.\n */\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Min tile width (default 200px). */\n minWidth?: number;\n cols?: 2 | 3 | 4;\n}\n\nexport const StatGrid = forwardRef<HTMLDivElement, StatGridProps>(function StatGrid(props, ref) {\n const { children, cols, minWidth = 200, className, style, ...rest } = props;\n const gridTemplate = cols !== undefined\n ? `repeat(${cols}, minmax(0, 1fr))`\n : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: gridTemplate,\n gap: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n});","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["Minus","createLucideIcon","TrendingDown","TREND_FG","TREND_ICON","TrendingUp","StatTile","forwardRef","props","ref","label","value","delta","trend","hint","icon","sparkline","loading","className","style","rest","TrendIcon","jsxs","cx","jsx","StatGrid","children","cols","minWidth","gridTemplate","TONE_BG","ActivityFeed","items","empty","item","tone"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"ActivityFeed-Bw4Cai7r.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/web/v8/ui/data/StatTile.tsx","../../src/web/v8/ui/activity/ActivityFeed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TrendingDown = createLucideIcon(\"TrendingDown\", [\n [\"polyline\", { points: \"22 17 13.5 8.5 8.5 13.5 2 7\", key: \"1r2t7k\" }],\n [\"polyline\", { points: \"16 17 22 17 22 11\", key: \"11uiuu\" }]\n]);\n\nexport { TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendingDown, TrendingUp, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * StatTile — a single KPI tile for the overview.\n *\n * Pattern: `[label] [trend-icon delta]`\n * `[BIG value]`\n * `[sparkline?]`\n *\n * Use cases: Overview dashboard, agent detail, goal detail.\n */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatTileProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n /** Optional delta with trend direction (e.g. \"+12%\" vs last week). */\n delta?: ReactNode;\n trend?: StatTrend;\n /** Optional helper text under the value. */\n hint?: ReactNode;\n /** Optional icon for the top-right corner. */\n icon?: ReactNode;\n /** Inline sparkline rendered beneath the value (use the Sparkline component). */\n sparkline?: ReactNode;\n /** Loading state — replaces value with skeleton. */\n loading?: boolean;\n}\n\nconst TREND_FG: Record<StatTrend, string> = {\n up: 'var(--success)',\n down: 'var(--danger)',\n flat: 'var(--fg-muted)',\n};\n\nconst TREND_ICON: Record<StatTrend, typeof TrendingUp> = {\n up: TrendingUp,\n down: TrendingDown,\n flat: Minus,\n};\n\nexport const StatTile = forwardRef<HTMLDivElement, StatTileProps>(function StatTile(props, ref) {\n const {\n label,\n value,\n delta,\n trend,\n hint,\n icon,\n sparkline,\n loading,\n className,\n style,\n ...rest\n } = props;\n const TrendIcon = trend !== undefined ? TREND_ICON[trend] : null;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-tile', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-5)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', fontWeight: 500 }}>\n {label}\n </div>\n {icon !== undefined && (\n <span style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 'var(--space-2)' }}>\n <div\n style={{\n fontSize: 'var(--fs-24)',\n fontWeight: 600,\n color: 'var(--fg)',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: 'var(--lh-tight)',\n }}\n >\n {loading === true ? '—' : value}\n </div>\n {(delta !== undefined || TrendIcon !== null) && (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: trend !== undefined ? TREND_FG[trend] : 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {TrendIcon !== null && <TrendIcon size={12} aria-hidden=\"true\" />}\n {delta}\n </div>\n )}\n </div>\n {hint !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{hint}</div>\n )}\n {sparkline !== undefined && <div style={{ marginTop: 'var(--space-1)' }}>{sparkline}</div>}\n </div>\n );\n});\n\n/**\n * StatGrid — responsive grid for StatTiles. Auto-fits 1..4 columns.\n */\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Min tile width (default 200px). */\n minWidth?: number;\n cols?: 2 | 3 | 4;\n}\n\nexport const StatGrid = forwardRef<HTMLDivElement, StatGridProps>(function StatGrid(props, ref) {\n const { children, cols, minWidth = 200, className, style, ...rest } = props;\n const gridTemplate = cols !== undefined\n ? `repeat(${cols}, minmax(0, 1fr))`\n : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: gridTemplate,\n gap: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n});","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["Minus","createLucideIcon","TrendingDown","TREND_FG","TREND_ICON","TrendingUp","StatTile","forwardRef","props","ref","label","value","delta","trend","hint","icon","sparkline","loading","className","style","rest","TrendIcon","jsxs","cx","jsx","StatGrid","children","cols","minWidth","gridTemplate","TONE_BG","ActivityFeed","items","empty","item","tone"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t,r as d}from"./cmdk-C3F6LD6N.js";import{I as h,S as m,g as it,u as ot,a as lt,j as Q,B as U,A as O,k as Z,T as N,c as tt,L as V,h as ct,b as dt,W as ut,i as gt,F as ft}from"./main-BURAlktW.js";import{V as pt}from"./ViewHeader-C-t1U2cQ.js";import{L as ht}from"./ListHeader-CM8QoIWG.js";import{S as vt}from"./Sparkline-cvkv2HbU.js";import{C as D,b as F}from"./Card-BtsmkhJa.js";import{E as mt}from"./ErrorState-CBJbEQ8B.js";import{S as K}from"./Switch-jcYo4lmp.js";import{S as yt}from"./Slider-Z4TP_CXY.js";import{C as xt}from"./circle-6NJF_Xl6.js";import{F as jt}from"./filter-DwPjMRQt.js";import{G as et,a as bt}from"./git-pull-request-TDb1inux.js";import{C as kt}from"./clock-ClVA6-hQ.js";import{T as I}from"./triangle-alert-B2oHbmoh.js";import{C as St}from"./circle-check-DFB50ojt.js";import"./Alert-BZGk39mB.js";import"./circle-alert-Dz8lGfCZ.js";import"./refresh-ccw-DA8_IB9l.js";import"./index-B1OIS316.js";import"./index-CR0TeJmc.js";const _={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"};function wt(r){const a=new Date(r);return Number.isNaN(a.getTime())?"—":a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function Ct(r){const a=Date.now()-r;return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:`${Math.floor(a/864e5)}d ago`}function $t(r){const{laneId:a,label:o,icon:l,events:u,loading:g=!1,onEventClick:f,collapsible:j=!1,trailing:M,width:b="320px",className:T}=r,z={width:b,minWidth:b,maxWidth:b,background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",display:"flex",flexDirection:"column",overflow:"hidden"},L={padding:"var(--space-2) var(--space-3)",borderBottom:"1px solid var(--border)",background:"color-mix(in oklch, var(--surface-0) 70%, transparent)",backdropFilter:"blur(6px)"};return t.jsxs("section",{"aria-label":`${o} activity`,"data-lane-id":a,"data-testid":`activity-lane-${a}`,className:it("v8-activity-lane",T),style:z,children:[t.jsx("header",{style:L,children:t.jsxs(h,{align:"center",justify:"between",gap:2,wrap:!0,children:[t.jsxs(h,{align:"center",gap:2,children:[l&&t.jsx(l,{size:14,"aria-hidden":!0,style:{color:"var(--accent)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)",color:"var(--fg)"},children:o})]}),t.jsxs(h,{align:"center",gap:1,children:[M,t.jsx("span",{"aria-label":`${u.length} events`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:u.length})]})]})}),t.jsx(m,{role:"list","aria-label":`${o} events`,gap:1,style:{padding:"var(--space-2)",overflow:"auto",flex:1,minHeight:0},"data-testid":`activity-lane-list-${a}`,children:g&&u.length===0?t.jsx(zt,{}):u.length===0?t.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)",padding:"var(--space-2)"},children:j?"":"No events yet."}):u.map(s=>{const R=s.tone??"neutral",S=s.icon,w=typeof f=="function",y={display:"grid",gridTemplateColumns:"auto 1fr auto",alignItems:"flex-start",gap:"var(--space-2)",padding:"6px 8px",borderRadius:"var(--radius-sm)",border:"1px solid transparent",background:w?"var(--surface-0)":"transparent",cursor:w?"pointer":"default",transition:"border-color 120ms ease, background 120ms ease",textAlign:"left"},C=t.jsxs(t.Fragment,{children:[t.jsx("span",{"aria-hidden":!0,style:{width:22,height:22,display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"var(--radius-pill)",background:`color-mix(in oklch, ${_[R]} 18%, transparent)`,color:_[R],flexShrink:0},children:S?t.jsx(S,{size:12,"aria-hidden":!0}):null}),t.jsxs(m,{gap:0,style:{minWidth:0},children:[t.jsx("span",{title:s.title,style:{fontSize:"var(--fs-12)",fontWeight:500,color:"var(--fg)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.title}),s.description&&t.jsx("span",{title:s.description,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.description})]}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums",flexShrink:0,textAlign:"right"},title:new Date(s.ts).toISOString(),children:wt(s.ts)})]});return w?t.jsx("button",{type:"button",role:"listitem","data-activity-event-id":s.id,"data-activity-kind":s.kind??"","data-activity-slug":s.slug??"","data-activity-href":s.href??"","data-testid":`activity-event-${s.id}`,onClick:()=>f==null?void 0:f(s),onKeyDown:k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),f==null||f(s))},style:y,"aria-label":`Open ${s.title}`,children:C},s.id):t.jsx("div",{role:"listitem","data-activity-event-id":s.id,"data-activity-kind":s.kind??"","data-activity-slug":s.slug??"",style:y,children:C},s.id)})}),!g&&u.length>0&&t.jsxs("footer",{style:{padding:"4px var(--space-3)",borderTop:"1px solid var(--border)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",display:"flex",justifyContent:"space-between"},children:[t.jsxs("span",{children:["latest ",Ct(u[0].ts)]}),t.jsx("span",{children:u.length===1?"1 event":`${u.length} events`})]})]})}function zt(){return t.jsx(m,{gap:1,children:[0,1,2].map(r=>t.jsx("div",{"aria-hidden":!0,style:{height:36,borderRadius:"var(--radius-sm)",background:"color-mix(in oklch, var(--fg-muted) 8%, transparent)"}},r))})}function Lt(r){const{children:a,gap:o=12,minHeight:l=480,fade:u=!0,className:g,style:f}=r,j={display:"flex",flexDirection:"row",gap:o,overflowX:"auto",overflowY:"hidden",padding:"var(--space-1) var(--space-1) var(--space-2)",minHeight:l,WebkitOverflowScrolling:"touch",scrollSnapType:"x proximity",maskImage:u?"linear-gradient(to right, transparent 0, black 24px, black calc(100% - 24px), transparent 100%)":void 0,...f};return t.jsx(m,{role:"region","aria-label":"Activity lanes","data-testid":"activity-lanes",className:g,style:j,children:a})}function Rt(){return d.useCallback(r=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("bizar:navigate",{detail:r}))},[])}function J(r,a){const o=(r||"").toLowerCase(),l=a||"";return o.startsWith("task")?{id:"tasks",entity:l}:o.startsWith("goal")?{id:"goals",entity:l}:o.startsWith("agent")?{id:"agents",entity:l}:o==="artifact.new"||o.startsWith("artifact")?{id:"artifacts",entity:l}:o.startsWith("git")?{id:"git",entity:l}:null}const q={task:{label:"Tasks",icon:V,tone:"neutral"},agent:{label:"Agents",icon:tt,tone:"info"},goal:{label:"Goals",icon:N,tone:"accent"},settings:{label:"Settings",icon:Z,tone:"neutral"},system:{label:"System",icon:Q,tone:"warning"},git:{label:"Git",icon:et,tone:"neutral"}},Y={"git.merge":{icon:et,tone:"success",source:"git"},"git.pull-request":{icon:bt,tone:"info",source:"git"},"task.completed":{icon:St,tone:"success",source:"task"},"task.failed":{icon:I,tone:"danger",source:"task"},"task.created":{icon:V,tone:"info",source:"task"},"task.moved":{icon:V,tone:"neutral",source:"task"},"agent.run":{icon:tt,tone:"info",source:"agent"},"agent.tool":{icon:ut,tone:"neutral",source:"agent"},"agent.killed":{icon:I,tone:"warning",source:"agent"},"agent.message":{icon:O,tone:"info",source:"agent"},"goal.created":{icon:N,tone:"info",source:"goal"},"goal.status":{icon:N,tone:"info",source:"goal"},"goal.decomposed":{icon:N,tone:"success",source:"goal"},"settings.changed":{icon:Z,tone:"neutral",source:"settings"},"system.error":{icon:I,tone:"danger",source:"system"},"system.note":{icon:O,tone:"neutral",source:"system"}};function B(r){const a=(r.kind||r.iconKey||"").toLowerCase();return a.startsWith("task")?"task":a.startsWith("agent")?"agent":a.startsWith("goal")?"goal":a.startsWith("settings")?"settings":a.startsWith("git")?"git":a.startsWith("system")?"system":r.title&&/goal/i.test(r.title)?"goal":r.title&&/(agent|claude|cc)/i.test(r.title)?"agent":"system"}function Wt(r){const a=Y[r.kind||r.iconKey||""]||Y["system.note"],o=B(r);return{icon:a.icon,tone:a.tone,source:o}}function Et(r){return r.agent||r.actor||r.slug||"system"}function Nt(r){return r==="system"?"System":r}function Zt(){const r=ot("/api/activity?limit=200"),[a,o]=d.useState([]),[l,u]=d.useState("all"),[g,f]=d.useState(!0),[j,M]=d.useState(!1),[b,T]=d.useState(14),[z,L]=d.useState(null),[s,R]=d.useState(""),S=Rt(),w=d.useCallback(e=>{if(!g)return;const i=e.event;i&&o(n=>[i,...n].slice(0,500))},[g]);lt("activity:new",w);const y=d.useMemo(()=>{var e;return[...a,...((e=r.data)==null?void 0:e.items)||[]]},[a,r.data]),C=d.useMemo(()=>{let e=l==="all"?y:y.filter(i=>B(i)===l);if(s.trim()){const i=s.trim().toLowerCase();e=e.filter(n=>[n.title||"",n.description||"",n.kind||"",n.agent||"",n.actor||""].join(" ").toLowerCase().includes(i))}return e},[y,l,s]),k=Date.now()-b*864e5,x=d.useMemo(()=>C.filter(e=>(e.ts||0)>=k||e.ts===void 0),[C,k]),$=d.useMemo(()=>{const e={all:0,task:0,agent:0,goal:0,settings:0,system:0,git:0};for(const i of y){const n=B(i);e.all+=1,e[n]+=1}return e},[y]),H=d.useMemo(()=>{const e=new Map;for(const i of x){if(!i.ts)continue;const n=new Date(i.ts),c=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}T${String(n.getHours()).padStart(2,"0")}`;e.set(c,(e.get(c)??0)+1)}return[...e.entries()].sort(([i],[n])=>i<n?-1:1).map(([,i])=>i).slice(-24)},[x]),W=d.useMemo(()=>{const e=new Map,i=[];for(const n of x){const c=Wt(n),p=n.ts||Date.now(),v=Et(n),A=n.id||`${v}-${p}-${Math.random().toString(36).slice(2,6)}`;e.has(v)||(e.set(v,[]),i.push(v));const E=J(n.kind,n.slug);e.get(v).push({id:A,title:n.title||n.description||n.kind||"event",description:n.description&&n.description!==n.title?n.description:void 0,ts:p,tone:c.tone,icon:c.icon,href:void 0,kind:n.kind,agent:n.agent,actor:n.actor,slug:n.slug,raw:n})}for(const n of e.values())n.sort((c,p)=>p.ts-c.ts);return i.map(n=>{var E;const c=e.get(n),p=((E=c[0])==null?void 0:E.icon)||Q,v={danger:4,warning:3,success:2,info:1,neutral:0},A=c.reduce((G,P)=>{const at=v[P.tone??"neutral"],st=v[G??"neutral"];return at>st?P.tone??"neutral":G},"neutral");return{key:n,label:Nt(n),events:c,icon:p,tone:A}}).sort((n,c)=>c.events.length-n.events.length)},[x]),nt=d.useCallback(e=>{const i=J(e.kind,e.slug);if(i){S(i);return}},[S]),rt=async()=>{L(null);try{const i=((await gt("/api/activity?limit=10000")).items||[]).map(v=>JSON.stringify(v)).join(`
|
|
1
|
+
import{j as t,r as d}from"./cmdk-C3F6LD6N.js";import{I as h,S as m,g as it,u as ot,a as lt,j as Q,B as U,A as O,k as Z,T as N,c as tt,L as V,h as ct,b as dt,W as ut,i as gt,F as ft}from"./main-BRmJZcHt.js";import{V as pt}from"./ViewHeader-BsnaspKw.js";import{L as ht}from"./ListHeader-CCD_nIHb.js";import{S as vt}from"./Sparkline-Z4y0YUZS.js";import{C as D,b as F}from"./Card-Clkvh43Q.js";import{E as mt}from"./ErrorState-BSqf65ka.js";import{S as K}from"./Switch-B79a2t-G.js";import{S as yt}from"./Slider-AjjzqI-5.js";import{C as xt}from"./circle-D99cZJBr.js";import{F as jt}from"./filter-Do63x17E.js";import{G as et,a as bt}from"./git-pull-request-CpRAmERC.js";import{C as kt}from"./clock-OtT5mvF3.js";import{T as I}from"./triangle-alert-BeY8LAv6.js";import{C as St}from"./circle-check-BMbe7Kkr.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./refresh-ccw-DN_zCB1h.js";import"./index-B1OIS316.js";import"./index-CR0TeJmc.js";const _={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"};function wt(r){const a=new Date(r);return Number.isNaN(a.getTime())?"—":a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function Ct(r){const a=Date.now()-r;return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:`${Math.floor(a/864e5)}d ago`}function $t(r){const{laneId:a,label:o,icon:l,events:u,loading:g=!1,onEventClick:f,collapsible:j=!1,trailing:M,width:b="320px",className:T}=r,z={width:b,minWidth:b,maxWidth:b,background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",display:"flex",flexDirection:"column",overflow:"hidden"},L={padding:"var(--space-2) var(--space-3)",borderBottom:"1px solid var(--border)",background:"color-mix(in oklch, var(--surface-0) 70%, transparent)",backdropFilter:"blur(6px)"};return t.jsxs("section",{"aria-label":`${o} activity`,"data-lane-id":a,"data-testid":`activity-lane-${a}`,className:it("v8-activity-lane",T),style:z,children:[t.jsx("header",{style:L,children:t.jsxs(h,{align:"center",justify:"between",gap:2,wrap:!0,children:[t.jsxs(h,{align:"center",gap:2,children:[l&&t.jsx(l,{size:14,"aria-hidden":!0,style:{color:"var(--accent)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)",color:"var(--fg)"},children:o})]}),t.jsxs(h,{align:"center",gap:1,children:[M,t.jsx("span",{"aria-label":`${u.length} events`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:u.length})]})]})}),t.jsx(m,{role:"list","aria-label":`${o} events`,gap:1,style:{padding:"var(--space-2)",overflow:"auto",flex:1,minHeight:0},"data-testid":`activity-lane-list-${a}`,children:g&&u.length===0?t.jsx(zt,{}):u.length===0?t.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)",padding:"var(--space-2)"},children:j?"":"No events yet."}):u.map(s=>{const R=s.tone??"neutral",S=s.icon,w=typeof f=="function",y={display:"grid",gridTemplateColumns:"auto 1fr auto",alignItems:"flex-start",gap:"var(--space-2)",padding:"6px 8px",borderRadius:"var(--radius-sm)",border:"1px solid transparent",background:w?"var(--surface-0)":"transparent",cursor:w?"pointer":"default",transition:"border-color 120ms ease, background 120ms ease",textAlign:"left"},C=t.jsxs(t.Fragment,{children:[t.jsx("span",{"aria-hidden":!0,style:{width:22,height:22,display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"var(--radius-pill)",background:`color-mix(in oklch, ${_[R]} 18%, transparent)`,color:_[R],flexShrink:0},children:S?t.jsx(S,{size:12,"aria-hidden":!0}):null}),t.jsxs(m,{gap:0,style:{minWidth:0},children:[t.jsx("span",{title:s.title,style:{fontSize:"var(--fs-12)",fontWeight:500,color:"var(--fg)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.title}),s.description&&t.jsx("span",{title:s.description,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.description})]}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums",flexShrink:0,textAlign:"right"},title:new Date(s.ts).toISOString(),children:wt(s.ts)})]});return w?t.jsx("button",{type:"button",role:"listitem","data-activity-event-id":s.id,"data-activity-kind":s.kind??"","data-activity-slug":s.slug??"","data-activity-href":s.href??"","data-testid":`activity-event-${s.id}`,onClick:()=>f==null?void 0:f(s),onKeyDown:k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),f==null||f(s))},style:y,"aria-label":`Open ${s.title}`,children:C},s.id):t.jsx("div",{role:"listitem","data-activity-event-id":s.id,"data-activity-kind":s.kind??"","data-activity-slug":s.slug??"",style:y,children:C},s.id)})}),!g&&u.length>0&&t.jsxs("footer",{style:{padding:"4px var(--space-3)",borderTop:"1px solid var(--border)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",display:"flex",justifyContent:"space-between"},children:[t.jsxs("span",{children:["latest ",Ct(u[0].ts)]}),t.jsx("span",{children:u.length===1?"1 event":`${u.length} events`})]})]})}function zt(){return t.jsx(m,{gap:1,children:[0,1,2].map(r=>t.jsx("div",{"aria-hidden":!0,style:{height:36,borderRadius:"var(--radius-sm)",background:"color-mix(in oklch, var(--fg-muted) 8%, transparent)"}},r))})}function Lt(r){const{children:a,gap:o=12,minHeight:l=480,fade:u=!0,className:g,style:f}=r,j={display:"flex",flexDirection:"row",gap:o,overflowX:"auto",overflowY:"hidden",padding:"var(--space-1) var(--space-1) var(--space-2)",minHeight:l,WebkitOverflowScrolling:"touch",scrollSnapType:"x proximity",maskImage:u?"linear-gradient(to right, transparent 0, black 24px, black calc(100% - 24px), transparent 100%)":void 0,...f};return t.jsx(m,{role:"region","aria-label":"Activity lanes","data-testid":"activity-lanes",className:g,style:j,children:a})}function Rt(){return d.useCallback(r=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("bizar:navigate",{detail:r}))},[])}function J(r,a){const o=(r||"").toLowerCase(),l=a||"";return o.startsWith("task")?{id:"tasks",entity:l}:o.startsWith("goal")?{id:"goals",entity:l}:o.startsWith("agent")?{id:"agents",entity:l}:o==="artifact.new"||o.startsWith("artifact")?{id:"artifacts",entity:l}:o.startsWith("git")?{id:"git",entity:l}:null}const q={task:{label:"Tasks",icon:V,tone:"neutral"},agent:{label:"Agents",icon:tt,tone:"info"},goal:{label:"Goals",icon:N,tone:"accent"},settings:{label:"Settings",icon:Z,tone:"neutral"},system:{label:"System",icon:Q,tone:"warning"},git:{label:"Git",icon:et,tone:"neutral"}},Y={"git.merge":{icon:et,tone:"success",source:"git"},"git.pull-request":{icon:bt,tone:"info",source:"git"},"task.completed":{icon:St,tone:"success",source:"task"},"task.failed":{icon:I,tone:"danger",source:"task"},"task.created":{icon:V,tone:"info",source:"task"},"task.moved":{icon:V,tone:"neutral",source:"task"},"agent.run":{icon:tt,tone:"info",source:"agent"},"agent.tool":{icon:ut,tone:"neutral",source:"agent"},"agent.killed":{icon:I,tone:"warning",source:"agent"},"agent.message":{icon:O,tone:"info",source:"agent"},"goal.created":{icon:N,tone:"info",source:"goal"},"goal.status":{icon:N,tone:"info",source:"goal"},"goal.decomposed":{icon:N,tone:"success",source:"goal"},"settings.changed":{icon:Z,tone:"neutral",source:"settings"},"system.error":{icon:I,tone:"danger",source:"system"},"system.note":{icon:O,tone:"neutral",source:"system"}};function B(r){const a=(r.kind||r.iconKey||"").toLowerCase();return a.startsWith("task")?"task":a.startsWith("agent")?"agent":a.startsWith("goal")?"goal":a.startsWith("settings")?"settings":a.startsWith("git")?"git":a.startsWith("system")?"system":r.title&&/goal/i.test(r.title)?"goal":r.title&&/(agent|claude|cc)/i.test(r.title)?"agent":"system"}function Wt(r){const a=Y[r.kind||r.iconKey||""]||Y["system.note"],o=B(r);return{icon:a.icon,tone:a.tone,source:o}}function Et(r){return r.agent||r.actor||r.slug||"system"}function Nt(r){return r==="system"?"System":r}function Zt(){const r=ot("/api/activity?limit=200"),[a,o]=d.useState([]),[l,u]=d.useState("all"),[g,f]=d.useState(!0),[j,M]=d.useState(!1),[b,T]=d.useState(14),[z,L]=d.useState(null),[s,R]=d.useState(""),S=Rt(),w=d.useCallback(e=>{if(!g)return;const i=e.event;i&&o(n=>[i,...n].slice(0,500))},[g]);lt("activity:new",w);const y=d.useMemo(()=>{var e;return[...a,...((e=r.data)==null?void 0:e.items)||[]]},[a,r.data]),C=d.useMemo(()=>{let e=l==="all"?y:y.filter(i=>B(i)===l);if(s.trim()){const i=s.trim().toLowerCase();e=e.filter(n=>[n.title||"",n.description||"",n.kind||"",n.agent||"",n.actor||""].join(" ").toLowerCase().includes(i))}return e},[y,l,s]),k=Date.now()-b*864e5,x=d.useMemo(()=>C.filter(e=>(e.ts||0)>=k||e.ts===void 0),[C,k]),$=d.useMemo(()=>{const e={all:0,task:0,agent:0,goal:0,settings:0,system:0,git:0};for(const i of y){const n=B(i);e.all+=1,e[n]+=1}return e},[y]),H=d.useMemo(()=>{const e=new Map;for(const i of x){if(!i.ts)continue;const n=new Date(i.ts),c=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}T${String(n.getHours()).padStart(2,"0")}`;e.set(c,(e.get(c)??0)+1)}return[...e.entries()].sort(([i],[n])=>i<n?-1:1).map(([,i])=>i).slice(-24)},[x]),W=d.useMemo(()=>{const e=new Map,i=[];for(const n of x){const c=Wt(n),p=n.ts||Date.now(),v=Et(n),A=n.id||`${v}-${p}-${Math.random().toString(36).slice(2,6)}`;e.has(v)||(e.set(v,[]),i.push(v));const E=J(n.kind,n.slug);e.get(v).push({id:A,title:n.title||n.description||n.kind||"event",description:n.description&&n.description!==n.title?n.description:void 0,ts:p,tone:c.tone,icon:c.icon,href:void 0,kind:n.kind,agent:n.agent,actor:n.actor,slug:n.slug,raw:n})}for(const n of e.values())n.sort((c,p)=>p.ts-c.ts);return i.map(n=>{var E;const c=e.get(n),p=((E=c[0])==null?void 0:E.icon)||Q,v={danger:4,warning:3,success:2,info:1,neutral:0},A=c.reduce((G,P)=>{const at=v[P.tone??"neutral"],st=v[G??"neutral"];return at>st?P.tone??"neutral":G},"neutral");return{key:n,label:Nt(n),events:c,icon:p,tone:A}}).sort((n,c)=>c.events.length-n.events.length)},[x]),nt=d.useCallback(e=>{const i=J(e.kind,e.slug);if(i){S(i);return}},[S]),rt=async()=>{L(null);try{const i=((await gt("/api/activity?limit=10000")).items||[]).map(v=>JSON.stringify(v)).join(`
|
|
2
2
|
`),n=new Blob([i],{type:"application/x-ndjson"}),c=URL.createObjectURL(n),p=document.createElement("a");p.href=c,p.download=`bizar-activity-${new Date().toISOString().slice(0,10)}.ndjson`,document.body.appendChild(p),p.click(),p.remove(),URL.revokeObjectURL(c)}catch(e){L((e instanceof ft,e.message))}};return t.jsxs(m,{gap:5,"data-testid":"activity-view",children:[t.jsx(pt,{title:"Activity",description:"Live event lanes grouped by agent, system, and goal.",actions:t.jsxs(h,{align:"center",gap:2,children:[t.jsx("input",{type:"search",placeholder:"Search…",value:s,onChange:e=>R(e.target.value),"aria-label":"Search activity",style:{height:28,padding:"0 var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-12)",width:200,outline:"none"}}),t.jsxs(h,{align:"center",gap:1,children:[t.jsx(xt,{size:8,"aria-hidden":!0,style:{color:g?"var(--success)":"var(--fg-muted)"},fill:"currentColor"}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:g?"Live":"Paused"}),t.jsx(U,{variant:"ghost",onClick:()=>f(e=>!e),"aria-label":g?"Pause stream":"Resume stream",children:g?"Pause":"Resume"})]}),t.jsxs(U,{variant:"secondary",onClick:()=>{rt()},children:[t.jsx(jt,{size:12,"aria-hidden":!0})," Export NDJSON"]})]})}),t.jsx(ht,{title:"Lanes",count:x.length,sparkline:H.length>=2?t.jsx(vt,{data:H,width:120,height:28}):void 0,description:`${W.length} lane${W.length===1?"":"s"} · ${$.task} task · ${$.agent} agent · ${$.goal} goal`,testid:"activity-list-header"}),z!==null&&t.jsx("div",{role:"alert",style:{padding:"var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)"},children:z}),t.jsxs(h,{align:"center",gap:2,wrap:!0,children:[t.jsx(X,{label:`All (${$.all})`,active:l==="all",onClick:()=>u("all"),icon:t.jsx(O,{size:12,"aria-hidden":!0})}),Object.keys(q).map(e=>{const i=q[e],n=i.icon;return t.jsx(X,{label:`${i.label} (${$[e]})`,active:l===e,onClick:()=>u(e),icon:t.jsx(n,{size:12,"aria-hidden":!0})},e)})]}),t.jsx(D,{children:t.jsx(F,{children:t.jsxs(h,{align:"center",gap:6,wrap:!0,children:[t.jsxs(m,{gap:1,children:[t.jsx("label",{htmlFor:"cl-auto",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Live tail"}),t.jsxs(h,{align:"center",gap:2,children:[t.jsx(K,{id:"cl-auto",checked:g,onCheckedChange:f}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:g?"var(--success)":"var(--fg-muted)"},children:g?"on":"paused"})]})]}),t.jsxs(m,{gap:1,children:[t.jsx("label",{htmlFor:"cl-compact",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Compact rows"}),t.jsxs(h,{align:"center",gap:2,children:[t.jsx(K,{id:"cl-compact",checked:j,onCheckedChange:M}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:j?"compact":"comfortable"})]})]}),t.jsxs(m,{gap:1,children:[t.jsx("label",{htmlFor:"cl-days",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Look back"}),t.jsxs(h,{align:"center",gap:2,children:[t.jsx(yt,{id:"cl-days",value:[b],onValueChange:e=>T(e[0]??14),min:1,max:90,step:1}),t.jsxs("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:[b,"d"]})]})]}),t.jsxs(h,{align:"center",gap:1,children:[t.jsx(kt,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"click any event row to jump to its source"})]})]})})}),!r.loading&&x.length===0&&t.jsx(D,{children:t.jsx(F,{children:t.jsxs(m,{gap:1,children:[t.jsx("strong",{children:"No activity matching filters."}),t.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Clear the source filter or extend the look-back window."})]})})}),r.loading&&x.length===0?t.jsx(ct,{style:{height:480}}):r.error&&x.length===0?t.jsx(mt,{block:!0,title:"Couldn't load activity",description:"The activity feed failed to fetch. Retry to refetch.",error:r.error,onRetry:()=>void r.refetch(),testid:"activity-error"}):W.length===0?t.jsx(D,{children:t.jsx(F,{children:t.jsx("span",{style:{color:"var(--fg-muted)"},children:"No lanes yet — events will appear here as agents run."})})}):t.jsx(Lt,{minHeight:j?320:480,children:W.map(e=>t.jsx($t,{laneId:e.key,label:e.label,icon:e.icon,events:e.events,loading:r.loading&&e.events.length===0,onEventClick:nt,trailing:t.jsx(dt,{tone:e.tone==="danger"?"danger":e.tone==="warning"?"warning":e.tone==="success"?"success":e.tone==="info"?"info":"neutral",children:e.tone})},e.key))})]})}function X({label:r,active:a,onClick:o,icon:l}){return t.jsxs("button",{type:"button",onClick:o,"aria-pressed":a,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 10px",borderRadius:"var(--radius-pill)",border:`1px solid ${a?"var(--accent)":"var(--border)"}`,background:a?"color-mix(in oklch, var(--accent) 14%, var(--surface-1))":"var(--surface-1)",color:a?"var(--accent)":"var(--fg)",fontSize:"var(--fs-12)",cursor:"pointer",fontWeight:a?600:500},children:[l,r]})}export{Zt as ActivityView};
|
package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js.map → ActivityView-BC0QQ_j9.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityView-CibyssPM.js","sources":["../../src/web/v8/ui/activity/ActivityLane.tsx","../../src/web/v8/ui/activity/ActivityLanes.tsx","../../src/web/v8/data/useViewNavigate.ts","../../src/web/v8/views/Activity/ActivityView.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { cx } from '../utils/cx.js';\nimport type { LucideIcon } from 'lucide-react';\n\n/**\n * ActivityLane — vertical swimlane of activity events keyed to a single\n * actor (agent / system / user). Layout: sticky header + scrollable list.\n *\n * Used by `ActivityView` (inspired by patoles/agent-flow) to render one\n * column per actor. Width is fixed by the parent (default 320px) so lanes\n * read as discrete swimlanes.\n *\n * Visual conventions:\n * - First 3 events keep `tone` icon + chip; overflow collapses into a\n * inline `<details>` so the lane doesn't dominate the viewport.\n * - Header tone chip uses `tone` for at-a-glance activity health.\n *\n * Event rows are fully clickable when `onEventClick` is set; the parent\n * owns the routing logic.\n */\nexport interface ActivityLaneEvent {\n id: string;\n title: string;\n description?: string;\n ts: number;\n tone?: 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n icon?: LucideIcon;\n href?: string;\n kind?: string;\n agent?: string;\n actor?: string;\n slug?: string;\n raw?: unknown;\n}\n\nexport interface ActivityLaneProps {\n /** Stable id for this lane — used as React key + DOM data-lane. */\n laneId: string;\n /** Display label (agent name, \"system\", etc). */\n label: string;\n /** Optional icon rendered next to the label in the header. */\n icon?: LucideIcon;\n /** Events belonging to this lane (newest first). */\n events: readonly ActivityLaneEvent[];\n /** When true the lane shows a skeleton in place of events. */\n loading?: boolean;\n /** Click-through handler; row becomes a real button when set. */\n onEventClick?: (event: ActivityLaneEvent) => void;\n /** Hide lanes whose events array is empty. */\n collapsible?: boolean;\n /** Optional right-side header content (count chip, tone, status). */\n trailing?: ReactNode;\n /** Lane width in CSS units (default `'320px'`). */\n width?: string | number;\n className?: string;\n}\n\nconst TONE_VAR: Record<NonNullable<ActivityLaneEvent['tone']>, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nfunction timeShort(ts: number): string {\n const d = new Date(ts);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\nfunction relTime(ts: number): string {\n const diff = Date.now() - ts;\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nexport function ActivityLane(props: ActivityLaneProps): JSX.Element {\n const {\n laneId,\n label,\n icon: Icon,\n events,\n loading = false,\n onEventClick,\n collapsible = false,\n trailing,\n width = '320px',\n className,\n } = props;\n\n const style: CSSProperties = {\n width,\n minWidth: width,\n maxWidth: width,\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n };\n\n const headerStyle: CSSProperties = {\n padding: 'var(--space-2) var(--space-3)',\n borderBottom: '1px solid var(--border)',\n background: 'color-mix(in oklch, var(--surface-0) 70%, transparent)',\n backdropFilter: 'blur(6px)',\n };\n\n return (\n <section\n aria-label={`${label} activity`}\n data-lane-id={laneId}\n data-testid={`activity-lane-${laneId}`}\n className={cx('v8-activity-lane', className)}\n style={style}\n >\n <header style={headerStyle}>\n <Inline align=\"center\" justify=\"between\" gap={2} wrap>\n <Inline align=\"center\" gap={2}>\n {Icon && <Icon size={14} aria-hidden style={{ color: 'var(--accent)' }} />}\n <strong style={{ fontSize: 'var(--fs-13)', color: 'var(--fg)' }}>{label}</strong>\n </Inline>\n <Inline align=\"center\" gap={1}>\n {trailing}\n <span\n aria-label={`${events.length} events`}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {events.length}\n </span>\n </Inline>\n </Inline>\n </header>\n\n <Stack\n role=\"list\"\n aria-label={`${label} events`}\n gap={1}\n style={{\n padding: 'var(--space-2)',\n overflow: 'auto',\n flex: 1,\n minHeight: 0,\n }}\n data-testid={`activity-lane-list-${laneId}`}\n >\n {loading && events.length === 0 ? (\n <LaneSkeleton />\n ) : events.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)', padding: 'var(--space-2)' }}>\n {collapsible ? '' : 'No events yet.'}\n </span>\n ) : (\n events.map((e) => {\n const tone = e.tone ?? 'neutral';\n const EventIcon = e.icon;\n const interactive = typeof onEventClick === 'function';\n const rowStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto',\n alignItems: 'flex-start',\n gap: 'var(--space-2)',\n padding: '6px 8px',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid transparent',\n background: interactive ? 'var(--surface-0)' : 'transparent',\n cursor: interactive ? 'pointer' : 'default',\n transition: 'border-color 120ms ease, background 120ms ease',\n textAlign: 'left',\n };\n const inner = (\n <>\n <span\n aria-hidden\n style={{\n width: 22,\n height: 22,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-pill)',\n background: `color-mix(in oklch, ${TONE_VAR[tone]} 18%, transparent)`,\n color: TONE_VAR[tone],\n flexShrink: 0,\n }}\n >\n {EventIcon ? <EventIcon size={12} aria-hidden /> : null}\n </span>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <span\n title={e.title}\n style={{\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: 'var(--fg)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {e.title}\n </span>\n {e.description && (\n <span\n title={e.description}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {e.description}\n </span>\n )}\n </Stack>\n <span\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n flexShrink: 0,\n textAlign: 'right',\n }}\n title={new Date(e.ts).toISOString()}\n >\n {timeShort(e.ts)}\n </span>\n </>\n );\n return interactive ? (\n <button\n type=\"button\"\n key={e.id}\n role=\"listitem\"\n data-activity-event-id={e.id}\n data-activity-kind={e.kind ?? ''}\n data-activity-slug={e.slug ?? ''}\n data-activity-href={e.href ?? ''}\n data-testid={`activity-event-${e.id}`}\n onClick={() => onEventClick?.(e)}\n onKeyDown={(ev) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n onEventClick?.(e);\n }\n }}\n style={rowStyle}\n aria-label={`Open ${e.title}`}\n >\n {inner}\n </button>\n ) : (\n <div\n key={e.id}\n role=\"listitem\"\n data-activity-event-id={e.id}\n data-activity-kind={e.kind ?? ''}\n data-activity-slug={e.slug ?? ''}\n style={rowStyle}\n >\n {inner}\n </div>\n );\n })\n )}\n </Stack>\n\n {!loading && events.length > 0 && (\n <footer\n style={{\n padding: '4px var(--space-3)',\n borderTop: '1px solid var(--border)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>latest {relTime(events[0].ts)}</span>\n <span>{events.length === 1 ? '1 event' : `${events.length} events`}</span>\n </footer>\n )}\n </section>\n );\n}\n\nfunction LaneSkeleton(): JSX.Element {\n return (\n <Stack gap={1}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n aria-hidden\n style={{\n height: 36,\n borderRadius: 'var(--radius-sm)',\n background: 'color-mix(in oklch, var(--fg-muted) 8%, transparent)',\n }}\n />\n ))}\n </Stack>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Stack } from '../primitives/Stack.js';\n\n/**\n * ActivityLanes — horizontal scroller holding a row of `ActivityLane`s.\n *\n * Each lane owns its own width (default 320px). The container scrolls\n * horizontally on overflow. A right-edge fade hint can be enabled via\n * `fade` when lanes are clipped on smaller viewports.\n */\nexport interface ActivityLanesProps {\n children: ReactNode;\n /** Gap between lanes in px (default 12). */\n gap?: number;\n /** Minimum height for the row; lanes fill the available height. */\n minHeight?: string | number;\n /** When true the rightmost lane fades into a scroll hint. */\n fade?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function ActivityLanes(props: ActivityLanesProps): JSX.Element {\n const { children, gap = 12, minHeight = 480, fade = true, className, style } = props;\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n gap,\n overflowX: 'auto',\n overflowY: 'hidden',\n padding: 'var(--space-1) var(--space-1) var(--space-2)',\n minHeight,\n WebkitOverflowScrolling: 'touch',\n scrollSnapType: 'x proximity',\n maskImage: fade\n ? 'linear-gradient(to right, transparent 0, black 24px, black calc(100% - 24px), transparent 100%)'\n : undefined,\n ...style,\n };\n return (\n <Stack\n role=\"region\"\n aria-label=\"Activity lanes\"\n data-testid=\"activity-lanes\"\n className={className}\n style={containerStyle}\n >\n {children}\n </Stack>\n );\n}\n","import { useCallback } from 'react';\n\n/**\n * useViewNavigate — fire-and-forget view router navigation.\n *\n * The v8 dashboard owns `activeId` state inside `App.tsx`. Components deep\n * in the tree (e.g. `ActivityLane` rows inside `ActivityView`) need to\n * switch the active view without prop-drilling. This hook dispatches a\n * `bizar:navigate` `CustomEvent` on `window` that `App.tsx` listens for\n * and forwards to its `setActiveId` setter.\n *\n * Event shape:\n * { id: string; detail?: { entity?: string; slug?: string } }\n *\n * The receiving view may read `entity`/`slug` from `useLocation().hash` or\n * its own props — the event itself is intentionally minimal.\n */\n\ndeclare global {\n interface WindowEventMap {\n 'bizar:navigate': CustomEvent<{ id: string; entity?: string; slug?: string }>;\n }\n}\n\nexport interface ViewNavigateDetail {\n id: string;\n entity?: string;\n slug?: string;\n}\n\nexport function useViewNavigate(): (detail: ViewNavigateDetail) => void {\n return useCallback((detail: ViewNavigateDetail) => {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent('bizar:navigate', { detail }));\n }, []);\n}\n\n/**\n * Map an `ActivityEvent` (kind + slug) to a target view id + entity scope.\n *\n * Returns `null` when no specific target is known — the caller should\n * still dispatch the event so the user lands somewhere useful, but\n * `null` means \"no specific deep-link scope\".\n */\nexport function activityTarget(kind: string | undefined, slug: string | undefined): ViewNavigateDetail | null {\n const k = (kind || '').toLowerCase();\n const s = slug || '';\n if (k.startsWith('task')) return { id: 'tasks', entity: s };\n if (k.startsWith('goal')) return { id: 'goals', entity: s };\n if (k.startsWith('agent')) return { id: 'agents', entity: s };\n if (k === 'artifact.new' || k.startsWith('artifact')) return { id: 'artifacts', entity: s };\n if (k.startsWith('git')) return { id: 'git', entity: s };\n return null;\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n Layers,\n Target,\n Settings as SettingsIcon,\n Cpu,\n Filter,\n Clock,\n Circle,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Slider } from '../../ui/controls/Slider.js';\nimport { ActivityLane, type ActivityLaneEvent } from '../../ui/activity/ActivityLane.js';\nimport { ActivityLanes } from '../../ui/activity/ActivityLanes.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { useViewNavigate, activityTarget } from '../../data/useViewNavigate.js';\nimport type { ActivityEvent } from '../../data/types.js';\n\n/**\n * ActivityView — Sprint S40 visual changelog.\n *\n * Inspired by patoles/agent-flow: vertical swimlanes per actor\n * (agent/system/user) with newest-first events, click-through to the\n * source entity (task / goal / agent / artifact), and multi-select\n * source filters.\n *\n * Layout: sticky header (search + live toggle + export) → counts row\n * with per-source badges → preferences card (live / compact / look-back)\n * → horizontal scroller of `ActivityLane`s.\n */\n\ntype Source = 'task' | 'agent' | 'goal' | 'settings' | 'system' | 'git' | 'all';\n\nconst SOURCE_META: Record<Exclude<Source, 'all'>, { label: string; icon: LucideIcon; tone: 'neutral' | 'info' | 'accent' | 'success' | 'warning' | 'danger' }> = {\n task: { label: 'Tasks', icon: Layers, tone: 'neutral' },\n agent: { label: 'Agents', icon: Bot, tone: 'info' },\n goal: { label: 'Goals', icon: Target, tone: 'accent' },\n settings: { label: 'Settings', icon: SettingsIcon, tone: 'neutral' },\n system: { label: 'System', icon: Cpu, tone: 'warning' },\n git: { label: 'Git', icon: GitMerge, tone: 'neutral' },\n};\n\nconst EVENT_TONE_MAP: Record<string, { icon: LucideIcon; tone: ActivityLaneEvent['tone']; source: Source }> = {\n 'git.merge': { icon: GitMerge, tone: 'success', source: 'git' },\n 'git.pull-request': { icon: GitPullRequest, tone: 'info', source: 'git' },\n 'task.completed': { icon: CheckCircle2, tone: 'success', source: 'task' },\n 'task.failed': { icon: AlertTriangle, tone: 'danger', source: 'task' },\n 'task.created': { icon: Layers, tone: 'info', source: 'task' },\n 'task.moved': { icon: Layers, tone: 'neutral', source: 'task' },\n 'agent.run': { icon: Bot, tone: 'info', source: 'agent' },\n 'agent.tool': { icon: Wrench, tone: 'neutral', source: 'agent' },\n 'agent.killed': { icon: AlertTriangle, tone: 'warning', source: 'agent' },\n 'agent.message': { icon: ActivityIcon, tone: 'info', source: 'agent' },\n 'goal.created': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.status': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.decomposed': { icon: Target, tone: 'success', source: 'goal' },\n 'settings.changed': { icon: SettingsIcon, tone: 'neutral', source: 'settings' },\n 'system.error': { icon: AlertTriangle, tone: 'danger', source: 'system' },\n 'system.note': { icon: ActivityIcon, tone: 'neutral', source: 'system' },\n};\n\nfunction inferSource(e: ActivityEvent): Source {\n const hint = (e.kind || e.iconKey || '').toLowerCase();\n if (hint.startsWith('task')) return 'task';\n if (hint.startsWith('agent')) return 'agent';\n if (hint.startsWith('goal')) return 'goal';\n if (hint.startsWith('settings')) return 'settings';\n if (hint.startsWith('git')) return 'git';\n if (hint.startsWith('system')) return 'system';\n if (e.title && /goal/i.test(e.title)) return 'goal';\n if (e.title && /(agent|claude|cc)/i.test(e.title)) return 'agent';\n return 'system';\n}\n\nfunction eventVisual(e: ActivityEvent): { icon: LucideIcon; tone: ActivityLaneEvent['tone']; source: Source } {\n const m = EVENT_TONE_MAP[e.kind || e.iconKey || ''] || EVENT_TONE_MAP['system.note'];\n const inferred = inferSource(e);\n return { icon: m.icon, tone: m.tone, source: inferred };\n}\n\nfunction laneKey(e: ActivityEvent): string {\n return e.agent || e.actor || e.slug || 'system';\n}\n\nfunction laneLabel(key: string): string {\n if (key === 'system') return 'System';\n return key;\n}\n\ninterface ExtendedEvent extends ActivityEvent {\n __source?: Source;\n __key?: string;\n}\n\nexport function ActivityView(): JSX.Element {\n const events = useFetch<{ items?: ActivityEvent[]; total?: number; limit?: number; since?: string | null }>('/api/activity?limit=200');\n const [live, setLive] = useState<ActivityEvent[]>([]);\n // Active source filter (single source — clicking a chip narrows to one).\n const [source, setSource] = useState<Source>('all');\n const [autoRefresh, setAutoRefresh] = useState<boolean>(true);\n const [compact, setCompact] = useState<boolean>(false);\n const [maxDays, setMaxDays] = useState<number>(14);\n const [exportError, setExportError] = useState<string | null>(null);\n const [search, setSearch] = useState<string>('');\n const navigate = useViewNavigate();\n\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n if (!autoRefresh) return;\n const ev = msg.event;\n if (!ev) return;\n setLive((prev) => [ev, ...prev].slice(0, 500));\n }, [autoRefresh]);\n useWsMessage('activity:new', onEvent);\n\n const merged = useMemo<ExtendedEvent[]>(() => {\n return [...live, ...(events.data?.items || [])];\n }, [live, events.data]);\n\n const filtered = useMemo<ExtendedEvent[]>(() => {\n let list = source === 'all' ? merged : merged.filter((e) => inferSource(e) === source);\n if (search.trim()) {\n const needle = search.trim().toLowerCase();\n list = list.filter((e) => {\n const hay = [\n e.title || '',\n e.description || '',\n e.kind || '',\n e.agent || '',\n e.actor || '',\n ].join(' ').toLowerCase();\n return hay.includes(needle);\n });\n }\n return list;\n }, [merged, source, search]);\n\n // Time-windowed set (older events clipped).\n const cutoff = Date.now() - maxDays * 86_400_000;\n const windowed = useMemo<ExtendedEvent[]>(\n () => filtered.filter((e) => (e.ts || 0) >= cutoff || e.ts === undefined),\n [filtered, cutoff],\n );\n\n const counts = useMemo(() => {\n const acc: Record<Source, number> = { all: 0, task: 0, agent: 0, goal: 0, settings: 0, system: 0, git: 0 };\n for (const e of merged) {\n const s = inferSource(e);\n acc.all += 1;\n acc[s] += 1;\n }\n return acc;\n }, [merged]);\n\n const sparklineData = useMemo<number[]>(() => {\n // Group by hour bucket for sparkline.\n const buckets = new Map<string, number>();\n for (const e of windowed) {\n if (!e.ts) continue;\n const d = new Date(e.ts);\n const k = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}T${String(d.getHours()).padStart(2, '0')}`;\n buckets.set(k, (buckets.get(k) ?? 0) + 1);\n }\n return [...buckets.entries()].sort(([a], [b]) => (a < b ? -1 : 1)).map(([, v]) => v).slice(-24);\n }, [windowed]);\n\n // Group events into lanes (one per actor).\n const lanes = useMemo<{ key: string; label: string; events: ActivityLaneEvent[]; icon: LucideIcon; tone: ActivityLaneEvent['tone'] }[]>(() => {\n const map = new Map<string, ActivityLaneEvent[]>();\n const order: string[] = [];\n for (const e of windowed) {\n const v = eventVisual(e);\n const ts = e.ts || Date.now();\n const k = laneKey(e);\n const id = e.id || `${k}-${ts}-${Math.random().toString(36).slice(2, 6)}`;\n if (!map.has(k)) { map.set(k, []); order.push(k); }\n const target = activityTarget(e.kind, e.slug);\n map.get(k)!.push({\n id,\n title: e.title || e.description || e.kind || 'event',\n description: e.description && e.description !== e.title ? e.description : undefined,\n ts,\n tone: v.tone,\n icon: v.icon,\n href: target ? undefined : undefined,\n kind: e.kind,\n agent: e.agent,\n actor: e.actor,\n slug: e.slug,\n raw: e,\n });\n }\n // Sort each lane newest-first; ensure consistent order.\n for (const arr of map.values()) arr.sort((a, b) => b.ts - a.ts);\n return order.map((k) => {\n const events = map.get(k)!;\n // Lane icon picks the most recent event's icon (visual hint).\n const Icon = (events[0]?.icon as LucideIcon) || Cpu;\n // Lane tone picks the worst recent tone (danger > warning > success > info > neutral).\n const severity: Record<NonNullable<ActivityLaneEvent['tone']>, number> = { danger: 4, warning: 3, success: 2, info: 1, neutral: 0 };\n const worst = events.reduce<ActivityLaneEvent['tone']>((acc, e) => {\n const cur = severity[e.tone ?? 'neutral'];\n const best = severity[acc ?? 'neutral'];\n return cur > best ? (e.tone ?? 'neutral') : acc;\n }, 'neutral');\n return { key: k, label: laneLabel(k), events, icon: Icon, tone: worst };\n }).sort((a, b) => b.events.length - a.events.length);\n }, [windowed]);\n\n const onLaneClick = useCallback((ev: ActivityLaneEvent) => {\n const target = activityTarget(ev.kind, ev.slug);\n if (target) {\n navigate(target);\n return;\n }\n // Fallback: navigate to activity's own view (no-op) but focus the row.\n }, [navigate]);\n\n const exportNdjson = async (): Promise<void> => {\n setExportError(null);\n try {\n const res = await fetchJson<{ items?: ActivityEvent[] }>('/api/activity?limit=10000');\n const text = (res.items || []).map((e) => JSON.stringify(e)).join('\\n');\n const blob = new Blob([text], { type: 'application/x-ndjson' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-activity-${new Date().toISOString().slice(0, 10)}.ndjson`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n } catch (err) {\n setExportError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"activity-view\">\n <ViewHeader\n title=\"Activity\"\n description=\"Live event lanes grouped by agent, system, and goal.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <input\n type=\"search\"\n placeholder=\"Search…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search activity\"\n style={{\n height: 28,\n padding: '0 var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-12)',\n width: 200,\n outline: 'none',\n }}\n />\n <Inline align=\"center\" gap={1}>\n <Circle\n size={8}\n aria-hidden\n style={{ color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}\n fill=\"currentColor\"\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {autoRefresh ? 'Live' : 'Paused'}\n </span>\n <Button variant=\"ghost\" onClick={() => setAutoRefresh((v) => !v)} aria-label={autoRefresh ? 'Pause stream' : 'Resume stream'}>\n {autoRefresh ? 'Pause' : 'Resume'}\n </Button>\n </Inline>\n <Button variant=\"secondary\" onClick={() => { void exportNdjson(); }}>\n <Filter size={12} aria-hidden /> Export NDJSON\n </Button>\n </Inline>\n }\n />\n <ListHeader\n title=\"Lanes\"\n count={windowed.length}\n sparkline={sparklineData.length >= 2 ? <Sparkline data={sparklineData} width={120} height={28} /> : undefined}\n description={`${lanes.length} lane${lanes.length === 1 ? '' : 's'} · ${counts.task} task · ${counts.agent} agent · ${counts.goal} goal`}\n testid=\"activity-list-header\"\n />\n\n {exportError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n {exportError}\n </div>\n )}\n\n {/* Source filter chips */}\n <Inline align=\"center\" gap={2} wrap>\n <FilterChip label={`All (${counts.all})`} active={source === 'all'} onClick={() => setSource('all')} icon={<ActivityIcon size={12} aria-hidden />} />\n {(Object.keys(SOURCE_META) as Array<Exclude<Source, 'all'>>).map((s) => {\n const meta = SOURCE_META[s];\n const Icon = meta.icon;\n return (\n <FilterChip\n key={s}\n label={`${meta.label} (${counts[s]})`}\n active={source === s}\n onClick={() => setSource(s)}\n icon={<Icon size={12} aria-hidden />}\n />\n );\n })}\n </Inline>\n\n {/* Display prefs */}\n <Card>\n <CardBody>\n <Inline align=\"center\" gap={6} wrap>\n <Stack gap={1}>\n <label htmlFor=\"cl-auto\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Live tail</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-auto\" checked={autoRefresh} onCheckedChange={setAutoRefresh} />\n <span style={{ fontSize: 'var(--fs-12)', color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}>\n {autoRefresh ? 'on' : 'paused'}\n </span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-compact\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Compact rows</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-compact\" checked={compact} onCheckedChange={setCompact} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{compact ? 'compact' : 'comfortable'}</span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-days\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Look back</label>\n <Inline align=\"center\" gap={2}>\n <Slider id=\"cl-days\" value={[maxDays]} onValueChange={(v) => setMaxDays(v[0] ?? 14)} min={1} max={90} step={1} />\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{maxDays}d</code>\n </Inline>\n </Stack>\n <Inline align=\"center\" gap={1}>\n <Clock size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n click any event row to jump to its source\n </span>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n\n {/* Empty state */}\n {!events.loading && windowed.length === 0 && (\n <Card>\n <CardBody>\n <Stack gap={1}>\n <strong>No activity matching filters.</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Clear the source filter or extend the look-back window.\n </span>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {events.loading && windowed.length === 0 ? (\n <Skeleton style={{ height: 480 }} />\n ) : events.error && windowed.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load activity\"\n description=\"The activity feed failed to fetch. Retry to refetch.\"\n error={events.error}\n onRetry={() => void events.refetch()}\n testid=\"activity-error\"\n />\n ) : lanes.length === 0 ? (\n <Card>\n <CardBody>\n <span style={{ color: 'var(--fg-muted)' }}>No lanes yet — events will appear here as agents run.</span>\n </CardBody>\n </Card>\n ) : (\n <ActivityLanes minHeight={compact ? 320 : 480}>\n {lanes.map((lane) => (\n <ActivityLane\n key={lane.key}\n laneId={lane.key}\n label={lane.label}\n icon={lane.icon}\n events={lane.events}\n loading={events.loading && lane.events.length === 0}\n onEventClick={onLaneClick}\n trailing={\n <Badge tone={\n lane.tone === 'danger' ? 'danger'\n : lane.tone === 'warning' ? 'warning'\n : lane.tone === 'success' ? 'success'\n : lane.tone === 'info' ? 'info'\n : 'neutral'\n }>\n {lane.tone}\n </Badge>\n }\n />\n ))}\n </ActivityLanes>\n )}\n </Stack>\n );\n}\n\nfunction FilterChip({ label, active, onClick, icon }: { label: string; active: boolean; onClick: () => void; icon?: React.ReactNode }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 10px',\n borderRadius: 'var(--radius-pill)',\n border: `1px solid ${active ? 'var(--accent)' : 'var(--border)'}`,\n background: active ? 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))' : 'var(--surface-1)',\n color: active ? 'var(--accent)' : 'var(--fg)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n fontWeight: active ? 600 : 500,\n }}\n >\n {icon}\n {label}\n </button>\n );\n}\n"],"names":["TONE_VAR","timeShort","ts","d","relTime","diff","ActivityLane","props","laneId","label","Icon","events","loading","onEventClick","collapsible","trailing","width","className","style","headerStyle","jsxs","cx","jsx","Inline","Stack","LaneSkeleton","e","tone","EventIcon","interactive","rowStyle","inner","Fragment","ev","i","ActivityLanes","children","gap","minHeight","fade","containerStyle","useViewNavigate","useCallback","detail","activityTarget","kind","slug","k","s","SOURCE_META","Layers","Bot","Target","SettingsIcon","Cpu","GitMerge","EVENT_TONE_MAP","GitPullRequest","CheckCircle2","AlertTriangle","Wrench","ActivityIcon","inferSource","hint","eventVisual","m","inferred","laneKey","laneLabel","key","ActivityView","useFetch","live","setLive","useState","source","setSource","autoRefresh","setAutoRefresh","compact","setCompact","maxDays","setMaxDays","exportError","setExportError","search","setSearch","navigate","onEvent","msg","prev","useWsMessage","merged","useMemo","_a","filtered","list","needle","cutoff","windowed","counts","acc","sparklineData","buckets","a","b","v","lanes","map","order","id","target","arr","severity","worst","cur","best","onLaneClick","exportNdjson","text","fetchJson","blob","url","err","FetchError","ViewHeader","Circle","Button","Filter","ListHeader","Sparkline","FilterChip","meta","Card","CardBody","Switch","Slider","Clock","Skeleton","ErrorState","lane","Badge","active","onClick","icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActivityView-BC0QQ_j9.js","sources":["../../src/web/v8/ui/activity/ActivityLane.tsx","../../src/web/v8/ui/activity/ActivityLanes.tsx","../../src/web/v8/data/useViewNavigate.ts","../../src/web/v8/views/Activity/ActivityView.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { cx } from '../utils/cx.js';\nimport type { LucideIcon } from 'lucide-react';\n\n/**\n * ActivityLane — vertical swimlane of activity events keyed to a single\n * actor (agent / system / user). Layout: sticky header + scrollable list.\n *\n * Used by `ActivityView` (inspired by patoles/agent-flow) to render one\n * column per actor. Width is fixed by the parent (default 320px) so lanes\n * read as discrete swimlanes.\n *\n * Visual conventions:\n * - First 3 events keep `tone` icon + chip; overflow collapses into a\n * inline `<details>` so the lane doesn't dominate the viewport.\n * - Header tone chip uses `tone` for at-a-glance activity health.\n *\n * Event rows are fully clickable when `onEventClick` is set; the parent\n * owns the routing logic.\n */\nexport interface ActivityLaneEvent {\n id: string;\n title: string;\n description?: string;\n ts: number;\n tone?: 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n icon?: LucideIcon;\n href?: string;\n kind?: string;\n agent?: string;\n actor?: string;\n slug?: string;\n raw?: unknown;\n}\n\nexport interface ActivityLaneProps {\n /** Stable id for this lane — used as React key + DOM data-lane. */\n laneId: string;\n /** Display label (agent name, \"system\", etc). */\n label: string;\n /** Optional icon rendered next to the label in the header. */\n icon?: LucideIcon;\n /** Events belonging to this lane (newest first). */\n events: readonly ActivityLaneEvent[];\n /** When true the lane shows a skeleton in place of events. */\n loading?: boolean;\n /** Click-through handler; row becomes a real button when set. */\n onEventClick?: (event: ActivityLaneEvent) => void;\n /** Hide lanes whose events array is empty. */\n collapsible?: boolean;\n /** Optional right-side header content (count chip, tone, status). */\n trailing?: ReactNode;\n /** Lane width in CSS units (default `'320px'`). */\n width?: string | number;\n className?: string;\n}\n\nconst TONE_VAR: Record<NonNullable<ActivityLaneEvent['tone']>, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nfunction timeShort(ts: number): string {\n const d = new Date(ts);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\nfunction relTime(ts: number): string {\n const diff = Date.now() - ts;\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nexport function ActivityLane(props: ActivityLaneProps): JSX.Element {\n const {\n laneId,\n label,\n icon: Icon,\n events,\n loading = false,\n onEventClick,\n collapsible = false,\n trailing,\n width = '320px',\n className,\n } = props;\n\n const style: CSSProperties = {\n width,\n minWidth: width,\n maxWidth: width,\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n };\n\n const headerStyle: CSSProperties = {\n padding: 'var(--space-2) var(--space-3)',\n borderBottom: '1px solid var(--border)',\n background: 'color-mix(in oklch, var(--surface-0) 70%, transparent)',\n backdropFilter: 'blur(6px)',\n };\n\n return (\n <section\n aria-label={`${label} activity`}\n data-lane-id={laneId}\n data-testid={`activity-lane-${laneId}`}\n className={cx('v8-activity-lane', className)}\n style={style}\n >\n <header style={headerStyle}>\n <Inline align=\"center\" justify=\"between\" gap={2} wrap>\n <Inline align=\"center\" gap={2}>\n {Icon && <Icon size={14} aria-hidden style={{ color: 'var(--accent)' }} />}\n <strong style={{ fontSize: 'var(--fs-13)', color: 'var(--fg)' }}>{label}</strong>\n </Inline>\n <Inline align=\"center\" gap={1}>\n {trailing}\n <span\n aria-label={`${events.length} events`}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {events.length}\n </span>\n </Inline>\n </Inline>\n </header>\n\n <Stack\n role=\"list\"\n aria-label={`${label} events`}\n gap={1}\n style={{\n padding: 'var(--space-2)',\n overflow: 'auto',\n flex: 1,\n minHeight: 0,\n }}\n data-testid={`activity-lane-list-${laneId}`}\n >\n {loading && events.length === 0 ? (\n <LaneSkeleton />\n ) : events.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)', padding: 'var(--space-2)' }}>\n {collapsible ? '' : 'No events yet.'}\n </span>\n ) : (\n events.map((e) => {\n const tone = e.tone ?? 'neutral';\n const EventIcon = e.icon;\n const interactive = typeof onEventClick === 'function';\n const rowStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto',\n alignItems: 'flex-start',\n gap: 'var(--space-2)',\n padding: '6px 8px',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid transparent',\n background: interactive ? 'var(--surface-0)' : 'transparent',\n cursor: interactive ? 'pointer' : 'default',\n transition: 'border-color 120ms ease, background 120ms ease',\n textAlign: 'left',\n };\n const inner = (\n <>\n <span\n aria-hidden\n style={{\n width: 22,\n height: 22,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-pill)',\n background: `color-mix(in oklch, ${TONE_VAR[tone]} 18%, transparent)`,\n color: TONE_VAR[tone],\n flexShrink: 0,\n }}\n >\n {EventIcon ? <EventIcon size={12} aria-hidden /> : null}\n </span>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <span\n title={e.title}\n style={{\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: 'var(--fg)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {e.title}\n </span>\n {e.description && (\n <span\n title={e.description}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {e.description}\n </span>\n )}\n </Stack>\n <span\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n flexShrink: 0,\n textAlign: 'right',\n }}\n title={new Date(e.ts).toISOString()}\n >\n {timeShort(e.ts)}\n </span>\n </>\n );\n return interactive ? (\n <button\n type=\"button\"\n key={e.id}\n role=\"listitem\"\n data-activity-event-id={e.id}\n data-activity-kind={e.kind ?? ''}\n data-activity-slug={e.slug ?? ''}\n data-activity-href={e.href ?? ''}\n data-testid={`activity-event-${e.id}`}\n onClick={() => onEventClick?.(e)}\n onKeyDown={(ev) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n onEventClick?.(e);\n }\n }}\n style={rowStyle}\n aria-label={`Open ${e.title}`}\n >\n {inner}\n </button>\n ) : (\n <div\n key={e.id}\n role=\"listitem\"\n data-activity-event-id={e.id}\n data-activity-kind={e.kind ?? ''}\n data-activity-slug={e.slug ?? ''}\n style={rowStyle}\n >\n {inner}\n </div>\n );\n })\n )}\n </Stack>\n\n {!loading && events.length > 0 && (\n <footer\n style={{\n padding: '4px var(--space-3)',\n borderTop: '1px solid var(--border)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>latest {relTime(events[0].ts)}</span>\n <span>{events.length === 1 ? '1 event' : `${events.length} events`}</span>\n </footer>\n )}\n </section>\n );\n}\n\nfunction LaneSkeleton(): JSX.Element {\n return (\n <Stack gap={1}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n aria-hidden\n style={{\n height: 36,\n borderRadius: 'var(--radius-sm)',\n background: 'color-mix(in oklch, var(--fg-muted) 8%, transparent)',\n }}\n />\n ))}\n </Stack>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Stack } from '../primitives/Stack.js';\n\n/**\n * ActivityLanes — horizontal scroller holding a row of `ActivityLane`s.\n *\n * Each lane owns its own width (default 320px). The container scrolls\n * horizontally on overflow. A right-edge fade hint can be enabled via\n * `fade` when lanes are clipped on smaller viewports.\n */\nexport interface ActivityLanesProps {\n children: ReactNode;\n /** Gap between lanes in px (default 12). */\n gap?: number;\n /** Minimum height for the row; lanes fill the available height. */\n minHeight?: string | number;\n /** When true the rightmost lane fades into a scroll hint. */\n fade?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function ActivityLanes(props: ActivityLanesProps): JSX.Element {\n const { children, gap = 12, minHeight = 480, fade = true, className, style } = props;\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n gap,\n overflowX: 'auto',\n overflowY: 'hidden',\n padding: 'var(--space-1) var(--space-1) var(--space-2)',\n minHeight,\n WebkitOverflowScrolling: 'touch',\n scrollSnapType: 'x proximity',\n maskImage: fade\n ? 'linear-gradient(to right, transparent 0, black 24px, black calc(100% - 24px), transparent 100%)'\n : undefined,\n ...style,\n };\n return (\n <Stack\n role=\"region\"\n aria-label=\"Activity lanes\"\n data-testid=\"activity-lanes\"\n className={className}\n style={containerStyle}\n >\n {children}\n </Stack>\n );\n}\n","import { useCallback } from 'react';\n\n/**\n * useViewNavigate — fire-and-forget view router navigation.\n *\n * The v8 dashboard owns `activeId` state inside `App.tsx`. Components deep\n * in the tree (e.g. `ActivityLane` rows inside `ActivityView`) need to\n * switch the active view without prop-drilling. This hook dispatches a\n * `bizar:navigate` `CustomEvent` on `window` that `App.tsx` listens for\n * and forwards to its `setActiveId` setter.\n *\n * Event shape:\n * { id: string; detail?: { entity?: string; slug?: string } }\n *\n * The receiving view may read `entity`/`slug` from `useLocation().hash` or\n * its own props — the event itself is intentionally minimal.\n */\n\ndeclare global {\n interface WindowEventMap {\n 'bizar:navigate': CustomEvent<{ id: string; entity?: string; slug?: string }>;\n }\n}\n\nexport interface ViewNavigateDetail {\n id: string;\n entity?: string;\n slug?: string;\n}\n\nexport function useViewNavigate(): (detail: ViewNavigateDetail) => void {\n return useCallback((detail: ViewNavigateDetail) => {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent('bizar:navigate', { detail }));\n }, []);\n}\n\n/**\n * Map an `ActivityEvent` (kind + slug) to a target view id + entity scope.\n *\n * Returns `null` when no specific target is known — the caller should\n * still dispatch the event so the user lands somewhere useful, but\n * `null` means \"no specific deep-link scope\".\n */\nexport function activityTarget(kind: string | undefined, slug: string | undefined): ViewNavigateDetail | null {\n const k = (kind || '').toLowerCase();\n const s = slug || '';\n if (k.startsWith('task')) return { id: 'tasks', entity: s };\n if (k.startsWith('goal')) return { id: 'goals', entity: s };\n if (k.startsWith('agent')) return { id: 'agents', entity: s };\n if (k === 'artifact.new' || k.startsWith('artifact')) return { id: 'artifacts', entity: s };\n if (k.startsWith('git')) return { id: 'git', entity: s };\n return null;\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n Layers,\n Target,\n Settings as SettingsIcon,\n Cpu,\n Filter,\n Clock,\n Circle,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Slider } from '../../ui/controls/Slider.js';\nimport { ActivityLane, type ActivityLaneEvent } from '../../ui/activity/ActivityLane.js';\nimport { ActivityLanes } from '../../ui/activity/ActivityLanes.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { useViewNavigate, activityTarget } from '../../data/useViewNavigate.js';\nimport type { ActivityEvent } from '../../data/types.js';\n\n/**\n * ActivityView — Sprint S40 visual changelog.\n *\n * Inspired by patoles/agent-flow: vertical swimlanes per actor\n * (agent/system/user) with newest-first events, click-through to the\n * source entity (task / goal / agent / artifact), and multi-select\n * source filters.\n *\n * Layout: sticky header (search + live toggle + export) → counts row\n * with per-source badges → preferences card (live / compact / look-back)\n * → horizontal scroller of `ActivityLane`s.\n */\n\ntype Source = 'task' | 'agent' | 'goal' | 'settings' | 'system' | 'git' | 'all';\n\nconst SOURCE_META: Record<Exclude<Source, 'all'>, { label: string; icon: LucideIcon; tone: 'neutral' | 'info' | 'accent' | 'success' | 'warning' | 'danger' }> = {\n task: { label: 'Tasks', icon: Layers, tone: 'neutral' },\n agent: { label: 'Agents', icon: Bot, tone: 'info' },\n goal: { label: 'Goals', icon: Target, tone: 'accent' },\n settings: { label: 'Settings', icon: SettingsIcon, tone: 'neutral' },\n system: { label: 'System', icon: Cpu, tone: 'warning' },\n git: { label: 'Git', icon: GitMerge, tone: 'neutral' },\n};\n\nconst EVENT_TONE_MAP: Record<string, { icon: LucideIcon; tone: ActivityLaneEvent['tone']; source: Source }> = {\n 'git.merge': { icon: GitMerge, tone: 'success', source: 'git' },\n 'git.pull-request': { icon: GitPullRequest, tone: 'info', source: 'git' },\n 'task.completed': { icon: CheckCircle2, tone: 'success', source: 'task' },\n 'task.failed': { icon: AlertTriangle, tone: 'danger', source: 'task' },\n 'task.created': { icon: Layers, tone: 'info', source: 'task' },\n 'task.moved': { icon: Layers, tone: 'neutral', source: 'task' },\n 'agent.run': { icon: Bot, tone: 'info', source: 'agent' },\n 'agent.tool': { icon: Wrench, tone: 'neutral', source: 'agent' },\n 'agent.killed': { icon: AlertTriangle, tone: 'warning', source: 'agent' },\n 'agent.message': { icon: ActivityIcon, tone: 'info', source: 'agent' },\n 'goal.created': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.status': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.decomposed': { icon: Target, tone: 'success', source: 'goal' },\n 'settings.changed': { icon: SettingsIcon, tone: 'neutral', source: 'settings' },\n 'system.error': { icon: AlertTriangle, tone: 'danger', source: 'system' },\n 'system.note': { icon: ActivityIcon, tone: 'neutral', source: 'system' },\n};\n\nfunction inferSource(e: ActivityEvent): Source {\n const hint = (e.kind || e.iconKey || '').toLowerCase();\n if (hint.startsWith('task')) return 'task';\n if (hint.startsWith('agent')) return 'agent';\n if (hint.startsWith('goal')) return 'goal';\n if (hint.startsWith('settings')) return 'settings';\n if (hint.startsWith('git')) return 'git';\n if (hint.startsWith('system')) return 'system';\n if (e.title && /goal/i.test(e.title)) return 'goal';\n if (e.title && /(agent|claude|cc)/i.test(e.title)) return 'agent';\n return 'system';\n}\n\nfunction eventVisual(e: ActivityEvent): { icon: LucideIcon; tone: ActivityLaneEvent['tone']; source: Source } {\n const m = EVENT_TONE_MAP[e.kind || e.iconKey || ''] || EVENT_TONE_MAP['system.note'];\n const inferred = inferSource(e);\n return { icon: m.icon, tone: m.tone, source: inferred };\n}\n\nfunction laneKey(e: ActivityEvent): string {\n return e.agent || e.actor || e.slug || 'system';\n}\n\nfunction laneLabel(key: string): string {\n if (key === 'system') return 'System';\n return key;\n}\n\ninterface ExtendedEvent extends ActivityEvent {\n __source?: Source;\n __key?: string;\n}\n\nexport function ActivityView(): JSX.Element {\n const events = useFetch<{ items?: ActivityEvent[]; total?: number; limit?: number; since?: string | null }>('/api/activity?limit=200');\n const [live, setLive] = useState<ActivityEvent[]>([]);\n // Active source filter (single source — clicking a chip narrows to one).\n const [source, setSource] = useState<Source>('all');\n const [autoRefresh, setAutoRefresh] = useState<boolean>(true);\n const [compact, setCompact] = useState<boolean>(false);\n const [maxDays, setMaxDays] = useState<number>(14);\n const [exportError, setExportError] = useState<string | null>(null);\n const [search, setSearch] = useState<string>('');\n const navigate = useViewNavigate();\n\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n if (!autoRefresh) return;\n const ev = msg.event;\n if (!ev) return;\n setLive((prev) => [ev, ...prev].slice(0, 500));\n }, [autoRefresh]);\n useWsMessage('activity:new', onEvent);\n\n const merged = useMemo<ExtendedEvent[]>(() => {\n return [...live, ...(events.data?.items || [])];\n }, [live, events.data]);\n\n const filtered = useMemo<ExtendedEvent[]>(() => {\n let list = source === 'all' ? merged : merged.filter((e) => inferSource(e) === source);\n if (search.trim()) {\n const needle = search.trim().toLowerCase();\n list = list.filter((e) => {\n const hay = [\n e.title || '',\n e.description || '',\n e.kind || '',\n e.agent || '',\n e.actor || '',\n ].join(' ').toLowerCase();\n return hay.includes(needle);\n });\n }\n return list;\n }, [merged, source, search]);\n\n // Time-windowed set (older events clipped).\n const cutoff = Date.now() - maxDays * 86_400_000;\n const windowed = useMemo<ExtendedEvent[]>(\n () => filtered.filter((e) => (e.ts || 0) >= cutoff || e.ts === undefined),\n [filtered, cutoff],\n );\n\n const counts = useMemo(() => {\n const acc: Record<Source, number> = { all: 0, task: 0, agent: 0, goal: 0, settings: 0, system: 0, git: 0 };\n for (const e of merged) {\n const s = inferSource(e);\n acc.all += 1;\n acc[s] += 1;\n }\n return acc;\n }, [merged]);\n\n const sparklineData = useMemo<number[]>(() => {\n // Group by hour bucket for sparkline.\n const buckets = new Map<string, number>();\n for (const e of windowed) {\n if (!e.ts) continue;\n const d = new Date(e.ts);\n const k = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}T${String(d.getHours()).padStart(2, '0')}`;\n buckets.set(k, (buckets.get(k) ?? 0) + 1);\n }\n return [...buckets.entries()].sort(([a], [b]) => (a < b ? -1 : 1)).map(([, v]) => v).slice(-24);\n }, [windowed]);\n\n // Group events into lanes (one per actor).\n const lanes = useMemo<{ key: string; label: string; events: ActivityLaneEvent[]; icon: LucideIcon; tone: ActivityLaneEvent['tone'] }[]>(() => {\n const map = new Map<string, ActivityLaneEvent[]>();\n const order: string[] = [];\n for (const e of windowed) {\n const v = eventVisual(e);\n const ts = e.ts || Date.now();\n const k = laneKey(e);\n const id = e.id || `${k}-${ts}-${Math.random().toString(36).slice(2, 6)}`;\n if (!map.has(k)) { map.set(k, []); order.push(k); }\n const target = activityTarget(e.kind, e.slug);\n map.get(k)!.push({\n id,\n title: e.title || e.description || e.kind || 'event',\n description: e.description && e.description !== e.title ? e.description : undefined,\n ts,\n tone: v.tone,\n icon: v.icon,\n href: target ? undefined : undefined,\n kind: e.kind,\n agent: e.agent,\n actor: e.actor,\n slug: e.slug,\n raw: e,\n });\n }\n // Sort each lane newest-first; ensure consistent order.\n for (const arr of map.values()) arr.sort((a, b) => b.ts - a.ts);\n return order.map((k) => {\n const events = map.get(k)!;\n // Lane icon picks the most recent event's icon (visual hint).\n const Icon = (events[0]?.icon as LucideIcon) || Cpu;\n // Lane tone picks the worst recent tone (danger > warning > success > info > neutral).\n const severity: Record<NonNullable<ActivityLaneEvent['tone']>, number> = { danger: 4, warning: 3, success: 2, info: 1, neutral: 0 };\n const worst = events.reduce<ActivityLaneEvent['tone']>((acc, e) => {\n const cur = severity[e.tone ?? 'neutral'];\n const best = severity[acc ?? 'neutral'];\n return cur > best ? (e.tone ?? 'neutral') : acc;\n }, 'neutral');\n return { key: k, label: laneLabel(k), events, icon: Icon, tone: worst };\n }).sort((a, b) => b.events.length - a.events.length);\n }, [windowed]);\n\n const onLaneClick = useCallback((ev: ActivityLaneEvent) => {\n const target = activityTarget(ev.kind, ev.slug);\n if (target) {\n navigate(target);\n return;\n }\n // Fallback: navigate to activity's own view (no-op) but focus the row.\n }, [navigate]);\n\n const exportNdjson = async (): Promise<void> => {\n setExportError(null);\n try {\n const res = await fetchJson<{ items?: ActivityEvent[] }>('/api/activity?limit=10000');\n const text = (res.items || []).map((e) => JSON.stringify(e)).join('\\n');\n const blob = new Blob([text], { type: 'application/x-ndjson' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-activity-${new Date().toISOString().slice(0, 10)}.ndjson`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n } catch (err) {\n setExportError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"activity-view\">\n <ViewHeader\n title=\"Activity\"\n description=\"Live event lanes grouped by agent, system, and goal.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <input\n type=\"search\"\n placeholder=\"Search…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search activity\"\n style={{\n height: 28,\n padding: '0 var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-12)',\n width: 200,\n outline: 'none',\n }}\n />\n <Inline align=\"center\" gap={1}>\n <Circle\n size={8}\n aria-hidden\n style={{ color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}\n fill=\"currentColor\"\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {autoRefresh ? 'Live' : 'Paused'}\n </span>\n <Button variant=\"ghost\" onClick={() => setAutoRefresh((v) => !v)} aria-label={autoRefresh ? 'Pause stream' : 'Resume stream'}>\n {autoRefresh ? 'Pause' : 'Resume'}\n </Button>\n </Inline>\n <Button variant=\"secondary\" onClick={() => { void exportNdjson(); }}>\n <Filter size={12} aria-hidden /> Export NDJSON\n </Button>\n </Inline>\n }\n />\n <ListHeader\n title=\"Lanes\"\n count={windowed.length}\n sparkline={sparklineData.length >= 2 ? <Sparkline data={sparklineData} width={120} height={28} /> : undefined}\n description={`${lanes.length} lane${lanes.length === 1 ? '' : 's'} · ${counts.task} task · ${counts.agent} agent · ${counts.goal} goal`}\n testid=\"activity-list-header\"\n />\n\n {exportError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n {exportError}\n </div>\n )}\n\n {/* Source filter chips */}\n <Inline align=\"center\" gap={2} wrap>\n <FilterChip label={`All (${counts.all})`} active={source === 'all'} onClick={() => setSource('all')} icon={<ActivityIcon size={12} aria-hidden />} />\n {(Object.keys(SOURCE_META) as Array<Exclude<Source, 'all'>>).map((s) => {\n const meta = SOURCE_META[s];\n const Icon = meta.icon;\n return (\n <FilterChip\n key={s}\n label={`${meta.label} (${counts[s]})`}\n active={source === s}\n onClick={() => setSource(s)}\n icon={<Icon size={12} aria-hidden />}\n />\n );\n })}\n </Inline>\n\n {/* Display prefs */}\n <Card>\n <CardBody>\n <Inline align=\"center\" gap={6} wrap>\n <Stack gap={1}>\n <label htmlFor=\"cl-auto\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Live tail</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-auto\" checked={autoRefresh} onCheckedChange={setAutoRefresh} />\n <span style={{ fontSize: 'var(--fs-12)', color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}>\n {autoRefresh ? 'on' : 'paused'}\n </span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-compact\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Compact rows</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-compact\" checked={compact} onCheckedChange={setCompact} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{compact ? 'compact' : 'comfortable'}</span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-days\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Look back</label>\n <Inline align=\"center\" gap={2}>\n <Slider id=\"cl-days\" value={[maxDays]} onValueChange={(v) => setMaxDays(v[0] ?? 14)} min={1} max={90} step={1} />\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{maxDays}d</code>\n </Inline>\n </Stack>\n <Inline align=\"center\" gap={1}>\n <Clock size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n click any event row to jump to its source\n </span>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n\n {/* Empty state */}\n {!events.loading && windowed.length === 0 && (\n <Card>\n <CardBody>\n <Stack gap={1}>\n <strong>No activity matching filters.</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Clear the source filter or extend the look-back window.\n </span>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {events.loading && windowed.length === 0 ? (\n <Skeleton style={{ height: 480 }} />\n ) : events.error && windowed.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load activity\"\n description=\"The activity feed failed to fetch. Retry to refetch.\"\n error={events.error}\n onRetry={() => void events.refetch()}\n testid=\"activity-error\"\n />\n ) : lanes.length === 0 ? (\n <Card>\n <CardBody>\n <span style={{ color: 'var(--fg-muted)' }}>No lanes yet — events will appear here as agents run.</span>\n </CardBody>\n </Card>\n ) : (\n <ActivityLanes minHeight={compact ? 320 : 480}>\n {lanes.map((lane) => (\n <ActivityLane\n key={lane.key}\n laneId={lane.key}\n label={lane.label}\n icon={lane.icon}\n events={lane.events}\n loading={events.loading && lane.events.length === 0}\n onEventClick={onLaneClick}\n trailing={\n <Badge tone={\n lane.tone === 'danger' ? 'danger'\n : lane.tone === 'warning' ? 'warning'\n : lane.tone === 'success' ? 'success'\n : lane.tone === 'info' ? 'info'\n : 'neutral'\n }>\n {lane.tone}\n </Badge>\n }\n />\n ))}\n </ActivityLanes>\n )}\n </Stack>\n );\n}\n\nfunction FilterChip({ label, active, onClick, icon }: { label: string; active: boolean; onClick: () => void; icon?: React.ReactNode }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 10px',\n borderRadius: 'var(--radius-pill)',\n border: `1px solid ${active ? 'var(--accent)' : 'var(--border)'}`,\n background: active ? 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))' : 'var(--surface-1)',\n color: active ? 'var(--accent)' : 'var(--fg)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n fontWeight: active ? 600 : 500,\n }}\n >\n {icon}\n {label}\n </button>\n );\n}\n"],"names":["TONE_VAR","timeShort","ts","d","relTime","diff","ActivityLane","props","laneId","label","Icon","events","loading","onEventClick","collapsible","trailing","width","className","style","headerStyle","jsxs","cx","jsx","Inline","Stack","LaneSkeleton","e","tone","EventIcon","interactive","rowStyle","inner","Fragment","ev","i","ActivityLanes","children","gap","minHeight","fade","containerStyle","useViewNavigate","useCallback","detail","activityTarget","kind","slug","k","s","SOURCE_META","Layers","Bot","Target","SettingsIcon","Cpu","GitMerge","EVENT_TONE_MAP","GitPullRequest","CheckCircle2","AlertTriangle","Wrench","ActivityIcon","inferSource","hint","eventVisual","m","inferred","laneKey","laneLabel","key","ActivityView","useFetch","live","setLive","useState","source","setSource","autoRefresh","setAutoRefresh","compact","setCompact","maxDays","setMaxDays","exportError","setExportError","search","setSearch","navigate","onEvent","msg","prev","useWsMessage","merged","useMemo","_a","filtered","list","needle","cutoff","windowed","counts","acc","sparklineData","buckets","a","b","v","lanes","map","order","id","target","arr","severity","worst","cur","best","onLaneClick","exportNdjson","text","fetchJson","blob","url","err","FetchError","ViewHeader","Circle","Button","Filter","ListHeader","Sparkline","FilterChip","meta","Card","CardBody","Switch","Slider","Clock","Skeleton","ErrorState","lane","Badge","active","onClick","icon"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r as s}from"./cmdk-C3F6LD6N.js";import{d as f,S as d,D as y,I as h,B as l,i as S,F as j}from"./main-
|
|
1
|
+
import{j as e,r as s}from"./cmdk-C3F6LD6N.js";import{d as f,S as d,D as y,I as h,B as l,i as S,F as j}from"./main-BRmJZcHt.js";import{V as b}from"./ViewHeader-BsnaspKw.js";import{C as k,b as T}from"./Card-Clkvh43Q.js";import{G as w}from"./Grid-Bojq8Sg7.js";import{T as C}from"./trash-2-B_Y6HrfN.js";import{B as D}from"./brain-D7k5s8vH.js";import{P as z}from"./power-off-upZ4xjaG.js";import{D as R}from"./download-B-mPX5P_.js";import{S as P}from"./shield-alert-DA9K6uZO.js";import{R as O}from"./refresh-cw-KGm5eQgv.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminView-BjczABeB.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hammer.js","../../../node_modules/lucide-react/dist/esm/icons/scroll-text.js","../../src/web/v8/views/Admin/AdminView.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 Hammer = createLucideIcon(\"Hammer\", [\n [\"path\", { d: \"m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9\", key: \"eefl8a\" }],\n [\"path\", { d: \"m18 15 4-4\", key: \"16gjal\" }],\n [\n \"path\",\n {\n d: \"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\",\n key: \"b7pghm\"\n }\n ]\n]);\n\nexport { Hammer as default };\n//# sourceMappingURL=hammer.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ScrollText = createLucideIcon(\"ScrollText\", [\n [\"path\", { d: \"M15 12h-5\", key: \"r7krc0\" }],\n [\"path\", { d: \"M15 8h-5\", key: \"1khuty\" }],\n [\"path\", { d: \"M19 17V5a2 2 0 0 0-2-2H4\", key: \"zz82l3\" }],\n [\n \"path\",\n {\n d: \"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\",\n key: \"1ph1d7\"\n }\n ]\n]);\n\nexport { ScrollText as default };\n//# sourceMappingURL=scroll-text.js.map\n","/**\n * v8/views/Admin/AdminView.tsx — Sprint S40, v9.3.0.\n *\n * Card grid of admin / maintenance actions. Each tile posts to its\n * /api/admin/* endpoint, shows a spinner while busy, surfaces the\n * result inline (or the error message), and uses the inline-confirm\n * pattern for destructive actions (cache clear, log purge, restart,\n * rebuild).\n */\n\nimport { useState } from 'react';\nimport {\n RefreshCw,\n Trash2,\n Database,\n Brain,\n PowerOff,\n Hammer,\n ScrollText,\n Download,\n ShieldAlert,\n} from 'lucide-react';\nimport type { LucideIcon } 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 { Grid } from '../../ui/primitives/Grid.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AdminAction {\n id: string;\n title: string;\n description: string;\n icon: LucideIcon;\n endpoint: string;\n method: 'POST' | 'GET';\n destructive: boolean;\n group: 'data' | 'service' | 'logs';\n}\n\nconst ACTIONS: AdminAction[] = [\n {\n id: 'gc',\n title: 'Garbage collect',\n description: 'Prune empty session files + orphaned task rows from the cache.',\n icon: Trash2,\n endpoint: '/api/admin/gc',\n method: 'POST',\n destructive: false,\n group: 'data',\n },\n {\n id: 'cache-clear',\n title: 'Clear cache',\n description: 'Wipe the dashboard cache directory. Rebuilds on next access.',\n icon: Database,\n endpoint: '/api/admin/cache/clear',\n method: 'POST',\n destructive: true,\n group: 'data',\n },\n {\n id: 'memory-reindex',\n title: 'Reindex memory',\n description: 'Rebuild the vault search index.',\n icon: Brain,\n endpoint: '/api/admin/memory/reindex',\n method: 'POST',\n destructive: false,\n group: 'data',\n },\n {\n id: 'logs-purge',\n title: 'Purge old logs',\n description: 'Delete log files older than 14 days from ~/.config/bizar/logs.',\n icon: ScrollText,\n endpoint: '/api/admin/logs/purge',\n method: 'POST',\n destructive: true,\n group: 'logs',\n },\n {\n id: 'restart',\n title: 'Restart dashboard',\n description: 'Signal the server to shut down. The CLI launcher restarts it.',\n icon: PowerOff,\n endpoint: '/api/admin/restart',\n method: 'POST',\n destructive: true,\n group: 'service',\n },\n {\n id: 'rebuild',\n title: 'Rebuild',\n description: 'Re-run the installer build step.',\n icon: Hammer,\n endpoint: '/api/admin/rebuild',\n method: 'POST',\n destructive: true,\n group: 'service',\n },\n {\n id: 'export-activity',\n title: 'Export activity',\n description: 'Download the full activity log as NDJSON.',\n icon: Download,\n endpoint: '/api/admin/activity/export',\n method: 'GET',\n destructive: false,\n group: 'logs',\n },\n];\n\nconst GROUPS: Array<{ id: 'data' | 'service' | 'logs'; title: string }> = [\n { id: 'data', title: 'Data & cache' },\n { id: 'service', title: 'Service' },\n { id: 'logs', title: 'Logs' },\n];\n\nexport function AdminView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"admin-view\">\n <ViewHeader\n title=\"Admin\"\n description=\"Maintenance actions. Destructive actions require an inline confirm.\"\n />\n <Stack gap={4} data-testid=\"admin-groups\">\n {GROUPS.map((group) => {\n const items = ACTIONS.filter((a) => a.group === group.id);\n if (items.length === 0) return null;\n return (\n <Stack key={group.id} gap={2} data-testid={`admin-group-${group.id}`}>\n <h3 style={{ margin: 0, fontSize: 'var(--fs-12)', textTransform: 'uppercase', letterSpacing: 'var(--tracking-wide)', color: 'var(--fg-muted)' }}>\n {group.title}\n </h3>\n <Grid cols={{ base: 1, md: 2, lg: 3 }} gap={3}>\n {items.map((a) => (\n <AdminTile key={a.id} action={a} />\n ))}\n </Grid>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n );\n}\n\nfunction AdminTile({ action }: { action: AdminAction }): JSX.Element {\n const [busy, setBusy] = useState<boolean>(false);\n const [confirm, setConfirm] = useState<boolean>(false);\n const [result, setResult] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const Icon = action.icon;\n\n const run = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setResult(null);\n try {\n if (action.method === 'GET') {\n // For GET endpoints (export), trigger a download by navigating\n // to the endpoint in a new tab. The server sets Content-Disposition.\n window.open(action.endpoint, '_blank');\n setResult('Download started');\n } else {\n const res = await fetchJson<{ ok?: boolean; files?: number; bytes?: number; note?: string }>(\n action.endpoint,\n { method: action.method, body: {} },\n );\n const summary = res.note\n ? res.note\n : res.files !== undefined\n ? `${res.files} file(s) removed (${res.bytes ?? 0} bytes)`\n : res.ok ? 'Done' : 'Done';\n setResult(summary);\n }\n setConfirm(false);\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 <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <Icon size={18} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{action.title}</strong>\n {action.destructive && (\n <span style={{ marginLeft: 'auto', color: 'var(--danger)', fontSize: 'var(--fs-11)' }} aria-label=\"Destructive\">\n <ShieldAlert size={14} aria-hidden style={{ verticalAlign: 'middle' }} /> destructive\n </span>\n )}\n </Inline>\n <p style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)', margin: 0 }}>\n {action.description}\n </p>\n {result !== null && (\n <span data-testid={`admin-result-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>\n {result}\n </span>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid={`admin-error-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {error}\n </span>\n )}\n {confirm ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void run()} disabled={busy} data-testid={`admin-confirm-${action.id}`}>\n Confirm\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirm(false)} disabled={busy} data-testid={`admin-cancel-${action.id}`}>\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button\n variant={action.destructive ? 'danger' : 'primary'}\n onClick={() => (action.destructive ? setConfirm(true) : void run())}\n disabled={busy}\n data-testid={`admin-run-${action.id}`}\n >\n <RefreshCw size={14} aria-hidden /> {busy ? 'Working…' : 'Run'}\n </Button>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}"],"names":["Hammer","createLucideIcon","ScrollText","ACTIONS","Trash2","Database","Brain","PowerOff","Download","GROUPS","AdminView","jsxs","Stack","jsx","ViewHeader","group","items","Grid","AdminTile","action","busy","setBusy","useState","confirm","setConfirm","result","setResult","error","setError","Icon","run","res","fetchJson","summary","err","FetchError","Card","CardBody","Inline","ShieldAlert","Button","RefreshCw"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"AdminView-CLTNKFL4.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hammer.js","../../../node_modules/lucide-react/dist/esm/icons/scroll-text.js","../../src/web/v8/views/Admin/AdminView.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 Hammer = createLucideIcon(\"Hammer\", [\n [\"path\", { d: \"m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9\", key: \"eefl8a\" }],\n [\"path\", { d: \"m18 15 4-4\", key: \"16gjal\" }],\n [\n \"path\",\n {\n d: \"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\",\n key: \"b7pghm\"\n }\n ]\n]);\n\nexport { Hammer as default };\n//# sourceMappingURL=hammer.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ScrollText = createLucideIcon(\"ScrollText\", [\n [\"path\", { d: \"M15 12h-5\", key: \"r7krc0\" }],\n [\"path\", { d: \"M15 8h-5\", key: \"1khuty\" }],\n [\"path\", { d: \"M19 17V5a2 2 0 0 0-2-2H4\", key: \"zz82l3\" }],\n [\n \"path\",\n {\n d: \"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\",\n key: \"1ph1d7\"\n }\n ]\n]);\n\nexport { ScrollText as default };\n//# sourceMappingURL=scroll-text.js.map\n","/**\n * v8/views/Admin/AdminView.tsx — Sprint S40, v9.3.0.\n *\n * Card grid of admin / maintenance actions. Each tile posts to its\n * /api/admin/* endpoint, shows a spinner while busy, surfaces the\n * result inline (or the error message), and uses the inline-confirm\n * pattern for destructive actions (cache clear, log purge, restart,\n * rebuild).\n */\n\nimport { useState } from 'react';\nimport {\n RefreshCw,\n Trash2,\n Database,\n Brain,\n PowerOff,\n Hammer,\n ScrollText,\n Download,\n ShieldAlert,\n} from 'lucide-react';\nimport type { LucideIcon } 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 { Grid } from '../../ui/primitives/Grid.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AdminAction {\n id: string;\n title: string;\n description: string;\n icon: LucideIcon;\n endpoint: string;\n method: 'POST' | 'GET';\n destructive: boolean;\n group: 'data' | 'service' | 'logs';\n}\n\nconst ACTIONS: AdminAction[] = [\n {\n id: 'gc',\n title: 'Garbage collect',\n description: 'Prune empty session files + orphaned task rows from the cache.',\n icon: Trash2,\n endpoint: '/api/admin/gc',\n method: 'POST',\n destructive: false,\n group: 'data',\n },\n {\n id: 'cache-clear',\n title: 'Clear cache',\n description: 'Wipe the dashboard cache directory. Rebuilds on next access.',\n icon: Database,\n endpoint: '/api/admin/cache/clear',\n method: 'POST',\n destructive: true,\n group: 'data',\n },\n {\n id: 'memory-reindex',\n title: 'Reindex memory',\n description: 'Rebuild the vault search index.',\n icon: Brain,\n endpoint: '/api/admin/memory/reindex',\n method: 'POST',\n destructive: false,\n group: 'data',\n },\n {\n id: 'logs-purge',\n title: 'Purge old logs',\n description: 'Delete log files older than 14 days from ~/.config/bizar/logs.',\n icon: ScrollText,\n endpoint: '/api/admin/logs/purge',\n method: 'POST',\n destructive: true,\n group: 'logs',\n },\n {\n id: 'restart',\n title: 'Restart dashboard',\n description: 'Signal the server to shut down. The CLI launcher restarts it.',\n icon: PowerOff,\n endpoint: '/api/admin/restart',\n method: 'POST',\n destructive: true,\n group: 'service',\n },\n {\n id: 'rebuild',\n title: 'Rebuild',\n description: 'Re-run the installer build step.',\n icon: Hammer,\n endpoint: '/api/admin/rebuild',\n method: 'POST',\n destructive: true,\n group: 'service',\n },\n {\n id: 'export-activity',\n title: 'Export activity',\n description: 'Download the full activity log as NDJSON.',\n icon: Download,\n endpoint: '/api/admin/activity/export',\n method: 'GET',\n destructive: false,\n group: 'logs',\n },\n];\n\nconst GROUPS: Array<{ id: 'data' | 'service' | 'logs'; title: string }> = [\n { id: 'data', title: 'Data & cache' },\n { id: 'service', title: 'Service' },\n { id: 'logs', title: 'Logs' },\n];\n\nexport function AdminView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"admin-view\">\n <ViewHeader\n title=\"Admin\"\n description=\"Maintenance actions. Destructive actions require an inline confirm.\"\n />\n <Stack gap={4} data-testid=\"admin-groups\">\n {GROUPS.map((group) => {\n const items = ACTIONS.filter((a) => a.group === group.id);\n if (items.length === 0) return null;\n return (\n <Stack key={group.id} gap={2} data-testid={`admin-group-${group.id}`}>\n <h3 style={{ margin: 0, fontSize: 'var(--fs-12)', textTransform: 'uppercase', letterSpacing: 'var(--tracking-wide)', color: 'var(--fg-muted)' }}>\n {group.title}\n </h3>\n <Grid cols={{ base: 1, md: 2, lg: 3 }} gap={3}>\n {items.map((a) => (\n <AdminTile key={a.id} action={a} />\n ))}\n </Grid>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n );\n}\n\nfunction AdminTile({ action }: { action: AdminAction }): JSX.Element {\n const [busy, setBusy] = useState<boolean>(false);\n const [confirm, setConfirm] = useState<boolean>(false);\n const [result, setResult] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const Icon = action.icon;\n\n const run = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setResult(null);\n try {\n if (action.method === 'GET') {\n // For GET endpoints (export), trigger a download by navigating\n // to the endpoint in a new tab. The server sets Content-Disposition.\n window.open(action.endpoint, '_blank');\n setResult('Download started');\n } else {\n const res = await fetchJson<{ ok?: boolean; files?: number; bytes?: number; note?: string }>(\n action.endpoint,\n { method: action.method, body: {} },\n );\n const summary = res.note\n ? res.note\n : res.files !== undefined\n ? `${res.files} file(s) removed (${res.bytes ?? 0} bytes)`\n : res.ok ? 'Done' : 'Done';\n setResult(summary);\n }\n setConfirm(false);\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 <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <Icon size={18} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{action.title}</strong>\n {action.destructive && (\n <span style={{ marginLeft: 'auto', color: 'var(--danger)', fontSize: 'var(--fs-11)' }} aria-label=\"Destructive\">\n <ShieldAlert size={14} aria-hidden style={{ verticalAlign: 'middle' }} /> destructive\n </span>\n )}\n </Inline>\n <p style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)', margin: 0 }}>\n {action.description}\n </p>\n {result !== null && (\n <span data-testid={`admin-result-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>\n {result}\n </span>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid={`admin-error-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {error}\n </span>\n )}\n {confirm ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void run()} disabled={busy} data-testid={`admin-confirm-${action.id}`}>\n Confirm\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirm(false)} disabled={busy} data-testid={`admin-cancel-${action.id}`}>\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button\n variant={action.destructive ? 'danger' : 'primary'}\n onClick={() => (action.destructive ? setConfirm(true) : void run())}\n disabled={busy}\n data-testid={`admin-run-${action.id}`}\n >\n <RefreshCw size={14} aria-hidden /> {busy ? 'Working…' : 'Run'}\n </Button>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}"],"names":["Hammer","createLucideIcon","ScrollText","ACTIONS","Trash2","Database","Brain","PowerOff","Download","GROUPS","AdminView","jsxs","Stack","jsx","ViewHeader","group","items","Grid","AdminTile","action","busy","setBusy","useState","confirm","setConfirm","result","setResult","error","setError","Icon","run","res","fetchJson","summary","err","FetchError","Card","CardBody","Inline","ShieldAlert","Button","RefreshCw"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as l,j as a,S as ta,e as ue,P,m as le,b as L,i as R,c as ee,x as ra,n as Ge,u as ur,d as fr,f as pr,D as vr,y as na,R as y,z as oa,h as aa,A as sa,l as ia,g as la,F as ca,k as da}from"./cmdk-C3F6LD6N.js";import{u as ua,a as nr,D as fa,c as pa,s as va,K as ga,P as ma,b as ha,d as xa,C as ba}from"./dnd-kit-BAOLODOI.js";import{d as $e,g as I,l as _t,M as ya,m as gr,R as wa,n as mr,o as hr,p as Xe,q as xr,C as Ca,r as Ra,s as _a}from"./main-
|
|
1
|
+
import{r as l,j as a,S as ta,e as ue,P,m as le,b as L,i as R,c as ee,x as ra,n as Ge,u as ur,d as fr,f as pr,D as vr,y as na,R as y,z as oa,h as aa,A as sa,l as ia,g as la,F as ca,k as da}from"./cmdk-C3F6LD6N.js";import{u as ua,a as nr,D as fa,c as pa,s as va,K as ga,P as ma,b as ha,d as xa,C as ba}from"./dnd-kit-BAOLODOI.js";import{d as $e,g as I,l as _t,M as ya,m as gr,R as wa,n as mr,o as hr,p as Xe,q as xr,C as Ca,r as Ra,s as _a}from"./main-BRmJZcHt.js";import{P as Ia}from"./plus-Cps-8lcG.js";import{C as Ma}from"./calendar-CAZoDd-l.js";import{G as ja}from"./Avatar-CRW81ewE.js";import{u as br}from"./index-B1OIS316.js";import{M as ka}from"./ActivityFeed-Bw4Cai7r.js";import{c as It,u as Fe}from"./index-CR0TeJmc.js";import{R as Ta}from"./Select-Bf_P0S6H.js";import{C as yr}from"./ViewHeader-BsnaspKw.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|