@polderlabs/bizar 10.4.3 → 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-DC0JiK49.js → ActivityFeed-Bw4Cai7r.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js.map → ActivityFeed-Bw4Cai7r.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js → ActivityView-BC0QQ_j9.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js.map → ActivityView-BC0QQ_j9.js.map} +1 -1
- package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js +11 -0
- package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js.map +1 -0
- package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js → AgentActivity-DBWDByjk.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js.map → AgentActivity-DBWDByjk.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-CIQkZH8_.js → AgentsView-DD6bCIbA.js} +4 -4
- package/bizar-dash/dist/assets/AgentsView-DD6bCIbA.js.map +1 -0
- package/bizar-dash/dist/assets/{Alert-MwVEymjy.js → Alert-pzFISNtS.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-MwVEymjy.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-LaQuGo4u.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-CRW81ewE.js +6 -0
- package/bizar-dash/dist/assets/Avatar-CRW81ewE.js.map +1 -0
- 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-Cjf23ZWc.js → BackupView-u_O3j0TG.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js.map → BackupView-u_O3j0TG.js.map} +1 -1
- package/bizar-dash/dist/assets/Banner-Du-3l05O.js +1 -0
- package/bizar-dash/dist/assets/Banner-Du-3l05O.js.map +1 -0
- package/bizar-dash/dist/assets/{Card-BmXiT4c6.js → Card-Clkvh43Q.js} +1 -1
- package/bizar-dash/dist/assets/{Card-BmXiT4c6.js.map → Card-Clkvh43Q.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js → ChatView-BTjb3mIh.js} +3 -3
- package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js.map → ChatView-BTjb3mIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-Dei66BLx.js → Chip-B7ovcm01.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-Dei66BLx.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-Cb6XgYZI.js.map +1 -0
- package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js → ConfigView-DfTJk1uL.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js.map → ConfigView-DfTJk1uL.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js → DiagnosticsView-D5Wy9xlJ.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js.map → DiagnosticsView-D5Wy9xlJ.js.map} +1 -1
- package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js +6 -0
- package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js.map +1 -0
- package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js → DoctorView-Dm94WI2z.js} +2 -2
- package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js.map → DoctorView-Dm94WI2z.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js → EmptyState-ccT__JZG.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js.map → EmptyState-ccT__JZG.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js → EnvVarsView-BhcIuJ6V.js} +3 -3
- package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js.map → EnvVarsView-BhcIuJ6V.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js → ErrorState-BSqf65ka.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js.map → ErrorState-BSqf65ka.js.map} +1 -1
- package/bizar-dash/dist/assets/EvalView-2cbWVBUA.js +1 -0
- package/bizar-dash/dist/assets/{EvalView-lgUhlGJh.js.map → EvalView-2cbWVBUA.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js → GoalsView-C3QG5p7T.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js.map → GoalsView-C3QG5p7T.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-BThCPJaV.js → Grid-Bojq8Sg7.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-BThCPJaV.js.map → Grid-Bojq8Sg7.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js → HistoryView-Bum2TMMw.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js.map → HistoryView-Bum2TMMw.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-cAQOvR8U.js → Input-DV-vdaV8.js} +1 -1
- package/bizar-dash/dist/assets/{Input-cAQOvR8U.js.map → Input-DV-vdaV8.js.map} +1 -1
- package/bizar-dash/dist/assets/LibrariesView-DH2E2uNb.js +6 -0
- package/bizar-dash/dist/assets/{LibrariesView-Ca_PRjUm.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-BLAeshe0.js → ListHeader-CCD_nIHb.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js.map → ListHeader-CCD_nIHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js → MemoryView-Cr-obIQY.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js.map → MemoryView-Cr-obIQY.js.map} +1 -1
- package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js +1 -0
- package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js.map +1 -0
- package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js → ModsView-B6OR-a4B.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js.map → ModsView-B6OR-a4B.js.map} +1 -1
- package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js +6 -0
- package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js.map +1 -0
- package/bizar-dash/dist/assets/ObsidianView-Nahah8QC.js +1 -0
- package/bizar-dash/dist/assets/{ObsidianView-C-AvHfpT.js.map → ObsidianView-Nahah8QC.js.map} +1 -1
- package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js.map +1 -0
- package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js → ProgressBar-KC4VXsl_.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js.map → ProgressBar-KC4VXsl_.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js → ProjectsView-DgxWiqHb.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js.map → ProjectsView-DgxWiqHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js → ProvidersView-BOqN9omv.js} +2 -2
- package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.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-D5AuVxxV.js → Select-Bf_P0S6H.js} +1 -1
- package/bizar-dash/dist/assets/{Select-D5AuVxxV.js.map → Select-Bf_P0S6H.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js → SettingsRow-CJb-F94Y.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js.map → SettingsRow-CJb-F94Y.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-UD403neY.js → SettingsView-BvOGcgMS.js} +2 -2
- package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js.map +1 -0
- package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js → Sheet-BwMVGN-8.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js.map → Sheet-BwMVGN-8.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js → Slider-AjjzqI-5.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js.map → Slider-AjjzqI-5.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js → Sparkline-Z4y0YUZS.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js.map → Sparkline-Z4y0YUZS.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js → Switch-B79a2t-G.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js.map → Switch-B79a2t-G.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-DseftDlx.js → TasksView-G-s_pwwr.js} +2 -2
- package/bizar-dash/dist/assets/{TasksView-DseftDlx.js.map → TasksView-G-s_pwwr.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js → Textarea-BfXGMXQ7.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js.map → Textarea-BfXGMXQ7.js.map} +1 -1
- package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js +1 -0
- package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js.map +1 -0
- package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js → UsageView-M01G6bZQ.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js.map → UsageView-M01G6bZQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js → ViewHeader-BsnaspKw.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js.map → ViewHeader-BsnaspKw.js.map} +1 -1
- package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js +1 -0
- package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js.map +1 -0
- package/bizar-dash/dist/assets/{brain-D6tAeUDE.js → brain-D7k5s8vH.js} +1 -1
- package/bizar-dash/dist/assets/{brain-D6tAeUDE.js.map → brain-D7k5s8vH.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js → calendar-CAZoDd-l.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js.map → calendar-CAZoDd-l.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-fPTATiOs.js → circle-D99cZJBr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-fPTATiOs.js.map → circle-D99cZJBr.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js → circle-alert-QQTU4Quz.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js.map → circle-alert-QQTU4Quz.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js → circle-check-BMbe7Kkr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js.map → circle-check-BMbe7Kkr.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-E-G5aGua.js → clock-OtT5mvF3.js} +1 -1
- package/bizar-dash/dist/assets/{clock-E-G5aGua.js.map → clock-OtT5mvF3.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-DBkNb6oI.js → download-B-mPX5P_.js} +1 -1
- package/bizar-dash/dist/assets/{download-DBkNb6oI.js.map → download-B-mPX5P_.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js → external-link-DPDQM1YO.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js.map → external-link-DPDQM1YO.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js → file-text-BsCrv5aP.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js.map → file-text-BsCrv5aP.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-CEYjeWFX.js → filter-Do63x17E.js} +1 -1
- package/bizar-dash/dist/assets/{filter-CEYjeWFX.js.map → filter-Do63x17E.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js → git-pull-request-CpRAmERC.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.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-BsfwrUA-.js → network-DJnHwHX3.js} +1 -1
- package/bizar-dash/dist/assets/{network-BsfwrUA-.js.map → network-DJnHwHX3.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-C8PN1_yO.js → pause-HitDUnk_.js} +1 -1
- package/bizar-dash/dist/assets/{pause-C8PN1_yO.js.map → pause-HitDUnk_.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil---XuvKlz.js → pencil-Dkks7eIC.js} +1 -1
- package/bizar-dash/dist/assets/{pencil---XuvKlz.js.map → pencil-Dkks7eIC.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-fMLPTihK.js → play-blqh0msT.js} +2 -2
- package/bizar-dash/dist/assets/{play-fMLPTihK.js.map → play-blqh0msT.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-CG8al2Kq.js → plug-DVvSSe40.js} +1 -1
- package/bizar-dash/dist/assets/{plug-CG8al2Kq.js.map → plug-DVvSSe40.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-uA5Ecuch.js → plus-Cps-8lcG.js} +1 -1
- package/bizar-dash/dist/assets/{plus-uA5Ecuch.js.map → plus-Cps-8lcG.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DSUlNIuR.js → power-DEX4_Xoa.js} +1 -1
- package/bizar-dash/dist/assets/{power-DSUlNIuR.js.map → power-DEX4_Xoa.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js → power-off-upZ4xjaG.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js.map → power-off-upZ4xjaG.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js → refresh-ccw-DN_zCB1h.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js.map → refresh-ccw-DN_zCB1h.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js → refresh-cw-KGm5eQgv.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js.map → refresh-cw-KGm5eQgv.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js → rotate-ccw-D5fkDRgk.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js.map → rotate-ccw-D5fkDRgk.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js → rotate-cw-CClSVUaX.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js.map → rotate-cw-CClSVUaX.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-RcZOXR0U.js → save-BY4ViPku.js} +1 -1
- package/bizar-dash/dist/assets/{save-RcZOXR0U.js.map → save-BY4ViPku.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-Bg2X_ibk.js → send-CaOL1yQD.js} +2 -2
- package/bizar-dash/dist/assets/{send-Bg2X_ibk.js.map → send-CaOL1yQD.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js → shield-alert-DA9K6uZO.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js.map → shield-alert-DA9K6uZO.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-B885GY46.js → trash-2-B_Y6HrfN.js} +2 -2
- package/bizar-dash/dist/assets/{trash-2-B885GY46.js.map → trash-2-B_Y6HrfN.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js → trending-up-qKTUQKIT.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js.map → trending-up-qKTUQKIT.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js → triangle-alert-BeY8LAv6.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js.map → triangle-alert-BeY8LAv6.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-C-oafpyE.js → upload-BZCtmqIh.js} +1 -1
- package/bizar-dash/dist/assets/{upload-C-oafpyE.js.map → upload-BZCtmqIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js → zap-Bz1Z8y1Q.js} +2 -2
- package/bizar-dash/dist/assets/{zap-O_4Ys_hh.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/App.tsx +25 -4
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +49 -36
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +120 -24
- 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/globals.css +14 -0
- package/bizar-dash/src/web/v8/ui/styles/tokens.css +21 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +11 -6
- package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +32 -5
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +11 -4
- package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/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/Clipboard/ClipboardView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +23 -2
- package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +82 -13
- package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +19 -0
- package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +48 -13
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +3 -3
- package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +1 -1
- package/bizar-dash/tests/admin-run-grouping.test.mjs +42 -0
- package/bizar-dash/tests/agents-preview-truncate.test.mjs +35 -0
- package/bizar-dash/tests/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/empty-state-docs.test.mjs +55 -0
- package/bizar-dash/tests/errorstate-retry.test.mjs +42 -0
- package/bizar-dash/tests/focus-visible.test.mjs +30 -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/notifications-dismiss-restore.test.mjs +85 -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/palette-shortcut-hint.test.mjs +58 -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-distinct-icons.test.mjs +28 -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/theme-toggle-icon.test.mjs +28 -0
- package/bizar-dash/tests/topbar-design-system.test.mjs +56 -0
- package/bizar-dash/tests/topbar-popover-styles.test.mjs +53 -0
- package/bizar-dash/tests/update-channels.test.mjs +67 -0
- package/bizar-dash/vite.config.ts +8 -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/AdminView-CI4zM2Qg.js +0 -11
- package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js.map +0 -1
- package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +0 -1
- package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js +0 -21
- package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js.map +0 -1
- package/bizar-dash/dist/assets/AuthView-LaQuGo4u.js.map +0 -1
- package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js +0 -6
- package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js.map +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-CO3DEG8R.js +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-CO3DEG8R.js.map +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-D-YNmzKi.js +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-D-YNmzKi.js.map +0 -1
- package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js +0 -1
- package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js.map +0 -1
- package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js +0 -6
- package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js.map +0 -1
- package/bizar-dash/dist/assets/EvalView-lgUhlGJh.js +0 -1
- package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +0 -6
- package/bizar-dash/dist/assets/LightRAGView-CMk9wOae.js +0 -6
- package/bizar-dash/dist/assets/LightRAGView-CMk9wOae.js.map +0 -1
- package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js +0 -1
- package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js.map +0 -1
- package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js +0 -6
- package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js.map +0 -1
- package/bizar-dash/dist/assets/ObsidianView-C-AvHfpT.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js +0 -1
- package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js.map +0 -1
- package/bizar-dash/dist/assets/SchedulesView-8qxH3bg7.js +0 -1
- package/bizar-dash/dist/assets/SchedulesView-8qxH3bg7.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsView-UD403neY.js.map +0 -1
- package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js +0 -6
- package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js.map +0 -1
- package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js +0 -1
- package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js.map +0 -1
- package/bizar-dash/dist/assets/main-BZMmD6a8.js +0 -249
- package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +0 -1
- package/bizar-dash/dist/assets/main-DDAMz_H5.css +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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvVarsView-CNO03NDJ.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-up.js","../../src/web/v8/views/EnvVars/EnvVarsView.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 FileUp = createLucideIcon(\"FileUp\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M12 12v6\", key: \"3ahymv\" }],\n [\"path\", { d: \"m15 15-3-3-3 3\", key: \"15xj92\" }]\n]);\n\nexport { FileUp as default };\n//# sourceMappingURL=file-up.js.map\n","/**\n * v8/views/EnvVars/EnvVarsView.tsx — Sprint S41, v9.3.0.\n *\n * List of env vars (masked values) with: per-row edit (Sheet),\n * per-row delete (inline confirm), Add Sheet, Bulk Import Sheet,\n * and Export trigger. Backed by /api/env-vars + /api/env-vars/grouped\n * + /api/env-vars/export + /api/env-vars/bulk-import.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Download, FileUp, FlaskConical, Pencil, Plus, RefreshCcw, Trash2, Variable } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface EnvRow {\n name: string;\n value: string;\n createdAt?: string;\n source?: string;\n}\n\nexport function EnvVarsView(): JSX.Element {\n const payload = useFetch<EnvRow[]>('/api/env-vars');\n const [adding, setAdding] = useState<boolean>(false);\n const [editing, setEditing] = useState<string | null>(null);\n const [bulkImporting, setBulkImporting] = useState<boolean>(false);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [testing, setTesting] = useState<string | null>(null);\n const [testResult, setTestResult] = useState<{ name: string; ok: boolean; message: string } | null>(null);\n\n const rows = useMemo<EnvRow[]>(() => payload.data ?? [], [payload.data]);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const runTest = async (name: string): Promise<void> => {\n setTesting(name);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; status?: string; message?: string }>(`/api/env-vars/${encodeURIComponent(name)}/test`, { method: 'POST' });\n setTestResult({ name, ok: res.ok !== false, message: res.message ?? (res.ok !== false ? 'OK' : 'Failed') });\n } catch (err) {\n const msg = err instanceof FetchError ? err.message : (err as Error).message;\n setTestResult({ name, ok: false, message: msg });\n } finally {\n setTesting(null);\n }\n };\n\n const drop = async (name: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/env-vars/${name}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"env-vars-view\">\n <ViewHeader\n title=\"Env vars\"\n description=\"Runtime environment variables for the dashboard. Stored in ~/.config/bizar/env.json (mode 0600).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"env-vars-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => { window.open('/api/env-vars/export', '_blank'); }} data-testid=\"env-vars-export\">\n <Download size={14} aria-hidden /> Export\n </Button>\n <Button variant=\"ghost\" onClick={() => setBulkImporting(true)} data-testid=\"env-vars-bulk-import\">\n <FileUp size={14} aria-hidden /> Bulk import\n </Button>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"env-vars-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"env-vars-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Variables\" count={rows.length} testid=\"env-vars-list-header\" />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && rows.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : rows.length === 0 ? (\n <EmptyState\n icon={<Variable size={28} aria-hidden />}\n title=\"No env vars\"\n description=\"Add one or bulk-import a .env file.\"\n />\n ) : (\n <Stack gap={1}>\n {rows.map((r) => {\n const isConfirming = confirmDelete === r.name;\n return (\n <div\n key={r.name}\n data-testid={`env-var-row-${r.name}`}\n style={{\n padding: 'var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <code style={{ fontSize: 'var(--fs-12)' }}>{r.name}</code>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.value}</code>\n {r.source && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n source: {r.source} {r.createdAt ? `· ${r.createdAt}` : ''}\n </span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => void runTest(r.name)}\n disabled={testing === r.name}\n data-testid={`env-var-test-${r.name}`}\n aria-label={`Test ${r.name}`}\n >\n <FlaskConical size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => setEditing(r.name)} data-testid={`env-var-edit-${r.name}`} aria-label={`Edit ${r.name}`}>\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => (cur === r.name ? null : r.name))}\n data-testid={`env-var-delete-${r.name}`}\n aria-label={`Delete ${r.name}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(r.name)} data-testid={`env-var-confirm-delete-${r.name}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)} data-testid={`env-var-cancel-delete-${r.name}`}>\n Cancel\n </Button>\n </Inline>\n )}\n {testResult !== null && testResult.name === r.name && (\n <div\n data-testid={`env-var-test-result-${r.name}`}\n style={{\n marginTop: 'var(--space-1)',\n fontSize: 'var(--fs-11)',\n color: testResult.ok ? 'var(--success)' : 'var(--danger)',\n fontFamily: 'var(--font-mono)',\n }}\n >\n test: {testResult.message}\n </div>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add env var\" description=\"Must match /^BIZAR_[A-Z0-9_]+$/.\">\n <AddEditForm\n mode=\"add\"\n onSubmit={async (name, value) => {\n await fetchJson('/api/env-vars', { method: 'POST', body: { name, value } });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={editing !== null} onOpenChange={(open) => { if (!open) setEditing(null); }}>\n <SheetContent side=\"right\" title=\"Edit env var\" description={editing ?? ''}>\n {editing !== null && (\n <AddEditForm\n mode=\"edit\"\n initialName={editing}\n onSubmit={async (name, value) => {\n await fetchJson(`/api/env-vars/${name}`, { method: 'PUT', body: { value } });\n setEditing(null);\n refresh();\n }}\n onCancel={() => setEditing(null)}\n />\n )}\n </SheetContent>\n </Sheet>\n\n <Sheet open={bulkImporting} onOpenChange={setBulkImporting}>\n <SheetContent side=\"right\" title=\"Bulk import\" description=\"Paste KEY=value lines (one per line, # comments ignored).\">\n <BulkImportForm\n onSubmit={async (envContent) => {\n await fetchJson('/api/env-vars/bulk-import', {\n method: 'POST',\n body: { envContent },\n });\n setBulkImporting(false);\n refresh();\n }}\n onCancel={() => setBulkImporting(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddEditForm({\n mode,\n initialName,\n onSubmit,\n onCancel,\n}: {\n mode: 'add' | 'edit';\n initialName?: string;\n onSubmit: (name: string, value: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [name, setName] = useState<string>(initialName ?? '');\n const [value, setValue] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!name.trim() || !value || busy) return;\n setBusy(true);\n setError(null);\n try {\n await onSubmit(name.trim(), value);\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 <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</span>\n <Input\n value={name}\n readOnly={mode === 'edit'}\n data-testid=\"env-var-form-name\"\n onChange={(e) => setName((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Value</span>\n <Input\n type=\"password\"\n value={value}\n data-testid=\"env-var-form-value\"\n onChange={(e) => setValue((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"env-var-form-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !name.trim() || !value}\n data-testid=\"env-var-form-submit\"\n >\n {mode === 'add' ? 'Add' : 'Save'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction BulkImportForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (envContent: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [content, setContent] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <textarea\n value={content}\n placeholder={'BIZAR_FOO=bar\\nBIZAR_BAZ=qux\\n# comment'}\n rows={12}\n data-testid=\"env-vars-bulk-input\"\n onChange={(e) => setContent((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n resize: 'vertical',\n }}\n />\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try { await onSubmit(content); }\n catch (err) { setError(err instanceof FetchError ? err.message : (err as Error).message); }\n finally { setBusy(false); }\n }}\n disabled={busy || content.trim() === ''}\n data-testid=\"env-vars-bulk-submit\"\n >\n {busy ? 'Importing…' : 'Import'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["FileUp","createLucideIcon","EnvVarsView","payload","useFetch","adding","setAdding","useState","editing","setEditing","bulkImporting","setBulkImporting","confirmDelete","setConfirmDelete","error","setError","testing","setTesting","testResult","setTestResult","rows","useMemo","refresh","useCallback","runTest","name","res","fetchJson","err","msg","FetchError","drop","jsxs","Stack","jsx","ViewHeader","Inline","Button","Download","RefreshCcw","Plus","ListHeader","Card","CardBody","Skeleton","EmptyState","Variable","r","isConfirming","FlaskConical","Pencil","cur","Trash2","Sheet","SheetContent","AddEditForm","value","open","BulkImportForm","envContent","mode","initialName","onSubmit","onCancel","setName","setValue","busy","setBusy","submit","Input","e","SheetClose","content","setContent"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"EnvVarsView-BhcIuJ6V.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-up.js","../../src/web/v8/views/EnvVars/EnvVarsView.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 FileUp = createLucideIcon(\"FileUp\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M12 12v6\", key: \"3ahymv\" }],\n [\"path\", { d: \"m15 15-3-3-3 3\", key: \"15xj92\" }]\n]);\n\nexport { FileUp as default };\n//# sourceMappingURL=file-up.js.map\n","/**\n * v8/views/EnvVars/EnvVarsView.tsx — Sprint S41, v9.3.0.\n *\n * List of env vars (masked values) with: per-row edit (Sheet),\n * per-row delete (inline confirm), Add Sheet, Bulk Import Sheet,\n * and Export trigger. Backed by /api/env-vars + /api/env-vars/grouped\n * + /api/env-vars/export + /api/env-vars/bulk-import.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Download, FileUp, FlaskConical, Pencil, Plus, RefreshCcw, Trash2, Variable } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface EnvRow {\n name: string;\n value: string;\n createdAt?: string;\n source?: string;\n}\n\nexport function EnvVarsView(): JSX.Element {\n const payload = useFetch<EnvRow[]>('/api/env-vars');\n const [adding, setAdding] = useState<boolean>(false);\n const [editing, setEditing] = useState<string | null>(null);\n const [bulkImporting, setBulkImporting] = useState<boolean>(false);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [testing, setTesting] = useState<string | null>(null);\n const [testResult, setTestResult] = useState<{ name: string; ok: boolean; message: string } | null>(null);\n\n const rows = useMemo<EnvRow[]>(() => payload.data ?? [], [payload.data]);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const runTest = async (name: string): Promise<void> => {\n setTesting(name);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; status?: string; message?: string }>(`/api/env-vars/${encodeURIComponent(name)}/test`, { method: 'POST' });\n setTestResult({ name, ok: res.ok !== false, message: res.message ?? (res.ok !== false ? 'OK' : 'Failed') });\n } catch (err) {\n const msg = err instanceof FetchError ? err.message : (err as Error).message;\n setTestResult({ name, ok: false, message: msg });\n } finally {\n setTesting(null);\n }\n };\n\n const drop = async (name: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/env-vars/${name}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"env-vars-view\">\n <ViewHeader\n title=\"Env vars\"\n description=\"Runtime environment variables for the dashboard. Stored in ~/.config/bizar/env.json (mode 0600).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"env-vars-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => { window.open('/api/env-vars/export', '_blank'); }} data-testid=\"env-vars-export\">\n <Download size={14} aria-hidden /> Export\n </Button>\n <Button variant=\"ghost\" onClick={() => setBulkImporting(true)} data-testid=\"env-vars-bulk-import\">\n <FileUp size={14} aria-hidden /> Bulk import\n </Button>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"env-vars-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"env-vars-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Variables\" count={rows.length} testid=\"env-vars-list-header\" />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && rows.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : rows.length === 0 ? (\n <EmptyState\n icon={<Variable size={28} aria-hidden />}\n title=\"No env vars\"\n description=\"Add one or bulk-import a .env file.\"\n />\n ) : (\n <Stack gap={1}>\n {rows.map((r) => {\n const isConfirming = confirmDelete === r.name;\n return (\n <div\n key={r.name}\n data-testid={`env-var-row-${r.name}`}\n style={{\n padding: 'var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <code style={{ fontSize: 'var(--fs-12)' }}>{r.name}</code>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.value}</code>\n {r.source && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n source: {r.source} {r.createdAt ? `· ${r.createdAt}` : ''}\n </span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => void runTest(r.name)}\n disabled={testing === r.name}\n data-testid={`env-var-test-${r.name}`}\n aria-label={`Test ${r.name}`}\n >\n <FlaskConical size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => setEditing(r.name)} data-testid={`env-var-edit-${r.name}`} aria-label={`Edit ${r.name}`}>\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => (cur === r.name ? null : r.name))}\n data-testid={`env-var-delete-${r.name}`}\n aria-label={`Delete ${r.name}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(r.name)} data-testid={`env-var-confirm-delete-${r.name}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)} data-testid={`env-var-cancel-delete-${r.name}`}>\n Cancel\n </Button>\n </Inline>\n )}\n {testResult !== null && testResult.name === r.name && (\n <div\n data-testid={`env-var-test-result-${r.name}`}\n style={{\n marginTop: 'var(--space-1)',\n fontSize: 'var(--fs-11)',\n color: testResult.ok ? 'var(--success)' : 'var(--danger)',\n fontFamily: 'var(--font-mono)',\n }}\n >\n test: {testResult.message}\n </div>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add env var\" description=\"Must match /^BIZAR_[A-Z0-9_]+$/.\">\n <AddEditForm\n mode=\"add\"\n onSubmit={async (name, value) => {\n await fetchJson('/api/env-vars', { method: 'POST', body: { name, value } });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={editing !== null} onOpenChange={(open) => { if (!open) setEditing(null); }}>\n <SheetContent side=\"right\" title=\"Edit env var\" description={editing ?? ''}>\n {editing !== null && (\n <AddEditForm\n mode=\"edit\"\n initialName={editing}\n onSubmit={async (name, value) => {\n await fetchJson(`/api/env-vars/${name}`, { method: 'PUT', body: { value } });\n setEditing(null);\n refresh();\n }}\n onCancel={() => setEditing(null)}\n />\n )}\n </SheetContent>\n </Sheet>\n\n <Sheet open={bulkImporting} onOpenChange={setBulkImporting}>\n <SheetContent side=\"right\" title=\"Bulk import\" description=\"Paste KEY=value lines (one per line, # comments ignored).\">\n <BulkImportForm\n onSubmit={async (envContent) => {\n await fetchJson('/api/env-vars/bulk-import', {\n method: 'POST',\n body: { envContent },\n });\n setBulkImporting(false);\n refresh();\n }}\n onCancel={() => setBulkImporting(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddEditForm({\n mode,\n initialName,\n onSubmit,\n onCancel,\n}: {\n mode: 'add' | 'edit';\n initialName?: string;\n onSubmit: (name: string, value: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [name, setName] = useState<string>(initialName ?? '');\n const [value, setValue] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!name.trim() || !value || busy) return;\n setBusy(true);\n setError(null);\n try {\n await onSubmit(name.trim(), value);\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 <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</span>\n <Input\n value={name}\n readOnly={mode === 'edit'}\n data-testid=\"env-var-form-name\"\n onChange={(e) => setName((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Value</span>\n <Input\n type=\"password\"\n value={value}\n data-testid=\"env-var-form-value\"\n onChange={(e) => setValue((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"env-var-form-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !name.trim() || !value}\n data-testid=\"env-var-form-submit\"\n >\n {mode === 'add' ? 'Add' : 'Save'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction BulkImportForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (envContent: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [content, setContent] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <textarea\n value={content}\n placeholder={'BIZAR_FOO=bar\\nBIZAR_BAZ=qux\\n# comment'}\n rows={12}\n data-testid=\"env-vars-bulk-input\"\n onChange={(e) => setContent((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n resize: 'vertical',\n }}\n />\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try { await onSubmit(content); }\n catch (err) { setError(err instanceof FetchError ? err.message : (err as Error).message); }\n finally { setBusy(false); }\n }}\n disabled={busy || content.trim() === ''}\n data-testid=\"env-vars-bulk-submit\"\n >\n {busy ? 'Importing…' : 'Import'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["FileUp","createLucideIcon","EnvVarsView","payload","useFetch","adding","setAdding","useState","editing","setEditing","bulkImporting","setBulkImporting","confirmDelete","setConfirmDelete","error","setError","testing","setTesting","testResult","setTestResult","rows","useMemo","refresh","useCallback","runTest","name","res","fetchJson","err","msg","FetchError","drop","jsxs","Stack","jsx","ViewHeader","Inline","Button","Download","RefreshCcw","Plus","ListHeader","Card","CardBody","Skeleton","EmptyState","Variable","r","isConfirming","FlaskConical","Pencil","cur","Trash2","Sheet","SheetContent","AddEditForm","value","open","BulkImportForm","envContent","mode","initialName","onSubmit","onCancel","setName","setValue","busy","setBusy","submit","Input","e","SheetClose","content","setContent"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as h,j as e}from"./cmdk-C3F6LD6N.js";import{A as y}from"./Alert-
|
|
1
|
+
import{r as h,j as e}from"./cmdk-C3F6LD6N.js";import{A as y}from"./Alert-pzFISNtS.js";import{B as f}from"./main-BRmJZcHt.js";import{C as j}from"./circle-alert-QQTU4Quz.js";import{R as v}from"./refresh-ccw-DN_zCB1h.js";function u(t){return t==null?"":typeof t=="string"?t:t.message}const b=h.forwardRef(function(m,n){const{title:o="Something went wrong",description:s,error:x,onRetry:r,retryLabel:a="Retry",block:p=!1,silent:g=!1,testid:d,className:l,...c}=m,i=g?"":u(x);return p?e.jsxs("div",{ref:n,"data-testid":d??"error-state",className:l,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[e.jsx("div",{style:{color:"var(--danger)",display:"inline-flex"},children:e.jsx(j,{size:28,"aria-hidden":!0})}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:o}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==""&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i}),r!==void 0&&e.jsxs(f,{variant:"primary",onClick:r,"data-testid":"error-state-retry",children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]})]}):e.jsx("div",{ref:n,"data-testid":d??"error-state",className:l,...c,children:e.jsxs(y,{tone:"danger",title:o,action:r!==void 0?e.jsxs(f,{variant:"ghost",onClick:r,"data-testid":"error-state-retry","aria-label":a,children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]}):void 0,children:[s,i!==""&&e.jsx("div",{style:{marginTop:"var(--space-1)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:i})]})})});export{b as E};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorState-
|
|
1
|
+
{"version":3,"file":"ErrorState-BSqf65ka.js","sources":["../../src/web/v8/ui/feedback/ErrorState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { AlertCircle, RefreshCcw } from 'lucide-react';\nimport { Alert } from './Alert.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * ErrorState — surfaced error with optional retry CTA.\n *\n * Use when a view's primary fetch failed and we want to recover,\n * not when the fetch succeeded with zero rows (use EmptyState).\n *\n * Two layout modes:\n * - inline (default): Alert-tone=danger banner with optional retry button\n * - block: centered icon + title + description + retry (mirrors EmptyState)\n *\n * `error` is the raw error (Error | string | null). When non-null,\n * the message is rendered below the title. Use the `silent` flag to\n * omit the message (e.g. when the parent already shows it).\n */\nexport interface ErrorStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: ReactNode;\n description?: ReactNode;\n error?: Error | string | null;\n onRetry?: () => void;\n retryLabel?: string;\n /** Use the centered block layout instead of the inline Alert. */\n block?: boolean;\n /** Hide the error message (parent surfaces it elsewhere). */\n silent?: boolean;\n testid?: string;\n}\n\nfunction errMessage(error: Error | string | null | undefined): string {\n if (error === null || error === undefined) return '';\n return typeof error === 'string' ? error : error.message;\n}\n\nexport const ErrorState = forwardRef<HTMLDivElement, ErrorStateProps>(function ErrorState(\n props,\n ref,\n) {\n const {\n title = 'Something went wrong',\n description,\n error,\n onRetry,\n retryLabel = 'Retry',\n block = false,\n silent = false,\n testid,\n className,\n ...rest\n } = props;\n\n const message = silent ? '' : errMessage(error);\n\n if (block) {\n return (\n <div\n ref={ref}\n data-testid={testid ?? 'error-state'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n <div style={{ color: 'var(--danger)', display: 'inline-flex' }}>\n <AlertCircle size={28} aria-hidden />\n </div>\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {message !== '' && (\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{message}</code>\n )}\n {onRetry !== undefined && (\n <Button variant=\"primary\" onClick={onRetry} data-testid=\"error-state-retry\">\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <div ref={ref} data-testid={testid ?? 'error-state'} className={className} {...rest}>\n <Alert\n tone=\"danger\"\n title={title}\n action={\n onRetry !== undefined ? (\n <Button variant=\"ghost\" onClick={onRetry} data-testid=\"error-state-retry\" aria-label={retryLabel}>\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n ) : undefined\n }\n >\n {description}\n {message !== '' && (\n <div style={{ marginTop: 'var(--space-1)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {message}\n </div>\n )}\n </Alert>\n </div>\n );\n});"],"names":["errMessage","error","ErrorState","forwardRef","props","ref","title","description","onRetry","retryLabel","block","silent","testid","className","rest","message","jsxs","jsx","AlertCircle","Button","RefreshCcw","Alert"],"mappings":"0NAgCA,SAASA,EAAWC,EAAkD,CACpE,OAAIA,GAAU,KAAoC,GAC3C,OAAOA,GAAU,SAAWA,EAAQA,EAAM,OACnD,CAEO,MAAMC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CACJ,MAAAC,EAAQ,uBACR,YAAAC,EACA,MAAAN,EACA,QAAAO,EACA,WAAAC,EAAa,QACb,MAAAC,EAAQ,GACR,OAAAC,EAAS,GACT,OAAAC,EACA,UAAAC,EACA,GAAGC,CAAA,EACDV,EAEEW,EAAUJ,EAAS,GAAKX,EAAWC,CAAK,EAE9C,OAAIS,EAEAM,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,cAAaO,GAAU,cACvB,UAAAC,EACA,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEJ,SAAA,CAAAG,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,gBAAiB,QAAS,aAAA,EAC7C,SAAAA,EAAAA,IAACC,EAAA,CAAY,KAAM,GAAI,cAAW,GAAC,EACrC,EACAD,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAX,CAAA,CAAM,EACrFC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAV,CAAA,CAAY,EAEvEQ,IAAY,IACXE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAF,CAAA,CAAQ,EAEhFP,IAAY,QACXQ,OAACG,EAAA,CAAO,QAAQ,UAAU,QAASX,EAAS,cAAY,oBACtD,SAAA,CAAAS,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,CAAA,CAAA,CAAA,EAONQ,MAAC,OAAI,IAAAZ,EAAU,cAAaO,GAAU,cAAe,UAAAC,EAAuB,GAAGC,EAC7E,SAAAE,EAAAA,KAACK,EAAA,CACC,KAAK,SACL,MAAAf,EACA,OACEE,IAAY,OACVQ,EAAAA,KAACG,EAAA,CAAO,QAAQ,QAAQ,QAASX,EAAS,cAAY,oBAAoB,aAAYC,EACpF,SAAA,CAAAQ,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,EACE,OAGL,SAAA,CAAAF,EACAQ,IAAY,IACXE,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAW,iBAAkB,WAAY,mBAAoB,SAAU,cAAA,EAClF,SAAAF,CAAA,CACH,CAAA,CAAA,CAAA,EAGN,CAEJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as P,S as i,I as s,B as d,K as q,h as T,O as I,b as f,i as j,F as y}from"./main-BRmJZcHt.js";import{V as M}from"./ViewHeader-BsnaspKw.js";import{C as R,b as $}from"./Card-Clkvh43Q.js";import{E as N}from"./EmptyState-ccT__JZG.js";import{P as O}from"./play-blqh0msT.js";import{R as V}from"./refresh-cw-KGm5eQgv.js";import{C as H}from"./calendar-CAZoDd-l.js";import{P as J}from"./plus-Cps-8lcG.js";import{T as K}from"./trash-2-B_Y6HrfN.js";function U(t){return t==="done"?"success":t==="failed"?"danger":t==="running"?"info":t==="queued"?"warning":"neutral"}function W(t){return!t||t<=0?"—":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${Math.floor(t/6e4)}m ${Math.round(t%6e4/1e3)}s`}function ne(){var E,F;const t=P("/api/eval/runs?limit=20"),g=P("/api/eval/schedules"),[o,b]=r.useState(!1),[v,A]=r.useState("default"),[C,l]=r.useState(null),[z,m]=r.useState(!1),[n,c]=r.useState({name:"",cron:"",suitePath:"default"}),[w,k]=r.useState(!1);r.useEffect(()=>{var a;if((a=t.data)!=null&&a.runs&&t.data.runs.some(h=>h.status==="running"||h.status==="queued")){const h=setTimeout(()=>{t.refetch()},5e3);return()=>clearTimeout(h)}},[t]);const L=async()=>{b(!0),l(null);try{await j("/api/eval/run",{method:"POST",body:{suite:v}}),t.refetch()}catch(a){l((a instanceof y,a.message))}finally{b(!1)}},p=((E=t.data)==null?void 0:E.runs)??[],B=async()=>{if(!(!n.name.trim()||!n.cron.trim())){k(!0),l(null);try{await j("/api/eval/schedules",{method:"POST",body:n}),m(!1),c({name:"",cron:"",suitePath:"default"}),g.refetch()}catch(a){l((a instanceof y,a.message))}finally{k(!1)}}},D=async a=>{l(null);try{await j(`/api/eval/schedules/${encodeURIComponent(a)}`,{method:"DELETE"}),g.refetch()}catch(u){l((u instanceof y,u.message))}},x=((F=g.data)==null?void 0:F.schedules)??[];return e.jsxs(i,{gap:5,"data-testid":"eval-view",children:[e.jsx(M,{title:"Eval framework",description:"Run evaluation suites against the agent model. Suites live under fixtures/.",actions:e.jsxs(s,{gap:2,align:"center",children:[C!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:C}),e.jsx("input",{value:v,onChange:a=>A(a.target.value),placeholder:"suite name",disabled:o,"data-testid":"eval-suite-input",style:{padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontSize:"var(--fs-13)",fontFamily:"var(--font-mono)"}}),e.jsxs(d,{variant:"primary",onClick:()=>void L(),disabled:o||!v.trim(),"data-testid":"eval-launch",children:[o?e.jsx(q,{size:14,className:"animate-spin","aria-hidden":!0}):e.jsx(O,{size:14,"aria-hidden":!0}),o?"Launching…":"Run suite"]}),e.jsxs(d,{variant:"ghost",onClick:()=>void t.refetch(),"data-testid":"eval-refresh",children:[e.jsx(V,{size:14,"aria-hidden":!0})," Refresh"]})]})}),t.loading&&p.length===0?e.jsxs(i,{gap:2,children:[e.jsx(T,{style:{height:80}}),e.jsx(T,{style:{height:80}})]}):p.length===0?e.jsx(N,{icon:e.jsx(I,{size:32,"aria-hidden":!0}),title:"No eval runs yet",description:"Launch a suite to begin measuring agent quality."}):e.jsx(i,{gap:2,children:p.map(a=>e.jsx(R,{variant:"default",children:e.jsx($,{children:e.jsxs(s,{align:"center",justify:"between",gap:3,children:[e.jsxs(i,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:a.id}),e.jsx(f,{tone:U(a.status),children:a.status??"unknown"}),a.suite&&e.jsx(f,{tone:"neutral",children:a.suite})]}),e.jsxs(s,{align:"center",gap:3,style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:[e.jsx("span",{children:a.startedAt?new Date(a.startedAt).toLocaleString():""}),e.jsx("span",{children:W(a.durationMs)})]})]}),e.jsxs(i,{align:"end",gap:0,children:[e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-14)"},children:[e.jsx("strong",{style:{color:"var(--success)"},children:a.passed??0})," pass"," / ",e.jsx("strong",{style:{color:"var(--danger)"},children:a.failed??0})," fail"]}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[a.total??0," total"]})]})]})})},a.id))}),e.jsx(R,{variant:"elevated",children:e.jsxs($,{children:[e.jsxs(s,{align:"center",justify:"between",gap:2,children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx(H,{size:16,"aria-hidden":!0}),e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:"Schedules"}),e.jsx(f,{tone:"neutral",children:x.length})]}),!z&&e.jsxs(d,{variant:"primary",onClick:()=>m(!0),"data-testid":"eval-schedule-add",children:[e.jsx(J,{size:14,"aria-hidden":!0})," Add schedule"]})]}),z&&e.jsxs(i,{gap:2,style:{marginTop:"var(--space-3)"},"data-testid":"eval-schedule-form",children:[e.jsxs(s,{gap:2,align:"center",children:[e.jsx("input",{value:n.name,onChange:a=>c({...n,name:a.target.value}),placeholder:"name","data-testid":"eval-schedule-form-name",style:S}),e.jsx("input",{value:n.cron,onChange:a=>c({...n,cron:a.target.value}),placeholder:"cron (e.g. 0 9 * * *)","data-testid":"eval-schedule-form-cron",style:S}),e.jsx("input",{value:n.suitePath,onChange:a=>c({...n,suitePath:a.target.value}),placeholder:"suite path","data-testid":"eval-schedule-form-suite",style:S})]}),e.jsxs(s,{gap:2,children:[e.jsx(d,{variant:"primary",onClick:()=>void B(),disabled:w,"data-testid":"eval-schedule-form-submit",children:w?"Saving…":"Save"}),e.jsx(d,{variant:"ghost",onClick:()=>m(!1),"data-testid":"eval-schedule-form-cancel",children:"Cancel"})]})]}),x.length===0?e.jsx("div",{style:{marginTop:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"No schedules yet. Add one to run suites on a cron."}):e.jsx(i,{gap:2,style:{marginTop:"var(--space-3)"},children:x.map(a=>e.jsxs(s,{align:"center",justify:"between",gap:2,"data-testid":`eval-schedule-row-${a.id}`,children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:a.name}),e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.cron}),a.suitePath&&e.jsx(f,{tone:"neutral",children:a.suitePath})]}),e.jsx(d,{variant:"ghost",onClick:()=>void D(a.id),"data-testid":`eval-schedule-delete-${a.id}`,"aria-label":`Delete schedule ${a.name}`,children:e.jsx(K,{size:14,"aria-hidden":!0})})]},a.id))})]})})]})}const S={padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontSize:"var(--fs-13)",fontFamily:"var(--font-mono)"};export{ne as EvalView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvalView-lgUhlGJh.js","sources":["../../src/web/v8/views/Eval/EvalView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Calendar, FlaskConical, Play, Plus, RefreshCw, Trash2, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * EvalView — Sprint S35. Eval runs list + launch new suite.\n */\n\ntype Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\ninterface EvalRun {\n id: string;\n suite?: string;\n status?: 'queued' | 'running' | 'done' | 'failed';\n passed?: number;\n failed?: number;\n total?: number;\n startedAt?: string;\n durationMs?: number;\n}\n\ninterface EvalSchedule {\n id: string;\n name: string;\n cron: string;\n suitePath?: string;\n enabled?: boolean;\n}\n\nfunction statusTone(s: EvalRun['status'] | undefined): Tone {\n if (s === 'done') return 'success';\n if (s === 'failed') return 'danger';\n if (s === 'running') return 'info';\n if (s === 'queued') return 'warning';\n return 'neutral';\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n if (!ms || ms <= 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nexport function EvalView(): JSX.Element {\n const runs = useFetch<{ runs: EvalRun[] }>('/api/eval/runs?limit=20');\n const schedules = useFetch<{ schedules: EvalSchedule[] }>('/api/eval/schedules');\n const [launching, setLaunching] = useState(false);\n const [suite, setSuite] = useState('default');\n const [error, setError] = useState<string | null>(null);\n const [addingSchedule, setAddingSchedule] = useState(false);\n const [scheduleForm, setScheduleForm] = useState({ name: '', cron: '', suitePath: 'default' });\n const [busySchedule, setBusySchedule] = useState(false);\n\n useEffect(() => {\n if (runs.data?.runs) {\n const hasActive = runs.data.runs.some((r) => r.status === 'running' || r.status === 'queued');\n if (hasActive) {\n const id = setTimeout(() => { void runs.refetch(); }, 5_000);\n return () => clearTimeout(id);\n }\n }\n }, [runs]);\n\n const launch = async (): Promise<void> => {\n setLaunching(true);\n setError(null);\n try {\n await fetchJson('/api/eval/run', { method: 'POST', body: { suite } });\n void runs.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setLaunching(false);\n }\n };\n\n const list = runs.data?.runs ?? [];\n\n const addSchedule = async (): Promise<void> => {\n if (!scheduleForm.name.trim() || !scheduleForm.cron.trim()) return;\n setBusySchedule(true);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean }>('/api/eval/schedules', { method: 'POST', body: scheduleForm });\n setAddingSchedule(false);\n setScheduleForm({ name: '', cron: '', suitePath: 'default' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusySchedule(false);\n }\n };\n\n const deleteSchedule = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/eval/schedules/${encodeURIComponent(id)}`, { method: 'DELETE' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const scheduleList = schedules.data?.schedules ?? [];\n\n return (\n <Stack gap={5} data-testid=\"eval-view\">\n <ViewHeader\n title=\"Eval framework\"\n description=\"Run evaluation suites against the agent model. Suites live under fixtures/.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <input\n value={suite}\n onChange={(e) => setSuite(e.target.value)}\n placeholder=\"suite name\"\n disabled={launching}\n data-testid=\"eval-suite-input\"\n style={{\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n }}\n />\n <Button variant=\"primary\" onClick={() => void launch()} disabled={launching || !suite.trim()} data-testid=\"eval-launch\">\n {launching ? <Loader2 size={14} className=\"animate-spin\" aria-hidden /> : <Play size={14} aria-hidden />}\n {launching ? 'Launching…' : 'Run suite'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void runs.refetch()} data-testid=\"eval-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n {runs.loading && list.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 80 }} />\n <Skeleton style={{ height: 80 }} />\n </Stack>\n ) : list.length === 0 ? (\n <EmptyState\n icon={<FlaskConical size={32} aria-hidden />}\n title=\"No eval runs yet\"\n description=\"Launch a suite to begin measuring agent quality.\"\n />\n ) : (\n <Stack gap={2}>\n {list.map((r) => (\n <Card key={r.id} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{r.id}</strong>\n <Badge tone={statusTone(r.status)}>{r.status ?? 'unknown'}</Badge>\n {r.suite && <Badge tone=\"neutral\">{r.suite}</Badge>}\n </Inline>\n <Inline align=\"center\" gap={3} style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n <span>{r.startedAt ? new Date(r.startedAt).toLocaleString() : ''}</span>\n <span>{fmtDuration(r.durationMs)}</span>\n </Inline>\n </Stack>\n <Stack align=\"end\" gap={0}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-14)' }}>\n <strong style={{ color: 'var(--success)' }}>{r.passed ?? 0}</strong> pass\n {' / '}\n <strong style={{ color: 'var(--danger)' }}>{r.failed ?? 0}</strong> fail\n </span>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{(r.total ?? 0)} total</span>\n </Stack>\n </Inline>\n </CardBody>\n </Card>\n ))}\n </Stack>\n )}\n\n <Card variant=\"elevated\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Calendar size={16} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-14)' }}>Schedules</strong>\n <Badge tone=\"neutral\">{scheduleList.length}</Badge>\n </Inline>\n {!addingSchedule && (\n <Button variant=\"primary\" onClick={() => setAddingSchedule(true)} data-testid=\"eval-schedule-add\">\n <Plus size={14} aria-hidden /> Add schedule\n </Button>\n )}\n </Inline>\n\n {addingSchedule && (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }} data-testid=\"eval-schedule-form\">\n <Inline gap={2} align=\"center\">\n <input\n value={scheduleForm.name}\n onChange={(e) => setScheduleForm({ ...scheduleForm, name: e.target.value })}\n placeholder=\"name\"\n data-testid=\"eval-schedule-form-name\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.cron}\n onChange={(e) => setScheduleForm({ ...scheduleForm, cron: e.target.value })}\n placeholder=\"cron (e.g. 0 9 * * *)\"\n data-testid=\"eval-schedule-form-cron\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.suitePath}\n onChange={(e) => setScheduleForm({ ...scheduleForm, suitePath: e.target.value })}\n placeholder=\"suite path\"\n data-testid=\"eval-schedule-form-suite\"\n style={inputStyle}\n />\n </Inline>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => void addSchedule()} disabled={busySchedule} data-testid=\"eval-schedule-form-submit\">\n {busySchedule ? 'Saving…' : 'Save'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setAddingSchedule(false)} data-testid=\"eval-schedule-form-cancel\">Cancel</Button>\n </Inline>\n </Stack>\n )}\n\n {scheduleList.length === 0 ? (\n <div style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No schedules yet. Add one to run suites on a cron.\n </div>\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }}>\n {scheduleList.map((s) => (\n <Inline key={s.id} align=\"center\" justify=\"between\" gap={2} data-testid={`eval-schedule-row-${s.id}`}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{s.name}</strong>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.cron}</code>\n {s.suitePath && <Badge tone=\"neutral\">{s.suitePath}</Badge>}\n </Inline>\n <Button variant=\"ghost\" onClick={() => void deleteSchedule(s.id)} data-testid={`eval-schedule-delete-${s.id}`} aria-label={`Delete schedule ${s.name}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nconst inputStyle = {\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n} as const;"],"names":["statusTone","s","fmtDuration","ms","EvalView","runs","useFetch","schedules","launching","setLaunching","useState","suite","setSuite","error","setError","addingSchedule","setAddingSchedule","scheduleForm","setScheduleForm","busySchedule","setBusySchedule","useEffect","_a","r","id","launch","fetchJson","err","FetchError","list","addSchedule","deleteSchedule","scheduleList","_b","jsxs","Stack","jsx","ViewHeader","Inline","e","Button","Loader2","Play","RefreshCw","Skeleton","EmptyState","FlaskConical","Card","CardBody","Badge","Calendar","Plus","inputStyle","Trash2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EvalView-2cbWVBUA.js","sources":["../../src/web/v8/views/Eval/EvalView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Calendar, FlaskConical, Play, Plus, RefreshCw, Trash2, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * EvalView — Sprint S35. Eval runs list + launch new suite.\n */\n\ntype Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\ninterface EvalRun {\n id: string;\n suite?: string;\n status?: 'queued' | 'running' | 'done' | 'failed';\n passed?: number;\n failed?: number;\n total?: number;\n startedAt?: string;\n durationMs?: number;\n}\n\ninterface EvalSchedule {\n id: string;\n name: string;\n cron: string;\n suitePath?: string;\n enabled?: boolean;\n}\n\nfunction statusTone(s: EvalRun['status'] | undefined): Tone {\n if (s === 'done') return 'success';\n if (s === 'failed') return 'danger';\n if (s === 'running') return 'info';\n if (s === 'queued') return 'warning';\n return 'neutral';\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n if (!ms || ms <= 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nexport function EvalView(): JSX.Element {\n const runs = useFetch<{ runs: EvalRun[] }>('/api/eval/runs?limit=20');\n const schedules = useFetch<{ schedules: EvalSchedule[] }>('/api/eval/schedules');\n const [launching, setLaunching] = useState(false);\n const [suite, setSuite] = useState('default');\n const [error, setError] = useState<string | null>(null);\n const [addingSchedule, setAddingSchedule] = useState(false);\n const [scheduleForm, setScheduleForm] = useState({ name: '', cron: '', suitePath: 'default' });\n const [busySchedule, setBusySchedule] = useState(false);\n\n useEffect(() => {\n if (runs.data?.runs) {\n const hasActive = runs.data.runs.some((r) => r.status === 'running' || r.status === 'queued');\n if (hasActive) {\n const id = setTimeout(() => { void runs.refetch(); }, 5_000);\n return () => clearTimeout(id);\n }\n }\n }, [runs]);\n\n const launch = async (): Promise<void> => {\n setLaunching(true);\n setError(null);\n try {\n await fetchJson('/api/eval/run', { method: 'POST', body: { suite } });\n void runs.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setLaunching(false);\n }\n };\n\n const list = runs.data?.runs ?? [];\n\n const addSchedule = async (): Promise<void> => {\n if (!scheduleForm.name.trim() || !scheduleForm.cron.trim()) return;\n setBusySchedule(true);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean }>('/api/eval/schedules', { method: 'POST', body: scheduleForm });\n setAddingSchedule(false);\n setScheduleForm({ name: '', cron: '', suitePath: 'default' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusySchedule(false);\n }\n };\n\n const deleteSchedule = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/eval/schedules/${encodeURIComponent(id)}`, { method: 'DELETE' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const scheduleList = schedules.data?.schedules ?? [];\n\n return (\n <Stack gap={5} data-testid=\"eval-view\">\n <ViewHeader\n title=\"Eval framework\"\n description=\"Run evaluation suites against the agent model. Suites live under fixtures/.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <input\n value={suite}\n onChange={(e) => setSuite(e.target.value)}\n placeholder=\"suite name\"\n disabled={launching}\n data-testid=\"eval-suite-input\"\n style={{\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n }}\n />\n <Button variant=\"primary\" onClick={() => void launch()} disabled={launching || !suite.trim()} data-testid=\"eval-launch\">\n {launching ? <Loader2 size={14} className=\"animate-spin\" aria-hidden /> : <Play size={14} aria-hidden />}\n {launching ? 'Launching…' : 'Run suite'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void runs.refetch()} data-testid=\"eval-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n {runs.loading && list.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 80 }} />\n <Skeleton style={{ height: 80 }} />\n </Stack>\n ) : list.length === 0 ? (\n <EmptyState\n icon={<FlaskConical size={32} aria-hidden />}\n title=\"No eval runs yet\"\n description=\"Launch a suite to begin measuring agent quality.\"\n />\n ) : (\n <Stack gap={2}>\n {list.map((r) => (\n <Card key={r.id} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{r.id}</strong>\n <Badge tone={statusTone(r.status)}>{r.status ?? 'unknown'}</Badge>\n {r.suite && <Badge tone=\"neutral\">{r.suite}</Badge>}\n </Inline>\n <Inline align=\"center\" gap={3} style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n <span>{r.startedAt ? new Date(r.startedAt).toLocaleString() : ''}</span>\n <span>{fmtDuration(r.durationMs)}</span>\n </Inline>\n </Stack>\n <Stack align=\"end\" gap={0}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-14)' }}>\n <strong style={{ color: 'var(--success)' }}>{r.passed ?? 0}</strong> pass\n {' / '}\n <strong style={{ color: 'var(--danger)' }}>{r.failed ?? 0}</strong> fail\n </span>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{(r.total ?? 0)} total</span>\n </Stack>\n </Inline>\n </CardBody>\n </Card>\n ))}\n </Stack>\n )}\n\n <Card variant=\"elevated\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Calendar size={16} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-14)' }}>Schedules</strong>\n <Badge tone=\"neutral\">{scheduleList.length}</Badge>\n </Inline>\n {!addingSchedule && (\n <Button variant=\"primary\" onClick={() => setAddingSchedule(true)} data-testid=\"eval-schedule-add\">\n <Plus size={14} aria-hidden /> Add schedule\n </Button>\n )}\n </Inline>\n\n {addingSchedule && (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }} data-testid=\"eval-schedule-form\">\n <Inline gap={2} align=\"center\">\n <input\n value={scheduleForm.name}\n onChange={(e) => setScheduleForm({ ...scheduleForm, name: e.target.value })}\n placeholder=\"name\"\n data-testid=\"eval-schedule-form-name\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.cron}\n onChange={(e) => setScheduleForm({ ...scheduleForm, cron: e.target.value })}\n placeholder=\"cron (e.g. 0 9 * * *)\"\n data-testid=\"eval-schedule-form-cron\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.suitePath}\n onChange={(e) => setScheduleForm({ ...scheduleForm, suitePath: e.target.value })}\n placeholder=\"suite path\"\n data-testid=\"eval-schedule-form-suite\"\n style={inputStyle}\n />\n </Inline>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => void addSchedule()} disabled={busySchedule} data-testid=\"eval-schedule-form-submit\">\n {busySchedule ? 'Saving…' : 'Save'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setAddingSchedule(false)} data-testid=\"eval-schedule-form-cancel\">Cancel</Button>\n </Inline>\n </Stack>\n )}\n\n {scheduleList.length === 0 ? (\n <div style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No schedules yet. Add one to run suites on a cron.\n </div>\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }}>\n {scheduleList.map((s) => (\n <Inline key={s.id} align=\"center\" justify=\"between\" gap={2} data-testid={`eval-schedule-row-${s.id}`}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{s.name}</strong>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.cron}</code>\n {s.suitePath && <Badge tone=\"neutral\">{s.suitePath}</Badge>}\n </Inline>\n <Button variant=\"ghost\" onClick={() => void deleteSchedule(s.id)} data-testid={`eval-schedule-delete-${s.id}`} aria-label={`Delete schedule ${s.name}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nconst inputStyle = {\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n} as const;"],"names":["statusTone","s","fmtDuration","ms","EvalView","runs","useFetch","schedules","launching","setLaunching","useState","suite","setSuite","error","setError","addingSchedule","setAddingSchedule","scheduleForm","setScheduleForm","busySchedule","setBusySchedule","useEffect","_a","r","id","launch","fetchJson","err","FetchError","list","addSchedule","deleteSchedule","scheduleList","_b","jsxs","Stack","jsx","ViewHeader","Inline","e","Button","Loader2","Play","RefreshCw","Skeleton","EmptyState","FlaskConical","Card","CardBody","Badge","Calendar","Plus","inputStyle","Trash2"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r}from"./cmdk-C3F6LD6N.js";import{
|
|
1
|
+
import{j as e,r}from"./cmdk-C3F6LD6N.js";import{b as F,g as q,S as f,I as C,B as b,h as K,i as R,u as Q,a as V}from"./main-BRmJZcHt.js";import{G as X}from"./Grid-Bojq8Sg7.js";import{C as Y}from"./Chip-B7ovcm01.js";import{C as Z,V as ee}from"./ViewHeader-BsnaspKw.js";import{P as te}from"./ProgressBar-KC4VXsl_.js";import{C as se}from"./calendar-CAZoDd-l.js";import{S as _,a as M}from"./Sheet-BwMVGN-8.js";import{I as P}from"./Input-DV-vdaV8.js";import{S as ae,a as le,b as re,c as ne}from"./Select-Bf_P0S6H.js";import{E as ie}from"./external-link-DPDQM1YO.js";import{T as W}from"./trash-2-B_Y6HrfN.js";import{P as H}from"./plus-Cps-8lcG.js";import{C as oe,b as de}from"./Card-Clkvh43Q.js";import{E as ce}from"./ErrorState-BSqf65ka.js";import{L as ue}from"./ListHeader-CCD_nIHb.js";import{T as ge}from"./Textarea-BfXGMXQ7.js";import"./index-CR0TeJmc.js";import"./index-B1OIS316.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./triangle-alert-BeY8LAv6.js";import"./circle-check-BMbe7Kkr.js";import"./refresh-ccw-DN_zCB1h.js";const fe={"on-track":"On track","at-risk":"At risk","off-track":"Off track",done:"Done"},he={"on-track":"success","at-risk":"warning","off-track":"danger",done:"neutral"};function pe(i){const{title:l,description:u,status:p,progress:D,due:g,ownerName:m,ownerAvatarUrl:h,keyResultsDone:w,keyResultsTotal:I,badges:E,onOpen:z,className:j}=i;return e.jsxs("button",{type:"button",onClick:z,className:q("v8-goal-card",`v8-goal-card--${p}`,j),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:l}),u!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:u})]}),e.jsx(F,{tone:he[p],dot:!0,children:fe[p]})]}),e.jsxs("div",{children:[e.jsx(te,{value:D,tone:p==="on-track"?"success":p==="at-risk"?"warning":p==="off-track"?"danger":"accent"}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.jsxs("span",{children:[Math.round(D*100),"% complete"]}),w!==void 0&&I!==void 0&&e.jsxs("span",{children:[w," / ",I," key results"]})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[g!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(se,{size:12,"aria-hidden":"true"}),g]}),m!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{"aria-hidden":"true",style:{width:16,height:16,borderRadius:"var(--radius-pill)",background:h!==void 0?`url(${h}) center/cover`:"var(--accent)",display:"inline-block"}}),m]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[E,e.jsx(Z,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]}),e.jsx("style",{children:`
|
|
2
2
|
.v8-goal-card:hover {
|
|
3
3
|
border-color: var(--accent);
|
|
4
4
|
background: var(--surface-2);
|