@polderlabs/bizar 10.1.0 → 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/skills/headroom/SKILL.md +94 -0
- package/bizar-dash/src/server/api.mjs +11 -0
- package/bizar-dash/src/server/artifacts-store.mjs +120 -14
- package/bizar-dash/src/server/claude-artifacts.mjs +281 -0
- package/bizar-dash/src/server/headroom.mjs +649 -0
- package/bizar-dash/src/server/routes/artifacts.mjs +42 -6
- package/bizar-dash/src/server/routes/audit.mjs +78 -0
- package/bizar-dash/src/server/routes/decisions.mjs +78 -0
- package/bizar-dash/src/server/routes/headroom.mjs +126 -0
- package/bizar-dash/src/server/routes/model-router.mjs +55 -0
- package/bizar-dash/src/server/routes/model-router.test.mjs +28 -0
- package/bizar-dash/src/server/routes/sessions.mjs +80 -0
- package/bizar-dash/src/server/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/headroom-install.test.mjs +173 -0
- package/bizar-dash/tests/headroom-settings.test.mjs +126 -0
- package/bizar-dash/tests/headroom-status.test.mjs +117 -0
- package/cli/commands/headroom.mjs +204 -0
- package/package.json +1 -1
- package/packages/sdk/dist/agent/cron.d.ts +44 -0
- package/packages/sdk/dist/agent/cron.js +79 -0
- package/packages/sdk/dist/agent/heartbeat.d.ts +43 -0
- package/packages/sdk/dist/agent/heartbeat.js +116 -0
- package/packages/sdk/dist/index.d.ts +3 -0
- package/packages/sdk/dist/index.js +5 -0
- package/packages/sdk/dist/learning/decisions.d.ts +46 -0
- package/packages/sdk/dist/learning/decisions.js +132 -0
- package/packages/sdk/dist/learning/index.d.ts +8 -0
- package/packages/sdk/dist/learning/index.js +8 -0
- package/packages/sdk/dist/learning/instincts.d.ts +38 -0
- package/packages/sdk/dist/learning/instincts.js +139 -0
- package/packages/sdk/dist/mcp/server.js +119 -1
- package/packages/sdk/dist/router/agent-model-registry.d.ts +89 -0
- package/packages/sdk/dist/router/agent-model-registry.js +144 -0
- package/packages/sdk/dist/router/index.d.ts +1 -0
- package/packages/sdk/dist/router/index.js +1 -0
- package/packages/sdk/package.json +3 -2
- package/scripts/audit.mjs +388 -0
- package/scripts/audit.test.mjs +149 -0
- package/scripts/eval-gate.mjs +134 -0
- package/scripts/eval-gate.test.mjs +138 -0
- package/scripts/feature-state-machine.mjs +178 -0
- package/scripts/feature-state-machine.test.mjs +135 -0
- package/scripts/spec-dedup.test.mjs +124 -0
- package/scripts/sprint.mjs +213 -0
- package/scripts/worktree-setup.sh +79 -0
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +0 -6
- package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +0 -1
package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-CbFFksox.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LibrariesView-DBQ83TNa.js","sources":["../../src/web/v8/ui/libraries/LibraryItem.tsx","../../src/web/v8/ui/libraries/LibraryGrid.tsx","../../src/web/v8/views/Libraries/LibrariesView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { ChevronRight, Power } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge, type BadgeTone } from '../data/Badge.js';\n\n/**\n * LibraryItem — generic inventory card used by the Skill/MCP/Hook libraries.\n *\n * PLAN.md: each \"library\" lists the same three facts about an installable\n * resource: identity (name + slug), status (enabled/disabled/error), and\n * provenance (description, version, last-used, owner). LibraryItem renders\n * those facts consistently so all three libraries feel like one product.\n */\n\nexport type LibraryStatus = 'enabled' | 'disabled' | 'error';\n\nexport interface LibraryItemProps {\n id: string;\n /** Display name (e.g. \"Frigg — Codebase Q&A\"). */\n name: string;\n /** Identifier (e.g. \"frigg\", \"semble\", \"PreToolUse:check-arch\"). */\n slug: string;\n status: LibraryStatus;\n description?: string;\n /** One-line metadata row (e.g. \"v1.2.0 · used 14× today · @anthropic\"). */\n meta?: string;\n /** Optional trailing action area (toggle, menu trigger, etc). */\n actions?: ReactNode;\n /** Click handler — opens detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<LibraryStatus, string> = {\n enabled: 'Enabled',\n disabled: 'Disabled',\n error: 'Error',\n};\n\nconst STATUS_TONE: Record<LibraryStatus, BadgeTone> = {\n enabled: 'success',\n disabled: 'neutral',\n error: 'danger',\n};\n\nexport function LibraryItem(props: LibraryItemProps) {\n const { name, slug, status, description, meta, actions, onOpen, className } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-library-item', `v8-library-item--${status}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n marginTop: 2,\n borderRadius: 'var(--radius-sm)',\n background:\n status === 'enabled'\n ? 'color-mix(in oklch, var(--success) 14%, transparent)'\n : status === 'error'\n ? 'color-mix(in oklch, var(--danger) 14%, transparent)'\n : 'var(--surface-2)',\n color:\n status === 'enabled' ? 'var(--success)' : status === 'error' ? 'var(--danger)' : 'var(--fg-muted)',\n flexShrink: 0,\n }}\n >\n <Power size={14} aria-hidden=\"true\" />\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <span\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 600,\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {name}\n </span>\n <code\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontFamily: 'var(--font-mono, ui-monospace, monospace)',\n }}\n >\n {slug}\n </code>\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginTop: 6,\n }}\n >\n {meta !== undefined ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{meta}</span>\n ) : (\n <span />\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <Badge tone={STATUS_TONE[status]} size=\"sm\">\n {STATUS_LABEL[status]}\n </Badge>\n {actions}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n </div>\n <style>{`\n .v8-library-item:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * LibraryGrid — responsive grid for LibraryItem lists.\n *\n * Renders 1 column on narrow viewports, 2 columns on md, 3 columns on lg.\n * Uses CSS grid + auto-fit; items auto-size to fill available space.\n */\n\nexport interface LibraryGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function LibraryGrid(props: LibraryGridProps) {\n const { children, className } = props;\n return (\n <div\n className={cx('v8-library-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(100%, 320px), 1fr))',\n gap: 'var(--space-3)',\n }}\n >\n {children}\n </div>\n );\n}","import { useEffect, useState, useCallback } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { LibraryGrid, LibraryItem, type LibraryItemProps, type LibraryStatus } from '../../ui/index.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { LibraryItem as LibItem } from '../../data/types.js';\n\n/**\n * LibrariesView — Sprint S10. Generic Skills / MCPs / Hooks surface.\n *\n * The parent (`Router.tsx`) picks the data source per kind. This\n * view pulls live data from `/api/skills`, `/api/mcps`,\n * `/api/hooks` instead of seeded arrays.\n */\n\nexport type LibraryKind = 'skills' | 'mcps' | 'hooks';\n\nconst KIND_LABEL: Record<LibraryKind, string> = {\n skills: 'Skills',\n mcps: 'MCPs',\n hooks: 'Hooks',\n};\n\nconst KIND_DESCRIPTION: Record<LibraryKind, string> = {\n skills: 'Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.',\n mcps: 'MCP server registrations under `.claude/settings.json` → `mcpServers`.',\n hooks: 'Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd).',\n};\n\nconst ENDPOINT: Record<LibraryKind, string> = {\n skills: '/api/skills',\n mcps: '/api/skills?kind=mcps',\n hooks: '/api/skills?kind=hooks',\n};\n\nconst CHANGE_EVENTS: Record<LibraryKind, readonly string[]> = {\n skills: ['skills:change', 'agents:change'] as const,\n mcps: ['mcps:change', 'agents:change'] as const,\n hooks: ['hooks:change', 'agents:change'] as const,\n};\n// Stable hook count: always register listeners for all possible events,\n// filter inside the handler so kind navigation never changes hook order.\nconst ALL_EVENTS = ['skills:change', 'mcps:change', 'hooks:change', 'agents:change'] as const;\n\nfunction mapItem(it: LibItem): LibraryItemProps {\n const status: LibraryStatus =\n it.status === 'enabled' || it.status === 'disabled' || it.status === 'error'\n ? it.status\n : 'disabled';\n return {\n id: it.id,\n name: it.name,\n slug: it.slug ?? it.id,\n status,\n description: it.description,\n meta: it.meta,\n };\n}\n\nexport interface LibrariesViewProps {\n kind: LibraryKind;\n}\n\nexport function LibrariesView(props: LibrariesViewProps): JSX.Element {\n const { kind } = props;\n const url = ENDPOINT[kind];\n const res = useFetch<{ skills?: LibItem[]; items?: LibItem[]; count?: number }>(url);\n const [bust, setBust] = useState(0);\n\n // Force a re-fetch when the matching change event fires. Hook count\n // is fixed (ALL_EVENTS.length) so navigating between kinds can't trip\n // React's \"Rendered fewer hooks than expected\" runtime guard.\n const events = CHANGE_EVENTS[kind];\n const handler = useCallback((): void => setBust((n) => n + 1), []);\n for (const evt of ALL_EVENTS) {\n useWsMessage(evt, events.includes(evt) ? handler : () => {});\n }\n\n useEffect(() => {\n if (bust > 0) res.refetch();\n }, [bust, res]);\n\n const items: LibraryItemProps[] = (res.data?.skills || res.data?.items || []).map(mapItem);\n\n return (\n <Stack gap={5} data-testid={`${kind}-view`}>\n <ViewHeader title={KIND_LABEL[kind]} description={KIND_DESCRIPTION[kind]} />\n {res.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : res.error && items.length === 0 ? (\n <ErrorState\n block\n title={`Couldn't load ${KIND_LABEL[kind].toLowerCase()}`}\n description=\"The library endpoint failed. Retry to refetch.\"\n error={res.error}\n onRetry={() => void res.refetch()}\n testid={`libraries-${kind}-error`}\n />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<span>📚</span>}\n title={`No ${KIND_LABEL[kind].toLowerCase()} installed`}\n description={`${KIND_LABEL[kind]} appear here as soon as they are registered.`}\n />\n ) : (\n <LibraryGrid>\n {items.map((item) => (\n <LibraryItem key={item.id} {...item} />\n ))}\n </LibraryGrid>\n )}\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","LibraryItem","props","name","slug","status","description","meta","actions","onOpen","className","jsxs","cx","jsx","Power","Badge","ChevronRight","LibraryGrid","children","KIND_LABEL","KIND_DESCRIPTION","ENDPOINT","CHANGE_EVENTS","ALL_EVENTS","mapItem","it","LibrariesView","kind","url","res","useFetch","bust","setBust","useState","events","handler","useCallback","n","evt","useWsMessage","useEffect","items","_a","_b","Stack","ViewHeader","Skeleton","ErrorState","EmptyState","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LibrariesView-CbFFksox.js","sources":["../../src/web/v8/ui/libraries/LibraryItem.tsx","../../src/web/v8/ui/libraries/LibraryGrid.tsx","../../src/web/v8/views/Libraries/LibrariesView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { ChevronRight, Power } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge, type BadgeTone } from '../data/Badge.js';\n\n/**\n * LibraryItem — generic inventory card used by the Skill/MCP/Hook libraries.\n *\n * PLAN.md: each \"library\" lists the same three facts about an installable\n * resource: identity (name + slug), status (enabled/disabled/error), and\n * provenance (description, version, last-used, owner). LibraryItem renders\n * those facts consistently so all three libraries feel like one product.\n */\n\nexport type LibraryStatus = 'enabled' | 'disabled' | 'error';\n\nexport interface LibraryItemProps {\n id: string;\n /** Display name (e.g. \"Frigg — Codebase Q&A\"). */\n name: string;\n /** Identifier (e.g. \"frigg\", \"semble\", \"PreToolUse:check-arch\"). */\n slug: string;\n status: LibraryStatus;\n description?: string;\n /** One-line metadata row (e.g. \"v1.2.0 · used 14× today · @anthropic\"). */\n meta?: string;\n /** Optional trailing action area (toggle, menu trigger, etc). */\n actions?: ReactNode;\n /** Click handler — opens detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<LibraryStatus, string> = {\n enabled: 'Enabled',\n disabled: 'Disabled',\n error: 'Error',\n};\n\nconst STATUS_TONE: Record<LibraryStatus, BadgeTone> = {\n enabled: 'success',\n disabled: 'neutral',\n error: 'danger',\n};\n\nexport function LibraryItem(props: LibraryItemProps) {\n const { name, slug, status, description, meta, actions, onOpen, className } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-library-item', `v8-library-item--${status}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n marginTop: 2,\n borderRadius: 'var(--radius-sm)',\n background:\n status === 'enabled'\n ? 'color-mix(in oklch, var(--success) 14%, transparent)'\n : status === 'error'\n ? 'color-mix(in oklch, var(--danger) 14%, transparent)'\n : 'var(--surface-2)',\n color:\n status === 'enabled' ? 'var(--success)' : status === 'error' ? 'var(--danger)' : 'var(--fg-muted)',\n flexShrink: 0,\n }}\n >\n <Power size={14} aria-hidden=\"true\" />\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <span\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 600,\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {name}\n </span>\n <code\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontFamily: 'var(--font-mono, ui-monospace, monospace)',\n }}\n >\n {slug}\n </code>\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginTop: 6,\n }}\n >\n {meta !== undefined ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{meta}</span>\n ) : (\n <span />\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <Badge tone={STATUS_TONE[status]} size=\"sm\">\n {STATUS_LABEL[status]}\n </Badge>\n {actions}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n </div>\n <style>{`\n .v8-library-item:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * LibraryGrid — responsive grid for LibraryItem lists.\n *\n * Renders 1 column on narrow viewports, 2 columns on md, 3 columns on lg.\n * Uses CSS grid + auto-fit; items auto-size to fill available space.\n */\n\nexport interface LibraryGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function LibraryGrid(props: LibraryGridProps) {\n const { children, className } = props;\n return (\n <div\n className={cx('v8-library-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(100%, 320px), 1fr))',\n gap: 'var(--space-3)',\n }}\n >\n {children}\n </div>\n );\n}","import { useEffect, useState, useCallback } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { LibraryGrid, LibraryItem, type LibraryItemProps, type LibraryStatus } from '../../ui/index.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { LibraryItem as LibItem } from '../../data/types.js';\n\n/**\n * LibrariesView — Sprint S10. Generic Skills / MCPs / Hooks surface.\n *\n * The parent (`Router.tsx`) picks the data source per kind. This\n * view pulls live data from `/api/skills`, `/api/mcps`,\n * `/api/hooks` instead of seeded arrays.\n */\n\nexport type LibraryKind = 'skills' | 'mcps' | 'hooks';\n\nconst KIND_LABEL: Record<LibraryKind, string> = {\n skills: 'Skills',\n mcps: 'MCPs',\n hooks: 'Hooks',\n};\n\nconst KIND_DESCRIPTION: Record<LibraryKind, string> = {\n skills: 'Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.',\n mcps: 'MCP server registrations under `.claude/settings.json` → `mcpServers`.',\n hooks: 'Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd).',\n};\n\nconst ENDPOINT: Record<LibraryKind, string> = {\n skills: '/api/skills',\n mcps: '/api/skills?kind=mcps',\n hooks: '/api/skills?kind=hooks',\n};\n\nconst CHANGE_EVENTS: Record<LibraryKind, readonly string[]> = {\n skills: ['skills:change', 'agents:change'] as const,\n mcps: ['mcps:change', 'agents:change'] as const,\n hooks: ['hooks:change', 'agents:change'] as const,\n};\n// Stable hook count: always register listeners for all possible events,\n// filter inside the handler so kind navigation never changes hook order.\nconst ALL_EVENTS = ['skills:change', 'mcps:change', 'hooks:change', 'agents:change'] as const;\n\nfunction mapItem(it: LibItem): LibraryItemProps {\n const status: LibraryStatus =\n it.status === 'enabled' || it.status === 'disabled' || it.status === 'error'\n ? it.status\n : 'disabled';\n return {\n id: it.id,\n name: it.name,\n slug: it.slug ?? it.id,\n status,\n description: it.description,\n meta: it.meta,\n };\n}\n\nexport interface LibrariesViewProps {\n kind: LibraryKind;\n}\n\nexport function LibrariesView(props: LibrariesViewProps): JSX.Element {\n const { kind } = props;\n const url = ENDPOINT[kind];\n const res = useFetch<{ skills?: LibItem[]; items?: LibItem[]; count?: number }>(url);\n const [bust, setBust] = useState(0);\n\n // Force a re-fetch when the matching change event fires. Hook count\n // is fixed (ALL_EVENTS.length) so navigating between kinds can't trip\n // React's \"Rendered fewer hooks than expected\" runtime guard.\n const events = CHANGE_EVENTS[kind];\n const handler = useCallback((): void => setBust((n) => n + 1), []);\n for (const evt of ALL_EVENTS) {\n useWsMessage(evt, events.includes(evt) ? handler : () => {});\n }\n\n useEffect(() => {\n if (bust > 0) res.refetch();\n }, [bust, res]);\n\n const items: LibraryItemProps[] = (res.data?.skills || res.data?.items || []).map(mapItem);\n\n return (\n <Stack gap={5} data-testid={`${kind}-view`}>\n <ViewHeader title={KIND_LABEL[kind]} description={KIND_DESCRIPTION[kind]} />\n {res.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : res.error && items.length === 0 ? (\n <ErrorState\n block\n title={`Couldn't load ${KIND_LABEL[kind].toLowerCase()}`}\n description=\"The library endpoint failed. Retry to refetch.\"\n error={res.error}\n onRetry={() => void res.refetch()}\n testid={`libraries-${kind}-error`}\n />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<span>📚</span>}\n title={`No ${KIND_LABEL[kind].toLowerCase()} installed`}\n description={`${KIND_LABEL[kind]} appear here as soon as they are registered.`}\n />\n ) : (\n <LibraryGrid>\n {items.map((item) => (\n <LibraryItem key={item.id} {...item} />\n ))}\n </LibraryGrid>\n )}\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","LibraryItem","props","name","slug","status","description","meta","actions","onOpen","className","jsxs","cx","jsx","Power","Badge","ChevronRight","LibraryGrid","children","KIND_LABEL","KIND_DESCRIPTION","ENDPOINT","CHANGE_EVENTS","ALL_EVENTS","mapItem","it","LibrariesView","kind","url","res","useFetch","bust","setBust","useState","events","handler","useCallback","n","evt","useWsMessage","useEffect","items","_a","_b","Stack","ViewHeader","Skeleton","ErrorState","EmptyState","item"],"mappings":"+mCAiCA,MAAMA,EAA8C,CAClD,QAAS,UACT,SAAU,WACV,MAAO,OACT,EAEMC,EAAgD,CACpD,QAAS,UACT,SAAU,UACV,MAAO,QACT,EAEO,SAASC,EAAYC,EAAyB,CACnD,KAAM,CAAE,KAAAC,EAAM,KAAAC,EAAM,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,EAAM,QAAAC,EAAS,OAAAC,EAAQ,UAAAC,CAAA,EAAcR,EAE9E,OACES,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAASF,EACT,UAAWG,EAAG,kBAAmB,oBAAoBP,CAAM,GAAIK,CAAS,EACxE,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,MAAO,OACP,QAAS,gCACT,WAAY,mBACZ,OAAQ,0BACR,aAAc,gBACd,UAAW,OACX,OAAQD,IAAW,OAAY,UAAY,UAC3C,KAAM,UACN,MAAO,UACP,WAAY,gGAAA,EAGd,SAAA,CAAAI,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,UAAW,EACX,aAAc,mBACd,WACER,IAAW,UACP,uDACAA,IAAW,QACT,sDACA,mBACR,MACEA,IAAW,UAAY,iBAAmBA,IAAW,QAAU,gBAAkB,kBACnF,WAAY,CAAA,EAGd,SAAAQ,EAAAA,IAACC,EAAA,CAAM,KAAM,GAAI,cAAY,MAAA,CAAO,CAAA,CAAA,EAEtCH,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,gBAAA,EACxD,SAAA,CAAAE,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,eACV,WAAY,IACZ,MAAO,YACP,WAAY,gBAAA,EAGb,SAAAV,CAAA,CAAA,EAEHU,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,mBACP,WAAY,2CAAA,EAGb,SAAAT,CAAA,CAAA,CACH,EACF,EACCE,IAAgB,QACfO,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,UAAW,EACX,QAAS,cACT,gBAAiB,EACjB,gBAAiB,WACjB,SAAU,QAAA,EAGX,SAAAP,CAAA,CAAA,EAGLK,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,IAAK,iBACL,UAAW,CAAA,EAGZ,SAAA,CAAAJ,IAAS,OACRM,MAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAN,CAAA,CAAK,QAE3E,OAAA,EAAK,EAERI,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,gBAAA,EACxD,SAAA,CAAAE,EAAAA,IAACE,EAAA,CAAM,KAAMf,EAAYK,CAAM,EAAG,KAAK,KACpC,SAAAN,EAAaM,CAAM,CAAA,CACtB,EACCG,EACDK,EAAAA,IAACG,EAAA,CAAa,KAAM,GAAI,cAAY,OAAO,MAAO,CAAE,MAAO,mBAAmB,CAAG,CAAA,CAAA,CACnF,CAAA,CAAA,CAAA,CACF,EACF,QACC,QAAA,CAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAKN,CAAA,CAAA,CAAA,CAGR,CCjJO,SAASC,EAAYf,EAAyB,CACnD,KAAM,CAAE,SAAAgB,EAAU,UAAAR,CAAA,EAAcR,EAChC,OACEW,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAG,kBAAmBF,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,oBAAqB,mDACrB,IAAK,gBAAA,EAGN,SAAAQ,CAAA,CAAA,CAGP,CCRA,MAAMC,EAA0C,CAC9C,OAAQ,SACR,KAAM,OACN,MAAO,OACT,EAEMC,EAAgD,CACpD,OAAQ,2EACR,KAAM,yEACN,MAAO,iFACT,EAEMC,EAAwC,CAC5C,OAAQ,cACR,KAAM,wBACN,MAAO,wBACT,EAEMC,EAAwD,CAC5D,OAAQ,CAAC,gBAAiB,eAAe,EACzC,KAAM,CAAC,cAAe,eAAe,EACrC,MAAO,CAAC,eAAgB,eAAe,CACzC,EAGMC,EAAa,CAAC,gBAAiB,cAAe,eAAgB,eAAe,EAEnF,SAASC,EAAQC,EAA+B,CAC9C,MAAMpB,EACJoB,EAAG,SAAW,WAAaA,EAAG,SAAW,YAAcA,EAAG,SAAW,QACjEA,EAAG,OACH,WACN,MAAO,CACL,GAAIA,EAAG,GACP,KAAMA,EAAG,KACT,KAAMA,EAAG,MAAQA,EAAG,GACpB,OAAApB,EACA,YAAaoB,EAAG,YAChB,KAAMA,EAAG,IAAA,CAEb,CAMO,SAASC,GAAcxB,EAAwC,SACpE,KAAM,CAAE,KAAAyB,GAASzB,EACX0B,EAAMP,EAASM,CAAI,EACnBE,EAAMC,EAAoEF,CAAG,EAC7E,CAACG,EAAMC,CAAO,EAAIC,EAAAA,SAAS,CAAC,EAK5BC,EAASZ,EAAcK,CAAI,EAC3BQ,EAAUC,EAAAA,YAAY,IAAYJ,EAASK,GAAMA,EAAI,CAAC,EAAG,EAAE,EACjE,UAAWC,KAAOf,EAChBgB,EAAaD,EAAKJ,EAAO,SAASI,CAAG,EAAIH,EAAU,IAAM,CAAC,CAAC,EAG7DK,EAAAA,UAAU,IAAM,CACVT,EAAO,GAAGF,EAAI,QAAA,CACpB,EAAG,CAACE,EAAMF,CAAG,CAAC,EAEd,MAAMY,KAA6BC,EAAAb,EAAI,OAAJ,YAAAa,EAAU,WAAUC,EAAAd,EAAI,OAAJ,YAAAc,EAAU,QAAS,IAAI,IAAInB,CAAO,EAEzF,cACGoB,EAAA,CAAM,IAAK,EAAG,cAAa,GAAGjB,CAAI,QACjC,SAAA,CAAAd,MAACgC,EAAA,CAAW,MAAO1B,EAAWQ,CAAI,EAAG,YAAaP,EAAiBO,CAAI,EAAG,EACzEE,EAAI,QACHhB,EAAAA,IAACiC,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAA,CAAI,CAAG,EAChCjB,EAAI,OAASY,EAAM,SAAW,EAChC5B,EAAAA,IAACkC,EAAA,CACC,MAAK,GACL,MAAO,iBAAiB5B,EAAWQ,CAAI,EAAE,aAAa,GACtD,YAAY,iDACZ,MAAOE,EAAI,MACX,QAAS,IAAM,KAAKA,EAAI,QAAA,EACxB,OAAQ,aAAaF,CAAI,QAAA,CAAA,EAEzBc,EAAM,SAAW,EACnB5B,EAAAA,IAACmC,EAAA,CACC,KAAMnC,EAAAA,IAAC,OAAA,CAAK,SAAA,IAAA,CAAE,EACd,MAAO,MAAMM,EAAWQ,CAAI,EAAE,aAAa,aAC3C,YAAa,GAAGR,EAAWQ,CAAI,CAAC,8CAAA,CAAA,EAGlCd,EAAAA,IAACI,EAAA,CACE,SAAAwB,EAAM,IAAKQ,GACVpC,EAAAA,IAACZ,EAAA,CAA2B,GAAGgD,CAAA,EAAbA,EAAK,EAAc,CACtC,CAAA,CACH,CAAA,EAEJ,CAEJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as b,S as o,I as r,d as c,h as z,D as I,i as C,F as k}from"./main-
|
|
1
|
+
import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as b,S as o,I as r,d as c,h as z,D as I,i as C,F as k}from"./main-CokHAXWM.js";import{V as F}from"./ViewHeader-BzYZ3m-e.js";import{C as w,b as B}from"./Card-B0imhxMk.js";import{I as R}from"./Input-Bgzxf_Hu.js";import{R as G}from"./refresh-ccw-DNrXX9gB.js";import{S as V}from"./save-D1iKiJJl.js";import{C as T}from"./circle-Bx_hQEBC.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-BqDrJbRq.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightRAGView-JYpE5u9p.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-play.js","../../src/web/v8/views/LightRAG/LightRAGView.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 CirclePlay = createLucideIcon(\"CirclePlay\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polygon\", { points: \"10 8 16 12 10 16 10 8\", key: \"1cimsy\" }]\n]);\n\nexport { CirclePlay as default };\n//# sourceMappingURL=circle-play.js.map\n","/**\n * v8/views/LightRAG/LightRAGView.tsx — Sprint S43, v9.3.0.\n *\n * Defaults override form (GET/PUT /api/lightrag/defaults), runtime\n * status (GET /api/lightrag/status: running, pid, host:port, log\n * tail), and an Autostart trigger (POST /api/lightrag/autostart).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Database, RefreshCcw, Save, PlayCircle, Circle } 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 { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Defaults {\n llm: string;\n embedding: string;\n source?: string;\n llmSource?: string;\n embeddingSource?: string;\n builtin?: { llm: string; embedding: string };\n envVars?: { BIZAR_LIGHTRAG_LLM: string | null; BIZAR_LIGHTRAG_EMBEDDING: string | null };\n}\n\ninterface Status {\n running: boolean;\n pid: number | null;\n host?: string;\n port?: number;\n llmBinding?: string;\n embeddingBinding?: string;\n llmModel?: string;\n embeddingModel?: string;\n logSize?: number;\n logTail?: string[];\n}\n\nexport function LightRAGView(): JSX.Element {\n const defaultsPayload = useFetch<Defaults>('/api/lightrag/defaults');\n const statusPayload = useFetch<Status>('/api/lightrag/status');\n const [llm, setLlm] = useState<string>('');\n const [embedding, setEmbedding] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [autostarting, setAutostarting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (defaultsPayload.data) {\n setLlm(defaultsPayload.data.llm ?? '');\n setEmbedding(defaultsPayload.data.embedding ?? '');\n }\n }, [defaultsPayload.data]);\n\n const refresh = useCallback(() => { void defaultsPayload.refetch(); void statusPayload.refetch(); }, [defaultsPayload, statusPayload]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/lightrag/defaults', { method: 'PUT', body: { llm, embedding } });\n setSaved(true);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const autostart = async (): Promise<void> => {\n setAutostarting(true);\n setError(null);\n try {\n await fetchJson('/api/lightrag/autostart', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setAutostarting(false);\n }\n };\n\n const status = statusPayload.data;\n\n return (\n <Stack gap={4} data-testid=\"lightrag-view\">\n <ViewHeader\n title=\"LightRAG\"\n description=\"LightRAG defaults + runtime status + autostart.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"lightrag-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"lightrag-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"lightrag-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Defaults</strong>\n {defaultsPayload.loading && defaultsPayload.data === null ? (\n <Skeleton style={{ height: 100, marginTop: 'var(--space-2)' }} />\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-2)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>LLM binding</span>\n <Input value={llm} onChange={(e) => setLlm((e.target as HTMLInputElement).value)} data-testid=\"lightrag-llm\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Embedding binding</span>\n <Input value={embedding} onChange={(e) => setEmbedding((e.target as HTMLInputElement).value)} data-testid=\"lightrag-embedding\" />\n </label>\n {defaultsPayload.data?.builtin && (\n <Inline gap={2} style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n <span>built-in:</span>\n <code>{defaultsPayload.data.builtin.llm}</code> /\n <code>{defaultsPayload.data.builtin.embedding}</code>\n </Inline>\n )}\n {saved && <span data-testid=\"lightrag-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n <Inline align=\"center\" gap={2}>\n {status === null || status === undefined ? (\n <Skeleton style={{ width: 80, height: 14 }} />\n ) : status.running ? (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-running\">\n <Circle size={10} aria-hidden style={{ color: 'var(--success)', fill: 'var(--success)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>running · pid {status.pid}</span>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-stopped\">\n <Circle size={10} aria-hidden style={{ color: 'var(--fg-muted)', fill: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>stopped</span>\n </Inline>\n )}\n <Button variant=\"ghost\" onClick={() => void autostart()} disabled={autostarting} data-testid=\"lightrag-autostart\">\n <PlayCircle size={14} aria-hidden /> {autostarting ? 'Starting…' : 'Autostart'}\n </Button>\n </Inline>\n </Inline>\n {status && (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)' }}>\n <Inline gap={2}>\n <Database size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <code>{status.host}:{status.port}</code>\n {status.llmBinding && <span style={{ color: 'var(--fg-muted)' }}>· llm: <code>{status.llmBinding}</code></span>}\n {status.embeddingBinding && <span style={{ color: 'var(--fg-muted)' }}>· embedding: <code>{status.embeddingBinding}</code></span>}\n </Inline>\n {status.logTail && status.logTail.length > 0 && (\n <div data-testid=\"lightrag-log\" style={{ background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', padding: 'var(--space-2)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-11)', maxHeight: 160, overflow: 'auto' }}>\n {status.logTail.filter(Boolean).slice(-10).map((l, i) => (<div key={i}>{l}</div>))}\n </div>\n )}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["CirclePlay","createLucideIcon","LightRAGView","defaultsPayload","useFetch","statusPayload","llm","setLlm","useState","embedding","setEmbedding","busy","setBusy","saved","setSaved","autostarting","setAutostarting","error","setError","useEffect","refresh","useCallback","save","fetchJson","err","FetchError","autostart","status","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Save","Card","CardBody","Skeleton","Input","e","_a","Circle","PlayCircle","Database","l","i"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"LightRAGView-BqDrJbRq.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-play.js","../../src/web/v8/views/LightRAG/LightRAGView.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 CirclePlay = createLucideIcon(\"CirclePlay\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polygon\", { points: \"10 8 16 12 10 16 10 8\", key: \"1cimsy\" }]\n]);\n\nexport { CirclePlay as default };\n//# sourceMappingURL=circle-play.js.map\n","/**\n * v8/views/LightRAG/LightRAGView.tsx — Sprint S43, v9.3.0.\n *\n * Defaults override form (GET/PUT /api/lightrag/defaults), runtime\n * status (GET /api/lightrag/status: running, pid, host:port, log\n * tail), and an Autostart trigger (POST /api/lightrag/autostart).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Database, RefreshCcw, Save, PlayCircle, Circle } 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 { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Defaults {\n llm: string;\n embedding: string;\n source?: string;\n llmSource?: string;\n embeddingSource?: string;\n builtin?: { llm: string; embedding: string };\n envVars?: { BIZAR_LIGHTRAG_LLM: string | null; BIZAR_LIGHTRAG_EMBEDDING: string | null };\n}\n\ninterface Status {\n running: boolean;\n pid: number | null;\n host?: string;\n port?: number;\n llmBinding?: string;\n embeddingBinding?: string;\n llmModel?: string;\n embeddingModel?: string;\n logSize?: number;\n logTail?: string[];\n}\n\nexport function LightRAGView(): JSX.Element {\n const defaultsPayload = useFetch<Defaults>('/api/lightrag/defaults');\n const statusPayload = useFetch<Status>('/api/lightrag/status');\n const [llm, setLlm] = useState<string>('');\n const [embedding, setEmbedding] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [autostarting, setAutostarting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (defaultsPayload.data) {\n setLlm(defaultsPayload.data.llm ?? '');\n setEmbedding(defaultsPayload.data.embedding ?? '');\n }\n }, [defaultsPayload.data]);\n\n const refresh = useCallback(() => { void defaultsPayload.refetch(); void statusPayload.refetch(); }, [defaultsPayload, statusPayload]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/lightrag/defaults', { method: 'PUT', body: { llm, embedding } });\n setSaved(true);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const autostart = async (): Promise<void> => {\n setAutostarting(true);\n setError(null);\n try {\n await fetchJson('/api/lightrag/autostart', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setAutostarting(false);\n }\n };\n\n const status = statusPayload.data;\n\n return (\n <Stack gap={4} data-testid=\"lightrag-view\">\n <ViewHeader\n title=\"LightRAG\"\n description=\"LightRAG defaults + runtime status + autostart.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"lightrag-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"lightrag-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"lightrag-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Defaults</strong>\n {defaultsPayload.loading && defaultsPayload.data === null ? (\n <Skeleton style={{ height: 100, marginTop: 'var(--space-2)' }} />\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-2)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>LLM binding</span>\n <Input value={llm} onChange={(e) => setLlm((e.target as HTMLInputElement).value)} data-testid=\"lightrag-llm\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Embedding binding</span>\n <Input value={embedding} onChange={(e) => setEmbedding((e.target as HTMLInputElement).value)} data-testid=\"lightrag-embedding\" />\n </label>\n {defaultsPayload.data?.builtin && (\n <Inline gap={2} style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n <span>built-in:</span>\n <code>{defaultsPayload.data.builtin.llm}</code> /\n <code>{defaultsPayload.data.builtin.embedding}</code>\n </Inline>\n )}\n {saved && <span data-testid=\"lightrag-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n <Inline align=\"center\" gap={2}>\n {status === null || status === undefined ? (\n <Skeleton style={{ width: 80, height: 14 }} />\n ) : status.running ? (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-running\">\n <Circle size={10} aria-hidden style={{ color: 'var(--success)', fill: 'var(--success)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>running · pid {status.pid}</span>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-stopped\">\n <Circle size={10} aria-hidden style={{ color: 'var(--fg-muted)', fill: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>stopped</span>\n </Inline>\n )}\n <Button variant=\"ghost\" onClick={() => void autostart()} disabled={autostarting} data-testid=\"lightrag-autostart\">\n <PlayCircle size={14} aria-hidden /> {autostarting ? 'Starting…' : 'Autostart'}\n </Button>\n </Inline>\n </Inline>\n {status && (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)' }}>\n <Inline gap={2}>\n <Database size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <code>{status.host}:{status.port}</code>\n {status.llmBinding && <span style={{ color: 'var(--fg-muted)' }}>· llm: <code>{status.llmBinding}</code></span>}\n {status.embeddingBinding && <span style={{ color: 'var(--fg-muted)' }}>· embedding: <code>{status.embeddingBinding}</code></span>}\n </Inline>\n {status.logTail && status.logTail.length > 0 && (\n <div data-testid=\"lightrag-log\" style={{ background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', padding: 'var(--space-2)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-11)', maxHeight: 160, overflow: 'auto' }}>\n {status.logTail.filter(Boolean).slice(-10).map((l, i) => (<div key={i}>{l}</div>))}\n </div>\n )}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["CirclePlay","createLucideIcon","LightRAGView","defaultsPayload","useFetch","statusPayload","llm","setLlm","useState","embedding","setEmbedding","busy","setBusy","saved","setSaved","autostarting","setAutostarting","error","setError","useEffect","refresh","useCallback","save","fetchJson","err","FetchError","autostart","status","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Save","Card","CardBody","Skeleton","Input","e","_a","Circle","PlayCircle","Database","l","i"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as f,j as e}from"./cmdk-DVxytz9i.js";import{g as x}from"./main-
|
|
1
|
+
import{r as f,j as e}from"./cmdk-DVxytz9i.js";import{g as x}from"./main-CokHAXWM.js";const g=f.forwardRef(function(l,d){const{title:n,count:a,sparkline:s,filters:r,actions:t,description:i,testid:o,className:c,...p}=l;return e.jsxs("div",{ref:d,"data-testid":o??"list-header",className:x("v8-list-header",c),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",marginBottom:"var(--space-2)"},...p,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",flexWrap:"wrap"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)",flex:1,minWidth:0},children:[e.jsx("h2",{style:{margin:0,fontSize:"var(--fs-16)",fontWeight:600},children:n}),a!=null&&e.jsx("span",{"data-testid":"list-header-count",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums",background:"var(--surface-1)",padding:"2px 8px",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:a}),s!==void 0&&e.jsx("span",{"data-testid":"list-header-sparkline",children:s}),i!==void 0&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i})]}),t!==void 0&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-1)",flexShrink:0},children:t})]}),r!==void 0&&e.jsx("div",{"data-testid":"list-header-filters",style:{display:"flex",alignItems:"center",gap:"var(--space-1)",flexWrap:"wrap"},children:r})]})});export{g as L};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListHeader-
|
|
1
|
+
{"version":3,"file":"ListHeader-TjPJrUfY.js","sources":["../../src/web/v8/ui/data/ListHeader.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ListHeader — section header for list/grid views.\n *\n * Composes a label + count badge + optional sparkline + optional\n * filter chips + right-aligned actions. Use at the top of a Card\n * or as a standalone section divider.\n *\n * Two patterns supported:\n * - Minimal: `<title> <count?> <actions?>`\n * - Data-driven: `<title> <sparkline?> <chips?> <actions?>`\n */\nexport interface ListHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n /** Optional numeric badge — e.g. `42` rendered as `42 items`. */\n count?: number | null;\n /** Inline sparkline (pass a Sparkline node, not raw data). */\n sparkline?: ReactNode;\n /** Inline filter chips — rendered as a wrapping row. */\n filters?: ReactNode;\n /** Right-aligned action area (buttons, refresh, etc). */\n actions?: ReactNode;\n /** Optional helper text under the title. */\n description?: ReactNode;\n testid?: string;\n}\n\nexport const ListHeader = forwardRef<HTMLDivElement, ListHeaderProps>(function ListHeader(props, ref) {\n const { title, count, sparkline, filters, actions, description, testid, className, ...rest } = props;\n return (\n <div\n ref={ref}\n data-testid={testid ?? 'list-header'}\n className={cx('v8-list-header', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n marginBottom: 'var(--space-2)',\n }}\n {...rest}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n flexWrap: 'wrap',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flex: 1, minWidth: 0 }}>\n <h2 style={{ margin: 0, fontSize: 'var(--fs-16)', fontWeight: 600 }}>{title}</h2>\n {count !== undefined && count !== null && (\n <span\n data-testid=\"list-header-count\"\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n background: 'var(--surface-1)',\n padding: '2px 8px',\n borderRadius: 'var(--radius-pill)',\n border: '1px solid var(--border)',\n }}\n >\n {count}\n </span>\n )}\n {sparkline !== undefined && (\n <span data-testid=\"list-header-sparkline\">{sparkline}</span>\n )}\n {description !== undefined && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{description}</span>\n )}\n </div>\n {actions !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-1)', flexShrink: 0 }}>\n {actions}\n </div>\n )}\n </div>\n {filters !== undefined && (\n <div\n data-testid=\"list-header-filters\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-1)', flexWrap: 'wrap' }}\n >\n {filters}\n </div>\n )}\n </div>\n );\n});"],"names":["ListHeader","forwardRef","props","ref","title","count","sparkline","filters","actions","description","testid","className","rest","jsxs","cx","jsx"],"mappings":"qFA6BO,MAAMA,EAAaC,EAAAA,WAA4C,SAAoBC,EAAOC,EAAK,CACpG,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,QAAAC,EAAS,QAAAC,EAAS,YAAAC,EAAa,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,CAAA,EAASV,EAC/F,OACEW,EAAAA,KAAC,MAAA,CACC,IAAAV,EACA,cAAaO,GAAU,cACvB,UAAWI,EAAG,iBAAkBH,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,iBACL,aAAc,gBAAA,EAEf,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,iBACL,SAAU,MAAA,EAGZ,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,KAAM,EAAG,SAAU,GAC7F,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,OAAQ,EAAG,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EACpDC,GAAU,MAChCU,EAAAA,IAAC,OAAA,CACC,cAAY,oBACZ,MAAO,CACL,SAAU,eACV,MAAO,kBACP,mBAAoB,eACpB,WAAY,mBACZ,QAAS,UACT,aAAc,qBACd,OAAQ,yBAAA,EAGT,SAAAV,CAAA,CAAA,EAGJC,IAAc,QACbS,EAAAA,IAAC,OAAA,CAAK,cAAY,wBAAyB,SAAAT,EAAU,EAEtDG,IAAgB,QACfM,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,oBAAuB,SAAAN,CAAA,CAAY,CAAA,EAEvF,EACCD,IAAY,QACXO,MAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,WAAY,CAAA,EACrF,SAAAP,CAAA,CACH,CAAA,CAAA,CAAA,EAGHD,IAAY,QACXQ,EAAAA,IAAC,MAAA,CACC,cAAY,sBACZ,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,SAAU,MAAA,EAEhF,SAAAR,CAAA,CAAA,CACH,CAAA,CAAA,CAIR,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r as m}from"./cmdk-DVxytz9i.js";import{c as N,B,g as j,u as L,a as O,S as y,d as p,I as g,h as P,i as x,F as b}from"./main-
|
|
1
|
+
import{j as e,r as m}from"./cmdk-DVxytz9i.js";import{c as N,B,g as j,u as L,a as O,S as y,d as p,I as g,h as P,i as x,F as b}from"./main-CokHAXWM.js";import{V as A}from"./ViewHeader-BzYZ3m-e.js";import{F as I}from"./file-text-yEMkrSoZ.js";import{E as R}from"./EmptyState-BjgVOrcO.js";import{C as S}from"./Chip-wwZSGwLE.js";import{S as D,a as T}from"./Sheet-DnDid58j.js";import{T as _}from"./Textarea-BzIAwSlp.js";import{D as F}from"./download-4cEUWue1.js";import{P as w}from"./plus-DENm0hqV.js";import{B as M}from"./brain-CM-Vls8r.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryView-CnOP2MvM.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hash.js","../../src/web/v8/ui/memory/MemoryVault.tsx","../../src/web/v8/views/Memory/MemoryView.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 Hash = createLucideIcon(\"Hash\", [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"9\", y2: \"9\", key: \"4lhtct\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"15\", y2: \"15\", key: \"vyu0kd\" }],\n [\"line\", { x1: \"10\", x2: \"8\", y1: \"3\", y2: \"21\", key: \"1ggp8o\" }],\n [\"line\", { x1: \"16\", x2: \"14\", y1: \"3\", y2: \"21\", key: \"weycgp\" }]\n]);\n\nexport { Hash as default };\n//# sourceMappingURL=hash.js.map\n","import { type ReactNode } from 'react';\nimport { FileText, Hash } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * MemoryVault — list of memory entries (memos) grouped by scope.\n *\n * PLAN.md: memos are the durable cross-session notes the harness writes\n * down. Scopes: `project` (committed to repo) vs `global` (user-wide).\n * Each entry: content (truncated to 3 lines), tags, last-updated time,\n * scope badge.\n */\n\nexport type MemoryScope = 'project' | 'global';\n\nexport interface MemoryEntry {\n id: string;\n content: string;\n tags?: readonly string[];\n scope: MemoryScope;\n /** Relative time label (\"3 days ago\", \"Just now\"). */\n updatedAt: string;\n}\n\nexport interface MemoryVaultProps {\n entries: readonly MemoryEntry[];\n /** Optional click handler — opens memo detail. */\n onOpen?: (entry: MemoryEntry) => void;\n /** Optional empty state. */\n empty?: ReactNode;\n className?: string;\n}\n\nconst SCOPE_LABEL: Record<MemoryScope, string> = {\n project: 'Project',\n global: 'Global',\n};\n\nconst SCOPE_TONE: Record<MemoryScope, 'accent' | 'info'> = {\n project: 'accent',\n global: 'info',\n};\n\nexport function MemoryVault(props: MemoryVaultProps) {\n const { entries, onOpen, empty, className } = props;\n\n if (entries.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n\n return (\n <div className={cx('v8-memory-vault', className)}>\n {entries.map((entry) => (\n <button\n type=\"button\"\n key={entry.id}\n onClick={() => onOpen?.(entry)}\n className={cx('v8-memory-vault__item', `v8-memory-vault__item--${entry.scope}`)}\n style={{\n display: 'block',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n marginBottom: 'var(--space-2)',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginBottom: 6,\n }}\n >\n <Badge tone={SCOPE_TONE[entry.scope]} size=\"sm\">\n {SCOPE_LABEL[entry.scope]}\n </Badge>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n <FileText size={12} aria-hidden=\"true\" />\n {entry.updatedAt}\n </span>\n </div>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {entry.content}\n </div>\n {entry.tags !== undefined && entry.tags.length > 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginTop: 'var(--space-2)',\n flexWrap: 'wrap',\n }}\n >\n <Hash size={11} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n {entry.tags.map((tag) => (\n <span\n key={tag}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </button>\n ))}\n <style>{`\n .v8-memory-vault__item:hover { border-color: var(--accent); }\n `}</style>\n </div>\n );\n}","import { useMemo, useState, useCallback } from 'react';\nimport { Plus, Download } 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 { MemoryVault, type MemoryEntry, type MemoryScope } from '../../ui/memory/MemoryVault.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Brain } from 'lucide-react';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * MemoryView — Sprint S10 + S15b. Pulls `/api/memory`, lets the user\n * create / edit / delete notes via the dashboard's control surface.\n *\n * Notes are stored via `/api/memory/notes` (POST create, PUT/DELETE\n * per-note). Scope is `project` (in the repo) vs `global` (user-wide).\n */\n\ninterface RawMemoryEntry {\n id?: string;\n content?: string;\n tags?: string[];\n scope?: 'project' | 'global';\n updatedAt?: string | number;\n}\n\ninterface MemoryResponse {\n notes?: RawMemoryEntry[];\n count?: number;\n}\n\nfunction toEntry(e: RawMemoryEntry): MemoryEntry {\n return {\n id: e.id || '',\n content: e.content || '',\n tags: e.tags || [],\n scope: (e.scope || 'project') as MemoryScope,\n updatedAt:\n typeof e.updatedAt === 'number'\n ? new Date(e.updatedAt).toLocaleString()\n : e.updatedAt || '',\n };\n}\n\ninterface NoteDraft {\n id?: string;\n content: string;\n scope: MemoryScope;\n}\n\nexport function MemoryView(): JSX.Element {\n const mem = useFetch<MemoryResponse>('/api/memory/notes');\n const [scope, setScope] = useState<MemoryScope | 'all'>('all');\n const [draft, setDraft] = useState<NoteDraft | null>(null);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const entries = useMemo<MemoryEntry[]>(() => {\n const list = (mem.data?.notes || []).map(toEntry);\n if (scope === 'all') return list;\n return list.filter((e) => e.scope === scope);\n }, [mem.data, scope]);\n\n const refresh = (): void => { void mem.refetch(); };\n\n const onMemoryChange = useCallback((msg: WsMessage) => {\n const m = msg as { type?: string };\n if (m.type === 'memory:change' || m.type === 'memory:new' || m.type === 'memory:removed') {\n refresh();\n }\n }, [mem]);\n useWsMessage(['memory:change', 'memory:new', 'memory:removed'], onMemoryChange);\n\n const exportNotes = (): void => {\n const blob = new Blob([JSON.stringify(entries, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-memory-${new Date().toISOString().slice(0, 10)}.json`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n };\n\n const saveDraft = async (): Promise<void> => {\n if (!draft || !draft.content.trim()) return;\n setBusy(true);\n setError(null);\n try {\n if (draft.id) {\n // Edit\n await fetchJson(`/api/memory/notes/${encodeURIComponent(draft.id)}`, {\n method: 'PUT',\n body: { content: draft.content, scope: draft.scope },\n });\n } else {\n await fetchJson('/api/memory/notes', {\n method: 'POST',\n body: { content: draft.content, scope: draft.scope },\n });\n }\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const deleteEntry = async (id: string): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/memory/notes/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"memory-view\">\n <ViewHeader\n title=\"Memory\"\n description=\"Cross-session notes. Project memos live in the repo; global memos live on the user.\"\n actions={\n <Button variant=\"secondary\" onClick={exportNotes} disabled={entries.length === 0}>\n <Download size={12} aria-hidden /> Export JSON\n </Button>\n }\n />\n <Inline align=\"center\" justify=\"between\" gap={2} wrap>\n <Inline gap={2}>\n {(['all', 'project', 'global'] as const).map((s) => (\n <Chip key={s} selected={scope === s} onClick={() => setScope(s)}>\n {s === 'all' ? 'All' : s === 'project' ? 'Project' : 'Global'}\n </Chip>\n ))}\n </Inline>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => setDraft({ content: '', scope: 'project' })}\n data-testid=\"memory-new\"\n >\n <Plus size={14} aria-hidden /> New note\n </Button>\n </Inline>\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n {mem.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : entries.length === 0 ? (\n <EmptyState\n icon={<Brain size={32} aria-hidden />}\n title=\"No memory entries\"\n description=\"Memos land here once they are written via the memory tools. Add one with the button above.\"\n action={\n <Button variant=\"primary\" size=\"sm\" onClick={() => setDraft({ content: '', scope: 'project' })}>\n <Plus size={14} aria-hidden /> New note\n </Button>\n }\n />\n ) : (\n <MemoryVault\n entries={entries}\n onOpen={(e) => setDraft({ id: e.id, content: e.content, scope: e.scope })}\n />\n )}\n <Sheet open={draft !== null} onOpenChange={(o) => { if (!o) setDraft(null); }}>\n <SheetContent side=\"right\" title={draft?.id ? 'Edit note' : 'New note'}>\n {draft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label\n htmlFor=\"memory-content\"\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Content\n </label>\n <Textarea\n id=\"memory-content\"\n value={draft.content}\n onChange={(e) => setDraft({ ...draft, content: e.target.value })}\n rows={10}\n disabled={busy}\n data-testid=\"memory-content\"\n />\n </Stack>\n <Stack gap={2}>\n <label style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Scope</label>\n <Inline gap={2}>\n {(['project', 'global'] as const).map((s) => (\n <Chip\n key={s}\n selected={draft.scope === s}\n onClick={() => setDraft({ ...draft, scope: s })}\n >\n {s === 'project' ? 'Project (in-repo)' : 'Global (user-wide)'}\n </Chip>\n ))}\n </Inline>\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveDraft(); }}\n disabled={busy || !draft.content.trim()}\n >\n {draft.id ? 'Save' : 'Create'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setDraft(null)} disabled={busy}>\n Cancel\n </Button>\n {draft.id !== undefined && (\n <Button\n variant=\"danger\"\n onClick={() => { void deleteEntry(draft.id!); }}\n disabled={busy}\n style={{ marginLeft: 'auto' }}\n >\n Delete\n </Button>\n )}\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["Hash","createLucideIcon","SCOPE_LABEL","SCOPE_TONE","MemoryVault","props","entries","onOpen","empty","className","cx","entry","jsxs","jsx","Badge","FileText","tag","toEntry","e","MemoryView","mem","useFetch","scope","setScope","useState","draft","setDraft","busy","setBusy","error","setError","useMemo","list","_a","refresh","onMemoryChange","useCallback","msg","m","useWsMessage","exportNotes","blob","url","a","saveDraft","fetchJson","err","FetchError","deleteEntry","id","Stack","ViewHeader","Button","Download","Inline","s","Chip","Plus","Skeleton","EmptyState","Brain","Sheet","o","SheetContent","Textarea"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"MemoryView-BlTeHLhX.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hash.js","../../src/web/v8/ui/memory/MemoryVault.tsx","../../src/web/v8/views/Memory/MemoryView.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 Hash = createLucideIcon(\"Hash\", [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"9\", y2: \"9\", key: \"4lhtct\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"15\", y2: \"15\", key: \"vyu0kd\" }],\n [\"line\", { x1: \"10\", x2: \"8\", y1: \"3\", y2: \"21\", key: \"1ggp8o\" }],\n [\"line\", { x1: \"16\", x2: \"14\", y1: \"3\", y2: \"21\", key: \"weycgp\" }]\n]);\n\nexport { Hash as default };\n//# sourceMappingURL=hash.js.map\n","import { type ReactNode } from 'react';\nimport { FileText, Hash } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * MemoryVault — list of memory entries (memos) grouped by scope.\n *\n * PLAN.md: memos are the durable cross-session notes the harness writes\n * down. Scopes: `project` (committed to repo) vs `global` (user-wide).\n * Each entry: content (truncated to 3 lines), tags, last-updated time,\n * scope badge.\n */\n\nexport type MemoryScope = 'project' | 'global';\n\nexport interface MemoryEntry {\n id: string;\n content: string;\n tags?: readonly string[];\n scope: MemoryScope;\n /** Relative time label (\"3 days ago\", \"Just now\"). */\n updatedAt: string;\n}\n\nexport interface MemoryVaultProps {\n entries: readonly MemoryEntry[];\n /** Optional click handler — opens memo detail. */\n onOpen?: (entry: MemoryEntry) => void;\n /** Optional empty state. */\n empty?: ReactNode;\n className?: string;\n}\n\nconst SCOPE_LABEL: Record<MemoryScope, string> = {\n project: 'Project',\n global: 'Global',\n};\n\nconst SCOPE_TONE: Record<MemoryScope, 'accent' | 'info'> = {\n project: 'accent',\n global: 'info',\n};\n\nexport function MemoryVault(props: MemoryVaultProps) {\n const { entries, onOpen, empty, className } = props;\n\n if (entries.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n\n return (\n <div className={cx('v8-memory-vault', className)}>\n {entries.map((entry) => (\n <button\n type=\"button\"\n key={entry.id}\n onClick={() => onOpen?.(entry)}\n className={cx('v8-memory-vault__item', `v8-memory-vault__item--${entry.scope}`)}\n style={{\n display: 'block',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n marginBottom: 'var(--space-2)',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginBottom: 6,\n }}\n >\n <Badge tone={SCOPE_TONE[entry.scope]} size=\"sm\">\n {SCOPE_LABEL[entry.scope]}\n </Badge>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n <FileText size={12} aria-hidden=\"true\" />\n {entry.updatedAt}\n </span>\n </div>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {entry.content}\n </div>\n {entry.tags !== undefined && entry.tags.length > 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginTop: 'var(--space-2)',\n flexWrap: 'wrap',\n }}\n >\n <Hash size={11} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n {entry.tags.map((tag) => (\n <span\n key={tag}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </button>\n ))}\n <style>{`\n .v8-memory-vault__item:hover { border-color: var(--accent); }\n `}</style>\n </div>\n );\n}","import { useMemo, useState, useCallback } from 'react';\nimport { Plus, Download } 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 { MemoryVault, type MemoryEntry, type MemoryScope } from '../../ui/memory/MemoryVault.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Brain } from 'lucide-react';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * MemoryView — Sprint S10 + S15b. Pulls `/api/memory`, lets the user\n * create / edit / delete notes via the dashboard's control surface.\n *\n * Notes are stored via `/api/memory/notes` (POST create, PUT/DELETE\n * per-note). Scope is `project` (in the repo) vs `global` (user-wide).\n */\n\ninterface RawMemoryEntry {\n id?: string;\n content?: string;\n tags?: string[];\n scope?: 'project' | 'global';\n updatedAt?: string | number;\n}\n\ninterface MemoryResponse {\n notes?: RawMemoryEntry[];\n count?: number;\n}\n\nfunction toEntry(e: RawMemoryEntry): MemoryEntry {\n return {\n id: e.id || '',\n content: e.content || '',\n tags: e.tags || [],\n scope: (e.scope || 'project') as MemoryScope,\n updatedAt:\n typeof e.updatedAt === 'number'\n ? new Date(e.updatedAt).toLocaleString()\n : e.updatedAt || '',\n };\n}\n\ninterface NoteDraft {\n id?: string;\n content: string;\n scope: MemoryScope;\n}\n\nexport function MemoryView(): JSX.Element {\n const mem = useFetch<MemoryResponse>('/api/memory/notes');\n const [scope, setScope] = useState<MemoryScope | 'all'>('all');\n const [draft, setDraft] = useState<NoteDraft | null>(null);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const entries = useMemo<MemoryEntry[]>(() => {\n const list = (mem.data?.notes || []).map(toEntry);\n if (scope === 'all') return list;\n return list.filter((e) => e.scope === scope);\n }, [mem.data, scope]);\n\n const refresh = (): void => { void mem.refetch(); };\n\n const onMemoryChange = useCallback((msg: WsMessage) => {\n const m = msg as { type?: string };\n if (m.type === 'memory:change' || m.type === 'memory:new' || m.type === 'memory:removed') {\n refresh();\n }\n }, [mem]);\n useWsMessage(['memory:change', 'memory:new', 'memory:removed'], onMemoryChange);\n\n const exportNotes = (): void => {\n const blob = new Blob([JSON.stringify(entries, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-memory-${new Date().toISOString().slice(0, 10)}.json`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n };\n\n const saveDraft = async (): Promise<void> => {\n if (!draft || !draft.content.trim()) return;\n setBusy(true);\n setError(null);\n try {\n if (draft.id) {\n // Edit\n await fetchJson(`/api/memory/notes/${encodeURIComponent(draft.id)}`, {\n method: 'PUT',\n body: { content: draft.content, scope: draft.scope },\n });\n } else {\n await fetchJson('/api/memory/notes', {\n method: 'POST',\n body: { content: draft.content, scope: draft.scope },\n });\n }\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const deleteEntry = async (id: string): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/memory/notes/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"memory-view\">\n <ViewHeader\n title=\"Memory\"\n description=\"Cross-session notes. Project memos live in the repo; global memos live on the user.\"\n actions={\n <Button variant=\"secondary\" onClick={exportNotes} disabled={entries.length === 0}>\n <Download size={12} aria-hidden /> Export JSON\n </Button>\n }\n />\n <Inline align=\"center\" justify=\"between\" gap={2} wrap>\n <Inline gap={2}>\n {(['all', 'project', 'global'] as const).map((s) => (\n <Chip key={s} selected={scope === s} onClick={() => setScope(s)}>\n {s === 'all' ? 'All' : s === 'project' ? 'Project' : 'Global'}\n </Chip>\n ))}\n </Inline>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => setDraft({ content: '', scope: 'project' })}\n data-testid=\"memory-new\"\n >\n <Plus size={14} aria-hidden /> New note\n </Button>\n </Inline>\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n {mem.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : entries.length === 0 ? (\n <EmptyState\n icon={<Brain size={32} aria-hidden />}\n title=\"No memory entries\"\n description=\"Memos land here once they are written via the memory tools. Add one with the button above.\"\n action={\n <Button variant=\"primary\" size=\"sm\" onClick={() => setDraft({ content: '', scope: 'project' })}>\n <Plus size={14} aria-hidden /> New note\n </Button>\n }\n />\n ) : (\n <MemoryVault\n entries={entries}\n onOpen={(e) => setDraft({ id: e.id, content: e.content, scope: e.scope })}\n />\n )}\n <Sheet open={draft !== null} onOpenChange={(o) => { if (!o) setDraft(null); }}>\n <SheetContent side=\"right\" title={draft?.id ? 'Edit note' : 'New note'}>\n {draft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label\n htmlFor=\"memory-content\"\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Content\n </label>\n <Textarea\n id=\"memory-content\"\n value={draft.content}\n onChange={(e) => setDraft({ ...draft, content: e.target.value })}\n rows={10}\n disabled={busy}\n data-testid=\"memory-content\"\n />\n </Stack>\n <Stack gap={2}>\n <label style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Scope</label>\n <Inline gap={2}>\n {(['project', 'global'] as const).map((s) => (\n <Chip\n key={s}\n selected={draft.scope === s}\n onClick={() => setDraft({ ...draft, scope: s })}\n >\n {s === 'project' ? 'Project (in-repo)' : 'Global (user-wide)'}\n </Chip>\n ))}\n </Inline>\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveDraft(); }}\n disabled={busy || !draft.content.trim()}\n >\n {draft.id ? 'Save' : 'Create'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setDraft(null)} disabled={busy}>\n Cancel\n </Button>\n {draft.id !== undefined && (\n <Button\n variant=\"danger\"\n onClick={() => { void deleteEntry(draft.id!); }}\n disabled={busy}\n style={{ marginLeft: 'auto' }}\n >\n Delete\n </Button>\n )}\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["Hash","createLucideIcon","SCOPE_LABEL","SCOPE_TONE","MemoryVault","props","entries","onOpen","empty","className","cx","entry","jsxs","jsx","Badge","FileText","tag","toEntry","e","MemoryView","mem","useFetch","scope","setScope","useState","draft","setDraft","busy","setBusy","error","setError","useMemo","list","_a","refresh","onMemoryChange","useCallback","msg","m","useWsMessage","exportNotes","blob","url","a","saveDraft","fetchJson","err","FetchError","deleteEntry","id","Stack","ViewHeader","Button","Download","Inline","s","Chip","Plus","Skeleton","EmptyState","Brain","Sheet","o","SheetContent","Textarea"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{S as p,u as j,I as c,f as y,h as g,N as S,d as f,E as b,b as z,a1 as k,i as C,F as T}from"./main-
|
|
1
|
+
import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{S as p,u as j,I as c,f as y,h as g,N as S,d as f,E as b,b as z,a1 as k,i as C,F as T}from"./main-CokHAXWM.js";import{V as w}from"./ViewHeader-BzYZ3m-e.js";import{C as x,b as v}from"./Card-B0imhxMk.js";import{I}from"./Input-Bgzxf_Hu.js";import{R as P}from"./refresh-ccw-DNrXX9gB.js";import{P as E}from"./power-DLjXF7zE.js";import{P as F}from"./power-off-D47cOnG_.js";import{F as R}from"./file-text-yEMkrSoZ.js";function Q(){return e.jsxs(p,{gap:4,"data-testid":"misc-view",children:[e.jsx(w,{title:"Misc",description:"Global search + Tailscale."}),e.jsx(B,{}),e.jsx(N,{})]})}function B(){var i,l,n;const[a,t]=d.useState(""),r=j(`/api/search?q=${encodeURIComponent(a)}`);return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Search"}),e.jsxs(c,{gap:2,align:"center",style:{marginTop:"var(--space-2)"},children:[e.jsx(y,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:a,onChange:s=>t(s.target.value),placeholder:"Search projects / tasks / artifacts / agents…","data-testid":"misc-search-input"})]}),a.trim()===""?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Type a query to search."}):r.loading&&!r.data?e.jsxs(p,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:24}}),e.jsx(g,{style:{height:24}})]}):(((l=(i=r.data)==null?void 0:i.results)==null?void 0:l.length)??0)===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No results."}):e.jsx(p,{gap:1,style:{marginTop:"var(--space-2)"},children:(((n=r.data)==null?void 0:n.results)??[]).slice(0,30).map((s,o)=>e.jsxs("div",{"data-testid":`misc-search-result-${o}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(q,{kind:s.kind}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:s.title||s.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:s.kind}),s.projectId&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s.projectId]})]}),s.snippet&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.snippet})]},o))})]})})}function q({kind:a}){const t=a==="task"?b:a==="agent"?z:a==="project"?k:R;return e.jsx(t,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}})}function N(){var o,u;const a=j("/api/tailscale/status"),[t,r]=d.useState(!1),[i,l]=d.useState(null),n=d.useCallback(()=>{a.refetch()},[a]),s=async m=>{r(!0),l(null);try{await C(m?"/api/tailscale/enable":"/api/tailscale/disable",{method:"POST"}),n()}catch(h){l((h instanceof T,h.message))}finally{r(!1)}};return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsxs(c,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(S,{size:16,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Tailscale"}),a.data&&e.jsx("span",{"data-testid":"misc-tailscale-state",style:{fontSize:"var(--fs-12)",color:a.data.running?"var(--success)":"var(--fg-muted)"},children:a.data.running?`running · ${a.data.hostname??"?"}`:"stopped"})]}),e.jsxs(c,{gap:1,children:[i!==null&&e.jsx("span",{role:"alert","data-testid":"misc-tailscale-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{variant:"ghost",onClick:()=>void n(),"data-testid":"misc-tailscale-refresh",children:[e.jsx(P,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!0),disabled:t,"data-testid":"misc-tailscale-enable",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Enable"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!1),disabled:t,"data-testid":"misc-tailscale-disable",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Disable"]})]})]}),((o=a.data)==null?void 0:o.url)&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx("a",{href:a.data.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-12)",color:"var(--accent)"},children:a.data.url})}),((u=a.data)==null?void 0:u.error)&&e.jsx("span",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:a.data.error})]})})}export{Q as MiscView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiscView-BBcpUbZZ.js","sources":["../../src/web/v8/views/Misc/MiscView.tsx"],"sourcesContent":["/**\n * v8/views/Misc/MiscView.tsx — Sprint S43, v9.3.0.\n *\n * The \"doesn't fit anywhere else\" surface: global fuzzy search\n * (GET /api/search) + Tailscale card (GET /api/tailscale/status,\n * POST /api/tailscale/{enable,disable}).\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Search, Network, Power, PowerOff, RefreshCcw, FileText, CheckSquare, Bot, Folder } 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 { 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 SearchResult {\n kind?: string;\n id?: string;\n title?: string;\n projectId?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface SearchResponse {\n query?: string;\n results?: SearchResult[];\n total?: number;\n}\n\ninterface TailscaleStatus {\n enabled?: boolean;\n running?: boolean;\n hostname?: string;\n url?: string;\n error?: string;\n}\n\nexport function MiscView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"misc-view\">\n <ViewHeader title=\"Misc\" description=\"Global search + Tailscale.\" />\n <SearchPanel />\n <TailscalePanel />\n </Stack>\n );\n}\n\nfunction SearchPanel(): JSX.Element {\n const [q, setQ] = useState<string>('');\n const payload = useFetch<SearchResponse>(`/api/search?q=${encodeURIComponent(q)}`);\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Search</strong>\n <Inline gap={2} align=\"center\" style={{ marginTop: 'var(--space-2)' }}>\n <Search size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <Input value={q} onChange={(e) => setQ((e.target as HTMLInputElement).value)} placeholder=\"Search projects / tasks / artifacts / agents…\" data-testid=\"misc-search-input\" />\n </Inline>\n {q.trim() === '' ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>Type a query to search.</span>\n ) : payload.loading && !payload.data ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 24 }} />\n <Skeleton style={{ height: 24 }} />\n </Stack>\n ) : (payload.data?.results?.length ?? 0) === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>No results.</span>\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {(payload.data?.results ?? []).slice(0, 30).map((r, i) => (\n <div key={i} data-testid={`misc-search-result-${i}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <KindIcon kind={r.kind} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{r.title || r.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{r.kind}</code>\n {r.projectId && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {r.projectId}</span>}\n </Inline>\n {r.snippet && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.snippet}</span>}\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n );\n}\n\nfunction KindIcon({ kind }: { kind?: string }): JSX.Element {\n const Icon = (kind === 'task' ? CheckSquare : kind === 'agent' ? Bot : kind === 'project' ? Folder : FileText) as typeof Folder;\n return <Icon size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />;\n}\n\nfunction TailscalePanel(): JSX.Element {\n const payload = useFetch<TailscaleStatus>('/api/tailscale/status');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const toggle = async (enable: boolean): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(enable ? '/api/tailscale/enable' : '/api/tailscale/disable', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden style={{ color: 'var(--accent)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>Tailscale</strong>\n {payload.data && (\n <span data-testid=\"misc-tailscale-state\" style={{ fontSize: 'var(--fs-12)', color: payload.data.running ? 'var(--success)' : 'var(--fg-muted)' }}>\n {payload.data.running ? `running · ${payload.data.hostname ?? '?'}` : 'stopped'}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"misc-tailscale-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"misc-tailscale-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(true)} disabled={busy} data-testid=\"misc-tailscale-enable\">\n <Power size={14} aria-hidden /> Enable\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(false)} disabled={busy} data-testid=\"misc-tailscale-disable\">\n <PowerOff size={14} aria-hidden /> Disable\n </Button>\n </Inline>\n </Inline>\n {payload.data?.url && (\n <div style={{ marginTop: 'var(--space-2)' }}>\n <a href={payload.data.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-12)', color: 'var(--accent)' }}>{payload.data.url}</a>\n </div>\n )}\n {payload.data?.error && (\n <span role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{payload.data.error}</span>\n )}\n </CardBody>\n </Card>\n );\n}"],"names":["MiscView","jsxs","Stack","jsx","ViewHeader","SearchPanel","TailscalePanel","q","setQ","useState","payload","useFetch","Card","CardBody","Inline","Search","Input","e","Skeleton","_b","_a","r","i","KindIcon","kind","Icon","CheckSquare","Bot","Folder","FileText","busy","setBusy","error","setError","refresh","useCallback","toggle","enable","fetchJson","err","FetchError","Network","Button","RefreshCcw","Power","PowerOff"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MiscView-B8QY82Pm.js","sources":["../../src/web/v8/views/Misc/MiscView.tsx"],"sourcesContent":["/**\n * v8/views/Misc/MiscView.tsx — Sprint S43, v9.3.0.\n *\n * The \"doesn't fit anywhere else\" surface: global fuzzy search\n * (GET /api/search) + Tailscale card (GET /api/tailscale/status,\n * POST /api/tailscale/{enable,disable}).\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Search, Network, Power, PowerOff, RefreshCcw, FileText, CheckSquare, Bot, Folder } 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 { 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 SearchResult {\n kind?: string;\n id?: string;\n title?: string;\n projectId?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface SearchResponse {\n query?: string;\n results?: SearchResult[];\n total?: number;\n}\n\ninterface TailscaleStatus {\n enabled?: boolean;\n running?: boolean;\n hostname?: string;\n url?: string;\n error?: string;\n}\n\nexport function MiscView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"misc-view\">\n <ViewHeader title=\"Misc\" description=\"Global search + Tailscale.\" />\n <SearchPanel />\n <TailscalePanel />\n </Stack>\n );\n}\n\nfunction SearchPanel(): JSX.Element {\n const [q, setQ] = useState<string>('');\n const payload = useFetch<SearchResponse>(`/api/search?q=${encodeURIComponent(q)}`);\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Search</strong>\n <Inline gap={2} align=\"center\" style={{ marginTop: 'var(--space-2)' }}>\n <Search size={14} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <Input value={q} onChange={(e) => setQ((e.target as HTMLInputElement).value)} placeholder=\"Search projects / tasks / artifacts / agents…\" data-testid=\"misc-search-input\" />\n </Inline>\n {q.trim() === '' ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>Type a query to search.</span>\n ) : payload.loading && !payload.data ? (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Skeleton style={{ height: 24 }} />\n <Skeleton style={{ height: 24 }} />\n </Stack>\n ) : (payload.data?.results?.length ?? 0) === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>No results.</span>\n ) : (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)' }}>\n {(payload.data?.results ?? []).slice(0, 30).map((r, i) => (\n <div key={i} data-testid={`misc-search-result-${i}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <KindIcon kind={r.kind} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{r.title || r.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{r.kind}</code>\n {r.projectId && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {r.projectId}</span>}\n </Inline>\n {r.snippet && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.snippet}</span>}\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n );\n}\n\nfunction KindIcon({ kind }: { kind?: string }): JSX.Element {\n const Icon = (kind === 'task' ? CheckSquare : kind === 'agent' ? Bot : kind === 'project' ? Folder : FileText) as typeof Folder;\n return <Icon size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />;\n}\n\nfunction TailscalePanel(): JSX.Element {\n const payload = useFetch<TailscaleStatus>('/api/tailscale/status');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const toggle = async (enable: boolean): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(enable ? '/api/tailscale/enable' : '/api/tailscale/disable', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden style={{ color: 'var(--accent)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>Tailscale</strong>\n {payload.data && (\n <span data-testid=\"misc-tailscale-state\" style={{ fontSize: 'var(--fs-12)', color: payload.data.running ? 'var(--success)' : 'var(--fg-muted)' }}>\n {payload.data.running ? `running · ${payload.data.hostname ?? '?'}` : 'stopped'}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"misc-tailscale-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"misc-tailscale-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(true)} disabled={busy} data-testid=\"misc-tailscale-enable\">\n <Power size={14} aria-hidden /> Enable\n </Button>\n <Button variant=\"ghost\" onClick={() => void toggle(false)} disabled={busy} data-testid=\"misc-tailscale-disable\">\n <PowerOff size={14} aria-hidden /> Disable\n </Button>\n </Inline>\n </Inline>\n {payload.data?.url && (\n <div style={{ marginTop: 'var(--space-2)' }}>\n <a href={payload.data.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-12)', color: 'var(--accent)' }}>{payload.data.url}</a>\n </div>\n )}\n {payload.data?.error && (\n <span role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{payload.data.error}</span>\n )}\n </CardBody>\n </Card>\n );\n}"],"names":["MiscView","jsxs","Stack","jsx","ViewHeader","SearchPanel","TailscalePanel","q","setQ","useState","payload","useFetch","Card","CardBody","Inline","Search","Input","e","Skeleton","_b","_a","r","i","KindIcon","kind","Icon","CheckSquare","Bot","Folder","FileText","busy","setBusy","error","setError","refresh","useCallback","toggle","enable","fetchJson","err","FetchError","Network","Button","RefreshCcw","Power","PowerOff"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as o,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as C,S as c,I as h,d as i,h as z,Y as U,Z as F,i as f,F as m}from"./main-
|
|
1
|
+
import{r as o,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as C,S as c,I as h,d as i,h as z,Y as U,Z as F,i as f,F as m}from"./main-CokHAXWM.js";import{V as L}from"./ViewHeader-BzYZ3m-e.js";import{L as O}from"./ListHeader-TjPJrUfY.js";import{C as w,b as k}from"./Card-B0imhxMk.js";import{I as B}from"./Input-Bgzxf_Hu.js";import{S as V,a as A}from"./Sheet-DnDid58j.js";import{E as $}from"./EmptyState-BjgVOrcO.js";import{R as H}from"./refresh-ccw-DNrXX9gB.js";import{P as W}from"./plus-DENm0hqV.js";import{P as q}from"./power-DLjXF7zE.js";import{P as J}from"./power-off-D47cOnG_.js";import{R as N}from"./rotate-ccw-ObX5awaG.js";import{T as Y}from"./trash-2-DZDjEnNh.js";import{D as I}from"./download-4cEUWue1.js";import{U as Z}from"./upload-DdDljAeV.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|