@polderlabs/bizar 10.1.0 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +31 -10
  2. package/bizar-dash/CONTROL_SURFACES.md +0 -1
  3. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js → ActivityFeed-xXiUCZLB.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityFeed-Da-JCrE6.js.map → ActivityFeed-xXiUCZLB.js.map} +1 -1
  5. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js → ActivityView-nOYhCp3h.js} +1 -1
  6. package/bizar-dash/dist/assets/{ActivityView-nIRsSETb.js.map → ActivityView-nOYhCp3h.js.map} +1 -1
  7. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js → AdminView-Coi4V3sq.js} +1 -1
  8. package/bizar-dash/dist/assets/{AdminView-DP1NMxmG.js.map → AdminView-Coi4V3sq.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js → AgentActivity-nEri4lbx.js} +1 -1
  10. package/bizar-dash/dist/assets/{AgentActivity-lSPkOr-O.js.map → AgentActivity-nEri4lbx.js.map} +1 -1
  11. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js → AgentsView-ByiIJ0ej.js} +3 -3
  12. package/bizar-dash/dist/assets/{AgentsView-BIWGkz7w.js.map → AgentsView-ByiIJ0ej.js.map} +1 -1
  13. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js → Alert-Dg_Vwxh5.js} +1 -1
  14. package/bizar-dash/dist/assets/{Alert-DN0UysMg.js.map → Alert-Dg_Vwxh5.js.map} +1 -1
  15. package/bizar-dash/dist/assets/ArtifactsView-CGclRNnz.js +21 -0
  16. package/bizar-dash/dist/assets/ArtifactsView-CGclRNnz.js.map +1 -0
  17. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js → AuthView-utVm6M3D.js} +1 -1
  18. package/bizar-dash/dist/assets/{AuthView-DW5cs7ma.js.map → AuthView-utVm6M3D.js.map} +1 -1
  19. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js → Avatar-CXDZdKy4.js} +1 -1
  20. package/bizar-dash/dist/assets/{Avatar-DZPv9pvd.js.map → Avatar-CXDZdKy4.js.map} +1 -1
  21. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js → BackgroundJobsView-j603pz6o.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackgroundJobsView-D8O-EyMD.js.map → BackgroundJobsView-j603pz6o.js.map} +1 -1
  23. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js → BackupView-DgvnntTE.js} +1 -1
  24. package/bizar-dash/dist/assets/{BackupView-uwXkhxOV.js.map → BackupView-DgvnntTE.js.map} +1 -1
  25. package/bizar-dash/dist/assets/{Card-Tyboihu7.js → Card-D9019JOD.js} +1 -1
  26. package/bizar-dash/dist/assets/{Card-Tyboihu7.js.map → Card-D9019JOD.js.map} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js → ChatView-C0cTgj5d.js} +1 -1
  28. package/bizar-dash/dist/assets/{ChatView-DRBHzgay.js.map → ChatView-C0cTgj5d.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js → Chip-DQtalZ4y.js} +1 -1
  30. package/bizar-dash/dist/assets/{Chip-BrXIlR9w.js.map → Chip-DQtalZ4y.js.map} +1 -1
  31. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js → ClaudeSessionsView-H3Bqjo6b.js} +1 -1
  32. package/bizar-dash/dist/assets/{ClaudeSessionsView-Ck62jaOr.js.map → ClaudeSessionsView-H3Bqjo6b.js.map} +1 -1
  33. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js → ClipboardView-BAguaKbx.js} +1 -1
  34. package/bizar-dash/dist/assets/{ClipboardView-DfND6xL6.js.map → ClipboardView-BAguaKbx.js.map} +1 -1
  35. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js → ConfigView-DWHJgoe8.js} +1 -1
  36. package/bizar-dash/dist/assets/{ConfigView-DjJmSrOJ.js.map → ConfigView-DWHJgoe8.js.map} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js → DiagnosticsView-oCT624hk.js} +1 -1
  38. package/bizar-dash/dist/assets/{DiagnosticsView-CKgItf0J.js.map → DiagnosticsView-oCT624hk.js.map} +1 -1
  39. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js → DialogsView-CqHNals_.js} +1 -1
  40. package/bizar-dash/dist/assets/{DialogsView-DHYF8dE1.js.map → DialogsView-CqHNals_.js.map} +1 -1
  41. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js → DoctorView-6kfQq_Mx.js} +1 -1
  42. package/bizar-dash/dist/assets/{DoctorView-DDLHrSKk.js.map → DoctorView-6kfQq_Mx.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js → EmptyState-DLmtBX_6.js} +1 -1
  44. package/bizar-dash/dist/assets/{EmptyState-DZ2ouKwd.js.map → EmptyState-DLmtBX_6.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js → EnvVarsView-DySOXlP1.js} +2 -2
  46. package/bizar-dash/dist/assets/{EnvVarsView-D1cx83mB.js.map → EnvVarsView-DySOXlP1.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js → ErrorState-Bump8diE.js} +1 -1
  48. package/bizar-dash/dist/assets/{ErrorState-DwwJ2-Jq.js.map → ErrorState-Bump8diE.js.map} +1 -1
  49. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js → EvalView-FnZ5d93z.js} +1 -1
  50. package/bizar-dash/dist/assets/{EvalView-C9aYixXW.js.map → EvalView-FnZ5d93z.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js → GoalsView-C4m1WnVv.js} +1 -1
  52. package/bizar-dash/dist/assets/{GoalsView-DZa_mGmh.js.map → GoalsView-C4m1WnVv.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js → Grid-dEnoGGws.js} +1 -1
  54. package/bizar-dash/dist/assets/{Grid-CiRyhAgR.js.map → Grid-dEnoGGws.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js → HistoryView-xdRybjZ2.js} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-Dv7aPxJE.js.map → HistoryView-xdRybjZ2.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js → Input-BSa3lh_-.js} +1 -1
  58. package/bizar-dash/dist/assets/{Input-BbFUDQnS.js.map → Input-BSa3lh_-.js.map} +1 -1
  59. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js → LibrariesView-1zR04Eci.js} +1 -1
  60. package/bizar-dash/dist/assets/{LibrariesView-DBQ83TNa.js.map → LibrariesView-1zR04Eci.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js → LightRAGView-PubmA9oL.js} +1 -1
  62. package/bizar-dash/dist/assets/{LightRAGView-JYpE5u9p.js.map → LightRAGView-PubmA9oL.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js → ListHeader-Ak9WJd39.js} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-BGjm11Z0.js.map → ListHeader-Ak9WJd39.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js → MemoryView-DBGpuETw.js} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-CnOP2MvM.js.map → MemoryView-DBGpuETw.js.map} +1 -1
  67. package/bizar-dash/dist/assets/MiscView-DufqBHkX.js +1 -0
  68. package/bizar-dash/dist/assets/{MiscView-BBcpUbZZ.js.map → MiscView-DufqBHkX.js.map} +1 -1
  69. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js → ModsView-DcX6eVU2.js} +2 -2
  70. package/bizar-dash/dist/assets/{ModsView-CU4cAmIz.js.map → ModsView-DcX6eVU2.js.map} +1 -1
  71. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js → NotificationsView-B8IhHRQC.js} +1 -1
  72. package/bizar-dash/dist/assets/{NotificationsView-BYffvthq.js.map → NotificationsView-B8IhHRQC.js.map} +1 -1
  73. package/bizar-dash/dist/assets/ObsidianView-DEuk65zS.js +1 -0
  74. package/bizar-dash/dist/assets/{ObsidianView-D3bI0row.js.map → ObsidianView-DEuk65zS.js.map} +1 -1
  75. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js → OverviewView-CTI2spTd.js} +1 -1
  76. package/bizar-dash/dist/assets/{OverviewView-0tq8f-Y0.js.map → OverviewView-CTI2spTd.js.map} +1 -1
  77. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js → ProgressBar-D3lkz42E.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-B-h60LKA.js.map → ProgressBar-D3lkz42E.js.map} +1 -1
  79. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js → ProjectsView-Du0LzE7A.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-DhX5lzHS.js.map → ProjectsView-Du0LzE7A.js.map} +1 -1
  81. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js → ProvidersView-5bCgXwBo.js} +1 -1
  82. package/bizar-dash/dist/assets/{ProvidersView-CJMX7jm9.js.map → ProvidersView-5bCgXwBo.js.map} +1 -1
  83. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js → SchedulesView-DFHdIz5P.js} +1 -1
  84. package/bizar-dash/dist/assets/{SchedulesView-CcwDQ9Nm.js.map → SchedulesView-DFHdIz5P.js.map} +1 -1
  85. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js → Select-C8EJj4NM.js} +1 -1
  86. package/bizar-dash/dist/assets/{Select-Cw7Qtz2M.js.map → Select-C8EJj4NM.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js → SettingsRow-BdOOmYMD.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-DgsgbPSI.js.map → SettingsRow-BdOOmYMD.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js → SettingsView-CqwQ6Knv.js} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsView-DTAFdKyK.js.map → SettingsView-CqwQ6Knv.js.map} +1 -1
  91. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js → Sheet-Cztsvgse.js} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-DH-WNJ3Y.js.map → Sheet-Cztsvgse.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js → Slider-BexNfF6K.js} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-DXbJuQ7y.js.map → Slider-BexNfF6K.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js → Sparkline-CLZBtvsN.js} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-CYtAn82j.js.map → Sparkline-CLZBtvsN.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js → Switch-B1tiRwNK.js} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-BItGrPqr.js.map → Switch-B1tiRwNK.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js → TasksView-CT0fPlos.js} +1 -1
  100. package/bizar-dash/dist/assets/{TasksView-i5tm6CkX.js.map → TasksView-CT0fPlos.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js → Textarea-D_TPpVMy.js} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-qYDf3yds.js.map → Textarea-D_TPpVMy.js.map} +1 -1
  103. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js → UpdateView-tD2q2OhW.js} +1 -1
  104. package/bizar-dash/dist/assets/{UpdateView-Xln-ej26.js.map → UpdateView-tD2q2OhW.js.map} +1 -1
  105. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js → UsageView-B4BuAFKA.js} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-BGuZSUZ6.js.map → UsageView-B4BuAFKA.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js → ViewHeader-V_SzbUpw.js} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-BqIPVKuG.js.map → ViewHeader-V_SzbUpw.js.map} +1 -1
  109. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js → VoiceView-D3vb5OM2.js} +1 -1
  110. package/bizar-dash/dist/assets/{VoiceView-CWUOCQs_.js.map → VoiceView-D3vb5OM2.js.map} +1 -1
  111. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js → brain-BmfWcitQ.js} +1 -1
  112. package/bizar-dash/dist/assets/{brain-fsBSDl2g.js.map → brain-BmfWcitQ.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js → calendar-VntJUzFB.js} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-DsHTZoCU.js.map → calendar-VntJUzFB.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js → circle-KrQQySeK.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-CqSxqqeJ.js.map → circle-KrQQySeK.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js → circle-alert-CQ9MLygI.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-BsLl001l.js.map → circle-alert-CQ9MLygI.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js → circle-check-COtVgsWw.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-rVKMQmZp.js.map → circle-check-COtVgsWw.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{clock-OuficfgH.js → clock-C0GlM4qp.js} +1 -1
  122. package/bizar-dash/dist/assets/{clock-OuficfgH.js.map → clock-C0GlM4qp.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{download-BdHlstUY.js → download-CW4DmtRe.js} +1 -1
  124. package/bizar-dash/dist/assets/{download-BdHlstUY.js.map → download-CW4DmtRe.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js → external-link-CAOnh_DH.js} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-DA3_VGm-.js.map → external-link-CAOnh_DH.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{file-text-B-g8H227.js → file-text-CS1jB_oV.js} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-B-g8H227.js.map → file-text-CS1jB_oV.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js → filter-DyQbml3L.js} +1 -1
  130. package/bizar-dash/dist/assets/{filter-D9B8s5CG.js.map → filter-DyQbml3L.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js → git-pull-request-Co6gYfba.js} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-ByH0YuVz.js.map → git-pull-request-Co6gYfba.js.map} +1 -1
  133. package/bizar-dash/dist/assets/{main-CdOm1Pj9.js → main-CyAIirBB.js} +28 -33
  134. package/bizar-dash/dist/assets/main-CyAIirBB.js.map +1 -0
  135. package/bizar-dash/dist/assets/network-CDn43Gsj.js +6 -0
  136. package/bizar-dash/dist/assets/network-CDn43Gsj.js.map +1 -0
  137. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js → pause-CKYjSTGX.js} +1 -1
  138. package/bizar-dash/dist/assets/{pause-C9hgd8wX.js.map → pause-CKYjSTGX.js.map} +1 -1
  139. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js → pencil-BUJ2DpWs.js} +1 -1
  140. package/bizar-dash/dist/assets/{pencil-BanqaMw7.js.map → pencil-BUJ2DpWs.js.map} +1 -1
  141. package/bizar-dash/dist/assets/{play-CawUZ02_.js → play-CGxZWqtW.js} +1 -1
  142. package/bizar-dash/dist/assets/{play-CawUZ02_.js.map → play-CGxZWqtW.js.map} +1 -1
  143. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js → plug-CQYGgGSy.js} +1 -1
  144. package/bizar-dash/dist/assets/{plug-Cmv0-T_e.js.map → plug-CQYGgGSy.js.map} +1 -1
  145. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js → plus-fFxt-8z5.js} +1 -1
  146. package/bizar-dash/dist/assets/{plus-M6LYiKX8.js.map → plus-fFxt-8z5.js.map} +1 -1
  147. package/bizar-dash/dist/assets/{power-DP5x_SRF.js → power-Cjgy2KsI.js} +1 -1
  148. package/bizar-dash/dist/assets/{power-DP5x_SRF.js.map → power-Cjgy2KsI.js.map} +1 -1
  149. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js → power-off-B81hLRah.js} +1 -1
  150. package/bizar-dash/dist/assets/{power-off-NOJRLAIs.js.map → power-off-B81hLRah.js.map} +1 -1
  151. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js → refresh-ccw-BCXx86xp.js} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-ccw-CHMprsm5.js.map → refresh-ccw-BCXx86xp.js.map} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js → refresh-cw-COTg1nZo.js} +1 -1
  154. package/bizar-dash/dist/assets/{refresh-cw-1RBqDKgJ.js.map → refresh-cw-COTg1nZo.js.map} +1 -1
  155. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js → rotate-ccw-BZrEVc0Z.js} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-ccw-DJRekBbi.js.map → rotate-ccw-BZrEVc0Z.js.map} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js → rotate-cw-CsTtaLV2.js} +1 -1
  158. package/bizar-dash/dist/assets/{rotate-cw-DHooc0Tx.js.map → rotate-cw-CsTtaLV2.js.map} +1 -1
  159. package/bizar-dash/dist/assets/{save-DQKCKyZK.js → save-DtMTge1F.js} +1 -1
  160. package/bizar-dash/dist/assets/{save-DQKCKyZK.js.map → save-DtMTge1F.js.map} +1 -1
  161. package/bizar-dash/dist/assets/{send-xgy3RAi7.js → send-DyBhyk8t.js} +1 -1
  162. package/bizar-dash/dist/assets/{send-xgy3RAi7.js.map → send-DyBhyk8t.js.map} +1 -1
  163. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js → shield-alert-BPGJlRF8.js} +1 -1
  164. package/bizar-dash/dist/assets/{shield-alert-CWV2F5ab.js.map → shield-alert-BPGJlRF8.js.map} +1 -1
  165. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js → trash-2-2NsyTU8c.js} +1 -1
  166. package/bizar-dash/dist/assets/{trash-2-CL4khSRv.js.map → trash-2-2NsyTU8c.js.map} +1 -1
  167. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js → trending-up-BXwP23VK.js} +1 -1
  168. package/bizar-dash/dist/assets/{trending-up-CSJJhWTS.js.map → trending-up-BXwP23VK.js.map} +1 -1
  169. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js → triangle-alert-DFmQ_RXN.js} +1 -1
  170. package/bizar-dash/dist/assets/{triangle-alert-BPLb7uLt.js.map → triangle-alert-DFmQ_RXN.js.map} +1 -1
  171. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js → upload-Cj-HYRYV.js} +1 -1
  172. package/bizar-dash/dist/assets/{upload-Cww6MvFq.js.map → upload-Cj-HYRYV.js.map} +1 -1
  173. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js → zap-BaOiybcl.js} +1 -1
  174. package/bizar-dash/dist/assets/{zap-DmhVUzRA.js.map → zap-BaOiybcl.js.map} +1 -1
  175. package/bizar-dash/dist/index.html +1 -1
  176. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  177. package/bizar-dash/src/server/api.mjs +11 -0
  178. package/bizar-dash/src/server/artifacts-store.mjs +120 -14
  179. package/bizar-dash/src/server/claude-artifacts.mjs +281 -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/model-router.mjs +55 -0
  184. package/bizar-dash/src/server/routes/model-router.test.mjs +28 -0
  185. package/bizar-dash/src/server/routes/sessions.mjs +80 -0
  186. package/bizar-dash/src/server/routes/update.mjs +48 -21
  187. package/bizar-dash/src/server/sprint.test.mjs +163 -0
  188. package/bizar-dash/src/web/v8/App.tsx +0 -4
  189. package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +0 -17
  190. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +0 -1
  191. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +232 -21
  192. package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +179 -0
  193. package/bizar-dash/src/web/v8/views/Router.tsx +0 -5
  194. package/bizar-dash/tests/_update-test-helpers.mjs +13 -0
  195. package/bizar-dash/tests/update-check.test.mjs +18 -13
  196. package/bizar-dash/tests/update-packages.test.mjs +154 -0
  197. package/bizar-dash/tests/update-run.test.mjs +17 -80
  198. package/cli/banner.mjs +1 -1
  199. package/cli/bin.mjs +8 -1
  200. package/cli/bootstrap.mjs +1 -1
  201. package/cli/commands/claude-cmd.mjs +1 -1
  202. package/cli/commands/deploy/docker.mjs +0 -3
  203. package/cli/install/banner.mjs +67 -0
  204. package/cli/install/banner.test.mjs +39 -0
  205. package/cli/install/index.mjs +32 -0
  206. package/cli/install/index.test.mjs +61 -0
  207. package/cli/install/paths.mjs +80 -0
  208. package/cli/install/paths.test.mjs +77 -0
  209. package/cli/install/plugin.mjs +161 -0
  210. package/cli/install/postinstall.mjs +111 -0
  211. package/cli/install.mjs +13 -600
  212. package/cli/migrate.mjs +157 -0
  213. package/cli/migrate.test.mjs +85 -0
  214. package/cli/provision.mjs +615 -1918
  215. package/cli/provision.test.mjs +1 -1
  216. package/cli/service-controller.test.mjs +0 -1
  217. package/cli/service-env.mjs +0 -1
  218. package/cli/utils.mjs +0 -1
  219. package/install.sh +54 -466
  220. package/package.json +1 -1
  221. package/packages/sdk/dist/agent/cron.d.ts +44 -0
  222. package/packages/sdk/dist/agent/cron.js +79 -0
  223. package/packages/sdk/dist/agent/heartbeat.d.ts +43 -0
  224. package/packages/sdk/dist/agent/heartbeat.js +116 -0
  225. package/packages/sdk/dist/index.d.ts +3 -0
  226. package/packages/sdk/dist/index.js +5 -0
  227. package/packages/sdk/dist/learning/decisions.d.ts +46 -0
  228. package/packages/sdk/dist/learning/decisions.js +132 -0
  229. package/packages/sdk/dist/learning/index.d.ts +8 -0
  230. package/packages/sdk/dist/learning/index.js +8 -0
  231. package/packages/sdk/dist/learning/instincts.d.ts +38 -0
  232. package/packages/sdk/dist/learning/instincts.js +139 -0
  233. package/packages/sdk/dist/mcp/server.js +119 -1
  234. package/packages/sdk/dist/router/agent-model-registry.d.ts +89 -0
  235. package/packages/sdk/dist/router/agent-model-registry.js +144 -0
  236. package/packages/sdk/dist/router/index.d.ts +1 -0
  237. package/packages/sdk/dist/router/index.js +1 -0
  238. package/packages/sdk/package.json +3 -2
  239. package/scripts/audit.mjs +388 -0
  240. package/scripts/audit.test.mjs +149 -0
  241. package/scripts/eval-gate.mjs +134 -0
  242. package/scripts/eval-gate.test.mjs +138 -0
  243. package/scripts/feature-state-machine.mjs +178 -0
  244. package/scripts/feature-state-machine.test.mjs +135 -0
  245. package/scripts/install-curl.sh +17 -0
  246. package/scripts/spec-dedup.test.mjs +124 -0
  247. package/scripts/sprint.mjs +213 -0
  248. package/scripts/worktree-setup.sh +79 -0
  249. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +0 -6
  250. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +0 -1
  251. package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js +0 -11
  252. package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js.map +0 -1
  253. package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js +0 -1
  254. package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js +0 -1
  255. package/bizar-dash/dist/assets/main-CdOm1Pj9.js.map +0 -1
  256. package/bizar-dash/src/web/v8/views/Headroom/HeadroomView.tsx +0 -201
  257. package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +0 -90
  258. package/bizar-dash/tests/v7-archive/mobile-overview.test.tsx +0 -214
  259. package/bizar-dash/tests/v7-archive/mobile-settings.test.tsx +0 -181
  260. package/bizar-dash/tests/v7-archive/navigation/CommandPalette.test.tsx +0 -105
  261. package/bizar-dash/tests/v7-archive/settings-nav.test.tsx +0 -128
  262. package/bizar-dash/tests/v7-archive/views/Overview.test.tsx +0 -413
  263. package/cli/provision-claude.mjs +0 -1176
