@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,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v8/views/Artifacts/ClaudeArtifactView.tsx — v10.1.0.
|
|
3
|
+
*
|
|
4
|
+
* Renders Claude-* kind artifacts (HTML / SVG / React) inside a
|
|
5
|
+
* sandboxed iframe. The server hands us a fully-compiled HTML envelope
|
|
6
|
+
* (returned from GET /api/artifacts/:slug/render) and we drop it into
|
|
7
|
+
* `srcdoc`. The iframe has `sandbox` set so even if a malicious escape
|
|
8
|
+
* slips past server-side filtering, the runtime is still constrained.
|
|
9
|
+
*
|
|
10
|
+
* Two render modes:
|
|
11
|
+
* 1. <iframe srcdoc> — for full-envelope artifacts (default).
|
|
12
|
+
* 2. Plain `<div>` for an `mdx` kind fallback (handled by caller).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useState } from 'react';
|
|
16
|
+
import { Card, CardBody } from '../../ui/data/Card.js';
|
|
17
|
+
import { Inline } from '../../ui/primitives/Inline.js';
|
|
18
|
+
import { Stack } from '../../ui/primitives/Stack.js';
|
|
19
|
+
import { AlertTriangle, ShieldCheck, ExternalLink } from 'lucide-react';
|
|
20
|
+
import { Button } from '../../ui/controls/Button.js';
|
|
21
|
+
|
|
22
|
+
export interface ClaudeRenderPayload {
|
|
23
|
+
slug: string;
|
|
24
|
+
kind: 'claude-html' | 'claude-svg' | 'claude-react' | 'mdx';
|
|
25
|
+
html?: string;
|
|
26
|
+
blocks?: unknown[];
|
|
27
|
+
frontmatter?: Record<string, unknown>;
|
|
28
|
+
warnings?: Array<{ message?: string; pattern?: string }>;
|
|
29
|
+
safeMode?: boolean;
|
|
30
|
+
compiledAt?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function ClaudeArtifactView({
|
|
34
|
+
payload,
|
|
35
|
+
slug,
|
|
36
|
+
}: {
|
|
37
|
+
payload: ClaudeRenderPayload;
|
|
38
|
+
slug: string;
|
|
39
|
+
}): JSX.Element {
|
|
40
|
+
const [showSource, setShowSource] = useState(false);
|
|
41
|
+
|
|
42
|
+
if (payload.kind === 'mdx') {
|
|
43
|
+
// Legacy fallback — the server returns no `html` for mdx; just show
|
|
44
|
+
// the compiled block count.
|
|
45
|
+
return (
|
|
46
|
+
<Card variant="default" data-testid={`claude-view-${slug}`}>
|
|
47
|
+
<CardBody>
|
|
48
|
+
<Inline align="center" gap={2}>
|
|
49
|
+
<ShieldCheck size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />
|
|
50
|
+
<span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>
|
|
51
|
+
Legacy MDX — {Array.isArray(payload.blocks) ? `${payload.blocks.length} blocks` : 'no blocks'}
|
|
52
|
+
</span>
|
|
53
|
+
</Inline>
|
|
54
|
+
</CardBody>
|
|
55
|
+
</Card>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!payload.html) {
|
|
60
|
+
return (
|
|
61
|
+
<Card variant="default" data-testid={`claude-view-${slug}`}>
|
|
62
|
+
<CardBody>
|
|
63
|
+
<span role="alert" style={{ color: 'var(--danger)' }}>
|
|
64
|
+
No HTML returned by the compiler.
|
|
65
|
+
</span>
|
|
66
|
+
</CardBody>
|
|
67
|
+
</Card>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<Stack gap={2} data-testid={`claude-view-${slug}`}>
|
|
73
|
+
{payload.safeMode && (
|
|
74
|
+
<Inline
|
|
75
|
+
align="center"
|
|
76
|
+
gap={2}
|
|
77
|
+
style={{
|
|
78
|
+
padding: 'var(--space-2)',
|
|
79
|
+
background: 'var(--callout-warning-bg, #fdf6e3)',
|
|
80
|
+
border: '1px solid var(--callout-warning-border, #e0c97d)',
|
|
81
|
+
borderRadius: 'var(--radius-sm)',
|
|
82
|
+
fontSize: 'var(--fs-12)',
|
|
83
|
+
}}
|
|
84
|
+
role="status"
|
|
85
|
+
data-testid={`claude-safe-${slug}`}
|
|
86
|
+
>
|
|
87
|
+
<AlertTriangle size={14} aria-hidden style={{ color: '#b58900' }} />
|
|
88
|
+
<span>
|
|
89
|
+
Safe mode — the compiler stripped potentially dangerous
|
|
90
|
+
patterns in this artifact.
|
|
91
|
+
</span>
|
|
92
|
+
</Inline>
|
|
93
|
+
)}
|
|
94
|
+
{payload.warnings && payload.warnings.length > 0 && (
|
|
95
|
+
<details
|
|
96
|
+
style={{
|
|
97
|
+
fontSize: 'var(--fs-12)',
|
|
98
|
+
color: 'var(--fg-muted)',
|
|
99
|
+
padding: 'var(--space-2)',
|
|
100
|
+
background: 'var(--surface-1)',
|
|
101
|
+
borderRadius: 'var(--radius-sm)',
|
|
102
|
+
}}
|
|
103
|
+
>
|
|
104
|
+
<summary>{payload.warnings.length} warning(s)</summary>
|
|
105
|
+
<ul style={{ marginTop: 'var(--space-1)' }}>
|
|
106
|
+
{payload.warnings.map((w, i) => (
|
|
107
|
+
<li key={i}>
|
|
108
|
+
<code style={{ fontFamily: 'var(--font-mono)' }}>
|
|
109
|
+
{w.pattern}
|
|
110
|
+
</code>{' '}
|
|
111
|
+
— {w.message}
|
|
112
|
+
</li>
|
|
113
|
+
))}
|
|
114
|
+
</ul>
|
|
115
|
+
</details>
|
|
116
|
+
)}
|
|
117
|
+
<Inline align="center" justify="between" gap={2}>
|
|
118
|
+
<span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>
|
|
119
|
+
{payload.kind} · compiled {payload.compiledAt ? new Date(payload.compiledAt).toLocaleTimeString() : 'now'}
|
|
120
|
+
</span>
|
|
121
|
+
<Inline gap={1}>
|
|
122
|
+
<Button variant="ghost" onClick={() => setShowSource((v) => !v)} data-testid={`claude-source-${slug}`}>
|
|
123
|
+
{showSource ? 'Hide source' : 'Show source'}
|
|
124
|
+
</Button>
|
|
125
|
+
<a
|
|
126
|
+
href={`/api/artifacts/${slug}/view`}
|
|
127
|
+
target="_blank"
|
|
128
|
+
rel="noopener noreferrer"
|
|
129
|
+
data-testid={`claude-blank-${slug}`}
|
|
130
|
+
style={{
|
|
131
|
+
display: 'inline-flex',
|
|
132
|
+
alignItems: 'center',
|
|
133
|
+
gap: 'var(--space-1)',
|
|
134
|
+
fontSize: 'var(--fs-12)',
|
|
135
|
+
padding: 'var(--space-1) var(--space-2)',
|
|
136
|
+
color: 'var(--fg)',
|
|
137
|
+
textDecoration: 'none',
|
|
138
|
+
border: '1px solid var(--border)',
|
|
139
|
+
borderRadius: 'var(--radius-sm)',
|
|
140
|
+
background: 'var(--surface-0)',
|
|
141
|
+
}}
|
|
142
|
+
>
|
|
143
|
+
<ExternalLink size={12} aria-hidden /> Open in new tab
|
|
144
|
+
</a>
|
|
145
|
+
</Inline>
|
|
146
|
+
</Inline>
|
|
147
|
+
<iframe
|
|
148
|
+
title={`claude-artifact-${slug}`}
|
|
149
|
+
data-testid={`claude-iframe-${slug}`}
|
|
150
|
+
sandbox="allow-scripts allow-same-origin"
|
|
151
|
+
srcDoc={payload.html}
|
|
152
|
+
style={{
|
|
153
|
+
width: '100%',
|
|
154
|
+
height: 480,
|
|
155
|
+
border: '1px solid var(--border)',
|
|
156
|
+
borderRadius: 'var(--radius-sm)',
|
|
157
|
+
background: 'white',
|
|
158
|
+
}}
|
|
159
|
+
/>
|
|
160
|
+
{showSource && (
|
|
161
|
+
<pre
|
|
162
|
+
data-testid={`claude-source-text-${slug}`}
|
|
163
|
+
style={{
|
|
164
|
+
padding: 'var(--space-2)',
|
|
165
|
+
background: 'var(--surface-1)',
|
|
166
|
+
borderRadius: 'var(--radius-sm)',
|
|
167
|
+
fontSize: 'var(--fs-11)',
|
|
168
|
+
maxHeight: 320,
|
|
169
|
+
overflow: 'auto',
|
|
170
|
+
fontFamily: 'var(--font-mono)',
|
|
171
|
+
whiteSpace: 'pre-wrap',
|
|
172
|
+
}}
|
|
173
|
+
>
|
|
174
|
+
{payload.html}
|
|
175
|
+
</pre>
|
|
176
|
+
)}
|
|
177
|
+
</Stack>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
@@ -86,7 +86,7 @@ describe('B7 — check-deps.mjs which() uses path.join()', () => {
|
|
|
86
86
|
const { checkDeps } = await import('../../scripts/check-deps.mjs');
|
|
87
87
|
const result = await checkDeps({ strict: false });
|
|
88
88
|
const names = [...result.present, ...result.missing].map(d => d.name);
|
|
89
|
-
const required = ['node', 'bun', 'cline', 'tmux', 'git', 'python3', 'pip', 'jq', 'gh', '
|
|
89
|
+
const required = ['node', 'bun', 'cline', 'tmux', 'git', 'python3', 'pip', 'jq', 'gh', 'semble', 'skills'];
|
|
90
90
|
for (const dep of required) {
|
|
91
91
|
assert.ok(names.includes(dep), `expected ${dep} to be checked`);
|
|
92
92
|
}
|
|
@@ -138,7 +138,7 @@ describe('command module null-check produces user-visible error', () => {
|
|
|
138
138
|
// Count `if (!mod)` checks that follow `importCommand`
|
|
139
139
|
const nullCheckCount = (binSrc.match(/if \(!mod\)/g) || []).length;
|
|
140
140
|
// We have 9 case groups that call importCommand: install/update, service, dash,
|
|
141
|
-
// minimax,
|
|
141
|
+
// minimax, mod, artifact, memory, usage, and util (utility commands)
|
|
142
142
|
assert.ok(
|
|
143
143
|
nullCheckCount >= 9,
|
|
144
144
|
`Expected at least 9 null checks after importCommand, found ${nullCheckCount}`,
|
|
@@ -151,7 +151,6 @@ describe('collectDiagnostics', () => {
|
|
|
151
151
|
assert.ok(snap.disk && typeof snap.disk.exists === 'boolean');
|
|
152
152
|
assert.ok(snap.services);
|
|
153
153
|
assert.ok(snap.services.dashboard);
|
|
154
|
-
assert.ok(snap.services.headroom);
|
|
155
154
|
assert.ok(snap.services.lightrag);
|
|
156
155
|
assert.ok(snap.services.cline);
|
|
157
156
|
assert.ok(snap.counts);
|
package/cli/bin.mjs
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Commands:
|
|
14
14
|
* install, audit, init, export, artifact, update, test-gate, service, dash,
|
|
15
|
-
* memory,
|
|
15
|
+
* memory, minimax, usage, mod, doctor, repair, dev-link, dev-unlink,
|
|
16
16
|
* heads-up, bg, agent-browser, agent-browser-up, providers, deploy, plugin,
|
|
17
17
|
* marketplace, plan, digest, backup, restore, clip, ocr, voice, workspace, eval
|
|
18
18
|
*/
|
|
@@ -133,7 +133,6 @@ function showHelp() {
|
|
|
133
133
|
service Manage the background service daemon
|
|
134
134
|
dash <subcommand> Manage the dashboard (start/stop/status/cleanup/tui)
|
|
135
135
|
memory <subcommand> Manage project memory (Bizar Memory Service)
|
|
136
|
-
headroom <subcommand> Manage Headroom context compression
|
|
137
136
|
lightrag <subcommand> Manage the LightRAG knowledge-graph server (status/start/autostart)
|
|
138
137
|
minimax <subcommand> Manage MiniMax Token Plan integration
|
|
139
138
|
tailscale <subcommand> Manage Tailscale integration (auth, serve, status)
|
|
@@ -347,19 +346,6 @@ async function main() {
|
|
|
347
346
|
break;
|
|
348
347
|
}
|
|
349
348
|
|
|
350
|
-
case 'headroom': {
|
|
351
|
-
const mod = await importCommand('headroom');
|
|
352
|
-
if (!mod) {
|
|
353
|
-
console.error(chalk.red(` ✗ Could not load headroom command module`));
|
|
354
|
-
process.exit(EXIT_ERROR);
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
dbg('loaded command module:', 'headroom');
|
|
358
|
-
await mod.run(cmd, cmdArgs, isHelpRequest);
|
|
359
|
-
dbg('command returned:', cmd);
|
|
360
|
-
break;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
349
|
case 'lightrag': {
|
|
364
350
|
// v5.x — LightRAG management CLI (issue #6).
|
|
365
351
|
// Subcommands: status, start, autostart.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* the current working directory's project. Used by
|
|
9
9
|
* `install.sh` and by operators who want to manually
|
|
10
10
|
* start LightRAG without opening the dashboard.
|
|
11
|
-
* start Alias for `autostart
|
|
11
|
+
* start Alias for `autostart`.
|
|
12
12
|
* status Print whether the LightRAG server is running.
|
|
13
13
|
*
|
|
14
14
|
* The dashboard server already auto-invokes `lightragStartupHook()` on
|
package/cli/commands/util.mjs
CHANGED
|
@@ -120,7 +120,7 @@ export function showDoctorHelp() {
|
|
|
120
120
|
• plugin path resolves
|
|
121
121
|
• @polderlabs/bizar-plugin is installed globally
|
|
122
122
|
• core agent files are installed (odin, quick, thor, tyr)
|
|
123
|
-
•
|
|
123
|
+
• semble / skills on PATH (lenient — at least one)
|
|
124
124
|
• dashboard reachable (skipped if no port file)
|
|
125
125
|
• provider.minimax block + MiniMax model flags are sane
|
|
126
126
|
|
package/cli/copy.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { join, dirname } from 'node:path';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import ora from 'ora';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import { repoPath, clineConfigDir, clineAgentsDir,
|
|
6
|
+
import { repoPath, clineConfigDir, clineAgentsDir, detectSemble, detectUv, detectSkillsCli } from './utils.mjs';
|
|
7
7
|
|
|
8
8
|
async function fileExists(path) {
|
|
9
9
|
try {
|
|
@@ -341,52 +341,6 @@ export async function installPluginBizar(projectRoot) {
|
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
343
|
|
|
344
|
-
export async function installHeadroom() {
|
|
345
|
-
const { execSync } = await import('node:child_process');
|
|
346
|
-
|
|
347
|
-
const already = await detectRtk();
|
|
348
|
-
if (already) {
|
|
349
|
-
const spinner = ora({ text: 'Configuring Headroom for cline...', color: 'magenta' }).start();
|
|
350
|
-
try {
|
|
351
|
-
execSync('headroom wrap cline', { stdio: 'pipe' });
|
|
352
|
-
spinner.succeed(chalk.green('Headroom configured for cline'));
|
|
353
|
-
} catch {
|
|
354
|
-
spinner.warn(chalk.yellow('Could not auto-configure Headroom — run `headroom wrap cline` manually'));
|
|
355
|
-
}
|
|
356
|
-
return true;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const spinner = ora({ text: 'Installing Headroom (context compressor)...', color: 'magenta' }).start();
|
|
360
|
-
|
|
361
|
-
if (process.platform === 'win32') {
|
|
362
|
-
spinner.fail(chalk.red('Automatic Headroom install not supported on Windows. Install manually: pip install "headroom-ai[all]"'));
|
|
363
|
-
return false;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
try {
|
|
367
|
-
execSync(
|
|
368
|
-
'pip install --user "headroom-ai[all]"',
|
|
369
|
-
{ stdio: 'pipe', timeout: 60000 },
|
|
370
|
-
);
|
|
371
|
-
spinner.text = 'Configuring Headroom for cline...';
|
|
372
|
-
execSync('headroom wrap cline', { stdio: 'pipe' });
|
|
373
|
-
spinner.succeed(chalk.green('Headroom installed and configured for cline'));
|
|
374
|
-
return true;
|
|
375
|
-
} catch {
|
|
376
|
-
// Fall back to npm
|
|
377
|
-
try {
|
|
378
|
-
execSync('npm install -g headroom-ai', { stdio: 'pipe', timeout: 60000 });
|
|
379
|
-
spinner.text = 'Configuring Headroom for cline...';
|
|
380
|
-
execSync('headroom wrap cline', { stdio: 'pipe' });
|
|
381
|
-
spinner.succeed(chalk.green('Headroom installed (npm) and configured for cline'));
|
|
382
|
-
return true;
|
|
383
|
-
} catch {
|
|
384
|
-
spinner.fail(chalk.red('Headroom install failed. Install manually: pip install "headroom-ai[all]" or npm install -g headroom-ai'));
|
|
385
|
-
return false;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
344
|
export async function installSemble() {
|
|
391
345
|
const { execSync } = await import('node:child_process');
|
|
392
346
|
|
package/cli/doctor.mjs
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* hooks-wired: settings.json has PreToolUse/PostToolUse/etc
|
|
16
16
|
* agent-files-installed: agent .md files deployed
|
|
17
17
|
* skill-files-installed: SKILL.md files deployed
|
|
18
|
-
* tools-on-path: at least one of
|
|
18
|
+
* tools-on-path: at least one of semble/skills/claude
|
|
19
19
|
* memory-vault: BIZAR_HOME exists (memory subdir lazy)
|
|
20
20
|
* 9router-reachable: provider gateway responds
|
|
21
21
|
*
|
|
@@ -109,13 +109,13 @@ async function checkSkillFilesInstalled() {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
|
-
* Lenient: passes if at least one of
|
|
112
|
+
* Lenient: passes if at least one of semble/skills/claude is on PATH.
|
|
113
113
|
* These are informational — none of them are strictly required for
|
|
114
114
|
* `bizar doctor` to do its job, and missing them shouldn't fail the
|
|
115
115
|
* overall health report.
|
|
116
116
|
*/
|
|
117
117
|
async function checkToolsAvailable() {
|
|
118
|
-
const tools = ['
|
|
118
|
+
const tools = ['semble', 'skills', 'claude'];
|
|
119
119
|
const found = tools.filter(which);
|
|
120
120
|
if (found.length === 0) {
|
|
121
121
|
throw new Error(`none of ${tools.join('/')} on PATH`);
|
package/cli/install.mjs
CHANGED
|
@@ -15,8 +15,8 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
15
15
|
|
|
16
16
|
import { showBanner, showPantheon, sectionHeading } from './banner.mjs';
|
|
17
17
|
import { promptComponents, promptInstallMode, promptAgents, promptSkillPacks, promptApiKeys, promptConfirmInstall, promptRestartCline } from './prompts.mjs';
|
|
18
|
-
import { detectClaude,
|
|
19
|
-
import { installAgents, installAgentsMd, installSkill, installClineJson, installBizarFolder, installPluginBizar,
|
|
18
|
+
import { detectClaude, detectSemble, detectSkillsCli, detectUv, buildSummary, claudeAgentsDir, claudeConfigDir, repoPath } from './utils.mjs';
|
|
19
|
+
import { installAgents, installAgentsMd, installSkill, installClineJson, installBizarFolder, installPluginBizar, installSemble, installSkillsCli, installCuratedSkills, installRules, installHooks, installCommands, installCommandsBizar, mergeToolsIntoUserConfig } from './copy.mjs';
|
|
20
20
|
|
|
21
21
|
const AGENT_FILES = [
|
|
22
22
|
'odin.md', 'vor.md', 'frigg.md', 'quick.md',
|
|
@@ -514,7 +514,7 @@ export async function runPostInstall() {
|
|
|
514
514
|
// is a thin Claude Code-native bootstrap that:
|
|
515
515
|
// - copies `config/settings.json` template on first install
|
|
516
516
|
// - installs agents into `~/.claude/agents/`
|
|
517
|
-
// - probes for
|
|
517
|
+
// - probes for semble / skills-cli
|
|
518
518
|
// - installs Headroom via pip or npm
|
|
519
519
|
const { mkdirSync, copyFileSync, existsSync } = await import('node:fs');
|
|
520
520
|
const { execSync } = await import('node:child_process');
|
|
@@ -546,40 +546,6 @@ export async function runPostInstall() {
|
|
|
546
546
|
}
|
|
547
547
|
console.log('BizarHarness: agents installed.');
|
|
548
548
|
|
|
549
|
-
// Install Headroom
|
|
550
|
-
const headroomPresent = await detectHeadroom();
|
|
551
|
-
if (!headroomPresent) {
|
|
552
|
-
console.log('BizarHarness: installing Headroom (context compressor)...');
|
|
553
|
-
try {
|
|
554
|
-
if (process.platform === 'win32') {
|
|
555
|
-
console.log('BizarHarness: Automatic Headroom install not supported on Windows. Install manually: pip install "headroom-ai[all]"');
|
|
556
|
-
} else {
|
|
557
|
-
execSync(
|
|
558
|
-
'pip install --user "headroom-ai[all]"',
|
|
559
|
-
{ stdio: 'pipe', timeout: 60000 },
|
|
560
|
-
);
|
|
561
|
-
execSync('headroom wrap claude', { stdio: 'pipe' });
|
|
562
|
-
console.log('BizarHarness: Headroom installed and configured.');
|
|
563
|
-
}
|
|
564
|
-
} catch {
|
|
565
|
-
// Fall back to npm
|
|
566
|
-
try {
|
|
567
|
-
execSync('npm install -g headroom-ai', { stdio: 'pipe', timeout: 60000 });
|
|
568
|
-
execSync('headroom wrap claude', { stdio: 'pipe' });
|
|
569
|
-
console.log('BizarHarness: Headroom installed (npm) and configured.');
|
|
570
|
-
} catch {
|
|
571
|
-
console.log('BizarHarness: Headroom install failed. Install manually: pip install "headroom-ai[all]" or npm install -g headroom-ai');
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
} else {
|
|
575
|
-
try {
|
|
576
|
-
execSync('headroom wrap claude', { stdio: 'pipe' });
|
|
577
|
-
console.log('BizarHarness: Headroom configured for claude.');
|
|
578
|
-
} catch {
|
|
579
|
-
console.log('BizarHarness: could not configure Headroom. Run `headroom wrap claude` manually.');
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
|
|
583
549
|
// Install Semble
|
|
584
550
|
const semblePresent = await detectSemble();
|
|
585
551
|
if (!semblePresent) {
|
|
@@ -102,9 +102,6 @@ function linuxUnitPath() {
|
|
|
102
102
|
function linuxEnvPath() {
|
|
103
103
|
return join(bizarConfigDir(), 'service.env');
|
|
104
104
|
}
|
|
105
|
-
function linuxHeadroomUnitPath() {
|
|
106
|
-
return join(userUnitDir(), 'bizar-headroom.service');
|
|
107
|
-
}
|
|
108
105
|
function darwinPlistPath() {
|
|
109
106
|
return join(launchAgentsDir(), 'com.bizar.dashboard.plist');
|
|
110
107
|
}
|
|
@@ -178,161 +175,6 @@ function linuxEnvFileContent({ projectRoot }) {
|
|
|
178
175
|
return buildServiceEnvFile({ bizarHome: bizarConfigDir(), repoPath: projectRoot });
|
|
179
176
|
}
|
|
180
177
|
|
|
181
|
-
// ── Headroom companion service (Linux) ─────────────────────────────────────────
|
|
182
|
-
|
|
183
|
-
function linuxHeadroomUnitContent() {
|
|
184
|
-
const envPath = join(bizarConfigDir(), 'service.env');
|
|
185
|
-
return [
|
|
186
|
-
'[Unit]',
|
|
187
|
-
'Description=Bizar Headroom context-compression proxy',
|
|
188
|
-
'After=bizar.service',
|
|
189
|
-
'Wants=bizar.service',
|
|
190
|
-
'',
|
|
191
|
-
'[Service]',
|
|
192
|
-
'Type=simple',
|
|
193
|
-
`EnvironmentFile=${envPath}`,
|
|
194
|
-
'ExecStart=/bin/sh -c "command -v headroom >/dev/null 2>&1 && headroom proxy cline || exit 0"',
|
|
195
|
-
'Restart=on-failure',
|
|
196
|
-
'RestartSec=10',
|
|
197
|
-
'TimeoutStopSec=15',
|
|
198
|
-
'',
|
|
199
|
-
'[Install]',
|
|
200
|
-
'WantedBy=default.target',
|
|
201
|
-
'',
|
|
202
|
-
].join('\n');
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function darwinHeadroomPlistPath() {
|
|
206
|
-
return join(launchAgentsDir(), 'com.bizar.headroom.plist');
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function darwinHeadroomPlistContent({ nodePath, projectRoot }) {
|
|
210
|
-
const envContent = buildServiceEnvFile({ bizarHome: bizarConfigDir(), repoPath: projectRoot });
|
|
211
|
-
const envVars = parseEnvFile(envContent);
|
|
212
|
-
const envXml = envVars
|
|
213
|
-
.map(([k, v]) => ` <key>${xmlEscape(k)}</key>\n <string>${xmlEscape(v)}</string>`)
|
|
214
|
-
.join('\n');
|
|
215
|
-
return [
|
|
216
|
-
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
217
|
-
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
218
|
-
'<plist version="1.0">',
|
|
219
|
-
'<dict>',
|
|
220
|
-
' <key>Label</key>',
|
|
221
|
-
' <string>com.bizar.headroom</string>',
|
|
222
|
-
' <key>ProgramArguments</key>',
|
|
223
|
-
' <array>',
|
|
224
|
-
` <string>${xmlEscape(nodePath)}</string>`,
|
|
225
|
-
' <string>-c</string>',
|
|
226
|
-
' <string>command -v headroom >/dev/null 2>&1 && headroom proxy cline || exit 0</string>',
|
|
227
|
-
' </array>',
|
|
228
|
-
' <key>EnvironmentVariables</key>',
|
|
229
|
-
' <dict>',
|
|
230
|
-
envXml,
|
|
231
|
-
' </dict>',
|
|
232
|
-
' <key>KeepAlive</key>',
|
|
233
|
-
' <true/>',
|
|
234
|
-
' <key>RunAtLoad</key>',
|
|
235
|
-
' <true/>',
|
|
236
|
-
' <key>StandardOutPath</key>',
|
|
237
|
-
` <string>${xmlEscape(join(bizarConfigDir(), 'headroom.log'))}</string>`,
|
|
238
|
-
' <key>StandardErrorPath</key>',
|
|
239
|
-
` <string>${xmlEscape(join(bizarConfigDir(), 'headroom.log'))}</string>`,
|
|
240
|
-
' <key>WorkingDirectory</key>',
|
|
241
|
-
` <string>${xmlEscape(projectRoot)}</string>`,
|
|
242
|
-
'</dict>',
|
|
243
|
-
'</plist>',
|
|
244
|
-
'',
|
|
245
|
-
].join('\n');
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function installHeadroomServiceLinux({ force = false }) {
|
|
249
|
-
// Honour BIZAR_HEADROOM_AUTOSTART from process.env (already merged by buildServiceEnvFile)
|
|
250
|
-
const headroomAutoStart = process.env.BIZAR_HEADROOM_AUTOSTART !== '0';
|
|
251
|
-
if (!headroomAutoStart) {
|
|
252
|
-
return ok({ note: 'headroom autostart disabled via BIZAR_HEADROOM_AUTOSTART=0' });
|
|
253
|
-
}
|
|
254
|
-
if (!existsSync(userUnitDir())) {
|
|
255
|
-
try { mkdirSync(userUnitDir(), { recursive: true }); } catch (err) {
|
|
256
|
-
return fail(`cannot create ${userUnitDir()}: ${err.message}`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
const unitPath = linuxHeadroomUnitPath();
|
|
260
|
-
const want = linuxHeadroomUnitContent();
|
|
261
|
-
if (!force && existsSync(unitPath)) {
|
|
262
|
-
const have = readFileSync(unitPath, 'utf8').trim() + '\n';
|
|
263
|
-
if (have === want.trim() + '\n') {
|
|
264
|
-
return ok({ alreadyInstalled: true, unitPath, note: 'headroom unit already matches' });
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
try {
|
|
268
|
-
writeFileSync(unitPath, want, { encoding: 'utf8', mode: 0o644 });
|
|
269
|
-
} catch (err) {
|
|
270
|
-
return fail(`write ${unitPath}: ${err.message}`);
|
|
271
|
-
}
|
|
272
|
-
runCmd('systemctl', ['--user', 'daemon-reload']);
|
|
273
|
-
const r = runCmd('systemctl', ['--user', 'enable', '--now', 'bizar-headroom.service']);
|
|
274
|
-
if (r.error || (r.status !== 0 && r.status !== null)) {
|
|
275
|
-
return fail(`headroom service enable failed: ${r.stderr || r.error?.message || `exit ${r.status}`}`, { unitPath });
|
|
276
|
-
}
|
|
277
|
-
return ok({ unitPath, note: 'headroom companion service installed and started' });
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
function uninstallHeadroomServiceLinux() {
|
|
281
|
-
const unitPath = linuxHeadroomUnitPath();
|
|
282
|
-
if (!existsSync(unitPath)) {
|
|
283
|
-
return ok({ unitPath: null, note: 'no headroom systemd unit installed' });
|
|
284
|
-
}
|
|
285
|
-
runCmd('systemctl', ['--user', 'disable', '--now', 'bizar-headroom.service']);
|
|
286
|
-
try { unlinkSync(unitPath); } catch { /* ignore */ }
|
|
287
|
-
runCmd('systemctl', ['--user', 'daemon-reload']);
|
|
288
|
-
return ok({ unitPath: null, note: 'headroom systemd unit removed' });
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
function installHeadroomServiceDarwin({ nodePath, projectRoot, force = false }) {
|
|
292
|
-
const headroomAutoStart = process.env.BIZAR_HEADROOM_AUTOSTART !== '0';
|
|
293
|
-
if (!headroomAutoStart) {
|
|
294
|
-
return ok({ note: 'headroom autostart disabled via BIZAR_HEADROOM_AUTOSTART=0' });
|
|
295
|
-
}
|
|
296
|
-
const dir = launchAgentsDir();
|
|
297
|
-
if (!existsSync(dir)) {
|
|
298
|
-
try { mkdirSync(dir, { recursive: true }); } catch (err) {
|
|
299
|
-
return fail(`cannot create ${dir}: ${err.message}`);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
const plistPath = darwinHeadroomPlistPath();
|
|
303
|
-
const want = darwinHeadroomPlistContent({ nodePath, projectRoot });
|
|
304
|
-
if (!force && existsSync(plistPath)) {
|
|
305
|
-
const have = readFileSync(plistPath, 'utf8').trim() + '\n';
|
|
306
|
-
if (have === want.trim() + '\n') {
|
|
307
|
-
const lst = runCmd('launchctl', ['list']);
|
|
308
|
-
if (lst.status === 0 && /com\.bizar\.headroom/.test(lst.stdout)) {
|
|
309
|
-
return ok({ alreadyInstalled: true, unitPath: plistPath, note: 'headroom plist matches and is loaded' });
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
try {
|
|
314
|
-
writeFileSync(plistPath, want, { encoding: 'utf8', mode: 0o644 });
|
|
315
|
-
try { chmodSync(plistPath, 0o644); } catch { /* best-effort */ }
|
|
316
|
-
} catch (err) {
|
|
317
|
-
return fail(`write ${plistPath}: ${err.message}`);
|
|
318
|
-
}
|
|
319
|
-
runCmd('launchctl', ['unload', plistPath]);
|
|
320
|
-
const load = runCmd('launchctl', ['load', '-w', plistPath]);
|
|
321
|
-
if (load.error || (load.status !== 0 && load.status !== null)) {
|
|
322
|
-
return fail(`launchctl load failed for headroom: ${load.stderr || load.error?.message || `exit ${load.status}`}`, { unitPath: plistPath });
|
|
323
|
-
}
|
|
324
|
-
return ok({ unitPath: plistPath, note: 'headroom companion plist installed and loaded' });
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
function uninstallHeadroomServiceDarwin() {
|
|
328
|
-
const plistPath = darwinHeadroomPlistPath();
|
|
329
|
-
if (!existsSync(plistPath)) {
|
|
330
|
-
return ok({ unitPath: null, note: 'no headroom launchd plist installed' });
|
|
331
|
-
}
|
|
332
|
-
runCmd('launchctl', ['unload', plistPath]);
|
|
333
|
-
try { unlinkSync(plistPath); } catch { /* ignore */ }
|
|
334
|
-
return ok({ unitPath: null, note: 'headroom launchd plist removed' });
|
|
335
|
-
}
|
|
336
178
|
|
|
337
179
|
function installServiceLinux({ nodePath, projectRoot, force = false }) {
|
|
338
180
|
if (!existsSync(userUnitDir())) {
|
|
@@ -393,13 +235,6 @@ function installServiceLinux({ nodePath, projectRoot, force = false }) {
|
|
|
393
235
|
return fail(`systemctl --user enable --now failed: ${r.stderr || r.error?.message || `exit ${r.status}`}`, { unitPath });
|
|
394
236
|
}
|
|
395
237
|
|
|
396
|
-
// Also install headroom companion service (non-fatal if it fails)
|
|
397
|
-
const hr = installHeadroomServiceLinux({ force });
|
|
398
|
-
if (!hr.ok) {
|
|
399
|
-
// Non-fatal: headroom is optional
|
|
400
|
-
console.log(` ${hr.error || 'headroom companion install failed'}`);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
238
|
return ok({
|
|
404
239
|
unitPath,
|
|
405
240
|
note: 'systemd user unit installed and started (or already running)',
|
|
@@ -562,12 +397,6 @@ function installServiceDarwin({ nodePath, projectRoot, force = false }) {
|
|
|
562
397
|
return fail(`launchctl load failed: ${load.stderr || load.error?.message || `exit ${load.status}`}`, { unitPath: plistPath });
|
|
563
398
|
}
|
|
564
399
|
|
|
565
|
-
// Also install headroom companion service (non-fatal if it fails)
|
|
566
|
-
const hr = installHeadroomServiceDarwin({ nodePath, projectRoot, force });
|
|
567
|
-
if (!hr.ok) {
|
|
568
|
-
console.log(` ${hr.error || 'headroom companion install failed'}`);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
400
|
return ok({ unitPath: plistPath, note: 'plist installed and loaded' });
|
|
572
401
|
}
|
|
573
402
|
|
|
@@ -755,30 +584,9 @@ export function uninstallService() {
|
|
|
755
584
|
else if (PLATFORM === 'darwin') result = uninstallServiceDarwin();
|
|
756
585
|
else if (PLATFORM === 'win32') result = uninstallServiceWindows();
|
|
757
586
|
else return fail(`unsupported platform: ${PLATFORM}`);
|
|
758
|
-
// Also uninstall headroom companion
|
|
759
|
-
if (PLATFORM === 'linux') uninstallHeadroomServiceLinux();
|
|
760
|
-
if (PLATFORM === 'darwin') uninstallHeadroomServiceDarwin();
|
|
761
587
|
return result;
|
|
762
588
|
}
|
|
763
589
|
|
|
764
|
-
/**
|
|
765
|
-
* Install the headroom companion service only (does NOT install the
|
|
766
|
-
* main dashboard service). Idempotent. Safe to re-run.
|
|
767
|
-
*/
|
|
768
|
-
export function installHeadroomService(opts = {}) {
|
|
769
|
-
const nodePath = resolveNodePath(opts.nodePath);
|
|
770
|
-
const projectRoot = resolveRepoRoot(opts.projectRoot);
|
|
771
|
-
if (PLATFORM === 'linux') return installHeadroomServiceLinux({ force: !!opts.force });
|
|
772
|
-
if (PLATFORM === 'darwin') return installHeadroomServiceDarwin({ nodePath, projectRoot, force: !!opts.force });
|
|
773
|
-
return ok({ note: `headroom companion not supported on ${PLATFORM}` });
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
export function uninstallHeadroomService() {
|
|
777
|
-
if (PLATFORM === 'linux') return uninstallHeadroomServiceLinux();
|
|
778
|
-
if (PLATFORM === 'darwin') return uninstallHeadroomServiceDarwin();
|
|
779
|
-
return ok({ note: `headroom companion not supported on ${PLATFORM}` });
|
|
780
|
-
}
|
|
781
|
-
|
|
782
590
|
/**
|
|
783
591
|
* v5.x — Restart the service (issue #7).
|
|
784
592
|
*
|