@polderlabs/bizar 10.0.7 → 10.2.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 +0 -2
- package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js → ActivityFeed-JjmOY2AQ.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js.map → ActivityFeed-JjmOY2AQ.js.map} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js → ActivityView-BIIMvGWo.js} +1 -1
- package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js.map → ActivityView-BIIMvGWo.js.map} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js → AdminView-DRidJtkq.js} +1 -1
- package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js.map → AdminView-DRidJtkq.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js → AgentActivity-79l4SBMC.js} +1 -1
- package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js.map → AgentActivity-79l4SBMC.js.map} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js → AgentsView-0vT4uPSc.js} +1 -1
- package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js.map → AgentsView-0vT4uPSc.js.map} +1 -1
- package/bizar-dash/dist/assets/{Alert-DN0UysMg.js → Alert-CG5q_s75.js} +1 -1
- package/bizar-dash/dist/assets/{Alert-DN0UysMg.js.map → Alert-CG5q_s75.js.map} +1 -1
- package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js +21 -0
- package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js.map +1 -0
- package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js → AuthView-BveN94MC.js} +1 -1
- package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js.map → AuthView-BveN94MC.js.map} +1 -1
- package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js → Avatar-ulUPIYTd.js} +1 -1
- package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js.map → Avatar-ulUPIYTd.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js → BackgroundJobsView-BWErhqFo.js} +1 -1
- package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js.map → BackgroundJobsView-BWErhqFo.js.map} +1 -1
- package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js → BackupView-CnBjzG9N.js} +1 -1
- package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js.map → BackupView-CnBjzG9N.js.map} +1 -1
- package/bizar-dash/dist/assets/{Card-Tyboihu7.js → Card-B0imhxMk.js} +1 -1
- package/bizar-dash/dist/assets/{Card-Tyboihu7.js.map → Card-B0imhxMk.js.map} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js → ChatView-D6zGytzx.js} +1 -1
- package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js.map → ChatView-D6zGytzx.js.map} +1 -1
- package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js → Chip-wwZSGwLE.js} +1 -1
- package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js.map → Chip-wwZSGwLE.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js → ClaudeSessionsView-DK1sOLhi.js} +1 -1
- package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js.map → ClaudeSessionsView-DK1sOLhi.js.map} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js → ClipboardView-CZ2lYPr0.js} +1 -1
- package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js.map → ClipboardView-CZ2lYPr0.js.map} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js → ConfigView-D-zT9eNA.js} +1 -1
- package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js.map → ConfigView-D-zT9eNA.js.map} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js → DiagnosticsView-BocV68Lb.js} +1 -1
- package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js.map → DiagnosticsView-BocV68Lb.js.map} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js → DialogsView-BVjPI5x7.js} +1 -1
- package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js.map → DialogsView-BVjPI5x7.js.map} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js → DoctorView-84gJcZwM.js} +1 -1
- package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js.map → DoctorView-84gJcZwM.js.map} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js → EmptyState-BjgVOrcO.js} +1 -1
- package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js.map → EmptyState-BjgVOrcO.js.map} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js → EnvVarsView-BJ2TEzF7.js} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js.map → EnvVarsView-BJ2TEzF7.js.map} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js → ErrorState-BE3WBFqF.js} +1 -1
- package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js.map → ErrorState-BE3WBFqF.js.map} +1 -1
- package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js → EvalView-BJJ2P-kK.js} +1 -1
- package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js.map → EvalView-BJJ2P-kK.js.map} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js → GoalsView-pwROHApi.js} +1 -1
- package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js.map → GoalsView-pwROHApi.js.map} +1 -1
- package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js → Grid-qcvbhx6e.js} +1 -1
- package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js.map → Grid-qcvbhx6e.js.map} +1 -1
- package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js → HeadroomView-D1UiTYbt.js} +1 -1
- package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js.map → HeadroomView-D1UiTYbt.js.map} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js → HistoryView-C7SSOLJA.js} +1 -1
- package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js.map → HistoryView-C7SSOLJA.js.map} +1 -1
- package/bizar-dash/dist/assets/{Input-BbFUDQnS.js → Input-Bgzxf_Hu.js} +1 -1
- package/bizar-dash/dist/assets/{Input-BbFUDQnS.js.map → Input-Bgzxf_Hu.js.map} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js → LibrariesView-CbFFksox.js} +1 -1
- package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-CbFFksox.js.map} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js → LightRAGView-BqDrJbRq.js} +1 -1
- package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-BqDrJbRq.js.map} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js → ListHeader-TjPJrUfY.js} +1 -1
- package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js.map → ListHeader-TjPJrUfY.js.map} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js → MemoryView-BlTeHLhX.js} +1 -1
- package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js.map → MemoryView-BlTeHLhX.js.map} +1 -1
- package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js → MiscView-B8QY82Pm.js} +1 -1
- package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js.map → MiscView-B8QY82Pm.js.map} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js → ModsView-CvW1OWts.js} +1 -1
- package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js.map → ModsView-CvW1OWts.js.map} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js → NotificationsView-CsBt5U7x.js} +1 -1
- package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js.map → NotificationsView-CsBt5U7x.js.map} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js → ObsidianView-BCTejEj2.js} +1 -1
- package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js.map → ObsidianView-BCTejEj2.js.map} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js → OverviewView-BsuPxwnB.js} +1 -1
- package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js.map → OverviewView-BsuPxwnB.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js → ProgressBar-DlZTETEn.js} +1 -1
- package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js.map → ProgressBar-DlZTETEn.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js → ProjectsView-Soxtmpet.js} +1 -1
- package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js.map → ProjectsView-Soxtmpet.js.map} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js → ProvidersView-DaCEV9pM.js} +1 -1
- package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js.map → ProvidersView-DaCEV9pM.js.map} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js → SchedulesView-DY2ByBj_.js} +1 -1
- package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js.map → SchedulesView-DY2ByBj_.js.map} +1 -1
- package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js → Select-Dbd88_n8.js} +1 -1
- package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js.map → Select-Dbd88_n8.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js → SettingsRow-CLMNd434.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js.map → SettingsRow-CLMNd434.js.map} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js → SettingsView-b24oFq9x.js} +1 -1
- package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js.map → SettingsView-b24oFq9x.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js → Sheet-DnDid58j.js} +1 -1
- package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js.map → Sheet-DnDid58j.js.map} +1 -1
- package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js → Slider-BJCvKI1I.js} +1 -1
- package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js.map → Slider-BJCvKI1I.js.map} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js → Sparkline-ktqQLdyb.js} +1 -1
- package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js.map → Sparkline-ktqQLdyb.js.map} +1 -1
- package/bizar-dash/dist/assets/{Switch-BItGrPqr.js → Switch-CwXfsDii.js} +1 -1
- package/bizar-dash/dist/assets/{Switch-BItGrPqr.js.map → Switch-CwXfsDii.js.map} +1 -1
- package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js → TasksView-BHmpzFCf.js} +1 -1
- package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js.map → TasksView-BHmpzFCf.js.map} +1 -1
- package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js → Textarea-BzIAwSlp.js} +1 -1
- package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js.map → Textarea-BzIAwSlp.js.map} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js → UpdateView-CSmX9NN0.js} +1 -1
- package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js.map → UpdateView-CSmX9NN0.js.map} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js → UsageView-COyr_Gfi.js} +1 -1
- package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js.map → UsageView-COyr_Gfi.js.map} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js → ViewHeader-BzYZ3m-e.js} +1 -1
- package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js.map → ViewHeader-BzYZ3m-e.js.map} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js → VoiceView-D33_xG5t.js} +1 -1
- package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js.map → VoiceView-D33_xG5t.js.map} +1 -1
- package/bizar-dash/dist/assets/{brain-fsBSDl2g.js → brain-CM-Vls8r.js} +1 -1
- package/bizar-dash/dist/assets/{brain-fsBSDl2g.js.map → brain-CM-Vls8r.js.map} +1 -1
- package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js → calendar-C0lgZk69.js} +1 -1
- package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js.map → calendar-C0lgZk69.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js → circle-Bx_hQEBC.js} +1 -1
- package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js.map → circle-Bx_hQEBC.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js → circle-alert-DHvsqpw5.js} +1 -1
- package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js.map → circle-alert-DHvsqpw5.js.map} +1 -1
- package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js → circle-check-Bx8wmXR9.js} +1 -1
- package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js.map → circle-check-Bx8wmXR9.js.map} +1 -1
- package/bizar-dash/dist/assets/{clock-OuficfgH.js → clock-CejGoecX.js} +1 -1
- package/bizar-dash/dist/assets/{clock-OuficfgH.js.map → clock-CejGoecX.js.map} +1 -1
- package/bizar-dash/dist/assets/{download-BdHlstUY.js → download-4cEUWue1.js} +1 -1
- package/bizar-dash/dist/assets/{download-BdHlstUY.js.map → download-4cEUWue1.js.map} +1 -1
- package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js → external-link-0NqUhI4i.js} +1 -1
- package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js.map → external-link-0NqUhI4i.js.map} +1 -1
- package/bizar-dash/dist/assets/{file-text-B-g8H227.js → file-text-yEMkrSoZ.js} +1 -1
- package/bizar-dash/dist/assets/{file-text-B-g8H227.js.map → file-text-yEMkrSoZ.js.map} +1 -1
- package/bizar-dash/dist/assets/{filter-D9B8s5CG.js → filter-BXt60zAS.js} +1 -1
- package/bizar-dash/dist/assets/{filter-D9B8s5CG.js.map → filter-BXt60zAS.js.map} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js → git-pull-request-BjG5lNtR.js} +1 -1
- package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js.map → git-pull-request-BjG5lNtR.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-CdOm1Pj9.js → main-CokHAXWM.js} +2 -2
- package/bizar-dash/dist/assets/{main-CdOm1Pj9.js.map → main-CokHAXWM.js.map} +1 -1
- package/bizar-dash/dist/assets/{pause-C9hgd8wX.js → pause-CAmulU0F.js} +1 -1
- package/bizar-dash/dist/assets/{pause-C9hgd8wX.js.map → pause-CAmulU0F.js.map} +1 -1
- package/bizar-dash/dist/assets/{pencil-BanqaMw7.js → pencil-eq5IqBmU.js} +1 -1
- package/bizar-dash/dist/assets/{pencil-BanqaMw7.js.map → pencil-eq5IqBmU.js.map} +1 -1
- package/bizar-dash/dist/assets/{play-CawUZ02_.js → play-BoLrrcBA.js} +1 -1
- package/bizar-dash/dist/assets/{play-CawUZ02_.js.map → play-BoLrrcBA.js.map} +1 -1
- package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js → plug-DBrVM9lK.js} +1 -1
- package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js.map → plug-DBrVM9lK.js.map} +1 -1
- package/bizar-dash/dist/assets/{plus-M6LYiKX8.js → plus-DENm0hqV.js} +1 -1
- package/bizar-dash/dist/assets/{plus-M6LYiKX8.js.map → plus-DENm0hqV.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-DP5x_SRF.js → power-DLjXF7zE.js} +1 -1
- package/bizar-dash/dist/assets/{power-DP5x_SRF.js.map → power-DLjXF7zE.js.map} +1 -1
- package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js → power-off-D47cOnG_.js} +1 -1
- package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js.map → power-off-D47cOnG_.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js → refresh-ccw-DNrXX9gB.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js.map → refresh-ccw-DNrXX9gB.js.map} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js → refresh-cw-CoAHDpeS.js} +1 -1
- package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js.map → refresh-cw-CoAHDpeS.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js → rotate-ccw-ObX5awaG.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js.map → rotate-ccw-ObX5awaG.js.map} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js → rotate-cw-xpPJw9LP.js} +1 -1
- package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js.map → rotate-cw-xpPJw9LP.js.map} +1 -1
- package/bizar-dash/dist/assets/{save-DQKCKyZK.js → save-D1iKiJJl.js} +1 -1
- package/bizar-dash/dist/assets/{save-DQKCKyZK.js.map → save-D1iKiJJl.js.map} +1 -1
- package/bizar-dash/dist/assets/{send-xgy3RAi7.js → send-BRcAhZUm.js} +1 -1
- package/bizar-dash/dist/assets/{send-xgy3RAi7.js.map → send-BRcAhZUm.js.map} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js → shield-alert-C6vEcK-g.js} +1 -1
- package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js.map → shield-alert-C6vEcK-g.js.map} +1 -1
- package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js → trash-2-DZDjEnNh.js} +1 -1
- package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js.map → trash-2-DZDjEnNh.js.map} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js → trending-up-DMj-AJVf.js} +1 -1
- package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js.map → trending-up-DMj-AJVf.js.map} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js → triangle-alert-_2xe_tl4.js} +1 -1
- package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js.map → triangle-alert-_2xe_tl4.js.map} +1 -1
- package/bizar-dash/dist/assets/{upload-Cww6MvFq.js → upload-DdDljAeV.js} +1 -1
- package/bizar-dash/dist/assets/{upload-Cww6MvFq.js.map → upload-DdDljAeV.js.map} +1 -1
- package/bizar-dash/dist/assets/{zap-DmhVUzRA.js → zap-mHsgh0FP.js} +1 -1
- package/bizar-dash/dist/assets/{zap-DmhVUzRA.js.map → zap-mHsgh0FP.js.map} +1 -1
- package/bizar-dash/dist/index.html +1 -1
- package/bizar-dash/src/server/api.mjs +13 -6
- 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/diagnostics-store.mjs +5 -35
- package/bizar-dash/src/server/mod-security.mjs +1 -2
- package/bizar-dash/src/server/providers-store.mjs +1 -1
- package/bizar-dash/src/server/routes/_shared.mjs +0 -17
- 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 +158 -0
- package/bizar-dash/src/server/routes/model-router.test.mjs +104 -0
- package/bizar-dash/src/server/routes/sessions.mjs +80 -0
- package/bizar-dash/src/server/server.mjs +1 -27
- package/bizar-dash/src/server/sprint.test.mjs +163 -0
- 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/tests/cli-bugfixes.test.mjs +1 -1
- package/bizar-dash/tests/cli-error-visibility.test.mjs +1 -1
- package/bizar-dash/tests/cli-refactor.test.mjs +0 -1
- package/bizar-dash/tests/diagnostics-store.test.mjs +0 -1
- package/cli/bin.mjs +1 -15
- package/cli/cli-commands-validation.test.mjs +1 -1
- package/cli/commands/lightrag.mjs +1 -1
- package/cli/commands/util.mjs +1 -1
- package/cli/copy.mjs +1 -47
- package/cli/doctor.mjs +3 -3
- package/cli/install.mjs +3 -37
- package/cli/service-controller.mjs +0 -192
- package/cli/service-env.mjs +2 -9
- package/cli/utils.mjs +0 -7
- 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/check-deps.mjs +0 -24
- 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/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
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/spec-dedup.test.mjs
|
|
3
|
+
*
|
|
4
|
+
* Pillar B — Tests for spec dedup logic.
|
|
5
|
+
* Parses sample issues, computes similarity, flags dupes.
|
|
6
|
+
*/
|
|
7
|
+
import { test } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Tokenize a title into a Set of lowercase words.
|
|
12
|
+
* @param {string} title
|
|
13
|
+
* @returns {Set<string>}
|
|
14
|
+
*/
|
|
15
|
+
function tokenize(title) {
|
|
16
|
+
return new Set(
|
|
17
|
+
title
|
|
18
|
+
.toLowerCase()
|
|
19
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
20
|
+
.split(/\s+/)
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Compute overlap coefficient between two titles.
|
|
27
|
+
* @param {string} a
|
|
28
|
+
* @param {string} b
|
|
29
|
+
* @returns {number} 0.0 - 1.0
|
|
30
|
+
*/
|
|
31
|
+
function similarity(a, b) {
|
|
32
|
+
const setA = tokenize(a);
|
|
33
|
+
const setB = tokenize(b);
|
|
34
|
+
if (setA.size === 0 || setB.size === 0) return 0;
|
|
35
|
+
let intersection = 0;
|
|
36
|
+
for (const word of setA) {
|
|
37
|
+
if (setB.has(word)) intersection++;
|
|
38
|
+
}
|
|
39
|
+
return intersection / Math.min(setA.size, setB.size);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Check if a new title is a potential duplicate of existing issues.
|
|
44
|
+
* @param {string} newTitle
|
|
45
|
+
* @param {Array<{number: number, title: string, body?: string}>} existingIssues
|
|
46
|
+
* @param {number} threshold — 0.0-1.0
|
|
47
|
+
* @returns {Array<{number: number, title: string, similarity: number}>}
|
|
48
|
+
*/
|
|
49
|
+
function findDuplicates(newTitle, existingIssues, threshold = 0.5) {
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const issue of existingIssues) {
|
|
52
|
+
const sim = similarity(newTitle, issue.title);
|
|
53
|
+
if (sim >= threshold) {
|
|
54
|
+
results.push({ number: issue.number, title: issue.title, similarity: sim });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return results.sort((a, b) => b.similarity - a.similarity);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
test('similarity returns 1.0 for identical titles', () => {
|
|
63
|
+
const s = similarity('Add feature X', 'Add feature X');
|
|
64
|
+
assert.equal(s, 1.0);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('similarity returns 0.0 for completely different titles', () => {
|
|
68
|
+
const s = similarity('Add feature X', 'Fix bug Y');
|
|
69
|
+
assert.equal(s, 0.0);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('similarity returns high score for partial overlap', () => {
|
|
73
|
+
const s = similarity('Add OAuth login', 'Add Google OAuth login');
|
|
74
|
+
// intersection: {add, oauth, login} = 3, min size = 3 → 3/3 = 1.0
|
|
75
|
+
assert.equal(s, 1.0);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('similarity handles punctuation and case', () => {
|
|
79
|
+
const s = similarity('Add feature: OAuth!', 'add oauth feature');
|
|
80
|
+
assert.equal(s, 1.0);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('findDuplicates returns empty array when nothing overlaps', () => {
|
|
84
|
+
const issues = [
|
|
85
|
+
{ number: 1, title: 'Fix memory leak' },
|
|
86
|
+
{ number: 2, title: 'Add dark mode' },
|
|
87
|
+
];
|
|
88
|
+
const dups = findDuplicates('Improve performance', issues);
|
|
89
|
+
assert.equal(dups.length, 0);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('findDuplicates returns matching issues above threshold', () => {
|
|
93
|
+
const issues = [
|
|
94
|
+
{ number: 1, title: 'Fix memory leak in agent startup' },
|
|
95
|
+
{ number: 2, title: 'Add dark mode support' },
|
|
96
|
+
{ number: 3, title: 'Memory leak in background agents' },
|
|
97
|
+
];
|
|
98
|
+
const dups = findDuplicates('Fix memory leak in agents', issues, 0.5);
|
|
99
|
+
assert.ok(dups.length >= 1, 'Should find at least one dup');
|
|
100
|
+
const titles = dups.map((d) => d.title);
|
|
101
|
+
assert.ok(titles.some((t) => t.includes('memory')), 'Should match memory issues');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('findDuplicates threshold 0.7 requires near-exact match', () => {
|
|
105
|
+
const issues = [{ number: 1, title: 'Add OAuth login support' }];
|
|
106
|
+
const dups = findDuplicates('Add OAuth login', issues, 0.7);
|
|
107
|
+
assert.equal(dups.length, 1, 'Exact same words should score 1.0');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('findDuplicates returns similarity scores sorted descending', () => {
|
|
111
|
+
const issues = [
|
|
112
|
+
{ number: 1, title: 'Memory profiler' },
|
|
113
|
+
{ number: 2, title: 'Memory leak detection' },
|
|
114
|
+
{ number: 3, title: 'Fix memory issue' },
|
|
115
|
+
];
|
|
116
|
+
const dups = findDuplicates('Memory profiling', issues, 0.3);
|
|
117
|
+
const scores = dups.map((d) => d.similarity);
|
|
118
|
+
assert.deepEqual(scores, [...scores].sort((a, b) => b - a), 'Should be sorted desc');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('empty existing issues list returns empty duplicates', () => {
|
|
122
|
+
const dups = findDuplicates('Add something', []);
|
|
123
|
+
assert.equal(dups.length, 0);
|
|
124
|
+
});
|
|
@@ -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]}
|