@@ -0,0 +1,213 @@
1
+ /**
2
+ * scripts/sprint.mjs
3
+ *
4
+ * /sprint <goal-id> — auto-fill a sprint contract from a goal in PROGRESS.md.
5
+ *
6
+ * Usage:
7
+ * node scripts/sprint.mjs <goal-id> [projectRoot]
8
+ *
9
+ * projectRoot defaults to process.cwd().
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
12
+ import { join, dirname } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
16
+
17
+ /** @param {string} goalId @param {string} projectRoot */
18
+ export async function fillSprintContract(goalId, projectRoot = process.cwd()) {
19
+ // 1. Find and read progress-parser.mjs
20
+ const parserPath = join(projectRoot, 'bizar-dash', 'src', 'server', 'progress-parser.mjs');
21
+ let parseProgress;
22
+ try {
23
+ ({ parseProgress } = await import(parserPath));
24
+ } catch {
25
+ throw new Error(`progress-parser.mjs not found at ${parserPath}`);
26
+ }
27
+
28
+ // 2. Read .bizar/PROGRESS.md
29
+ const progressPath = join(projectRoot, '.bizar', 'PROGRESS.md');
30
+ if (!existsSync(progressPath)) {
31
+ throw new Error(`PROGRESS.md not found at ${progressPath}`);
32
+ }
33
+ const progressText = readFileSync(progressPath, 'utf8');
34
+ const { goals } = parseProgress(progressText);
35
+
36
+ // 3. Find the goal
37
+ const goal = goals.find((g) => g.id.toUpperCase() === goalId.toUpperCase());
38
+ if (!goal) {
39
+ const available = goals.map((g) => g.id).join(', ');
40
+ throw new Error(`goal '${goalId}' not found in .bizar/PROGRESS.md. Available: ${available || 'none'}`);
41
+ }
42
+
43
+ // 4. Read template
44
+ const templatePath = join(projectRoot, 'templates', 'sprint-contract.md');
45
+ if (!existsSync(templatePath)) {
46
+ throw new Error(`sprint-contract.md not found at ${templatePath}`);
47
+ }
48
+ const template = readFileSync(templatePath, 'utf8');
49
+
50
+ // 5. Build pre-filled content
51
+ const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
52
+ const unchecked = (text) => text.replace('[x]', '[ ]');
53
+ const checked = (text) => text.replace('[ ]', '[x]');
54
+
55
+ // Split template into lines for section-by-section replacement
56
+ const lines = template.split('\n');
57
+ const out = [];
58
+
59
+ // Section flags
60
+ let inScopeIn = false;
61
+ let inScopeOut = false;
62
+ let inDod = false;
63
+ let inArch = false;
64
+ let inRisk = false;
65
+ let filledFeatureId = false;
66
+ let filledTitle = false;
67
+ let filledOwner = false;
68
+ let filledSprintDate = false;
69
+ let scopeInStarted = false;
70
+
71
+ const completedKRs = goal.keyResults.filter((kr) => kr.done);
72
+ const pendingKRs = goal.keyResults.filter((kr) => !kr.done);
73
+
74
+ for (let i = 0; i < lines.length; i++) {
75
+ const line = lines[i];
76
+
77
+ // Fill Identification section
78
+ if (!filledFeatureId && /Feature ID/.test(line)) {
79
+ out.push(line);
80
+ // Next line is the value row — fill it
81
+ out.push(`- **Feature ID:** ${goal.id}`);
82
+ filledFeatureId = true;
83
+ continue;
84
+ }
85
+ if (!filledTitle && /^\s*- \*\*Title:\*\*/.test(line)) {
86
+ out.push(line.replace('<one-line>', goal.title));
87
+ filledTitle = true;
88
+ continue;
89
+ }
90
+ if (!filledSprintDate && /Sprint date/.test(line)) {
91
+ out.push(line);
92
+ out.push(`- **Sprint date:** ${today}`);
93
+ filledSprintDate = true;
94
+ continue;
95
+ }
96
+ if (!filledOwner && /^\s*- \*\*Owner:\*\*/.test(line)) {
97
+ out.push(line.replace('<agent name or "claude">', goal.owner ?? 'claude'));
98
+ filledOwner = true;
99
+ continue;
100
+ }
101
+
102
+ // Scope (in) — replace placeholder with goal KRs
103
+ if (/^\s*## Scope \(in\)/.test(line)) {
104
+ inScopeIn = true;
105
+ inScopeOut = false;
106
+ inDod = false;
107
+ inArch = false;
108
+ inRisk = false;
109
+ out.push(line);
110
+ continue;
111
+ }
112
+ if (/^\s*## Scope \(out\)/.test(line)) {
113
+ inScopeIn = false;
114
+ inScopeOut = true;
115
+ inDod = false;
116
+ inArch = false;
117
+ inRisk = false;
118
+ out.push(line);
119
+ // Add a blank "not yet defined" placeholder if no scope-out is natural
120
+ out.push('\n- _None defined yet — add items as the sprint evolves_\n');
121
+ continue;
122
+ }
123
+ if (inScopeIn && !scopeInStarted && /^-\s*<item/.test(line)) {
124
+ scopeInStarted = true;
125
+ // Replace placeholder with pending KRs first, then completed
126
+ if (pendingKRs.length > 0) {
127
+ out.push(`- _In progress (${pendingKRs.length}):_`);
128
+ for (const kr of pendingKRs) {
129
+ out.push(`- [ ] ${kr.title}`);
130
+ }
131
+ out.push('');
132
+ }
133
+ if (completedKRs.length > 0) {
134
+ out.push(`- _Done (${completedKRs.length}):_`);
135
+ for (const kr of completedKRs) {
136
+ out.push(`- [x] ${kr.title}`);
137
+ }
138
+ out.push('');
139
+ }
140
+ if (goal.keyResults.length === 0) {
141
+ out.push('- <scope item — add from goal key results>');
142
+ }
143
+ continue;
144
+ }
145
+ if (/^\s*## Definition of Done/.test(line)) {
146
+ inScopeIn = false;
147
+ inScopeOut = false;
148
+ inDod = true;
149
+ inArch = false;
150
+ inRisk = false;
151
+ out.push(line);
152
+ continue;
153
+ }
154
+ // DoD — pre-check all standard items
155
+ if (inDod && /^\s*-\s+\[ \]/.test(line)) {
156
+ out.push(line.replace('[ ]', '[x]'));
157
+ continue;
158
+ }
159
+ // Scope out — skip any remaining placeholders (already handled above)
160
+ if (inScopeOut && /^-\s*<item/.test(line)) {
161
+ continue; // skip placeholder — we added our own above
162
+ }
163
+ if (/^\s*## Architecture/.test(line)) {
164
+ inScopeIn = false;
165
+ inScopeOut = false;
166
+ inDod = false;
167
+ inArch = true;
168
+ inRisk = false;
169
+ }
170
+ if (/^\s*## Risk/.test(line)) {
171
+ inScopeIn = false;
172
+ inScopeOut = false;
173
+ inDod = false;
174
+ inArch = false;
175
+ inRisk = true;
176
+ }
177
+
178
+ out.push(line);
179
+ }
180
+
181
+ const content = out.join('\n');
182
+
183
+ // 6. Write to .bizar/sprints/<goal-id>-<date>.md
184
+ const sprintsDir = join(projectRoot, '.bizar', 'sprints');
185
+ mkdirSync(sprintsDir, { recursive: true });
186
+ const destPath = join(sprintsDir, `${goal.id}-${today}.md`);
187
+
188
+ if (existsSync(destPath)) {
189
+ throw new Error(`Sprint file already exists: ${destPath}\nDelete it or use a different goal.`);
190
+ }
191
+
192
+ writeFileSync(destPath, content, 'utf8');
193
+ return destPath;
194
+ }
195
+
196
+ // ── CLI ─────────────────────────────────────────────────────────────────────
197
+
198
+ if (import.meta.url === `file://${process.argv[1]}`) {
199
+ const goalId = process.argv[2];
200
+ if (!goalId) {
201
+ console.error('Usage: node scripts/sprint.mjs <goal-id> [projectRoot]');
202
+ process.exit(1);
203
+ }
204
+ const projectRoot = process.argv[3] || process.cwd();
205
+ fillSprintContract(goalId, projectRoot)
206
+ .then((path) => {
207
+ console.log(`Sprint contract written: ${path}`);
208
+ })
209
+ .catch((err) => {
210
+ console.error(`Error: ${err.message}`);
211
+ process.exit(1);
212
+ });
213
+ }
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bash
2
+ # scripts/worktree-setup.sh
3
+ #
4
+ # Pillar A — Worktree symlink bootstrap.
5
+ # When a git worktree is added, symlink shared node_modules, dist, .next,
6
+ # and .harness/node_modules from the main worktree so agents don't re-install.
7
+ #
8
+ # Usage:
9
+ # ./scripts/worktree-setup.sh <worktree-path>
10
+ #
11
+ # The worktree path is passed by the EnterWorktree PostToolUse hook.
12
+
13
+ set -euo pipefail
14
+
15
+ WORKTREE_ROOT="${1:-}"
16
+ if [[ -z "$WORKTREE_ROOT" ]]; then
17
+ echo "Usage: $0 <worktree-path>" >&2
18
+ exit 1
19
+ fi
20
+
21
+ # Resolve relative paths and find the main worktree (the git repo root).
22
+ if [[ ! -d "$WORKTREE_ROOT/.git" ]]; then
23
+ echo "error: $WORKTREE_ROOT is not a git worktree" >&2
24
+ exit 1
25
+ fi
26
+
27
+ GIT_ROOT="$(git -C "$WORKTREE_ROOT" rev-parse --show-toplevel 2>/dev/null || echo "")"
28
+ if [[ -z "$GIT_ROOT" ]]; then
29
+ echo "error: could not determine git root for $WORKTREE_ROOT" >&2
30
+ exit 1
31
+ fi
32
+
33
+ # Directories to symlink from main worktree
34
+ LINK_PAIRS=(
35
+ "node_modules:node_modules"
36
+ ".harness/node_modules:.harness/node_modules"
37
+ )
38
+
39
+ # Optional build outputs — only symlink if they exist in the main worktree
40
+ for item in dist .next; do
41
+ if [[ -e "$GIT_ROOT/$item" ]]; then
42
+ LINK_PAIRS+=("$item:$item")
43
+ fi
44
+ done
45
+
46
+ ln_errors=0
47
+ for pair in "${LINK_PAIRS[@]}"; do
48
+ src="${pair%%:*}"
49
+ dst="${pair##*:}"
50
+ src_path="$GIT_ROOT/$src"
51
+ dst_path="$WORKTREE_ROOT/$dst"
52
+
53
+ # If dst already exists (file or directory), skip.
54
+ if [[ -e "$dst_path" ]]; then
55
+ echo "skip: $dst_path already exists"
56
+ continue
57
+ fi
58
+
59
+ # Create parent dir if needed
60
+ dst_parent="$(dirname "$dst_path")"
61
+ mkdir -p "$dst_parent"
62
+
63
+ # Symlink relatively from worktree to main worktree.
64
+ # Use a relative path so it works across machines.
65
+ rel="$(realpath --relative-to="$dst_parent" "$src_path")"
66
+ if ln -s "$rel" "$dst_path"; then
67
+ echo "linked: $dst_path -> $rel"
68
+ else
69
+ echo "error: failed to symlink $dst_path" >&2
70
+ ln_errors=$((ln_errors + 1))
71
+ fi
72
+ done
73
+
74
+ if [[ $ln_errors -gt 0 ]]; then
75
+ echo "warning: $ln_errors symlink(s) failed" >&2
76
+ exit 1
77
+ fi
78
+
79
+ echo "worktree-setup complete"
@@ -1,6 +0,0 @@
1
- import{r as i,j as t}from"./cmdk-DVxytz9i.js";import{c as $,u as S,S as f,I as g,d,h as C,L as E,i as b,F as D}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as A,b as M}from"./Card-Tyboihu7.js";import{I as y}from"./Input-BbFUDQnS.js";import{T}from"./Textarea-qYDf3yds.js";import{S as k,a as z}from"./Sheet-DH-WNJ3Y.js";import{E as F}from"./EmptyState-DZ2ouKwd.js";import{R}from"./refresh-ccw-CHMprsm5.js";import{P as O}from"./plus-M6LYiKX8.js";import{E as P}from"./external-link-DA3_VGm-.js";import{T as I}from"./trash-2-CL4khSRv.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const L=$("FileCode",[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]]);function _(){const r=S("/api/artifacts"),[a,n]=i.useState(null),[j,o]=i.useState(!1),[c,u]=i.useState(null),[m,h]=i.useState(null),x=i.useMemo(()=>{var e;return((e=r.data)==null?void 0:e.artifacts)??[]},[r.data]),p=i.useCallback(()=>{r.refetch()},[r]),v=async e=>{h(null);try{await b(`/api/artifacts/${e}`,{method:"DELETE"}),n(null),c===e&&u(null),p()}catch(l){h((l instanceof D,l.message))}};return t.jsxs(f,{gap:4,"data-testid":"artifacts-view",children:[t.jsx(w,{title:"Artifacts",description:"Generated artifacts (plans, diagrams, canvases).",actions:t.jsxs(g,{align:"center",gap:2,children:[m!==null&&t.jsx("span",{role:"alert","data-testid":"artifacts-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),t.jsxs(d,{variant:"ghost",onClick:()=>void p(),"data-testid":"artifacts-refresh",children:[t.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"artifacts-add",children:[t.jsx(O,{size:14,"aria-hidden":!0})," Add"]})]})}),t.jsx(A,{variant:"default",children:t.jsx(M,{children:r.loading&&x.length===0?t.jsxs(f,{gap:1,children:[t.jsx(C,{style:{height:48}}),t.jsx(C,{style:{height:48}})]}):x.length===0?t.jsx(F,{icon:t.jsx(E,{size:28,"aria-hidden":!0}),title:"No artifacts",description:"Create one to get started."}):t.jsx(f,{gap:1,children:x.map(e=>{const l=a===e.slug;return t.jsxs("div",{"data-testid":`artifact-row-${e.slug}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[t.jsxs(g,{align:"center",justify:"between",gap:2,children:[t.jsxs(f,{gap:0,style:{minWidth:0,flex:1},children:[t.jsxs(g,{align:"center",gap:2,children:[t.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),t.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:e.title||e.slug}),t.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:e.slug}),e.kind&&t.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",e.kind]})]}),e.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.description})]}),t.jsxs(g,{gap:1,children:[t.jsxs(d,{variant:"ghost",onClick:()=>u(s=>s===e.slug?null:e.slug),"data-testid":`artifact-open-${e.slug}`,"aria-label":`Open ${e.slug}`,children:[t.jsx(P,{size:14,"aria-hidden":!0})," Open"]}),t.jsx(d,{variant:"ghost",onClick:()=>n(s=>s===e.slug?null:e.slug),"data-testid":`artifact-delete-${e.slug}`,"aria-label":`Delete ${e.slug}`,children:t.jsx(I,{size:14,"aria-hidden":!0})})]})]}),l&&t.jsxs(g,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(d,{variant:"danger",onClick:()=>void v(e.slug),"data-testid":`artifact-confirm-delete-${e.slug}`,children:"Confirm delete"}),t.jsx(d,{variant:"ghost",onClick:()=>n(null),children:"Cancel"})]})]},e.slug)})})})}),t.jsx(k,{open:j,onOpenChange:o,children:t.jsx(z,{side:"right",title:"Add artifact",description:"Slug + title + initial MDX.",children:t.jsx(V,{onSubmit:async e=>{await b("/api/artifacts",{method:"POST",body:e}),o(!1),p()},onCancel:()=>o(!1)})})}),t.jsx(k,{open:c!==null,onOpenChange:e=>{e||u(null)},children:t.jsx(z,{side:"right",title:c??"",description:"Artifact detail",children:c!==null&&t.jsx(B,{slug:c})})})]})}function V({onSubmit:r,onCancel:a}){const[n,j]=i.useState(""),[o,c]=i.useState(""),[u,m]=i.useState(""),[h,x]=i.useState(""),[p,v]=i.useState(!1),[e,l]=i.useState(null);return t.jsxs(f,{gap:3,style:{padding:"var(--space-4)"},children:[t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Slug"}),t.jsx(y,{value:n,onChange:s=>j(s.target.value),"data-testid":"artifact-form-slug"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),t.jsx(y,{value:o,onChange:s=>c(s.target.value),"data-testid":"artifact-form-title"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),t.jsx(y,{value:u,onChange:s=>m(s.target.value),"data-testid":"artifact-form-description"})]}),t.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Plan MDX"}),t.jsx(T,{value:h,rows:6,onChange:s=>x(s.target.value),"data-testid":"artifact-form-mdx"})]}),e!==null&&t.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:e}),t.jsxs(g,{justify:"end",gap:2,children:[t.jsx(d,{variant:"ghost",onClick:a,children:"Cancel"}),t.jsx(d,{variant:"primary",disabled:p||!n.trim(),"data-testid":"artifact-form-submit",onClick:async()=>{v(!0),l(null);try{await r({slug:n.trim(),title:o.trim()||void 0,description:u.trim()||void 0,planMdx:h||void 0})}catch(s){l((s instanceof D,s.message)),v(!1)}},children:p?"Creating…":"Create"})]})]})}function B({slug:r}){const a=S(`/api/artifacts/${r}`),n=S(`/api/artifacts/${r}/render`);return t.jsx(f,{gap:2,style:{padding:"var(--space-4)"},children:a.loading&&!a.data?t.jsx(C,{style:{height:80}}):a.data?t.jsxs(f,{gap:2,children:[t.jsx("strong",{children:a.data.title||a.data.slug}),a.data.description&&t.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.data.description}),a.data.frontmatter&&t.jsx("div",{"data-testid":`artifact-frontmatter-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:t.jsx("pre",{style:{margin:0,fontSize:"var(--fs-11)",fontFamily:"var(--font-mono)"},children:JSON.stringify(a.data.frontmatter,null,2)})}),a.data.planMdx&&t.jsx("pre",{"data-testid":`artifact-mdx-${r}`,style:{padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-11)",maxHeight:240,overflow:"auto",fontFamily:"var(--font-mono)"},children:a.data.planMdx}),n.data&&t.jsxs("span",{"data-testid":`artifact-render-${r}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Render: ",Array.isArray(n.data.blocks)?`${n.data.blocks.length} blocks`:"no blocks"]})]}):t.jsx("span",{role:"alert",style:{color:"var(--danger)"},children:"Not found"})})}export{_ as ArtifactsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ArtifactsView-CDIhPBAx.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../src/web/v8/views/Artifacts/ArtifactsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * v8/views/Artifacts/ArtifactsView.tsx — Sprint S43, v9.3.0.\n *\n * Artifacts list (GET /api/artifacts) with per-row open-to-detail\n * (right-hand Sheet using GET /api/artifacts/:slug + /render) and\n * inline-confirm Delete (DELETE /api/artifacts/:slug). Add Sheet\n * posts a new artifact (POST /api/artifacts {slug, ...}).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Layers, Plus, Trash2, RefreshCcw, FileCode, ExternalLink } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Artifact {\n slug: string;\n title?: string;\n kind?: string;\n description?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n planMdx?: string;\n frontmatter?: Record<string, unknown>;\n}\n\nexport function ArtifactsView(): JSX.Element {\n const payload = useFetch<{ artifacts: Artifact[] }>('/api/artifacts');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [adding, setAdding] = useState<boolean>(false);\n const [activeSlug, setActiveSlug] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const artifacts = useMemo<Artifact[]>(() => payload.data?.artifacts ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (slug: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/artifacts/${slug}`, { method: 'DELETE' });\n setConfirmDelete(null);\n if (activeSlug === slug) setActiveSlug(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"artifacts-view\">\n <ViewHeader\n title=\"Artifacts\"\n description=\"Generated artifacts (plans, diagrams, canvases).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"artifacts-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"artifacts-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"artifacts-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && artifacts.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : artifacts.length === 0 ? (\n <EmptyState icon={<Layers size={28} aria-hidden />} title=\"No artifacts\" description=\"Create one to get started.\" />\n ) : (\n <Stack gap={1}>\n {artifacts.map((a) => {\n const isConfirming = confirmDelete === a.slug;\n return (\n <div\n key={a.slug}\n data-testid={`artifact-row-${a.slug}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <FileCode size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{a.title || a.slug}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{a.slug}</code>\n {a.kind && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>· {a.kind}</span>}\n </Inline>\n {a.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{a.description}</span>}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setActiveSlug((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-open-${a.slug}`} aria-label={`Open ${a.slug}`}>\n <ExternalLink size={14} aria-hidden /> Open\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === a.slug ? null : a.slug))} data-testid={`artifact-delete-${a.slug}`} aria-label={`Delete ${a.slug}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(a.slug)} data-testid={`artifact-confirm-delete-${a.slug}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add artifact\" description=\"Slug + title + initial MDX.\">\n <AddForm\n onSubmit={async (body) => {\n await fetchJson('/api/artifacts', { method: 'POST', body });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={activeSlug !== null} onOpenChange={(open) => { if (!open) setActiveSlug(null); }}>\n <SheetContent side=\"right\" title={activeSlug ?? ''} description=\"Artifact detail\">\n {activeSlug !== null && <ArtifactDetail slug={activeSlug} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { slug: string; title?: string; description?: string; planMdx?: string; frontmatter?: Record<string, unknown> }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [slug, setSlug] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [description, setDescription] = useState<string>('');\n const [planMdx, setPlanMdx] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Slug</span>\n <Input value={slug} onChange={(e) => setSlug((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-slug\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description</span>\n <Input value={description} onChange={(e) => setDescription((e.target as HTMLInputElement).value)} data-testid=\"artifact-form-description\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Plan MDX</span>\n <Textarea value={planMdx} rows={6} onChange={(e) => setPlanMdx((e.target as HTMLTextAreaElement).value)} data-testid=\"artifact-form-mdx\" />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || !slug.trim()}\n data-testid=\"artifact-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n await onSubmit({ slug: slug.trim(), title: title.trim() || undefined, description: description.trim() || undefined, planMdx: planMdx || undefined });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Creating…' : 'Create'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction ArtifactDetail({ slug }: { slug: string }): JSX.Element {\n const payload = useFetch<Artifact>(`/api/artifacts/${slug}`);\n const renderPayload = useFetch<{ blocks?: unknown[]; frontmatter?: Record<string, unknown> }>(`/api/artifacts/${slug}/render`);\n return (\n <Stack gap={2} style={{ padding: 'var(--space-4)' }}>\n {payload.loading && !payload.data ? (\n <Skeleton style={{ height: 80 }} />\n ) : payload.data ? (\n <Stack gap={2}>\n <strong>{payload.data.title || payload.data.slug}</strong>\n {payload.data.description && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{payload.data.description}</span>}\n {payload.data.frontmatter && (\n <div data-testid={`artifact-frontmatter-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <pre style={{ margin: 0, fontSize: 'var(--fs-11)', fontFamily: 'var(--font-mono)' }}>{JSON.stringify(payload.data.frontmatter, null, 2)}</pre>\n </div>\n )}\n {payload.data.planMdx && (\n <pre data-testid={`artifact-mdx-${slug}`} style={{ padding: 'var(--space-2)', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', fontSize: 'var(--fs-11)', maxHeight: 240, overflow: 'auto', fontFamily: 'var(--font-mono)' }}>{payload.data.planMdx}</pre>\n )}\n {renderPayload.data && (\n <span data-testid={`artifact-render-${slug}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Render: {Array.isArray(renderPayload.data.blocks) ? `${renderPayload.data.blocks.length} blocks` : 'no blocks'}\n </span>\n )}\n </Stack>\n ) : (\n <span role=\"alert\" style={{ color: 'var(--danger)' }}>Not found</span>\n )}\n </Stack>\n );\n}"],"names":["FileCode","createLucideIcon","ArtifactsView","payload","useFetch","confirmDelete","setConfirmDelete","useState","adding","setAdding","activeSlug","setActiveSlug","error","setError","artifacts","useMemo","_a","refresh","useCallback","drop","slug","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","Layers","a","isConfirming","cur","ExternalLink","Trash2","Sheet","SheetContent","AddForm","body","open","ArtifactDetail","onSubmit","onCancel","setSlug","title","setTitle","description","setDescription","planMdx","setPlanMdx","busy","setBusy","Input","e","Textarea","renderPayload"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,11 +0,0 @@
1
- import{r as g,j as a}from"./cmdk-DVxytz9i.js";import{c as C,u as k,S as o,I as m,d as l,h as T,N as B,B as z,i as d,F as c}from"./main-CdOm1Pj9.js";import{G as E}from"./Grid-CiRyhAgR.js";import{V as O}from"./ViewHeader-BqIPVKuG.js";import{C as f,b as u}from"./Card-Tyboihu7.js";import{R as q}from"./refresh-cw-1RBqDKgJ.js";import{P as H}from"./plug-Cmv0-T_e.js";import{P as M}from"./play-CawUZ02_.js";import{R as U}from"./rotate-cw-DHooc0Tx.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const L=C("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/**
7
- * @license lucide-react v0.460.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const V=C("Unplug",[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]]);function X(){var v,j,w,S;const s=k("/api/headroom/status"),h=k("/api/headroom/stats?hours=24"),[r,n]=g.useState(null),[x,i]=g.useState(null);g.useEffect(()=>{const t=setInterval(()=>{s.refetch()},15e3);return()=>clearInterval(t)},[s]);const b=async()=>{n("install"),i(null);try{await d("/api/headroom/install",{method:"POST",body:{force:!1}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},I=async()=>{n("wrap"),i(null);try{await d("/api/headroom/wrap",{method:"POST",body:{port:8787}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},P=async()=>{n("unwrap"),i(null);try{await d("/api/headroom/unwrap",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},R=async()=>{n("start"),i(null);try{await d("/api/headroom/start",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},F=async()=>{n("stop"),i(null);try{await d("/api/headroom/stop",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},e=s.data,y=e&&e.status!=="not-installed",p=(e==null?void 0:e.status)==="running";return a.jsxs(o,{gap:5,"data-testid":"headroom-view",children:[a.jsx(O,{title:"Headroom",description:"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.",actions:a.jsxs(m,{gap:2,align:"center",children:[x!==null&&a.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),a.jsxs(l,{variant:"ghost",onClick:()=>{s.refetch()},"data-testid":"headroom-refresh",children:[a.jsx(q,{size:14,"aria-hidden":!0})," Refresh"]})]})}),a.jsx(f,{variant:"elevated",children:a.jsx(u,{children:s.loading&&!e?a.jsx(T,{style:{height:60}}):a.jsxs(m,{align:"center",justify:"between",gap:3,children:[a.jsxs(o,{gap:1,children:[a.jsxs(m,{align:"center",gap:2,children:[a.jsx(B,{size:16,"aria-hidden":!0}),a.jsx("strong",{children:(e==null?void 0:e.status)??"unknown"}),(e==null?void 0:e.version)&&a.jsxs(z,{tone:"neutral",children:["v",e.version]}),(e==null?void 0:e.port)&&a.jsxs(z,{tone:"info",children:["port ",e.port]})]}),(e==null?void 0:e.message)&&a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.message})]}),a.jsxs(m,{gap:1,wrap:!0,children:[!y&&a.jsxs(l,{variant:"primary",onClick:()=>void b(),disabled:r==="install","data-testid":"headroom-install",children:[a.jsx(H,{size:12,"aria-hidden":!0})," ",r==="install"?"Installing…":"Install"]}),y&&a.jsxs(a.Fragment,{children:[a.jsxs(l,{variant:p?"secondary":"primary",onClick:()=>void(p?F():R()),disabled:r==="start"||r==="stop","data-testid":"headroom-toggle-running",children:[p?a.jsx(L,{size:12,"aria-hidden":!0}):a.jsx(M,{size:12,"aria-hidden":!0}),p?r==="stop"?"Stopping…":"Stop":r==="start"?"Starting…":"Start"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void I(),disabled:r==="wrap","data-testid":"headroom-wrap",children:[a.jsx(U,{size:12,"aria-hidden":!0})," ",r==="wrap"?"Wrapping…":"Wrap Cline"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void P(),disabled:r==="unwrap","data-testid":"headroom-unwrap",children:[a.jsx(V,{size:12,"aria-hidden":!0})," ",r==="unwrap"?"Unwrapping…":"Unwrap"]})]})]})]})})}),a.jsxs(E,{cols:3,children:[a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Requests (24h)"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((v=h.data)==null?void 0:v.requests)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Tokens saved"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((j=h.data)==null?void 0:j.tokensSaved)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Cache hits / misses"}),a.jsxs("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:[((w=h.data)==null?void 0:w.cacheHits)??0," / ",((S=h.data)==null?void 0:S.cacheMisses)??0]})]})})})]})]})}export{X as HeadroomView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeadroomView-CNc-TI7u.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/square.js","../../../node_modules/lucide-react/dist/esm/icons/unplug.js","../../src/web/v8/views/Headroom/HeadroomView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Square = createLucideIcon(\"Square\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n]);\n\nexport { Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Unplug = createLucideIcon(\"Unplug\", [\n [\"path\", { d: \"m19 5 3-3\", key: \"yk6iyv\" }],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\n \"path\",\n { d: \"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z\", key: \"1snsnr\" }\n ]\n]);\n\nexport { Unplug as default };\n//# sourceMappingURL=unplug.js.map\n","import { useEffect, useState } from 'react';\nimport { Network, Play, Square, Plug, Unplug, RotateCw, RefreshCw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * HeadroomView — Sprint S35. Headroom proxy install + lifecycle.\n */\n\ntype Status = 'installed' | 'not-installed' | 'running' | 'stopped';\n\ninterface HeadroomStatus {\n status: Status;\n version?: string;\n port?: number;\n message?: string;\n}\n\ninterface HeadroomStats {\n hours?: number;\n requests?: number;\n tokensSaved?: number;\n cacheHits?: number;\n cacheMisses?: number;\n}\n\nexport function HeadroomView(): JSX.Element {\n const status = useFetch<HeadroomStatus>('/api/headroom/status');\n const stats = useFetch<HeadroomStats>('/api/headroom/stats?hours=24');\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const id = setInterval(() => { void status.refetch(); }, 15_000);\n return () => clearInterval(id);\n }, [status]);\n\n const install = async (): Promise<void> => {\n setBusy('install');\n setError(null);\n try {\n await fetchJson('/api/headroom/install', { method: 'POST', body: { force: false } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const wrap = async (): Promise<void> => {\n setBusy('wrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/wrap', { method: 'POST', body: { port: 8787 } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const unwrap = async (): Promise<void> => {\n setBusy('unwrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/unwrap', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const start = async (): Promise<void> => {\n setBusy('start');\n setError(null);\n try {\n await fetchJson('/api/headroom/start', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const stop = async (): Promise<void> => {\n setBusy('stop');\n setError(null);\n try {\n await fetchJson('/api/headroom/stop', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const s = status.data;\n const isInstalled = s && s.status !== 'not-installed';\n const isRunning = s?.status === 'running';\n\n return (\n <Stack gap={5} data-testid=\"headroom-view\">\n <ViewHeader\n title=\"Headroom\"\n description=\"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => { void status.refetch(); }} data-testid=\"headroom-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"elevated\">\n <CardBody>\n {status.loading && !s ? (\n <Skeleton style={{ height: 60 }} />\n ) : (\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden />\n <strong>{s?.status ?? 'unknown'}</strong>\n {s?.version && <Badge tone=\"neutral\">v{s.version}</Badge>}\n {s?.port && <Badge tone=\"info\">port {s.port}</Badge>}\n </Inline>\n {s?.message && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.message}</span>}\n </Stack>\n <Inline gap={1} wrap={true}>\n {!isInstalled && (\n <Button variant=\"primary\" onClick={() => void install()} disabled={busy === 'install'} data-testid=\"headroom-install\">\n <Plug size={12} aria-hidden /> {busy === 'install' ? 'Installing…' : 'Install'}\n </Button>\n )}\n {isInstalled && (\n <>\n <Button variant={isRunning ? 'secondary' : 'primary'} onClick={() => void (isRunning ? stop() : start())} disabled={busy === 'start' || busy === 'stop'} data-testid=\"headroom-toggle-running\">\n {isRunning ? <Square size={12} aria-hidden /> : <Play size={12} aria-hidden />}\n {isRunning ? (busy === 'stop' ? 'Stopping…' : 'Stop') : (busy === 'start' ? 'Starting…' : 'Start')}\n </Button>\n <Button variant=\"ghost\" onClick={() => void wrap()} disabled={busy === 'wrap'} data-testid=\"headroom-wrap\">\n <RotateCw size={12} aria-hidden /> {busy === 'wrap' ? 'Wrapping…' : 'Wrap Cline'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void unwrap()} disabled={busy === 'unwrap'} data-testid=\"headroom-unwrap\">\n <Unplug size={12} aria-hidden /> {busy === 'unwrap' ? 'Unwrapping…' : 'Unwrap'}\n </Button>\n </>\n )}\n </Inline>\n </Inline>\n )}\n </CardBody>\n </Card>\n\n <Grid cols={3}>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Requests (24h)</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.requests ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Tokens saved</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.tokensSaved ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Cache hits / misses</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>\n {stats.data?.cacheHits ?? 0} / {stats.data?.cacheMisses ?? 0}\n </strong>\n </Stack>\n </CardBody>\n </Card>\n </Grid>\n </Stack>\n );\n}"],"names":["Square","createLucideIcon","Unplug","HeadroomView","status","useFetch","stats","busy","setBusy","useState","error","setError","useEffect","id","install","fetchJson","err","FetchError","wrap","unwrap","start","stop","s","isInstalled","isRunning","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Card","CardBody","Skeleton","Network","Badge","Plug","Fragment","Play","RotateCw","Grid","_a","_b","_c","_d"],"mappings":"6bAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAASC,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,CAChF,CAAC,ECXD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMC,EAASD,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CACE,OACA,CAAE,EAAG,wEAAyE,IAAK,QAAQ,CAC/F,EACE,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,QAAQ,CAAE,EAChD,CAAC,OAAQ,CAAE,EAAG,mBAAoB,IAAK,QAAQ,CAAE,EACjD,CACE,OACA,CAAE,EAAG,sEAAuE,IAAK,QAAQ,CAC7F,CACA,CAAC,ECYM,SAASE,GAA4B,aAC1C,MAAMC,EAASC,EAAyB,sBAAsB,EACxDC,EAAQD,EAAwB,8BAA8B,EAC9D,CAACE,EAAMC,CAAO,EAAIC,EAAAA,SAAwB,IAAI,EAC9C,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAEtDG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAK,YAAY,IAAM,CAAOT,EAAO,QAAA,CAAW,EAAG,IAAM,EAC/D,MAAO,IAAM,cAAcS,CAAE,CAC/B,EAAG,CAACT,CAAM,CAAC,EAEX,MAAMU,EAAU,SAA2B,CACzCN,EAAQ,SAAS,EACjBG,EAAS,IAAI,EACb,GAAI,CACF,MAAMI,EAAU,wBAAyB,CAAE,OAAQ,OAAQ,KAAM,CAAE,MAAO,EAAA,EAAS,EAC9EX,EAAO,QAAA,CACd,OAASY,EAAK,CACZL,GAASK,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACER,EAAQ,IAAI,CACd,CACF,EAEMU,EAAO,SAA2B,CACtCV,EAAQ,MAAM,EACdG,EAAS,IAAI,EACb,GAAI,CACF,MAAMI,EAAU,qBAAsB,CAAE,OAAQ,OAAQ,KAAM,CAAE,KAAM,IAAA,EAAQ,EACzEX,EAAO,QAAA,CACd,OAASY,EAAK,CACZL,GAASK,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACER,EAAQ,IAAI,CACd,CACF,EAEMW,EAAS,SAA2B,CACxCX,EAAQ,QAAQ,EAChBG,EAAS,IAAI,EACb,GAAI,CACF,MAAMI,EAAU,uBAAwB,CAAE,OAAQ,OAAQ,EACrDX,EAAO,QAAA,CACd,OAASY,EAAK,CACZL,GAASK,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACER,EAAQ,IAAI,CACd,CACF,EAEMY,EAAQ,SAA2B,CACvCZ,EAAQ,OAAO,EACfG,EAAS,IAAI,EACb,GAAI,CACF,MAAMI,EAAU,sBAAuB,CAAE,OAAQ,OAAQ,EACpDX,EAAO,QAAA,CACd,OAASY,EAAK,CACZL,GAASK,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACER,EAAQ,IAAI,CACd,CACF,EAEMa,EAAO,SAA2B,CACtCb,EAAQ,MAAM,EACdG,EAAS,IAAI,EACb,GAAI,CACF,MAAMI,EAAU,qBAAsB,CAAE,OAAQ,OAAQ,EACnDX,EAAO,QAAA,CACd,OAASY,EAAK,CACZL,GAASK,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACER,EAAQ,IAAI,CACd,CACF,EAEMc,EAAIlB,EAAO,KACXmB,EAAcD,GAAKA,EAAE,SAAW,gBAChCE,GAAYF,GAAA,YAAAA,EAAG,UAAW,UAEhC,OACEG,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,gBACzB,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACC,MAAM,WACN,YAAY,+FACZ,QACEH,EAAAA,KAACI,EAAA,CAAO,IAAK,EAAG,MAAM,SACnB,SAAA,CAAAnB,IAAU,MAAQiB,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EAAmB,SAAAjB,EAAM,EAC1Ge,EAAAA,KAACK,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,CAAO1B,EAAO,QAAA,CAAW,EAAG,cAAY,mBAC7E,SAAA,CAAAuB,EAAAA,IAACI,EAAA,CAAU,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CAAA,EAIJJ,EAAAA,IAACK,EAAA,CAAK,QAAQ,WACZ,SAAAL,EAAAA,IAACM,GACE,SAAA7B,EAAO,SAAW,CAACkB,EAClBK,EAAAA,IAACO,EAAA,CAAS,MAAO,CAAE,OAAQ,EAAA,CAAG,CAAG,EAEjCT,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAJ,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAACQ,EAAA,CAAQ,KAAM,GAAI,cAAW,GAAC,EAC/BR,EAAAA,IAAC,SAAA,CAAQ,UAAAL,GAAA,YAAAA,EAAG,SAAU,UAAU,GAC/BA,GAAA,YAAAA,EAAG,UAAWG,OAACW,EAAA,CAAM,KAAK,UAAU,SAAA,CAAA,IAAEd,EAAE,OAAA,EAAQ,GAChDA,GAAA,YAAAA,EAAG,OAAQG,OAACW,EAAA,CAAM,KAAK,OAAO,SAAA,CAAA,QAAMd,EAAE,IAAA,CAAA,CAAK,CAAA,EAC9C,GACCA,GAAA,YAAAA,EAAG,UAAWK,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAL,EAAE,OAAA,CAAQ,CAAA,EACjG,EACAG,EAAAA,KAACI,EAAA,CAAO,IAAK,EAAG,KAAM,GACnB,SAAA,CAAA,CAACN,GACAE,EAAAA,KAACK,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAM,KAAKhB,EAAA,EAAW,SAAUP,IAAS,UAAW,cAAY,mBACjG,SAAA,CAAAoB,EAAAA,IAACU,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAAE,IAAE9B,IAAS,UAAY,cAAgB,SAAA,EACvE,EAEDgB,GACCE,EAAAA,KAAAa,WAAA,CACE,SAAA,CAAAb,OAACK,GAAO,QAASN,EAAY,YAAc,UAAW,QAAS,IAAM,KAAMA,EAAYH,IAASD,EAAA,GAAU,SAAUb,IAAS,SAAWA,IAAS,OAAQ,cAAY,0BAClK,SAAA,CAAAiB,EAAYG,EAAAA,IAAC3B,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,EAAK2B,EAAAA,IAACY,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAC3Ef,EAAajB,IAAS,OAAS,YAAc,OAAWA,IAAS,QAAU,YAAc,OAAA,EAC5F,EACAkB,EAAAA,KAACK,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKZ,EAAA,EAAQ,SAAUX,IAAS,OAAQ,cAAY,gBACzF,SAAA,CAAAoB,EAAAA,IAACa,EAAA,CAAS,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEjC,IAAS,OAAS,YAAc,YAAA,EACtE,EACAkB,EAAAA,KAACK,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKX,EAAA,EAAU,SAAUZ,IAAS,SAAU,cAAY,kBAC7F,SAAA,CAAAoB,EAAAA,IAACzB,EAAA,CAAO,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEK,IAAS,SAAW,cAAgB,QAAA,CAAA,CACxE,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EAEJ,EACF,EAEAkB,EAAAA,KAACgB,EAAA,CAAK,KAAM,EACV,SAAA,CAAAd,EAAAA,IAACK,EAAA,CAAK,QAAQ,UACZ,SAAAL,EAAAA,IAACM,GACC,SAAAR,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,gBAAA,CAAc,EACnFA,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,WAAY,mBAAoB,SAAU,cAAA,EAAmB,WAAAe,EAAApC,EAAM,OAAN,YAAAoC,EAAY,WAAY,CAAA,CAAE,CAAA,CAAA,CAC1G,EACF,EACF,EACAf,EAAAA,IAACK,GAAK,QAAQ,UACZ,eAACC,EAAA,CACC,SAAAR,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,cAAA,CAAY,EACjFA,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,WAAY,mBAAoB,SAAU,cAAA,EAAmB,WAAAgB,EAAArC,EAAM,OAAN,YAAAqC,EAAY,cAAe,CAAA,CAAE,CAAA,CAAA,CAC7G,EACF,EACF,EACAhB,EAAAA,IAACK,GAAK,QAAQ,UACZ,eAACC,EAAA,CACC,SAAAR,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,qBAAA,CAAmB,EACxFF,OAAC,UAAO,MAAO,CAAE,WAAY,mBAAoB,SAAU,gBACxD,SAAA,GAAAmB,EAAAtC,EAAM,OAAN,YAAAsC,EAAY,YAAa,EAAE,QAAIC,EAAAvC,EAAM,OAAN,YAAAuC,EAAY,cAAe,CAAA,CAAA,CAC7D,CAAA,CAAA,CACF,EACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0,1]}
@@ -1 +0,0 @@
1
- import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{S as p,u as j,I as c,f as y,h as g,N as S,d as f,E as b,b as z,a1 as k,i as C,F as T}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C as x,b as v}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{R as P}from"./refresh-ccw-CHMprsm5.js";import{P as E}from"./power-DP5x_SRF.js";import{P as F}from"./power-off-NOJRLAIs.js";import{F as R}from"./file-text-B-g8H227.js";function Q(){return e.jsxs(p,{gap:4,"data-testid":"misc-view",children:[e.jsx(w,{title:"Misc",description:"Global search + Tailscale."}),e.jsx(B,{}),e.jsx(N,{})]})}function B(){var i,l,n;const[a,t]=d.useState(""),r=j(`/api/search?q=${encodeURIComponent(a)}`);return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Search"}),e.jsxs(c,{gap:2,align:"center",style:{marginTop:"var(--space-2)"},children:[e.jsx(y,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:a,onChange:s=>t(s.target.value),placeholder:"Search projects / tasks / artifacts / agents…","data-testid":"misc-search-input"})]}),a.trim()===""?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"Type a query to search."}):r.loading&&!r.data?e.jsxs(p,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:24}}),e.jsx(g,{style:{height:24}})]}):(((l=(i=r.data)==null?void 0:i.results)==null?void 0:l.length)??0)===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:"No results."}):e.jsx(p,{gap:1,style:{marginTop:"var(--space-2)"},children:(((n=r.data)==null?void 0:n.results)??[]).slice(0,30).map((s,o)=>e.jsxs("div",{"data-testid":`misc-search-result-${o}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(q,{kind:s.kind}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:s.title||s.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:s.kind}),s.projectId&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",s.projectId]})]}),s.snippet&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s.snippet})]},o))})]})})}function q({kind:a}){const t=a==="task"?b:a==="agent"?z:a==="project"?k:R;return e.jsx(t,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}})}function N(){var o,u;const a=j("/api/tailscale/status"),[t,r]=d.useState(!1),[i,l]=d.useState(null),n=d.useCallback(()=>{a.refetch()},[a]),s=async m=>{r(!0),l(null);try{await C(m?"/api/tailscale/enable":"/api/tailscale/disable",{method:"POST"}),n()}catch(h){l((h instanceof T,h.message))}finally{r(!1)}};return e.jsx(x,{variant:"default",children:e.jsxs(v,{children:[e.jsxs(c,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(S,{size:16,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Tailscale"}),a.data&&e.jsx("span",{"data-testid":"misc-tailscale-state",style:{fontSize:"var(--fs-12)",color:a.data.running?"var(--success)":"var(--fg-muted)"},children:a.data.running?`running · ${a.data.hostname??"?"}`:"stopped"})]}),e.jsxs(c,{gap:1,children:[i!==null&&e.jsx("span",{role:"alert","data-testid":"misc-tailscale-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{variant:"ghost",onClick:()=>void n(),"data-testid":"misc-tailscale-refresh",children:[e.jsx(P,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!0),disabled:t,"data-testid":"misc-tailscale-enable",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Enable"]}),e.jsxs(f,{variant:"ghost",onClick:()=>void s(!1),disabled:t,"data-testid":"misc-tailscale-disable",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Disable"]})]})]}),((o=a.data)==null?void 0:o.url)&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:e.jsx("a",{href:a.data.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-12)",color:"var(--accent)"},children:a.data.url})}),((u=a.data)==null?void 0:u.error)&&e.jsx("span",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:a.data.error})]})})}export{Q as MiscView};
@@ -1 +0,0 @@
1
- import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{u as f,S as l,I as r,d as o,a0 as y,f as F,h as g,i as C,F as S}from"./main-CdOm1Pj9.js";import{V as D}from"./ViewHeader-BqIPVKuG.js";import{C as w,b as z}from"./Card-Tyboihu7.js";import{I}from"./Input-BbFUDQnS.js";import{E as N}from"./EmptyState-DZ2ouKwd.js";import{R as V}from"./refresh-ccw-CHMprsm5.js";import{R as B}from"./rotate-ccw-DJRekBbi.js";import{F as L}from"./file-text-B-g8H227.js";import{T as O}from"./trash-2-CL4khSRv.js";function X(){const t=f("/api/obsidian"),s=f("/api/obsidian/notes"),[k,c]=i.useState(null),[E,v]=i.useState(null),[h,R]=i.useState(""),[j,m]=i.useState(!1),[b,d]=i.useState(null),p=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.notes)??[]},[s.data]),u=i.useCallback(()=>{t.refetch(),s.refetch()},[t,s]),T=async a=>{d(null);try{await C(`/api/obsidian/notes/${a}`,{method:"DELETE"}),c(null),v(null),u()}catch(n){d((n instanceof S,n.message))}},$=async()=>{m(!0),d(null);try{await C("/api/obsidian/index",{method:"POST"}),u()}catch(a){d((a instanceof S,a.message))}finally{m(!1)}};return e.jsxs(l,{gap:4,"data-testid":"obsidian-view",children:[e.jsx(D,{title:"Obsidian",description:"Vault explorer + index. Notes stored as markdown.",actions:e.jsxs(r,{align:"center",gap:2,children:[b!==null&&e.jsx("span",{role:"alert","data-testid":"obsidian-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:b}),e.jsxs(o,{variant:"ghost",onClick:()=>void u(),"data-testid":"obsidian-refresh",children:[e.jsx(V,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(o,{variant:"primary",onClick:()=>void $(),disabled:j,"data-testid":"obsidian-reindex",children:[e.jsx(B,{size:14,"aria-hidden":!0})," ",j?"Indexing…":"Rebuild index"]})]})}),t.data&&e.jsx(w,{variant:"default",children:e.jsx(z,{children:e.jsxs(r,{align:"center",gap:3,children:[e.jsx(y,{size:18,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsxs(l,{gap:0,children:[e.jsx("strong",{children:t.data.exists?`${t.data.noteCount??0} notes`:"No vault"}),t.data.exists&&t.data.vaultDir&&e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.data.vaultDir})]}),t.data.exists&&e.jsxs(r,{align:"center",gap:3,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsxs("span",{children:[(t.data.totalSize??0).toLocaleString()," bytes"]}),t.data.folderCount!==void 0&&e.jsxs("span",{children:["· ",t.data.folderCount," folders"]})]})]})})}),e.jsx(w,{variant:"default",children:e.jsxs(z,{children:[e.jsxs(r,{gap:2,align:"center",children:[e.jsx(F,{size:14,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx(I,{value:h,onChange:a=>R(a.target.value),placeholder:"Filter notes by path…","data-testid":"obsidian-search"})]}),s.loading&&p.length===0?e.jsxs(l,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(g,{style:{height:28}}),e.jsx(g,{style:{height:28}})]}):p.length===0?e.jsx(N,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No notes",description:"Vault is empty or not initialized."}):e.jsx(l,{gap:1,style:{marginTop:"var(--space-2)"},children:p.filter(a=>!h||a.path.toLowerCase().includes(h.toLowerCase())).slice(0,200).map(a=>{const n=k===a.path;return e.jsxs("div",{"data-testid":`obsidian-row-${a.path}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsxs(r,{align:"center",gap:2,children:[e.jsx(L,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("button",{type:"button",onClick:()=>v(x=>x===a.path?null:a.path),"data-testid":`obsidian-view-${a.path}`,style:{background:"transparent",border:"none",color:"var(--fg)",cursor:"pointer",padding:0,fontFamily:"inherit",fontSize:"inherit"},children:e.jsx("code",{children:a.path})}),a.size!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[a.size," B"]})]}),e.jsx(o,{variant:"ghost",onClick:()=>c(x=>x===a.path?null:a.path),"data-testid":`obsidian-delete-${a.path}`,"aria-label":`Delete ${a.path}`,children:e.jsx(O,{size:14,"aria-hidden":!0})})]}),n&&e.jsxs(r,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(o,{variant:"danger",onClick:()=>void T(a.path),"data-testid":`obsidian-confirm-delete-${a.path}`,children:"Confirm delete"}),e.jsx(o,{variant:"ghost",onClick:()=>c(null),children:"Cancel"})]}),E===a.path&&e.jsx(P,{path:a.path})]},a.path)})})]})})]})}function P({path:t}){const s=f(`/api/obsidian/notes/${t}`);return e.jsx("div",{"data-testid":`obsidian-note-view-${t}`,style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)"},children:s.loading&&s.data===null?e.jsx(g,{style:{height:60}}):s.data?e.jsx("pre",{style:{margin:0,fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",color:"var(--fg)"},children:s.data.raw??s.data.body??""}):e.jsx("span",{style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:"Failed to load"})})}export{X as ObsidianView};