@polderlabs/bizar 10.4.4 → 10.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js → ActivityFeed-Bw4Cai7r.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js.map → ActivityFeed-Bw4Cai7r.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js → ActivityView-BC0QQ_j9.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js.map → ActivityView-BC0QQ_j9.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-BjczABeB.js → AdminView-CLTNKFL4.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-BjczABeB.js.map → AdminView-CLTNKFL4.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js → AgentActivity-DBWDByjk.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js.map → AgentActivity-DBWDByjk.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js → AgentsView-DD6bCIbA.js} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js.map → AgentsView-DD6bCIbA.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-BZGk39mB.js → Alert-pzFISNtS.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-BZGk39mB.js.map → Alert-pzFISNtS.js.map} +1 -1
- package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js +21 -0
- package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js.map +1 -0
- package/bizar-dash/dist/assets/{AuthView-D4frSShw.js → AuthView-BZ-bPIOM.js} +2 -2
- package/bizar-dash/dist/assets/AuthView-BZ-bPIOM.js.map +1 -0
- package/bizar-dash/dist/assets/{Avatar-BYg0rkPA.js → Avatar-CRW81ewE.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-BYg0rkPA.js.map → Avatar-CRW81ewE.js.map} +1 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js +1 -0
- package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js.map +1 -0
- package/bizar-dash/dist/assets/{BackupView-B875KQa4.js → BackupView-u_O3j0TG.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-B875KQa4.js.map → BackupView-u_O3j0TG.js.map} +1 -1
- package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js → Banner-Du-3l05O.js} +1 -1
- package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js.map → Banner-Du-3l05O.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-BtsmkhJa.js → Card-Clkvh43Q.js} +1 -1
- package/bizar-dash/dist/assets/{Card-BtsmkhJa.js.map → Card-Clkvh43Q.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js → ChatView-BTjb3mIh.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js.map → ChatView-BTjb3mIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-XPOk0d_E.js → Chip-B7ovcm01.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-XPOk0d_E.js.map → Chip-B7ovcm01.js.map} +1 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js +1 -0
- package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js.map +1 -0
- package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js +1 -0
- package/bizar-dash/dist/assets/{ClipboardView-CPlTU5VG.js.map → ClipboardView-Cb6XgYZI.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js → ConfigView-DfTJk1uL.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js.map → ConfigView-DfTJk1uL.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js → DiagnosticsView-D5Wy9xlJ.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js.map → DiagnosticsView-D5Wy9xlJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js → DialogsView-HVyfrXpq.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js.map → DialogsView-HVyfrXpq.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js → DoctorView-Dm94WI2z.js} +2 -2
- package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js.map → DoctorView-Dm94WI2z.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js → EmptyState-ccT__JZG.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js.map → EmptyState-ccT__JZG.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js → EnvVarsView-BhcIuJ6V.js} +2 -2
- package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js.map → EnvVarsView-BhcIuJ6V.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js → ErrorState-BSqf65ka.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js.map → ErrorState-BSqf65ka.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js → EvalView-2cbWVBUA.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js.map → EvalView-2cbWVBUA.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js → GoalsView-C3QG5p7T.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js.map → GoalsView-C3QG5p7T.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid--WKvqu5h.js → Grid-Bojq8Sg7.js} +1 -1
- package/bizar-dash/dist/assets/{Grid--WKvqu5h.js.map → Grid-Bojq8Sg7.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js → HistoryView-Bum2TMMw.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js.map → HistoryView-Bum2TMMw.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-h_nSOtwm.js → Input-DV-vdaV8.js} +1 -1
- package/bizar-dash/dist/assets/{Input-h_nSOtwm.js.map → Input-DV-vdaV8.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.js → LibrariesView-DH2E2uNb.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.js.map → LibrariesView-DH2E2uNb.js.map} +1 -1
- package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js +6 -0
- package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js.map +1 -0
- package/bizar-dash/dist/assets/{ListHeader-CM8QoIWG.js → ListHeader-CCD_nIHb.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-CM8QoIWG.js.map → ListHeader-CCD_nIHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js → MemoryView-Cr-obIQY.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js.map → MemoryView-Cr-obIQY.js.map} +1 -1
- package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js → MiscView-CDUQpYuV.js} +1 -1
- package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js.map → MiscView-CDUQpYuV.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js → ModsView-B6OR-a4B.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js.map → ModsView-B6OR-a4B.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js → NotificationsView-CIqtY6D0.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js.map → NotificationsView-CIqtY6D0.js.map} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js → ObsidianView-Nahah8QC.js} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js.map → ObsidianView-Nahah8QC.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js → OverviewView-B6L_wa4M.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js.map → OverviewView-B6L_wa4M.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js → ProgressBar-KC4VXsl_.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js.map → ProgressBar-KC4VXsl_.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js → ProjectsView-DgxWiqHb.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js.map → ProjectsView-DgxWiqHb.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.js → ProvidersView-BOqN9omv.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.js.map → ProvidersView-BOqN9omv.js.map} +1 -1
- package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js +1 -0
- package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js.map +1 -0
- package/bizar-dash/dist/assets/{Select-CiGWEN8I.js → Select-Bf_P0S6H.js} +1 -1
- package/bizar-dash/dist/assets/{Select-CiGWEN8I.js.map → Select-Bf_P0S6H.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js → SettingsRow-CJb-F94Y.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js.map → SettingsRow-CJb-F94Y.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-2HSFJPPK.js → SettingsView-BvOGcgMS.js} +2 -2
- package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js.map +1 -0
- package/bizar-dash/dist/assets/{Sheet-B-CMP9-_.js → Sheet-BwMVGN-8.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-B-CMP9-_.js.map → Sheet-BwMVGN-8.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js → Slider-AjjzqI-5.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js.map → Slider-AjjzqI-5.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js → Sparkline-Z4y0YUZS.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js.map → Sparkline-Z4y0YUZS.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js → Switch-B79a2t-G.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js.map → Switch-B79a2t-G.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js → TasksView-G-s_pwwr.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js.map → TasksView-G-s_pwwr.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js → Textarea-BfXGMXQ7.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js.map → Textarea-BfXGMXQ7.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js → UpdateView-BKx3u9X8.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js.map → UpdateView-BKx3u9X8.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js → UsageView-M01G6bZQ.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js.map → UsageView-M01G6bZQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.js → ViewHeader-BsnaspKw.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.js.map → ViewHeader-BsnaspKw.js.map} +1 -1
- package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js +1 -0
- package/bizar-dash/dist/assets/{VoiceView-aoPVT6LJ.js.map → VoiceView-rWE8vziD.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-DhAzcHUk.js → brain-D7k5s8vH.js} +1 -1
- package/bizar-dash/dist/assets/{brain-DhAzcHUk.js.map → brain-D7k5s8vH.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js → calendar-CAZoDd-l.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js.map → calendar-CAZoDd-l.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js → circle-D99cZJBr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js.map → circle-D99cZJBr.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js → circle-alert-QQTU4Quz.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js.map → circle-alert-QQTU4Quz.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js → circle-check-BMbe7Kkr.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js.map → circle-check-BMbe7Kkr.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js → clock-OtT5mvF3.js} +1 -1
- package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js.map → clock-OtT5mvF3.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-BvJddD8D.js → download-B-mPX5P_.js} +1 -1
- package/bizar-dash/dist/assets/{download-BvJddD8D.js.map → download-B-mPX5P_.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js → external-link-DPDQM1YO.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js.map → external-link-DPDQM1YO.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-BOroDtZE.js → file-text-BsCrv5aP.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-BOroDtZE.js.map → file-text-BsCrv5aP.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-DwPjMRQt.js → filter-Do63x17E.js} +1 -1
- package/bizar-dash/dist/assets/{filter-DwPjMRQt.js.map → filter-Do63x17E.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.js → git-pull-request-CpRAmERC.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.js.map → git-pull-request-CpRAmERC.js.map} +1 -1
- package/bizar-dash/dist/assets/main-BRmJZcHt.js +277 -0
- package/bizar-dash/dist/assets/main-BRmJZcHt.js.map +1 -0
- package/bizar-dash/dist/assets/main-D0TY0myE.css +1 -0
- package/bizar-dash/dist/assets/{network-BcCoCzIY.js → network-DJnHwHX3.js} +1 -1
- package/bizar-dash/dist/assets/{network-BcCoCzIY.js.map → network-DJnHwHX3.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-BllItT2_.js → pause-HitDUnk_.js} +1 -1
- package/bizar-dash/dist/assets/{pause-BllItT2_.js.map → pause-HitDUnk_.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js → pencil-Dkks7eIC.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js.map → pencil-Dkks7eIC.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-mJh67AXo.js → play-blqh0msT.js} +1 -1
- package/bizar-dash/dist/assets/{play-mJh67AXo.js.map → play-blqh0msT.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-BjfntCMC.js → plug-DVvSSe40.js} +1 -1
- package/bizar-dash/dist/assets/{plug-BjfntCMC.js.map → plug-DVvSSe40.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-Cm6-fo14.js → plus-Cps-8lcG.js} +1 -1
- package/bizar-dash/dist/assets/{plus-Cm6-fo14.js.map → plus-Cps-8lcG.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-CXN9y2KV.js → power-DEX4_Xoa.js} +1 -1
- package/bizar-dash/dist/assets/{power-CXN9y2KV.js.map → power-DEX4_Xoa.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js → power-off-upZ4xjaG.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js.map → power-off-upZ4xjaG.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js → refresh-ccw-DN_zCB1h.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js.map → refresh-ccw-DN_zCB1h.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js → refresh-cw-KGm5eQgv.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js.map → refresh-cw-KGm5eQgv.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js → rotate-ccw-D5fkDRgk.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js.map → rotate-ccw-D5fkDRgk.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js → rotate-cw-CClSVUaX.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js.map → rotate-cw-CClSVUaX.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-Y0jPK5D6.js → save-BY4ViPku.js} +1 -1
- package/bizar-dash/dist/assets/{save-Y0jPK5D6.js.map → save-BY4ViPku.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-C8wwPHhR.js → send-CaOL1yQD.js} +1 -1
- package/bizar-dash/dist/assets/{send-C8wwPHhR.js.map → send-CaOL1yQD.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js → shield-alert-DA9K6uZO.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js.map → shield-alert-DA9K6uZO.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js → trash-2-B_Y6HrfN.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js.map → trash-2-B_Y6HrfN.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js → trending-up-qKTUQKIT.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js.map → trending-up-qKTUQKIT.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js → triangle-alert-BeY8LAv6.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js.map → triangle-alert-BeY8LAv6.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-Dy59aZn6.js → upload-BZCtmqIh.js} +1 -1
- package/bizar-dash/dist/assets/{upload-Dy59aZn6.js.map → upload-BZCtmqIh.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-DENVhJnO.js → zap-Bz1Z8y1Q.js} +1 -1
- package/bizar-dash/dist/assets/{zap-DENVhJnO.js.map → zap-Bz1Z8y1Q.js.map} +1 -1
- package/bizar-dash/dist/index.html +2 -2
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/agent-bus.mjs +485 -0
- package/bizar-dash/src/server/api.mjs +6 -0
- package/bizar-dash/src/server/loop-runtime.mjs +429 -0
- package/bizar-dash/src/server/routes/agent-bus.mjs +185 -0
- package/bizar-dash/src/server/routes/loops.mjs +138 -0
- package/bizar-dash/src/server/task-splitter.mjs +241 -0
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +41 -31
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +63 -23
- package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +3 -0
- package/bizar-dash/src/web/v8/ui/feedback/useFocusTrap.ts +58 -0
- package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +1 -0
- package/bizar-dash/src/web/v8/ui/styles/tokens.css +21 -0
- package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +1 -1
- package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +10 -6
- package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +38 -13
- package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +16 -5
- package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +23 -2
- package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +48 -13
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +3 -3
- package/bizar-dash/tests/agent-bus.test.mjs +289 -0
- package/bizar-dash/tests/auth-inputs-labels.test.mjs +45 -0
- package/bizar-dash/tests/background-jobs-action-labels.test.mjs +41 -0
- package/bizar-dash/tests/background-jobs-states.test.mjs +80 -0
- package/bizar-dash/tests/banner-tones.test.mjs +50 -0
- package/bizar-dash/tests/callout-tokens.test.mjs +30 -0
- package/bizar-dash/tests/claude-session-detail-states.test.mjs +67 -0
- package/bizar-dash/tests/components/BackgroundJobsSkeleton.test.tsx +38 -0
- package/bizar-dash/tests/density-tokens.test.mjs +46 -0
- package/bizar-dash/tests/doctor-route-shape.test.mjs +67 -0
- package/bizar-dash/tests/errorstate-retry.test.mjs +42 -0
- package/bizar-dash/tests/lightrag-skeleton.test.mjs +31 -0
- package/bizar-dash/tests/lightrag-states.test.mjs +60 -0
- package/bizar-dash/tests/loop-runtime.test.mjs +312 -0
- package/bizar-dash/tests/loops-agent-bus-routes.test.mjs +293 -0
- package/bizar-dash/tests/modal-focus-trap.test.mjs +114 -0
- package/bizar-dash/tests/orphan-tests-audit.test.mjs +80 -0
- package/bizar-dash/tests/palette-keyboard-nav.test.mjs +123 -0
- package/bizar-dash/tests/schedules-skeleton.test.mjs +25 -0
- package/bizar-dash/tests/schedules-states.test.mjs +67 -0
- package/bizar-dash/tests/sidebar-collapse-animation.test.mjs +37 -0
- package/bizar-dash/tests/sidebar-section-styles.test.mjs +55 -0
- package/bizar-dash/tests/skeleton-height.test.mjs +47 -0
- package/bizar-dash/tests/space-tokens.test.mjs +36 -0
- package/bizar-dash/tests/stattile-loading.test.mjs +28 -0
- package/bizar-dash/tests/task-splitter.test.mjs +268 -0
- package/bizar-dash/tests/topbar-popover-styles.test.mjs +53 -0
- package/bizar-dash/tests/update-channels.test.mjs +67 -0
- package/package.json +1 -1
- package/packages/sdk/${HOME}/.bizar_home/memory/projects/sdk/sessions/2026-07-16-e16c2f59.md +14 -0
- package/packages/sdk/.bizar/learning/instincts.jsonl +5 -0
- package/packages/sdk/package.json +1 -1
- package/scripts/loop-log.txt +29 -0
- package/scripts/loop-tasks.md +79 -0
- package/scripts/overnight-loop.mjs +60 -0
- package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js +0 -21
- package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +0 -1
- package/bizar-dash/dist/assets/AuthView-D4frSShw.js.map +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js +0 -1
- package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js.map +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js +0 -1
- package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js.map +0 -1
- package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +0 -1
- package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js +0 -6
- package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js.map +0 -1
- package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js +0 -1
- package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js.map +0 -1
- package/bizar-dash/dist/assets/SettingsView-2HSFJPPK.js.map +0 -1
- package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +0 -1
- package/bizar-dash/dist/assets/main-B7D_IMTh.css +0 -1
- package/bizar-dash/dist/assets/main-BURAlktW.js +0 -277
- package/bizar-dash/dist/assets/main-BURAlktW.js.map +0 -1
- package/bizar-dash/tests/chat-session-create.test.mjs +0 -391
- package/bizar-dash/tests/chat-session-stream.test.mjs +0 -308
- package/bizar-dash/tests/cline-runner.test.mjs +0 -172
- package/bizar-dash/tests/cline-sessions-detail.test.mjs +0 -434
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"id":"I-gaw005wp","trigger":"Error: ENOENT","action":"investigate path/env mismatch","type":"pitfall","confidence":0.4,"scope":"project","source":"observed","files":[],"created_at":"2026-07-16T22:03:13.646Z","last_validated_at":"2026-07-16T22:03:13.647Z"}
|
|
2
|
+
{"id":"I-svr80lrr","trigger":"Error: ENOENT","action":"investigate path/env mismatch","type":"pitfall","confidence":0.4,"scope":"project","source":"observed","files":[],"created_at":"2026-07-16T22:03:13.647Z","last_validated_at":"2026-07-16T22:03:13.647Z"}
|
|
3
|
+
{"id":"I-r1mco29e","trigger":"Error: ENOENT","action":"investigate path/env mismatch","type":"pitfall","confidence":0.4,"scope":"project","source":"observed","files":[],"created_at":"2026-07-16T22:03:13.648Z","last_validated_at":"2026-07-16T22:03:13.648Z"}
|
|
4
|
+
{"id":"I-ei51pk76","trigger":"command not found","action":"investigate path/env mismatch","type":"pitfall","confidence":0.4,"scope":"project","source":"observed","files":[],"created_at":"2026-07-16T22:03:13.648Z","last_validated_at":"2026-07-16T22:03:13.648Z"}
|
|
5
|
+
{"id":"I-x1s06wq0","trigger":"command not found","action":"investigate path/env mismatch","type":"pitfall","confidence":0.4,"scope":"project","source":"observed","files":[],"created_at":"2026-07-16T22:03:13.648Z","last_validated_at":"2026-07-16T22:03:13.648Z"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
2026-07-16T22:15:03Z task=1 status=done title="BackgroundJobs error/empty states"
|
|
2
|
+
2026-07-17T09:26:01Z task=loop status=halted reason="user requested stop"
|
|
3
|
+
2026-07-17T09:29:03Z task=3 status=done title="LightRAG error/empty states"
|
|
4
|
+
2026-07-17T09:33:40Z task=2 status=done title="Schedules error/empty states"
|
|
5
|
+
2026-07-17T09:34:53Z task=4 status=done title="ClaudeSessionDetail error/empty"
|
|
6
|
+
2026-07-17T09:42:00Z task=8 status=done title="Auth inputs labels"
|
|
7
|
+
2026-07-17T09:46:00Z task=9 status=skipped reason="LightRAG inputs already labeled"
|
|
8
|
+
2026-07-17T09:46:00Z task=10 status=done title="BackgroundJobs action buttons a11y"
|
|
9
|
+
2026-07-17T09:42:30Z task=5 status=done title="BackgroundJobs skeleton rows"
|
|
10
|
+
2026-07-17T09:42:30Z task=6 status=done title="Schedules skeleton rows"
|
|
11
|
+
2026-07-17T09:42:30Z task=7 status=done title="LightRAG skeleton rows"
|
|
12
|
+
2026-07-17T09:52:00Z task=11 status=done title="Topbar Popover inline styles"
|
|
13
|
+
2026-07-17T09:52:00Z task=12 status=done title="Sidebar section header inline styles"
|
|
14
|
+
2026-07-17T09:53:00Z task=27 status=done title="Sidebar section header inline styles (TaskList)"
|
|
15
|
+
2026-07-17T10:01:00Z task=15 status=done title="Inline hex → callout tokens"
|
|
16
|
+
2026-07-17T10:01:00Z task=16 status=done title="Hardcoded px → space tokens"
|
|
17
|
+
2026-07-17T10:11:00Z task=17 status=done title="Banner tone variants"
|
|
18
|
+
2026-07-17T10:11:00Z task=18 status=done title="StatTile loading"
|
|
19
|
+
2026-07-17T10:11:00Z task=19 status=done title="ErrorState retry"
|
|
20
|
+
2026-07-17T10:11:00Z task=20 status=done title="Skeleton height"
|
|
21
|
+
2026-07-17T10:18:00Z task=21 status=done title="Doctor route data shape"
|
|
22
|
+
2026-07-17T10:18:00Z task=22 status=done title="Update route channels"
|
|
23
|
+
2026-07-17T10:25:00Z task=13 status=done title="Focus trap on Modals"
|
|
24
|
+
2026-07-17T10:25:00Z task=14 status=done title="Palette keyboard nav"
|
|
25
|
+
2026-07-17T10:25:00Z task=23 status=done title="Orphan tests cleanup (cline-*)"
|
|
26
|
+
2026-07-17T10:25:00Z task=24 status=skipped reason="no remaining orphans at v10.4.x"
|
|
27
|
+
2026-07-17T10:31:00Z task=25 status=done title="Theme tokens: tonal backgrounds"
|
|
28
|
+
2026-07-17T10:31:00Z task=26 status=done title="Density-aware spacing tokens"
|
|
29
|
+
2026-07-17T10:31:00Z task=27 status=done title="Sidebar collapse animation"
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Overnight Dashboard Loop — Task Queue
|
|
2
|
+
|
|
3
|
+
Each task is bounded, atomic, safe. Tasks execute in order. After each task:
|
|
4
|
+
1. Run `npm run typecheck` (must pass).
|
|
5
|
+
2. Run `npm run build:dash` (must pass).
|
|
6
|
+
3. Run `cd /home/drb0rk/projects/BizarHarness/bizar-dash && npx vitest --run` (new tests must pass; pre-existing failures are tolerable).
|
|
7
|
+
4. Run `node --test` on the new test file.
|
|
8
|
+
5. Commit atomically with conventional-commit message.
|
|
9
|
+
6. Loop to next task.
|
|
10
|
+
|
|
11
|
+
Stop conditions:
|
|
12
|
+
- 3 consecutive typecheck failures → halt.
|
|
13
|
+
- Build size grows >10% in any single commit → halt.
|
|
14
|
+
- 5 consecutive tasks with no new test passing → halt.
|
|
15
|
+
|
|
16
|
+
## Task Queue
|
|
17
|
+
|
|
18
|
+
### Priority 1 — ErrorState coverage (highest signal wins)
|
|
19
|
+
|
|
20
|
+
1. **BackgroundJobs error state** — `BackgroundJobs/BackgroundJobsView.tsx` lacks error/empty handling. Add `<ErrorState>` when fetch fails, `<EmptyState>` when 0 jobs. **Files:** 1 source + 1 test.
|
|
21
|
+
2. **Schedules error state** — `Schedules/SchedulesView.tsx` lacks error/empty. **Files:** 1 + 1.
|
|
22
|
+
3. **LightRAG error state** — `LightRAG/LightRAGView.tsx` lacks error/empty. **Files:** 1 + 1.
|
|
23
|
+
4. **ClaudeSessionDetail error state** — `ClaudeSessions/ClaudeSessionDetail.tsx` lacks error/empty. **Files:** 1 + 1.
|
|
24
|
+
|
|
25
|
+
### Priority 2 — Loading skeletons on first paint
|
|
26
|
+
|
|
27
|
+
5. **BackgroundJobs skeleton** — render `<Skeleton>` rows while `loading=true`. **Files:** 1 + 1.
|
|
28
|
+
6. **Schedules skeleton** — same. **Files:** 1 + 1.
|
|
29
|
+
7. **LightRAG skeleton** — same. **Files:** 1 + 1.
|
|
30
|
+
|
|
31
|
+
### Priority 3 — A11y label sweeps
|
|
32
|
+
|
|
33
|
+
8. **Auth inputs labels** — `Auth/AuthView.tsx` likely has unlabeled inputs. Wrap each in `<label>` or set aria-label. **Files:** 1 + 1.
|
|
34
|
+
9. **LightRAG inputs labels** — same sweep. **Files:** 1 + 1.
|
|
35
|
+
10. **BackgroundJobs action buttons** — sweep for unlabeled buttons. **Files:** 1 + 1.
|
|
36
|
+
|
|
37
|
+
### Priority 4 — Inline-style → primitive migrations
|
|
38
|
+
|
|
39
|
+
11. **Topbar Popover content** — replace inline styles in `Topbar.tsx:144-194` (PopoverContent) with design-system `Menu/MenuItem`. **Files:** 1 + 1.
|
|
40
|
+
12. **Sidebar section header styles** — `Sidebar.tsx:362-414` section toggle visual. **Files:** 1 + 1.
|
|
41
|
+
|
|
42
|
+
### Priority 5 — Keyboard / interaction polish
|
|
43
|
+
|
|
44
|
+
13. **Focus trap on Modals** — `NewSessionModal.tsx` + Sheet components. Verify ESC closes; ensure focus is trapped inside. **Files:** 1 + 1.
|
|
45
|
+
14. **Palette keyboard nav** — verify arrow keys cycle results in `AppCommandPalette.tsx`. **Files:** 1 + 1.
|
|
46
|
+
|
|
47
|
+
### Priority 6 — Token / color hygiene
|
|
48
|
+
|
|
49
|
+
15. **Inline hex colors** — search for `#[0-9a-f]{3,6}` in view files; replace with `var(--*)` tokens. **Files:** multi.
|
|
50
|
+
16. **Hardcoded px → space tokens** — search for inline `padding: 4` / `8` / `12` in views; map to `var(--space-*)`. **Files:** multi.
|
|
51
|
+
|
|
52
|
+
### Priority 7 — Test coverage for existing primitives
|
|
53
|
+
|
|
54
|
+
17. **Banner tone variants test** — covers all 4 tones. **Files:** 1 test only.
|
|
55
|
+
18. **StatTile loading test** — covers loading=true vs false. **Files:** 1 test only.
|
|
56
|
+
19. **ErrorState retry callback test** — Retry button calls onRetry. **Files:** 1 test only.
|
|
57
|
+
20. **Skeleton height test** — assert height prop passes through. **Files:** 1 test only.
|
|
58
|
+
|
|
59
|
+
### Priority 8 — Doc/diagnostic surfaces
|
|
60
|
+
|
|
61
|
+
21. **Doctor route data test** — fetch `/api/doctor`, assert shape. **Files:** 1 test only.
|
|
62
|
+
22. **Update route channels test** — `/api/update?channel=beta|stable` returns. **Files:** 1 test only.
|
|
63
|
+
|
|
64
|
+
### Priority 9 — Deletion candidates (small files, no consumers)
|
|
65
|
+
|
|
66
|
+
23. Audit `bizar-dash/src/web/v8/views/__tests__/` for orphan tests and delete any referencing deleted files. **Files:** test deletes.
|
|
67
|
+
24. Same for `bizar-dash/tests/*.test.{mjs,ts,tsx}` referencing deleted components. **Files:** test deletes.
|
|
68
|
+
|
|
69
|
+
### Priority 10 — Visual polish
|
|
70
|
+
|
|
71
|
+
25. **Theme tokens: add --color-success-bg / --color-warning-bg** for inline tonal backgrounds. **Files:** globals.css + 1 test.
|
|
72
|
+
26. **Density-aware spacing** — switch `var(--space-*)` to density-aware variants in compact mode. **Files:** 1 + 1.
|
|
73
|
+
27. **Sidebar collapse animation** — add 200ms ease transition to width. **Files:** 1 + 1.
|
|
74
|
+
|
|
75
|
+
## Notes
|
|
76
|
+
|
|
77
|
+
- All tasks touch only `bizar-dash/src/web/v8/` + `bizar-dash/tests/` + `bizar-dash/src/web/v8/ui/styles/`.
|
|
78
|
+
- No server-side changes. No API contract changes. No new deps.
|
|
79
|
+
- Pre-existing vitest failures (App, artifacts, changelog, Doctor, Diagnostics tests) — leave alone.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scripts/overnight-loop.mjs — queue inspector for the overnight loop.
|
|
4
|
+
*
|
|
5
|
+
* Reads scripts/loop-tasks.md, parses the numbered task queue, and
|
|
6
|
+
* prints it. The actual iteration loop runs in the Claude Code
|
|
7
|
+
* conversation: each wake-up picks the next task from the queue and
|
|
8
|
+
* dispatches a Thor subagent to implement + test + commit it.
|
|
9
|
+
*
|
|
10
|
+
* Stop sentinel: create a file at /home/drb0rk/projects/BizarHarness/STOP
|
|
11
|
+
* and the next wake-up will halt instead of dispatching another task.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* node scripts/overnight-loop.mjs # print queue
|
|
15
|
+
* node scripts/overnight-loop.mjs --dry-run --from=5 # preview
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
19
|
+
import { resolve, dirname } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
const ROOT = resolve(__dirname, '..');
|
|
24
|
+
|
|
25
|
+
const DRY_RUN = process.argv.includes('--dry-run');
|
|
26
|
+
const FROM = Number(process.argv.find((a) => a.startsWith('--from='))?.split('=')[1] ?? '1');
|
|
27
|
+
|
|
28
|
+
function parseTasks(md) {
|
|
29
|
+
const tasks = [];
|
|
30
|
+
const lines = md.split('\n');
|
|
31
|
+
let current = null;
|
|
32
|
+
let block = [];
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
const m = line.match(/^###\s+Task\s+(\d+)\.\s+(.+)$/);
|
|
35
|
+
if (m) {
|
|
36
|
+
if (current) tasks.push({ n: current.n, title: current.title, block: block.join('\n') });
|
|
37
|
+
current = { n: Number(m[1]), title: m[2].trim() };
|
|
38
|
+
block = [];
|
|
39
|
+
} else if (current) {
|
|
40
|
+
block.push(line);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (current) tasks.push({ n: current.n, title: current.title, block: block.join('\n') });
|
|
44
|
+
return tasks;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const stopPath = resolve(ROOT, 'STOP');
|
|
48
|
+
const md = readFileSync(resolve(__dirname, 'loop-tasks.md'), 'utf8');
|
|
49
|
+
const tasks = parseTasks(md);
|
|
50
|
+
|
|
51
|
+
console.log(`Queue: ${tasks.length} tasks`);
|
|
52
|
+
console.log(`Stop sentinel: ${existsSync(stopPath) ? 'PRESENT (loop will halt)' : 'absent'}\n`);
|
|
53
|
+
for (const t of tasks) {
|
|
54
|
+
if (t.n < FROM) continue;
|
|
55
|
+
console.log(`#${t.n} ${t.title}`);
|
|
56
|
+
if (DRY_RUN) {
|
|
57
|
+
console.log(t.block.trim().split('\n').map((l) => ' ' + l).join('\n'));
|
|
58
|
+
console.log();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import{r as l,j as e}from"./cmdk-C3F6LD6N.js";import{d as F,I as f,G as H,S as m,B as g,u as w,h as k,L as V,i as z,F as M}from"./main-BURAlktW.js";import{V as O}from"./ViewHeader-C-t1U2cQ.js";import{C as $,b as D}from"./Card-BtsmkhJa.js";import{I as C}from"./Input-h_nSOtwm.js";import{T as R}from"./Textarea-xnAybFGd.js";import{S as A,a as E}from"./Sheet-B-CMP9-_.js";import{E as P}from"./EmptyState-DjKtY1Qi.js";import{T as X}from"./triangle-alert-B2oHbmoh.js";import{E as L}from"./external-link-DvL89gaZ.js";import{R as I}from"./refresh-ccw-DA8_IB9l.js";import{P as K}from"./plus-Cm6-fo14.js";import{T as B}from"./trash-2-D6qePV_q.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 G=F("FileCode",[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]]);function N({payload:t,slug:r}){const[i,c]=l.useState(!1);return t.kind==="mdx"?e.jsx($,{variant:"default","data-testid":`claude-view-${r}`,children:e.jsx(D,{children:e.jsxs(f,{align:"center",gap:2,children:[e.jsx(H,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Legacy MDX — ",Array.isArray(t.blocks)?`${t.blocks.length} blocks`:"no blocks"]})]})})}):t.html?e.jsxs(m,{gap:2,"data-testid":`claude-view-${r}`,children:[t.safeMode&&e.jsxs(f,{align:"center",gap:2,style:{padding:"var(--space-2)",background:"var(--callout-warning-bg, #fdf6e3)",border:"1px solid var(--callout-warning-border, #e0c97d)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-12)"},role:"status","data-testid":`claude-safe-${r}`,children:[e.jsx(X,{size:14,"aria-hidden":!0,style:{color:"#b58900"}}),e.jsx("span",{children:"Safe mode — the compiler stripped potentially dangerous patterns in this artifact."})]}),t.warnings&&t.warnings.length>0&&e.jsxs("details",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:[e.jsxs("summary",{children:[t.warnings.length," warning(s)"]}),e.jsx("ul",{style:{marginTop:"var(--space-1)"},children:t.warnings.map((s,d)=>e.jsxs("li",{children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)"},children:s.pattern})," ","— ",s.message]},d))})]}),e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:[t.kind," · compiled ",t.compiledAt?new Date(t.compiledAt).toLocaleTimeString():"now"]}),e.jsxs(f,{gap:1,children:[e.jsx(g,{variant:"ghost",onClick:()=>c(s=>!s),"data-testid":`claude-source-${r}`,children:i?"Hide source":"Show source"}),e.jsxs("a",{href:`/api/artifacts/${r}/view`,target:"_blank",rel:"noopener noreferrer","data-testid":`claude-blank-${r}`,style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",fontSize:"var(--fs-12)",padding:"var(--space-1) var(--space-2)",color:"var(--fg)",textDecoration:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[e.jsx(L,{size:12,"aria-hidden":!0})," Open in new tab"]})]})]}),e.jsx("iframe",{title:`claude-artifact-${r}`,"data-testid":`claude-iframe-${r}`,sandbox:"allow-scripts allow-same-origin",srcDoc:t.html,style:{width:"100%",height:480,border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"white"}}),i&&e.jsx("pre",{"data-testid":`claude-source-text-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-11)",maxHeight:320,overflow:"auto",fontFamily:"var(--font-mono)",whiteSpace:"pre-wrap"},children:t.html})]}):e.jsx($,{variant:"default","data-testid":`claude-view-${r}`,children:e.jsx(D,{children:e.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"No HTML returned by the compiler."})})})}function de(){const t=w("/api/artifacts"),[r,i]=l.useState(null),[c,s]=l.useState(!1),[d,o]=l.useState(null),[j,u]=l.useState(null),y=l.useMemo(()=>{var a;return((a=t.data)==null?void 0:a.artifacts)??[]},[t.data]),h=l.useCallback(()=>{t.refetch()},[t]),S=async a=>{u(null);try{await z(`/api/artifacts/${a}`,{method:"DELETE"}),i(null),d===a&&o(null),h()}catch(v){u((v instanceof M,v.message))}};return e.jsxs(m,{gap:4,"data-testid":"artifacts-view",children:[e.jsx(O,{title:"Artifacts",description:"Generated artifacts (plans, diagrams, canvases).",actions:e.jsxs(f,{align:"center",gap:2,children:[j!==null&&e.jsx("span",{role:"alert","data-testid":"artifacts-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:j}),e.jsxs(g,{variant:"ghost",onClick:()=>void h(),"data-testid":"artifacts-refresh",children:[e.jsx(I,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(g,{variant:"primary",onClick:()=>s(!0),"data-testid":"artifacts-add",children:[e.jsx(K,{size:14,"aria-hidden":!0})," Add"]})]})}),e.jsx($,{variant:"default",children:e.jsx(D,{children:t.loading&&y.length===0?e.jsxs(m,{gap:1,children:[e.jsx(k,{style:{height:48}}),e.jsx(k,{style:{height:48}})]}):y.length===0?e.jsx(P,{icon:e.jsx(V,{size:28,"aria-hidden":!0}),title:"No artifacts",description:"Artifacts are generated code — HTML canvases, SVG diagrams, and React components — created by the agent during task work. Add one to get started."}):e.jsx(m,{gap:1,children:y.map(a=>{const v=r===a.slug;return e.jsxs("div",{"data-testid":`artifact-row-${a.slug}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs(m,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx(G,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.title||a.slug}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.slug}),a.kind&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",a.kind]})]}),a.description&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.description})]}),e.jsxs(f,{gap:1,children:[e.jsxs(g,{variant:"ghost",onClick:()=>o(p=>p===a.slug?null:a.slug),"data-testid":`artifact-open-${a.slug}`,"aria-label":`Open ${a.slug}`,children:[e.jsx(L,{size:14,"aria-hidden":!0})," Open"]}),e.jsx(g,{variant:"ghost",onClick:()=>i(p=>p===a.slug?null:a.slug),"data-testid":`artifact-delete-${a.slug}`,"aria-label":`Delete ${a.slug}`,children:e.jsx(B,{size:14,"aria-hidden":!0})})]})]}),v&&e.jsxs(f,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(g,{variant:"danger",onClick:()=>void S(a.slug),"data-testid":`artifact-confirm-delete-${a.slug}`,children:"Confirm delete"}),e.jsx(g,{variant:"ghost",onClick:()=>i(null),children:"Cancel"})]})]},a.slug)})})})}),e.jsx(A,{open:c,onOpenChange:s,children:e.jsx(E,{side:"right",title:"Add artifact",description:"Slug + kind + initial source.",children:e.jsx(J,{onSubmit:async a=>{await z("/api/artifacts",{method:"POST",body:a}),s(!1),h()},onCancel:()=>s(!1)})})}),e.jsx(A,{open:d!==null,onOpenChange:a=>{a||o(null)},children:e.jsx(E,{side:"right",title:d??"",description:"Artifact detail",children:d!==null&&e.jsx(U,{slug:d,refresh:h})})})]})}function J({onSubmit:t,onCancel:r}){const[i,c]=l.useState(""),[s,d]=l.useState(""),[o,j]=l.useState(""),[u,y]=l.useState("claude-html"),[h,S]=l.useState(T["claude-html"]),[a,v]=l.useState(!1),[p,b]=l.useState(null),x=n=>{y(n),S(T[n])};return e.jsxs(m,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Slug"}),e.jsx(C,{value:i,onChange:n=>c(n.target.value),"data-testid":"artifact-form-slug"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),e.jsx(C,{value:s,onChange:n=>d(n.target.value),"data-testid":"artifact-form-title"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),e.jsx(C,{value:o,onChange:n=>j(n.target.value),"data-testid":"artifact-form-description"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Kind"}),e.jsxs("select",{value:u,onChange:n=>x(n.target.value),"data-testid":"artifact-form-kind",style:{fontFamily:"inherit",fontSize:"var(--fs-12)",padding:"var(--space-2)",background:"var(--surface-0)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsx("option",{value:"claude-html",children:"Claude HTML"}),e.jsx("option",{value:"claude-svg",children:"Claude SVG"}),e.jsx("option",{value:"claude-react",children:"Claude React (JSX)"}),e.jsx("option",{value:"mdx",children:"Legacy MDX (glyphs)"})]})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:u==="mdx"?"Plan MDX":"Source"}),e.jsx(R,{value:h,rows:u==="claude-react"?10:6,onChange:n=>S(n.target.value),"data-testid":u==="mdx"?"artifact-form-mdx":"artifact-form-source"})]}),p!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(g,{variant:"ghost",onClick:r,children:"Cancel"}),e.jsx(g,{variant:"primary",disabled:a||!i.trim(),"data-testid":"artifact-form-submit",onClick:async()=>{v(!0),b(null);try{const n={slug:i.trim(),title:s.trim()||void 0,description:o.trim()||void 0,kind:u};h&&(u==="mdx"?n.planMdx=h:n.source=h),await t(n)}catch(n){b((n instanceof M,n.message)),v(!1)}},children:a?"Creating…":"Create"})]})]})}const T={mdx:`# Hello
|
|
7
|
-
|
|
8
|
-
Add some MDX here.`,"claude-html":`<!doctype html>
|
|
9
|
-
<h1 style="font-family:system-ui">Hello artifact</h1>
|
|
10
|
-
<p>Edit me — click <em>Open</em> to preview.</p>`,"claude-svg":`<svg viewBox="0 0 100 100" width="200" height="200">
|
|
11
|
-
<circle cx="50" cy="50" r="40" fill="#0b66c3"/>
|
|
12
|
-
<text x="50" y="55" text-anchor="middle" fill="white" font-size="14">SVG</text>
|
|
13
|
-
</svg>`,"claude-react":`export default function App() {
|
|
14
|
-
const [n, setN] = React.useState(0);
|
|
15
|
-
return (
|
|
16
|
-
<div style={{ fontFamily: "system-ui", padding: 16 }}>
|
|
17
|
-
<h1>Hello</h1>
|
|
18
|
-
<button onClick={() => setN(n + 1)}>clicked {n}</button>
|
|
19
|
-
</div>
|
|
20
|
-
);
|
|
21
|
-
}`};function U({slug:t,refresh:r}){var o;const i=w(`/api/artifacts/${t}`),c=w(`/api/artifacts/${t}/render`),s=((o=i.data)==null?void 0:o.kind)||"mdx",d=s==="claude-html"||s==="claude-svg"||s==="claude-react";return e.jsx(m,{gap:2,style:{padding:"var(--space-4)"},children:i.loading&&!i.data?e.jsx(k,{style:{height:80}}):i.data?e.jsxs(m,{gap:2,children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{children:i.data.title||i.data.slug}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:i.data.slug}),e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s]})]}),i.data.description&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:i.data.description}),d&&(c.data?e.jsx(N,{payload:c.data,slug:t}):e.jsx(k,{style:{height:200}})),!d&&c.data&&e.jsxs("span",{"data-testid":`artifact-render-${t}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Render: ",Array.isArray(c.data.blocks)?`${c.data.blocks.length} blocks`:"no blocks"]}),e.jsx(_,{payload:i.data,slug:t,onSaved:()=>{i.refetch(),c.refetch(),r()}})]}):e.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"Not found"})})}function _({payload:t,slug:r,onSaved:i}){const c=t.source??t.planMdx??"",[s,d]=l.useState(t.kind||"mdx"),[o,j]=l.useState(c),[u,y]=l.useState(!1),[h,S]=l.useState(null),[a,v]=l.useState(!1);l.useEffect(()=>{d(t.kind||"mdx"),j(t.source??t.planMdx??"")},[t.slug,t.source,t.planMdx,t.kind]);const p=s!==(t.kind||"mdx")||o!==(t.source??t.planMdx??""),b=async()=>{y(!0),S(null);try{await z(`/api/artifacts/${r}`,{method:"PUT",body:{kind:s,source:s==="mdx"?void 0:o,planMdx:s==="mdx"?o:void 0}}),i()}catch(x){S((x instanceof M,x.message))}finally{y(!1)}};return e.jsxs(m,{gap:1,"data-testid":`artifact-editor-${r}`,children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsx(g,{variant:"ghost",onClick:()=>v(x=>!x),"data-testid":`artifact-edit-toggle-${r}`,children:a?"Close editor":"Edit"}),p&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--callout-warning-fg, #b58900)"},children:"Unsaved changes"})]}),a&&e.jsxs(m,{gap:2,children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Kind"}),e.jsxs("select",{value:s,onChange:x=>d(x.target.value),"data-testid":`artifact-edit-kind-${r}`,style:{fontFamily:"inherit",fontSize:"var(--fs-12)",padding:"var(--space-2)",background:"var(--surface-0)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsx("option",{value:"claude-html",children:"Claude HTML"}),e.jsx("option",{value:"claude-svg",children:"Claude SVG"}),e.jsx("option",{value:"claude-react",children:"Claude React (JSX)"}),e.jsx("option",{value:"mdx",children:"Legacy MDX"})]})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s==="mdx"?"Plan MDX":"Source"}),e.jsx(R,{value:o,rows:s==="claude-react"?12:8,onChange:x=>j(x.target.value),"data-testid":`artifact-edit-source-${r}`})]}),h!==null&&e.jsx("span",{role:"alert","data-testid":`artifact-edit-error-${r}`,style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:h}),e.jsxs(f,{gap:1,children:[e.jsx(g,{variant:"primary",disabled:u||!p,onClick:()=>void b(),"data-testid":`artifact-edit-save-${r}`,children:u?"Saving…":"Save"}),e.jsx(g,{variant:"ghost",disabled:u||!p,onClick:()=>{d(t.kind||"mdx"),j(t.source??t.planMdx??""),S(null)},"data-testid":`artifact-edit-revert-${r}`,children:"Revert"})]})]})]})}export{de as ArtifactsView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArtifactsView-CfYB1le1.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ClaudeArtifactView.tsx","../../src/web/v8/views/Artifacts/ArtifactsView.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 FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ClaudeArtifactView.tsx — v10.1.0.\n *\n * Renders Claude-* kind artifacts (HTML / SVG / React) inside a\n * sandboxed iframe. The server hands us a fully-compiled HTML envelope\n * (returned from GET /api/artifacts/:slug/render) and we drop it into\n * `srcdoc`. The iframe has `sandbox` set so even if a malicious escape\n * slips past server-side filtering, the runtime is still constrained.\n *\n * Two render modes:\n * 1. <iframe srcdoc> — for full-envelope artifacts (default).\n * 2. Plain `<div>` for an `mdx` kind fallback (handled by caller).\n */\n\nimport { useState } from 'react';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { AlertTriangle, ShieldCheck, ExternalLink } from 'lucide-react';\nimport { Button } from '../../ui/controls/Button.js';\n\nexport interface ClaudeRenderPayload {\n slug: string;\n kind: 'claude-html' | 'claude-svg' | 'claude-react' | 'mdx';\n html?: string;\n blocks?: unknown[];\n frontmatter?: Record<string, unknown>;\n warnings?: Array<{ message?: string; pattern?: string }>;\n safeMode?: boolean;\n compiledAt?: string;\n}\n\nexport function ClaudeArtifactView({\n payload,\n slug,\n}: {\n payload: ClaudeRenderPayload;\n slug: string;\n}): JSX.Element {\n const [showSource, setShowSource] = useState(false);\n\n if (payload.kind === 'mdx') {\n // Legacy fallback — the server returns no `html` for mdx; just show\n // the compiled block count.\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <Inline align=\"center\" gap={2}>\n <ShieldCheck size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Legacy MDX — {Array.isArray(payload.blocks) ? `${payload.blocks.length} blocks` : 'no blocks'}\n </span>\n </Inline>\n </CardBody>\n </Card>\n );\n }\n\n if (!payload.html) {\n return (\n <Card variant=\"default\" data-testid={`claude-view-${slug}`}>\n <CardBody>\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>\n No HTML returned by the compiler.\n </span>\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2} data-testid={`claude-view-${slug}`}>\n {payload.safeMode && (\n <Inline\n align=\"center\"\n gap={2}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--callout-warning-bg, #fdf6e3)',\n border: '1px solid var(--callout-warning-border, #e0c97d)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-12)',\n }}\n role=\"status\"\n data-testid={`claude-safe-${slug}`}\n >\n <AlertTriangle size={14} aria-hidden style={{ color: '#b58900' }} />\n <span>\n Safe mode — the compiler stripped potentially dangerous\n patterns in this artifact.\n </span>\n </Inline>\n )}\n {payload.warnings && payload.warnings.length > 0 && (\n <details\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <summary>{payload.warnings.length} warning(s)</summary>\n <ul style={{ marginTop: 'var(--space-1)' }}>\n {payload.warnings.map((w, i) => (\n <li key={i}>\n <code style={{ fontFamily: 'var(--font-mono)' }}>\n {w.pattern}\n </code>{' '}\n — {w.message}\n </li>\n ))}\n </ul>\n </details>\n )}\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n {payload.kind} · compiled {payload.compiledAt ? new Date(payload.compiledAt).toLocaleTimeString() : 'now'}\n </span>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setShowSource((v) => !v)} data-testid={`claude-source-${slug}`}>\n {showSource ? 'Hide source' : 'Show source'}\n </Button>\n <a\n href={`/api/artifacts/${slug}/view`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={`claude-blank-${slug}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-1) var(--space-2)',\n color: 'var(--fg)',\n textDecoration: 'none',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <ExternalLink size={12} aria-hidden /> Open in new tab\n </a>\n </Inline>\n </Inline>\n <iframe\n title={`claude-artifact-${slug}`}\n data-testid={`claude-iframe-${slug}`}\n sandbox=\"allow-scripts allow-same-origin\"\n srcDoc={payload.html}\n style={{\n width: '100%',\n height: 480,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'white',\n }}\n />\n {showSource && (\n <pre\n data-testid={`claude-source-text-${slug}`}\n style={{\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-11)',\n maxHeight: 320,\n overflow: 'auto',\n fontFamily: 'var(--font-mono)',\n whiteSpace: 'pre-wrap',\n }}\n >\n {payload.html}\n </pre>\n )}\n </Stack>\n );\n}","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0 → v10.1.0\n * (Claude Artifacts swap).\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, kind, source, ...}).\n *\n * v10.1.0 — Detail panel dispatches by `kind`:\n * - claude-html / claude-svg / claude-react → sandboxed iframe\n * via <ClaudeArtifactView>\n * - mdx → legacy block-renderer fallback\n *\n * The AddForm gains a `kind` dropdown + a textarea bound to `source`;\n * the textarea defaults to the kind-specific starting template.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { ClaudeArtifactView, type ClaudeRenderPayload } from './ClaudeArtifactView.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react';\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n source?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Artifacts are generated code — HTML canvases, SVG diagrams, and React components — created by the agent during task work. Add one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + kind + initial source.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} refresh={refresh} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; kind?: string; source?: string; planMdx?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [kind, setKind] = useState<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'>('claude-html');\n const [source, setSource] = useState<string>(KIND_TEMPLATES['claude-html']);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n // When the user changes kind, swap the textarea content to a starter\n // template for that kind. They can still edit further.\n const onKindChange = (next: 'mdx' | 'claude-html' | 'claude-svg' | 'claude-react'): void => {\n setKind(next);\n setSource(KIND_TEMPLATES[next]);\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={kind}\n onChange={(e) => onKindChange(e.target.value as typeof kind)}\n data-testid=\"artifact-form-kind\"\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX (glyphs)</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {kind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={source}\n rows={kind === 'claude-react' ? 10 : 6}\n onChange={(e) => setSource((e.target as HTMLTextAreaElement).value)}\n data-testid={kind === 'mdx' ? 'artifact-form-mdx' : 'artifact-form-source'}\n />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n const body: { slug: string; title?: string; description?: string; kind: typeof kind; source?: string; planMdx?: string } = {\n slug: slug.trim(),\n title: title.trim() || undefined,\n description: description.trim() || undefined,\n kind,\n };\n if (source) {\n if (kind === 'mdx') body.planMdx = source; else body.source = source;\n }\n await onSubmit(body);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nconst KIND_TEMPLATES: Record<'mdx' | 'claude-html' | 'claude-svg' | 'claude-react', string> = {\n mdx: '# Hello\\n\\nAdd some MDX here.',\n 'claude-html': '<!doctype html>\\n<h1 style=\"font-family:system-ui\">Hello artifact</h1>\\n<p>Edit me — click <em>Open</em> to preview.</p>',\n 'claude-svg': '<svg viewBox=\"0 0 100 100\" width=\"200\" height=\"200\">\\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#0b66c3\"/>\\n <text x=\"50\" y=\"55\" text-anchor=\"middle\" fill=\"white\" font-size=\"14\">SVG</text>\\n</svg>',\n 'claude-react': 'export default function App() {\\n const [n, setN] = React.useState(0);\\n return (\\n <div style={{ fontFamily: \"system-ui\", padding: 16 }}>\\n <h1>Hello</h1>\\n <button onClick={() => setN(n + 1)}>clicked {n}</button>\\n </div>\\n );\\n}',\n};\n\nfunction ArtifactDetail({ slug, refresh }: { slug: string; refresh: () => void }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<ClaudeRenderPayload>(`/api/artifacts/${slug}/render`);\n const kind = payload.data?.kind || 'mdx';\n const isClaude = kind === 'claude-html' || kind === 'claude-svg' || kind === 'claude-react';\n\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{payload.data.slug}</code>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {kind}</span>\n </Inline>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n\n {/* Claude-* kinds render in a sandboxed iframe via the new\n <ClaudeArtifactView>. The server compiles the source on\n demand and returns iframe-ready HTML (srcdoc). */}\n {isClaude && (\n renderPayload.data ? (\n <ClaudeArtifactView payload={renderPayload.data} slug={slug} />\n ) : (\n <Skeleton style={{ height: 200 }} />\n )\n )}\n\n {/* Legacy MDX path keeps the original block-count summary. */}\n {!isClaude && renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n\n {/* Inline editor — kind switch + textarea + save. */}\n <Editor payload={payload.data} slug={slug} onSaved={() => { void payload.refetch(); void renderPayload.refetch(); refresh(); }} />\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}\n\n/**\n * Inline editor: lets the user change the kind, edit the body, and\n * save via PUT /api/artifacts/:slug. After save we re-fetch both the\n * artifact + the compiled render so the iframe updates with the new\n * source on the next paint.\n */\nfunction Editor({\n payload,\n slug,\n onSaved,\n}: {\n payload: Artifact;\n slug: string;\n onSaved: () => void;\n}): JSX.Element {\n const initial = payload.source ?? payload.planMdx ?? '';\n const [editKind, setEditKind] = useState<typeof payload.kind>(payload.kind || 'mdx');\n const [editSource, setEditSource] = useState<string>(initial);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState<boolean>(false);\n\n // Sync the textarea when the underlying artifact changes (e.g. when\n // the user opens a different slug in the same Sheet).\n useEffect(() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n }, [payload.slug, payload.source, payload.planMdx, payload.kind]);\n\n const dirty =\n editKind !== (payload.kind || 'mdx') || editSource !== (payload.source ?? payload.planMdx ?? '');\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, {\n method: 'PUT',\n body: {\n kind: editKind,\n source: editKind === 'mdx' ? undefined : editSource,\n planMdx: editKind === 'mdx' ? editSource : undefined,\n },\n });\n onSaved();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={1} data-testid={`artifact-editor-${slug}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Button variant=\"ghost\" onClick={() => setOpen((v) => !v)} data-testid={`artifact-edit-toggle-${slug}`}>\n {open ? 'Close editor' : 'Edit'}\n </Button>\n {dirty && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--callout-warning-fg, #b58900)' }}>\n Unsaved changes\n </span>\n )}\n </Inline>\n {open && (\n <Stack gap={2}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Kind</span>\n <select\n value={editKind}\n onChange={(e) => setEditKind(e.target.value as typeof editKind)}\n data-testid={`artifact-edit-kind-${slug}`}\n style={{\n fontFamily: 'inherit',\n fontSize: 'var(--fs-12)',\n padding: 'var(--space-2)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <option value=\"claude-html\">Claude HTML</option>\n <option value=\"claude-svg\">Claude SVG</option>\n <option value=\"claude-react\">Claude React (JSX)</option>\n <option value=\"mdx\">Legacy MDX</option>\n </select>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {editKind === 'mdx' ? 'Plan MDX' : 'Source'}\n </span>\n <Textarea\n value={editSource}\n rows={editKind === 'claude-react' ? 12 : 8}\n onChange={(e) => setEditSource((e.target as HTMLTextAreaElement).value)}\n data-testid={`artifact-edit-source-${slug}`}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid={`artifact-edit-error-${slug}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline gap={1}>\n <Button\n variant=\"primary\"\n disabled={busy || !dirty}\n onClick={() => void save()}\n data-testid={`artifact-edit-save-${slug}`}\n >\n {busy ? 'Saving…' : 'Save'}\n </Button>\n <Button\n variant=\"ghost\"\n disabled={busy || !dirty}\n onClick={() => {\n setEditKind(payload.kind || 'mdx');\n setEditSource(payload.source ?? payload.planMdx ?? '');\n setError(null);\n }}\n data-testid={`artifact-edit-revert-${slug}`}\n >\n Revert\n </Button>\n </Inline>\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ClaudeArtifactView","payload","slug","showSource","setShowSource","useState","jsx","Card","CardBody","jsxs","Inline","ShieldCheck","Stack","AlertTriangle","w","i","Button","v","ExternalLink","ArtifactsView","useFetch","confirmDelete","setConfirmDelete","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","fetchJson","err","FetchError","ViewHeader","RefreshCcw","Plus","Skeleton","EmptyState","Layers","isConfirming","cur","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","kind","setKind","source","setSource","KIND_TEMPLATES","busy","setBusy","onKindChange","next","Input","e","Textarea","renderPayload","isClaude","Editor","onSaved","initial","editKind","setEditKind","editSource","setEditSource","setOpen","useEffect","dirty","save"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthView-D4frSShw.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/lucide-react/dist/esm/icons/eye.js","../../src/web/v8/views/Auth/AuthView.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 Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=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 EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.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 Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * v8/views/Auth/AuthView.tsx — Sprint S40, v9.3.0.\n *\n * Auth status + token-reveal + regenerate surface. Reads the\n * unauthed /api/auth/status on mount, then on user request hits\n * the authed /api/auth/reveal to show the current token, and\n * /api/auth/regenerate (with inline confirm) to mint a new one.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { Copy, Eye, EyeOff, RotateCw, ShieldCheck, ShieldAlert } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AuthStatus {\n required: boolean;\n loopback: boolean;\n peer?: string;\n}\n\nexport function AuthView(): JSX.Element {\n const [status, setStatus] = useState<AuthStatus | null>(null);\n const [statusError, setStatusError] = useState<string | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [revealing, setRevealing] = useState<boolean>(false);\n const [showToken, setShowToken] = useState<boolean>(false);\n const [confirmRegen, setConfirmRegen] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadStatus = useCallback(async () => {\n setStatusError(null);\n try {\n const res = await fetchJson<AuthStatus>('/api/auth/status');\n setStatus(res);\n } catch (err) {\n setStatusError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n }, []);\n\n useEffect(() => { void loadStatus(); }, [loadStatus]);\n\n const reveal = async (): Promise<void> => {\n setRevealing(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/reveal');\n setToken(res.token);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRevealing(false);\n }\n };\n\n const regenerate = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ token: string }>('/api/auth/regenerate', { method: 'POST', body: {} });\n setToken(res.token);\n setShowToken(true);\n setConfirmRegen(false);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async (): Promise<void> => {\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n } catch { /* clipboard might be blocked; the token is still on-screen */ }\n };\n\n return (\n <Stack gap={4} data-testid=\"auth-view\">\n <ViewHeader\n title=\"Auth\"\n description=\"Dashboard auth status + bearer token management.\"\n />\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n {status === null && statusError === null ? (\n <Skeleton style={{ height: 24, width: 240 }} />\n ) : statusError !== null ? (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{statusError}</span>\n ) : (\n <Inline gap={2} wrap>\n {status?.required ? (\n <Badge tone=\"warning\" data-testid=\"auth-required\">\n <ShieldAlert size={12} aria-hidden /> Required\n </Badge>\n ) : (\n <Badge tone=\"success\" data-testid=\"auth-required\">\n <ShieldCheck size={12} aria-hidden /> Not required\n </Badge>\n )}\n {status?.loopback && <Badge tone=\"info\">Loopback</Badge>}\n {status?.peer && (\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status.peer}\n </span>\n )}\n </Inline>\n )}\n </Stack>\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={3}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Bearer token</strong>\n {token === null ? (\n <Inline gap={2}>\n <Button variant=\"ghost\" onClick={() => void reveal()} disabled={revealing} data-testid=\"auth-reveal\">\n <Eye size={14} aria-hidden /> {revealing ? 'Loading…' : 'Reveal'}\n </Button>\n </Inline>\n ) : (\n <Stack gap={2}>\n <Inline gap={2}>\n <Input\n readOnly\n value={showToken ? token : '••••••••••••••••••••••'}\n data-testid=\"auth-token-input\"\n onFocus={(e) => (e.target as HTMLInputElement).select()}\n />\n <Button variant=\"ghost\" onClick={() => setShowToken((s) => !s)} data-testid=\"auth-toggle-visibility\">\n {showToken ? <EyeOff size={14} aria-hidden /> : <Eye size={14} aria-hidden />}\n </Button>\n <Button variant=\"ghost\" onClick={() => void copy()} data-testid=\"auth-copy\">\n <Copy size={14} aria-hidden /> Copy\n </Button>\n </Inline>\n {confirmRegen ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void regenerate()} disabled={busy} data-testid=\"auth-confirm-regen\">\n Confirm rotate\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmRegen(false)} disabled={busy} data-testid=\"auth-cancel-regen\">\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button variant=\"danger\" onClick={() => setConfirmRegen(true)} data-testid=\"auth-regen\">\n <RotateCw size={14} aria-hidden /> Rotate token\n </Button>\n )}\n </Stack>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid=\"auth-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["Copy","createLucideIcon","EyeOff","Eye","AuthView","status","setStatus","useState","statusError","setStatusError","token","setToken","revealing","setRevealing","showToken","setShowToken","confirmRegen","setConfirmRegen","busy","setBusy","error","setError","loadStatus","useCallback","res","fetchJson","err","FetchError","useEffect","reveal","regenerate","copy","jsxs","Stack","jsx","ViewHeader","Card","CardBody","Skeleton","Inline","Badge","ShieldAlert","ShieldCheck","Button","Input","e","s","RotateCw"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as t,j as e}from"./cmdk-C3F6LD6N.js";import{u as X,a as Z,i as f,S as g,I as a,b as S,h as M,j as A,B as l,x as _,F as v}from"./main-BURAlktW.js";import{V as ee}from"./ViewHeader-C-t1U2cQ.js";import{C as y,b as k}from"./Card-BtsmkhJa.js";import{P as F}from"./pause-BllItT2_.js";import{P as K}from"./play-mJh67AXo.js";import{R as O}from"./rotate-cw-BDX5SE2s.js";import{T as W}from"./trash-2-D6qePV_q.js";import{T as H}from"./triangle-alert-B2oHbmoh.js";import{C as ne}from"./circle-check-DFB50ojt.js";function L(s){switch(s){case"running":return K;case"paused":return F;case"done":return ne;case"error":return H;case"killed":return W;default:return A}}function h(s){switch(s){case"running":return"info";case"paused":return"warning";case"done":return"success";case"error":return"danger";case"killed":return"neutral";default:return"neutral"}}function re(s){if(!s)return"—";const c=Math.floor((Date.now()-s)/1e3);if(c<60)return`${c}s`;const p=Math.floor(c/60);return p<60?`${p}m ${c%60}s`:`${Math.floor(p/60)}h ${p%60}m`}function he(){const s=X("/api/background"),[c,p]=t.useState([]),[i,w]=t.useState(null),[C,z]=t.useState([]),[J,$]=t.useState(!1),[R,T]=t.useState(!1),[B,o]=t.useState(null),[P,b]=t.useState(null);Z("background:change",t.useCallback(n=>{const r=n;s.refetch(),r.id&&r.id===i&&I(r.id)},[s,i]));const d=t.useMemo(()=>{var n;return[...c,...((n=s.data)==null?void 0:n.instances)||[]]},[c,s.data]),x=t.useMemo(()=>i?d.find(n=>n.instanceId===i)??null:null,[i,d]),I=async n=>{$(!0);try{const r=await f(`/api/background/${encodeURIComponent(n)}/output?lines=100`);z(r.lines??[])}catch{z([])}finally{$(!1)}},V=async n=>{w(n.instanceId),await I(n.instanceId)},m=()=>{s.refetch()},D=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/pause`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},N=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/resume`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},G=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/retry`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},Y=async n=>{o(null),T(!0);try{await f(`/api/background/${encodeURIComponent(n)}`,{method:"DELETE"}),b(null),i===n&&w(null),m()}catch(r){o(r instanceof v?r.message:String(r))}finally{T(!1)}},q=t.useMemo(()=>{const n={pending:0,running:0,paused:0,done:0,error:0,killed:0,unknown:0};for(const r of d){const u=r.status||"unknown";n[u]=(n[u]??0)+1}return n},[d]);return e.jsxs(g,{gap:5,"data-testid":"background-view",children:[e.jsx(ee,{title:"Background Jobs",description:"Live background agent sessions. Pause, resume, retry, or kill."}),B!==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 var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:B}),d.length>0&&e.jsx(a,{gap:3,wrap:!0,children:["running","paused","pending","done","error"].map(n=>{const r=q[n];if(r===0)return null;const u=L(n);return e.jsxs(a,{align:"center",gap:2,style:{padding:"4px 10px",background:"var(--surface-1)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:[e.jsx(u,{size:12,"aria-hidden":!0,style:{color:`var(--${h(n)==="neutral"?"fg-muted":h(n)})`}}),e.jsx("span",{style:{fontSize:"var(--fs-12)"},children:n}),e.jsx(S,{tone:h(n),children:r})]},n)})}),s.loading&&d.length===0?e.jsx(M,{style:{height:240}}):d.length===0?e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:1,align:"center",children:[e.jsx(A,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No background jobs"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Background agents appear here when spawned."})]})})}):e.jsxs(U,{style:{display:"grid",gridTemplateColumns:x?"1fr 380px":"1fr",gap:"var(--space-4)"},children:[e.jsx(g,{gap:2,children:d.map(n=>{var E;const r=n.status||"unknown",u=L(r),Q=n.instanceId===i;return e.jsx(y,{"data-testid":`bg-instance-${n.instanceId}`,style:{cursor:"pointer",outline:Q?"2px solid var(--accent)":void 0,outlineOffset:-2},onClick:()=>{V(n)},children:e.jsx(k,{children:e.jsxs(a,{align:"center",gap:3,children:[e.jsx(u,{size:16,"aria-hidden":!0,style:{color:`var(--${h(r)==="neutral"?"fg-muted":h(r)})`}}),e.jsxs(g,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:n.agent??n.instanceId.slice(0,8)}),e.jsx(S,{tone:h(r),children:r}),(E=n.tags)==null?void 0:E.map(j=>e.jsx(S,{tone:"neutral",children:j},j))]}),e.jsxs(a,{gap:3,children:[n.worktree&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:n.worktree}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:re(n.startedAt??n.createdAt)}),n.pid&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["pid ",n.pid]})]})]}),e.jsxs(a,{gap:1,align:"center",onClick:j=>j.stopPropagation(),children:[r==="running"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{D(n.instanceId)},"data-testid":`bg-pause-${n.instanceId}`,title:"Pause",children:e.jsx(F,{size:12,"aria-hidden":!0})}),r==="paused"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{N(n.instanceId)},"data-testid":`bg-resume-${n.instanceId}`,title:"Resume",children:e.jsx(K,{size:12,"aria-hidden":!0})}),(r==="error"||r==="killed")&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{G(n.instanceId)},"data-testid":`bg-retry-${n.instanceId}`,title:"Retry",children:e.jsx(O,{size:12,"aria-hidden":!0})}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>b(n.instanceId),"data-testid":`bg-kill-${n.instanceId}`,title:"Kill",children:e.jsx(W,{size:12,"aria-hidden":!0})})]})]})})},n.instanceId)})}),x&&e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:3,children:[e.jsxs(a,{align:"center",justify:"between",children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(_,{size:12,"aria-hidden":!0}),e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:"Output"})]}),e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>{x&&I(x.instanceId)},children:e.jsx(O,{size:12,"aria-hidden":!0})})]}),J?e.jsx(M,{style:{height:160}}):C.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No output captured yet."}):e.jsx(U,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-3)",maxHeight:320,overflowY:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",lineHeight:1.6},children:C.map((n,r)=>e.jsx("div",{children:n},r))})]})})})]}),P&&e.jsx("div",{role:"dialog","aria-modal":!0,style:{position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.4)",zIndex:100},"data-testid":"bg-kill-confirm",children:e.jsx(y,{style:{maxWidth:400},children:e.jsx(k,{children:e.jsxs(g,{gap:4,children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(H,{size:16,"aria-hidden":!0,style:{color:"var(--danger)"}}),e.jsx("strong",{children:"Kill this background job?"})]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"This sends SIGTERM to the process. The instance will transition to “killed” status."}),e.jsxs(a,{gap:2,children:[e.jsx(l,{variant:"danger",onClick:()=>{Y(P)},disabled:R,children:"Kill"}),e.jsx(l,{variant:"ghost",onClick:()=>b(null),disabled:R,children:"Cancel"})]})]})})})})]})}function U(s){return e.jsx("div",{style:s.style,children:s.children})}export{he as BackgroundJobsView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundJobsView-DEStvILz.js","sources":["../../src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { Play, Pause, RotateCw, Trash2, Terminal, Cpu, Bot, AlertTriangle, CheckCircle2, type LucideIcon } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * BackgroundJobsView — live background agent instances.\n *\n * Renders `/api/background` (list + status counts), shows per-instance\n * output panels, and exposes pause / resume / retry / kill controls.\n */\n\ntype BgStatus = 'pending' | 'running' | 'paused' | 'done' | 'error' | 'killed' | 'unknown';\n\ninterface BgAction {\n type: string;\n prompt?: string;\n agent?: string;\n command?: string;\n}\n\ninterface BgInstance {\n instanceId: string;\n agent?: string;\n status: BgStatus;\n worktree?: string;\n createdAt?: number;\n startedAt?: number;\n endedAt?: number;\n exitCode?: number;\n error?: string;\n tags?: string[];\n action?: BgAction;\n sessionId?: string;\n pid?: number;\n messageCount?: number;\n lastMessageAt?: number;\n lastError?: { ts: number; message: string };\n toolCalls?: unknown[];\n}\n\ninterface BackgroundResponse {\n instances: BgInstance[];\n status?: { running: number; paused: number; done: number; error: number };\n}\n\nfunction statusIcon(s: BgStatus): LucideIcon {\n switch (s) {\n case 'running': return Play;\n case 'paused': return Pause;\n case 'done': return CheckCircle2;\n case 'error': return AlertTriangle;\n case 'killed': return Trash2;\n default: return Cpu;\n }\n}\n\nfunction statusTone(s: BgStatus): 'neutral' | 'info' | 'success' | 'danger' | 'warning' {\n switch (s) {\n case 'running': return 'info';\n case 'paused': return 'warning';\n case 'done': return 'success';\n case 'error': return 'danger';\n case 'killed': return 'neutral';\n default: return 'neutral';\n }\n}\n\nfunction elapsed(ms?: number): string {\n if (!ms) return '—';\n const s = Math.floor((Date.now() - ms) / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nexport function BackgroundJobsView(): JSX.Element {\n const res = useFetch<BackgroundResponse>('/api/background');\n const [live, setLive] = useState<BgInstance[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [outputLoading, setOutputLoading] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const [killConfirm, setKillConfirm] = useState<string | null>(null);\n\n useWsMessage('background:change', useCallback((msg: WsMessage) => {\n const m = msg as { id?: string; status?: string };\n void res.refetch();\n if (m.id && m.id === selectedId) loadOutput(m.id);\n }, [res, selectedId]));\n\n const instances = useMemo<BgInstance[]>(() => [...live, ...(res.data?.instances || [])], [live, res.data]);\n\n const selected = useMemo<BgInstance | null>(() => {\n if (!selectedId) return null;\n return instances.find((i) => i.instanceId === selectedId) ?? null;\n }, [selectedId, instances]);\n\n const loadOutput = async (id: string): Promise<void> => {\n setOutputLoading(true);\n try {\n const data = await fetchJson<{ lines?: string[] }>(`/api/background/${encodeURIComponent(id)}/output?lines=100`);\n setOutputLines(data.lines ?? []);\n } catch {\n setOutputLines([]);\n } finally {\n setOutputLoading(false);\n }\n };\n\n const selectInstance = async (inst: BgInstance): Promise<void> => {\n setSelectedId(inst.instanceId);\n await loadOutput(inst.instanceId);\n };\n\n const refresh = (): void => { void res.refetch(); };\n\n const pauseInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/pause`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const resumeInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/resume`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const retryInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/retry`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const killInstance = async (id: string): Promise<void> => {\n setActionError(null);\n setBusy(true);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setKillConfirm(null);\n if (selectedId === id) setSelectedId(null);\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const statusCounts = useMemo(() => {\n const counts: Record<BgStatus, number> = { pending: 0, running: 0, paused: 0, done: 0, error: 0, killed: 0, unknown: 0 };\n for (const i of instances) {\n const s: BgStatus = i.status || 'unknown';\n counts[s] = (counts[s] ?? 0) + 1;\n }\n return counts;\n }, [instances]);\n\n return (\n <Stack gap={5} data-testid=\"background-view\">\n <ViewHeader\n title=\"Background Jobs\"\n description=\"Live background agent sessions. Pause, resume, retry, or kill.\"\n />\n\n {actionError !== null && (\n <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 var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {actionError}\n </div>\n )}\n\n {/* Status summary bar */}\n {instances.length > 0 && (\n <Inline gap={3} wrap>\n {(['running', 'paused', 'pending', 'done', 'error'] as BgStatus[]).map((s) => {\n const count = statusCounts[s];\n if (count === 0) return null;\n const Icon = statusIcon(s);\n return (\n <Inline key={s} align=\"center\" gap={2} style={{ padding: '4px 10px', background: 'var(--surface-1)', borderRadius: 'var(--radius-pill)', border: '1px solid var(--border)' }}>\n <Icon size={12} aria-hidden style={{ color: `var(--${statusTone(s) === 'neutral' ? 'fg-muted' : statusTone(s)})` }} />\n <span style={{ fontSize: 'var(--fs-12)' }}>{s}</span>\n <Badge tone={statusTone(s)}>{count}</Badge>\n </Inline>\n );\n })}\n </Inline>\n )}\n\n {res.loading && instances.length === 0 ? (\n <Skeleton style={{ height: 240 }} />\n ) : instances.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={1} align=\"center\">\n <Cpu size={32} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong>No background jobs</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Background agents appear here when spawned.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Box style={{ display: 'grid', gridTemplateColumns: selected ? '1fr 380px' : '1fr', gap: 'var(--space-4)' }}>\n {/* Instance list */}\n <Stack gap={2}>\n {instances.map((inst) => {\n const s: BgStatus = inst.status || 'unknown';\n const Icon = statusIcon(s);\n const isSelected = inst.instanceId === selectedId;\n return (\n <Card\n key={inst.instanceId}\n data-testid={`bg-instance-${inst.instanceId}`}\n style={{\n cursor: 'pointer',\n outline: isSelected ? '2px solid var(--accent)' : undefined,\n outlineOffset: -2,\n }}\n onClick={() => { void selectInstance(inst); }}\n >\n <CardBody>\n <Inline align=\"center\" gap={3}>\n <Icon\n size={16}\n aria-hidden\n style={{ color: `var(--${statusTone(s) === 'neutral' ? 'fg-muted' : statusTone(s)})` }}\n />\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-14)' }}>\n {inst.agent ?? inst.instanceId.slice(0, 8)}\n </strong>\n <Badge tone={statusTone(s)}>{s}</Badge>\n {inst.tags?.map((t) => (\n <Badge key={t} tone=\"neutral\">{t}</Badge>\n ))}\n </Inline>\n <Inline gap={3}>\n {inst.worktree && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {inst.worktree}\n </span>\n )}\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {elapsed(inst.startedAt ?? inst.createdAt)}\n </span>\n {inst.pid && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n pid {inst.pid}\n </span>\n )}\n </Inline>\n </Stack>\n {/* Action buttons — stop propagation so clicking doesn't navigate away */}\n <Inline\n gap={1}\n align=\"center\"\n onClick={(e) => e.stopPropagation()}\n >\n {s === 'running' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void pauseInstance(inst.instanceId); }}\n data-testid={`bg-pause-${inst.instanceId}`}\n title=\"Pause\"\n >\n <Pause size={12} aria-hidden />\n </Button>\n )}\n {s === 'paused' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void resumeInstance(inst.instanceId); }}\n data-testid={`bg-resume-${inst.instanceId}`}\n title=\"Resume\"\n >\n <Play size={12} aria-hidden />\n </Button>\n )}\n {(s === 'error' || s === 'killed') && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void retryInstance(inst.instanceId); }}\n data-testid={`bg-retry-${inst.instanceId}`}\n title=\"Retry\"\n >\n <RotateCw size={12} aria-hidden />\n </Button>\n )}\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={() => setKillConfirm(inst.instanceId)}\n data-testid={`bg-kill-${inst.instanceId}`}\n title=\"Kill\"\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n\n {/* Output panel */}\n {selected && (\n <Card>\n <CardBody>\n <Stack gap={3}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <Terminal size={12} aria-hidden />\n <span style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>Output</span>\n </Inline>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { if (selected) void loadOutput(selected.instanceId); }}\n >\n <RotateCw size={12} aria-hidden />\n </Button>\n </Inline>\n\n {outputLoading ? (\n <Skeleton style={{ height: 160 }} />\n ) : outputLines.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>No output captured yet.</span>\n ) : (\n <Box\n style={{\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-3)',\n maxHeight: 320,\n overflowY: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: 1.6,\n }}\n >\n {outputLines.map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n </Box>\n )}\n </Stack>\n </CardBody>\n </Card>\n )}\n </Box>\n )}\n\n {/* Kill confirmation inline dialog */}\n {killConfirm && (\n <div\n role=\"dialog\"\n aria-modal\n style={{\n position: 'fixed',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0,0,0,0.4)',\n zIndex: 100,\n }}\n data-testid=\"bg-kill-confirm\"\n >\n <Card style={{ maxWidth: 400 }}>\n <CardBody>\n <Stack gap={4}>\n <Inline align=\"center\" gap={2}>\n <AlertTriangle size={16} aria-hidden style={{ color: 'var(--danger)' }} />\n <strong>Kill this background job?</strong>\n </Inline>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n This sends SIGTERM to the process. The instance will transition to “killed” status.\n </span>\n <Inline gap={2}>\n <Button\n variant=\"danger\"\n onClick={() => { void killInstance(killConfirm); }}\n disabled={busy}\n >\n Kill\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setKillConfirm(null)}\n disabled={busy}\n >\n Cancel\n </Button>\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n </div>\n )}\n </Stack>\n );\n}\n\nfunction Box(props: { children?: React.ReactNode; style?: React.CSSProperties }): JSX.Element {\n return <div style={props.style}>{props.children}</div>;\n}\n"],"names":["statusIcon","Play","Pause","CheckCircle2","AlertTriangle","Trash2","Cpu","statusTone","elapsed","ms","s","m","BackgroundJobsView","res","useFetch","live","setLive","useState","selectedId","setSelectedId","outputLines","setOutputLines","outputLoading","setOutputLoading","busy","setBusy","actionError","setActionError","killConfirm","setKillConfirm","useWsMessage","useCallback","msg","loadOutput","instances","useMemo","_a","selected","i","id","data","fetchJson","selectInstance","inst","refresh","pauseInstance","err","FetchError","resumeInstance","retryInstance","killInstance","statusCounts","counts","jsxs","Stack","jsx","ViewHeader","Inline","count","Icon","Badge","Skeleton","Card","CardBody","Box","isSelected","t","e","Button","RotateCw","Terminal","line","props"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as D,S as j,I as g,B as c,h as z,i as S,F as C,O as F}from"./main-BURAlktW.js";import{V as P}from"./ViewHeader-C-t1U2cQ.js";import{C as R,b as T}from"./Card-BtsmkhJa.js";import{I as b}from"./Input-h_nSOtwm.js";import{S as $,a as k,b as O}from"./Sheet-B-CMP9-_.js";import{E as B}from"./EmptyState-DjKtY1Qi.js";import{M as A}from"./MessageBubble-CrCJ0SYG.js";import{R as E}from"./refresh-ccw-DA8_IB9l.js";import{S as N}from"./send-C8wwPHhR.js";import{P as M}from"./plus-Cm6-fo14.js";import{P as V}from"./pencil-DAwM-CC3.js";import{T as H}from"./trash-2-D6qePV_q.js";function W({sessionId:a}){var t;const m=`/api/claude-sessions/${a}/messages`,l=D(m),[u,n]=r.useState(""),[d,o]=r.useState("general"),[h,i]=r.useState(!1),[x,f]=r.useState(null),v=r.useCallback(()=>{l.refetch()},[l]),p=((t=l.data)==null?void 0:t.messages)??[],y=async()=>{const s=u.trim();if(!(!s||!d.trim()||h)){i(!0),f(null);try{await S(`/api/claude-sessions/${a}/send`,{method:"POST",body:{message:s,agent:d.trim()}}),n(""),window.setTimeout(()=>{v()},750)}catch(w){f((w instanceof C,w.message))}finally{i(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},"data-testid":`claude-session-detail-${a}`,children:[e.jsxs(g,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:a}),e.jsxs(c,{variant:"ghost",onClick:()=>void v(),"data-testid":`claude-session-detail-refresh-${a}`,children:[e.jsx(E,{size:14,"aria-hidden":!0})," Refresh"]})]}),e.jsx(R,{variant:"default",children:e.jsx(T,{children:l.loading&&p.length===0?e.jsx(z,{style:{height:120}}):p.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No messages yet — start with a follow-up."}):e.jsx(j,{gap:1,children:p.map(s=>e.jsx(A,{message:s},s.id||`${s.ts}-${s.role}`))})})}),x!==null&&e.jsx("span",{role:"alert","data-testid":`claude-session-detail-error-${a}`,style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Agent"}),e.jsx(b,{value:d,"data-testid":`claude-session-detail-agent-${a}`,onChange:s=>o(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Follow-up"}),e.jsx("textarea",{value:u,rows:4,"data-testid":`claude-session-detail-draft-${a}`,onChange:s=>n(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),e.jsx(g,{justify:"end",gap:2,children:e.jsxs(c,{variant:"primary",onClick:()=>void y(),disabled:h||u.trim()===""||d.trim()==="","data-testid":`claude-session-detail-send-${a}`,children:[e.jsx(N,{size:14,"aria-hidden":!0})," ",h?"Sending…":"Send"]})})]})}function te(){var h;const a=D("/api/claude-sessions"),[m,l]=r.useState(!1),[u,n]=r.useState(null),d=((h=a.data)==null?void 0:h.sessions)??[],o=r.useCallback(()=>{a.refetch()},[a]);return e.jsxs(j,{gap:4,"data-testid":"claude-sessions-view",children:[e.jsx(P,{title:"Claude sessions",description:"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.",actions:e.jsxs(g,{align:"center",gap:2,children:[e.jsxs(c,{variant:"ghost",onClick:()=>void o(),"data-testid":"claude-sessions-refresh",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(c,{variant:"primary",onClick:()=>l(!0),"data-testid":"claude-sessions-new",children:[e.jsx(M,{size:14,"aria-hidden":!0})," New session"]})]})}),e.jsx(R,{variant:"default",children:e.jsx(T,{children:a.loading&&d.length===0?e.jsxs(j,{gap:2,children:[e.jsx(z,{style:{height:36}}),e.jsx(z,{style:{height:36}})]}):d.length===0?e.jsx(B,{icon:e.jsx(F,{size:28,"aria-hidden":!0}),title:"No Claude sessions",description:"Create one to start a multi-turn conversation with Claude Code."}):e.jsx(j,{gap:2,children:d.map(i=>e.jsx(q,{session:i,onRefresh:o,onOpen:n},i.id))})})}),e.jsx($,{open:m,onOpenChange:l,children:e.jsx(k,{side:"right",title:"New Claude session",description:"Spawn a Claude Code session via the runner.",children:e.jsx(J,{onCreated:i=>{l(!1),o(),n(i)},onCancel:()=>l(!1)})})}),e.jsx($,{open:u!==null,onOpenChange:i=>{i||n(null)},children:e.jsx(k,{side:"right",title:"Session detail",description:u??"",children:u!==null&&e.jsx(W,{sessionId:u})})})]})}function q({session:a,onRefresh:m,onOpen:l}){const[u,n]=r.useState(!1),[d,o]=r.useState(a.title??""),[h,i]=r.useState(!1),[x,f]=r.useState(null),v=async()=>{if(d.trim()){f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"PATCH",body:{title:d.trim()}}),n(!1),m()}catch(t){f((t instanceof C,t.message))}}},p=async t=>{f(null);try{await S(`/api/claude-sessions/${t}/resume`,{method:"POST",body:{}})}catch(s){f((s instanceof C,s.message))}},y=async()=>{f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"DELETE"}),i(!1),m()}catch(t){f((t instanceof C,t.message))}};return e.jsxs("div",{"data-testid":`claude-session-row-${a.id}`,style:{padding:"var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:"var(--surface-0)"},children:[e.jsxs(g,{align:"center",justify:"between",gap:3,children:[e.jsxs(j,{gap:1,style:{minWidth:0,flex:1},children:[u?e.jsxs(g,{gap:1,children:[e.jsx(b,{value:d,"data-testid":`claude-session-rename-input-${a.id}`,onChange:t=>o(t.target.value)}),e.jsx(c,{variant:"primary",onClick:()=>void v(),"data-testid":`claude-session-rename-submit-${a.id}`,children:"Save"}),e.jsx(c,{variant:"ghost",onClick:()=>{n(!1),o(a.title??"")},children:"Cancel"})]}):e.jsxs(g,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.title||a.id}),a.agent&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:["@",a.agent]})]}),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.id}),x!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x})]}),e.jsxs(g,{gap:1,children:[e.jsx(c,{variant:"primary",onClick:()=>void p(a.id),"data-testid":`claude-session-resume-${a.id}`,"aria-label":`Resume ${a.id}`,children:"Resume"}),e.jsx(c,{variant:"ghost",onClick:()=>l(a.id),"data-testid":`claude-session-open-${a.id}`,children:"Open"}),e.jsx(c,{variant:"ghost",onClick:()=>{n(!0),o(a.title??"")},"data-testid":`claude-session-rename-${a.id}`,"aria-label":`Rename session ${a.id}`,children:e.jsx(V,{size:14,"aria-hidden":!0})}),e.jsx(c,{variant:"ghost",onClick:()=>i(t=>!t),"data-testid":`claude-session-delete-${a.id}`,"aria-label":`Delete session ${a.id}`,children:e.jsx(H,{size:14,"aria-hidden":!0})})]})]}),h&&e.jsxs(g,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(c,{variant:"danger",onClick:()=>void y(),"data-testid":`claude-session-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(c,{variant:"ghost",onClick:()=>i(!1),"data-testid":`claude-session-cancel-delete-${a.id}`,children:"Cancel"})]})]})}function J({onCreated:a,onCancel:m}){const[l,u]=r.useState(""),[n,d]=r.useState("general"),[o,h]=r.useState(""),[i,x]=r.useState(""),[f,v]=r.useState(!1),[p,y]=r.useState(null),t=async()=>{if(!(!n.trim()||!o.trim()||f)){v(!0),y(null);try{const s=await S("/api/claude-sessions/new",{method:"POST",body:{title:l.trim()||null,agent:n.trim(),prompt:o.trim(),directory:i.trim()||void 0}});a(s.id)}catch(s){y((s instanceof C,s.message))}finally{v(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title (optional)"}),e.jsx(b,{value:l,"data-testid":"claude-sessions-new-title",onChange:s=>u(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Agent"}),e.jsx(b,{value:n,"data-testid":"claude-sessions-new-agent",onChange:s=>d(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Seed prompt"}),e.jsx("textarea",{value:o,rows:4,"data-testid":"claude-sessions-new-prompt",onChange:s=>h(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Working directory (optional)"}),e.jsx(b,{value:i,"data-testid":"claude-sessions-new-directory",onChange:s=>x(s.target.value)})]}),p!==null&&e.jsx("span",{role:"alert","data-testid":"claude-sessions-new-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(g,{justify:"end",gap:2,children:[e.jsx(O,{asChild:!0,children:e.jsx(c,{variant:"ghost",onClick:m,"data-testid":"claude-sessions-new-cancel",children:"Cancel"})}),e.jsx(c,{variant:"primary",onClick:()=>void t(),disabled:f||!n.trim()||!o.trim(),"data-testid":"claude-sessions-new-submit",children:"Create"})]})]})}export{te as ClaudeSessionsView};
|