@polderlabs/bizar 10.4.3 → 10.4.4

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 (228) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js → ActivityFeed-RQeyFifx.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js.map → ActivityFeed-RQeyFifx.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js → ActivityView-CibyssPM.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js.map → ActivityView-CibyssPM.js.map} +1 -1
  5. package/bizar-dash/dist/assets/AdminView-BjczABeB.js +11 -0
  6. package/bizar-dash/dist/assets/AdminView-BjczABeB.js.map +1 -0
  7. package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js → AgentActivity-Bywt1twv.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js.map → AgentActivity-Bywt1twv.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{AgentsView-CIQkZH8_.js → AgentsView-BnOjjM74.js} +4 -4
  10. package/bizar-dash/dist/assets/AgentsView-BnOjjM74.js.map +1 -0
  11. package/bizar-dash/dist/assets/{Alert-MwVEymjy.js → Alert-BZGk39mB.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-MwVEymjy.js.map → Alert-BZGk39mB.js.map} +1 -1
  13. package/bizar-dash/dist/assets/{ArtifactsView-B-YUwZyb.js → ArtifactsView-CfYB1le1.js} +3 -3
  14. package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +1 -0
  15. package/bizar-dash/dist/assets/{AuthView-LaQuGo4u.js → AuthView-D4frSShw.js} +1 -1
  16. package/bizar-dash/dist/assets/{AuthView-LaQuGo4u.js.map → AuthView-D4frSShw.js.map} +1 -1
  17. package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js +6 -0
  18. package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js.map +1 -0
  19. package/bizar-dash/dist/assets/{BackgroundJobsView-CO3DEG8R.js → BackgroundJobsView-DEStvILz.js} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-CO3DEG8R.js.map → BackgroundJobsView-DEStvILz.js.map} +1 -1
  21. package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js → BackupView-B875KQa4.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js.map → BackupView-B875KQa4.js.map} +1 -1
  23. package/bizar-dash/dist/assets/Banner-C8HEcT5l.js +1 -0
  24. package/bizar-dash/dist/assets/Banner-C8HEcT5l.js.map +1 -0
  25. package/bizar-dash/dist/assets/{Card-BmXiT4c6.js → Card-BtsmkhJa.js} +1 -1
  26. package/bizar-dash/dist/assets/{Card-BmXiT4c6.js.map → Card-BtsmkhJa.js.map} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js → ChatView-CkNS0SD8.js} +3 -3
  28. package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js.map → ChatView-CkNS0SD8.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-Dei66BLx.js → Chip-XPOk0d_E.js} +1 -1
  30. package/bizar-dash/dist/assets/{Chip-Dei66BLx.js.map → Chip-XPOk0d_E.js.map} +1 -1
  31. package/bizar-dash/dist/assets/{ClaudeSessionsView-D-YNmzKi.js → ClaudeSessionsView-BprGo67K.js} +1 -1
  32. package/bizar-dash/dist/assets/{ClaudeSessionsView-D-YNmzKi.js.map → ClaudeSessionsView-BprGo67K.js.map} +1 -1
  33. package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +1 -0
  34. package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js.map +1 -0
  35. package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js → ConfigView-BntUrW7s.js} +1 -1
  36. package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js.map → ConfigView-BntUrW7s.js.map} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js → DiagnosticsView-4x0Zu3yP.js} +1 -1
  38. package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js.map → DiagnosticsView-4x0Zu3yP.js.map} +1 -1
  39. package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js +6 -0
  40. package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js.map +1 -0
  41. package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js → DoctorView-DepBdQGR.js} +2 -2
  42. package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js.map → DoctorView-DepBdQGR.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js → EmptyState-DjKtY1Qi.js} +1 -1
  44. package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js.map → EmptyState-DjKtY1Qi.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js → EnvVarsView-S4Pbm128.js} +3 -3
  46. package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js.map → EnvVarsView-S4Pbm128.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js → ErrorState-CBJbEQ8B.js} +1 -1
  48. package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js.map → ErrorState-CBJbEQ8B.js.map} +1 -1
  49. package/bizar-dash/dist/assets/EvalView-BeAyMCD1.js +1 -0
  50. package/bizar-dash/dist/assets/{EvalView-lgUhlGJh.js.map → EvalView-BeAyMCD1.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js → GoalsView-BZr8In4c.js} +1 -1
  52. package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js.map → GoalsView-BZr8In4c.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-BThCPJaV.js → Grid--WKvqu5h.js} +1 -1
  54. package/bizar-dash/dist/assets/{Grid-BThCPJaV.js.map → Grid--WKvqu5h.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js → HistoryView-djEbzqtk.js} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js.map → HistoryView-djEbzqtk.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{Input-cAQOvR8U.js → Input-h_nSOtwm.js} +1 -1
  58. package/bizar-dash/dist/assets/{Input-cAQOvR8U.js.map → Input-h_nSOtwm.js.map} +1 -1
  59. package/bizar-dash/dist/assets/LibrariesView-Vez8CvNq.js +6 -0
  60. package/bizar-dash/dist/assets/{LibrariesView-Ca_PRjUm.js.map → LibrariesView-Vez8CvNq.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{LightRAGView-CMk9wOae.js → LightRAGView-DvqzQoBp.js} +1 -1
  62. package/bizar-dash/dist/assets/{LightRAGView-CMk9wOae.js.map → LightRAGView-DvqzQoBp.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js → ListHeader-CM8QoIWG.js} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js.map → ListHeader-CM8QoIWG.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js → MemoryView-DnL8E2vI.js} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js.map → MemoryView-DnL8E2vI.js.map} +1 -1
  67. package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js +1 -0
  68. package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js.map +1 -0
  69. package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js → ModsView-BVM3X5xc.js} +1 -1
  70. package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js.map → ModsView-BVM3X5xc.js.map} +1 -1
  71. package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js +6 -0
  72. package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js.map +1 -0
  73. package/bizar-dash/dist/assets/ObsidianView-mI3qW9OP.js +1 -0
  74. package/bizar-dash/dist/assets/{ObsidianView-C-AvHfpT.js.map → ObsidianView-mI3qW9OP.js.map} +1 -1
  75. package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js +1 -0
  76. package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js.map +1 -0
  77. package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js → ProgressBar-BnaBqv-W.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js.map → ProgressBar-BnaBqv-W.js.map} +1 -1
  79. package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js → ProjectsView-C81WTFka.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js.map → ProjectsView-C81WTFka.js.map} +1 -1
  81. package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js → ProvidersView-2cn-TALE.js} +2 -2
  82. package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js.map → ProvidersView-2cn-TALE.js.map} +1 -1
  83. package/bizar-dash/dist/assets/{SchedulesView-8qxH3bg7.js → SchedulesView-o9AtIsH9.js} +1 -1
  84. package/bizar-dash/dist/assets/{SchedulesView-8qxH3bg7.js.map → SchedulesView-o9AtIsH9.js.map} +1 -1
  85. package/bizar-dash/dist/assets/{Select-D5AuVxxV.js → Select-CiGWEN8I.js} +1 -1
  86. package/bizar-dash/dist/assets/{Select-D5AuVxxV.js.map → Select-CiGWEN8I.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js → SettingsRow-CflGJymA.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js.map → SettingsRow-CflGJymA.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsView-UD403neY.js → SettingsView-2HSFJPPK.js} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsView-UD403neY.js.map → SettingsView-2HSFJPPK.js.map} +1 -1
  91. package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js → Sheet-B-CMP9-_.js} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js.map → Sheet-B-CMP9-_.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js → Slider-Z4TP_CXY.js} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js.map → Slider-Z4TP_CXY.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js → Sparkline-cvkv2HbU.js} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js.map → Sparkline-cvkv2HbU.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js → Switch-jcYo4lmp.js} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js.map → Switch-jcYo4lmp.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{TasksView-DseftDlx.js → TasksView-CQaSFzWY.js} +2 -2
  100. package/bizar-dash/dist/assets/{TasksView-DseftDlx.js.map → TasksView-CQaSFzWY.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js → Textarea-xnAybFGd.js} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js.map → Textarea-xnAybFGd.js.map} +1 -1
  103. package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js +1 -0
  104. package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js.map +1 -0
  105. package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js → UsageView-DMFbBOfH.js} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js.map → UsageView-DMFbBOfH.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js → ViewHeader-C-t1U2cQ.js} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js.map → ViewHeader-C-t1U2cQ.js.map} +1 -1
  109. package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +1 -0
  110. package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js.map +1 -0
  111. package/bizar-dash/dist/assets/{brain-D6tAeUDE.js → brain-DhAzcHUk.js} +1 -1
  112. package/bizar-dash/dist/assets/{brain-D6tAeUDE.js.map → brain-DhAzcHUk.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js → calendar-B9Wbemh7.js} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js.map → calendar-B9Wbemh7.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-fPTATiOs.js → circle-6NJF_Xl6.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-fPTATiOs.js.map → circle-6NJF_Xl6.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js → circle-alert-Dz8lGfCZ.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js.map → circle-alert-Dz8lGfCZ.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js → circle-check-DFB50ojt.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js.map → circle-check-DFB50ojt.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{clock-E-G5aGua.js → clock-ClVA6-hQ.js} +1 -1
  122. package/bizar-dash/dist/assets/{clock-E-G5aGua.js.map → clock-ClVA6-hQ.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{download-DBkNb6oI.js → download-BvJddD8D.js} +1 -1
  124. package/bizar-dash/dist/assets/{download-DBkNb6oI.js.map → download-BvJddD8D.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js → external-link-DvL89gaZ.js} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js.map → external-link-DvL89gaZ.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js → file-text-BOroDtZE.js} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js.map → file-text-BOroDtZE.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{filter-CEYjeWFX.js → filter-DwPjMRQt.js} +1 -1
  130. package/bizar-dash/dist/assets/{filter-CEYjeWFX.js.map → filter-DwPjMRQt.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js → git-pull-request-TDb1inux.js} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js.map → git-pull-request-TDb1inux.js.map} +1 -1
  133. package/bizar-dash/dist/assets/{main-DDAMz_H5.css → main-B7D_IMTh.css} +1 -1
  134. package/bizar-dash/dist/assets/main-BURAlktW.js +277 -0
  135. package/bizar-dash/dist/assets/main-BURAlktW.js.map +1 -0
  136. package/bizar-dash/dist/assets/{network-BsfwrUA-.js → network-BcCoCzIY.js} +1 -1
  137. package/bizar-dash/dist/assets/{network-BsfwrUA-.js.map → network-BcCoCzIY.js.map} +1 -1
  138. package/bizar-dash/dist/assets/{pause-C8PN1_yO.js → pause-BllItT2_.js} +1 -1
  139. package/bizar-dash/dist/assets/{pause-C8PN1_yO.js.map → pause-BllItT2_.js.map} +1 -1
  140. package/bizar-dash/dist/assets/{pencil---XuvKlz.js → pencil-DAwM-CC3.js} +1 -1
  141. package/bizar-dash/dist/assets/{pencil---XuvKlz.js.map → pencil-DAwM-CC3.js.map} +1 -1
  142. package/bizar-dash/dist/assets/{play-fMLPTihK.js → play-mJh67AXo.js} +2 -2
  143. package/bizar-dash/dist/assets/{play-fMLPTihK.js.map → play-mJh67AXo.js.map} +1 -1
  144. package/bizar-dash/dist/assets/{plug-CG8al2Kq.js → plug-BjfntCMC.js} +1 -1
  145. package/bizar-dash/dist/assets/{plug-CG8al2Kq.js.map → plug-BjfntCMC.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{plus-uA5Ecuch.js → plus-Cm6-fo14.js} +1 -1
  147. package/bizar-dash/dist/assets/{plus-uA5Ecuch.js.map → plus-Cm6-fo14.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{power-DSUlNIuR.js → power-CXN9y2KV.js} +1 -1
  149. package/bizar-dash/dist/assets/{power-DSUlNIuR.js.map → power-CXN9y2KV.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js → power-off-DUZqwMf9.js} +1 -1
  151. package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js.map → power-off-DUZqwMf9.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js → refresh-ccw-DA8_IB9l.js} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js.map → refresh-ccw-DA8_IB9l.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js → refresh-cw-DwlP59en.js} +1 -1
  155. package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js.map → refresh-cw-DwlP59en.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js → rotate-ccw-DMTASfAn.js} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js.map → rotate-ccw-DMTASfAn.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js → rotate-cw-BDX5SE2s.js} +1 -1
  159. package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js.map → rotate-cw-BDX5SE2s.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{save-RcZOXR0U.js → save-Y0jPK5D6.js} +1 -1
  161. package/bizar-dash/dist/assets/{save-RcZOXR0U.js.map → save-Y0jPK5D6.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{send-Bg2X_ibk.js → send-C8wwPHhR.js} +2 -2
  163. package/bizar-dash/dist/assets/{send-Bg2X_ibk.js.map → send-C8wwPHhR.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js → shield-alert-DEvq9UG0.js} +1 -1
  165. package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js.map → shield-alert-DEvq9UG0.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{trash-2-B885GY46.js → trash-2-D6qePV_q.js} +2 -2
  167. package/bizar-dash/dist/assets/{trash-2-B885GY46.js.map → trash-2-D6qePV_q.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js → trending-up-BZzo_1ic.js} +1 -1
  169. package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js.map → trending-up-BZzo_1ic.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js → triangle-alert-B2oHbmoh.js} +1 -1
  171. package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js.map → triangle-alert-B2oHbmoh.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{upload-C-oafpyE.js → upload-Dy59aZn6.js} +1 -1
  173. package/bizar-dash/dist/assets/{upload-C-oafpyE.js.map → upload-Dy59aZn6.js.map} +1 -1
  174. package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js → zap-DENVhJnO.js} +2 -2
  175. package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js.map → zap-DENVhJnO.js.map} +1 -1
  176. package/bizar-dash/dist/index.html +2 -2
  177. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  178. package/bizar-dash/src/web/v8/App.tsx +25 -4
  179. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +8 -5
  180. package/bizar-dash/src/web/v8/shell/Topbar.tsx +57 -1
  181. package/bizar-dash/src/web/v8/ui/styles/globals.css +14 -0
  182. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +11 -6
  183. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +32 -5
  184. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +11 -4
  185. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +1 -1
  186. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +1 -1
  187. package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +1 -1
  188. package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +1 -1
  189. package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +82 -13
  190. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +19 -0
  191. package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +1 -1
  192. package/bizar-dash/tests/admin-run-grouping.test.mjs +42 -0
  193. package/bizar-dash/tests/agents-preview-truncate.test.mjs +35 -0
  194. package/bizar-dash/tests/empty-state-docs.test.mjs +55 -0
  195. package/bizar-dash/tests/focus-visible.test.mjs +30 -0
  196. package/bizar-dash/tests/notifications-dismiss-restore.test.mjs +85 -0
  197. package/bizar-dash/tests/palette-shortcut-hint.test.mjs +58 -0
  198. package/bizar-dash/tests/sidebar-distinct-icons.test.mjs +28 -0
  199. package/bizar-dash/tests/theme-toggle-icon.test.mjs +28 -0
  200. package/bizar-dash/tests/topbar-design-system.test.mjs +56 -0
  201. package/bizar-dash/vite.config.ts +8 -0
  202. package/package.json +1 -1
  203. package/packages/sdk/package.json +1 -1
  204. package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js +0 -11
  205. package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js.map +0 -1
  206. package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +0 -1
  207. package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js.map +0 -1
  208. package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js +0 -6
  209. package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js.map +0 -1
  210. package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js +0 -1
  211. package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js.map +0 -1
  212. package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js +0 -6
  213. package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js.map +0 -1
  214. package/bizar-dash/dist/assets/EvalView-lgUhlGJh.js +0 -1
  215. package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +0 -6
  216. package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js +0 -1
  217. package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js.map +0 -1
  218. package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js +0 -6
  219. package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js.map +0 -1
  220. package/bizar-dash/dist/assets/ObsidianView-C-AvHfpT.js +0 -1
  221. package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js +0 -1
  222. package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js.map +0 -1
  223. package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js +0 -6
  224. package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js.map +0 -1
  225. package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js +0 -1
  226. package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js.map +0 -1
  227. package/bizar-dash/dist/assets/main-BZMmD6a8.js +0 -249
  228. package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ // bizar-dash/tests/empty-state-docs.test.mjs
