@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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import{j as e,r as c}from"./cmdk-C3F6LD6N.js";import{c as ie,B as L,A as te,g as ye,S as A,I as $,d as E,u as _,h as U,i as J,a as se,C as xe,b as je,j as be,F as q}from"./main-BZMmD6a8.js";import{G as re}from"./Grid-BThCPJaV.js";import{C as ke,V as Se}from"./ViewHeader-BaCWNuVX.js";import{L as we}from"./ListHeader-BLAeshe0.js";import{A as oe,G as Ce,B as ze}from"./Avatar-Dg4OF4RD.js";import{P as Re}from"./ProgressBar-ya2PCj8L.js";import{Z as Te}from"./zap-O_4Ys_hh.js";import{S as le,a as de}from"./Sheet-CxXf6gvC.js";import{T as $e}from"./Textarea-CcQGSgSH.js";import{C as ce,b as ue}from"./Card-BmXiT4c6.js";import{P as ge}from"./play-fMLPTihK.js";import{P as ae}from"./pause-C8PN1_yO.js";import{R as Ie}from"./refresh-cw-CR9BzJik.js";import{S as Ee}from"./send-Bg2X_ibk.js";import{R as fe}from"./rotate-cw-CHgXCO7O.js";import{C as X}from"./Chip-Dei66BLx.js";import{E as Ae}from"./ErrorState-BRvj8qZZ.js";import{I as ne}from"./Input-cAQOvR8U.js";import{E as Me}from"./EmptyState-CdDQmfEL.js";import{N as Le}from"./network-BsfwrUA-.js";import{P as Oe}from"./plus-uA5Ecuch.js";import{T as Pe}from"./triangle-alert-DLmUhymD.js";import"./Alert-MwVEymjy.js";import"./circle-alert-D7jn06kH.js";import"./circle-check-DHs37Sot.js";import"./refresh-ccw-BL7B0NO1.js";/**
|
|
2
|
+
* @license lucide-react v0.460.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Be=ie("ClipboardCopy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]);/**
|
|
7
|
+
* @license lucide-react v0.460.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Ne=ie("Octagon",[["path",{d:"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z",key:"2d38gg"}]]),De={idle:"Idle",busy:"Busy",error:"Error",paused:"Paused"},Fe={idle:"neutral",busy:"info",error:"danger",paused:"neutral"},Ue={idle:"var(--fg-subtle)",busy:"var(--info)",error:"var(--danger)",paused:"var(--warning)"};function He(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const s=Math.max(0,Date.now()-t),r=Math.floor(s/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const l=Math.floor(n/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`}function We(t){return t>=.8?"success":t>=.5?"warning":"danger"}function Je(t){return typeof t!="number"||!Number.isFinite(t)||t<=0?"neutral":(Date.now()-t)/864e5>1?"danger":"neutral"}function _e(t){const{name:s,role:r,status:n,lastActivity:l,currentTask:f,tasksToday:i,tasksSucceeded:w,tasksTotal:h,successRate:v,lastSeenMs:k,onOpen:R,badges:b,className:m}=t,u=typeof w=="number"&&typeof h=="number"||typeof v=="number"||typeof k=="number";return e.jsxs("button",{type:"button",onClick:R,className:ye("v8-agent-card",`v8-agent-card--${n}`,m),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[e.jsx(oe,{name:s,status:n==="busy"||n==="error"?"busy":n==="idle"?"online":"away"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:s}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:r})]}),e.jsx(L,{tone:Fe[n],dot:!0,children:De[n]})]}),f!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-2) var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},title:f,children:f}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[l!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(te,{size:12,"aria-hidden":"true",style:{color:Ue[n]}}),l]}),i!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(Te,{size:12,"aria-hidden":"true"}),i," today"]})]}),u&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-2)"},children:[typeof w=="number"&&typeof h=="number"&&h>0&&e.jsxs("div",{"data-testid":"agent-card-tasks",style:{display:"flex",flexDirection:"column",gap:2},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"tasks"}),e.jsxs("code",{style:{fontFamily:"var(--font-mono)",color:"var(--fg)"},children:[w," / ",h]})]}),e.jsx(Re,{value:w,max:h,tone:"accent",height:4})]}),typeof v=="number"&&e.jsxs("div",{"data-testid":"agent-card-success",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"success"}),e.jsxs(L,{"data-testid":"agent-card-success-badge",tone:We(v),children:[Math.round(v*100),"% success"]})]}),typeof k=="number"&&e.jsxs("div",{"data-testid":"agent-card-lastseen",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"last seen"}),e.jsx(L,{"data-testid":"agent-card-lastseen-badge",tone:Je(k),children:He(k)})]})]}),b!==void 0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:b}),e.jsx("style",{children:`
|
|
12
|
+
.v8-agent-card:hover { border-color: var(--accent); }
|
|
13
|
+
`})]})}const ee=500;function Ke(t){const{sessionId:s,paused:r}=t,[n,l]=c.useState([]),[f,i]=c.useState("connecting"),[w,h]=c.useState(null),[v,k]=c.useState(!1),[R,b]=c.useState(!0),m=c.useRef(null),u=c.useRef(null);c.useEffect(()=>{if(r||v){u.current&&(u.current.close(),u.current=null),i("paused");return}if(typeof window>"u"||typeof EventSource>"u"){i("error"),h("EventSource not available in this environment.");return}i("connecting"),h(null);const o=`/api/agent-stream/live?sessionId=${encodeURIComponent(s)}`,p=new EventSource(o);u.current=p;const I=x=>{try{const C=JSON.parse(x.data);Array.isArray(C.events)&&l(C.events.slice(-ee)),i("live")}catch{}},O=x=>{try{const C=JSON.parse(x.data);l(B=>{const N=B.length>=ee?B.slice(B.length-ee+1):B.slice();return N.push(C),N}),i("live")}catch{}},T=x=>{try{const C=JSON.parse(x.data);i("closed"),h(C.reason?`Stream ended: ${C.reason}`:null)}catch{}},P=x=>{try{const C=JSON.parse(x.data);i("error"),h(C.error||"stream error")}catch{}};return p.addEventListener("snapshot",I),p.addEventListener("event",O),p.addEventListener("agent:event",O),p.addEventListener("end",T),p.addEventListener("error",P),p.onerror=()=>{i("error"),h("Connection dropped. Click Retry to reconnect.")},()=>{p.close(),u.current=null}},[s,r,v]),c.useEffect(()=>{if(!R||!m.current)return;const o=m.current;o.scrollTop=o.scrollHeight},[n,R]);const S=(o,p)=>{var P,x,C;const I=o.role==="user"?"user":o.role==="assistant"?"assistant":(P=o.tool)!=null&&P.name?"tool":"system",O=(x=o.tool)!=null&&x.name?`${o.tool.name}`:o.role?o.role:o.type||"event",T=typeof o.content=="string"?o.content:(C=o.tool)!=null&&C.input?JSON.stringify(o.tool.input).slice(0,240):typeof o.message=="string"?o.message:o.result?JSON.stringify(o.result).slice(0,240):JSON.stringify(o).slice(0,240);return e.jsxs("div",{style:{padding:"4px 8px",borderRadius:"var(--radius-sm)",background:I==="user"?"color-mix(in oklch, var(--accent) 8%, var(--surface-0))":I==="tool"?"color-mix(in oklch, var(--warning) 8%, var(--surface-0))":I==="system"?"var(--surface-1)":"var(--surface-0)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsxs("span",{style:{color:"var(--fg-muted)"},children:[O,": "]}),e.jsx("span",{style:{color:"var(--fg)"},children:T})]},p)};return e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",justify:"between",children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx("span",{"aria-hidden":!0,style:{width:8,height:8,borderRadius:"50%",background:f==="live"?"var(--success)":f==="connecting"?"var(--warning)":f==="paused"||f==="closed"?"var(--fg-muted)":"var(--danger)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[f==="live"?"Live":f==="connecting"?"Connecting…":f==="paused"?"Paused":f==="closed"?"Closed":"Error"," · ",n.length," events"]})]}),e.jsxs($,{align:"center",gap:1,children:[e.jsx(E,{variant:"ghost",onClick:()=>k(o=>!o),title:v?"Resume stream":"Pause stream","aria-label":v?"Resume stream":"Pause stream",children:v?e.jsx(ge,{size:12,"aria-hidden":!0}):e.jsx(ae,{size:12,"aria-hidden":!0})}),e.jsx(E,{variant:"ghost",onClick:()=>l([]),title:"Clear buffer","aria-label":"Clear output",children:"Clear"}),e.jsxs(E,{variant:"ghost",onClick:()=>{l([]),k(!1)},title:"Reconnect","aria-label":"Reconnect stream",children:[e.jsx(Ie,{size:12,"aria-hidden":!0})," Retry"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--fs-12)",color:"var(--fg-muted)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:R,onChange:o=>b(o.target.checked)}),"follow"]})]})]}),w!==null&&e.jsx("div",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:w}),e.jsx("div",{ref:m,onScroll:o=>{const p=o.currentTarget,I=p.scrollHeight-p.scrollTop-p.clientHeight<20;b(I)},style:{maxHeight:280,minHeight:120,overflowY:"auto",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",display:"flex",flexDirection:"column",gap:4,background:"var(--surface-1)"},role:"log","aria-live":"polite","aria-label":"Agent live output",children:n.length===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:f==="connecting"?"Connecting to agent stream…":"No events yet."}):n.map(S)})]})}function Ve(t){return t.startsWith("bizar:")?{source:"bizar",key:t.slice(6)}:t.startsWith("cc:")?{source:"claude-code",key:t.slice(3)}:{source:"bizar",key:t}}function Ge(t){const{agentId:s,name:r,role:n,status:l,currentTask:f,open:i,onOpenChange:w,startedAt:h,messageCount:v,lastMessageSnippet:k,successRate:R,tasksTotal:b}=t,{source:m,key:u}=Ve(s),[S,o]=c.useState(""),[p,I]=c.useState(null),[O,T]=c.useState(null),[P,x]=c.useState(null),[C,B]=c.useState(null),N=_(i?"/api/tasks":null),H=c.useMemo(()=>{var z;return i?(((z=N.data)==null?void 0:z.tasks)??[]).filter(F=>{const W=F.metadata??{};return typeof F.workedBy=="string"&&F.workedBy===u||W.agent===u}):[]},[i,N.data,u]);c.useEffect(()=>{i&&(o(""),T(null),x(null),B(null))},[i,s]);const D=async(j,z,F,W)=>{I(j),T(null),x(null);try{const M=await J(F,{method:z,body:W});if(M.ok){const G=M.sessionId?` (session ${M.sessionId.slice(0,8)})`:"";M.processId&&B(M.processId),T(`${j} succeeded${G}`)}else x(M.error||`${j} failed`)}catch(M){x(M instanceof Error?M.message:String(M))}finally{I(null)}},K=async()=>{if(!S.trim())return;const j=S.trim();o(""),m==="claude-code"?await D("Send prompt","POST",`/api/cc-agents/${encodeURIComponent(u)}/send`,{prompt:j}):await D("Invoke agent","POST",`/api/agents/${encodeURIComponent(u)}/invoke`,{prompt:j})},V=async()=>{if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Restart ${r}? The current session will be killed and a fresh one spawned.`)){if(m==="claude-code"){const z=S.trim()||"continue from the last checkpoint";await D("Restart","POST",`/api/cc-agents/${encodeURIComponent(u)}/restart`,{prompt:z});return}await D("Restart","POST",`/api/agents/${encodeURIComponent(u)}/restart`)}},Y=async()=>{if(m==="claude-code"){await D("Kill","POST",`/api/cc-agents/${encodeURIComponent(u)}/kill`);return}if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Delete Bizar agent "${u}"? This is irreversible.`)){I("Kill"),T(null),x(null);try{await J(`/api/agents/${encodeURIComponent(u)}`,{method:"DELETE"}),T(`Killed ${r}`),w(!1)}catch(z){x(z instanceof Error?z.message:String(z))}finally{I(null)}}},Z=async()=>{try{await navigator.clipboard.writeText(u),T(`Copied "${u}"`)}catch{x("Clipboard unavailable")}};return e.jsx(le,{open:i,onOpenChange:w,children:e.jsx(de,{side:"right",title:r,children:e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs($,{gap:3,align:"center",children:[e.jsx(oe,{name:r,status:l==="busy"||l==="error"?"busy":"online"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:n}),e.jsxs($,{gap:2,style:{marginTop:4},wrap:!0,children:[e.jsx(L,{tone:l==="busy"?"info":l==="error"?"danger":"neutral",dot:!0,children:l}),e.jsx(L,{tone:"accent",children:m==="bizar"?"Bizar agent":"Claude Code"}),h!==void 0&&e.jsxs(L,{tone:"neutral",title:new Date(h).toLocaleString(),children:["up ",qe(Date.now()-h)]}),typeof v=="number"&&e.jsxs(L,{tone:"neutral",children:[v," msg"]}),typeof b=="number"&&e.jsxs(L,{tone:"neutral",children:[b," tasks"]}),typeof R=="number"&&e.jsxs(L,{tone:R>=.8?"success":R>=.5?"warning":"danger",children:[Math.round(R*100),"% success"]})]})]})]}),typeof k=="string"&&k.length>0&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontStyle:"italic"},title:k,children:["“",k.length>240?`${k.slice(0,240)}…`:k,"”"]}),f!==void 0&&e.jsxs("div",{style:{padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-13)"},children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginBottom:4},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Current task"]}),f]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:`agent-prompt-${s}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Send a prompt"}),e.jsx($e,{id:`agent-prompt-${s}`,value:S,onChange:j=>o(j.target.value),placeholder:m==="claude-code"?"Type a follow-up for this background agent…":"Invoke this Bizar agent with…",rows:3,disabled:p!==null}),e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"primary",onClick:()=>{K()},disabled:!S.trim()||p!==null,children:[e.jsx(Ee,{size:14,"aria-hidden":!0})," ",p==="Send prompt"||p==="Invoke agent"?e.jsx(U,{style:{width:60,height:14}}):"Send"]}),e.jsxs(E,{variant:"secondary",onClick:()=>{V()},disabled:p!==null||m==="claude-code",title:m==="claude-code"?"Use command palette to spawn a fresh agent":void 0,children:[e.jsx(fe,{size:14,"aria-hidden":!0})," Restart"]}),e.jsxs(E,{variant:"danger",onClick:()=>{Y()},disabled:p!==null,title:m==="claude-code"?"Kill the CC background session":`Delete Bizar agent "${u}"`,children:[e.jsx(Ne,{size:14,"aria-hidden":!0})," Kill"]}),e.jsxs(E,{variant:"ghost",onClick:()=>{Z()},children:[e.jsx(Be,{size:14,"aria-hidden":!0})," Copy id"]})]})]}),O!==null&&e.jsx("div",{role:"status",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--success)"},children:O}),C!==null&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"PID"}),e.jsx("code",{"data-testid":"agent-process-id",style:{fontFamily:"var(--font-mono)",color:"var(--fg)",background:"var(--surface-1)",padding:"2px 6px",borderRadius:"var(--radius-sm)"},children:C})]}),P!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:P}),e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:["Assigned tasks (",H.length,")"]}),N.loading&&H.length===0?e.jsx(U,{style:{height:48}}):H.length===0?e.jsx(ce,{variant:"outlined",children:e.jsx(ue,{children:e.jsx("span",{"data-testid":"agent-tasks-empty",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"No tasks assigned to this agent."})})}):e.jsx(A,{gap:1,children:H.map(j=>e.jsxs("div",{"data-testid":`agent-tasks-${j.id}`,style:{display:"flex",alignItems:"center",gap:"var(--space-2)",padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-13)"},children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:j.id}),e.jsx("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:j.title}),e.jsx(L,{tone:j.status==="doing"?"info":j.status==="blocked"?"danger":"neutral",children:j.status??"queued"})]},j.id))})]}),m==="claude-code"&&e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Live output"]}),e.jsx(Ke,{sessionId:u,paused:p==="Kill"})]})]})})})}function qe(t){if(!Number.isFinite(t)||t<0)return"—";const s=Math.floor(t/1e3);if(s<60)return`${s}s`;const r=Math.floor(s/60);if(r<60)return`${r}m ${s%60}s`;const n=Math.floor(r/60);return n<24?`${n}h ${r%60}m`:`${Math.floor(n/24)}d ${n%24}h`}function Ye(t){const s=(t||"").toLowerCase();return s==="busy"||s==="working"?"info":s==="idle"?"neutral":s==="error"||s==="stuck"?"danger":s==="paused"?"warning":"neutral"}function Ze(t){const s=(t||"").toLowerCase();return s==="working"?"working":s||"idle"}function Qe(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const s=Math.max(0,Date.now()-t),r=Math.floor(s/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const l=Math.floor(n/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`}function pe({node:t,depth:s,expanded:r,onToggle:n}){const l=t.children.length>0,f=r.has(t.name),i=t.agent,w=Ye(i==null?void 0:i.status),h=Ze(i==null?void 0:i.status);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{"data-testid":`agent-hierarchy-node-${t.name}`,style:{display:"grid",gridTemplateColumns:"auto 1fr auto auto",alignItems:"center",gap:"var(--space-3)",padding:"var(--space-2) var(--space-3)",paddingLeft:`calc(var(--space-3) + ${s*24}px)`,border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-1)"},children:[l?e.jsx("button",{type:"button","data-testid":`agent-hierarchy-toggle-${t.name}`,"aria-label":f?"Collapse":"Expand",onClick:()=>n(t.name),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:22,height:22,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--surface-0)",color:"var(--fg-muted)",cursor:"pointer",padding:0},children:f?e.jsx(xe,{size:12,"aria-hidden":!0}):e.jsx(ke,{size:12,"aria-hidden":!0})}):e.jsx("span",{"aria-hidden":!0,style:{width:22,height:22,display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--fg-subtle)"},children:e.jsx(Ce,{size:12})}),e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:t.name}),i&&e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[i.role||i.category||i.mode||"agent",i.parent&&i.parent!==t.name&&e.jsxs(e.Fragment,{children:[" · parent ",e.jsx("code",{style:{fontFamily:"var(--font-mono)"},children:i.parent})]})]})]}),typeof(i==null?void 0:i.lastSeen)=="number"&&i.lastSeen>0&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:Qe(i.lastSeen)}),e.jsx(L,{tone:w,dot:!0,children:h})]}),l&&f&&t.children.map(v=>e.jsx(pe,{node:v,depth:s+1,expanded:r,onToggle:n},v.name))]})}function Xe(){var v,k,R;const t=_("/api/agents/hierarchy"),[s,r]=c.useState(()=>new Set),[n,l]=c.useState(()=>new Set),f=c.useMemo(()=>{var b,m;return((m=(b=t.data)==null?void 0:b.roots)==null?void 0:m.map(u=>u.name))??[]},[t.data]);n.size===0&&f.length>0&&(l(new Set(f)),r(new Set(f)));const i=c.useCallback(()=>t.refetch(),[t]);se("agents:change",i);const w=c.useCallback(b=>{r(m=>{const u=new Set(m);return u.has(b)?u.delete(b):u.add(b),u})},[]);if(t.loading&&!t.data)return e.jsxs(A,{gap:3,children:[e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}})]});const h=((v=t.data)==null?void 0:v.roots)??[];return h.length===0?e.jsx(ce,{children:e.jsx(ue,{children:e.jsx(Me,{icon:e.jsx(Le,{size:32,"aria-hidden":!0}),title:"No hierarchy yet",description:"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.","data-testid":"agent-hierarchy-empty"})})}):e.jsxs(A,{gap:2,children:[e.jsx($,{align:"center",justify:"between",children:e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[h.length," root agent",h.length===1?"":"s"," · ",((R=(k=t.data)==null?void 0:k.all)==null?void 0:R.length)??0," total"]})}),e.jsx(A,{gap:2,children:h.map(b=>e.jsx(pe,{node:b,depth:0,expanded:s,onToggle:w},b.name))})]})}function et(t){if(!t)return"";let s=t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"");if(s=s.split(`
|
|
14
|
+
`).filter(l=>!l.includes("```")).join(`
|
|
15
|
+
`),s=s.replace(/\bworktree:\s*/g,""),s=s.replace(/\/tmp\//g,""),s=s.replace(/\bReason:\s*/g,""),s=s.replace(/^\s*→\s*/gm,""),s=s.trim(),!s||(s=s.replace(/^\[[\w\s]+[-—]\s*/,""),s=s.replace(/^\[[\w\s]+\]\s*/gi,""),s=s.trim(),!s))return"";const r=s.match(/^[^.!?\n]+[.!?]/),n=r?r[0]:s;return n.length<=140?n:n.slice(0,137)+"…"}const he="bizar.agents.sourceFilter",me={all:"All",bizar:"Bizar","claude-code":"Claude Code"},tt=Object.keys(me);function st(){if(typeof localStorage>"u")return"all";const t=localStorage.getItem(he);return tt.includes(t)?t:"all"}function at(t){if(!Number.isFinite(t)||t<=0)return"—";const s=Math.max(0,Date.now()-t),r=Math.floor(s/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const l=Math.floor(n/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`}function rt(t){const s=(t.status||"idle").toLowerCase(),r=s==="busy"||s==="working"?"busy":s==="error"||s==="stuck"?"error":s==="paused"?"paused":"idle";return{id:`bizar:${t.name}`,name:t.name,role:t.role||t.category||t.mode||"agent",status:r,currentTask:t.currentTaskId?`Task ${t.currentTaskId}`:void 0,lastActivity:t.lastSeen?new Date(t.lastSeen).toLocaleTimeString():void 0,tasksToday:t.tasksTotal||0,tasksSucceeded:typeof t.tasksSucceeded=="number"?t.tasksSucceeded:void 0,tasksTotal:typeof t.tasksTotal=="number"?t.tasksTotal:void 0,successRate:typeof t.successRate=="number"?t.successRate:void 0,lastSeenMs:typeof t.lastSeen=="number"&&t.lastSeen>0?t.lastSeen:void 0,badges:t.tags||[]}}function nt(t){var n,l;const s=(t.status||t.state||"idle").toLowerCase(),r=s==="busy"||s==="working"?"busy":s==="error"?"error":s==="paused"?"paused":"idle";return{id:`cc:${t.sessionId||t.id}`,name:t.name||((n=t.sessionId)==null?void 0:n.slice(0,8))||"unknown",role:t.kind==="background"?"CC background":"CC interactive",status:r,currentTask:et(t.lastMessageSnippet),lastActivity:t.lastMessageAt?new Date(t.lastMessageAt).toLocaleTimeString():t.startedAt?new Date(t.startedAt).toLocaleTimeString():void 0,tasksToday:t.messageCount||0,badges:[((l=t.cwd)==null?void 0:l.split("/").slice(-2).join("/"))||""].filter(Boolean)}}function Mt(){var F,W,M,G;const t=_("/api/agents"),s=_("/api/cc-agents"),r=_("/api/agents/stuck"),[n,l]=c.useState(st),[f,i]=c.useState("roster");c.useEffect(()=>{typeof localStorage<"u"&&localStorage.setItem(he,n)},[n]);const[w,h]=c.useState([]),[v,k]=c.useState([]),[R,b]=c.useState(!1),[m,u]=c.useState(null),[S,o]=c.useState(null),[p,I]=c.useState(!1),[O,T]=c.useState(null),[P,x]=c.useState(()=>new Set),C=async()=>{if(!(S===null||!S.name.trim())){I(!0),T(null);try{await J("/api/agents",{method:"POST",body:{name:S.name.trim(),role:S.role.trim()||"agent"}}),o(null),t.refetch()}catch(a){T((a instanceof q,a.message))}finally{I(!1)}}},B=async a=>{x(d=>new Set(d).add(a));try{await J(`/api/agents/${encodeURIComponent(a)}/restart`,{method:"POST"}),r.refetch(),t.refetch()}catch(d){T((d instanceof q,d.message))}finally{x(d=>{const g=new Set(d);return g.delete(a),g})}},[N,H]=c.useState(()=>new Set),D=async(a,d)=>{H(g=>new Set(g).add(a));try{await J(`/api/agents/${encodeURIComponent(a)}/status`,{method:"POST",body:{status:d}}),r.refetch(),t.refetch()}catch(g){T((g instanceof q,g.message))}finally{H(g=>{const y=new Set(g);return y.delete(a),y})}},[K,V]=c.useState(!1),Y=async()=>{var d;const a=((d=r.data)==null?void 0:d.stuck)??[];if(a.length!==0){V(!0);try{await Promise.all(a.map(g=>J(`/api/agents/${encodeURIComponent(g.name)}/status`,{method:"POST",body:{status:"paused"}}).catch(y=>(T((y instanceof q,y.message)),null)))),r.refetch(),t.refetch()}finally{V(!1)}}};c.useEffect(()=>{var a,d;!R&&((a=t.data)==null?void 0:a.agents)!==void 0&&((d=s.data)==null?void 0:d.agents)!==void 0&&(b(!0),h(t.data.agents),k(s.data.agents))},[t.data,s.data,R]);const Z=c.useCallback(()=>{t.refetch(),s.refetch()},[t,s]);se("agents:change",Z);const j=c.useCallback(a=>{if(a.type!=="agent:status")return;const d=a.agent;!d||!d.name||h(g=>{const y=g.findIndex(ve=>ve.name===d.name);if(y===-1)return[...g,d];const Q=g.slice();return Q[y]={...Q[y],...d},Q})},[]);se("agent:status",j);const z=c.useMemo(()=>{const a=[];if(n!=="claude-code")for(const d of w)a.push({...rt(d),source:"bizar"});if(n!=="bizar")for(const d of v)a.push({...nt(d),source:"claude-code"});return a},[w,v,n]);return e.jsxs(A,{gap:5,"data-testid":"agents-view",children:[e.jsx(Se,{title:"Agents",description:"Bizar agents (frontmatter-driven) and Claude Code background agents.",actions:e.jsxs(E,{variant:"primary",onClick:()=>o({name:"",role:""}),"data-testid":"agent-create-open",children:[e.jsx(Oe,{size:14,"aria-hidden":!0})," New agent"]})}),e.jsx(we,{title:"Roster",count:z.length,description:(F=r.data)!=null&&F.stuck&&r.data.stuck.length>0?`${r.data.stuck.length} stuck`:void 0,testid:"agents-list-header"}),(((W=r.data)==null?void 0:W.stuck)??[]).length>0&&e.jsx(ze,{tone:"warning","data-testid":"agents-stuck-banner",action:e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"secondary",size:"sm",onClick:()=>{Y()},disabled:K,"data-testid":"agents-stuck-bulk-pause",title:"Pause every stuck agent at once",children:[e.jsx(ae,{size:12,"aria-hidden":!0})," ",K?"Pausing…":"Pause all"]}),e.jsx(E,{variant:"secondary",size:"sm",onClick:()=>i("hierarchy"),children:"View details"})]}),children:e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx(Pe,{size:14,"aria-hidden":!0,style:{color:"var(--warning)"}}),e.jsxs("span",{children:[(((M=r.data)==null?void 0:M.stuck)??[]).length," agent",r.data&&r.data.stuck&&r.data.stuck.length===1?"":"s"," stuck (no heartbeat >5m)"]})]}),e.jsx(A,{gap:1,children:(((G=r.data)==null?void 0:G.stuck)??[]).map(a=>{const d=P.has(a.name),g=a.status==="paused",y=d||N.has(a.name);return e.jsxs($,{align:"center",justify:"between",gap:2,"data-testid":`agents-stuck-row-${a.name}`,children:[e.jsxs($,{gap:2,align:"center",children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:a.name}),e.jsx(L,{tone:g?"warning":"danger",children:g?"paused":a.status||"stuck"}),typeof a.lastSeen=="number"&&a.lastSeen>0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["last seen ",at(a.lastSeen)]})]}),e.jsxs($,{gap:1,children:[g?e.jsxs(E,{variant:"ghost",size:"sm",disabled:y,onClick:()=>{D(a.name,"idle")},"data-testid":`agents-stuck-resume-${a.name}`,children:[e.jsx(ge,{size:12,"aria-hidden":!0})," Resume"]}):e.jsxs(E,{variant:"secondary",size:"sm",disabled:y,onClick:()=>{D(a.name,"paused")},"data-testid":`agents-stuck-pause-${a.name}`,children:[e.jsx(ae,{size:12,"aria-hidden":!0})," Pause"]}),e.jsxs(E,{variant:"primary",size:"sm",disabled:y,onClick:()=>{B(a.name)},"data-testid":`agents-stuck-restart-${a.name}`,children:[e.jsx(fe,{size:12,"aria-hidden":!0})," ",d?"Restarting…":"Restart"]})]})]},a.name)})})]})}),e.jsxs($,{align:"center",justify:"between",wrap:!0,gap:2,children:[e.jsx($,{gap:2,children:["all","bizar","claude-code"].map(a=>e.jsxs(X,{selected:n===a,onClick:()=>l(a),children:[a==="bizar"?e.jsx(je,{size:12,"aria-hidden":!0}):a==="claude-code"?e.jsx(be,{size:12,"aria-hidden":!0}):null," ",me[a]]},a))}),e.jsxs($,{gap:2,children:[e.jsx(X,{"data-testid":"agents-mode-roster",selected:f==="roster",onClick:()=>i("roster"),children:"Roster"}),e.jsx(X,{"data-testid":"agents-mode-hierarchy",selected:f==="hierarchy",onClick:()=>i("hierarchy"),children:"Hierarchy"})]})]}),f==="hierarchy"?e.jsx(Xe,{}):z.length===0&&(t.loading||s.loading)?e.jsxs(re,{cols:3,children:[e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}})]}):z.length===0&&(t.error||s.error)?e.jsx(Ae,{block:!0,title:"Couldn't load agents",description:"Both bizar and CC roster endpoints failed. Retry to refetch.",error:t.error??s.error,onRetry:()=>{t.refetch(),s.refetch()},testid:"agents-error"}):z.length===0?e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["No agents yet. Run ",e.jsx("code",{children:"/loop"})," or spawn one via the command palette."]}):e.jsx(re,{cols:3,children:z.map(a=>e.jsx(_e,{...a,onOpen:()=>u(a.id)},a.id))}),m!==null&&(()=>{const a=z.find(y=>y.id===m);if(!a)return null;const d=a.source==="claude-code"?v.find(y=>a.id===`cc:${y.sessionId||y.id}`):void 0,g=a.source==="bizar"?w.find(y=>a.id===`bizar:${y.name}`):void 0;return e.jsx(Ge,{agentId:a.id,name:a.name,role:a.role,status:a.status,currentTask:a.currentTask,startedAt:(d==null?void 0:d.startedAt)??(g==null?void 0:g.lastSeen),messageCount:d==null?void 0:d.messageCount,lastMessageSnippet:d==null?void 0:d.lastMessageSnippet,successRate:g==null?void 0:g.successRate,tasksTotal:g==null?void 0:g.tasksTotal,open:m!==null,onOpenChange:y=>{y||u(null)}})})(),e.jsx(le,{open:S!==null,onOpenChange:a=>{a||o(null)},children:e.jsx(de,{side:"right",title:"New agent",children:S!==null&&e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-name",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(ne,{id:"agent-create-name",value:S.name,onChange:a=>o({...S,name:a.target.value}),placeholder:"e.g. frigg",disabled:p,"data-testid":"agent-create-name"})]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-role",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Role (optional)"}),e.jsx(ne,{id:"agent-create-role",value:S.role,onChange:a=>o({...S,role:a.target.value}),placeholder:"e.g. code-review",disabled:p,"data-testid":"agent-create-role"})]}),O!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:O}),e.jsxs($,{gap:2,children:[e.jsx(E,{variant:"primary",onClick:()=>{C()},disabled:p||!S.name.trim(),"data-testid":"agent-create-submit",children:"Create agent"}),e.jsx(E,{variant:"ghost",onClick:()=>o(null),disabled:p,children:"Cancel"})]})]})})})]})}export{Mt as AgentsView,et as sanitizeSummary};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentsView-CIQkZH8_.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/clipboard-copy.js","../../../node_modules/lucide-react/dist/esm/icons/octagon.js","../../src/web/v8/ui/agents/AgentCard.tsx","../../src/web/v8/ui/agents/AgentLiveOutput.tsx","../../src/web/v8/ui/agents/AgentDetail.tsx","../../src/web/v8/views/Agents/AgentHierarchy.tsx","../../src/web/v8/views/Agents/AgentsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ClipboardCopy = createLucideIcon(\"ClipboardCopy\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\"path\", { d: \"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\", key: \"4jdomd\" }],\n [\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v4\", key: \"3hqy98\" }],\n [\"path\", { d: \"M21 14H11\", key: \"1bme5i\" }],\n [\"path\", { d: \"m15 10-4 4 4 4\", key: \"5dvupr\" }]\n]);\n\nexport { ClipboardCopy as default };\n//# sourceMappingURL=clipboard-copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Octagon = createLucideIcon(\"Octagon\", [\n [\n \"path\",\n {\n d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\",\n key: \"2d38gg\"\n }\n ]\n]);\n\nexport { Octagon as default };\n//# sourceMappingURL=octagon.js.map\n","import { type ReactNode } from 'react';\nimport { Activity, Zap } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\n\n/**\n * AgentCard — agent tile for the Agents roster.\n *\n * Per PLAN.md, agents are the orchestrator's running entities. Each card\n * shows: name, status (idle/busy/error), role, last activity, and a\n * three-row metrics strip (tasks succeeded/total, success rate, lastSeen).\n *\n * v9.4.0 S45 — replaced the dead single-point sparkline (line 140\n * guarded `tpmHistory.length > 1`, never true) with a data-driven\n * metric strip that always renders when the fields are supplied.\n */\n\nexport type AgentStatus = 'idle' | 'busy' | 'error' | 'paused';\n\nexport interface AgentCardProps {\n id: string;\n name: string;\n role: string;\n status: AgentStatus;\n /** Last activity label (\"2m ago\", \"Just now\"). */\n lastActivity?: string;\n /** Current task the agent is working on. */\n currentTask?: string;\n /** Number of tasks completed in the last 24h. */\n tasksToday?: number;\n /** Tasks succeeded (numerator of the ProgressBar). */\n tasksSucceeded?: number;\n /** Tasks total (denominator of the ProgressBar). */\n tasksTotal?: number;\n /** Success rate as 0..1. Tones the badge: >=0.8 success, >=0.5 warning, else danger. */\n successRate?: number;\n /** Last-seen timestamp in ms-since-epoch. Rendered as relative duration. */\n lastSeenMs?: number;\n /** Click handler — opens agent detail. */\n onOpen?: () => void;\n /** Custom badges row (model, owner). */\n badges?: ReactNode;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: 'Idle',\n busy: 'Busy',\n error: 'Error',\n paused: 'Paused',\n};\n\nconst STATUS_TONE: Record<AgentStatus, 'success' | 'info' | 'danger' | 'neutral'> = {\n idle: 'neutral',\n busy: 'info',\n error: 'danger',\n paused: 'neutral',\n};\n\nconst STATUS_FG: Record<AgentStatus, string> = {\n idle: 'var(--fg-subtle)',\n busy: 'var(--info)',\n error: 'var(--danger)',\n paused: 'var(--warning)',\n};\n\n/** relativeTime — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing / future timestamps. */\nfunction relativeTime(ms: number | undefined): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.floor(hr / 24);\n return `${day}d ago`;\n}\n\nfunction successTone(rate: number): 'success' | 'warning' | 'danger' {\n if (rate >= 0.8) return 'success';\n if (rate >= 0.5) return 'warning';\n return 'danger';\n}\n\nfunction lastSeenTone(ms: number | undefined): 'neutral' | 'danger' {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return 'neutral';\n const days = (Date.now() - ms) / 86_400_000;\n return days > 1 ? 'danger' : 'neutral';\n}\n\nexport function AgentCard(props: AgentCardProps): JSX.Element {\n const {\n name,\n role,\n status,\n lastActivity,\n currentTask,\n tasksToday,\n tasksSucceeded,\n tasksTotal,\n successRate,\n lastSeenMs,\n onOpen,\n badges,\n className,\n } = props;\n\n const showMetrics =\n (typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number') ||\n typeof successRate === 'number' ||\n typeof lastSeenMs === 'number';\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-agent-card', `v8-agent-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : status === 'idle' ? 'online' : 'away'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {name}\n </div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {role}\n </div>\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n {currentTask !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-2) var(--space-3)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={currentTask}\n >\n {currentTask}\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {lastActivity !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Activity size={12} aria-hidden=\"true\" style={{ color: STATUS_FG[status] }} />\n {lastActivity}\n </span>\n )}\n {tasksToday !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Zap size={12} aria-hidden=\"true\" />\n {tasksToday} today\n </span>\n )}\n </div>\n {showMetrics && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-2)' }}>\n {typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number' && tasksTotal > 0 && (\n <div data-testid=\"agent-card-tasks\" style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>tasks</span>\n <code style={{ fontFamily: 'var(--font-mono)', color: 'var(--fg)' }}>\n {tasksSucceeded} / {tasksTotal}\n </code>\n </div>\n <ProgressBar value={tasksSucceeded} max={tasksTotal} tone=\"accent\" height={4} />\n </div>\n )}\n {typeof successRate === 'number' && (\n <div\n data-testid=\"agent-card-success\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n success\n </span>\n <Badge data-testid=\"agent-card-success-badge\" tone={successTone(successRate)}>\n {Math.round(successRate * 100)}% success\n </Badge>\n </div>\n )}\n {typeof lastSeenMs === 'number' && (\n <div\n data-testid=\"agent-card-lastseen\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n last seen\n </span>\n <Badge data-testid=\"agent-card-lastseen-badge\" tone={lastSeenTone(lastSeenMs)}>{relativeTime(lastSeenMs)}</Badge>\n </div>\n )}\n </div>\n )}\n {badges !== undefined && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>{badges}</div>\n )}\n <style>{`\n .v8-agent-card:hover { border-color: var(--accent); }\n `}</style>\n </button>\n );\n}","import { useEffect, useRef, useState } from 'react';\nimport { Pause, Play, RefreshCw } from 'lucide-react';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * AgentLiveOutput — Sprint S17. Live SSE tail of a CC agent's session\n * JSONL. Subscribes to `/api/agent-stream/live?sessionId=...` and\n * appends events as they arrive. Pause freezes the buffer (connection\n * stays open). Clear wipes the buffer.\n */\n\ninterface StreamEvent {\n type?: string;\n role?: string;\n content?: string;\n name?: string;\n input?: unknown;\n tool?: { name?: string; input?: unknown };\n result?: unknown;\n ts?: number;\n message?: string;\n}\n\nexport interface AgentLiveOutputProps {\n sessionId: string;\n /** When true the parent wants us to stop connecting (e.g. agent was killed). */\n paused?: boolean;\n}\n\nconst MAX_EVENTS = 500;\n\nexport function AgentLiveOutput(props: AgentLiveOutputProps): JSX.Element {\n const { sessionId, paused } = props;\n const [events, setEvents] = useState<StreamEvent[]>([]);\n const [status, setStatus] = useState<'connecting' | 'live' | 'paused' | 'error' | 'closed'>('connecting');\n const [error, setError] = useState<string | null>(null);\n const [pausedLocal, setPausedLocal] = useState<boolean>(false);\n const [autoScroll, setAutoScroll] = useState<boolean>(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const sourceRef = useRef<EventSource | null>(null);\n\n useEffect(() => {\n if (paused || pausedLocal) {\n if (sourceRef.current) {\n sourceRef.current.close();\n sourceRef.current = null;\n }\n setStatus('paused');\n return;\n }\n if (typeof window === 'undefined' || typeof EventSource === 'undefined') {\n setStatus('error');\n setError('EventSource not available in this environment.');\n return;\n }\n setStatus('connecting');\n setError(null);\n const url = `/api/agent-stream/live?sessionId=${encodeURIComponent(sessionId)}`;\n const src = new EventSource(url);\n sourceRef.current = src;\n\n const onSnapshot = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { events?: StreamEvent[] };\n if (Array.isArray(data.events)) setEvents(data.events.slice(-MAX_EVENTS));\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEvent = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as StreamEvent;\n setEvents((prev) => {\n const next = prev.length >= MAX_EVENTS ? prev.slice(prev.length - MAX_EVENTS + 1) : prev.slice();\n next.push(data);\n return next;\n });\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEnd = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { reason?: string };\n setStatus('closed');\n setError(data.reason ? `Stream ended: ${data.reason}` : null);\n } catch { /* */ }\n };\n const onErrEv = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { error?: string };\n setStatus('error');\n setError(data.error || 'stream error');\n } catch { /* */ }\n };\n src.addEventListener('snapshot', onSnapshot);\n src.addEventListener('event', onEvent);\n src.addEventListener('agent:event', onEvent);\n src.addEventListener('end', onEnd);\n src.addEventListener('error', onErrEv);\n src.onerror = () => {\n setStatus('error');\n setError('Connection dropped. Click Retry to reconnect.');\n };\n return () => {\n src.close();\n sourceRef.current = null;\n };\n }, [sessionId, paused, pausedLocal]);\n\n useEffect(() => {\n if (!autoScroll || !containerRef.current) return;\n const el = containerRef.current;\n el.scrollTop = el.scrollHeight;\n }, [events, autoScroll]);\n\n const renderEvent = (ev: StreamEvent, idx: number): JSX.Element => {\n const tone =\n ev.role === 'user' ? 'user' :\n ev.role === 'assistant' ? 'assistant' :\n ev.tool?.name ? 'tool' :\n 'system';\n const label =\n ev.tool?.name ? `${ev.tool.name}` :\n ev.role ? ev.role : (ev.type || 'event');\n const text =\n typeof ev.content === 'string' ? ev.content :\n ev.tool?.input ? JSON.stringify(ev.tool.input).slice(0, 240) :\n typeof ev.message === 'string' ? ev.message :\n ev.result ? JSON.stringify(ev.result).slice(0, 240) :\n JSON.stringify(ev).slice(0, 240);\n return (\n <div\n key={idx}\n style={{\n padding: '4px 8px',\n borderRadius: 'var(--radius-sm)',\n background:\n tone === 'user' ? 'color-mix(in oklch, var(--accent) 8%, var(--surface-0))' :\n tone === 'tool' ? 'color-mix(in oklch, var(--warning) 8%, var(--surface-0))' :\n tone === 'system' ? 'var(--surface-1)' :\n 'var(--surface-0)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n <span style={{ color: 'var(--fg-muted)' }}>{label}: </span>\n <span style={{ color: 'var(--fg)' }}>{text}</span>\n </div>\n );\n };\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <span\n aria-hidden\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background:\n status === 'live' ? 'var(--success)' :\n status === 'connecting' ? 'var(--warning)' :\n status === 'paused' ? 'var(--fg-muted)' :\n status === 'closed' ? 'var(--fg-muted)' :\n 'var(--danger)',\n }}\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'live' ? 'Live' :\n status === 'connecting' ? 'Connecting…' :\n status === 'paused' ? 'Paused' :\n status === 'closed' ? 'Closed' :\n 'Error'}\n {' · '}{events.length} events\n </span>\n </Inline>\n <Inline align=\"center\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => setPausedLocal((p) => !p)}\n title={pausedLocal ? 'Resume stream' : 'Pause stream'}\n aria-label={pausedLocal ? 'Resume stream' : 'Pause stream'}\n >\n {pausedLocal ? <Play size={12} aria-hidden /> : <Pause size={12} aria-hidden />}\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setEvents([])}\n title=\"Clear buffer\"\n aria-label=\"Clear output\"\n >\n Clear\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => {\n setEvents([]);\n setPausedLocal(false);\n }}\n title=\"Reconnect\"\n aria-label=\"Reconnect stream\"\n >\n <RefreshCw size={12} aria-hidden /> Retry\n </Button>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', cursor: 'pointer' }}>\n <input type=\"checkbox\" checked={autoScroll} onChange={(e) => setAutoScroll(e.target.checked)} />\n follow\n </label>\n </Inline>\n </Inline>\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n <div\n ref={containerRef}\n onScroll={(e) => {\n const el = e.currentTarget;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 20;\n setAutoScroll(atBottom);\n }}\n style={{\n maxHeight: 280,\n minHeight: 120,\n overflowY: 'auto',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n background: 'var(--surface-1)',\n }}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Agent live output\"\n >\n {events.length === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'connecting' ? 'Connecting to agent stream…' : 'No events yet.'}\n </span>\n ) : (\n events.map(renderEvent)\n )}\n </div>\n </Stack>\n );\n}","import { useEffect, useMemo, useState } from 'react';\nimport { Send, RotateCw, Octagon, ClipboardCopy, Activity as ActivityIcon } from 'lucide-react';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Button } from '../controls/Button.js';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Textarea } from '../controls/Textarea.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Card, CardBody } from '../data/Card.js';\nimport { AgentStreamPanel } from './AgentStreamPanel.js';\nimport { AgentLiveOutput } from './AgentLiveOutput.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport type { Task } from '../../data/types.js';\n\n/**\n * AgentDetail — Sprint S11. Right-side Drawer with live agent\n * detail and the control plane (Send prompt / Restart / Kill).\n *\n * Two flavors per `source`:\n * - `bizar:<name>` — hits `/api/agents/:name/invoke` and `/restart`.\n * - `cc:<sessionId>` — hits `/api/cc-agents/:id/send` and `/kill`.\n */\n\nexport type AgentSource = 'bizar' | 'claude-code';\n\nexport interface AgentDetailProps {\n /** Composite id from AgentsView (`bizar:<name>` or `cc:<sessionId>`). */\n agentId: string;\n name: string;\n role: string;\n status: 'idle' | 'busy' | 'error' | 'paused';\n currentTask?: string;\n startedAt?: number;\n messageCount?: number;\n lastMessageSnippet?: string;\n successRate?: number;\n tasksTotal?: number;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nfunction parseId(agentId: string): { source: AgentSource; key: string } {\n if (agentId.startsWith('bizar:')) return { source: 'bizar', key: agentId.slice('bizar:'.length) };\n if (agentId.startsWith('cc:')) return { source: 'claude-code', key: agentId.slice('cc:'.length) };\n return { source: 'bizar', key: agentId };\n}\n\nexport function AgentDetail(props: AgentDetailProps): JSX.Element {\n const {\n agentId, name, role, status, currentTask, open, onOpenChange,\n startedAt, messageCount, lastMessageSnippet, successRate, tasksTotal,\n } = props;\n const { source, key } = parseId(agentId);\n const [prompt, setPrompt] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [lastProcessId, setLastProcessId] = useState<string | null>(null);\n\n // v9.5.0 S49 — agent↔task drilldown. `useFetch` is gated on `open` so\n // we don't burn a request every time the Sheet is mounted-hidden. We\n // client-filter for the current agent's name across both `workedBy`\n // (Bizar task-store) and `metadata.agent` (task-store progress events).\n const tasksQuery = useFetch<{ tasks?: Task[] }>(open ? '/api/tasks' : null);\n const myTasks = useMemo<Task[]>(() => {\n if (!open) return [];\n const all = tasksQuery.data?.tasks ?? [];\n return all.filter((t) => {\n const md = (t.metadata ?? {}) as { agent?: unknown };\n return (\n (typeof (t as unknown as { workedBy?: unknown }).workedBy === 'string'\n && (t as unknown as { workedBy: string }).workedBy === key)\n || md.agent === key\n );\n });\n }, [open, tasksQuery.data, key]);\n\n useEffect(() => {\n if (open) { setPrompt(''); setMessage(null); setError(null); setLastProcessId(null); }\n }, [open, agentId]);\n\n const runAction = async (\n label: string,\n method: 'POST',\n endpoint: string,\n body?: Record<string, unknown>,\n ): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; sessionId?: string; processId?: string; error?: string }>(\n endpoint,\n { method, body },\n );\n if (res.ok) {\n const sessionExtra = res.sessionId ? ` (session ${res.sessionId.slice(0, 8)})` : '';\n if (res.processId) setLastProcessId(res.processId);\n setMessage(`${label} succeeded${sessionExtra}`);\n } else {\n setError(res.error || `${label} failed`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const sendPrompt = async (): Promise<void> => {\n if (!prompt.trim()) return;\n const trimmed = prompt.trim();\n setPrompt('');\n if (source === 'claude-code') {\n await runAction('Send prompt', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/send`, { prompt: trimmed });\n } else {\n await runAction('Invoke agent', 'POST', `/api/agents/${encodeURIComponent(key)}/invoke`, { prompt: trimmed });\n }\n };\n\n const restart = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Restart ${name}? The current session will be killed and a fresh one spawned.`)\n : true;\n if (!ok) return;\n if (source === 'claude-code') {\n // v9.0.5 — server now does kill+spawn in one shot, using the current\n // prompt as the new session's seed (fallback to \"continue\").\n const seed = prompt.trim() || 'continue from the last checkpoint';\n await runAction('Restart', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/restart`, { prompt: seed });\n return;\n }\n await runAction('Restart', 'POST', `/api/agents/${encodeURIComponent(key)}/restart`);\n };\n\n const kill = async (): Promise<void> => {\n if (source === 'claude-code') {\n await runAction('Kill', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/kill`);\n return;\n }\n // Confirm before destroying — DELETE is irreversible.\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete Bizar agent \"${key}\"? This is irreversible.`)\n : true;\n if (!ok) return;\n setBusy('Kill');\n setMessage(null);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean; error?: string }>(\n `/api/agents/${encodeURIComponent(key)}`,\n { method: 'DELETE' },\n );\n setMessage(`Killed ${name}`);\n // Server broadcasts agents:change; close the drawer so the user\n // sees the agent disappear from the grid.\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const copyId = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(key);\n setMessage(`Copied \"${key}\"`);\n } catch {\n setError('Clipboard unavailable');\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title={name}>\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Inline gap={3} align=\"center\">\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : 'online'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{role}</div>\n <Inline gap={2} style={{ marginTop: 4 }} wrap>\n <Badge tone={status === 'busy' ? 'info' : status === 'error' ? 'danger' : 'neutral'} dot>\n {status}\n </Badge>\n <Badge tone=\"accent\">{source === 'bizar' ? 'Bizar agent' : 'Claude Code'}</Badge>\n {startedAt !== undefined && (\n <Badge tone=\"neutral\" title={new Date(startedAt).toLocaleString()}>\n up {formatDuration(Date.now() - startedAt)}\n </Badge>\n )}\n {typeof messageCount === 'number' && (\n <Badge tone=\"neutral\">{messageCount} msg</Badge>\n )}\n {typeof tasksTotal === 'number' && (\n <Badge tone=\"neutral\">{tasksTotal} tasks</Badge>\n )}\n {typeof successRate === 'number' && (\n <Badge tone={successRate >= 0.8 ? 'success' : successRate >= 0.5 ? 'warning' : 'danger'}>\n {Math.round(successRate * 100)}% success\n </Badge>\n )}\n </Inline>\n </div>\n </Inline>\n\n {typeof lastMessageSnippet === 'string' && lastMessageSnippet.length > 0 && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontStyle: 'italic',\n }}\n title={lastMessageSnippet}\n >\n “{lastMessageSnippet.length > 240 ? `${lastMessageSnippet.slice(0, 240)}…` : lastMessageSnippet}”\n </div>\n )}\n\n {currentTask !== undefined && (\n <div\n style={{\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginBottom: 4 }}>\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Current task\n </div>\n {currentTask}\n </div>\n )}\n\n <Stack gap={2}>\n <label\n htmlFor={`agent-prompt-${agentId}`}\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Send a prompt\n </label>\n <Textarea\n id={`agent-prompt-${agentId}`}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder={source === 'claude-code' ? 'Type a follow-up for this background agent…' : 'Invoke this Bizar agent with…'}\n rows={3}\n disabled={busy !== null}\n />\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void sendPrompt(); }}\n disabled={!prompt.trim() || busy !== null}\n >\n <Send size={14} aria-hidden /> {busy === 'Send prompt' || busy === 'Invoke agent' ? <Skeleton style={{ width: 60, height: 14 }} /> : 'Send'}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => { void restart(); }}\n disabled={busy !== null || source === 'claude-code'}\n title={source === 'claude-code' ? 'Use command palette to spawn a fresh agent' : undefined}\n >\n <RotateCw size={14} aria-hidden /> Restart\n </Button>\n <Button\n variant=\"danger\"\n onClick={() => { void kill(); }}\n disabled={busy !== null}\n title={source === 'claude-code' ? 'Kill the CC background session' : `Delete Bizar agent \"${key}\"`}\n >\n <Octagon size={14} aria-hidden /> Kill\n </Button>\n <Button variant=\"ghost\" onClick={() => { void copyId(); }}>\n <ClipboardCopy size={14} aria-hidden /> Copy id\n </Button>\n </Inline>\n </Stack>\n\n {message !== null && (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--success)',\n }}\n >\n {message}\n </div>\n )}\n {lastProcessId !== null && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>PID</span>\n <code\n data-testid=\"agent-process-id\"\n style={{\n fontFamily: 'var(--font-mono)',\n color: 'var(--fg)',\n background: 'var(--surface-1)',\n padding: '2px 6px',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n {lastProcessId}\n </code>\n </div>\n )}\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Live stream — only meaningful for Claude Code sessions (they have\n a backing JSONL log). Bizar agents have no equivalent surface. */}\n {/* v9.5.0 S49 — agent↔task drilldown. Renders the tasks this agent\n is currently working on (filtered by workedBy / metadata.agent),\n so the user can see \"what is my orchestrator doing right now\"\n without bouncing between this Sheet and the Tasks board. */}\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n Assigned tasks ({myTasks.length})\n </div>\n {tasksQuery.loading && myTasks.length === 0 ? (\n <Skeleton style={{ height: 48 }} />\n ) : myTasks.length === 0 ? (\n <Card variant=\"outlined\">\n <CardBody>\n <span data-testid=\"agent-tasks-empty\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No tasks assigned to this agent.\n </span>\n </CardBody>\n </Card>\n ) : (\n <Stack gap={1}>\n {myTasks.map((t) => (\n <div\n key={t.id}\n data-testid={`agent-tasks-${t.id}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{t.id}</code>\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.title}\n </span>\n <Badge tone={t.status === 'doing' ? 'info' : t.status === 'blocked' ? 'danger' : 'neutral'}>\n {t.status ?? 'queued'}\n </Badge>\n </div>\n ))}\n </Stack>\n )}\n </Stack>\n {source === 'claude-code' && (\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Live output\n </div>\n <AgentLiveOutput sessionId={key} paused={busy === 'Kill'} />\n </Stack>\n )}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}\n\n/** formatDuration — human-readable \"3m 12s\" / \"1h 4m\" / \"2d 5h\". */\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n const sec = Math.floor(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ${sec % 60}s`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ${min % 60}m`;\n const day = Math.floor(hr / 24);\n return `${day}d ${hr % 24}h`;\n}","import { useCallback, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronRight, GitBranch, Network } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { BizarAgent } from '../../data/types.js';\n\n/**\n * AgentHierarchy — v9.4.0 S45.\n *\n * Reads `/api/agents/hierarchy` (returns `{ roots: Array<{ name, agent,\n * children }>, all: BizarAgent[] }` from `agents-store.mjs:230-251`).\n * Renders a collapsible tree where each node is a Bizar agent. Children\n * render indented beneath their parent. Live updates via `agents:change`\n * WS event triggers refetch.\n */\n\nexport interface HierarchyNode {\n name: string;\n agent: BizarAgent | null;\n children: HierarchyNode[];\n}\n\ninterface HierarchyResponse {\n roots?: HierarchyNode[];\n all?: BizarAgent[];\n}\n\nfunction statusToTone(status: string | undefined): 'neutral' | 'info' | 'success' | 'warning' | 'danger' {\n const s = (status || '').toLowerCase();\n if (s === 'busy' || s === 'working') return 'info';\n if (s === 'idle') return 'neutral';\n if (s === 'error' || s === 'stuck') return 'danger';\n if (s === 'paused') return 'warning';\n return 'neutral';\n}\n\nfunction statusLabel(status: string | undefined): string {\n const s = (status || '').toLowerCase();\n if (s === 'working') return 'working';\n if (!s) return 'idle';\n return s;\n}\n\nfunction relativeMs(ms: number | undefined | null): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\ninterface NodeRowProps {\n node: HierarchyNode;\n depth: number;\n expanded: Set<string>;\n onToggle: (name: string) => void;\n}\n\nfunction NodeRow({ node, depth, expanded, onToggle }: NodeRowProps): JSX.Element {\n const hasChildren = node.children.length > 0;\n const isOpen = expanded.has(node.name);\n const agent = node.agent;\n const tone = statusToTone(agent?.status);\n const status = statusLabel(agent?.status);\n return (\n <>\n <div\n data-testid={`agent-hierarchy-node-${node.name}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto auto',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-2) var(--space-3)',\n paddingLeft: `calc(var(--space-3) + ${depth * 24}px)`,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-1)',\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n data-testid={`agent-hierarchy-toggle-${node.name}`}\n aria-label={isOpen ? 'Collapse' : 'Expand'}\n onClick={() => onToggle(node.name)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {isOpen ? <ChevronDown size={12} aria-hidden /> : <ChevronRight size={12} aria-hidden />}\n </button>\n ) : (\n <span aria-hidden style={{ width: 22, height: 22, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: 'var(--fg-subtle)' }}>\n <GitBranch size={12} />\n </span>\n )}\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600, color: 'var(--fg)' }}>{node.name}</div>\n {agent && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {agent.role || agent.category || agent.mode || 'agent'}\n {agent.parent && agent.parent !== node.name && (\n <> · parent <code style={{ fontFamily: 'var(--font-mono)' }}>{agent.parent}</code></>\n )}\n </div>\n )}\n </div>\n {typeof agent?.lastSeen === 'number' && agent.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n {relativeMs(agent.lastSeen)}\n </span>\n )}\n <Badge tone={tone} dot>{status}</Badge>\n </div>\n {hasChildren && isOpen && node.children.map((child) => (\n <NodeRow key={child.name} node={child} depth={depth + 1} expanded={expanded} onToggle={onToggle} />\n ))}\n </>\n );\n}\n\nexport function AgentHierarchy(): JSX.Element {\n const data = useFetch<HierarchyResponse>('/api/agents/hierarchy');\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n // Track which root names we auto-expanded on first load so subsequent\n // user toggles of those roots are honored.\n const [autoRoots, setAutoRoots] = useState<Set<string>>(() => new Set());\n\n const seenRoots = useMemo(() => data.data?.roots?.map((n) => n.name) ?? [], [data.data]);\n\n // On first successful load, auto-expand every root and remember the set so\n // a future toggle of a root is a real state change (no longer masked by\n // the auto-expand).\n if (autoRoots.size === 0 && seenRoots.length > 0) {\n setAutoRoots(new Set(seenRoots));\n setExpanded(new Set(seenRoots));\n }\n\n const onAgentsChange = useCallback(() => data.refetch(), [data]);\n useWsMessage('agents:change', onAgentsChange);\n\n const toggle = useCallback((name: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }, []);\n\n if (data.loading && !data.data) {\n return (\n <Stack gap={3}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n );\n }\n\n const roots = data.data?.roots ?? [];\n if (roots.length === 0) {\n return (\n <Card>\n <CardBody>\n <EmptyState\n icon={<Network size={32} aria-hidden />}\n title=\"No hierarchy yet\"\n description=\"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.\"\n data-testid=\"agent-hierarchy-empty\"\n />\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {roots.length} root agent{roots.length === 1 ? '' : 's'} · {data.data?.all?.length ?? 0} total\n </span>\n </Inline>\n <Stack gap={2}>\n {roots.map((root) => (\n <NodeRow key={root.name} node={root} depth={0} expanded={expanded} onToggle={toggle} />\n ))}\n </Stack>\n </Stack>\n );\n}","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { AgentCard, type AgentCardProps, type AgentStatus } from '../../ui/agents/AgentCard.js';\nimport { AgentDetail } from '../../ui/agents/AgentDetail.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Banner } from '../../ui/feedback/Banner.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';\nimport { AlertTriangle, Bot, Cpu, Pause, Play, Plus, RotateCw } from 'lucide-react';\nimport { AgentHierarchy } from './AgentHierarchy.js';\n\n/**\n * Strip leaked LLM interior monologue from agent card snippets.\n * Clips to the first sentence, caps at 140 chars.\n */\nexport function sanitizeSummary(raw: string | undefined): string {\n if (!raw) return '';\n let s = raw.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, '');\n s = s.split('\\n').filter((l) => !l.includes('```')).join('\\n');\n s = s.replace(/\\bworktree:\\s*/g, '');\n s = s.replace(/\\/tmp\\//g, '');\n s = s.replace(/\\bReason:\\s*/g, '');\n s = s.replace(/^\\s*→\\s*/gm, '');\n s = s.trim();\n if (!s) return '';\n // Strip leading bracketed prefix — [Premise — …] or [Analysis] etc.\n s = s.replace(/^\\[[\\w\\s]+[-—]\\s*/, '');\n s = s.replace(/^\\[[\\w\\s]+\\]\\s*/gi, '');\n s = s.trim();\n if (!s) return '';\n const m = s.match(/^[^.!?\\n]+[.!?]/);\n const first = m ? m[0] : s;\n if (first.length <= 140) return first;\n return first.slice(0, 137) + '…';\n}\n\nconst SOURCE_STORAGE_KEY = 'bizar.agents.sourceFilter';\nconst SOURCE_LABELS = {\n all: 'All',\n bizar: 'Bizar',\n 'claude-code': 'Claude Code',\n} as const;\ntype SourceFilter = keyof typeof SOURCE_LABELS;\nconst VALID_SOURCES = Object.keys(SOURCE_LABELS) as SourceFilter[];\n\nfunction readPersistedSource(): SourceFilter {\n if (typeof localStorage === 'undefined') return 'all';\n const v = localStorage.getItem(SOURCE_STORAGE_KEY);\n return VALID_SOURCES.includes(v as SourceFilter) ? (v as SourceFilter) : 'all';\n}\n\n/** relativeTimeMs — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing/future timestamps. */\nfunction relativeTimeMs(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\n/**\n * AgentsView — Sprint S10. Unified Bizar + Claude Code agents.\n *\n * Two REST calls (Bizar agents from `/api/agents`, CC from\n * `/api/cc-agents`) merged into a single grid. A `source` filter\n * chip switches between `bizar | claude-code | all`. Live updates\n * via `agents:change` and `agent:status` WS events.\n */\n\nfunction mapBizar(a: BizarAgent): AgentCardProps {\n const raw = (a.status || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' || raw === 'stuck' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `bizar:${a.name}`,\n name: a.name,\n role: a.role || a.category || a.mode || 'agent',\n status,\n currentTask: a.currentTaskId ? `Task ${a.currentTaskId}` : undefined,\n lastActivity: a.lastSeen ? new Date(a.lastSeen).toLocaleTimeString() : undefined,\n tasksToday: a.tasksTotal || 0,\n // v9.4.0 — pass real metrics for the new AgentCard strip. The old\n // `tpmHistory` field was dead because AgentCard only renders the\n // sparkline when `length > 1` and we always passed a single point.\n tasksSucceeded: typeof a.tasksSucceeded === 'number' ? a.tasksSucceeded : undefined,\n tasksTotal: typeof a.tasksTotal === 'number' ? a.tasksTotal : undefined,\n successRate: typeof a.successRate === 'number' ? a.successRate : undefined,\n lastSeenMs: typeof a.lastSeen === 'number' && a.lastSeen > 0 ? a.lastSeen : undefined,\n badges: a.tags || [],\n };\n}\n\nfunction mapCC(a: CCAgent): AgentCardProps {\n const raw = (a.status || a.state || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `cc:${a.sessionId || a.id}`,\n name: a.name || a.sessionId?.slice(0, 8) || 'unknown',\n role: a.kind === 'background' ? 'CC background' : 'CC interactive',\n status,\n currentTask: sanitizeSummary(a.lastMessageSnippet),\n lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),\n tasksToday: a.messageCount || 0,\n // CC agents don't expose successRate/tasksSucceeded — only messageCount.\n // Skip the metric strip for them; the badge + lastActivity carry the\n // signal.\n badges: [a.cwd?.split('/').slice(-2).join('/') || ''].filter(Boolean),\n };\n}\n\nexport function AgentsView(): JSX.Element {\n const bizar = useFetch<{ agents?: BizarAgent[] }>('/api/agents');\n const cc = useFetch<{ agents?: CCAgent[]; error?: string }>('/api/cc-agents');\n const stuck = useFetch<{ stuck?: BizarAgent[] }>('/api/agents/stuck');\n const [source, setSource] = useState<SourceFilter>(readPersistedSource);\n const [mode, setMode] = useState<'roster' | 'hierarchy'>('roster');\n useEffect(() => {\n if (typeof localStorage !== 'undefined') localStorage.setItem(SOURCE_STORAGE_KEY, source);\n }, [source]);\n const [bizarList, setBizarList] = useState<BizarAgent[]>([]);\n const [ccList, setCCList] = useState<CCAgent[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openId, setOpenId] = useState<string | null>(null);\n const [createDraft, setCreateDraft] = useState<{ name: string; role: string } | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [restartingNames, setRestartingNames] = useState<Set<string>>(() => new Set());\n\n const saveCreate = async (): Promise<void> => {\n if (createDraft === null || !createDraft.name.trim()) return;\n setCreating(true);\n setCreateError(null);\n try {\n await fetchJson('/api/agents', { method: 'POST', body: { name: createDraft.name.trim(), role: createDraft.role.trim() || 'agent' } });\n setCreateDraft(null);\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n // v9.5.0 S48 — inline Restart from the stuck banner. One-click recovery\n // without forcing the user to drill into the per-agent Sheet. The\n // server broadcasts agents:change on success so the banner refreshes.\n const restartStuck = async (name: string): Promise<void> => {\n setRestartingNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/restart`, { method: 'POST' });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRestartingNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — inline Pause/Resume on the stuck banner. Pause stops\n // heartbeat drain (status='paused'); Resume re-enables\n // (status='idle' so Odin picks the agent up again on the next\n // spawn). Uses the same in-flight Set pattern as restartStuck so\n // all three actions disable each other per-row while pending.\n const [busyStuckNames, setBusyStuckNames] = useState<Set<string>>(() => new Set());\n const setStuckActionStatus = async (name: string, status: 'paused' | 'idle'): Promise<void> => {\n setBusyStuckNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/status`, {\n method: 'POST',\n body: { status },\n });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusyStuckNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — bulk Pause-all-stuck. Fires status='paused' for every\n // agent currently in /api/agents/stuck. Used when a wedged cluster\n // needs to be drained before restart. Per-row actions are still\n // available for selective triage.\n const [bulkBusy, setBulkBusy] = useState<boolean>(false);\n const bulkPauseStuck = async (): Promise<void> => {\n const list = stuck.data?.stuck ?? [];\n if (list.length === 0) return;\n setBulkBusy(true);\n try {\n await Promise.all(list.map((a) =>\n fetchJson(`/api/agents/${encodeURIComponent(a.name)}/status`, {\n method: 'POST',\n body: { status: 'paused' },\n }).catch((err) => {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n return null;\n }),\n ));\n stuck.refetch();\n bizar.refetch();\n } finally {\n setBulkBusy(false);\n }\n };\n\n useEffect(() => {\n if (!initialized && bizar.data?.agents !== undefined && cc.data?.agents !== undefined) {\n setInitialized(true);\n setBizarList(bizar.data.agents);\n setCCList(cc.data.agents);\n }\n }, [bizar.data, cc.data, initialized]);\n\n const onAgentsChange = useCallback(() => {\n // Bust both caches; the next mount will re-fetch (cheap because\n // the dashboard views are lazy-mounted).\n bizar.refetch();\n cc.refetch();\n }, [bizar, cc]);\n useWsMessage('agents:change', onAgentsChange);\n\n const onAgentStatus = useCallback((msg: WsMessage) => {\n if (msg.type !== 'agent:status') return;\n const a = (msg as Extract<WsMessage, { type: 'agent:status' }>).agent;\n if (!a || !a.name) return;\n setBizarList((prev) => {\n const idx = prev.findIndex((x) => x.name === a.name);\n if (idx === -1) return [...prev, a];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...a };\n return copy;\n });\n }, []);\n useWsMessage('agent:status', onAgentStatus);\n\n const cards = useMemo(() => {\n const out: Array<AgentCardProps & { source: 'bizar' | 'claude-code' }> = [];\n if (source !== 'claude-code') {\n for (const a of bizarList) out.push({ ...mapBizar(a), source: 'bizar' });\n }\n if (source !== 'bizar') {\n for (const a of ccList) out.push({ ...mapCC(a), source: 'claude-code' });\n }\n return out;\n }, [bizarList, ccList, source]);\n\n return (\n <Stack gap={5} data-testid=\"agents-view\">\n <ViewHeader\n title=\"Agents\"\n description=\"Bizar agents (frontmatter-driven) and Claude Code background agents.\"\n actions={\n <Button variant=\"primary\" onClick={() => setCreateDraft({ name: '', role: '' })} data-testid=\"agent-create-open\">\n <Plus size={14} aria-hidden /> New agent\n </Button>\n }\n />\n <ListHeader\n title=\"Roster\"\n count={cards.length}\n description={stuck.data?.stuck && stuck.data.stuck.length > 0 ? `${stuck.data.stuck.length} stuck` : undefined}\n testid=\"agents-list-header\"\n />\n {(stuck.data?.stuck ?? []).length > 0 && (\n <Banner\n tone=\"warning\"\n data-testid=\"agents-stuck-banner\"\n action={\n <Inline gap={2}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void bulkPauseStuck(); }}\n disabled={bulkBusy}\n data-testid=\"agents-stuck-bulk-pause\"\n title=\"Pause every stuck agent at once\"\n >\n <Pause size={12} aria-hidden /> {bulkBusy ? 'Pausing…' : 'Pause all'}\n </Button>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setMode('hierarchy')}>\n View details\n </Button>\n </Inline>\n }\n >\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <AlertTriangle size={14} aria-hidden style={{ color: 'var(--warning)' }} />\n <span>\n {(stuck.data?.stuck ?? []).length} agent{stuck.data && stuck.data.stuck && stuck.data.stuck.length === 1 ? '' : 's'} stuck (no heartbeat >5m)\n </span>\n </Inline>\n <Stack gap={1}>\n {(stuck.data?.stuck ?? []).map((s) => {\n const restarting = restartingNames.has(s.name);\n const paused = s.status === 'paused';\n const busy = restarting || busyStuckNames.has(s.name);\n return (\n <Inline key={s.name} align=\"center\" justify=\"between\" gap={2} data-testid={`agents-stuck-row-${s.name}`}>\n <Inline gap={2} align=\"center\">\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{s.name}</code>\n <Badge tone={paused ? 'warning' : 'danger'}>{paused ? 'paused' : (s.status || 'stuck')}</Badge>\n {typeof s.lastSeen === 'number' && s.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n last seen {relativeTimeMs(s.lastSeen)}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {paused ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'idle'); }}\n data-testid={`agents-stuck-resume-${s.name}`}\n >\n <Play size={12} aria-hidden /> Resume\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'paused'); }}\n data-testid={`agents-stuck-pause-${s.name}`}\n >\n <Pause size={12} aria-hidden /> Pause\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void restartStuck(s.name); }}\n data-testid={`agents-stuck-restart-${s.name}`}\n >\n <RotateCw size={12} aria-hidden /> {restarting ? 'Restarting…' : 'Restart'}\n </Button>\n </Inline>\n </Inline>\n );\n })}\n </Stack>\n </Stack>\n </Banner>\n )}\n <Inline align=\"center\" justify=\"between\" wrap gap={2}>\n <Inline gap={2}>\n {(['all', 'bizar', 'claude-code'] as SourceFilter[]).map((id) => (\n <Chip\n key={id}\n selected={source === id}\n onClick={() => setSource(id)}\n >\n {id === 'bizar' ? <Bot size={12} aria-hidden /> : id === 'claude-code' ? <Cpu size={12} aria-hidden /> : null}{' '}\n {SOURCE_LABELS[id]}\n </Chip>\n ))}\n </Inline>\n <Inline gap={2}>\n <Chip\n data-testid=\"agents-mode-roster\"\n selected={mode === 'roster'}\n onClick={() => setMode('roster')}\n >\n Roster\n </Chip>\n <Chip\n data-testid=\"agents-mode-hierarchy\"\n selected={mode === 'hierarchy'}\n onClick={() => setMode('hierarchy')}\n >\n Hierarchy\n </Chip>\n </Inline>\n </Inline>\n {mode === 'hierarchy' ? (\n <AgentHierarchy />\n ) : cards.length === 0 && (bizar.loading || cc.loading) ? (\n <Grid cols={3}>\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n </Grid>\n ) : cards.length === 0 && (bizar.error || cc.error) ? (\n <ErrorState\n block\n title=\"Couldn't load agents\"\n description=\"Both bizar and CC roster endpoints failed. Retry to refetch.\"\n error={bizar.error ?? cc.error}\n onRetry={() => { void bizar.refetch(); void cc.refetch(); }}\n testid=\"agents-error\"\n />\n ) : cards.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)' }}>\n No agents yet. Run <code>/loop</code> or spawn one via the command palette.\n </span>\n ) : (\n <Grid cols={3}>\n {cards.map((c) => (\n <AgentCard key={c.id} {...c} onOpen={() => setOpenId(c.id)} />\n ))}\n </Grid>\n )}\n\n {openId !== null && (() => {\n const sel = cards.find((c) => c.id === openId);\n if (!sel) return null;\n const ccSource = sel.source === 'claude-code' ? ccList.find((a) => sel.id === `cc:${a.sessionId || a.id}`) : undefined;\n const bzSource = sel.source === 'bizar' ? bizarList.find((a) => sel.id === `bizar:${a.name}`) : undefined;\n return (\n <AgentDetail\n agentId={sel.id}\n name={sel.name}\n role={sel.role}\n status={sel.status}\n currentTask={sel.currentTask}\n startedAt={ccSource?.startedAt ?? bzSource?.lastSeen}\n messageCount={ccSource?.messageCount}\n lastMessageSnippet={ccSource?.lastMessageSnippet}\n successRate={bzSource?.successRate}\n tasksTotal={bzSource?.tasksTotal}\n open={openId !== null}\n onOpenChange={(o) => { if (!o) setOpenId(null); }}\n />\n );\n })()}\n\n {/* v9.2.0 — create-agent Sheet. Closes the audit-flagged \"no way\n to add a new agent\" HIGH gap. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New agent\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-name\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</label>\n <Input\n id=\"agent-create-name\"\n value={createDraft.name}\n onChange={(e) => setCreateDraft({ ...createDraft, name: e.target.value })}\n placeholder=\"e.g. frigg\"\n disabled={creating}\n data-testid=\"agent-create-name\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-role\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Role (optional)</label>\n <Input\n id=\"agent-create-role\"\n value={createDraft.role}\n onChange={(e) => setCreateDraft({ ...createDraft, role: e.target.value })}\n placeholder=\"e.g. code-review\"\n disabled={creating}\n data-testid=\"agent-create-role\"\n />\n </Stack>\n {createError !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{createError}</span>}\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => { void saveCreate(); }} disabled={creating || !createDraft.name.trim()} data-testid=\"agent-create-submit\">\n Create agent\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["ClipboardCopy","createLucideIcon","Octagon","STATUS_LABEL","STATUS_TONE","STATUS_FG","relativeTime","ms","delta","sec","min","hr","successTone","rate","lastSeenTone","AgentCard","props","name","role","status","lastActivity","currentTask","tasksToday","tasksSucceeded","tasksTotal","successRate","lastSeenMs","onOpen","badges","className","showMetrics","jsxs","cx","jsx","Avatar","Badge","Activity","Zap","ProgressBar","MAX_EVENTS","AgentLiveOutput","sessionId","paused","events","setEvents","useState","setStatus","error","setError","pausedLocal","setPausedLocal","autoScroll","setAutoScroll","containerRef","useRef","sourceRef","useEffect","url","src","onSnapshot","ev","data","onEvent","prev","next","onEnd","onErrEv","el","renderEvent","idx","tone","_a","label","_b","text","_c","Stack","Inline","Button","p","Play","Pause","RefreshCw","e","atBottom","parseId","agentId","AgentDetail","open","onOpenChange","startedAt","messageCount","lastMessageSnippet","source","key","prompt","setPrompt","busy","setBusy","message","setMessage","lastProcessId","setLastProcessId","tasksQuery","useFetch","myTasks","useMemo","t","md","runAction","method","endpoint","body","res","fetchJson","sessionExtra","err","sendPrompt","trimmed","restart","seed","kill","copyId","Sheet","SheetContent","formatDuration","ActivityIcon","Textarea","Send","Skeleton","RotateCw","Card","CardBody","statusToTone","statusLabel","relativeMs","NodeRow","node","depth","expanded","onToggle","hasChildren","isOpen","agent","Fragment","ChevronDown","ChevronRight","GitBranch","child","AgentHierarchy","setExpanded","autoRoots","setAutoRoots","seenRoots","n","onAgentsChange","useCallback","useWsMessage","toggle","roots","EmptyState","Network","root","sanitizeSummary","raw","m","first","SOURCE_STORAGE_KEY","SOURCE_LABELS","VALID_SOURCES","readPersistedSource","v","relativeTimeMs","mapBizar","a","mapCC","AgentsView","bizar","cc","stuck","setSource","mode","setMode","bizarList","setBizarList","ccList","setCCList","initialized","setInitialized","openId","setOpenId","createDraft","setCreateDraft","creating","setCreating","createError","setCreateError","restartingNames","setRestartingNames","saveCreate","FetchError","restartStuck","busyStuckNames","setBusyStuckNames","setStuckActionStatus","bulkBusy","setBulkBusy","bulkPauseStuck","list","onAgentStatus","msg","x","copy","cards","out","ViewHeader","Plus","ListHeader","Banner","AlertTriangle","_d","s","restarting","id","Chip","Bot","Cpu","Grid","ErrorState","c","sel","ccSource","bzSource","o","Input"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as v,R as x,j as e}from"./cmdk-
|
|
1
|
+
import{r as v,R as x,j as e}from"./cmdk-C3F6LD6N.js";import{c as g,g as m}from"./main-BZMmD6a8.js";import{C as u}from"./circle-alert-D7jn06kH.js";import{T as h}from"./triangle-alert-DLmUhymD.js";import{C as p}from"./circle-check-DHs37Sot.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert-
|
|
1
|
+
{"version":3,"file":"Alert-MwVEymjy.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/info.js","../../src/web/v8/ui/feedback/Alert.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport React from 'react';\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Alert — inline contextual message.\n *\n * Tones: info | success | warning | danger.\n *\n * Use cases: empty states, inline help text, error banners inside forms.\n * For status pulses (topbar live indicator) use a small dot, not an Alert.\n */\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nconst ICON = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertCircle,\n} as const;\n\nconst TONE_BG = {\n info: 'color-mix(in oklch, var(--info) 12%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 12%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 12%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 12%, var(--surface-1))',\n} as const;\n\nconst TONE_FG = {\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n} as const;\n\nconst TONE_BORDER = {\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n} as const;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n /** Optional right-aligned action (button). */\n action?: ReactNode;\n /** Override the leading icon. Pass `false` to hide. */\n icon?: ReactNode | false;\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(props, ref) {\n const { tone = 'info', title, children, action, icon, className, ...rest } = props;\n const showIcon = icon !== false;\n const IconNode = icon === false ? null : (icon ?? React.createElement(ICON[tone], { size: 16, 'aria-hidden': true }));\n return (\n <div\n ref={ref}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n className={cx('v8-alert', `v8-alert--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: TONE_BG[tone],\n border: '1px solid',\n borderColor: TONE_BORDER[tone],\n borderRadius: 'var(--radius)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n {showIcon && IconNode !== null && (\n <span style={{ color: TONE_FG[tone], flexShrink: 0, marginTop: 1, display: 'inline-flex' }}>\n {IconNode}\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n {title !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>{title}</div>\n )}\n {children !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{children}</div>\n )}\n </div>\n {action !== undefined && (\n <div style={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>{action}</div>\n )}\n </div>\n );\n});"],"names":["Info","createLucideIcon","ICON","CheckCircle2","AlertTriangle","AlertCircle","TONE_BG","TONE_FG","TONE_BORDER","Alert","forwardRef","props","ref","tone","title","children","action","icon","className","rest","showIcon","IconNode","React","jsxs","cx","jsx"],"mappings":"kPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,CAAC,ECGKC,EAAO,CACX,KAAMF,EACN,QAASG,EACT,QAASC,EACT,OAAQC,CACV,EAEMC,EAAU,CACd,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,0DACV,EAEMC,EAAU,CACd,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEMC,EAAc,CAClB,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,uDACV,EAYaC,EAAQC,EAAAA,WAAuC,SAAeC,EAAOC,EAAK,CACrF,KAAM,CAAE,KAAAC,EAAO,OAAQ,MAAAC,EAAO,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,EAAM,UAAAC,EAAW,GAAGC,CAAA,EAASR,EACvES,EAAWH,IAAS,GACpBI,EAAWJ,IAAS,GAAQ,KAAQA,GAAQK,EAAM,cAAcpB,EAAKW,CAAI,EAAG,CAAE,KAAM,GAAI,cAAe,GAAM,EACnH,OACEU,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,KAAMC,IAAS,UAAYA,IAAS,UAAY,QAAU,SAC1D,UAAWW,EAAG,WAAY,aAAaX,CAAI,GAAIK,CAAS,EACxD,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,gCACT,WAAYZ,EAAQO,CAAI,EACxB,OAAQ,YACR,YAAaL,EAAYK,CAAI,EAC7B,aAAc,gBACd,MAAO,WAAA,EAER,GAAGM,EAEH,SAAA,CAAAC,GAAYC,IAAa,MACxBI,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOlB,EAAQM,CAAI,EAAG,WAAY,EAAG,UAAW,EAAG,QAAS,aAAA,EACxE,SAAAQ,EACH,EAEFE,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,EAAG,QAAS,OAAQ,cAAe,SAAU,IAAK,kBAChF,SAAA,CAAAT,IAAU,QACTW,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EAEnEC,IAAa,QACZU,MAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAV,CAAA,CAAS,CAAA,EAElF,EACCC,IAAW,QACVS,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,WAAY,EAAG,QAAS,OAAQ,WAAY,QAAA,EAAa,SAAAT,CAAA,CAAO,CAAA,CAAA,CAAA,CAItF,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as l,j as e}from"./cmdk-
|
|
1
|
+
import{r as l,j as e}from"./cmdk-C3F6LD6N.js";import{c as F,I as f,G as H,S as m,d as x,u as w,h as k,L as O,i as z,F as M}from"./main-BZMmD6a8.js";import{V as P}from"./ViewHeader-BaCWNuVX.js";import{C as $,b as D}from"./Card-BmXiT4c6.js";import{I as C}from"./Input-cAQOvR8U.js";import{T as R}from"./Textarea-CcQGSgSH.js";import{S as E,a as A}from"./Sheet-CxXf6gvC.js";import{E as V}from"./EmptyState-CdDQmfEL.js";import{T as X}from"./triangle-alert-DLmUhymD.js";import{E as L}from"./external-link-C4pHGbz2.js";import{R as I}from"./refresh-ccw-BL7B0NO1.js";import{P as K}from"./plus-uA5Ecuch.js";import{T as N}from"./trash-2-B885GY46.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|