@polderlabs/bizar 10.1.0 → 10.3.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/README.md +31 -10
- package/bizar-dash/CONTROL_SURFACES.md +0 -1
- package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js → ActivityFeed-xXiUCZLB.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js.map → ActivityFeed-xXiUCZLB.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js → ActivityView-nOYhCp3h.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js.map → ActivityView-nOYhCp3h.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js → AdminView-Coi4V3sq.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js.map → AdminView-Coi4V3sq.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js → AgentActivity-nEri4lbx.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js.map → AgentActivity-nEri4lbx.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js → AgentsView-ByiIJ0ej.js} +3 -3
- package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js.map → AgentsView-ByiIJ0ej.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-DN0UysMg.js → Alert-Dg_Vwxh5.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-DN0UysMg.js.map → Alert-Dg_Vwxh5.js.map} +1 -1
- package/bizar-dash/dist/assets/ArtifactsView-CGclRNnz.js +21 -0
- package/bizar-dash/dist/assets/ArtifactsView-CGclRNnz.js.map +1 -0
- package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js → AuthView-utVm6M3D.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js.map → AuthView-utVm6M3D.js.map} +1 -1
- package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js → Avatar-CXDZdKy4.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js.map → Avatar-CXDZdKy4.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js → BackgroundJobsView-j603pz6o.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js.map → BackgroundJobsView-j603pz6o.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js → BackupView-DgvnntTE.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js.map → BackupView-DgvnntTE.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-Tyboihu7.js → Card-D9019JOD.js} +1 -1
- package/bizar-dash/dist/assets/{Card-Tyboihu7.js.map → Card-D9019JOD.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js → ChatView-C0cTgj5d.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js.map → ChatView-C0cTgj5d.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js → Chip-DQtalZ4y.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js.map → Chip-DQtalZ4y.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js → ClaudeSessionsView-H3Bqjo6b.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js.map → ClaudeSessionsView-H3Bqjo6b.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js → ClipboardView-BAguaKbx.js} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js.map → ClipboardView-BAguaKbx.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js → ConfigView-DWHJgoe8.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js.map → ConfigView-DWHJgoe8.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js → DiagnosticsView-oCT624hk.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js.map → DiagnosticsView-oCT624hk.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js → DialogsView-CqHNals_.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js.map → DialogsView-CqHNals_.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js → DoctorView-6kfQq_Mx.js} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js.map → DoctorView-6kfQq_Mx.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js → EmptyState-DLmtBX_6.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js.map → EmptyState-DLmtBX_6.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js → EnvVarsView-DySOXlP1.js} +2 -2
- package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js.map → EnvVarsView-DySOXlP1.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js → ErrorState-Bump8diE.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js.map → ErrorState-Bump8diE.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js → EvalView-FnZ5d93z.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js.map → EvalView-FnZ5d93z.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js → GoalsView-C4m1WnVv.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js.map → GoalsView-C4m1WnVv.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js → Grid-dEnoGGws.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js.map → Grid-dEnoGGws.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js → HistoryView-xdRybjZ2.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js.map → HistoryView-xdRybjZ2.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-BbFUDQnS.js → Input-BSa3lh_-.js} +1 -1
- package/bizar-dash/dist/assets/{Input-BbFUDQnS.js.map → Input-BSa3lh_-.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js → LibrariesView-1zR04Eci.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-1zR04Eci.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js → LightRAGView-PubmA9oL.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-PubmA9oL.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js → ListHeader-Ak9WJd39.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js.map → ListHeader-Ak9WJd39.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js → MemoryView-DBGpuETw.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js.map → MemoryView-DBGpuETw.js.map} +1 -1
- package/bizar-dash/dist/assets/MiscView-DufqBHkX.js +1 -0
- package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js.map → MiscView-DufqBHkX.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js → ModsView-DcX6eVU2.js} +2 -2
- package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js.map → ModsView-DcX6eVU2.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js → NotificationsView-B8IhHRQC.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js.map → NotificationsView-B8IhHRQC.js.map} +1 -1
- package/bizar-dash/dist/assets/ObsidianView-DEuk65zS.js +1 -0
- package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js.map → ObsidianView-DEuk65zS.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js → OverviewView-CTI2spTd.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js.map → OverviewView-CTI2spTd.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js → ProgressBar-D3lkz42E.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js.map → ProgressBar-D3lkz42E.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js → ProjectsView-Du0LzE7A.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js.map → ProjectsView-Du0LzE7A.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js → ProvidersView-5bCgXwBo.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js.map → ProvidersView-5bCgXwBo.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js → SchedulesView-DFHdIz5P.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js.map → SchedulesView-DFHdIz5P.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js → Select-C8EJj4NM.js} +1 -1
- package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js.map → Select-C8EJj4NM.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js → SettingsRow-BdOOmYMD.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js.map → SettingsRow-BdOOmYMD.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js → SettingsView-CqwQ6Knv.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js.map → SettingsView-CqwQ6Knv.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js → Sheet-Cztsvgse.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js.map → Sheet-Cztsvgse.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js → Slider-BexNfF6K.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js.map → Slider-BexNfF6K.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js → Sparkline-CLZBtvsN.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js.map → Sparkline-CLZBtvsN.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-BItGrPqr.js → Switch-B1tiRwNK.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-BItGrPqr.js.map → Switch-B1tiRwNK.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js → TasksView-CT0fPlos.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js.map → TasksView-CT0fPlos.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js → Textarea-D_TPpVMy.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js.map → Textarea-D_TPpVMy.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js → UpdateView-tD2q2OhW.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js.map → UpdateView-tD2q2OhW.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js → UsageView-B4BuAFKA.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js.map → UsageView-B4BuAFKA.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js → ViewHeader-V_SzbUpw.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js.map → ViewHeader-V_SzbUpw.js.map} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js → VoiceView-D3vb5OM2.js} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js.map → VoiceView-D3vb5OM2.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-fsBSDl2g.js → brain-BmfWcitQ.js} +1 -1
- package/bizar-dash/dist/assets/{brain-fsBSDl2g.js.map → brain-BmfWcitQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js → calendar-VntJUzFB.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js.map → calendar-VntJUzFB.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js → circle-KrQQySeK.js} +1 -1
- package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js.map → circle-KrQQySeK.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js → circle-alert-CQ9MLygI.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js.map → circle-alert-CQ9MLygI.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js → circle-check-COtVgsWw.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js.map → circle-check-COtVgsWw.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-OuficfgH.js → clock-C0GlM4qp.js} +1 -1
- package/bizar-dash/dist/assets/{clock-OuficfgH.js.map → clock-C0GlM4qp.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-BdHlstUY.js → download-CW4DmtRe.js} +1 -1
- package/bizar-dash/dist/assets/{download-BdHlstUY.js.map → download-CW4DmtRe.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js → external-link-CAOnh_DH.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js.map → external-link-CAOnh_DH.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-B-g8H227.js → file-text-CS1jB_oV.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-B-g8H227.js.map → file-text-CS1jB_oV.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-D9B8s5CG.js → filter-DyQbml3L.js} +1 -1
- package/bizar-dash/dist/assets/{filter-D9B8s5CG.js.map → filter-DyQbml3L.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js → git-pull-request-Co6gYfba.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js.map → git-pull-request-Co6gYfba.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-CdOm1Pj9.js → main-CyAIirBB.js} +28 -33
- package/bizar-dash/dist/assets/main-CyAIirBB.js.map +1 -0
- package/bizar-dash/dist/assets/network-CDn43Gsj.js +6 -0
- package/bizar-dash/dist/assets/network-CDn43Gsj.js.map +1 -0
- package/bizar-dash/dist/assets/{pause-C9hgd8wX.js → pause-CKYjSTGX.js} +1 -1
- package/bizar-dash/dist/assets/{pause-C9hgd8wX.js.map → pause-CKYjSTGX.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-BanqaMw7.js → pencil-BUJ2DpWs.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-BanqaMw7.js.map → pencil-BUJ2DpWs.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-CawUZ02_.js → play-CGxZWqtW.js} +1 -1
- package/bizar-dash/dist/assets/{play-CawUZ02_.js.map → play-CGxZWqtW.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js → plug-CQYGgGSy.js} +1 -1
- package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js.map → plug-CQYGgGSy.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-M6LYiKX8.js → plus-fFxt-8z5.js} +1 -1
- package/bizar-dash/dist/assets/{plus-M6LYiKX8.js.map → plus-fFxt-8z5.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DP5x_SRF.js → power-Cjgy2KsI.js} +1 -1
- package/bizar-dash/dist/assets/{power-DP5x_SRF.js.map → power-Cjgy2KsI.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js → power-off-B81hLRah.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js.map → power-off-B81hLRah.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js → refresh-ccw-BCXx86xp.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js.map → refresh-ccw-BCXx86xp.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js → refresh-cw-COTg1nZo.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js.map → refresh-cw-COTg1nZo.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js → rotate-ccw-BZrEVc0Z.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js.map → rotate-ccw-BZrEVc0Z.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js → rotate-cw-CsTtaLV2.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js.map → rotate-cw-CsTtaLV2.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-DQKCKyZK.js → save-DtMTge1F.js} +1 -1
- package/bizar-dash/dist/assets/{save-DQKCKyZK.js.map → save-DtMTge1F.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-xgy3RAi7.js → send-DyBhyk8t.js} +1 -1
- package/bizar-dash/dist/assets/{send-xgy3RAi7.js.map → send-DyBhyk8t.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js → shield-alert-BPGJlRF8.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js.map → shield-alert-BPGJlRF8.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js → trash-2-2NsyTU8c.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js.map → trash-2-2NsyTU8c.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js → trending-up-BXwP23VK.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js.map → trending-up-BXwP23VK.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js → triangle-alert-DFmQ_RXN.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js.map → triangle-alert-DFmQ_RXN.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-Cww6MvFq.js → upload-Cj-HYRYV.js} +1 -1
- package/bizar-dash/dist/assets/{upload-Cww6MvFq.js.map → upload-Cj-HYRYV.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-DmhVUzRA.js → zap-BaOiybcl.js} +1 -1
- package/bizar-dash/dist/assets/{zap-DmhVUzRA.js.map → zap-BaOiybcl.js.map} +1 -1
- package/bizar-dash/dist/index.html +1 -1
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +11 -0
- package/bizar-dash/src/server/artifacts-store.mjs +120 -14
- package/bizar-dash/src/server/claude-artifacts.mjs +281 -0
- package/bizar-dash/src/server/routes/artifacts.mjs +42 -6
- package/bizar-dash/src/server/routes/audit.mjs +78 -0
- package/bizar-dash/src/server/routes/decisions.mjs +78 -0
- package/bizar-dash/src/server/routes/model-router.mjs +55 -0
- package/bizar-dash/src/server/routes/model-router.test.mjs +28 -0
- package/bizar-dash/src/server/routes/sessions.mjs +80 -0
- package/bizar-dash/src/server/routes/update.mjs +48 -21
- package/bizar-dash/src/server/sprint.test.mjs +163 -0
- package/bizar-dash/src/web/v8/App.tsx +0 -4
- package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +0 -17
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +0 -1
- package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +232 -21
- package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +179 -0
- package/bizar-dash/src/web/v8/views/Router.tsx +0 -5
- package/bizar-dash/tests/_update-test-helpers.mjs +13 -0
- package/bizar-dash/tests/update-check.test.mjs +18 -13
- package/bizar-dash/tests/update-packages.test.mjs +154 -0
- package/bizar-dash/tests/update-run.test.mjs +17 -80
- package/cli/banner.mjs +1 -1
- package/cli/bin.mjs +8 -1
- package/cli/bootstrap.mjs +1 -1
- package/cli/commands/claude-cmd.mjs +1 -1
- package/cli/commands/deploy/docker.mjs +0 -3
- package/cli/install/banner.mjs +67 -0
- package/cli/install/banner.test.mjs +39 -0
- package/cli/install/index.mjs +32 -0
- package/cli/install/index.test.mjs +61 -0
- package/cli/install/paths.mjs +80 -0
- package/cli/install/paths.test.mjs +77 -0
- package/cli/install/plugin.mjs +161 -0
- package/cli/install/postinstall.mjs +111 -0
- package/cli/install.mjs +13 -600
- package/cli/migrate.mjs +157 -0
- package/cli/migrate.test.mjs +85 -0
- package/cli/provision.mjs +615 -1918
- package/cli/provision.test.mjs +1 -1
- package/cli/service-controller.test.mjs +0 -1
- package/cli/service-env.mjs +0 -1
- package/cli/utils.mjs +0 -1
- package/install.sh +54 -466
- package/package.json +1 -1
- package/packages/sdk/dist/agent/cron.d.ts +44 -0
- package/packages/sdk/dist/agent/cron.js +79 -0
- package/packages/sdk/dist/agent/heartbeat.d.ts +43 -0
- package/packages/sdk/dist/agent/heartbeat.js +116 -0
- package/packages/sdk/dist/index.d.ts +3 -0
- package/packages/sdk/dist/index.js +5 -0
- package/packages/sdk/dist/learning/decisions.d.ts +46 -0
- package/packages/sdk/dist/learning/decisions.js +132 -0
- package/packages/sdk/dist/learning/index.d.ts +8 -0
- package/packages/sdk/dist/learning/index.js +8 -0
- package/packages/sdk/dist/learning/instincts.d.ts +38 -0
- package/packages/sdk/dist/learning/instincts.js +139 -0
- package/packages/sdk/dist/mcp/server.js +119 -1
- package/packages/sdk/dist/router/agent-model-registry.d.ts +89 -0
- package/packages/sdk/dist/router/agent-model-registry.js +144 -0
- package/packages/sdk/dist/router/index.d.ts +1 -0
- package/packages/sdk/dist/router/index.js +1 -0
- package/packages/sdk/package.json +3 -2
- package/scripts/audit.mjs +388 -0
- package/scripts/audit.test.mjs +149 -0
- package/scripts/eval-gate.mjs +134 -0
- package/scripts/eval-gate.test.mjs +138 -0
- package/scripts/feature-state-machine.mjs +178 -0
- package/scripts/feature-state-machine.test.mjs +135 -0
- package/scripts/install-curl.sh +17 -0
- package/scripts/spec-dedup.test.mjs +124 -0
- package/scripts/sprint.mjs +213 -0
- package/scripts/worktree-setup.sh +79 -0
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +0 -6
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +0 -1
- package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js +0 -11
- package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js.map +0 -1
- package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js +0 -1
- package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js +0 -1
- package/bizar-dash/dist/assets/main-CdOm1Pj9.js.map +0 -1
- package/bizar-dash/src/web/v8/views/Headroom/HeadroomView.tsx +0 -201
- package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +0 -90
- package/bizar-dash/tests/v7-archive/mobile-overview.test.tsx +0 -214
- package/bizar-dash/tests/v7-archive/mobile-settings.test.tsx +0 -181
- package/bizar-dash/tests/v7-archive/navigation/CommandPalette.test.tsx +0 -105
- package/bizar-dash/tests/v7-archive/settings-nav.test.tsx +0 -128
- package/bizar-dash/tests/v7-archive/views/Overview.test.tsx +0 -413
- package/cli/provision-claude.mjs +0 -1176
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/sprint.mjs
|
|
3
|
+
*
|
|
4
|
+
* /sprint <goal-id> — auto-fill a sprint contract from a goal in PROGRESS.md.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node scripts/sprint.mjs <goal-id> [projectRoot]
|
|
8
|
+
*
|
|
9
|
+
* projectRoot defaults to process.cwd().
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { join, dirname } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
|
|
15
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
|
|
17
|
+
/** @param {string} goalId @param {string} projectRoot */
|
|
18
|
+
export async function fillSprintContract(goalId, projectRoot = process.cwd()) {
|
|
19
|
+
// 1. Find and read progress-parser.mjs
|
|
20
|
+
const parserPath = join(projectRoot, 'bizar-dash', 'src', 'server', 'progress-parser.mjs');
|
|
21
|
+
let parseProgress;
|
|
22
|
+
try {
|
|
23
|
+
({ parseProgress } = await import(parserPath));
|
|
24
|
+
} catch {
|
|
25
|
+
throw new Error(`progress-parser.mjs not found at ${parserPath}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 2. Read .bizar/PROGRESS.md
|
|
29
|
+
const progressPath = join(projectRoot, '.bizar', 'PROGRESS.md');
|
|
30
|
+
if (!existsSync(progressPath)) {
|
|
31
|
+
throw new Error(`PROGRESS.md not found at ${progressPath}`);
|
|
32
|
+
}
|
|
33
|
+
const progressText = readFileSync(progressPath, 'utf8');
|
|
34
|
+
const { goals } = parseProgress(progressText);
|
|
35
|
+
|
|
36
|
+
// 3. Find the goal
|
|
37
|
+
const goal = goals.find((g) => g.id.toUpperCase() === goalId.toUpperCase());
|
|
38
|
+
if (!goal) {
|
|
39
|
+
const available = goals.map((g) => g.id).join(', ');
|
|
40
|
+
throw new Error(`goal '${goalId}' not found in .bizar/PROGRESS.md. Available: ${available || 'none'}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 4. Read template
|
|
44
|
+
const templatePath = join(projectRoot, 'templates', 'sprint-contract.md');
|
|
45
|
+
if (!existsSync(templatePath)) {
|
|
46
|
+
throw new Error(`sprint-contract.md not found at ${templatePath}`);
|
|
47
|
+
}
|
|
48
|
+
const template = readFileSync(templatePath, 'utf8');
|
|
49
|
+
|
|
50
|
+
// 5. Build pre-filled content
|
|
51
|
+
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
52
|
+
const unchecked = (text) => text.replace('[x]', '[ ]');
|
|
53
|
+
const checked = (text) => text.replace('[ ]', '[x]');
|
|
54
|
+
|
|
55
|
+
// Split template into lines for section-by-section replacement
|
|
56
|
+
const lines = template.split('\n');
|
|
57
|
+
const out = [];
|
|
58
|
+
|
|
59
|
+
// Section flags
|
|
60
|
+
let inScopeIn = false;
|
|
61
|
+
let inScopeOut = false;
|
|
62
|
+
let inDod = false;
|
|
63
|
+
let inArch = false;
|
|
64
|
+
let inRisk = false;
|
|
65
|
+
let filledFeatureId = false;
|
|
66
|
+
let filledTitle = false;
|
|
67
|
+
let filledOwner = false;
|
|
68
|
+
let filledSprintDate = false;
|
|
69
|
+
let scopeInStarted = false;
|
|
70
|
+
|
|
71
|
+
const completedKRs = goal.keyResults.filter((kr) => kr.done);
|
|
72
|
+
const pendingKRs = goal.keyResults.filter((kr) => !kr.done);
|
|
73
|
+
|
|
74
|
+
for (let i = 0; i < lines.length; i++) {
|
|
75
|
+
const line = lines[i];
|
|
76
|
+
|
|
77
|
+
// Fill Identification section
|
|
78
|
+
if (!filledFeatureId && /Feature ID/.test(line)) {
|
|
79
|
+
out.push(line);
|
|
80
|
+
// Next line is the value row — fill it
|
|
81
|
+
out.push(`- **Feature ID:** ${goal.id}`);
|
|
82
|
+
filledFeatureId = true;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (!filledTitle && /^\s*- \*\*Title:\*\*/.test(line)) {
|
|
86
|
+
out.push(line.replace('<one-line>', goal.title));
|
|
87
|
+
filledTitle = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (!filledSprintDate && /Sprint date/.test(line)) {
|
|
91
|
+
out.push(line);
|
|
92
|
+
out.push(`- **Sprint date:** ${today}`);
|
|
93
|
+
filledSprintDate = true;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!filledOwner && /^\s*- \*\*Owner:\*\*/.test(line)) {
|
|
97
|
+
out.push(line.replace('<agent name or "claude">', goal.owner ?? 'claude'));
|
|
98
|
+
filledOwner = true;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Scope (in) — replace placeholder with goal KRs
|
|
103
|
+
if (/^\s*## Scope \(in\)/.test(line)) {
|
|
104
|
+
inScopeIn = true;
|
|
105
|
+
inScopeOut = false;
|
|
106
|
+
inDod = false;
|
|
107
|
+
inArch = false;
|
|
108
|
+
inRisk = false;
|
|
109
|
+
out.push(line);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (/^\s*## Scope \(out\)/.test(line)) {
|
|
113
|
+
inScopeIn = false;
|
|
114
|
+
inScopeOut = true;
|
|
115
|
+
inDod = false;
|
|
116
|
+
inArch = false;
|
|
117
|
+
inRisk = false;
|
|
118
|
+
out.push(line);
|
|
119
|
+
// Add a blank "not yet defined" placeholder if no scope-out is natural
|
|
120
|
+
out.push('\n- _None defined yet — add items as the sprint evolves_\n');
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (inScopeIn && !scopeInStarted && /^-\s*<item/.test(line)) {
|
|
124
|
+
scopeInStarted = true;
|
|
125
|
+
// Replace placeholder with pending KRs first, then completed
|
|
126
|
+
if (pendingKRs.length > 0) {
|
|
127
|
+
out.push(`- _In progress (${pendingKRs.length}):_`);
|
|
128
|
+
for (const kr of pendingKRs) {
|
|
129
|
+
out.push(`- [ ] ${kr.title}`);
|
|
130
|
+
}
|
|
131
|
+
out.push('');
|
|
132
|
+
}
|
|
133
|
+
if (completedKRs.length > 0) {
|
|
134
|
+
out.push(`- _Done (${completedKRs.length}):_`);
|
|
135
|
+
for (const kr of completedKRs) {
|
|
136
|
+
out.push(`- [x] ${kr.title}`);
|
|
137
|
+
}
|
|
138
|
+
out.push('');
|
|
139
|
+
}
|
|
140
|
+
if (goal.keyResults.length === 0) {
|
|
141
|
+
out.push('- <scope item — add from goal key results>');
|
|
142
|
+
}
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (/^\s*## Definition of Done/.test(line)) {
|
|
146
|
+
inScopeIn = false;
|
|
147
|
+
inScopeOut = false;
|
|
148
|
+
inDod = true;
|
|
149
|
+
inArch = false;
|
|
150
|
+
inRisk = false;
|
|
151
|
+
out.push(line);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// DoD — pre-check all standard items
|
|
155
|
+
if (inDod && /^\s*-\s+\[ \]/.test(line)) {
|
|
156
|
+
out.push(line.replace('[ ]', '[x]'));
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Scope out — skip any remaining placeholders (already handled above)
|
|
160
|
+
if (inScopeOut && /^-\s*<item/.test(line)) {
|
|
161
|
+
continue; // skip placeholder — we added our own above
|
|
162
|
+
}
|
|
163
|
+
if (/^\s*## Architecture/.test(line)) {
|
|
164
|
+
inScopeIn = false;
|
|
165
|
+
inScopeOut = false;
|
|
166
|
+
inDod = false;
|
|
167
|
+
inArch = true;
|
|
168
|
+
inRisk = false;
|
|
169
|
+
}
|
|
170
|
+
if (/^\s*## Risk/.test(line)) {
|
|
171
|
+
inScopeIn = false;
|
|
172
|
+
inScopeOut = false;
|
|
173
|
+
inDod = false;
|
|
174
|
+
inArch = false;
|
|
175
|
+
inRisk = true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
out.push(line);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const content = out.join('\n');
|
|
182
|
+
|
|
183
|
+
// 6. Write to .bizar/sprints/<goal-id>-<date>.md
|
|
184
|
+
const sprintsDir = join(projectRoot, '.bizar', 'sprints');
|
|
185
|
+
mkdirSync(sprintsDir, { recursive: true });
|
|
186
|
+
const destPath = join(sprintsDir, `${goal.id}-${today}.md`);
|
|
187
|
+
|
|
188
|
+
if (existsSync(destPath)) {
|
|
189
|
+
throw new Error(`Sprint file already exists: ${destPath}\nDelete it or use a different goal.`);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
writeFileSync(destPath, content, 'utf8');
|
|
193
|
+
return destPath;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ── CLI ─────────────────────────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
199
|
+
const goalId = process.argv[2];
|
|
200
|
+
if (!goalId) {
|
|
201
|
+
console.error('Usage: node scripts/sprint.mjs <goal-id> [projectRoot]');
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
const projectRoot = process.argv[3] || process.cwd();
|
|
205
|
+
fillSprintContract(goalId, projectRoot)
|
|
206
|
+
.then((path) => {
|
|
207
|
+
console.log(`Sprint contract written: ${path}`);
|
|
208
|
+
})
|
|
209
|
+
.catch((err) => {
|
|
210
|
+
console.error(`Error: ${err.message}`);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/worktree-setup.sh
|
|
3
|
+
#
|
|
4
|
+
# Pillar A — Worktree symlink bootstrap.
|
|
5
|
+
# When a git worktree is added, symlink shared node_modules, dist, .next,
|
|
6
|
+
# and .harness/node_modules from the main worktree so agents don't re-install.
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# ./scripts/worktree-setup.sh <worktree-path>
|
|
10
|
+
#
|
|
11
|
+
# The worktree path is passed by the EnterWorktree PostToolUse hook.
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
WORKTREE_ROOT="${1:-}"
|
|
16
|
+
if [[ -z "$WORKTREE_ROOT" ]]; then
|
|
17
|
+
echo "Usage: $0 <worktree-path>" >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Resolve relative paths and find the main worktree (the git repo root).
|
|
22
|
+
if [[ ! -d "$WORKTREE_ROOT/.git" ]]; then
|
|
23
|
+
echo "error: $WORKTREE_ROOT is not a git worktree" >&2
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
GIT_ROOT="$(git -C "$WORKTREE_ROOT" rev-parse --show-toplevel 2>/dev/null || echo "")"
|
|
28
|
+
if [[ -z "$GIT_ROOT" ]]; then
|
|
29
|
+
echo "error: could not determine git root for $WORKTREE_ROOT" >&2
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Directories to symlink from main worktree
|
|
34
|
+
LINK_PAIRS=(
|
|
35
|
+
"node_modules:node_modules"
|
|
36
|
+
".harness/node_modules:.harness/node_modules"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Optional build outputs — only symlink if they exist in the main worktree
|
|
40
|
+
for item in dist .next; do
|
|
41
|
+
if [[ -e "$GIT_ROOT/$item" ]]; then
|
|
42
|
+
LINK_PAIRS+=("$item:$item")
|
|
43
|
+
fi
|
|
44
|
+
done
|
|
45
|
+
|
|
46
|
+
ln_errors=0
|
|
47
|
+
for pair in "${LINK_PAIRS[@]}"; do
|
|
48
|
+
src="${pair%%:*}"
|
|
49
|
+
dst="${pair##*:}"
|
|
50
|
+
src_path="$GIT_ROOT/$src"
|
|
51
|
+
dst_path="$WORKTREE_ROOT/$dst"
|
|
52
|
+
|
|
53
|
+
# If dst already exists (file or directory), skip.
|
|
54
|
+
if [[ -e "$dst_path" ]]; then
|
|
55
|
+
echo "skip: $dst_path already exists"
|
|
56
|
+
continue
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Create parent dir if needed
|
|
60
|
+
dst_parent="$(dirname "$dst_path")"
|
|
61
|
+
mkdir -p "$dst_parent"
|
|
62
|
+
|
|
63
|
+
# Symlink relatively from worktree to main worktree.
|
|
64
|
+
# Use a relative path so it works across machines.
|
|
65
|
+
rel="$(realpath --relative-to="$dst_parent" "$src_path")"
|
|
66
|
+
if ln -s "$rel" "$dst_path"; then
|
|
67
|
+
echo "linked: $dst_path -> $rel"
|
|
68
|
+
else
|
|
69
|
+
echo "error: failed to symlink $dst_path" >&2
|
|
70
|
+
ln_errors=$((ln_errors + 1))
|
|
71
|
+
fi
|
|
72
|
+
done
|
|
73
|
+
|
|
74
|
+
if [[ $ln_errors -gt 0 ]]; then
|
|
75
|
+
echo "warning: $ln_errors symlink(s) failed" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
echo "worktree-setup complete"
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r as i,j as t}from"./cmdk-DVxytz9i.js";import{c as $,u as S,S as f,I as g,d,h as C,L as E,i as b,F as D}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as A,b as M}from"./Card-Tyboihu7.js";import{I as y}from"./Input-BbFUDQnS.js";import{T}from"./Textarea-qYDf3yds.js";import{S as k,a as z}from"./Sheet-DH-WNJ3Y.js";import{E as F}from"./EmptyState-DZ2ouKwd.js";import{R}from"./refresh-ccw-CHMprsm5.js";import{P as O}from"./plus-M6LYiKX8.js";import{E as P}from"./external-link-DA3_VGm-.js";import{T as I}from"./trash-2-CL4khSRv.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 L=$("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 _(){const r=S("/api/artifacts"),[a,n]=i.useState(null),[j,o]=i.useState(!1),[c,u]=i.useState(null),[m,h]=i.useState(null),x=i.useMemo(()=>{var e;return((e=r.data)==null?void 0:e.artifacts)??[]},[r.data]),p=i.useCallback(()=>{r.refetch()},[r]),v=async e=>{h(null);try{await b(`/api/artifacts/${e}`,{method:"DELETE"}),n(null),c===e&&u(null),p()}catch(l){h((l instanceof D,l.message))}};return t.jsxs(f,{gap:4,"data-testid":"artifacts-view",children:[t.jsx(w,{title:"Artifacts",description:"Generated artifacts (plans, diagrams, canvases).",actions:t.jsxs(g,{align:"center",gap:2,children:[m!==null&&t.jsx("span",{role:"alert","data-testid":"artifacts-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),t.jsxs(d,{variant:"ghost",onClick:()=>void p(),"data-testid":"artifacts-refresh",children:[t.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"artifacts-add",children:[t.jsx(O,{size:14,"aria-hidden":!0})," Add"]})]})}),t.jsx(A,{variant:"default",children:t.jsx(M,{children:r.loading&&x.length===0?t.jsxs(f,{gap:1,children:[t.jsx(C,{style:{height:48}}),t.jsx(C,{style:{height:48}})]}):x.length===0?t.jsx(F,{icon:t.jsx(E,{size:28,"aria-hidden":!0}),title:"No artifacts",description:"Create one to get started."}):t.jsx(f,{gap:1,children:x.map(e=>{const l=a===e.slug;return t.jsxs("div",{"data-testid":`artifact-row-${e.slug}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[t.jsxs(g,{align:"center",justify:"between",gap:2,children:[t.jsxs(f,{gap:0,style:{minWidth:0,flex:1},children:[t.jsxs(g,{align:"center",gap:2,children:[t.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.slug}),t.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.slug}),e.kind&&t.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",e.kind]})]}),e.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.description})]}),t.jsxs(g,{gap:1,children:[t.jsxs(d,{variant:"ghost",onClick:()=>u(s=>s===e.slug?null:e.slug),"data-testid":`artifact-open-${e.slug}`,"aria-label":`Open ${e.slug}`,children:[t.jsx(P,{size:14,"aria-hidden":!0})," Open"]}),t.jsx(d,{variant:"ghost",onClick:()=>n(s=>s===e.slug?null:e.slug),"data-testid":`artifact-delete-${e.slug}`,"aria-label":`Delete ${e.slug}`,children:t.jsx(I,{size:14,"aria-hidden":!0})})]})]}),l&&t.jsxs(g,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(d,{variant:"danger",onClick:()=>void v(e.slug),"data-testid":`artifact-confirm-delete-${e.slug}`,children:"Confirm delete"}),t.jsx(d,{variant:"ghost",onClick:()=>n(null),children:"Cancel"})]})]},e.slug)})})})}),t.jsx(k,{open:j,onOpenChange:o,children:t.jsx(z,{side:"right",title:"Add artifact",description:"Slug + title + initial MDX.",children:t.jsx(V,{onSubmit:async e=>{await b("/api/artifacts",{method:"POST",body:e}),o(!1),p()},onCancel:()=>o(!1)})})}),t.jsx(k,{open:c!==null,onOpenChange:e=>{e||u(null)},children:t.jsx(z,{side:"right",title:c??"",description:"Artifact detail",children:c!==null&&t.jsx(B,{slug:c})})})]})}function V({onSubmit:r,onCancel:a}){const[n,j]=i.useState(""),[o,c]=i.useState(""),[u,m]=i.useState(""),[h,x]=i.useState(""),[p,v]=i.useState(!1),[e,l]=i.useState(null);return t.jsxs(f,{gap:3,style:{padding:"var(--space-4)"},children:[t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Slug"}),t.jsx(y,{value:n,onChange:s=>j(s.target.value),"data-testid":"artifact-form-slug"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),t.jsx(y,{value:o,onChange:s=>c(s.target.value),"data-testid":"artifact-form-title"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),t.jsx(y,{value:u,onChange:s=>m(s.target.value),"data-testid":"artifact-form-description"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Plan MDX"}),t.jsx(T,{value:h,rows:6,onChange:s=>x(s.target.value),"data-testid":"artifact-form-mdx"})]}),e!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:e}),t.jsxs(g,{justify:"end",gap:2,children:[t.jsx(d,{variant:"ghost",onClick:a,children:"Cancel"}),t.jsx(d,{variant:"primary",disabled:p||!n.trim(),"data-testid":"artifact-form-submit",onClick:async()=>{v(!0),l(null);try{await r({slug:n.trim(),title:o.trim()||void 0,description:u.trim()||void 0,planMdx:h||void 0})}catch(s){l((s instanceof D,s.message)),v(!1)}},children:p?"Creating…":"Create"})]})]})}function B({slug:r}){const a=S(`/api/artifacts/${r}`),n=S(`/api/artifacts/${r}/render`);return t.jsx(f,{gap:2,style:{padding:"var(--space-4)"},children:a.loading&&!a.data?t.jsx(C,{style:{height:80}}):a.data?t.jsxs(f,{gap:2,children:[t.jsx("strong",{children:a.data.title||a.data.slug}),a.data.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.data.description}),a.data.frontmatter&&t.jsx("div",{"data-testid":`artifact-frontmatter-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:t.jsx("pre",{style:{margin:0,fontSize:"var(--fs-11)",fontFamily:"var(--font-mono)"},children:JSON.stringify(a.data.frontmatter,null,2)})}),a.data.planMdx&&t.jsx("pre",{"data-testid":`artifact-mdx-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-11)",maxHeight:240,overflow:"auto",fontFamily:"var(--font-mono)"},children:a.data.planMdx}),n.data&&t.jsxs("span",{"data-testid":`artifact-render-${r}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Render: ",Array.isArray(n.data.blocks)?`${n.data.blocks.length} blocks`:"no blocks"]})]}):t.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"Not found"})})}export{_ as ArtifactsView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArtifactsView-CDIhPBAx.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../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/ArtifactsView.tsx — Sprint S43, v9.3.0.\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, ...}).\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';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: string;\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: 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=\"Create 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 + title + initial MDX.\">\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} />}\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; planMdx?: string; frontmatter?: Record<string, unknown> }) => 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 [planMdx, setPlanMdx] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <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)' }}>Plan MDX</span>\n <Textarea value={planMdx} rows={6} onChange={(e) => setPlanMdx((e.target as HTMLTextAreaElement).value)} data-testid=\"artifact-form-mdx\" />\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 await onSubmit({ slug: slug.trim(), title: title.trim() || undefined, description: description.trim() || undefined, planMdx: planMdx || undefined });\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\nfunction ArtifactDetail({ slug }: { slug: string }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<{ blocks?: unknown[]; frontmatter?: Record<string, unknown> }>(`/api/artifacts/${slug}/render`);\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 <strong>{payload.data.title || payload.data.slug}</strong>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n {payload.data.frontmatter && (\n <div data-testid={`artifact-frontmatter-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <pre style={{ margin: 0, fontSize: 'var(--fs-11)', fontFamily: 'var(--font-mono)' }}>{JSON.stringify(payload.data.frontmatter, null, 2)}</pre>\n </div>\n )}\n {payload.data.planMdx && (\n <pre data-testid={`artifact-mdx-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', fontSize: 'var(--fs-11)', maxHeight: 240, overflow: 'auto', fontFamily: 'var(--font-mono)' }}>{payload.data.planMdx}</pre>\n )}\n {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 </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ArtifactsView","payload","useFetch","confirmDelete","setConfirmDelete","useState","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","slug","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","Layers","a","isConfirming","cur","ExternalLink","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","planMdx","setPlanMdx","busy","setBusy","Input","e","Textarea","renderPayload"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{r as g,j as a}from"./cmdk-DVxytz9i.js";import{c as C,u as k,S as o,I as m,d as l,h as T,N as B,B as z,i as d,F as c}from"./main-CdOm1Pj9.js";import{G as E}from"./Grid-CiRyhAgR.js";import{V as O}from"./ViewHeader-BqIPVKuG.js";import{C as f,b as u}from"./Card-Tyboihu7.js";import{R as q}from"./refresh-cw-1RBqDKgJ.js";import{P as H}from"./plug-Cmv0-T_e.js";import{P as M}from"./play-CawUZ02_.js";import{R as U}from"./rotate-cw-DHooc0Tx.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 L=C("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/**
|
|
7
|
-
* @license lucide-react v0.460.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const V=C("Unplug",[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]]);function X(){var v,j,w,S;const s=k("/api/headroom/status"),h=k("/api/headroom/stats?hours=24"),[r,n]=g.useState(null),[x,i]=g.useState(null);g.useEffect(()=>{const t=setInterval(()=>{s.refetch()},15e3);return()=>clearInterval(t)},[s]);const b=async()=>{n("install"),i(null);try{await d("/api/headroom/install",{method:"POST",body:{force:!1}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},I=async()=>{n("wrap"),i(null);try{await d("/api/headroom/wrap",{method:"POST",body:{port:8787}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},P=async()=>{n("unwrap"),i(null);try{await d("/api/headroom/unwrap",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},R=async()=>{n("start"),i(null);try{await d("/api/headroom/start",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},F=async()=>{n("stop"),i(null);try{await d("/api/headroom/stop",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},e=s.data,y=e&&e.status!=="not-installed",p=(e==null?void 0:e.status)==="running";return a.jsxs(o,{gap:5,"data-testid":"headroom-view",children:[a.jsx(O,{title:"Headroom",description:"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.",actions:a.jsxs(m,{gap:2,align:"center",children:[x!==null&&a.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),a.jsxs(l,{variant:"ghost",onClick:()=>{s.refetch()},"data-testid":"headroom-refresh",children:[a.jsx(q,{size:14,"aria-hidden":!0})," Refresh"]})]})}),a.jsx(f,{variant:"elevated",children:a.jsx(u,{children:s.loading&&!e?a.jsx(T,{style:{height:60}}):a.jsxs(m,{align:"center",justify:"between",gap:3,children:[a.jsxs(o,{gap:1,children:[a.jsxs(m,{align:"center",gap:2,children:[a.jsx(B,{size:16,"aria-hidden":!0}),a.jsx("strong",{children:(e==null?void 0:e.status)??"unknown"}),(e==null?void 0:e.version)&&a.jsxs(z,{tone:"neutral",children:["v",e.version]}),(e==null?void 0:e.port)&&a.jsxs(z,{tone:"info",children:["port ",e.port]})]}),(e==null?void 0:e.message)&&a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.message})]}),a.jsxs(m,{gap:1,wrap:!0,children:[!y&&a.jsxs(l,{variant:"primary",onClick:()=>void b(),disabled:r==="install","data-testid":"headroom-install",children:[a.jsx(H,{size:12,"aria-hidden":!0})," ",r==="install"?"Installing…":"Install"]}),y&&a.jsxs(a.Fragment,{children:[a.jsxs(l,{variant:p?"secondary":"primary",onClick:()=>void(p?F():R()),disabled:r==="start"||r==="stop","data-testid":"headroom-toggle-running",children:[p?a.jsx(L,{size:12,"aria-hidden":!0}):a.jsx(M,{size:12,"aria-hidden":!0}),p?r==="stop"?"Stopping…":"Stop":r==="start"?"Starting…":"Start"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void I(),disabled:r==="wrap","data-testid":"headroom-wrap",children:[a.jsx(U,{size:12,"aria-hidden":!0})," ",r==="wrap"?"Wrapping…":"Wrap Cline"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void P(),disabled:r==="unwrap","data-testid":"headroom-unwrap",children:[a.jsx(V,{size:12,"aria-hidden":!0})," ",r==="unwrap"?"Unwrapping…":"Unwrap"]})]})]})]})})}),a.jsxs(E,{cols:3,children:[a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Requests (24h)"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((v=h.data)==null?void 0:v.requests)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Tokens saved"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((j=h.data)==null?void 0:j.tokensSaved)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Cache hits / misses"}),a.jsxs("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:[((w=h.data)==null?void 0:w.cacheHits)??0," / ",((S=h.data)==null?void 0:S.cacheMisses)??0]})]})})})]})]})}export{X as HeadroomView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HeadroomView-CNc-TI7u.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/square.js","../../../node_modules/lucide-react/dist/esm/icons/unplug.js","../../src/web/v8/views/Headroom/HeadroomView.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 Square = createLucideIcon(\"Square\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n]);\n\nexport { Square as default };\n//# sourceMappingURL=square.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 Unplug = createLucideIcon(\"Unplug\", [\n [\"path\", { d: \"m19 5 3-3\", key: \"yk6iyv\" }],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\n \"path\",\n { d: \"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z\", key: \"1snsnr\" }\n ]\n]);\n\nexport { Unplug as default };\n//# sourceMappingURL=unplug.js.map\n","import { useEffect, useState } from 'react';\nimport { Network, Play, Square, Plug, Unplug, RotateCw, RefreshCw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * HeadroomView — Sprint S35. Headroom proxy install + lifecycle.\n */\n\ntype Status = 'installed' | 'not-installed' | 'running' | 'stopped';\n\ninterface HeadroomStatus {\n status: Status;\n version?: string;\n port?: number;\n message?: string;\n}\n\ninterface HeadroomStats {\n hours?: number;\n requests?: number;\n tokensSaved?: number;\n cacheHits?: number;\n cacheMisses?: number;\n}\n\nexport function HeadroomView(): JSX.Element {\n const status = useFetch<HeadroomStatus>('/api/headroom/status');\n const stats = useFetch<HeadroomStats>('/api/headroom/stats?hours=24');\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const id = setInterval(() => { void status.refetch(); }, 15_000);\n return () => clearInterval(id);\n }, [status]);\n\n const install = async (): Promise<void> => {\n setBusy('install');\n setError(null);\n try {\n await fetchJson('/api/headroom/install', { method: 'POST', body: { force: false } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const wrap = async (): Promise<void> => {\n setBusy('wrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/wrap', { method: 'POST', body: { port: 8787 } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const unwrap = async (): Promise<void> => {\n setBusy('unwrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/unwrap', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const start = async (): Promise<void> => {\n setBusy('start');\n setError(null);\n try {\n await fetchJson('/api/headroom/start', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const stop = async (): Promise<void> => {\n setBusy('stop');\n setError(null);\n try {\n await fetchJson('/api/headroom/stop', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const s = status.data;\n const isInstalled = s && s.status !== 'not-installed';\n const isRunning = s?.status === 'running';\n\n return (\n <Stack gap={5} data-testid=\"headroom-view\">\n <ViewHeader\n title=\"Headroom\"\n description=\"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => { void status.refetch(); }} data-testid=\"headroom-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"elevated\">\n <CardBody>\n {status.loading && !s ? (\n <Skeleton style={{ height: 60 }} />\n ) : (\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden />\n <strong>{s?.status ?? 'unknown'}</strong>\n {s?.version && <Badge tone=\"neutral\">v{s.version}</Badge>}\n {s?.port && <Badge tone=\"info\">port {s.port}</Badge>}\n </Inline>\n {s?.message && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.message}</span>}\n </Stack>\n <Inline gap={1} wrap={true}>\n {!isInstalled && (\n <Button variant=\"primary\" onClick={() => void install()} disabled={busy === 'install'} data-testid=\"headroom-install\">\n <Plug size={12} aria-hidden /> {busy === 'install' ? 'Installing…' : 'Install'}\n </Button>\n )}\n {isInstalled && (\n <>\n <Button variant={isRunning ? 'secondary' : 'primary'} onClick={() => void (isRunning ? stop() : start())} disabled={busy === 'start' || busy === 'stop'} data-testid=\"headroom-toggle-running\">\n {isRunning ? <Square size={12} aria-hidden /> : <Play size={12} aria-hidden />}\n {isRunning ? (busy === 'stop' ? 'Stopping…' : 'Stop') : (busy === 'start' ? 'Starting…' : 'Start')}\n </Button>\n <Button variant=\"ghost\" onClick={() => void wrap()} disabled={busy === 'wrap'} data-testid=\"headroom-wrap\">\n <RotateCw size={12} aria-hidden /> {busy === 'wrap' ? 'Wrapping…' : 'Wrap Cline'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void unwrap()} disabled={busy === 'unwrap'} data-testid=\"headroom-unwrap\">\n <Unplug size={12} aria-hidden /> {busy === 'unwrap' ? 'Unwrapping…' : 'Unwrap'}\n </Button>\n </>\n )}\n </Inline>\n </Inline>\n )}\n </CardBody>\n </Card>\n\n <Grid cols={3}>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Requests (24h)</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.requests ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Tokens saved</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.tokensSaved ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Cache hits / misses</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>\n {stats.data?.cacheHits ?? 0} / {stats.data?.cacheMisses ?? 0}\n </strong>\n </Stack>\n </CardBody>\n </Card>\n </Grid>\n </Stack>\n );\n}"],"names":["Square","createLucideIcon","Unplug","HeadroomView","status","useFetch","stats","busy","setBusy","useState","error","setError","useEffect","id","install","fetchJson","err","FetchError","wrap","unwrap","start","stop","s","isInstalled","isRunning","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Card","CardBody","Skeleton","Network","Badge","Plug","Fragment","Play","RotateCw","Grid","_a","_b","_c","_d"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{S as p,u as j,I as c,f as y,h as g,N as S,d as f,E as b,b as z,a1 as k,i as C,F as T}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as x,b as v}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{R as P}from"./refresh-ccw-CHMprsm5.js";import{P as E}from"./power-DP5x_SRF.js";import{P as F}from"./power-off-NOJRLAIs.js";import{F as R}from"./file-text-B-g8H227.js";function Q(){return e.jsxs(p,{gap:4,"data-testid":"misc-view",children:[e.jsx(w,{title:"Misc",description:"Global search + Tailscale."}),e.jsx(B,{}),e.jsx(N,{})]})}function B(){var i,l,n;const[a,t]=d.useState(""),r=j(`/api/search?q=${encodeURIComponent(a)}`);return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Search"}),e.jsxs(c,{gap:2,align:"center",style:{marginTop:"var(--space-2)"},children:[e.jsx(y,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:a,onChange:s=>t(s.target.value),placeholder:"Search projects / tasks / artifacts / agents…","data-testid":"misc-search-input"})]}),a.trim()===""?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Type a query to search."}):r.loading&&!r.data?e.jsxs(p,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:24}}),e.jsx(g,{style:{height:24}})]}):(((l=(i=r.data)==null?void 0:i.results)==null?void 0:l.length)??0)===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No results."}):e.jsx(p,{gap:1,style:{marginTop:"var(--space-2)"},children:(((n=r.data)==null?void 0:n.results)??[]).slice(0,30).map((s,o)=>e.jsxs("div",{"data-testid":`misc-search-result-${o}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(q,{kind:s.kind}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:s.title||s.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:s.kind}),s.projectId&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s.projectId]})]}),s.snippet&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.snippet})]},o))})]})})}function q({kind:a}){const t=a==="task"?b:a==="agent"?z:a==="project"?k:R;return e.jsx(t,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}})}function N(){var o,u;const a=j("/api/tailscale/status"),[t,r]=d.useState(!1),[i,l]=d.useState(null),n=d.useCallback(()=>{a.refetch()},[a]),s=async m=>{r(!0),l(null);try{await C(m?"/api/tailscale/enable":"/api/tailscale/disable",{method:"POST"}),n()}catch(h){l((h instanceof T,h.message))}finally{r(!1)}};return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsxs(c,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(S,{size:16,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Tailscale"}),a.data&&e.jsx("span",{"data-testid":"misc-tailscale-state",style:{fontSize:"var(--fs-12)",color:a.data.running?"var(--success)":"var(--fg-muted)"},children:a.data.running?`running · ${a.data.hostname??"?"}`:"stopped"})]}),e.jsxs(c,{gap:1,children:[i!==null&&e.jsx("span",{role:"alert","data-testid":"misc-tailscale-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{variant:"ghost",onClick:()=>void n(),"data-testid":"misc-tailscale-refresh",children:[e.jsx(P,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!0),disabled:t,"data-testid":"misc-tailscale-enable",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Enable"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!1),disabled:t,"data-testid":"misc-tailscale-disable",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Disable"]})]})]}),((o=a.data)==null?void 0:o.url)&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx("a",{href:a.data.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-12)",color:"var(--accent)"},children:a.data.url})}),((u=a.data)==null?void 0:u.error)&&e.jsx("span",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:a.data.error})]})})}export{Q as MiscView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{u as f,S as l,I as r,d as o,a0 as y,f as F,h as g,i as C,F as S}from"./main-CdOm1Pj9.js";import{V as D}from"./ViewHeader-BqIPVKuG.js";import{C as w,b as z}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{E as N}from"./EmptyState-DZ2ouKwd.js";import{R as V}from"./refresh-ccw-CHMprsm5.js";import{R as B}from"./rotate-ccw-DJRekBbi.js";import{F as L}from"./file-text-B-g8H227.js";import{T as O}from"./trash-2-CL4khSRv.js";function X(){const t=f("/api/obsidian"),s=f("/api/obsidian/notes"),[k,c]=i.useState(null),[E,v]=i.useState(null),[h,R]=i.useState(""),[j,m]=i.useState(!1),[b,d]=i.useState(null),p=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.notes)??[]},[s.data]),u=i.useCallback(()=>{t.refetch(),s.refetch()},[t,s]),T=async a=>{d(null);try{await C(`/api/obsidian/notes/${a}`,{method:"DELETE"}),c(null),v(null),u()}catch(n){d((n instanceof S,n.message))}},$=async()=>{m(!0),d(null);try{await C("/api/obsidian/index",{method:"POST"}),u()}catch(a){d((a instanceof S,a.message))}finally{m(!1)}};return e.jsxs(l,{gap:4,"data-testid":"obsidian-view",children:[e.jsx(D,{title:"Obsidian",description:"Vault explorer + index. Notes stored as markdown.",actions:e.jsxs(r,{align:"center",gap:2,children:[b!==null&&e.jsx("span",{role:"alert","data-testid":"obsidian-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:b}),e.jsxs(o,{variant:"ghost",onClick:()=>void u(),"data-testid":"obsidian-refresh",children:[e.jsx(V,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(o,{variant:"primary",onClick:()=>void $(),disabled:j,"data-testid":"obsidian-reindex",children:[e.jsx(B,{size:14,"aria-hidden":!0})," ",j?"Indexing…":"Rebuild index"]})]})}),t.data&&e.jsx(w,{variant:"default",children:e.jsx(z,{children:e.jsxs(r,{align:"center",gap:3,children:[e.jsx(y,{size:18,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsxs(l,{gap:0,children:[e.jsx("strong",{children:t.data.exists?`${t.data.noteCount??0} notes`:"No vault"}),t.data.exists&&t.data.vaultDir&&e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.data.vaultDir})]}),t.data.exists&&e.jsxs(r,{align:"center",gap:3,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsxs("span",{children:[(t.data.totalSize??0).toLocaleString()," bytes"]}),t.data.folderCount!==void 0&&e.jsxs("span",{children:["· ",t.data.folderCount," folders"]})]})]})})}),e.jsx(w,{variant:"default",children:e.jsxs(z,{children:[e.jsxs(r,{gap:2,align:"center",children:[e.jsx(F,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:h,onChange:a=>R(a.target.value),placeholder:"Filter notes by path…","data-testid":"obsidian-search"})]}),s.loading&&p.length===0?e.jsxs(l,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:28}}),e.jsx(g,{style:{height:28}})]}):p.length===0?e.jsx(N,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No notes",description:"Vault is empty or not initialized."}):e.jsx(l,{gap:1,style:{marginTop:"var(--space-2)"},children:p.filter(a=>!h||a.path.toLowerCase().includes(h.toLowerCase())).slice(0,200).map(a=>{const n=k===a.path;return e.jsxs("div",{"data-testid":`obsidian-row-${a.path}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsxs(r,{align:"center",gap:2,children:[e.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("button",{type:"button",onClick:()=>v(x=>x===a.path?null:a.path),"data-testid":`obsidian-view-${a.path}`,style:{background:"transparent",border:"none",color:"var(--fg)",cursor:"pointer",padding:0,fontFamily:"inherit",fontSize:"inherit"},children:e.jsx("code",{children:a.path})}),a.size!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[a.size," B"]})]}),e.jsx(o,{variant:"ghost",onClick:()=>c(x=>x===a.path?null:a.path),"data-testid":`obsidian-delete-${a.path}`,"aria-label":`Delete ${a.path}`,children:e.jsx(O,{size:14,"aria-hidden":!0})})]}),n&&e.jsxs(r,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(o,{variant:"danger",onClick:()=>void T(a.path),"data-testid":`obsidian-confirm-delete-${a.path}`,children:"Confirm delete"}),e.jsx(o,{variant:"ghost",onClick:()=>c(null),children:"Cancel"})]}),E===a.path&&e.jsx(P,{path:a.path})]},a.path)})})]})})]})}function P({path:t}){const s=f(`/api/obsidian/notes/${t}`);return e.jsx("div",{"data-testid":`obsidian-note-view-${t}`,style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:s.loading&&s.data===null?e.jsx(g,{style:{height:60}}):s.data?e.jsx("pre",{style:{margin:0,fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",color:"var(--fg)"},children:s.data.raw??s.data.body??""}):e.jsx("span",{style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:"Failed to load"})})}export{X as ObsidianView};
|