2
+ // M7: Empty-state cards in Artifacts/Dialogs/Voice/Clipboard/Misc explain the surface.
3
+ // Run with: node --test bizar-dash/tests/empty-state-docs.test.mjs
4
+
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { describe, it } from 'node:test';
8
+
9
+ const ROOT = import.meta.dirname;
10
+ const PROJECT = resolve(ROOT, '..', '..');
11
+ const DASH = resolve(ROOT, '..');
12
+
13
+ function dash(file) {
14
+ return readFileSync(resolve(DASH, file), 'utf-8');
15
+ }
16
+
17
+ describe('M7: Empty-state descriptions explain each surface', () => {
18
+ it('ArtifactsView: description explains generated code artifacts', () => {
19
+ const c = dash('src/web/v8/views/Artifacts/ArtifactsView.tsx');
20
+ if (!c.includes('generated code')) {
21
+ throw new Error('ArtifactsView empty state should explain artifacts are generated code');
22
+ }
23
+ });
24
+
25
+ it('DialogsView: description explains agent prompts/confirmations', () => {
26
+ const c = dash('src/web/v8/views/Dialogs/DialogsView.tsx');
27
+ if (!c.includes('agent raises') && !c.includes('user input')) {
28
+ throw new Error('DialogsView empty state should explain agent prompts/confirmations');
29
+ }
30
+ });
31
+
32
+ it('VoiceView: description explains audio capture purpose', () => {
33
+ const c = dash('src/web/v8/views/Voice/VoiceView.tsx');
34
+ if (!c.includes('audio recording') && !c.includes('hands-free')) {
35
+ throw new Error('VoiceView empty state should explain audio capture purpose');
36
+ }
37
+ });
38
+
39
+ it('ClipboardView: description explains saved clips become markdown notes', () => {
40
+ const c = dash('src/web/v8/views/Clipboard/ClipboardView.tsx');
41
+ if (!c.includes('markdown note') && !c.includes('clips/')) {
42
+ throw new Error('ClipboardView empty state should explain clips become markdown notes');
43
+ }
44
+ });
45
+
46
+ it('MiscView: description explains global search + Tailscale', () => {
47
+ const c = dash('src/web/v8/views/Misc/MiscView.tsx');
48
+ if (!c.includes('Global fuzzy search')) {
49
+ throw new Error('MiscView description should mention global search');
50
+ }
51
+ if (!c.includes('Tailscale')) {
52
+ throw new Error('MiscView description should mention Tailscale');
53
+ }
54
+ });
55
+ });
@@ -0,0 +1,30 @@
1
+ // Tests L4 — focus-visible CSS rule exists for custom buttons + sidebar items.
2
+
3
+ import test from 'node:test';
4
+ import assert from 'node:assert/strict';
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+
8
+ const cssPath = resolve(import.meta.dirname, '../src/web/v8/ui/styles/globals.css');
9
+ const css = readFileSync(cssPath, 'utf8');
10
+
11
+ test('globals.css defines a focus-visible ring for .v8-btn', () => {
12
+ assert.match(css, /\.v8-btn:focus-visible/);
13
+ });
14
+
15
+ test('globals.css defines a focus-visible ring for .v8-button', () => {
16
+ assert.match(css, /\.v8-button:focus-visible/);
17
+ });
18
+
19
+ test('globals.css defines a focus-visible ring for sidebar section toggle', () => {
20
+ assert.match(css, /button\[data-section-toggle\]:focus-visible/);
21
+ });
22
+
23
+ test('globals.css defines a focus-visible ring for sidebar nav item', () => {
24
+ assert.match(css, /button\[data-nav-item\]:focus-visible/);
25
+ });
26
+
27
+ test('focus rule uses outline + outline-offset (visible keyboard affordance)', () => {
28
+ assert.match(css, /outline:\s*2px solid var\(--accent\)/);
29
+ assert.match(css, /outline-offset:\s*2px/);
30
+ });
@@ -0,0 +1,85 @@
1
+ // bizar-dash/tests/notifications-dismiss-restore.test.mjs
2
+ // M8: Notifications has show-dismissed toggle, restore button, and undo toast.
3
+ // Run with: node --test bizar-dash/tests/notifications-dismiss-restore.test.mjs
4
+
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { describe, it } from 'node:test';
8
+
9
+ const ROOT = import.meta.dirname;
10
+ const PROJECT = resolve(ROOT, '..', '..');
11
+ const DASH = resolve(ROOT, '..');
12
+
13
+ function dash(file) {
14
+ return readFileSync(resolve(DASH, file), 'utf-8');
15
+ }
16
+
17
+ describe('M8: Notifications dismiss/restore/undo', () => {
18
+ it('has showDismissed state', () => {
19
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
20
+ if (!c.includes('showDismissed')) {
21
+ throw new Error('NotificationsView missing showDismissed state');
22
+ }
23
+ });
24
+
25
+ it('has "Show dismissed" / "Hide dismissed" toggle button', () => {
26
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
27
+ if (!c.includes('Show dismissed') && !c.includes('Hide dismissed')) {
28
+ throw new Error('NotificationsView missing Show/Hide dismissed toggle');
29
+ }
30
+ if (!c.includes('data-testid="notifications-toggle-dismissed"')) {
31
+ throw new Error('toggle dismissed button missing data-testid');
32
+ }
33
+ });
34
+
35
+ it('has restore() function', () => {
36
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
37
+ if (!c.includes('const restore')) {
38
+ throw new Error('NotificationsView missing restore function');
39
+ }
40
+ });
41
+
42
+ it('has Restore button with data-testid', () => {
43
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
44
+ if (!c.includes('data-testid={`notification-restore-')) {
45
+ throw new Error('Restore button missing data-testid pattern');
46
+ }
47
+ if (!c.includes('Restore')) {
48
+ throw new Error('Restore button should have "Restore" label');
49
+ }
50
+ });
51
+
52
+ it('has dismissed state tracking', () => {
53
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
54
+ if (!c.includes('setDismissed')) {
55
+ throw new Error('NotificationsView missing setDismissed state setter');
56
+ }
57
+ });
58
+
59
+ it('has undo toast with 5-second timer', () => {
60
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
61
+ if (!c.includes('UndoToast')) {
62
+ throw new Error('NotificationsView missing UndoToast interface');
63
+ }
64
+ if (!c.includes('5_000') && !c.includes('5000')) {
65
+ throw new Error('dismiss should set 5-second undo timer');
66
+ }
67
+ });
68
+
69
+ it('undo toast has data-testid and Undo button', () => {
70
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
71
+ if (!c.includes('data-testid="notifications-undo-toast"')) {
72
+ throw new Error('undo toast missing data-testid="notifications-undo-toast"');
73
+ }
74
+ if (!c.includes('data-testid="notifications-undo-btn"')) {
75
+ throw new Error('undo button missing data-testid="notifications-undo-btn"');
76
+ }
77
+ });
78
+
79
+ it('visibleItems shows all items when showDismissed is true', () => {
80
+ const c = dash('src/web/v8/views/Notifications/NotificationsView.tsx');
81
+ if (!c.includes('visibleItems')) {
82
+ throw new Error('NotificationsView missing visibleItems derived state');
83
+ }
84
+ });
85
+ });
@@ -0,0 +1,58 @@
1
+ // bizar-dash/tests/palette-shortcut-hint.test.mjs
2
+ // M6: Palette trigger has a kbd hint and a ? help button.
3
+ // Run with: node --test bizar-dash/tests/palette-shortcut-hint.test.mjs
4
+
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { describe, it } from 'node:test';
8
+
9
+ const ROOT = import.meta.dirname;
10
+ const PROJECT = resolve(ROOT, '..', '..');
11
+ const DASH = resolve(ROOT, '..');
12
+
13
+ function dash(file) {
14
+ return readFileSync(resolve(DASH, file), 'utf-8');
15
+ }
16
+
17
+ describe('M6: Command palette shortcut hint and help button', () => {
18
+ it('palette trigger uses <Button> with data-testid', () => {
19
+ const c = dash('src/web/v8/App.tsx');
20
+ if (!c.includes('data-testid="palette-trigger"')) {
21
+ throw new Error('palette trigger missing data-testid="palette-trigger"');
22
+ }
23
+ if (!c.includes('<Button')) {
24
+ throw new Error('palette trigger should use <Button> component');
25
+ }
26
+ });
27
+
28
+ it('palette trigger contains ⌘K kbd hint', () => {
29
+ const c = dash('src/web/v8/App.tsx');
30
+ if (!c.includes('⌘K')) {
31
+ throw new Error('palette trigger should display ⌘K hint');
32
+ }
33
+ });
34
+
35
+ it('? button exists with aria-label and data-testid', () => {
36
+ const c = dash('src/web/v8/App.tsx');
37
+ if (!c.includes('data-testid="shortcuts-help"')) {
38
+ throw new Error('? help button missing data-testid="shortcuts-help"');
39
+ }
40
+ if (!c.includes('aria-label="Keyboard shortcuts"')) {
41
+ throw new Error('? help button missing aria-label="Keyboard shortcuts"');
42
+ }
43
+ // Should render a ? character
44
+ if (!c.match(/>\s*\?\s*<\/Button>/)) {
45
+ throw new Error('? help button should render a ? character');
46
+ }
47
+ });
48
+
49
+ it('? button click handler shows shortcuts via window.alert', () => {
50
+ const c = dash('src/web/v8/App.tsx');
51
+ if (!c.includes('Keyboard Shortcuts')) {
52
+ throw new Error('? button should show Keyboard Shortcuts in alert');
53
+ }
54
+ if (!c.includes('⌘K')) {
55
+ throw new Error('shortcuts list should include ⌘K');
56
+ }
57
+ });
58
+ });
@@ -0,0 +1,28 @@
1
+ // Tests L3 — sidebar icons for Overview, Hooks, and Artifacts are distinct.
2
+
3
+ import test from 'node:test';
4
+ import assert from 'node:assert/strict';
5
+
6
+ // Mirror the icon assignments from Sidebar.tsx (after L3 fix)
7
+ const SIDEBAR_ICONS = {
8
+ overview: 'LayoutDashboard',
9
+ hooks: 'Webhook',
10
+ artifacts: 'Package',
11
+ };
12
+
13
+ test('Overview uses LayoutDashboard icon (not Layers)', () => {
14
+ assert.equal(SIDEBAR_ICONS.overview, 'LayoutDashboard');
15
+ });
16
+
17
+ test('Hooks uses Webhook icon (not Layers)', () => {
18
+ assert.equal(SIDEBAR_ICONS.hooks, 'Webhook');
19
+ });
20
+
21
+ test('Artifacts uses Package icon (not Layers)', () => {
22
+ assert.equal(SIDEBAR_ICONS.artifacts, 'Package');
23
+ });
24
+
25
+ test('all three labels use distinct icon names', () => {
26
+ const icons = Object.values(SIDEBAR_ICONS);
27
+ assert.equal(new Set(icons).size, icons.length);
28
+ });
@@ -0,0 +1,28 @@
1
+ // Tests M4 — theme toggle shows the icon for the resolved theme, not the selected mode.
2
+
3
+ import test from 'node:test';
4
+ import assert from 'node:assert/strict';
5
+
6
+ // Mirror the icon mapping from ThemeToggle.tsx
7
+ const RESOLVED_ICON = {
8
+ light: 'Sun',
9
+ dark: 'Moon',
10
+ system: 'Monitor',
11
+ };
12
+
13
+ test('light resolves to Sun icon', () => {
14
+ assert.equal(RESOLVED_ICON.light, 'Sun');
15
+ });
16
+
17
+ test('dark resolves to Moon icon', () => {
18
+ assert.equal(RESOLVED_ICON.dark, 'Moon');
19
+ });
20
+
21
+ test('system resolves to Monitor icon', () => {
22
+ assert.equal(RESOLVED_ICON.system, 'Monitor');
23
+ });
24
+
25
+ test('all three states use distinct icons', () => {
26
+ const icons = new Set(Object.values(RESOLVED_ICON));
27
+ assert.equal(icons.size, 3);
28
+ });
@@ -0,0 +1,56 @@
1
+ // bizar-dash/tests/topbar-design-system.test.mjs
2
+ // M9: Palette trigger uses design-system <Button> not inline styles.
3
+ // Run with: node --test bizar-dash/tests/topbar-design-system.test.mjs
4
+
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { describe, it } from 'node:test';
8
+
9
+ const ROOT = import.meta.dirname;
10
+ const PROJECT = resolve(ROOT, '..', '..');
11
+ const DASH = resolve(ROOT, '..');
12
+
13
+ function dash(file) {
14
+ return readFileSync(resolve(DASH, file), 'utf-8');
15
+ }
16
+
17
+ describe('M9: Palette trigger uses design-system Button', () => {
18
+ it('App.tsx imports Button from design-system', () => {
19
+ const c = dash('src/web/v8/App.tsx');
20
+ if (!c.includes("import { Button } from './ui/controls/Button.js'")) {
21
+ throw new Error('App.tsx should import Button from design-system');
22
+ }
23
+ });
24
+
25
+ it('palette trigger is a <Button> element (not <button> or <div>)', () => {
26
+ const c = dash('src/web/v8/App.tsx');
27
+ // The palette trigger should be a <Button ... data-testid="palette-trigger"
28
+ // NOT a raw <button ... or <div ...
29
+ // Check that after data-testid="palette-trigger" the next significant token is a > closing (i.e. it's a component, not a raw tag)
30
+ const idx = c.indexOf('data-testid="palette-trigger"');
31
+ if (idx === -1) throw new Error('palette trigger data-testid not found');
32
+ // Look for <Button variant= before the closing > — the Button tag should open before the />
33
+ const snippet = c.slice(Math.max(0, idx - 200), idx + 50);
34
+ if (!snippet.includes('<Button')) {
35
+ throw new Error('palette trigger should use <Button> component');
36
+ }
37
+ // Should NOT use raw <button or <div with the palette testid
38
+ const rawButtonIdx = c.indexOf('<button', Math.max(0, idx - 300));
39
+ const rawButtonSnippet = c.slice(rawButtonIdx, idx);
40
+ if (rawButtonSnippet.includes('palette-trigger')) {
41
+ throw new Error('palette trigger still uses raw <button> instead of <Button>');
42
+ }
43
+ });
44
+
45
+ it('palette trigger uses variant="ghost" and size="sm"', () => {
46
+ const c = dash('src/web/v8/App.tsx');
47
+ const idx = c.indexOf('data-testid="palette-trigger"');
48
+ const snippet = c.slice(Math.max(0, idx - 300), idx + 30);
49
+ if (!snippet.includes('variant="ghost"')) {
50
+ throw new Error('palette trigger should use variant="ghost"');
51
+ }
52
+ if (!snippet.includes('size="sm"')) {
53
+ throw new Error('palette trigger should use size="sm"');
54
+ }
55
+ });
56
+ });
@@ -1,9 +1,11 @@
1
1
  import { defineConfig } from 'vite';
