@polderlabs/bizar 10.4.2 → 10.4.3
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-DtRtg-JN.js → ActivityFeed-DC0JiK49.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-DtRtg-JN.js.map → ActivityFeed-DC0JiK49.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js → ActivityView-ubEDAWMY.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js.map → ActivityView-ubEDAWMY.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DNc5Ll7L.js → AdminView-CI4zM2Qg.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DNc5Ll7L.js.map → AdminView-CI4zM2Qg.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js → AgentActivity-BLcqqkt2.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js.map → AgentActivity-BLcqqkt2.js.map} +1 -1
- package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js +15 -0
- package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +1 -0
- package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js → Alert-MwVEymjy.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js.map → Alert-MwVEymjy.js.map} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-znhN8GTR.js → ArtifactsView-B-YUwZyb.js} +1 -1
- package/bizar-dash/dist/assets/{ArtifactsView-znhN8GTR.js.map → ArtifactsView-B-YUwZyb.js.map} +1 -1
- package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js → AuthView-LaQuGo4u.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js.map → AuthView-LaQuGo4u.js.map} +1 -1
- package/bizar-dash/dist/assets/{Avatar-B41upSD1.js → Avatar-Dg4OF4RD.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-B41upSD1.js.map → Avatar-Dg4OF4RD.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js → BackgroundJobsView-CO3DEG8R.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js.map → BackgroundJobsView-CO3DEG8R.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js → BackupView-Cjf23ZWc.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js.map → BackupView-Cjf23ZWc.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-rF59wHiO.js → Card-BmXiT4c6.js} +1 -1
- package/bizar-dash/dist/assets/{Card-rF59wHiO.js.map → Card-BmXiT4c6.js.map} +1 -1
- package/bizar-dash/dist/assets/ChatView-DXKFwvgp.js +9 -0
- package/bizar-dash/dist/assets/ChatView-DXKFwvgp.js.map +1 -0
- package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js → Chip-Dei66BLx.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js.map → Chip-Dei66BLx.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js → ClaudeSessionsView-D-YNmzKi.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js.map → ClaudeSessionsView-D-YNmzKi.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DdP6aVso.js → ClipboardView-BA323V2J.js} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DdP6aVso.js.map → ClipboardView-BA323V2J.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js → ConfigView-BMBgifw5.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js.map → ConfigView-BMBgifw5.js.map} +1 -1
- package/bizar-dash/dist/assets/DiagnosticsView-C0sdqhEl.js +2 -0
- package/bizar-dash/dist/assets/DiagnosticsView-C0sdqhEl.js.map +1 -0
- package/bizar-dash/dist/assets/{DialogsView-BcqDDCZQ.js → DialogsView-DzTnyX8K.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-BcqDDCZQ.js.map → DialogsView-DzTnyX8K.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js → DoctorView-CiFwRMW0.js} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js.map → DoctorView-CiFwRMW0.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js → EmptyState-CdDQmfEL.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js.map → EmptyState-CdDQmfEL.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js → EnvVarsView-CNO03NDJ.js} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js.map → EnvVarsView-CNO03NDJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js → ErrorState-BRvj8qZZ.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js.map → ErrorState-BRvj8qZZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-CpdFu_ID.js → EvalView-lgUhlGJh.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-CpdFu_ID.js.map → EvalView-lgUhlGJh.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js → GoalsView-DmkCCs9i.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js.map → GoalsView-DmkCCs9i.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js → Grid-BThCPJaV.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js.map → Grid-BThCPJaV.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js → HistoryView-Cn2cPiHZ.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js.map → HistoryView-Cn2cPiHZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-CZmRw5QX.js → Input-cAQOvR8U.js} +1 -1
- package/bizar-dash/dist/assets/{Input-CZmRw5QX.js.map → Input-cAQOvR8U.js.map} +1 -1
- package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +6 -0
- package/bizar-dash/dist/assets/{LibrariesView-B1YX9wzp.js.map → LibrariesView-Ca_PRjUm.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js → LightRAGView-CMk9wOae.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js.map → LightRAGView-CMk9wOae.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js → ListHeader-BLAeshe0.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js.map → ListHeader-BLAeshe0.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js → MemoryView-wo2Pu7xQ.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js.map → MemoryView-wo2Pu7xQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js → MessageBubble-CrCJ0SYG.js} +1 -1
- package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js.map → MessageBubble-CrCJ0SYG.js.map} +1 -1
- package/bizar-dash/dist/assets/{MiscView-DLNEGdML.js → MiscView-fBT1TOXC.js} +1 -1
- package/bizar-dash/dist/assets/{MiscView-DLNEGdML.js.map → MiscView-fBT1TOXC.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js → ModsView-CV_RxdzJ.js} +1 -1
- package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js.map → ModsView-CV_RxdzJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-DAm2O0yf.js → NotificationsView-BKAZLxM2.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-DAm2O0yf.js.map → NotificationsView-BKAZLxM2.js.map} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-Ci80gnwS.js → ObsidianView-C-AvHfpT.js} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-Ci80gnwS.js.map → ObsidianView-C-AvHfpT.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-rriw1GjA.js → OverviewView-CKYzZJe3.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-rriw1GjA.js.map → OverviewView-CKYzZJe3.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js → ProgressBar-ya2PCj8L.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js.map → ProgressBar-ya2PCj8L.js.map} +1 -1
- package/bizar-dash/dist/assets/ProjectsView-N9zqFZ_O.js +11 -0
- package/bizar-dash/dist/assets/ProjectsView-N9zqFZ_O.js.map +1 -0
- package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js → ProvidersView-BcL8jjwK.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js.map → ProvidersView-BcL8jjwK.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js → SchedulesView-8qxH3bg7.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js.map → SchedulesView-8qxH3bg7.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-0VcfTDeL.js → Select-D5AuVxxV.js} +1 -1
- package/bizar-dash/dist/assets/{Select-0VcfTDeL.js.map → Select-D5AuVxxV.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js → SettingsRow-BBALf9dA.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js.map → SettingsRow-BBALf9dA.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js → SettingsView-UD403neY.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js.map → SettingsView-UD403neY.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-BOProMs2.js → Sheet-CxXf6gvC.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-BOProMs2.js.map → Sheet-CxXf6gvC.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js → Slider-hvaVD_SW.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js.map → Slider-hvaVD_SW.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js → Sparkline-DqmQzdJH.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js.map → Sparkline-DqmQzdJH.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js → Switch-C-_zcNdl.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js.map → Switch-C-_zcNdl.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js → TasksView-DseftDlx.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js.map → TasksView-DseftDlx.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js → Textarea-CcQGSgSH.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js.map → Textarea-CcQGSgSH.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CEHW2nd6.js → UpdateView-B9Lh4svM.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-CEHW2nd6.js.map → UpdateView-B9Lh4svM.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js → UsageView-P5_pQ68d.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js.map → UsageView-P5_pQ68d.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js → ViewHeader-BaCWNuVX.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js.map → ViewHeader-BaCWNuVX.js.map} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CwrPwWgi.js → VoiceView-BwR9gm5e.js} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CwrPwWgi.js.map → VoiceView-BwR9gm5e.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-CwZt9Kta.js → brain-D6tAeUDE.js} +1 -1
- package/bizar-dash/dist/assets/{brain-CwZt9Kta.js.map → brain-D6tAeUDE.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js → calendar-BrMJf3vl.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js.map → calendar-BrMJf3vl.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js → circle-alert-D7jn06kH.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js.map → circle-alert-D7jn06kH.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js → circle-check-DHs37Sot.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js.map → circle-check-DHs37Sot.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js → circle-fPTATiOs.js} +1 -1
- package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js.map → circle-fPTATiOs.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-DEIuPV60.js → clock-E-G5aGua.js} +1 -1
- package/bizar-dash/dist/assets/{clock-DEIuPV60.js.map → clock-E-G5aGua.js.map} +1 -1
- package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js → cmdk-C3F6LD6N.js} +5 -5
- package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js.map → cmdk-C3F6LD6N.js.map} +1 -1
- package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js → dnd-kit-BAOLODOI.js} +1 -1
- package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js.map → dnd-kit-BAOLODOI.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-Clkq90Ct.js → download-DBkNb6oI.js} +1 -1
- package/bizar-dash/dist/assets/{download-Clkq90Ct.js.map → download-DBkNb6oI.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js → external-link-C4pHGbz2.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js.map → external-link-C4pHGbz2.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js → file-text-CEhDgLq2.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js.map → file-text-CEhDgLq2.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-BcbE37wP.js → filter-CEYjeWFX.js} +1 -1
- package/bizar-dash/dist/assets/{filter-BcbE37wP.js.map → filter-CEYjeWFX.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js → git-pull-request-Bo_wBZZw.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js.map → git-pull-request-Bo_wBZZw.js.map} +1 -1
- package/bizar-dash/dist/assets/{index-CASP1n-5.js → index-B1OIS316.js} +1 -1
- package/bizar-dash/dist/assets/{index-CASP1n-5.js.map → index-B1OIS316.js.map} +1 -1
- package/bizar-dash/dist/assets/{index-C4Vq_2LM.js → index-CR0TeJmc.js} +1 -1
- package/bizar-dash/dist/assets/{index-C4Vq_2LM.js.map → index-CR0TeJmc.js.map} +1 -1
- package/bizar-dash/dist/assets/main-BZMmD6a8.js +249 -0
- package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +1 -0
- package/bizar-dash/dist/assets/{main-CcQfRfIJ.css → main-DDAMz_H5.css} +1 -1
- package/bizar-dash/dist/assets/{network-DJdvVaHx.js → network-BsfwrUA-.js} +1 -1
- package/bizar-dash/dist/assets/{network-DJdvVaHx.js.map → network-BsfwrUA-.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-DUn9L5PB.js → pause-C8PN1_yO.js} +1 -1
- package/bizar-dash/dist/assets/{pause-DUn9L5PB.js.map → pause-C8PN1_yO.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js → pencil---XuvKlz.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js.map → pencil---XuvKlz.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-CZjsr3XM.js → play-fMLPTihK.js} +1 -1
- package/bizar-dash/dist/assets/{play-CZjsr3XM.js.map → play-fMLPTihK.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-BKuyIe5W.js → plug-CG8al2Kq.js} +1 -1
- package/bizar-dash/dist/assets/{plug-BKuyIe5W.js.map → plug-CG8al2Kq.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-77h62zZm.js → plus-uA5Ecuch.js} +1 -1
- package/bizar-dash/dist/assets/{plus-77h62zZm.js.map → plus-uA5Ecuch.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DLmx-gCP.js → power-DSUlNIuR.js} +1 -1
- package/bizar-dash/dist/assets/{power-DLmx-gCP.js.map → power-DSUlNIuR.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-BFKzHXic.js → power-off-1CAQsHHy.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-BFKzHXic.js.map → power-off-1CAQsHHy.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js → refresh-ccw-BL7B0NO1.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js.map → refresh-ccw-BL7B0NO1.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js → refresh-cw-CR9BzJik.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js.map → refresh-cw-CR9BzJik.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js → rotate-ccw-BtnitLfb.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js.map → rotate-ccw-BtnitLfb.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js → rotate-cw-CHgXCO7O.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js.map → rotate-cw-CHgXCO7O.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-Db1b-1Uq.js → save-RcZOXR0U.js} +1 -1
- package/bizar-dash/dist/assets/{save-Db1b-1Uq.js.map → save-RcZOXR0U.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-yz6HFZM5.js → send-Bg2X_ibk.js} +1 -1
- package/bizar-dash/dist/assets/{send-yz6HFZM5.js.map → send-Bg2X_ibk.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js → shield-alert-Dm48D034.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js.map → shield-alert-Dm48D034.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js → trash-2-B885GY46.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js.map → trash-2-B885GY46.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js → trending-up-CqUBvVxw.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js.map → trending-up-CqUBvVxw.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js → triangle-alert-DLmUhymD.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js.map → triangle-alert-DLmUhymD.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js → upload-C-oafpyE.js} +1 -1
- package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js.map → upload-C-oafpyE.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-5lAQBAPX.js → zap-O_4Ys_hh.js} +1 -1
- package/bizar-dash/dist/assets/{zap-5lAQBAPX.js.map → zap-O_4Ys_hh.js.map} +1 -1
- package/bizar-dash/dist/index.html +3 -3
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/web/v8/App.tsx +62 -2
- package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +4 -4
- package/bizar-dash/src/web/v8/shell/AppShell.tsx +38 -2
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +44 -33
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +5 -2
- package/bizar-dash/src/web/v8/ui/styles/globals.css +26 -0
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +26 -1
- package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +13 -1
- package/bizar-dash/src/web/v8/views/ClaudeSessions/NewSessionModal.tsx +136 -0
- package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +14 -4
- package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +50 -7
- package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +6 -1
- package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +21 -1
- package/bizar-dash/tests/admin-labels.test.mjs +42 -0
- package/bizar-dash/tests/agents-summary-sanitize.test.ts +51 -0
- package/bizar-dash/tests/chat-new-session.test.mjs +63 -0
- package/bizar-dash/tests/kanban-empty-column.test.mjs +56 -0
- package/bizar-dash/tests/library-dedupe.test.mjs +62 -0
- package/bizar-dash/tests/projects-filter.test.mjs +48 -0
- package/bizar-dash/tests/settings-labels.test.mjs +80 -0
- package/bizar-dash/tests/sidebar-responsive.test.tsx +48 -0
- package/bizar-dash/tests/sidebar-section-toggle.test.tsx +63 -0
- package/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js +0 -13
- package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js.map +0 -1
- package/bizar-dash/dist/assets/ChatView-CUriVEgU.js +0 -9
- package/bizar-dash/dist/assets/ChatView-CUriVEgU.js.map +0 -1
- package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js +0 -2
- package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js.map +0 -1
- package/bizar-dash/dist/assets/LibrariesView-B1YX9wzp.js +0 -6
- package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js +0 -11
- package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js.map +0 -1
- package/bizar-dash/dist/assets/main-Cxeu4LhG.js +0 -244
- package/bizar-dash/dist/assets/main-Cxeu4LhG.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Suspense, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Menu } from 'lucide-react';
|
|
2
3
|
import { AppShell } from './shell/AppShell.js';
|
|
3
4
|
import { Topbar } from './shell/Topbar.js';
|
|
4
5
|
import { Sidebar, type SidebarSection } from './shell/Sidebar.js';
|
|
@@ -139,6 +140,7 @@ function iconFor(id: string): LucideIcon {
|
|
|
139
140
|
|
|
140
141
|
export function App(): JSX.Element {
|
|
141
142
|
const [activeId, setActiveId] = useState<string>('overview');
|
|
143
|
+
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
|
142
144
|
const theme = useTheme();
|
|
143
145
|
const density = useDensity();
|
|
144
146
|
|
|
@@ -154,6 +156,36 @@ export function App(): JSX.Element {
|
|
|
154
156
|
mainRef.current?.focus({ preventScroll: true });
|
|
155
157
|
}, [activeId]);
|
|
156
158
|
|
|
159
|
+
// H6 — URL routing: sync activeId to/from window.location.hash.
|
|
160
|
+
// On mount, parse the hash (e.g. "#/tasks") and set activeId.
|
|
161
|
+
// On popstate (browser back/forward), re-parse and update.
|
|
162
|
+
// On every activeId change, push the new hash so deep links work.
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
const hash = window.location.hash;
|
|
165
|
+
if (hash.startsWith('#/')) {
|
|
166
|
+
const id = hash.slice(2);
|
|
167
|
+
if (id) setActiveId(id);
|
|
168
|
+
}
|
|
169
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps -- mount-only
|
|
170
|
+
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
const onPop = (): void => {
|
|
173
|
+
const hash = window.location.hash;
|
|
174
|
+
if (hash.startsWith('#/')) {
|
|
175
|
+
const id = hash.slice(2);
|
|
176
|
+
if (id) setActiveId(id);
|
|
177
|
+
} else {
|
|
178
|
+
setActiveId('overview');
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
window.addEventListener('popstate', onPop);
|
|
182
|
+
return () => window.removeEventListener('popstate', onPop);
|
|
183
|
+
}, []);
|
|
184
|
+
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
window.history.pushState(null, '', '#/' + activeId);
|
|
187
|
+
}, [activeId]);
|
|
188
|
+
|
|
157
189
|
// Live counts for the sidebar. Polled on mount + WS refresh.
|
|
158
190
|
const tasksRes = useFetch<{ tasks?: { id: string; status: string }[]; count?: number }>('/api/tasks');
|
|
159
191
|
const goalsRes = useFetch<{ goals?: { id: string }[]; count?: number }>('/api/goals');
|
|
@@ -288,6 +320,29 @@ export function App(): JSX.Element {
|
|
|
288
320
|
ref={mainRef}
|
|
289
321
|
topbar={
|
|
290
322
|
<Topbar
|
|
323
|
+
leading={
|
|
324
|
+
<button
|
|
325
|
+
type="button"
|
|
326
|
+
aria-label="Open navigation menu"
|
|
327
|
+
data-testid="mobile-menu-toggle"
|
|
328
|
+
onClick={() => setMobileMenuOpen(true)}
|
|
329
|
+
style={{
|
|
330
|
+
display: 'none',
|
|
331
|
+
alignItems: 'center',
|
|
332
|
+
justifyContent: 'center',
|
|
333
|
+
width: 32,
|
|
334
|
+
height: 32,
|
|
335
|
+
background: 'transparent',
|
|
336
|
+
border: '1px solid var(--border)',
|
|
337
|
+
borderRadius: 'var(--radius-sm)',
|
|
338
|
+
color: 'var(--fg-muted)',
|
|
339
|
+
cursor: 'pointer',
|
|
340
|
+
}}
|
|
341
|
+
className="mobile-menu-toggle"
|
|
342
|
+
>
|
|
343
|
+
<Menu size={16} aria-hidden="true" />
|
|
344
|
+
</button>
|
|
345
|
+
}
|
|
291
346
|
center={
|
|
292
347
|
<Inline align="center" gap={2}>
|
|
293
348
|
<button
|
|
@@ -330,9 +385,14 @@ export function App(): JSX.Element {
|
|
|
330
385
|
sections={sections}
|
|
331
386
|
defaultSections={false}
|
|
332
387
|
activeId={activeId}
|
|
333
|
-
onItemSelect={
|
|
388
|
+
onItemSelect={(id) => {
|
|
389
|
+
handleNavigate(id);
|
|
390
|
+
setMobileMenuOpen(false);
|
|
391
|
+
}}
|
|
334
392
|
/>
|
|
335
393
|
}
|
|
394
|
+
mobileMenuOpen={mobileMenuOpen}
|
|
395
|
+
onMobileMenuClose={() => setMobileMenuOpen(false)}
|
|
336
396
|
>
|
|
337
397
|
<Suspense fallback={<PageSkeleton />}>{view}</Suspense>
|
|
338
398
|
<AppCommandPalette
|
|
@@ -342,4 +402,4 @@ export function App(): JSX.Element {
|
|
|
342
402
|
/>
|
|
343
403
|
</AppShell>
|
|
344
404
|
);
|
|
345
|
-
}
|
|
405
|
+
}
|
|
@@ -92,17 +92,17 @@ describe('S38 ChatView', () => {
|
|
|
92
92
|
expect(await screen.findByTestId('chat-bubble-assistant')).toBeTruthy();
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
it('
|
|
96
|
-
|
|
95
|
+
it('opens the New session modal on `+ New session` click', async () => {
|
|
96
|
+
installFetchMock([
|
|
97
97
|
[/^\/api\/chat(\?|$)/, () => jsonResponse(200, { messages: [], sessions: [] })],
|
|
98
98
|
[/^\/api\/chat\/sessions/, () => jsonResponse(200, { sessions: [] })],
|
|
99
99
|
]);
|
|
100
100
|
render(<ChatView />);
|
|
101
101
|
const create = await screen.findByTestId('chat-create-session');
|
|
102
102
|
fireEvent.click(create);
|
|
103
|
+
// Modal should open with title "New Claude session"
|
|
103
104
|
await waitFor(() => {
|
|
104
|
-
|
|
105
|
-
expect(hit).toBeTruthy();
|
|
105
|
+
expect(screen.getByText('New Claude session')).toBeTruthy();
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { forwardRef, type ReactNode } from 'react';
|
|
2
|
+
import * as RxDialog from '@radix-ui/react-dialog';
|
|
2
3
|
import { Box } from '../ui/primitives/Box.js';
|
|
3
4
|
import { Topbar } from './Topbar.js';
|
|
4
5
|
import { Sidebar } from './Sidebar.js';
|
|
@@ -27,11 +28,14 @@ import { Sidebar } from './Sidebar.js';
|
|
|
27
28
|
export interface AppShellProps {
|
|
28
29
|
topbar?: ReactNode;
|
|
29
30
|
sidebar?: ReactNode;
|
|
31
|
+
/** Controls the mobile sidebar drawer (open/close). */
|
|
32
|
+
mobileMenuOpen?: boolean;
|
|
33
|
+
onMobileMenuClose?: () => void;
|
|
30
34
|
children?: ReactNode;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
export const AppShell = forwardRef<HTMLElement, AppShellProps>(function AppShell(
|
|
34
|
-
{ topbar, sidebar, children },
|
|
38
|
+
{ topbar, sidebar, mobileMenuOpen, onMobileMenuClose, children },
|
|
35
39
|
ref,
|
|
36
40
|
) {
|
|
37
41
|
return (
|
|
@@ -55,7 +59,39 @@ export const AppShell = forwardRef<HTMLElement, AppShellProps>(function AppShell
|
|
|
55
59
|
minHeight: 0, // critical: lets the body actually scroll instead of expanding
|
|
56
60
|
}}
|
|
57
61
|
>
|
|
58
|
-
{sidebar
|
|
62
|
+
{/* Desktop sidebar — always present at >=768px */}
|
|
63
|
+
<Box className="v8-desktop-sidebar" style={{ flexShrink: 0 }}>
|
|
64
|
+
{sidebar ?? <Sidebar />}
|
|
65
|
+
</Box>
|
|
66
|
+
|
|
67
|
+
{/* Mobile sidebar drawer — shown via Dialog overlay on <768px */}
|
|
68
|
+
<RxDialog.Root open={mobileMenuOpen} onOpenChange={(open) => { if (!open) onMobileMenuClose?.(); }}>
|
|
69
|
+
<RxDialog.Portal>
|
|
70
|
+
<RxDialog.Overlay
|
|
71
|
+
className="v8-mobile-sidebar-overlay"
|
|
72
|
+
style={{
|
|
73
|
+
position: 'fixed',
|
|
74
|
+
inset: 0,
|
|
75
|
+
background: 'oklch(0 0 0 / 0.4)',
|
|
76
|
+
zIndex: 'var(--z-modal)',
|
|
77
|
+
}}
|
|
78
|
+
/>
|
|
79
|
+
<RxDialog.Content
|
|
80
|
+
className="v8-mobile-sidebar"
|
|
81
|
+
aria-label="Navigation"
|
|
82
|
+
style={{
|
|
83
|
+
position: 'fixed',
|
|
84
|
+
top: 0,
|
|
85
|
+
left: 0,
|
|
86
|
+
bottom: 0,
|
|
87
|
+
width: 'var(--sidebar-w)',
|
|
88
|
+
zIndex: 'calc(var(--z-modal) + 1)',
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
{sidebar ?? <Sidebar />}
|
|
92
|
+
</RxDialog.Content>
|
|
93
|
+
</RxDialog.Portal>
|
|
94
|
+
</RxDialog.Root>
|
|
59
95
|
|
|
60
96
|
<Box
|
|
61
97
|
as="main"
|
|
@@ -359,44 +359,54 @@ function SidebarSectionView({
|
|
|
359
359
|
return (
|
|
360
360
|
<Stack gap={1} data-sidebar-section={section.id}>
|
|
361
361
|
{!collapsed && (
|
|
362
|
-
<
|
|
363
|
-
type="button"
|
|
364
|
-
onClick={toggle}
|
|
365
|
-
aria-expanded={sectionOpen}
|
|
366
|
-
aria-controls={`sidebar-section-${section.id}`}
|
|
367
|
-
data-testid={`sidebar-section-toggle-${section.id}`}
|
|
368
|
-
style={{
|
|
369
|
-
display: 'flex',
|
|
370
|
-
alignItems: 'center',
|
|
371
|
-
justifyContent: 'space-between',
|
|
372
|
-
gap: 'var(--space-2)',
|
|
373
|
-
padding: 'var(--space-1) var(--space-3)',
|
|
374
|
-
background: 'transparent',
|
|
375
|
-
border: 0,
|
|
376
|
-
fontSize: 'var(--fs-12)',
|
|
377
|
-
fontWeight: 600,
|
|
378
|
-
color: 'var(--fg-subtle)',
|
|
379
|
-
letterSpacing: 'var(--tracking-wide)',
|
|
380
|
-
textTransform: 'uppercase',
|
|
381
|
-
cursor: 'pointer',
|
|
382
|
-
width: '100%',
|
|
383
|
-
textAlign: 'left',
|
|
384
|
-
}}
|
|
385
|
-
>
|
|
386
|
-
<span>{section.label}</span>
|
|
362
|
+
<div role="presentation" style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>
|
|
387
363
|
<span
|
|
388
|
-
aria-hidden="true"
|
|
389
|
-
data-testid={`sidebar-section-chevron-${section.id}`}
|
|
390
364
|
style={{
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
365
|
+
fontSize: 'var(--fs-12)',
|
|
366
|
+
fontWeight: 600,
|
|
367
|
+
color: 'var(--fg-subtle)',
|
|
368
|
+
letterSpacing: 'var(--tracking-wide)',
|
|
369
|
+
textTransform: 'uppercase',
|
|
370
|
+
flex: 1,
|
|
371
|
+
padding: 'var(--space-1) var(--space-3)',
|
|
395
372
|
}}
|
|
396
373
|
>
|
|
397
|
-
|
|
374
|
+
{section.label}
|
|
398
375
|
</span>
|
|
399
|
-
|
|
376
|
+
<button
|
|
377
|
+
type="button"
|
|
378
|
+
onClick={toggle}
|
|
379
|
+
aria-expanded={sectionOpen}
|
|
380
|
+
aria-controls={`sidebar-section-${section.id}`}
|
|
381
|
+
data-section-toggle={section.id}
|
|
382
|
+
data-testid={`sidebar-section-toggle-${section.id}`}
|
|
383
|
+
style={{
|
|
384
|
+
display: 'inline-flex',
|
|
385
|
+
alignItems: 'center',
|
|
386
|
+
justifyContent: 'center',
|
|
387
|
+
width: 20,
|
|
388
|
+
height: 20,
|
|
389
|
+
background: 'transparent',
|
|
390
|
+
border: 0,
|
|
391
|
+
color: 'var(--fg-subtle)',
|
|
392
|
+
cursor: 'pointer',
|
|
393
|
+
padding: 0,
|
|
394
|
+
}}
|
|
395
|
+
>
|
|
396
|
+
<span
|
|
397
|
+
aria-hidden="true"
|
|
398
|
+
data-testid={`sidebar-section-chevron-${section.id}`}
|
|
399
|
+
style={{
|
|
400
|
+
display: 'inline-block',
|
|
401
|
+
transition: 'transform var(--motion-fast) var(--ease-out)',
|
|
402
|
+
transform: sectionOpen ? 'rotate(90deg)' : 'rotate(0deg)',
|
|
403
|
+
fontSize: 10,
|
|
404
|
+
}}
|
|
405
|
+
>
|
|
406
|
+
▸
|
|
407
|
+
</span>
|
|
408
|
+
</button>
|
|
409
|
+
</div>
|
|
400
410
|
)}
|
|
401
411
|
{sectionOpen && (
|
|
402
412
|
<div id={`sidebar-section-${section.id}`} role="group" aria-label={section.label}>
|
|
@@ -435,6 +445,7 @@ function SidebarItemView({
|
|
|
435
445
|
aria-label={item.label}
|
|
436
446
|
title={collapsed ? item.label : undefined}
|
|
437
447
|
data-sidebar-item={item.id}
|
|
448
|
+
data-nav-item={item.id}
|
|
438
449
|
className={cx('v8-sidebar-item', active && 'is-active')}
|
|
439
450
|
style={{
|
|
440
451
|
display: 'flex',
|
|
@@ -28,6 +28,8 @@ import { fetchJson, FetchError } from '../data/fetcher.js';
|
|
|
28
28
|
|
|
29
29
|
export interface TopbarProps {
|
|
30
30
|
brand?: ReactNode;
|
|
31
|
+
/** Leading slot — renders before brand (hamburger on mobile). */
|
|
32
|
+
leading?: ReactNode;
|
|
31
33
|
center?: ReactNode;
|
|
32
34
|
/** Right-aligned action cluster. */
|
|
33
35
|
actions?: ReactNode;
|
|
@@ -35,7 +37,7 @@ export interface TopbarProps {
|
|
|
35
37
|
status?: ReactNode;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
export function Topbar({ brand, center, actions, status }: TopbarProps): JSX.Element {
|
|
40
|
+
export function Topbar({ leading, brand, center, actions, status }: TopbarProps): JSX.Element {
|
|
39
41
|
return (
|
|
40
42
|
<Box
|
|
41
43
|
as="header"
|
|
@@ -51,8 +53,9 @@ export function Topbar({ brand, center, actions, status }: TopbarProps): JSX.Ele
|
|
|
51
53
|
}}
|
|
52
54
|
>
|
|
53
55
|
<Inline align="center" justify="between" gap={4} style={{ height: '100%' }}>
|
|
54
|
-
{/* left: brand */}
|
|
56
|
+
{/* left: leading (hamburger) + brand */}
|
|
55
57
|
<Cluster align="center" gap={3}>
|
|
58
|
+
{leading}
|
|
56
59
|
{brand ?? <BrandPlaceholder />}
|
|
57
60
|
</Cluster>
|
|
58
61
|
|
|
@@ -103,6 +103,32 @@ h4 {
|
|
|
103
103
|
font-weight: var(--fw-medium);
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
/* ── mobile sidebar (C2 — < 768px) ─────────────────────────────────── */
|
|
107
|
+
@media (max-width: 767px) {
|
|
108
|
+
/* Desktop sidebar hidden on mobile */
|
|
109
|
+
.v8-desktop-sidebar {
|
|
110
|
+
display: none;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Show hamburger button on mobile */
|
|
114
|
+
.mobile-menu-toggle {
|
|
115
|
+
display: inline-flex !important;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@media (min-width: 768px) {
|
|
120
|
+
/* Mobile sidebar hidden on desktop */
|
|
121
|
+
.v8-mobile-sidebar,
|
|
122
|
+
.v8-mobile-sidebar-overlay {
|
|
123
|
+
display: none !important;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Hide hamburger on desktop */
|
|
127
|
+
.mobile-menu-toggle {
|
|
128
|
+
display: none !important;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
106
132
|
/* ── a11y helpers (see VisuallyHidden primitive) ────────────────────── */
|
|
107
133
|
.sr-only {
|
|
108
134
|
position: absolute;
|
|
@@ -21,6 +21,31 @@ import type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';
|
|
|
21
21
|
import { AlertTriangle, Bot, Cpu, Pause, Play, Plus, RotateCw } from 'lucide-react';
|
|
22
22
|
import { AgentHierarchy } from './AgentHierarchy.js';
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Strip leaked LLM interior monologue from agent card snippets.
|
|
26
|
+
* Clips to the first sentence, caps at 140 chars.
|
|
27
|
+
*/
|
|
28
|
+
export function sanitizeSummary(raw: string | undefined): string {
|
|
29
|
+
if (!raw) return '';
|
|
30
|
+
let s = raw.replace(/<thinking>[\s\S]*?<\/thinking>/gi, '');
|
|
31
|
+
s = s.split('\n').filter((l) => !l.includes('```')).join('\n');
|
|
32
|
+
s = s.replace(/\bworktree:\s*/g, '');
|
|
33
|
+
s = s.replace(/\/tmp\//g, '');
|
|
34
|
+
s = s.replace(/\bReason:\s*/g, '');
|
|
35
|
+
s = s.replace(/^\s*→\s*/gm, '');
|
|
36
|
+
s = s.trim();
|
|
37
|
+
if (!s) return '';
|
|
38
|
+
// Strip leading bracketed prefix — [Premise — …] or [Analysis] etc.
|
|
39
|
+
s = s.replace(/^\[[\w\s]+[-—]\s*/, '');
|
|
40
|
+
s = s.replace(/^\[[\w\s]+\]\s*/gi, '');
|
|
41
|
+
s = s.trim();
|
|
42
|
+
if (!s) return '';
|
|
43
|
+
const m = s.match(/^[^.!?\n]+[.!?]/);
|
|
44
|
+
const first = m ? m[0] : s;
|
|
45
|
+
if (first.length <= 140) return first;
|
|
46
|
+
return first.slice(0, 137) + '…';
|
|
47
|
+
}
|
|
48
|
+
|
|
24
49
|
const SOURCE_STORAGE_KEY = 'bizar.agents.sourceFilter';
|
|
25
50
|
const SOURCE_LABELS = {
|
|
26
51
|
all: 'All',
|
|
@@ -94,7 +119,7 @@ function mapCC(a: CCAgent): AgentCardProps {
|
|
|
94
119
|
name: a.name || a.sessionId?.slice(0, 8) || 'unknown',
|
|
95
120
|
role: a.kind === 'background' ? 'CC background' : 'CC interactive',
|
|
96
121
|
status,
|
|
97
|
-
currentTask: a.lastMessageSnippet
|
|
122
|
+
currentTask: sanitizeSummary(a.lastMessageSnippet),
|
|
98
123
|
lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),
|
|
99
124
|
tasksToday: a.messageCount || 0,
|
|
100
125
|
// CC agents don't expose successRate/tasksSucceeded — only messageCount.
|
|
@@ -26,6 +26,7 @@ import { fetchJson, FetchError } from '../../data/fetcher.js';
|
|
|
26
26
|
import { MessageBubble, EmptyTranscript } from '../../ui/chat/MessageBubble.js';
|
|
27
27
|
import { readEventStream } from '../../ui/chat/EventStream.js';
|
|
28
28
|
import type { ChatMessage, ChatSession, WsMessage } from '../../data/types.js';
|
|
29
|
+
import { NewSessionModal } from '../ClaudeSessions/NewSessionModal.js';
|
|
29
30
|
|
|
30
31
|
interface ChatPayload {
|
|
31
32
|
messages: ChatMessage[];
|
|
@@ -55,6 +56,7 @@ export function ChatView(): JSX.Element {
|
|
|
55
56
|
const [busy, setBusy] = useState<boolean>(false);
|
|
56
57
|
const [error, setError] = useState<string | null>(null);
|
|
57
58
|
const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);
|
|
59
|
+
const [newSessionOpen, setNewSessionOpen] = useState<boolean>(false);
|
|
58
60
|
|
|
59
61
|
// Seed active session from the first row in the response.
|
|
60
62
|
useEffect(() => {
|
|
@@ -198,7 +200,7 @@ export function ChatView(): JSX.Element {
|
|
|
198
200
|
<Button variant="ghost" onClick={() => void audit()} data-testid="chat-audit">
|
|
199
201
|
<ShieldCheck size={14} aria-hidden /> Audit
|
|
200
202
|
</Button>
|
|
201
|
-
<Button variant="primary" onClick={() =>
|
|
203
|
+
<Button variant="primary" onClick={() => setNewSessionOpen(true)} data-testid="chat-create-session">
|
|
202
204
|
<MessageSquarePlus size={14} aria-hidden /> New session
|
|
203
205
|
</Button>
|
|
204
206
|
</Inline>
|
|
@@ -351,6 +353,16 @@ export function ChatView(): JSX.Element {
|
|
|
351
353
|
</CardBody>
|
|
352
354
|
</Card>
|
|
353
355
|
</Inline>
|
|
356
|
+
|
|
357
|
+
<NewSessionModal
|
|
358
|
+
open={newSessionOpen}
|
|
359
|
+
onOpenChange={setNewSessionOpen}
|
|
360
|
+
onCreated={(id) => {
|
|
361
|
+
setActiveId(id);
|
|
362
|
+
void payload.refetch();
|
|
363
|
+
void sessionsPayload.refetch();
|
|
364
|
+
}}
|
|
365
|
+
/>
|
|
354
366
|
</Stack>
|
|
355
367
|
);
|
|
356
368
|
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NewSessionModal — shared new-session Sheet, extracted from
|
|
3
|
+
* ClaudeSessionsView so ChatView can reuse the same form.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import { Stack } from '../../ui/primitives/Stack.js';
|
|
8
|
+
import { Inline } from '../../ui/primitives/Inline.js';
|
|
9
|
+
import { Button } from '../../ui/controls/Button.js';
|
|
10
|
+
import { Input } from '../../ui/controls/Input.js';
|
|
11
|
+
import { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';
|
|
12
|
+
import { fetchJson, FetchError } from '../../data/fetcher.js';
|
|
13
|
+
|
|
14
|
+
interface NewSessionModalProps {
|
|
15
|
+
open: boolean;
|
|
16
|
+
onOpenChange: (open: boolean) => void;
|
|
17
|
+
onCreated: (id: string) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function NewSessionModal({ open, onOpenChange, onCreated }: NewSessionModalProps): JSX.Element {
|
|
21
|
+
return (
|
|
22
|
+
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
23
|
+
<SheetContent side="right" title="New Claude session" description="Spawn a Claude Code session via the runner.">
|
|
24
|
+
<NewSessionForm
|
|
25
|
+
onCreated={(id) => {
|
|
26
|
+
onOpenChange(false);
|
|
27
|
+
onCreated(id);
|
|
28
|
+
}}
|
|
29
|
+
onCancel={() => onOpenChange(false)}
|
|
30
|
+
/>
|
|
31
|
+
</SheetContent>
|
|
32
|
+
</Sheet>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface NewSessionFormProps {
|
|
37
|
+
onCreated: (id: string) => void;
|
|
38
|
+
onCancel: () => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function NewSessionForm({ onCreated, onCancel }: NewSessionFormProps): JSX.Element {
|
|
42
|
+
const [title, setTitle] = useState<string>('');
|
|
43
|
+
const [agent, setAgent] = useState<string>('general');
|
|
44
|
+
const [prompt, setPrompt] = useState<string>('');
|
|
45
|
+
const [directory, setDirectory] = useState<string>('');
|
|
46
|
+
const [busy, setBusy] = useState<boolean>(false);
|
|
47
|
+
const [error, setError] = useState<string | null>(null);
|
|
48
|
+
|
|
49
|
+
const submit = async (): Promise<void> => {
|
|
50
|
+
if (!agent.trim() || !prompt.trim() || busy) return;
|
|
51
|
+
setBusy(true);
|
|
52
|
+
setError(null);
|
|
53
|
+
try {
|
|
54
|
+
const res = await fetchJson<{ id: string }>('/api/claude-sessions/new', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
body: {
|
|
57
|
+
title: title.trim() || null,
|
|
58
|
+
agent: agent.trim(),
|
|
59
|
+
prompt: prompt.trim(),
|
|
60
|
+
directory: directory.trim() || undefined,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
onCreated(res.id);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
setError(err instanceof FetchError ? err.message : (err as Error).message);
|
|
66
|
+
} finally {
|
|
67
|
+
setBusy(false);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<Stack gap={3} style={{ padding: 'var(--space-4)' }}>
|
|
73
|
+
<label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
|
|
74
|
+
<span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>
|
|
75
|
+
<Input
|
|
76
|
+
value={title}
|
|
77
|
+
data-testid="claude-sessions-new-title"
|
|
78
|
+
onChange={(e) => setTitle((e.target as HTMLInputElement).value)}
|
|
79
|
+
/>
|
|
80
|
+
</label>
|
|
81
|
+
<label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
|
|
82
|
+
<span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>
|
|
83
|
+
<Input
|
|
84
|
+
value={agent}
|
|
85
|
+
data-testid="claude-sessions-new-agent"
|
|
86
|
+
onChange={(e) => setAgent((e.target as HTMLInputElement).value)}
|
|
87
|
+
/>
|
|
88
|
+
</label>
|
|
89
|
+
<label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
|
|
90
|
+
<span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Seed prompt</span>
|
|
91
|
+
<textarea
|
|
92
|
+
value={prompt}
|
|
93
|
+
rows={4}
|
|
94
|
+
data-testid="claude-sessions-new-prompt"
|
|
95
|
+
onChange={(e) => setPrompt(e.target.value)}
|
|
96
|
+
style={{
|
|
97
|
+
background: 'var(--surface-0)',
|
|
98
|
+
border: '1px solid var(--border)',
|
|
99
|
+
borderRadius: 'var(--radius-md)',
|
|
100
|
+
padding: 'var(--space-2)',
|
|
101
|
+
color: 'var(--fg)',
|
|
102
|
+
fontFamily: 'var(--font-sans)',
|
|
103
|
+
fontSize: 'var(--fs-13)',
|
|
104
|
+
resize: 'vertical',
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
</label>
|
|
108
|
+
<label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
|
|
109
|
+
<span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Working directory (optional)</span>
|
|
110
|
+
<Input
|
|
111
|
+
value={directory}
|
|
112
|
+
data-testid="claude-sessions-new-directory"
|
|
113
|
+
onChange={(e) => setDirectory((e.target as HTMLInputElement).value)}
|
|
114
|
+
/>
|
|
115
|
+
</label>
|
|
116
|
+
{error !== null && (
|
|
117
|
+
<span role="alert" data-testid="claude-sessions-new-error" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>
|
|
118
|
+
{error}
|
|
119
|
+
</span>
|
|
120
|
+
)}
|
|
121
|
+
<Inline justify="end" gap={2}>
|
|
122
|
+
<SheetClose asChild>
|
|
123
|
+
<Button variant="ghost" onClick={onCancel} data-testid="claude-sessions-new-cancel">Cancel</Button>
|
|
124
|
+
</SheetClose>
|
|
125
|
+
<Button
|
|
126
|
+
variant="primary"
|
|
127
|
+
onClick={() => void submit()}
|
|
128
|
+
disabled={busy || !agent.trim() || !prompt.trim()}
|
|
129
|
+
data-testid="claude-sessions-new-submit"
|
|
130
|
+
>
|
|
131
|
+
Create
|
|
132
|
+
</Button>
|
|
133
|
+
</Inline>
|
|
134
|
+
</Stack>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
@@ -110,6 +110,14 @@ interface Project {
|
|
|
110
110
|
cwd?: string;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
/** Mirror of ProjectsView.isTestProject — keeps test projects out of the palette. */
|
|
114
|
+
function isTestProject(p: Project): boolean {
|
|
115
|
+
return (
|
|
116
|
+
/^(bizar-(e2e|real-env|admin)|bh-(cold-boot|walk-proj))/.test(p.id) ||
|
|
117
|
+
(p.name != null && p.name === p.id)
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
113
121
|
async function spawnAgent(
|
|
114
122
|
kind: string,
|
|
115
123
|
onToast?: AppCommandPaletteProps['onToast'],
|
|
@@ -197,10 +205,12 @@ export function AppCommandPalette(props: AppCommandPaletteProps): JSX.Element {
|
|
|
197
205
|
void newTask(title, onToast);
|
|
198
206
|
};
|
|
199
207
|
|
|
200
|
-
const projectItems: NavItem[] = projects
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
208
|
+
const projectItems: NavItem[] = projects
|
|
209
|
+
.filter((p) => !isTestProject(p))
|
|
210
|
+
.map((p) => ({
|
|
211
|
+
id: `project:${p.id}`,
|
|
212
|
+
label: `Switch to ${p.name || p.id}`,
|
|
213
|
+
}));
|
|
204
214
|
|
|
205
215
|
return (
|
|
206
216
|
<Dialog open={open} onOpenChange={onOpenChange}>
|