@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.
Files changed (223) hide show
  1. package/README.md +0 -2
  2. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js → ActivityFeed-JjmOY2AQ.js} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js.map → ActivityFeed-JjmOY2AQ.js.map} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js → ActivityView-BIIMvGWo.js} +1 -1
  5. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js.map → ActivityView-BIIMvGWo.js.map} +1 -1
  6. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js → AdminView-DRidJtkq.js} +1 -1
  7. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js.map → AdminView-DRidJtkq.js.map} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js → AgentActivity-79l4SBMC.js} +1 -1
  9. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js.map → AgentActivity-79l4SBMC.js.map} +1 -1
  10. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js → AgentsView-0vT4uPSc.js} +1 -1
  11. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js.map → AgentsView-0vT4uPSc.js.map} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js → Alert-CG5q_s75.js} +1 -1
  13. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js.map → Alert-CG5q_s75.js.map} +1 -1
  14. package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js +21 -0
  15. package/bizar-dash/dist/assets/ArtifactsView-DM8ZmpR9.js.map +1 -0
  16. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js → AuthView-BveN94MC.js} +1 -1
  17. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js.map → AuthView-BveN94MC.js.map} +1 -1
  18. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js → Avatar-ulUPIYTd.js} +1 -1
  19. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js.map → Avatar-ulUPIYTd.js.map} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js → BackgroundJobsView-BWErhqFo.js} +1 -1
  21. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js.map → BackgroundJobsView-BWErhqFo.js.map} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js → BackupView-CnBjzG9N.js} +1 -1
  23. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js.map → BackupView-CnBjzG9N.js.map} +1 -1
  24. package/bizar-dash/dist/assets/{Card-Tyboihu7.js → Card-B0imhxMk.js} +1 -1
  25. package/bizar-dash/dist/assets/{Card-Tyboihu7.js.map → Card-B0imhxMk.js.map} +1 -1
  26. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js → ChatView-D6zGytzx.js} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js.map → ChatView-D6zGytzx.js.map} +1 -1
  28. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js → Chip-wwZSGwLE.js} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js.map → Chip-wwZSGwLE.js.map} +1 -1
  30. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js → ClaudeSessionsView-DK1sOLhi.js} +1 -1
  31. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js.map → ClaudeSessionsView-DK1sOLhi.js.map} +1 -1
  32. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js → ClipboardView-CZ2lYPr0.js} +1 -1
  33. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js.map → ClipboardView-CZ2lYPr0.js.map} +1 -1
  34. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js → ConfigView-D-zT9eNA.js} +1 -1
  35. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js.map → ConfigView-D-zT9eNA.js.map} +1 -1
  36. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js → DiagnosticsView-BocV68Lb.js} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js.map → DiagnosticsView-BocV68Lb.js.map} +1 -1
  38. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js → DialogsView-BVjPI5x7.js} +1 -1
  39. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js.map → DialogsView-BVjPI5x7.js.map} +1 -1
  40. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js → DoctorView-84gJcZwM.js} +1 -1
  41. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js.map → DoctorView-84gJcZwM.js.map} +1 -1
  42. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js → EmptyState-BjgVOrcO.js} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js.map → EmptyState-BjgVOrcO.js.map} +1 -1
  44. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js → EnvVarsView-BJ2TEzF7.js} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js.map → EnvVarsView-BJ2TEzF7.js.map} +1 -1
  46. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js → ErrorState-BE3WBFqF.js} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js.map → ErrorState-BE3WBFqF.js.map} +1 -1
  48. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js → EvalView-BJJ2P-kK.js} +1 -1
  49. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js.map → EvalView-BJJ2P-kK.js.map} +1 -1
  50. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js → GoalsView-pwROHApi.js} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js.map → GoalsView-pwROHApi.js.map} +1 -1
  52. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js → Grid-qcvbhx6e.js} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js.map → Grid-qcvbhx6e.js.map} +1 -1
  54. package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js → HeadroomView-D1UiTYbt.js} +1 -1
  55. package/bizar-dash/dist/assets/{HeadroomView-CNc-TI7u.js.map → HeadroomView-D1UiTYbt.js.map} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js → HistoryView-C7SSOLJA.js} +1 -1
  57. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js.map → HistoryView-C7SSOLJA.js.map} +1 -1
  58. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js → Input-Bgzxf_Hu.js} +1 -1
  59. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js.map → Input-Bgzxf_Hu.js.map} +1 -1
  60. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js → LibrariesView-CbFFksox.js} +1 -1
  61. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-CbFFksox.js.map} +1 -1
  62. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js → LightRAGView-BqDrJbRq.js} +1 -1
  63. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-BqDrJbRq.js.map} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js → ListHeader-TjPJrUfY.js} +1 -1
  65. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js.map → ListHeader-TjPJrUfY.js.map} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js → MemoryView-BlTeHLhX.js} +1 -1
  67. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js.map → MemoryView-BlTeHLhX.js.map} +1 -1
  68. package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js → MiscView-B8QY82Pm.js} +1 -1
  69. package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js.map → MiscView-B8QY82Pm.js.map} +1 -1
  70. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js → ModsView-CvW1OWts.js} +1 -1
  71. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js.map → ModsView-CvW1OWts.js.map} +1 -1
  72. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js → NotificationsView-CsBt5U7x.js} +1 -1
  73. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js.map → NotificationsView-CsBt5U7x.js.map} +1 -1
  74. package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js → ObsidianView-BCTejEj2.js} +1 -1
  75. package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js.map → ObsidianView-BCTejEj2.js.map} +1 -1
  76. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js → OverviewView-BsuPxwnB.js} +1 -1
  77. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js.map → OverviewView-BsuPxwnB.js.map} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js → ProgressBar-DlZTETEn.js} +1 -1
  79. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js.map → ProgressBar-DlZTETEn.js.map} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js → ProjectsView-Soxtmpet.js} +1 -1
  81. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js.map → ProjectsView-Soxtmpet.js.map} +1 -1
  82. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js → ProvidersView-DaCEV9pM.js} +1 -1
  83. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js.map → ProvidersView-DaCEV9pM.js.map} +1 -1
  84. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js → SchedulesView-DY2ByBj_.js} +1 -1
  85. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js.map → SchedulesView-DY2ByBj_.js.map} +1 -1
  86. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js → Select-Dbd88_n8.js} +1 -1
  87. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js.map → Select-Dbd88_n8.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js → SettingsRow-CLMNd434.js} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js.map → SettingsRow-CLMNd434.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js → SettingsView-b24oFq9x.js} +1 -1
  91. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js.map → SettingsView-b24oFq9x.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js → Sheet-DnDid58j.js} +1 -1
  93. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js.map → Sheet-DnDid58j.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js → Slider-BJCvKI1I.js} +1 -1
  95. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js.map → Slider-BJCvKI1I.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js → Sparkline-ktqQLdyb.js} +1 -1
  97. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js.map → Sparkline-ktqQLdyb.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js → Switch-CwXfsDii.js} +1 -1
  99. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js.map → Switch-CwXfsDii.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js → TasksView-BHmpzFCf.js} +1 -1
  101. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js.map → TasksView-BHmpzFCf.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js → Textarea-BzIAwSlp.js} +1 -1
  103. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js.map → Textarea-BzIAwSlp.js.map} +1 -1
  104. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js → UpdateView-CSmX9NN0.js} +1 -1
  105. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js.map → UpdateView-CSmX9NN0.js.map} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js → UsageView-COyr_Gfi.js} +1 -1
  107. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js.map → UsageView-COyr_Gfi.js.map} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js → ViewHeader-BzYZ3m-e.js} +1 -1
  109. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js.map → ViewHeader-BzYZ3m-e.js.map} +1 -1
  110. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js → VoiceView-D33_xG5t.js} +1 -1
  111. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js.map → VoiceView-D33_xG5t.js.map} +1 -1
  112. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js → brain-CM-Vls8r.js} +1 -1
  113. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js.map → brain-CM-Vls8r.js.map} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js → calendar-C0lgZk69.js} +1 -1
  115. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js.map → calendar-C0lgZk69.js.map} +1 -1
  116. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js → circle-Bx_hQEBC.js} +1 -1
  117. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js.map → circle-Bx_hQEBC.js.map} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js → circle-alert-DHvsqpw5.js} +1 -1
  119. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js.map → circle-alert-DHvsqpw5.js.map} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js → circle-check-Bx8wmXR9.js} +1 -1
  121. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js.map → circle-check-Bx8wmXR9.js.map} +1 -1
  122. package/bizar-dash/dist/assets/{clock-OuficfgH.js → clock-CejGoecX.js} +1 -1
  123. package/bizar-dash/dist/assets/{clock-OuficfgH.js.map → clock-CejGoecX.js.map} +1 -1
  124. package/bizar-dash/dist/assets/{download-BdHlstUY.js → download-4cEUWue1.js} +1 -1
  125. package/bizar-dash/dist/assets/{download-BdHlstUY.js.map → download-4cEUWue1.js.map} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js → external-link-0NqUhI4i.js} +1 -1
  127. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js.map → external-link-0NqUhI4i.js.map} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-B-g8H227.js → file-text-yEMkrSoZ.js} +1 -1
  129. package/bizar-dash/dist/assets/{file-text-B-g8H227.js.map → file-text-yEMkrSoZ.js.map} +1 -1
  130. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js → filter-BXt60zAS.js} +1 -1
  131. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js.map → filter-BXt60zAS.js.map} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js → git-pull-request-BjG5lNtR.js} +1 -1
  133. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js.map → git-pull-request-BjG5lNtR.js.map} +1 -1
  134. package/bizar-dash/dist/assets/{main-CdOm1Pj9.js → main-CokHAXWM.js} +2 -2
  135. package/bizar-dash/dist/assets/{main-CdOm1Pj9.js.map → main-CokHAXWM.js.map} +1 -1
  136. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js → pause-CAmulU0F.js} +1 -1
  137. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js.map → pause-CAmulU0F.js.map} +1 -1
  138. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js → pencil-eq5IqBmU.js} +1 -1
  139. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js.map → pencil-eq5IqBmU.js.map} +1 -1
  140. package/bizar-dash/dist/assets/{play-CawUZ02_.js → play-BoLrrcBA.js} +1 -1
  141. package/bizar-dash/dist/assets/{play-CawUZ02_.js.map → play-BoLrrcBA.js.map} +1 -1
  142. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js → plug-DBrVM9lK.js} +1 -1
  143. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js.map → plug-DBrVM9lK.js.map} +1 -1
  144. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js → plus-DENm0hqV.js} +1 -1
  145. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js.map → plus-DENm0hqV.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{power-DP5x_SRF.js → power-DLjXF7zE.js} +1 -1
  147. package/bizar-dash/dist/assets/{power-DP5x_SRF.js.map → power-DLjXF7zE.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js → power-off-D47cOnG_.js} +1 -1
  149. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js.map → power-off-D47cOnG_.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js → refresh-ccw-DNrXX9gB.js} +1 -1
  151. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js.map → refresh-ccw-DNrXX9gB.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js → refresh-cw-CoAHDpeS.js} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js.map → refresh-cw-CoAHDpeS.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js → rotate-ccw-ObX5awaG.js} +1 -1
  155. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js.map → rotate-ccw-ObX5awaG.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js → rotate-cw-xpPJw9LP.js} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js.map → rotate-cw-xpPJw9LP.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{save-DQKCKyZK.js → save-D1iKiJJl.js} +1 -1
  159. package/bizar-dash/dist/assets/{save-DQKCKyZK.js.map → save-D1iKiJJl.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{send-xgy3RAi7.js → send-BRcAhZUm.js} +1 -1
  161. package/bizar-dash/dist/assets/{send-xgy3RAi7.js.map → send-BRcAhZUm.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js → shield-alert-C6vEcK-g.js} +1 -1
  163. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js.map → shield-alert-C6vEcK-g.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js → trash-2-DZDjEnNh.js} +1 -1
  165. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js.map → trash-2-DZDjEnNh.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js → trending-up-DMj-AJVf.js} +1 -1
  167. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js.map → trending-up-DMj-AJVf.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js → triangle-alert-_2xe_tl4.js} +1 -1
  169. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js.map → triangle-alert-_2xe_tl4.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js → upload-DdDljAeV.js} +1 -1
  171. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js.map → upload-DdDljAeV.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js → zap-mHsgh0FP.js} +1 -1
  173. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js.map → zap-mHsgh0FP.js.map} +1 -1
  174. package/bizar-dash/dist/index.html +1 -1
  175. package/bizar-dash/skills/headroom/SKILL.md +94 -0
  176. package/bizar-dash/src/server/api.mjs +11 -0
  177. package/bizar-dash/src/server/artifacts-store.mjs +120 -14
  178. package/bizar-dash/src/server/claude-artifacts.mjs +281 -0
  179. package/bizar-dash/src/server/headroom.mjs +649 -0
  180. package/bizar-dash/src/server/routes/artifacts.mjs +42 -6
  181. package/bizar-dash/src/server/routes/audit.mjs +78 -0
  182. package/bizar-dash/src/server/routes/decisions.mjs +78 -0
  183. package/bizar-dash/src/server/routes/headroom.mjs +126 -0
  184. package/bizar-dash/src/server/routes/model-router.mjs +55 -0
  185. package/bizar-dash/src/server/routes/model-router.test.mjs +28 -0
  186. package/bizar-dash/src/server/routes/sessions.mjs +80 -0
  187. package/bizar-dash/src/server/sprint.test.mjs +163 -0
  188. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +232 -21
  189. package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +179 -0
  190. package/bizar-dash/tests/headroom-install.test.mjs +173 -0
  191. package/bizar-dash/tests/headroom-settings.test.mjs +126 -0
  192. package/bizar-dash/tests/headroom-status.test.mjs +117 -0
  193. package/cli/commands/headroom.mjs +204 -0
  194. package/package.json +1 -1
  195. package/packages/sdk/dist/agent/cron.d.ts +44 -0
  196. package/packages/sdk/dist/agent/cron.js +79 -0
  197. package/packages/sdk/dist/agent/heartbeat.d.ts +43 -0
  198. package/packages/sdk/dist/agent/heartbeat.js +116 -0
  199. package/packages/sdk/dist/index.d.ts +3 -0
  200. package/packages/sdk/dist/index.js +5 -0
  201. package/packages/sdk/dist/learning/decisions.d.ts +46 -0
  202. package/packages/sdk/dist/learning/decisions.js +132 -0
  203. package/packages/sdk/dist/learning/index.d.ts +8 -0
  204. package/packages/sdk/dist/learning/index.js +8 -0
  205. package/packages/sdk/dist/learning/instincts.d.ts +38 -0
  206. package/packages/sdk/dist/learning/instincts.js +139 -0
  207. package/packages/sdk/dist/mcp/server.js +119 -1
  208. package/packages/sdk/dist/router/agent-model-registry.d.ts +89 -0
  209. package/packages/sdk/dist/router/agent-model-registry.js +144 -0
  210. package/packages/sdk/dist/router/index.d.ts +1 -0
  211. package/packages/sdk/dist/router/index.js +1 -0
  212. package/packages/sdk/package.json +3 -2
  213. package/scripts/audit.mjs +388 -0
  214. package/scripts/audit.test.mjs +149 -0
  215. package/scripts/eval-gate.mjs +134 -0
  216. package/scripts/eval-gate.test.mjs +138 -0
  217. package/scripts/feature-state-machine.mjs +178 -0
  218. package/scripts/feature-state-machine.test.mjs +135 -0
  219. package/scripts/spec-dedup.test.mjs +124 -0
  220. package/scripts/sprint.mjs +213 -0
  221. package/scripts/worktree-setup.sh +79 -0
  222. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +0 -6
  223. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ /**
2
+ * feature-state-machine.test.mjs — Tests for feature-state-machine.mjs
3
+ *
4
+ * Tests:
5
+ * 1. passing feature with all artifacts → pass
6
+ * 2. missing evidence → fail
7
+ * 3. missing commit → fail
8
+ * 4. audit score < 80 → fail
9
+ * 5. eval pass-rate < 0.9 → fail
10
+ */
11
+
12
+ import { writeFileSync, mkdirSync, rmSync, readFileSync } from "node:fs";
13
+ import { join, dirname } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+
16
+ const __dirname = dirname(fileURLToPath(import.meta.url));
17
+ const ROOT = join(__dirname, "..");
18
+ const SCRIPT = join(__dirname, "feature-state-machine.mjs");
19
+ const EVALS_DIR = join(ROOT, ".harness", "evals");
20
+ const FEATURE_LIST_PATH = join(ROOT, "feature_list.json");
21
+
22
+ await mkdirSync(EVALS_DIR, { recursive: true });
23
+
24
+ /** @param {string[]} args */
25
+ async function runScript(args = []) {
26
+ const proc = Bun.spawn({
27
+ cmd: ["/home/drb0rk/.bun/bin/bun", "run", SCRIPT, ...args],
28
+ cwd: ROOT,
29
+ env: { PATH: "/home/drb0rk/.bun/bin:/usr/bin:/bin" },
30
+ });
31
+ const [stdout, exitCode] = await Promise.all([
32
+ new Response(proc.stdout).text(),
33
+ proc.exited,
34
+ ]);
35
+ return { stdout, stderr: "", exitCode };
36
+ }
37
+
38
+ function withFeatureList(
39
+ /** @type {object[]} */ features,
40
+ /** @type {() => Promise<void>} */ fn
41
+ ) {
42
+ const orig = readFileSync(FEATURE_LIST_PATH, "utf-8");
43
+ writeFileSync(FEATURE_LIST_PATH, JSON.stringify({ features }, null, 2), "utf-8");
44
+ return fn().finally(() => writeFileSync(FEATURE_LIST_PATH, orig, "utf-8"));
45
+ }
46
+
47
+ // ── test 1: passing with all artifacts → pass ──────────────────────────────────
48
+
49
+ await writeFileSync(join(EVALS_DIR, "F-T1.jsonl"), JSON.stringify({ passed: true }) + "\n");
50
+
51
+ await withFeatureList(
52
+ [{ id: "F-T1", behavior: "test feature 1", state: "passing", evidence: "commit abc123", commit: "abc123" }],
53
+ async () => {
54
+ const r = await runScript(["--dry-run"]);
55
+ if (r.exitCode !== 0) {
56
+ console.error("FAIL test_1:", r.stdout);
57
+ process.exit(1);
58
+ }
59
+ console.log("PASS test_1: passing with all artifacts → pass");
60
+ }
61
+ );
62
+
63
+ // ── test 2: missing evidence → fail ───────────────────────────────────────────
64
+
65
+ await writeFileSync(join(EVALS_DIR, "F-T2.jsonl"), JSON.stringify({ passed: true }) + "\n");
66
+
67
+ await withFeatureList(
68
+ [{ id: "F-T2", behavior: "test", state: "passing", evidence: "", commit: "abc123" }],
69
+ async () => {
70
+ const r = await runScript([]);
71
+ if (r.exitCode === 0) {
72
+ console.error("FAIL test_2: expected non-zero for missing evidence");
73
+ process.exit(1);
74
+ }
75
+ console.log("PASS test_2: missing evidence → fail");
76
+ }
77
+ );
78
+
79
+ // ── test 3: missing commit → fail ─────────────────────────────────────────────
80
+
81
+ await writeFileSync(join(EVALS_DIR, "F-T3.jsonl"), JSON.stringify({ passed: true }) + "\n");
82
+
83
+ await withFeatureList(
84
+ [{ id: "F-T3", behavior: "test", state: "passing", evidence: "commit abc", commit: "" }],
85
+ async () => {
86
+ const r = await runScript([]);
87
+ if (r.exitCode === 0) {
88
+ console.error("FAIL test_3: expected non-zero for missing commit");
89
+ process.exit(1);
90
+ }
91
+ console.log("PASS test_3: missing commit → fail");
92
+ }
93
+ );
94
+
95
+ // ── test 4: eval pass-rate < 0.9 → fail ─────────────────────────────────────
96
+
97
+ // 2 passed, 8 failed = 20% rate < 90%
98
+ await writeFileSync(
99
+ join(EVALS_DIR, "F-T4.jsonl"),
100
+ Array.from({ length: 10 }, (_, i) => JSON.stringify({ passed: i < 2 })).join("\n") + "\n"
101
+ );
102
+
103
+ await withFeatureList(
104
+ [{ id: "F-T4", behavior: "test", state: "passing", evidence: "commit abc", commit: "abc123" }],
105
+ async () => {
106
+ const r = await runScript([]);
107
+ if (r.exitCode === 0) {
108
+ console.error("FAIL test_4: expected non-zero for low eval pass-rate");
109
+ process.exit(1);
110
+ }
111
+ console.log("PASS test_4: eval pass-rate 20% < 90% → fail");
112
+ }
113
+ );
114
+
115
+ // ── test 5: audit script absent → lenient pass ─────────────────────────────────
116
+
117
+ await withFeatureList(
118
+ [{ id: "F-T5", behavior: "test", state: "passing", evidence: "commit abc", commit: "abc123" }],
119
+ async () => {
120
+ const r = await runScript(["--dry-run"]);
121
+ if (r.exitCode !== 0) {
122
+ console.error("FAIL test_5: missing audit script should be tolerated (lenient)");
123
+ process.exit(1);
124
+ }
125
+ console.log("PASS test_5: missing audit script tolerated (lenient)");
126
+ }
127
+ );
128
+
129
+ // ── cleanup ───────────────────────────────────────────────────────────────────
130
+
131
+ for (const id of ["F-T1", "F-T2", "F-T3", "F-T4"]) {
132
+ rmSync(join(EVALS_DIR, `${id}.jsonl`), { force: true });
133
+ }
134
+
135
+ console.log("\nAll 5 tests passed.");
@@ -0,0 +1,124 @@
1
+ /**
2
+ * scripts/spec-dedup.test.mjs
3
+ *
4
+ * Pillar B — Tests for spec dedup logic.
5
+ * Parses sample issues, computes similarity, flags dupes.
6
+ */
7
+ import { test } from 'node:test';
8
+ import assert from 'node:assert/strict';
9
+
10
+ /**
11
+ * Tokenize a title into a Set of lowercase words.
12
+ * @param {string} title
13
+ * @returns {Set<string>}
14
+ */
15
+ function tokenize(title) {
16
+ return new Set(
17
+ title
18
+ .toLowerCase()
19
+ .replace(/[^a-z0-9\s]/g, ' ')
20
+ .split(/\s+/)
21
+ .filter(Boolean)
22
+ );
23
+ }
24
+
25
+ /**
26
+ * Compute overlap coefficient between two titles.
27
+ * @param {string} a
28
+ * @param {string} b
29
+ * @returns {number} 0.0 - 1.0
30
+ */
31
+ function similarity(a, b) {
32
+ const setA = tokenize(a);
33
+ const setB = tokenize(b);
34
+ if (setA.size === 0 || setB.size === 0) return 0;
35
+ let intersection = 0;
36
+ for (const word of setA) {
37
+ if (setB.has(word)) intersection++;
38
+ }
39
+ return intersection / Math.min(setA.size, setB.size);
40
+ }
41
+
42
+ /**
43
+ * Check if a new title is a potential duplicate of existing issues.
44
+ * @param {string} newTitle
45
+ * @param {Array<{number: number, title: string, body?: string}>} existingIssues
46
+ * @param {number} threshold — 0.0-1.0
47
+ * @returns {Array<{number: number, title: string, similarity: number}>}
48
+ */
49
+ function findDuplicates(newTitle, existingIssues, threshold = 0.5) {
50
+ const results = [];
51
+ for (const issue of existingIssues) {
52
+ const sim = similarity(newTitle, issue.title);
53
+ if (sim >= threshold) {
54
+ results.push({ number: issue.number, title: issue.title, similarity: sim });
55
+ }
56
+ }
57
+ return results.sort((a, b) => b.similarity - a.similarity);
58
+ }
59
+
60
+ // ── Tests ─────────────────────────────────────────────────────────────────────
61
+
62
+ test('similarity returns 1.0 for identical titles', () => {
63
+ const s = similarity('Add feature X', 'Add feature X');
64
+ assert.equal(s, 1.0);
65
+ });
66
+
67
+ test('similarity returns 0.0 for completely different titles', () => {
68
+ const s = similarity('Add feature X', 'Fix bug Y');
69
+ assert.equal(s, 0.0);
70
+ });
71
+
72
+ test('similarity returns high score for partial overlap', () => {
73
+ const s = similarity('Add OAuth login', 'Add Google OAuth login');
74
+ // intersection: {add, oauth, login} = 3, min size = 3 → 3/3 = 1.0
75
+ assert.equal(s, 1.0);
76
+ });
77
+
78
+ test('similarity handles punctuation and case', () => {
79
+ const s = similarity('Add feature: OAuth!', 'add oauth feature');
80
+ assert.equal(s, 1.0);
81
+ });
82
+
83
+ test('findDuplicates returns empty array when nothing overlaps', () => {
84
+ const issues = [
85
+ { number: 1, title: 'Fix memory leak' },
86
+ { number: 2, title: 'Add dark mode' },
87
+ ];
88
+ const dups = findDuplicates('Improve performance', issues);
89
+ assert.equal(dups.length, 0);
90
+ });
91
+
92
+ test('findDuplicates returns matching issues above threshold', () => {
93
+ const issues = [
94
+ { number: 1, title: 'Fix memory leak in agent startup' },
95
+ { number: 2, title: 'Add dark mode support' },
96
+ { number: 3, title: 'Memory leak in background agents' },
97
+ ];
98
+ const dups = findDuplicates('Fix memory leak in agents', issues, 0.5);
99
+ assert.ok(dups.length >= 1, 'Should find at least one dup');
100
+ const titles = dups.map((d) => d.title);
101
+ assert.ok(titles.some((t) => t.includes('memory')), 'Should match memory issues');
102
+ });
103
+
104
+ test('findDuplicates threshold 0.7 requires near-exact match', () => {
105
+ const issues = [{ number: 1, title: 'Add OAuth login support' }];
106
+ const dups = findDuplicates('Add OAuth login', issues, 0.7);
107
+ assert.equal(dups.length, 1, 'Exact same words should score 1.0');
108
+ });
109
+
110
+ test('findDuplicates returns similarity scores sorted descending', () => {
111
+ const issues = [
112
+ { number: 1, title: 'Memory profiler' },
113
+ { number: 2, title: 'Memory leak detection' },
114
+ { number: 3, title: 'Fix memory issue' },
115
+ ];
116
+ const dups = findDuplicates('Memory profiling', issues, 0.3);
117
+ const scores = dups.map((d) => d.similarity);
118
+ assert.deepEqual(scores, [...scores].sort((a, b) => b - a), 'Should be sorted desc');
119
+ });
120
+
121
+ test('empty existing issues list returns empty duplicates', () => {
122
+ const dups = findDuplicates('Add something', []);
123
+ assert.equal(dups.length, 0);
124
+ });
@@ -0,0 +1,213 @@
1
+ /**
2
+ * scripts/sprint.mjs
3
+ *
4
+ * /sprint <goal-id> — auto-fill a sprint contract from a goal in PROGRESS.md.
5
+ *
6
+ * Usage:
7
+ * node scripts/sprint.mjs <goal-id> [projectRoot]
8
+ *
9
+ * projectRoot defaults to process.cwd().
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
12
+ import { join, dirname } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
16
+
17
+ /** @param {string} goalId @param {string} projectRoot */
18
+ export async function fillSprintContract(goalId, projectRoot = process.cwd()) {
19
+ // 1. Find and read progress-parser.mjs
20
+ const parserPath = join(projectRoot, 'bizar-dash', 'src', 'server', 'progress-parser.mjs');
21
+ let parseProgress;
22
+ try {
23
+ ({ parseProgress } = await import(parserPath));
24
+ } catch {
25
+ throw new Error(`progress-parser.mjs not found at ${parserPath}`);
26
+ }
27
+
28
+ // 2. Read .bizar/PROGRESS.md
29
+ const progressPath = join(projectRoot, '.bizar', 'PROGRESS.md');
30
+ if (!existsSync(progressPath)) {
31
+ throw new Error(`PROGRESS.md not found at ${progressPath}`);
32
+ }
33
+ const progressText = readFileSync(progressPath, 'utf8');
34
+ const { goals } = parseProgress(progressText);
35
+
36
+ // 3. Find the goal
37
+ const goal = goals.find((g) => g.id.toUpperCase() === goalId.toUpperCase());
38
+ if (!goal) {
39
+ const available = goals.map((g) => g.id).join(', ');
40
+ throw new Error(`goal '${goalId}' not found in .bizar/PROGRESS.md. Available: ${available || 'none'}`);
41
+ }
42
+
43
+ // 4. Read template
44
+ const templatePath = join(projectRoot, 'templates', 'sprint-contract.md');
45
+ if (!existsSync(templatePath)) {
46
+ throw new Error(`sprint-contract.md not found at ${templatePath}`);
47
+ }
48
+ const template = readFileSync(templatePath, 'utf8');
49
+
50
+ // 5. Build pre-filled content
51
+ const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
52
+ const unchecked = (text) => text.replace('[x]', '[ ]');
53
+ const checked = (text) => text.replace('[ ]', '[x]');
54
+
55
+ // Split template into lines for section-by-section replacement
56
+ const lines = template.split('\n');
57
+ const out = [];
58
+
59
+ // Section flags
60
+ let inScopeIn = false;
61
+ let inScopeOut = false;
62
+ let inDod = false;
63
+ let inArch = false;
64
+ let inRisk = false;
65
+ let filledFeatureId = false;
66
+ let filledTitle = false;
67
+ let filledOwner = false;
68
+ let filledSprintDate = false;
69
+ let scopeInStarted = false;
70
+
71
+ const completedKRs = goal.keyResults.filter((kr) => kr.done);
72
+ const pendingKRs = goal.keyResults.filter((kr) => !kr.done);
73
+
74
+ for (let i = 0; i < lines.length; i++) {
75
+ const line = lines[i];
76
+
77
+ // Fill Identification section
78
+ if (!filledFeatureId && /Feature ID/.test(line)) {
79
+ out.push(line);
80
+ // Next line is the value row — fill it
81
+ out.push(`- **Feature ID:** ${goal.id}`);
82
+ filledFeatureId = true;
83
+ continue;
84
+ }
85
+ if (!filledTitle && /^\s*- \*\*Title:\*\*/.test(line)) {
86
+ out.push(line.replace('<one-line>', goal.title));
87
+ filledTitle = true;
88
+ continue;
89
+ }
90
+ if (!filledSprintDate && /Sprint date/.test(line)) {
91
+ out.push(line);
92
+ out.push(`- **Sprint date:** ${today}`);
93
+ filledSprintDate = true;
94
+ continue;
95
+ }
96
+ if (!filledOwner && /^\s*- \*\*Owner:\*\*/.test(line)) {
97
+ out.push(line.replace('<agent name or "claude">', goal.owner ?? 'claude'));
98
+ filledOwner = true;
99
+ continue;
100
+ }
101
+
102
+ // Scope (in) — replace placeholder with goal KRs
103
+ if (/^\s*## Scope \(in\)/.test(line)) {
104
+ inScopeIn = true;
105
+ inScopeOut = false;
106
+ inDod = false;
107
+ inArch = false;
108
+ inRisk = false;
109
+ out.push(line);
110
+ continue;
111
+ }
112
+ if (/^\s*## Scope \(out\)/.test(line)) {
113
+ inScopeIn = false;
114
+ inScopeOut = true;
115
+ inDod = false;
116
+ inArch = false;
117
+ inRisk = false;
118
+ out.push(line);
119
+ // Add a blank "not yet defined" placeholder if no scope-out is natural
120
+ out.push('\n- _None defined yet — add items as the sprint evolves_\n');
121
+ continue;
122
+ }
123
+ if (inScopeIn && !scopeInStarted && /^-\s*<item/.test(line)) {
124
+ scopeInStarted = true;
125
+ // Replace placeholder with pending KRs first, then completed
126
+ if (pendingKRs.length > 0) {
127
+ out.push(`- _In progress (${pendingKRs.length}):_`);
128
+ for (const kr of pendingKRs) {
129
+ out.push(`- [ ] ${kr.title}`);
130
+ }
131
+ out.push('');
132
+ }
133
+ if (completedKRs.length > 0) {
134
+ out.push(`- _Done (${completedKRs.length}):_`);
135
+ for (const kr of completedKRs) {
136
+ out.push(`- [x] ${kr.title}`);
137
+ }
138
+ out.push('');
139
+ }
140
+ if (goal.keyResults.length === 0) {
141
+ out.push('- <scope item — add from goal key results>');
142
+ }
143
+ continue;
144
+ }
145
+ if (/^\s*## Definition of Done/.test(line)) {
146
+ inScopeIn = false;
147
+ inScopeOut = false;
148
+ inDod = true;
149
+ inArch = false;
150
+ inRisk = false;
151
+ out.push(line);
152
+ continue;
153
+ }
154
+ // DoD — pre-check all standard items
155
+ if (inDod && /^\s*-\s+\[ \]/.test(line)) {
156
+ out.push(line.replace('[ ]', '[x]'));
157
+ continue;
158
+ }
159
+ // Scope out — skip any remaining placeholders (already handled above)
160
+ if (inScopeOut && /^-\s*<item/.test(line)) {
161
+ continue; // skip placeholder — we added our own above
162
+ }
163
+ if (/^\s*## Architecture/.test(line)) {
164
+ inScopeIn = false;
165
+ inScopeOut = false;
166
+ inDod = false;
167
+ inArch = true;
168
+ inRisk = false;
169
+ }
170
+ if (/^\s*## Risk/.test(line)) {
171
+ inScopeIn = false;
172
+ inScopeOut = false;
173
+ inDod = false;
174
+ inArch = false;
175
+ inRisk = true;
176
+ }
177
+
178
+ out.push(line);
179
+ }
180
+
181
+ const content = out.join('\n');
182
+
183
+ // 6. Write to .bizar/sprints/<goal-id>-<date>.md
184
+ const sprintsDir = join(projectRoot, '.bizar', 'sprints');
185
+ mkdirSync(sprintsDir, { recursive: true });
186
+ const destPath = join(sprintsDir, `${goal.id}-${today}.md`);
187
+
188
+ if (existsSync(destPath)) {
189
+ throw new Error(`Sprint file already exists: ${destPath}\nDelete it or use a different goal.`);
190
+ }
191
+
192
+ writeFileSync(destPath, content, 'utf8');
193
+ return destPath;
194
+ }
195
+
196
+ // ── CLI ─────────────────────────────────────────────────────────────────────
197
+
198
+ if (import.meta.url === `file://${process.argv[1]}`) {
199
+ const goalId = process.argv[2];
200
+ if (!goalId) {
201
+ console.error('Usage: node scripts/sprint.mjs <goal-id> [projectRoot]');
202
+ process.exit(1);
203
+ }
204
+ const projectRoot = process.argv[3] || process.cwd();
205
+ fillSprintContract(goalId, projectRoot)
206
+ .then((path) => {
207
+ console.log(`Sprint contract written: ${path}`);
208
+ })
209
+ .catch((err) => {
210
+ console.error(`Error: ${err.message}`);
211
+ process.exit(1);
212
+ });
213
+ }
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bash
2
+ # scripts/worktree-setup.sh
3
+ #
4
+ # Pillar A — Worktree symlink bootstrap.
5
+ # When a git worktree is added, symlink shared node_modules, dist, .next,
6
+ # and .harness/node_modules from the main worktree so agents don't re-install.
7
+ #
8
+ # Usage:
9
+ # ./scripts/worktree-setup.sh <worktree-path>
10
+ #
11
+ # The worktree path is passed by the EnterWorktree PostToolUse hook.
12
+
13
+ set -euo pipefail
14
+
15
+ WORKTREE_ROOT="${1:-}"
16
+ if [[ -z "$WORKTREE_ROOT" ]]; then
17
+ echo "Usage: $0 <worktree-path>" >&2
18
+ exit 1
19
+ fi
20
+
21
+ # Resolve relative paths and find the main worktree (the git repo root).
22
+ if [[ ! -d "$WORKTREE_ROOT/.git" ]]; then
23
+ echo "error: $WORKTREE_ROOT is not a git worktree" >&2
24
+ exit 1
25
+ fi
26
+
27
+ GIT_ROOT="$(git -C "$WORKTREE_ROOT" rev-parse --show-toplevel 2>/dev/null || echo "")"
28
+ if [[ -z "$GIT_ROOT" ]]; then
29
+ echo "error: could not determine git root for $WORKTREE_ROOT" >&2
30
+ exit 1
31
+ fi
32
+
33
+ # Directories to symlink from main worktree
34
+ LINK_PAIRS=(
35
+ "node_modules:node_modules"
36
+ ".harness/node_modules:.harness/node_modules"
37
+ )
38
+
39
+ # Optional build outputs — only symlink if they exist in the main worktree
40
+ for item in dist .next; do
41
+ if [[ -e "$GIT_ROOT/$item" ]]; then
42
+ LINK_PAIRS+=("$item:$item")
43
+ fi
44
+ done
45
+
46
+ ln_errors=0
47
+ for pair in "${LINK_PAIRS[@]}"; do
48
+ src="${pair%%:*}"
49
+ dst="${pair##*:}"
50
+ src_path="$GIT_ROOT/$src"
51
+ dst_path="$WORKTREE_ROOT/$dst"
52
+
53
+ # If dst already exists (file or directory), skip.
54
+ if [[ -e "$dst_path" ]]; then
55
+ echo "skip: $dst_path already exists"
56
+ continue
57
+ fi
58
+
59
+ # Create parent dir if needed
60
+ dst_parent="$(dirname "$dst_path")"
61
+ mkdir -p "$dst_parent"
62
+
63
+ # Symlink relatively from worktree to main worktree.
64
+ # Use a relative path so it works across machines.
65
+ rel="$(realpath --relative-to="$dst_parent" "$src_path")"
66
+ if ln -s "$rel" "$dst_path"; then
67
+ echo "linked: $dst_path -> $rel"
68
+ else
69
+ echo "error: failed to symlink $dst_path" >&2
70
+ ln_errors=$((ln_errors + 1))
71
+ fi
72
+ done
73
+
74
+ if [[ $ln_errors -gt 0 ]]; then
75
+ echo "warning: $ln_errors symlink(s) failed" >&2
76
+ exit 1
77
+ fi
78
+
79
+ echo "worktree-setup complete"
@@ -1,6 +0,0 @@
1
- import{r as i,j as t}from"./cmdk-DVxytz9i.js";import{c as $,u as S,S as f,I as g,d,h as C,L as E,i as b,F as D}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as A,b as M}from"./Card-Tyboihu7.js";import{I as y}from"./Input-BbFUDQnS.js";import{T}from"./Textarea-qYDf3yds.js";import{S as k,a as z}from"./Sheet-DH-WNJ3Y.js";import{E as F}from"./EmptyState-DZ2ouKwd.js";import{R}from"./refresh-ccw-CHMprsm5.js";import{P as O}from"./plus-M6LYiKX8.js";import{E as P}from"./external-link-DA3_VGm-.js";import{T as I}from"./trash-2-CL4khSRv.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const L=$("FileCode",[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]]);function _(){const r=S("/api/artifacts"),[a,n]=i.useState(null),[j,o]=i.useState(!1),[c,u]=i.useState(null),[m,h]=i.useState(null),x=i.useMemo(()=>{var e;return((e=r.data)==null?void 0:e.artifacts)??[]},[r.data]),p=i.useCallback(()=>{r.refetch()},[r]),v=async e=>{h(null);try{await b(`/api/artifacts/${e}`,{method:"DELETE"}),n(null),c===e&&u(null),p()}catch(l){h((l instanceof D,l.message))}};return t.jsxs(f,{gap:4,"data-testid":"artifacts-view",children:[t.jsx(w,{title:"Artifacts",description:"Generated artifacts (plans, diagrams, canvases).",actions:t.jsxs(g,{align:"center",gap:2,children:[m!==null&&t.jsx("span",{role:"alert","data-testid":"artifacts-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),t.jsxs(d,{variant:"ghost",onClick:()=>void p(),"data-testid":"artifacts-refresh",children:[t.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"artifacts-add",children:[t.jsx(O,{size:14,"aria-hidden":!0})," Add"]})]})}),t.jsx(A,{variant:"default",children:t.jsx(M,{children:r.loading&&x.length===0?t.jsxs(f,{gap:1,children:[t.jsx(C,{style:{height:48}}),t.jsx(C,{style:{height:48}})]}):x.length===0?t.jsx(F,{icon:t.jsx(E,{size:28,"aria-hidden":!0}),title:"No artifacts",description:"Create one to get started."}):t.jsx(f,{gap:1,children:x.map(e=>{const l=a===e.slug;return t.jsxs("div",{"data-testid":`artifact-row-${e.slug}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[t.jsxs(g,{align:"center",justify:"between",gap:2,children:[t.jsxs(f,{gap:0,style:{minWidth:0,flex:1},children:[t.jsxs(g,{align:"center",gap:2,children:[t.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.slug}),t.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.slug}),e.kind&&t.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",e.kind]})]}),e.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.description})]}),t.jsxs(g,{gap:1,children:[t.jsxs(d,{variant:"ghost",onClick:()=>u(s=>s===e.slug?null:e.slug),"data-testid":`artifact-open-${e.slug}`,"aria-label":`Open ${e.slug}`,children:[t.jsx(P,{size:14,"aria-hidden":!0})," Open"]}),t.jsx(d,{variant:"ghost",onClick:()=>n(s=>s===e.slug?null:e.slug),"data-testid":`artifact-delete-${e.slug}`,"aria-label":`Delete ${e.slug}`,children:t.jsx(I,{size:14,"aria-hidden":!0})})]})]}),l&&t.jsxs(g,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(d,{variant:"danger",onClick:()=>void v(e.slug),"data-testid":`artifact-confirm-delete-${e.slug}`,children:"Confirm delete"}),t.jsx(d,{variant:"ghost",onClick:()=>n(null),children:"Cancel"})]})]},e.slug)})})})}),t.jsx(k,{open:j,onOpenChange:o,children:t.jsx(z,{side:"right",title:"Add artifact",description:"Slug + title + initial MDX.",children:t.jsx(V,{onSubmit:async e=>{await b("/api/artifacts",{method:"POST",body:e}),o(!1),p()},onCancel:()=>o(!1)})})}),t.jsx(k,{open:c!==null,onOpenChange:e=>{e||u(null)},children:t.jsx(z,{side:"right",title:c??"",description:"Artifact detail",children:c!==null&&t.jsx(B,{slug:c})})})]})}function V({onSubmit:r,onCancel:a}){const[n,j]=i.useState(""),[o,c]=i.useState(""),[u,m]=i.useState(""),[h,x]=i.useState(""),[p,v]=i.useState(!1),[e,l]=i.useState(null);return t.jsxs(f,{gap:3,style:{padding:"var(--space-4)"},children:[t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Slug"}),t.jsx(y,{value:n,onChange:s=>j(s.target.value),"data-testid":"artifact-form-slug"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),t.jsx(y,{value:o,onChange:s=>c(s.target.value),"data-testid":"artifact-form-title"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),t.jsx(y,{value:u,onChange:s=>m(s.target.value),"data-testid":"artifact-form-description"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Plan MDX"}),t.jsx(T,{value:h,rows:6,onChange:s=>x(s.target.value),"data-testid":"artifact-form-mdx"})]}),e!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:e}),t.jsxs(g,{justify:"end",gap:2,children:[t.jsx(d,{variant:"ghost",onClick:a,children:"Cancel"}),t.jsx(d,{variant:"primary",disabled:p||!n.trim(),"data-testid":"artifact-form-submit",onClick:async()=>{v(!0),l(null);try{await r({slug:n.trim(),title:o.trim()||void 0,description:u.trim()||void 0,planMdx:h||void 0})}catch(s){l((s instanceof D,s.message)),v(!1)}},children:p?"Creating…":"Create"})]})]})}function B({slug:r}){const a=S(`/api/artifacts/${r}`),n=S(`/api/artifacts/${r}/render`);return t.jsx(f,{gap:2,style:{padding:"var(--space-4)"},children:a.loading&&!a.data?t.jsx(C,{style:{height:80}}):a.data?t.jsxs(f,{gap:2,children:[t.jsx("strong",{children:a.data.title||a.data.slug}),a.data.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.data.description}),a.data.frontmatter&&t.jsx("div",{"data-testid":`artifact-frontmatter-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:t.jsx("pre",{style:{margin:0,fontSize:"var(--fs-11)",fontFamily:"var(--font-mono)"},children:JSON.stringify(a.data.frontmatter,null,2)})}),a.data.planMdx&&t.jsx("pre",{"data-testid":`artifact-mdx-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-11)",maxHeight:240,overflow:"auto",fontFamily:"var(--font-mono)"},children:a.data.planMdx}),n.data&&t.jsxs("span",{"data-testid":`artifact-render-${r}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Render: ",Array.isArray(n.data.blocks)?`${n.data.blocks.length} blocks`:"no blocks"]})]}):t.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"Not found"})})}export{_ as ArtifactsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ArtifactsView-CDIhPBAx.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ArtifactsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0.\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, ...}).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: string;\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Create one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + title + initial MDX.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; planMdx?: string; frontmatter?: Record<string, unknown> }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [planMdx, setPlanMdx] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Plan MDX</span>\n <Textarea value={planMdx} rows={6} onChange={(e) => setPlanMdx((e.target as HTMLTextAreaElement).value)} data-testid=\"artifact-form-mdx\" />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n await onSubmit({ slug: slug.trim(), title: title.trim() || undefined, description: description.trim() || undefined, planMdx: planMdx || undefined });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction ArtifactDetail({ slug }: { slug: string }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<{ blocks?: unknown[]; frontmatter?: Record<string, unknown> }>(`/api/artifacts/${slug}/render`);\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n {payload.data.frontmatter && (\n <div data-testid={`artifact-frontmatter-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <pre style={{ margin: 0, fontSize: 'var(--fs-11)', fontFamily: 'var(--font-mono)' }}>{JSON.stringify(payload.data.frontmatter, null, 2)}</pre>\n </div>\n )}\n {payload.data.planMdx && (\n <pre data-testid={`artifact-mdx-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', fontSize: 'var(--fs-11)', maxHeight: 240, overflow: 'auto', fontFamily: 'var(--font-mono)' }}>{payload.data.planMdx}</pre>\n )}\n {renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ArtifactsView","payload","useFetch","confirmDelete","setConfirmDelete","useState","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","slug","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","Layers","a","isConfirming","cur","ExternalLink","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","planMdx","setPlanMdx","busy","setBusy","Input","e","Textarea","renderPayload"],"mappings":"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","x_google_ignoreList":[0]}