2
2
  import react from '@vitejs/plugin-react';
3
+ import { readFileSync } from 'node:fs';
3
4
  import { fileURLToPath } from 'node:url';
4
5
  import { dirname, resolve } from 'node:path';
5
6
 
6
7
  const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const pkg = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf8')) as { version: string };
7
9
 
8
10
  export default defineConfig({
9
11
  plugins: [react()],
@@ -51,6 +53,12 @@ export default defineConfig({
51
53
  'import.meta.env.VITE_BUILD_SHA': JSON.stringify(
52
54
  process.env['BIZAR_BUILD_SHA'] ?? 'dev',
53
55
  ),
56
+ // Surfaced via `import.meta.env.VITE_APP_VERSION` so the sidebar
57
+ // footer renders the actual package version (kept in sync via the
58
+ // release pipeline).
59
+ 'import.meta.env.VITE_APP_VERSION': JSON.stringify(
60
+ process.env['BIZAR_APP_VERSION'] ?? pkg.version,
61
+ ),
54
62
  },
55
63
  server: {
56
64
  port: 5174,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polderlabs/bizar",
3
- "version": "10.4.3",
3
+ "version": "10.4.4",
4
4
  "description": "Norse-pantheon multi-agent system for Claude Code — 14 agents across 4 cost tiers with cost-aware routing, plans, and a configurable agent harness. Ships as a single npm package with the dashboard server, Claude Code MCP server, and typed SDK.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polderlabs/bizar-sdk",
3
- "version": "10.4.3",
3
+ "version": "10.4.4",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,11 +0,0 @@
1
- import{j as e,r as a}from"./cmdk-C3F6LD6N.js";import{c as u,S as f,D as x,I as p,d as n,i as S,F as b}from"./main-BZMmD6a8.js";import{V as j}from"./ViewHeader-BaCWNuVX.js";import{C as k,b as T}from"./Card-BmXiT4c6.js";import{G as w}from"./Grid-BThCPJaV.js";import{T as C}from"./trash-2-B885GY46.js";import{B as D}from"./brain-D6tAeUDE.js";import{P as z}from"./power-off-1CAQsHHy.js";import{D as R}from"./download-DBkNb6oI.js";import{S as P}from"./shield-alert-Dm48D034.js";import{R as O}from"./refresh-cw-CR9BzJik.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 A=u("Hammer",[["path",{d:"m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9",key:"eefl8a"}],["path",{d:"m18 15 4-4",key:"16gjal"}],["path",{d:"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5",key:"b7pghm"}]]);/**
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 E=u("ScrollText",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]),V=[{id:"gc",title:"Garbage collect",description:"Prune empty session files + orphaned task rows from the cache.",icon:C,endpoint:"/api/admin/gc",method:"POST",destructive:!1},{id:"cache-clear",title:"Clear cache",description:"Wipe the dashboard cache directory. Rebuilds on next access.",icon:x,endpoint:"/api/admin/cache/clear",method:"POST",destructive:!0},{id:"memory-reindex",title:"Reindex memory",description:"Rebuild the vault search index.",icon:D,endpoint:"/api/admin/memory/reindex",method:"POST",destructive:!1},{id:"logs-purge",title:"Purge old logs",description:"Delete log files older than 14 days from ~/.config/bizar/logs.",icon:E,endpoint:"/api/admin/logs/purge",method:"POST",destructive:!0},{id:"restart",title:"Restart dashboard",description:"Signal the server to shut down. The CLI launcher restarts it.",icon:z,endpoint:"/api/admin/restart",method:"POST",destructive:!0},{id:"rebuild",title:"Rebuild",description:"Re-run the installer build step.",icon:A,endpoint:"/api/admin/rebuild",method:"POST",destructive:!0},{id:"export-activity",title:"Export activity",description:"Download the full activity log as NDJSON.",icon:R,endpoint:"/api/admin/activity/export",method:"GET",destructive:!1}];function _(){return e.jsxs(f,{gap:4,"data-testid":"admin-view",children:[e.jsx(j,{title:"Admin",description:"Maintenance actions. Destructive actions require an inline confirm."}),e.jsx(w,{cols:{base:1,md:2,lg:3},gap:3,children:V.map(t=>e.jsx($,{action:t},t.id))})]})}function $({action:t}){const[r,o]=a.useState(!1),[v,s]=a.useState(!1),[l,d]=a.useState(null),[c,m]=a.useState(null),g=t.icon,h=async()=>{o(!0),m(null),d(null);try{if(t.method==="GET")window.open(t.endpoint,"_blank"),d("Download started");else{const i=await S(t.endpoint,{method:t.method,body:{}}),y=i.note?i.note:i.files!==void 0?`${i.files} file(s) removed (${i.bytes??0} bytes)`:(i.ok,"Done");d(y)}s(!1)}catch(i){m((i instanceof b,i.message))}finally{o(!1)}};return e.jsx(k,{variant:"default",children:e.jsx(T,{children:e.jsxs(f,{gap:2,children:[e.jsxs(p,{align:"center",gap:2,children:[e.jsx(g,{size:18,"aria-hidden":!0}),e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.title}),t.destructive&&e.jsxs("span",{style:{marginLeft:"auto",color:"var(--danger)",fontSize:"var(--fs-11)"},"aria-label":"Destructive",children:[e.jsx(P,{size:14,"aria-hidden":!0,style:{verticalAlign:"middle"}})," destructive"]})]}),e.jsx("p",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)",margin:0},children:t.description}),l!==null&&e.jsx("span",{"data-testid":`admin-result-${t.id}`,style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:l}),c!==null&&e.jsx("span",{role:"alert","data-testid":`admin-error-${t.id}`,style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:c}),v?e.jsxs(p,{gap:1,children:[e.jsx(n,{variant:"danger",onClick:()=>void h(),disabled:r,"data-testid":`admin-confirm-${t.id}`,children:"Confirm"}),e.jsx(n,{variant:"ghost",onClick:()=>s(!1),disabled:r,"data-testid":`admin-cancel-${t.id}`,children:"Cancel"})]}):e.jsxs(n,{variant:t.destructive?"danger":"primary",onClick:()=>t.destructive?s(!0):void h(),disabled:r,"data-testid":`admin-run-${t.id}`,children:[e.jsx(O,{size:14,"aria-hidden":!0})," ",r?"Working…":"Run"]})]})})})}export{_ as AdminView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminView-CI4zM2Qg.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hammer.js","../../../node_modules/lucide-react/dist/esm/icons/scroll-text.js","../../src/web/v8/views/Admin/AdminView.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 Hammer = createLucideIcon(\"Hammer\", [\n [\"path\", { d: \"m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9\", key: \"eefl8a\" }],\n [\"path\", { d: \"m18 15 4-4\", key: \"16gjal\" }],\n [\n \"path\",\n {\n d: \"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\",\n key: \"b7pghm\"\n }\n ]\n]);\n\nexport { Hammer as default };\n//# sourceMappingURL=hammer.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 ScrollText = createLucideIcon(\"ScrollText\", [\n [\"path\", { d: \"M15 12h-5\", key: \"r7krc0\" }],\n [\"path\", { d: \"M15 8h-5\", key: \"1khuty\" }],\n [\"path\", { d: \"M19 17V5a2 2 0 0 0-2-2H4\", key: \"zz82l3\" }],\n [\n \"path\",\n {\n d: \"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\",\n key: \"1ph1d7\"\n }\n ]\n]);\n\nexport { ScrollText as default };\n//# sourceMappingURL=scroll-text.js.map\n","/**\n * v8/views/Admin/AdminView.tsx — Sprint S40, v9.3.0.\n *\n * Card grid of admin / maintenance actions. Each tile posts to its\n * /api/admin/* endpoint, shows a spinner while busy, surfaces the\n * result inline (or the error message), and uses the inline-confirm\n * pattern for destructive actions (cache clear, log purge, restart,\n * rebuild).\n */\n\nimport { useState } from 'react';\nimport {\n RefreshCw,\n Trash2,\n Database,\n Brain,\n PowerOff,\n Hammer,\n ScrollText,\n Download,\n ShieldAlert,\n} from 'lucide-react';\nimport type { LucideIcon } 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 { Grid } from '../../ui/primitives/Grid.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface AdminAction {\n id: string;\n title: string;\n description: string;\n icon: LucideIcon;\n endpoint: string;\n method: 'POST' | 'GET';\n destructive: boolean;\n}\n\nconst ACTIONS: AdminAction[] = [\n {\n id: 'gc',\n title: 'Garbage collect',\n description: 'Prune empty session files + orphaned task rows from the cache.',\n icon: Trash2,\n endpoint: '/api/admin/gc',\n method: 'POST',\n destructive: false,\n },\n {\n id: 'cache-clear',\n title: 'Clear cache',\n description: 'Wipe the dashboard cache directory. Rebuilds on next access.',\n icon: Database,\n endpoint: '/api/admin/cache/clear',\n method: 'POST',\n destructive: true,\n },\n {\n id: 'memory-reindex',\n title: 'Reindex memory',\n description: 'Rebuild the vault search index.',\n icon: Brain,\n endpoint: '/api/admin/memory/reindex',\n method: 'POST',\n destructive: false,\n },\n {\n id: 'logs-purge',\n title: 'Purge old logs',\n description: 'Delete log files older than 14 days from ~/.config/bizar/logs.',\n icon: ScrollText,\n endpoint: '/api/admin/logs/purge',\n method: 'POST',\n destructive: true,\n },\n {\n id: 'restart',\n title: 'Restart dashboard',\n description: 'Signal the server to shut down. The CLI launcher restarts it.',\n icon: PowerOff,\n endpoint: '/api/admin/restart',\n method: 'POST',\n destructive: true,\n },\n {\n id: 'rebuild',\n title: 'Rebuild',\n description: 'Re-run the installer build step.',\n icon: Hammer,\n endpoint: '/api/admin/rebuild',\n method: 'POST',\n destructive: true,\n },\n {\n id: 'export-activity',\n title: 'Export activity',\n description: 'Download the full activity log as NDJSON.',\n icon: Download,\n endpoint: '/api/admin/activity/export',\n method: 'GET',\n destructive: false,\n },\n];\n\nexport function AdminView(): JSX.Element {\n return (\n <Stack gap={4} data-testid=\"admin-view\">\n <ViewHeader\n title=\"Admin\"\n description=\"Maintenance actions. Destructive actions require an inline confirm.\"\n />\n <Grid cols={{ base: 1, md: 2, lg: 3 }} gap={3}>\n {ACTIONS.map((a) => (\n <AdminTile key={a.id} action={a} />\n ))}\n </Grid>\n </Stack>\n );\n}\n\nfunction AdminTile({ action }: { action: AdminAction }): JSX.Element {\n const [busy, setBusy] = useState<boolean>(false);\n const [confirm, setConfirm] = useState<boolean>(false);\n const [result, setResult] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const Icon = action.icon;\n\n const run = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setResult(null);\n try {\n if (action.method === 'GET') {\n // For GET endpoints (export), trigger a download by navigating\n // to the endpoint in a new tab. The server sets Content-Disposition.\n window.open(action.endpoint, '_blank');\n setResult('Download started');\n } else {\n const res = await fetchJson<{ ok?: boolean; files?: number; bytes?: number; note?: string }>(\n action.endpoint,\n { method: action.method, body: {} },\n );\n const summary = res.note\n ? res.note\n : res.files !== undefined\n ? `${res.files} file(s) removed (${res.bytes ?? 0} bytes)`\n : res.ok ? 'Done' : 'Done';\n setResult(summary);\n }\n setConfirm(false);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <Icon size={18} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-13)' }}>{action.title}</strong>\n {action.destructive && (\n <span style={{ marginLeft: 'auto', color: 'var(--danger)', fontSize: 'var(--fs-11)' }} aria-label=\"Destructive\">\n <ShieldAlert size={14} aria-hidden style={{ verticalAlign: 'middle' }} /> destructive\n </span>\n )}\n </Inline>\n <p style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)', margin: 0 }}>\n {action.description}\n </p>\n {result !== null && (\n <span data-testid={`admin-result-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>\n {result}\n </span>\n )}\n {error !== null && (\n <span role=\"alert\" data-testid={`admin-error-${action.id}`} style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {error}\n </span>\n )}\n {confirm ? (\n <Inline gap={1}>\n <Button variant=\"danger\" onClick={() => void run()} disabled={busy} data-testid={`admin-confirm-${action.id}`}>\n Confirm\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirm(false)} disabled={busy} data-testid={`admin-cancel-${action.id}`}>\n Cancel\n </Button>\n </Inline>\n ) : (\n <Button\n variant={action.destructive ? 'danger' : 'primary'}\n onClick={() => (action.destructive ? setConfirm(true) : void run())}\n disabled={busy}\n data-testid={`admin-run-${action.id}`}\n >\n <RefreshCw size={14} aria-hidden /> {busy ? 'Working…' : 'Run'}\n </Button>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}"],"names":["Hammer","createLucideIcon","ScrollText","ACTIONS","Trash2","Database","Brain","PowerOff","Download","AdminView","jsxs","Stack","jsx","ViewHeader","Grid","a","AdminTile","action","busy","setBusy","useState","confirm","setConfirm","result","setResult","error","setError","Icon","run","res","fetchJson","summary","err","FetchError","Card","CardBody","Inline","ShieldAlert","Button","RefreshCw"],"mappings":"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","x_google_ignoreList":[0,1]}