@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 +0,0 @@
|
|
|
1
|
-
:root{--bg: oklch(.99 0 0);--surface-1: oklch(.97 0 0);--surface-2: oklch(.95 0 0);--surface-3: oklch(.93 0 0);--surface-popover: oklch(.99 0 0);--fg: oklch(.2 0 0);--fg-muted: oklch(.45 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.99 0 0);--fg-link: oklch(.527 .154 150.069);--accent: oklch(.527 .154 150.069);--accent-hover: oklch(.475 .154 150.069);--accent-soft: oklch(.93 .04 150);--accent-ring: oklch(.527 .154 150.069 / .4);--success: oklch(.55 .13 150);--warning: oklch(.72 .15 80);--danger: oklch(.55 .2 25);--info: oklch(.55 .13 240);--border: oklch(.9 0 0);--border-strong: oklch(.85 0 0);--input-bg: oklch(.99 0 0);--focus-ring: oklch(.527 .154 150.069);--chart-1: oklch(.55 0 0);--chart-2: oklch(.4 0 0);--chart-3: oklch(.7 0 0);--chart-4: oklch(.25 0 0);--chart-5: oklch(.85 0 0);--chart-accent: oklch(.527 .154 150.069);--sidebar-bg: oklch(.97 0 0);--sidebar-fg: oklch(.2 0 0);--sidebar-accent: oklch(.527 .154 150.069);--sidebar-accent-fg: oklch(.99 0 0);--sidebar-hover: oklch(.93 0 0);--sidebar-border: oklch(.9 0 0);--radius: 10px;--radius-sm: 6px;--radius-lg: 14px;--radius-pill: 9999px;--shadow-1: 0 1px 2px oklch(0 0 0 / .04), 0 1px 1px oklch(0 0 0 / .02);--shadow-2: 0 2px 4px oklch(0 0 0 / .06), 0 1px 2px oklch(0 0 0 / .04);--shadow-3: 0 8px 16px oklch(0 0 0 / .08), 0 2px 4px oklch(0 0 0 / .04);--shadow-4: 0 16px 32px oklch(0 0 0 / .1), 0 4px 8px oklch(0 0 0 / .06);--motion-instant: 50ms;--motion-fast: .12s;--motion-base: .2s;--motion-slow: .32s;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--z-base: 0;--z-sticky: 10;--z-dropdown: 1000;--z-sticky-nav: 1100;--z-overlay: 1300;--z-modal: 1400;--z-popover: 1500;--z-toast: 1600;--z-tooltip: 1700;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--topbar-h: 56px;--sidebar-w: 260px;--sidebar-w-collapsed: 60px;--statusbar-h: 32px}@media (prefers-color-scheme: dark){:root{--bg: oklch(.18 0 0);--surface-1: oklch(.22 0 0);--surface-2: oklch(.25 0 0);--surface-3: oklch(.28 0 0);--surface-popover: oklch(.25 0 0);--fg: oklch(.97 0 0);--fg-muted: oklch(.75 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.15 0 0);--fg-link: oklch(.448 .119 151.328);--accent: oklch(.448 .119 151.328);--accent-hover: oklch(.5 .119 151.328);--accent-soft: oklch(.3 .04 150);--accent-ring: oklch(.448 .119 151.328 / .4);--success: oklch(.65 .13 150);--warning: oklch(.75 .15 80);--danger: oklch(.65 .2 25);--info: oklch(.65 .13 240);--border: oklch(.3 0 0);--border-strong: oklch(.35 0 0);--input-bg: oklch(.22 0 0);--focus-ring: oklch(.448 .119 151.328);--chart-1: oklch(.75 0 0);--chart-2: oklch(.6 0 0);--chart-3: oklch(.85 0 0);--chart-4: oklch(.5 0 0);--chart-5: oklch(.3 0 0);--chart-accent: oklch(.448 .119 151.328);--sidebar-bg: oklch(.2 0 0);--sidebar-fg: oklch(.95 0 0);--sidebar-accent: oklch(.448 .119 151.328);--sidebar-accent-fg: oklch(.15 0 0);--sidebar-hover: oklch(.25 0 0);--sidebar-border: oklch(.3 0 0);--shadow-1: 0 1px 2px oklch(0 0 0 / .2), 0 1px 1px oklch(0 0 0 / .1);--shadow-2: 0 2px 4px oklch(0 0 0 / .3), 0 1px 2px oklch(0 0 0 / .2);--shadow-3: 0 8px 16px oklch(0 0 0 / .4), 0 2px 4px oklch(0 0 0 / .2);--shadow-4: 0 16px 32px oklch(0 0 0 / .5), 0 4px 8px oklch(0 0 0 / .3)}}:root[data-theme=light]{--bg: oklch(.99 0 0);--surface-1: oklch(.97 0 0);--surface-2: oklch(.95 0 0);--surface-3: oklch(.93 0 0);--surface-popover: oklch(.99 0 0);--fg: oklch(.2 0 0);--fg-muted: oklch(.45 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.99 0 0);--accent: oklch(.527 .154 150.069);--accent-hover: oklch(.475 .154 150.069);--accent-soft: oklch(.93 .04 150);--accent-ring: oklch(.527 .154 150.069 / .4);--border: oklch(.9 0 0);--border-strong: oklch(.85 0 0);--input-bg: oklch(.99 0 0);--focus-ring: oklch(.527 .154 150.069);--sidebar-bg: oklch(.97 0 0);--sidebar-fg: oklch(.2 0 0);--sidebar-accent: oklch(.527 .154 150.069);--sidebar-accent-fg: oklch(.99 0 0);--sidebar-hover: oklch(.93 0 0);--sidebar-border: oklch(.9 0 0)}:root[data-theme=dark]{--bg: oklch(.18 0 0);--surface-1: oklch(.22 0 0);--surface-2: oklch(.25 0 0);--surface-3: oklch(.28 0 0);--surface-popover: oklch(.25 0 0);--fg: oklch(.97 0 0);--fg-muted: oklch(.75 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.15 0 0);--accent: oklch(.448 .119 151.328);--accent-hover: oklch(.5 .119 151.328);--accent-soft: oklch(.3 .04 150);--accent-ring: oklch(.448 .119 151.328 / .4);--border: oklch(.3 0 0);--border-strong: oklch(.35 0 0);--input-bg: oklch(.22 0 0);--focus-ring: oklch(.448 .119 151.328);--sidebar-bg: oklch(.2 0 0);--sidebar-fg: oklch(.95 0 0);--sidebar-accent: oklch(.448 .119 151.328);--sidebar-accent-fg: oklch(.15 0 0);--sidebar-hover: oklch(.25 0 0);--sidebar-border: oklch(.3 0 0);--shadow-1: 0 1px 2px oklch(0 0 0 / .2), 0 1px 1px oklch(0 0 0 / .1);--shadow-2: 0 2px 4px oklch(0 0 0 / .3), 0 1px 2px oklch(0 0 0 / .2);--shadow-3: 0 8px 16px oklch(0 0 0 / .4), 0 2px 4px oklch(0 0 0 / .2);--shadow-4: 0 16px 32px oklch(0 0 0 / .5), 0 4px 8px oklch(0 0 0 / .3)}@media (prefers-reduced-motion: reduce){:root{--motion-instant: 0ms;--motion-fast: 0ms;--motion-base: 0ms;--motion-slow: 0ms}}*,*:before,*:after{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{list-style:none;padding:0;margin:0}a{color:inherit;text-decoration:none}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit;color:inherit}button{background:none;border:0;padding:0;cursor:pointer}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}::selection{background:var(--accent-soft);color:var(--fg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--radius-pill);border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:var(--fg-subtle)}:root{--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Inter", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--fs-12: .75rem;--fs-13: .8125rem;--fs-14: .875rem;--fs-16: 1rem;--fs-18: 1.125rem;--fs-20: 1.25rem;--fs-24: 1.5rem;--fs-32: 2rem;--lh-tight: 1.2;--lh-snug: 1.35;--lh-base: 1.5;--lh-relaxed: 1.65;--fw-regular: 400;--fw-medium: 500;--fw-semibold: 600;--fw-bold: 700;--tracking-tight: -.01em;--tracking-base: 0;--tracking-wide: .04em}body{font-family:var(--font-sans);font-size:var(--fs-14);line-height:var(--lh-base);color:var(--fg);background:var(--bg);font-feature-settings:"cv02","cv03","cv04","cv11"}code,kbd,pre,samp{font-family:var(--font-mono);font-size:.9em}kbd{display:inline-flex;align-items:center;justify-content:center;min-width:1.5em;height:1.5em;padding:0 var(--space-1);font-family:var(--font-mono);font-size:var(--fs-12);color:var(--fg-muted);background:var(--surface-1);border:1px solid var(--border);border-bottom-width:2px;border-radius:var(--radius-sm)}:root[data-density=comfortable]{--density-row-h: 36px;--density-control-h: 36px;--density-card-pad: var(--space-5)}:root[data-density=compact]{--density-row-h: 28px;--density-control-h: 28px;--density-card-pad: var(--space-3)}h1{font-size:var(--fs-24);line-height:var(--lh-tight);font-weight:var(--fw-semibold);letter-spacing:var(--tracking-tight)}h2{font-size:var(--fs-20);line-height:var(--lh-snug);font-weight:var(--fw-semibold)}h3{font-size:var(--fs-18);line-height:var(--lh-snug);font-weight:var(--fw-medium)}h4{font-size:var(--fs-16);line-height:var(--lh-base);font-weight:var(--fw-medium)}@media (max-width: 767px){.v8-desktop-sidebar{display:none}.mobile-menu-toggle{display:inline-flex!important}}@media (min-width: 768px){.v8-mobile-sidebar,.v8-mobile-sidebar-overlay,.mobile-menu-toggle{display:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}#root{display:flex;flex-direction:column;min-height:100%;isolation:isolate}@keyframes v8-skeleton-pulse{0%,to{opacity:1}50%{opacity:.55}}@keyframes v8-spin{to{transform:rotate(360deg)}}@keyframes v8-pulse{0%{box-shadow:0 0 color-mix(in oklch,currentColor 60%,transparent)}to{box-shadow:0 0 0 8px color-mix(in oklch,currentColor 0%,transparent)}}@keyframes v8-dialog-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes v8-dialog-content-in{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes v8-sheet-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes v8-sheet-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes v8-sheet-in-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes v8-sheet-in-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes v8-menu-in{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes v8-tooltip-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.v8-skeleton{animation:v8-skeleton-pulse 1.4s var(--easing-standard, cubic-bezier(.4, 0, .2, 1)) infinite}.v8-spinner{animation:v8-spin .8s linear infinite}.v8-dialog-overlay{animation:v8-dialog-overlay-in .16s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-dialog-content{animation:v8-dialog-content-in .2s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-sheet[data-side=right]{animation:v8-sheet-in-right .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=left]{animation:v8-sheet-in-left .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=top]{animation:v8-sheet-in-top .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=bottom]{animation:v8-sheet-in-bottom .24s cubic-bezier(.32,.72,0,1)}.v8-dropdown-menu,.v8-context-menu,.v8-popover{animation:v8-menu-in .14s var(--easing-standard, cubic-bezier(.4, 0, .2, 1));transform-origin:var(--radix-dropdown-menu-content-transform-origin, var(--radix-context-menu-content-transform-origin, var(--radix-popover-content-transform-origin, top)))}.v8-tooltip{animation:v8-tooltip-in .12s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-dropdown-menu__item[data-highlighted],.v8-context-menu__item[data-highlighted]{background:var(--surface-2)}.v8-dropdown-menu__item.is-danger[data-highlighted],.v8-context-menu__item.is-danger[data-highlighted]{background:color-mix(in oklch,var(--danger) 12%,transparent)}.v8-dropdown-menu__checkbox[data-state=checked] .v8-dropdown-menu__checkbox-indicator,.v8-dropdown-menu__radio[data-state=checked] .v8-dropdown-menu__radio-indicator{display:inline-flex}
|
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tests/chat-session-create.test.mjs — v4.2.5
|
|
3
|
-
*
|
|
4
|
-
* Tests the session-mutation endpoints on the cline-sessions router:
|
|
5
|
-
*
|
|
6
|
-
* POST /api/cline-sessions/new
|
|
7
|
-
* PATCH /api/cline-sessions/:id
|
|
8
|
-
* DELETE /api/cline-sessions/:id
|
|
9
|
-
*
|
|
10
|
-
* Strategy: stand up a fake cline serve child on a random port,
|
|
11
|
-
* point readServeInfo() at it by writing a tmp serve.json to
|
|
12
|
-
* ~/.cache/bizar/serve.json. The fake serves:
|
|
13
|
-
*
|
|
14
|
-
* POST /api/session?directory=... → returns { data: { id, ... } }
|
|
15
|
-
* PATCH /api/session/:id?directory=. → echoes the body as { id }
|
|
16
|
-
* DELETE /api/session/:id?directory=. → returns 200 or 404
|
|
17
|
-
*
|
|
18
|
-
* For "plugin offline" tests we move serve.json aside, then restore.
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { test, before, after, beforeEach } from 'node:test';
|
|
22
|
-
import assert from 'node:assert/strict';
|
|
23
|
-
import {
|
|
24
|
-
mkdtempSync,
|
|
25
|
-
writeFileSync,
|
|
26
|
-
rmSync,
|
|
27
|
-
existsSync,
|
|
28
|
-
copyFileSync,
|
|
29
|
-
unlinkSync,
|
|
30
|
-
readFileSync,
|
|
31
|
-
} from 'node:fs';
|
|
32
|
-
import { join } from 'node:path';
|
|
33
|
-
import { tmpdir } from 'node:os';
|
|
34
|
-
import { createServer } from 'node:http';
|
|
35
|
-
import express from 'express';
|
|
36
|
-
|
|
37
|
-
import { createClineSessionsRouter } from '../src/server/routes/cline-sessions.mjs';
|
|
38
|
-
|
|
39
|
-
// ── fake upstream (cline serve child) ──────────────────────────────────
|
|
40
|
-
|
|
41
|
-
let upstreamServer, upstreamPort;
|
|
42
|
-
const upstream = {
|
|
43
|
-
createHits: [],
|
|
44
|
-
patchHits: [],
|
|
45
|
-
deleteHits: [],
|
|
46
|
-
nextCreateStatus: 200,
|
|
47
|
-
nextCreateId: null,
|
|
48
|
-
// Behavior knobs tests can flip:
|
|
49
|
-
failNextCreate: false,
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
function startUpstream() {
|
|
53
|
-
return new Promise((resolve) => {
|
|
54
|
-
upstreamServer = createServer((req, res) => {
|
|
55
|
-
const url = new URL(req.url, 'http://127.0.0.1');
|
|
56
|
-
|
|
57
|
-
// CREATE: POST /api/session?directory=...
|
|
58
|
-
if (
|
|
59
|
-
url.pathname === '/api/session' &&
|
|
60
|
-
req.method === 'POST'
|
|
61
|
-
) {
|
|
62
|
-
let body = '';
|
|
63
|
-
req.on('data', (c) => {
|
|
64
|
-
body += c;
|
|
65
|
-
});
|
|
66
|
-
req.on('end', () => {
|
|
67
|
-
let parsed;
|
|
68
|
-
try { parsed = JSON.parse(body); } catch { parsed = {}; }
|
|
69
|
-
upstream.createHits.push({ url: req.url, body: parsed });
|
|
70
|
-
if (upstream.failNextCreate) {
|
|
71
|
-
upstream.failNextCreate = false;
|
|
72
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
73
|
-
res.end(JSON.stringify({ error: 'fake-upstream-failure' }));
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
res.writeHead(upstream.nextCreateStatus, {
|
|
77
|
-
'Content-Type': 'application/json',
|
|
78
|
-
});
|
|
79
|
-
const id =
|
|
80
|
-
upstream.nextCreateId ||
|
|
81
|
-
`sess-new-${upstream.createHits.length}`;
|
|
82
|
-
upstream.nextCreateId = null;
|
|
83
|
-
res.end(JSON.stringify({ data: { id, title: parsed.title, agent: parsed.agent } }));
|
|
84
|
-
});
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// RENAME: PATCH /api/session/:id?directory=...
|
|
89
|
-
const patchM = url.pathname.match(/^\/api\/session\/([^/]+)$/);
|
|
90
|
-
if (patchM && req.method === 'PATCH') {
|
|
91
|
-
let body = '';
|
|
92
|
-
req.on('data', (c) => {
|
|
93
|
-
body += c;
|
|
94
|
-
});
|
|
95
|
-
req.on('end', () => {
|
|
96
|
-
let parsed;
|
|
97
|
-
try { parsed = JSON.parse(body); } catch { parsed = {}; }
|
|
98
|
-
upstream.patchHits.push({ id: patchM[1], url: req.url, body: parsed });
|
|
99
|
-
if (patchM[1] === 'sess-missing') {
|
|
100
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
101
|
-
res.end(JSON.stringify({ error: 'not found' }));
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
105
|
-
res.end(JSON.stringify({ id: patchM[1], title: parsed.title }));
|
|
106
|
-
});
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// DELETE: DELETE /api/session/:id?directory=...
|
|
111
|
-
const deleteM = url.pathname.match(/^\/api\/session\/([^/]+)$/);
|
|
112
|
-
if (deleteM && req.method === 'DELETE') {
|
|
113
|
-
upstream.deleteHits.push({ id: deleteM[1], url: req.url });
|
|
114
|
-
if (deleteM[1] === 'sess-gone') {
|
|
115
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
116
|
-
res.end(JSON.stringify({ error: 'gone' }));
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
120
|
-
res.end(JSON.stringify({ id: deleteM[1] }));
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
res.writeHead(404);
|
|
125
|
-
res.end('not found');
|
|
126
|
-
});
|
|
127
|
-
upstreamServer.listen(0, '127.0.0.1', () => {
|
|
128
|
-
upstreamPort = upstreamServer.address().port;
|
|
129
|
-
resolve();
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async function startDashboard() {
|
|
135
|
-
const app = express();
|
|
136
|
-
app.use(express.json({ limit: '2mb' }));
|
|
137
|
-
app.use('/api', createClineSessionsRouter());
|
|
138
|
-
dashboardServer = createServer(app);
|
|
139
|
-
await new Promise((r) => dashboardServer.listen(0, '127.0.0.1', r));
|
|
140
|
-
dashboardBaseUrl = `http://127.0.0.1:${dashboardServer.address().port}`;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
let dashboardServer, dashboardBaseUrl, tmpDir;
|
|
144
|
-
let SERVE_JSON_PATH;
|
|
145
|
-
let originalServeJson;
|
|
146
|
-
|
|
147
|
-
before(async () => {
|
|
148
|
-
SERVE_JSON_PATH = `${tmpdir()}/bizar-test-serve-create-${process.pid}-${Date.now()}.json`;
|
|
149
|
-
process.env.BIZAR_SERVE_JSON_PATH = SERVE_JSON_PATH;
|
|
150
|
-
await startUpstream();
|
|
151
|
-
await startDashboard();
|
|
152
|
-
tmpDir = mkdtempSync(join(tmpdir(), 'cline-sessions-create-'));
|
|
153
|
-
if (existsSync(SERVE_JSON_PATH)) {
|
|
154
|
-
originalServeJson = readFileSync(SERVE_JSON_PATH, 'utf8');
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
after(async () => {
|
|
159
|
-
if (originalServeJson !== undefined) {
|
|
160
|
-
writeFileSync(SERVE_JSON_PATH, originalServeJson, 'utf8');
|
|
161
|
-
} else if (existsSync(SERVE_JSON_PATH)) {
|
|
162
|
-
rmSync(SERVE_JSON_PATH);
|
|
163
|
-
}
|
|
164
|
-
if (dashboardServer) await new Promise((r) => dashboardServer.close(r));
|
|
165
|
-
if (upstreamServer) await new Promise((r) => upstreamServer.close(r));
|
|
166
|
-
if (tmpDir) rmSync(tmpDir, { recursive: true, force: true });
|
|
167
|
-
delete process.env.BIZAR_SERVE_JSON_PATH;
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
beforeEach(() => {
|
|
171
|
-
upstream.createHits = [];
|
|
172
|
-
upstream.patchHits = [];
|
|
173
|
-
upstream.deleteHits = [];
|
|
174
|
-
upstream.nextCreateStatus = 200;
|
|
175
|
-
upstream.nextCreateId = null;
|
|
176
|
-
upstream.failNextCreate = false;
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
function writeServeJson(worktree = '/tmp/new-session-worktree') {
|
|
180
|
-
writeFileSync(
|
|
181
|
-
SERVE_JSON_PATH,
|
|
182
|
-
JSON.stringify({
|
|
183
|
-
port: upstreamPort,
|
|
184
|
-
password: 'test-pw',
|
|
185
|
-
worktree,
|
|
186
|
-
pid: 99999,
|
|
187
|
-
startedAt: Date.now(),
|
|
188
|
-
}),
|
|
189
|
-
'utf8',
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/** Move serve.json aside so readServeInfo() returns null.
|
|
194
|
-
* Uses copy + unlink because rename across filesystems (e.g.
|
|
195
|
-
* /home/* → /tmp/*) throws EXDEV on Linux. */
|
|
196
|
-
function moveServeJsonAside() {
|
|
197
|
-
if (!existsSync(SERVE_JSON_PATH)) return;
|
|
198
|
-
const tmp = join(tmpDir, `serve-aside-${Date.now()}-${process.pid}.json`);
|
|
199
|
-
copyFileSync(SERVE_JSON_PATH, tmp);
|
|
200
|
-
unlinkSync(SERVE_JSON_PATH);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// ── tests ─────────────────────────────────────────────────────────────────
|
|
204
|
-
|
|
205
|
-
test('POST /api/cline-sessions/new returns 201 with id+title+agent on happy path', async () => {
|
|
206
|
-
writeServeJson();
|
|
207
|
-
upstream.nextCreateId = 'sess-fresh-1';
|
|
208
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
209
|
-
method: 'POST',
|
|
210
|
-
headers: { 'Content-Type': 'application/json' },
|
|
211
|
-
body: JSON.stringify({ title: 'Hello world', agent: 'odin' }),
|
|
212
|
-
});
|
|
213
|
-
assert.equal(r.status, 201);
|
|
214
|
-
const body = await r.json();
|
|
215
|
-
assert.equal(body.id, 'sess-fresh-1');
|
|
216
|
-
assert.equal(body.title, 'Hello world');
|
|
217
|
-
assert.equal(body.agent, 'odin');
|
|
218
|
-
assert.ok(typeof body.directory === 'string' && body.directory.length > 0);
|
|
219
|
-
assert.ok(typeof body.createdAt === 'number' && body.createdAt > 0);
|
|
220
|
-
assert.equal(upstream.createHits.length, 1);
|
|
221
|
-
assert.equal(upstream.createHits[0].body.title, 'Hello world');
|
|
222
|
-
assert.equal(upstream.createHits[0].body.agent, 'odin');
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test('POST /api/cline-sessions/new returns 400 when body is missing', async () => {
|
|
226
|
-
writeServeJson();
|
|
227
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
228
|
-
method: 'POST',
|
|
229
|
-
headers: { 'Content-Type': 'application/json' },
|
|
230
|
-
});
|
|
231
|
-
assert.equal(r.status, 400);
|
|
232
|
-
const body = await r.json();
|
|
233
|
-
assert.match(body.message, /agent.*required/i);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test('POST /api/cline-sessions/new returns 400 when agent missing', async () => {
|
|
237
|
-
writeServeJson();
|
|
238
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
239
|
-
method: 'POST',
|
|
240
|
-
headers: { 'Content-Type': 'application/json' },
|
|
241
|
-
body: JSON.stringify({ title: 'no-agent' }),
|
|
242
|
-
});
|
|
243
|
-
assert.equal(r.status, 400);
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
test('POST /api/cline-sessions/new returns 400 when agent is invalid', async () => {
|
|
247
|
-
writeServeJson();
|
|
248
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
249
|
-
method: 'POST',
|
|
250
|
-
headers: { 'Content-Type': 'application/json' },
|
|
251
|
-
body: JSON.stringify({ agent: 'has space and !' }),
|
|
252
|
-
});
|
|
253
|
-
assert.equal(r.status, 400);
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
test('POST /api/cline-sessions/new returns 502 when upstream 500s', async () => {
|
|
257
|
-
writeServeJson();
|
|
258
|
-
upstream.failNextCreate = true;
|
|
259
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
260
|
-
method: 'POST',
|
|
261
|
-
headers: { 'Content-Type': 'application/json' },
|
|
262
|
-
body: JSON.stringify({ agent: 'odin' }),
|
|
263
|
-
});
|
|
264
|
-
assert.equal(r.status, 502);
|
|
265
|
-
const body = await r.json();
|
|
266
|
-
assert.equal(body.error, 'cline_error');
|
|
267
|
-
assert.ok(body.message.length > 0);
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
test('POST /api/cline-sessions/new returns 503 plugin_offline when no serve.json', async () => {
|
|
271
|
-
moveServeJsonAside();
|
|
272
|
-
try {
|
|
273
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
274
|
-
method: 'POST',
|
|
275
|
-
headers: { 'Content-Type': 'application/json' },
|
|
276
|
-
body: JSON.stringify({ agent: 'odin' }),
|
|
277
|
-
});
|
|
278
|
-
assert.equal(r.status, 503);
|
|
279
|
-
assert.equal((await r.json()).error, 'plugin_offline');
|
|
280
|
-
} finally {
|
|
281
|
-
if (originalServeJson !== undefined)
|
|
282
|
-
writeFileSync(SERVE_JSON_PATH, originalServeJson, 'utf8');
|
|
283
|
-
else writeServeJson('/tmp/session-worktree');
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
test('POST /api/cline-sessions/new defaults title to "Chat: <agent>"', async () => {
|
|
288
|
-
writeServeJson();
|
|
289
|
-
upstream.nextCreateId = 'sess-defaulted-1';
|
|
290
|
-
const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
|
|
291
|
-
method: 'POST',
|
|
292
|
-
headers: { 'Content-Type': 'application/json' },
|
|
293
|
-
body: JSON.stringify({ agent: 'tyr' }),
|
|
294
|
-
});
|
|
295
|
-
assert.equal(r.status, 201);
|
|
296
|
-
const body = await r.json();
|
|
297
|
-
assert.equal(body.title, 'Chat: tyr');
|
|
298
|
-
assert.equal(upstream.createHits[0].body.title, 'Chat: tyr');
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test('PATCH /api/cline-sessions/:id renames the session (200)', async () => {
|
|
302
|
-
writeServeJson();
|
|
303
|
-
const r = await fetch(
|
|
304
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-1`,
|
|
305
|
-
{
|
|
306
|
-
method: 'PATCH',
|
|
307
|
-
headers: { 'Content-Type': 'application/json' },
|
|
308
|
-
body: JSON.stringify({ title: 'New title' }),
|
|
309
|
-
},
|
|
310
|
-
);
|
|
311
|
-
assert.equal(r.status, 200);
|
|
312
|
-
const body = await r.json();
|
|
313
|
-
assert.equal(body.id, 'sess-1');
|
|
314
|
-
assert.equal(body.title, 'New title');
|
|
315
|
-
assert.equal(upstream.patchHits.length, 1);
|
|
316
|
-
assert.equal(upstream.patchHits[0].body.title, 'New title');
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
test('PATCH /api/cline-sessions/:id returns 400 when title missing', async () => {
|
|
320
|
-
writeServeJson();
|
|
321
|
-
const r = await fetch(
|
|
322
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-1`,
|
|
323
|
-
{
|
|
324
|
-
method: 'PATCH',
|
|
325
|
-
headers: { 'Content-Type': 'application/json' },
|
|
326
|
-
body: JSON.stringify({}),
|
|
327
|
-
},
|
|
328
|
-
);
|
|
329
|
-
assert.equal(r.status, 400);
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
test('PATCH /api/cline-sessions/:id returns 400 when title is empty', async () => {
|
|
333
|
-
writeServeJson();
|
|
334
|
-
const r = await fetch(
|
|
335
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-1`,
|
|
336
|
-
{
|
|
337
|
-
method: 'PATCH',
|
|
338
|
-
headers: { 'Content-Type': 'application/json' },
|
|
339
|
-
body: JSON.stringify({ title: ' ' }),
|
|
340
|
-
},
|
|
341
|
-
);
|
|
342
|
-
assert.equal(r.status, 400);
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
test('PATCH /api/cline-sessions/:id returns 404 when upstream 404s', async () => {
|
|
346
|
-
writeServeJson();
|
|
347
|
-
const r = await fetch(
|
|
348
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-missing`,
|
|
349
|
-
{
|
|
350
|
-
method: 'PATCH',
|
|
351
|
-
headers: { 'Content-Type': 'application/json' },
|
|
352
|
-
body: JSON.stringify({ title: 'whatever' }),
|
|
353
|
-
},
|
|
354
|
-
);
|
|
355
|
-
assert.equal(r.status, 404);
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
test('DELETE /api/cline-sessions/:id returns 200 with { deleted: true }', async () => {
|
|
359
|
-
writeServeJson();
|
|
360
|
-
const r = await fetch(
|
|
361
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-1`,
|
|
362
|
-
{ method: 'DELETE' },
|
|
363
|
-
);
|
|
364
|
-
assert.equal(r.status, 200);
|
|
365
|
-
const body = await r.json();
|
|
366
|
-
assert.deepEqual(body, { id: 'sess-1', deleted: true });
|
|
367
|
-
assert.equal(upstream.deleteHits.length, 1);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
test('DELETE /api/cline-sessions/:id is idempotent (returns 200 even when upstream 404s)', async () => {
|
|
371
|
-
// Idempotent semantics: a "session already gone" response is the
|
|
372
|
-
// desired terminal state — we don't surface that to the client as
|
|
373
|
-
// an error.
|
|
374
|
-
writeServeJson();
|
|
375
|
-
const r = await fetch(
|
|
376
|
-
`${dashboardBaseUrl}/api/cline-sessions/sess-gone`,
|
|
377
|
-
{ method: 'DELETE' },
|
|
378
|
-
);
|
|
379
|
-
assert.equal(r.status, 200);
|
|
380
|
-
const body = await r.json();
|
|
381
|
-
assert.deepEqual(body, { id: 'sess-gone', deleted: true });
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
test('DELETE /api/cline-sessions/:id returns 400 when id is invalid', async () => {
|
|
385
|
-
writeServeJson();
|
|
386
|
-
const r = await fetch(
|
|
387
|
-
`${dashboardBaseUrl}/api/cline-sessions/has space`,
|
|
388
|
-
{ method: 'DELETE' },
|
|
389
|
-
);
|
|
390
|
-
assert.equal(r.status, 400);
|
|
391
|
-
});
|