@polderlabs/bizar 8.1.0 → 10.0.5

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 (546) hide show
  1. package/bizar-dash/BROWSER_VERIFICATION.md +190 -0
  2. package/bizar-dash/CHANGELOG.md +452 -0
  3. package/bizar-dash/CONTROL_SURFACES.md +157 -0
  4. package/bizar-dash/SETTINGS_AUDIT.md +225 -0
  5. package/bizar-dash/dist/assets/ActivityFeed-DbZT1TnN.js +11 -0
  6. package/bizar-dash/dist/assets/ActivityFeed-DbZT1TnN.js.map +1 -0
  7. package/bizar-dash/dist/assets/ActivityView-DfrBu-ED.js +7 -0
  8. package/bizar-dash/dist/assets/ActivityView-DfrBu-ED.js.map +1 -0
  9. package/bizar-dash/dist/assets/AdminView-DSbzp67e.js +11 -0
  10. package/bizar-dash/dist/assets/AdminView-DSbzp67e.js.map +1 -0
  11. package/bizar-dash/dist/assets/AgentsView-BaR-e4UO.js +13 -0
  12. package/bizar-dash/dist/assets/AgentsView-BaR-e4UO.js.map +1 -0
  13. package/bizar-dash/dist/assets/ArtifactsView-Dddh5NWn.js +6 -0
  14. package/bizar-dash/dist/assets/ArtifactsView-Dddh5NWn.js.map +1 -0
  15. package/bizar-dash/dist/assets/AuthView-CcTxahxz.js +16 -0
  16. package/bizar-dash/dist/assets/AuthView-CcTxahxz.js.map +1 -0
  17. package/bizar-dash/dist/assets/BackgroundJobsView-DxiSs69H.js +1 -0
  18. package/bizar-dash/dist/assets/BackgroundJobsView-DxiSs69H.js.map +1 -0
  19. package/bizar-dash/dist/assets/BackupView-BPS8REBD.js +1 -0
  20. package/bizar-dash/dist/assets/BackupView-BPS8REBD.js.map +1 -0
  21. package/bizar-dash/dist/assets/Banner-Bx1hIUM9.js +1 -0
  22. package/bizar-dash/dist/assets/Banner-Bx1hIUM9.js.map +1 -0
  23. package/bizar-dash/dist/assets/{Card-BzJeYR2D.js → Card-ZAdgpn3-.js} +1 -1
  24. package/bizar-dash/dist/assets/{Card-BzJeYR2D.js.map → Card-ZAdgpn3-.js.map} +1 -1
  25. package/bizar-dash/dist/assets/ChatView-CM_mrwom.js +9 -0
  26. package/bizar-dash/dist/assets/ChatView-CM_mrwom.js.map +1 -0
  27. package/bizar-dash/dist/assets/{Chip-CN2bvm7a.js → Chip-k5K9DYAf.js} +1 -1
  28. package/bizar-dash/dist/assets/{Chip-CN2bvm7a.js.map → Chip-k5K9DYAf.js.map} +1 -1
  29. package/bizar-dash/dist/assets/ClaudeSessionsView-Dq40JNVC.js +1 -0
  30. package/bizar-dash/dist/assets/ClaudeSessionsView-Dq40JNVC.js.map +1 -0
  31. package/bizar-dash/dist/assets/ClipboardView-B-TwPtaC.js +1 -0
  32. package/bizar-dash/dist/assets/ClipboardView-B-TwPtaC.js.map +1 -0
  33. package/bizar-dash/dist/assets/ConfigView-C_eZMscY.js +1 -0
  34. package/bizar-dash/dist/assets/ConfigView-C_eZMscY.js.map +1 -0
  35. package/bizar-dash/dist/assets/DiagnosticsView-Cex6UdD8.js +2 -0
  36. package/bizar-dash/dist/assets/DiagnosticsView-Cex6UdD8.js.map +1 -0
  37. package/bizar-dash/dist/assets/DialogsView-DTMRJd0K.js +6 -0
  38. package/bizar-dash/dist/assets/DialogsView-DTMRJd0K.js.map +1 -0
  39. package/bizar-dash/dist/assets/DoctorView-BTCUpzXT.js +6 -0
  40. package/bizar-dash/dist/assets/DoctorView-BTCUpzXT.js.map +1 -0
  41. package/bizar-dash/dist/assets/{EmptyState-DEiBv4-r.js → EmptyState-DQzo47a_.js} +1 -1
  42. package/bizar-dash/dist/assets/{EmptyState-DEiBv4-r.js.map → EmptyState-DQzo47a_.js.map} +1 -1
  43. package/bizar-dash/dist/assets/EnvVarsView-Dnap-pmQ.js +8 -0
  44. package/bizar-dash/dist/assets/EnvVarsView-Dnap-pmQ.js.map +1 -0
  45. package/bizar-dash/dist/assets/ErrorState-DZYn3VL_.js +6 -0
  46. package/bizar-dash/dist/assets/ErrorState-DZYn3VL_.js.map +1 -0
  47. package/bizar-dash/dist/assets/EvalView-B0YgoXpm.js +1 -0
  48. package/bizar-dash/dist/assets/EvalView-B0YgoXpm.js.map +1 -0
  49. package/bizar-dash/dist/assets/GoalsView-YEbgpx2i.js +6 -0
  50. package/bizar-dash/dist/assets/GoalsView-YEbgpx2i.js.map +1 -0
  51. package/bizar-dash/dist/assets/Grid-CN6IV8NB.js +1 -0
  52. package/bizar-dash/dist/assets/Grid-CN6IV8NB.js.map +1 -0
  53. package/bizar-dash/dist/assets/HeadroomView-C_-l8ojG.js +11 -0
  54. package/bizar-dash/dist/assets/HeadroomView-C_-l8ojG.js.map +1 -0
  55. package/bizar-dash/dist/assets/HistoryView-BICvR96Y.js +1 -0
  56. package/bizar-dash/dist/assets/HistoryView-BICvR96Y.js.map +1 -0
  57. package/bizar-dash/dist/assets/Input-BRHotaQu.js +1 -0
  58. package/bizar-dash/dist/assets/Input-BRHotaQu.js.map +1 -0
  59. package/bizar-dash/dist/assets/{KanbanCard-DZEaAiEr.js → KanbanCard-BvkJ9Xwg.js} +3 -13
  60. package/bizar-dash/dist/assets/KanbanCard-BvkJ9Xwg.js.map +1 -0
  61. package/bizar-dash/dist/assets/LibrariesView-BXjfXc-o.js +52 -0
  62. package/bizar-dash/dist/assets/LibrariesView-BXjfXc-o.js.map +1 -0
  63. package/bizar-dash/dist/assets/LightRAGView-DKfQd0lo.js +6 -0
  64. package/bizar-dash/dist/assets/LightRAGView-DKfQd0lo.js.map +1 -0
  65. package/bizar-dash/dist/assets/ListHeader-DRqP1u_I.js +1 -0
  66. package/bizar-dash/dist/assets/ListHeader-DRqP1u_I.js.map +1 -0
  67. package/bizar-dash/dist/assets/MemoryView-DouzHGXp.js +8 -0
  68. package/bizar-dash/dist/assets/MemoryView-DouzHGXp.js.map +1 -0
  69. package/bizar-dash/dist/assets/MessageBubble-CIapZ4YY.js +29 -0
  70. package/bizar-dash/dist/assets/MessageBubble-CIapZ4YY.js.map +1 -0
  71. package/bizar-dash/dist/assets/MiscView-BqxBRW9r.js +1 -0
  72. package/bizar-dash/dist/assets/MiscView-BqxBRW9r.js.map +1 -0
  73. package/bizar-dash/dist/assets/ModsView-B9apzm7l.js +6 -0
  74. package/bizar-dash/dist/assets/ModsView-B9apzm7l.js.map +1 -0
  75. package/bizar-dash/dist/assets/NotificationsView-O1BrGRRZ.js +6 -0
  76. package/bizar-dash/dist/assets/NotificationsView-O1BrGRRZ.js.map +1 -0
  77. package/bizar-dash/dist/assets/ObsidianView-0_Nc0IwJ.js +1 -0
  78. package/bizar-dash/dist/assets/ObsidianView-0_Nc0IwJ.js.map +1 -0
  79. package/bizar-dash/dist/assets/OverviewView-D6WmCxyc.js +1 -0
  80. package/bizar-dash/dist/assets/OverviewView-D6WmCxyc.js.map +1 -0
  81. package/bizar-dash/dist/assets/ProgressBar-BXqAmiA8.js +1 -0
  82. package/bizar-dash/dist/assets/ProgressBar-BXqAmiA8.js.map +1 -0
  83. package/bizar-dash/dist/assets/ProjectsView-BbHq_OF3.js +11 -0
  84. package/bizar-dash/dist/assets/ProjectsView-BbHq_OF3.js.map +1 -0
  85. package/bizar-dash/dist/assets/ProvidersView-dQOPha2i.js +11 -0
  86. package/bizar-dash/dist/assets/ProvidersView-dQOPha2i.js.map +1 -0
  87. package/bizar-dash/dist/assets/SchedulesView-DllGEgon.js +1 -0
  88. package/bizar-dash/dist/assets/SchedulesView-DllGEgon.js.map +1 -0
  89. package/bizar-dash/dist/assets/Select-xrQ0htmD.js +6 -0
  90. package/bizar-dash/dist/assets/Select-xrQ0htmD.js.map +1 -0
  91. package/bizar-dash/dist/assets/SettingsRow-BNSh_paj.js +1 -0
  92. package/bizar-dash/dist/assets/SettingsRow-BNSh_paj.js.map +1 -0
  93. package/bizar-dash/dist/assets/SettingsView-B2LyDoxB.js +18 -0
  94. package/bizar-dash/dist/assets/SettingsView-B2LyDoxB.js.map +1 -0
  95. package/bizar-dash/dist/assets/Sheet-C-djzbtS.js +1 -0
  96. package/bizar-dash/dist/assets/{Sheet-C_sIEw35.js.map → Sheet-C-djzbtS.js.map} +1 -1
  97. package/bizar-dash/dist/assets/Slider-DmOSInmR.js +1 -0
  98. package/bizar-dash/dist/assets/Slider-DmOSInmR.js.map +1 -0
  99. package/bizar-dash/dist/assets/Sparkline-fGhOoGf0.js +1 -0
  100. package/bizar-dash/dist/assets/Sparkline-fGhOoGf0.js.map +1 -0
  101. package/bizar-dash/dist/assets/Switch-D5gPfsKd.js +10 -0
  102. package/bizar-dash/dist/assets/Switch-D5gPfsKd.js.map +1 -0
  103. package/bizar-dash/dist/assets/TasksView-Dw4YtwQB.js +1 -0
  104. package/bizar-dash/dist/assets/TasksView-Dw4YtwQB.js.map +1 -0
  105. package/bizar-dash/dist/assets/{Textarea-Dk97nmjO.js → Textarea-Cv1HX9p1.js} +1 -1
  106. package/bizar-dash/dist/assets/{Textarea-Dk97nmjO.js.map → Textarea-Cv1HX9p1.js.map} +1 -1
  107. package/bizar-dash/dist/assets/UpdateView-Bj0LzpMs.js +6 -0
  108. package/bizar-dash/dist/assets/UpdateView-Bj0LzpMs.js.map +1 -0
  109. package/bizar-dash/dist/assets/UsageView-CE-23yYu.js +1 -0
  110. package/bizar-dash/dist/assets/UsageView-CE-23yYu.js.map +1 -0
  111. package/bizar-dash/dist/assets/{ViewHeader-dPd4zAyj.js → ViewHeader-2Oyjj9Yt.js} +2 -2
  112. package/bizar-dash/dist/assets/{ViewHeader-dPd4zAyj.js.map → ViewHeader-2Oyjj9Yt.js.map} +1 -1
  113. package/bizar-dash/dist/assets/VoiceView-C3S92MfP.js +1 -0
  114. package/bizar-dash/dist/assets/VoiceView-C3S92MfP.js.map +1 -0
  115. package/bizar-dash/dist/assets/{brain-BajPVibR.js → brain-B8oDQ4kM.js} +1 -1
  116. package/bizar-dash/dist/assets/{brain-BajPVibR.js.map → brain-B8oDQ4kM.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{calendar-CaP_Bbgc.js → calendar-C1WTDPNZ.js} +1 -1
  118. package/bizar-dash/dist/assets/{calendar-CaP_Bbgc.js.map → calendar-C1WTDPNZ.js.map} +1 -1
  119. package/bizar-dash/dist/assets/chevron-down-DjgW4FtB.js +6 -0
  120. package/bizar-dash/dist/assets/chevron-down-DjgW4FtB.js.map +1 -0
  121. package/bizar-dash/dist/assets/circle-COwUk6Jw.js +6 -0
  122. package/bizar-dash/dist/assets/circle-COwUk6Jw.js.map +1 -0
  123. package/bizar-dash/dist/assets/circle-alert-D_fRRCnG.js +6 -0
  124. package/bizar-dash/dist/assets/circle-alert-D_fRRCnG.js.map +1 -0
  125. package/bizar-dash/dist/assets/circle-check-CYpMZPTO.js +6 -0
  126. package/bizar-dash/dist/assets/circle-check-CYpMZPTO.js.map +1 -0
  127. package/bizar-dash/dist/assets/clock-BsVbT1kp.js +6 -0
  128. package/bizar-dash/dist/assets/clock-BsVbT1kp.js.map +1 -0
  129. package/bizar-dash/dist/assets/{cmdk-BLWIhKrV.js → cmdk-DMW_3pWz.js} +3 -3
  130. package/bizar-dash/dist/assets/{cmdk-BLWIhKrV.js.map → cmdk-DMW_3pWz.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{dnd-kit-DU8GZk7s.js → dnd-kit-DWBZ6HFE.js} +1 -1
  132. package/bizar-dash/dist/assets/{dnd-kit-DU8GZk7s.js.map → dnd-kit-DWBZ6HFE.js.map} +1 -1
  133. package/bizar-dash/dist/assets/download-Cct5qHWG.js +6 -0
  134. package/bizar-dash/dist/assets/download-Cct5qHWG.js.map +1 -0
  135. package/bizar-dash/dist/assets/external-link-CKZQsK9X.js +6 -0
  136. package/bizar-dash/dist/assets/external-link-CKZQsK9X.js.map +1 -0
  137. package/bizar-dash/dist/assets/file-text-DNFl94X6.js +6 -0
  138. package/bizar-dash/dist/assets/file-text-DNFl94X6.js.map +1 -0
  139. package/bizar-dash/dist/assets/git-branch-qmhKTtT0.js +6 -0
  140. package/bizar-dash/dist/assets/git-branch-qmhKTtT0.js.map +1 -0
  141. package/bizar-dash/dist/assets/{git-pull-request-CFRRwdxp.js → git-pull-request-o7G3ez_L.js} +1 -1
  142. package/bizar-dash/dist/assets/{git-pull-request-CFRRwdxp.js.map → git-pull-request-o7G3ez_L.js.map} +1 -1
  143. package/bizar-dash/dist/assets/index-CRPdftkz.js +1 -0
  144. package/bizar-dash/dist/assets/index-CRPdftkz.js.map +1 -0
  145. package/bizar-dash/dist/assets/index-VI2tohpo.js +1 -0
  146. package/bizar-dash/dist/assets/index-VI2tohpo.js.map +1 -0
  147. package/bizar-dash/dist/assets/main-zDgXFFYt.js +244 -0
  148. package/bizar-dash/dist/assets/main-zDgXFFYt.js.map +1 -0
  149. package/bizar-dash/dist/assets/pause-B_hjj388.js +6 -0
  150. package/bizar-dash/dist/assets/pause-B_hjj388.js.map +1 -0
  151. package/bizar-dash/dist/assets/pencil-BQXiRgKu.js +6 -0
  152. package/bizar-dash/dist/assets/pencil-BQXiRgKu.js.map +1 -0
  153. package/bizar-dash/dist/assets/play-DF3wgBsQ.js +6 -0
  154. package/bizar-dash/dist/assets/play-DF3wgBsQ.js.map +1 -0
  155. package/bizar-dash/dist/assets/plug-DpD127rq.js +6 -0
  156. package/bizar-dash/dist/assets/plug-DpD127rq.js.map +1 -0
  157. package/bizar-dash/dist/assets/{plus-CVH1JB04.js → plus-CbojvfqK.js} +1 -1
  158. package/bizar-dash/dist/assets/{plus-CVH1JB04.js.map → plus-CbojvfqK.js.map} +1 -1
  159. package/bizar-dash/dist/assets/power-off-EnQo8iQy.js +6 -0
  160. package/bizar-dash/dist/assets/power-off-EnQo8iQy.js.map +1 -0
  161. package/bizar-dash/dist/assets/power-uH0f5Ihr.js +6 -0
  162. package/bizar-dash/dist/assets/power-uH0f5Ihr.js.map +1 -0
  163. package/bizar-dash/dist/assets/refresh-ccw-BQ_hQs-U.js +6 -0
  164. package/bizar-dash/dist/assets/refresh-ccw-BQ_hQs-U.js.map +1 -0
  165. package/bizar-dash/dist/assets/refresh-cw-CYS8luDH.js +6 -0
  166. package/bizar-dash/dist/assets/refresh-cw-CYS8luDH.js.map +1 -0
  167. package/bizar-dash/dist/assets/rotate-ccw-CTVANG1v.js +6 -0
  168. package/bizar-dash/dist/assets/rotate-ccw-CTVANG1v.js.map +1 -0
  169. package/bizar-dash/dist/assets/rotate-cw-BSsC5XrT.js +6 -0
  170. package/bizar-dash/dist/assets/rotate-cw-BSsC5XrT.js.map +1 -0
  171. package/bizar-dash/dist/assets/save-kxSwq3AI.js +6 -0
  172. package/bizar-dash/dist/assets/save-kxSwq3AI.js.map +1 -0
  173. package/bizar-dash/dist/assets/send-DkuyD_Sf.js +6 -0
  174. package/bizar-dash/dist/assets/send-DkuyD_Sf.js.map +1 -0
  175. package/bizar-dash/dist/assets/shield-alert-COajyBNI.js +6 -0
  176. package/bizar-dash/dist/assets/shield-alert-COajyBNI.js.map +1 -0
  177. package/bizar-dash/dist/assets/{trash-2-JtYRQ79q.js → trash-2-BzH_id_0.js} +1 -1
  178. package/bizar-dash/dist/assets/{trash-2-JtYRQ79q.js.map → trash-2-BzH_id_0.js.map} +1 -1
  179. package/bizar-dash/dist/assets/trending-up-DWgBlnxO.js +6 -0
  180. package/bizar-dash/dist/assets/trending-up-DWgBlnxO.js.map +1 -0
  181. package/bizar-dash/dist/assets/{triangle-alert-Nzbrm0I2.js → triangle-alert-D3wjJjjj.js} +1 -1
  182. package/bizar-dash/dist/assets/{triangle-alert-Nzbrm0I2.js.map → triangle-alert-D3wjJjjj.js.map} +1 -1
  183. package/bizar-dash/dist/assets/upload--yQe-28C.js +6 -0
  184. package/bizar-dash/dist/assets/upload--yQe-28C.js.map +1 -0
  185. package/bizar-dash/dist/assets/zap-BVpFD6-i.js +6 -0
  186. package/bizar-dash/dist/assets/zap-BVpFD6-i.js.map +1 -0
  187. package/bizar-dash/dist/{v8.html → index.html} +2 -2
  188. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  189. package/bizar-dash/src/server/agents-store.mjs +1 -0
  190. package/bizar-dash/src/server/api.mjs +10 -0
  191. package/bizar-dash/src/server/claude-runner.mjs +5 -0
  192. package/bizar-dash/src/server/dialog-store.mjs +84 -2
  193. package/bizar-dash/src/server/memory-lightrag.mjs +14 -9
  194. package/bizar-dash/src/server/progress-parser.mjs +33 -5
  195. package/bizar-dash/src/server/progress-parser.test.mjs +24 -0
  196. package/bizar-dash/src/server/routes/admin.mjs +163 -0
  197. package/bizar-dash/src/server/routes/agents-cc.mjs +171 -24
  198. package/bizar-dash/src/server/routes/agents.mjs +20 -5
  199. package/bizar-dash/src/server/routes/claude-session-detail.mjs +38 -0
  200. package/bizar-dash/src/server/routes/dialogs.mjs +31 -0
  201. package/bizar-dash/src/server/routes/goals.mjs +117 -13
  202. package/bizar-dash/src/server/routes/overview.mjs +131 -4
  203. package/bizar-dash/src/server/routes/overview.test.mjs +65 -0
  204. package/bizar-dash/src/server/routes/providers.mjs +53 -0
  205. package/bizar-dash/src/server/routes/spawn.mjs +59 -0
  206. package/bizar-dash/src/server/routes/tasks.mjs +51 -1
  207. package/bizar-dash/src/server/server.mjs +21 -10
  208. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  209. package/bizar-dash/src/web/v8/App.tsx +158 -8
  210. package/bizar-dash/src/web/v8/__tests__/BackgroundJobsView.test.tsx +172 -0
  211. package/bizar-dash/src/web/v8/__tests__/MemoryView.test.tsx +91 -0
  212. package/bizar-dash/src/web/v8/__tests__/NotificationsPopover.test.tsx +91 -0
  213. package/bizar-dash/src/web/v8/__tests__/SchedulesView.test.tsx +157 -0
  214. package/bizar-dash/src/web/v8/__tests__/Topbar.test.tsx +86 -0
  215. package/bizar-dash/src/web/v8/__tests__/admin-view.test.tsx +105 -0
  216. package/bizar-dash/src/web/v8/__tests__/agent-card-metrics.test.tsx +54 -0
  217. package/bizar-dash/src/web/v8/__tests__/agent-detail-tasks.test.tsx +68 -0
  218. package/bizar-dash/src/web/v8/__tests__/agent-hierarchy.test.tsx +79 -0
  219. package/bizar-dash/src/web/v8/__tests__/agents-stuck-banner.test.tsx +142 -0
  220. package/bizar-dash/src/web/v8/__tests__/artifacts-view.test.tsx +102 -0
  221. package/bizar-dash/src/web/v8/__tests__/audit-fixes.test.tsx +139 -0
  222. package/bizar-dash/src/web/v8/__tests__/auth-view.test.tsx +94 -0
  223. package/bizar-dash/src/web/v8/__tests__/changelog.test.tsx +79 -0
  224. package/bizar-dash/src/web/v8/__tests__/chat-types.test.ts +55 -0
  225. package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +142 -0
  226. package/bizar-dash/src/web/v8/__tests__/claude-sessions-view.test.tsx +159 -0
  227. package/bizar-dash/src/web/v8/__tests__/clipboard-view.test.tsx +90 -0
  228. package/bizar-dash/src/web/v8/__tests__/config-view.test.tsx +111 -0
  229. package/bizar-dash/src/web/v8/__tests__/dialogs-view.test.tsx +81 -0
  230. package/bizar-dash/src/web/v8/__tests__/env-vars-view.test.tsx +123 -0
  231. package/bizar-dash/src/web/v8/__tests__/goals-cc-roundtrip.test.tsx +94 -0
  232. package/bizar-dash/src/web/v8/__tests__/history-view.test.tsx +96 -0
  233. package/bizar-dash/src/web/v8/__tests__/lightrag-view.test.tsx +90 -0
  234. package/bizar-dash/src/web/v8/__tests__/misc-view.test.tsx +79 -0
  235. package/bizar-dash/src/web/v8/__tests__/mods-view.test.tsx +123 -0
  236. package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +177 -0
  237. package/bizar-dash/src/web/v8/__tests__/obsidian-view.test.tsx +82 -0
  238. package/bizar-dash/src/web/v8/__tests__/overview-trends.test.tsx +87 -0
  239. package/bizar-dash/src/web/v8/__tests__/projects-view.test.tsx +134 -0
  240. package/bizar-dash/src/web/v8/__tests__/providers-view.test.tsx +100 -0
  241. package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +10 -4
  242. package/bizar-dash/src/web/v8/__tests__/update-view.test.tsx +89 -0
  243. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +6 -0
  244. package/bizar-dash/src/web/v8/__tests__/voice-view.test.tsx +80 -0
  245. package/bizar-dash/src/web/v8/data/types.ts +75 -2
  246. package/bizar-dash/src/web/v8/data/useWebSocket.ts +54 -1
  247. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +98 -13
  248. package/bizar-dash/src/web/v8/shell/Topbar.tsx +30 -4
  249. package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +96 -15
  250. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +202 -15
  251. package/bizar-dash/src/web/v8/ui/agents/AgentLiveOutput.tsx +252 -0
  252. package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +1 -1
  253. package/bizar-dash/src/web/v8/ui/chat/ChatDrawer.tsx +208 -0
  254. package/bizar-dash/src/web/v8/ui/chat/EventStream.tsx +83 -0
  255. package/bizar-dash/src/web/v8/ui/chat/MessageBubble.tsx +174 -0
  256. package/bizar-dash/src/web/v8/ui/data/ListHeader.tsx +94 -0
  257. package/bizar-dash/src/web/v8/ui/feedback/ErrorState.tsx +116 -0
  258. package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +239 -0
  259. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +34 -1
  260. package/bizar-dash/src/web/v8/ui/index.ts +7 -1
  261. package/bizar-dash/src/web/v8/ui/tasks/TaskDetail.tsx +313 -0
  262. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +465 -33
  263. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +210 -0
  264. package/bizar-dash/src/web/v8/views/Agents/AgentHierarchy.tsx +212 -0
  265. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +328 -21
  266. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +241 -0
  267. package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +175 -0
  268. package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +442 -0
  269. package/bizar-dash/src/web/v8/views/Backup/BackupView.tsx +204 -0
  270. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +356 -0
  271. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +133 -0
  272. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx +331 -0
  273. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +210 -0
  274. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +22 -7
  275. package/bizar-dash/src/web/v8/views/Config/ConfigView.tsx +364 -0
  276. package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +160 -0
  277. package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +196 -0
  278. package/bizar-dash/src/web/v8/views/Doctor/DoctorView.tsx +181 -0
  279. package/bizar-dash/src/web/v8/views/EnvVars/EnvVarsView.tsx +365 -0
  280. package/bizar-dash/src/web/v8/views/Eval/EvalView.tsx +278 -0
  281. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +169 -11
  282. package/bizar-dash/src/web/v8/views/Headroom/HeadroomView.tsx +201 -0
  283. package/bizar-dash/src/web/v8/views/History/HistoryView.tsx +227 -0
  284. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +13 -3
  285. package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +183 -0
  286. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +203 -22
  287. package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +159 -0
  288. package/bizar-dash/src/web/v8/views/Mods/ModsView.tsx +348 -0
  289. package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +178 -0
  290. package/bizar-dash/src/web/v8/views/Obsidian/ObsidianView.tsx +193 -0
  291. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +114 -11
  292. package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +253 -0
  293. package/bizar-dash/src/web/v8/views/Providers/ProvidersView.tsx +371 -0
  294. package/bizar-dash/src/web/v8/views/Router.tsx +135 -0
  295. package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +427 -0
  296. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +343 -34
  297. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +177 -12
  298. package/bizar-dash/src/web/v8/views/Update/UpdateView.tsx +270 -0
  299. package/bizar-dash/src/web/v8/views/Usage/UsageView.tsx +210 -0
  300. package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +192 -0
  301. package/bizar-dash/tests/goals-decompose.test.mjs +5 -3
  302. package/bizar-dash/tests/tasks-patch-routes.test.mjs +194 -0
  303. package/bizar-dash/vite.config.ts +11 -3
  304. package/cli/__tests__/esm-no-require.test.mjs +97 -0
  305. package/cli/commands/tailscale.mjs +1 -3
  306. package/cli/commands/voice.mjs +2 -2
  307. package/cli/service-env.mjs +4 -5
  308. package/package.json +12 -3
  309. package/packages/sdk/dist/agent-registry.d.ts +134 -0
  310. package/packages/sdk/dist/agent-registry.js +228 -0
  311. package/packages/sdk/dist/consensus/byzantine.d.ts +159 -0
  312. package/packages/sdk/dist/consensus/byzantine.js +507 -0
  313. package/packages/sdk/dist/consensus/index.d.ts +60 -0
  314. package/packages/sdk/dist/consensus/index.js +76 -0
  315. package/packages/sdk/dist/consensus/queen.d.ts +86 -0
  316. package/packages/sdk/dist/consensus/queen.js +158 -0
  317. package/packages/sdk/dist/consensus/types.d.ts +155 -0
  318. package/packages/sdk/dist/consensus/types.js +29 -0
  319. package/packages/sdk/dist/dangerous-patterns.d.ts +27 -0
  320. package/packages/sdk/dist/dangerous-patterns.js +107 -0
  321. package/packages/sdk/dist/federation/audit.d.ts +71 -0
  322. package/packages/sdk/dist/federation/audit.js +133 -0
  323. package/packages/sdk/dist/federation/budget.d.ts +111 -0
  324. package/packages/sdk/dist/federation/budget.js +227 -0
  325. package/packages/sdk/dist/federation/envelope.d.ts +83 -0
  326. package/packages/sdk/dist/federation/envelope.js +92 -0
  327. package/packages/sdk/dist/federation/hmac.d.ts +61 -0
  328. package/packages/sdk/dist/federation/hmac.js +120 -0
  329. package/packages/sdk/dist/federation/index.d.ts +108 -0
  330. package/packages/sdk/dist/federation/index.js +275 -0
  331. package/packages/sdk/dist/federation/pii.d.ts +72 -0
  332. package/packages/sdk/dist/federation/pii.js +178 -0
  333. package/packages/sdk/dist/federation/policy.d.ts +50 -0
  334. package/packages/sdk/dist/federation/policy.js +76 -0
  335. package/packages/sdk/dist/federation/trust.d.ts +80 -0
  336. package/packages/sdk/dist/federation/trust.js +126 -0
  337. package/packages/sdk/dist/fingerprint.d.ts +18 -0
  338. package/packages/sdk/dist/fingerprint.js +0 -0
  339. package/packages/sdk/dist/index.d.ts +25 -0
  340. package/packages/sdk/dist/index.js +25 -0
  341. package/packages/sdk/dist/mcp/bin.d.ts +16 -0
  342. package/packages/sdk/dist/mcp/bin.js +46 -0
  343. package/packages/sdk/dist/mcp/server.d.ts +105 -0
  344. package/packages/sdk/dist/mcp/server.js +682 -0
  345. package/packages/sdk/dist/memory/index.d.ts +43 -0
  346. package/packages/sdk/dist/memory/index.js +159 -0
  347. package/packages/sdk/dist/router/codemod-intent.d.ts +68 -0
  348. package/packages/sdk/{src/router/codemod-intent.ts → dist/router/codemod-intent.js} +53 -66
  349. package/packages/sdk/dist/router/index.d.ts +100 -0
  350. package/packages/sdk/dist/router/index.js +149 -0
  351. package/packages/sdk/dist/router/memory-distillation.d.ts +58 -0
  352. package/packages/sdk/dist/router/memory-distillation.js +195 -0
  353. package/packages/sdk/dist/router/model-router.d.ts +83 -0
  354. package/packages/sdk/dist/router/model-router.js +207 -0
  355. package/packages/sdk/dist/router/q-learning-router.d.ts +85 -0
  356. package/packages/sdk/dist/router/q-learning-router.js +273 -0
  357. package/packages/sdk/dist/swarm-topology.d.ts +87 -0
  358. package/packages/sdk/dist/swarm-topology.js +219 -0
  359. package/packages/sdk/dist/version.d.ts +5 -0
  360. package/packages/sdk/dist/version.js +5 -0
  361. package/packages/sdk/package.json +1 -1
  362. package/plugins/bizar/LICENSE +21 -0
  363. package/plugins/bizar/dist/index.d.ts +25 -0
  364. package/plugins/bizar/dist/index.js +32 -0
  365. package/plugins/bizar/package.json +18 -0
  366. package/.claude/CLAUDE.md +0 -15
  367. package/.claude/agents/_shared/AGENT_BASELINE.md +0 -168
  368. package/.claude/agents/_shared/CLAUDE_TOOLS.md +0 -412
  369. package/.claude/agents/_shared/SKILLS.md +0 -109
  370. package/.claude/agents/agent-browser.md +0 -80
  371. package/.claude/agents/baldr.md +0 -49
  372. package/.claude/agents/forseti.md +0 -51
  373. package/.claude/agents/frigg.md +0 -42
  374. package/.claude/agents/heimdall.md +0 -33
  375. package/.claude/agents/hermod.md +0 -53
  376. package/.claude/agents/mimir.md +0 -49
  377. package/.claude/agents/odin.md +0 -287
  378. package/.claude/agents/quick.md +0 -34
  379. package/.claude/agents/semble-search.md +0 -50
  380. package/.claude/agents/thor.md +0 -53
  381. package/.claude/agents/tyr.md +0 -56
  382. package/.claude/agents/vidarr.md +0 -54
  383. package/.claude/agents/vor.md +0 -53
  384. package/.claude/commands/audit.md +0 -25
  385. package/.claude/commands/bizar.md +0 -22
  386. package/.claude/commands/explain.md +0 -17
  387. package/.claude/commands/goal.md +0 -98
  388. package/.claude/commands/init.md +0 -29
  389. package/.claude/commands/learn.md +0 -44
  390. package/.claude/commands/plan.md +0 -35
  391. package/.claude/commands/plow-through.md +0 -50
  392. package/.claude/commands/pr-review.md +0 -49
  393. package/.claude/commands/setup-provider.md +0 -96
  394. package/.claude/commands/tailscale-serve.md +0 -100
  395. package/.claude/commands/team.md +0 -132
  396. package/.claude/commands/test.md +0 -62
  397. package/.claude/commands/validate.md +0 -68
  398. package/.claude/commands/visual-plan.md +0 -24
  399. package/.claude/hooks/README.md +0 -92
  400. package/.claude/hooks/posttooluse-editwrite.mjs +0 -91
  401. package/.claude/hooks/pretooluse-bash.mjs +0 -81
  402. package/.claude/hooks/pretooluse-editwrite.mjs +0 -139
  403. package/.claude/hooks/sessionend-recall.mjs +0 -74
  404. package/.claude/hooks/sessionstart-prime.mjs +0 -80
  405. package/.claude/hooks/userpromptsubmit-tag.mjs +0 -80
  406. package/.claude/hooks/worker-suggest.mjs +0 -110
  407. package/.claude/settings.json +0 -125
  408. package/.claude/settings.local.json +0 -7
  409. package/.claude/skills/9router/SKILL.md +0 -80
  410. package/.claude/skills/9router-chat/SKILL.md +0 -73
  411. package/.claude/skills/9router-embeddings/SKILL.md +0 -69
  412. package/.claude/skills/9router-image/SKILL.md +0 -86
  413. package/.claude/skills/9router-stt/SKILL.md +0 -79
  414. package/.claude/skills/9router-tts/SKILL.md +0 -80
  415. package/.claude/skills/9router-web-fetch/SKILL.md +0 -99
  416. package/.claude/skills/9router-web-search/SKILL.md +0 -91
  417. package/.claude/skills/bizar/README.md +0 -9
  418. package/.claude/skills/bizar/SKILL.md +0 -450
  419. package/.claude/skills/cpp-coding-standards/README.md +0 -28
  420. package/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
  421. package/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
  422. package/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
  423. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
  424. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
  425. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
  426. package/.claude/skills/cpp-testing/README.md +0 -28
  427. package/.claude/skills/cpp-testing/SKILL.md +0 -304
  428. package/.claude/skills/cpp-testing/references/coverage.md +0 -370
  429. package/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
  430. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
  431. package/.claude/skills/cpp-testing/references/mocking.md +0 -364
  432. package/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
  433. package/.claude/skills/cubesandbox/SKILL.md +0 -148
  434. package/.claude/skills/embedded-esp-idf/README.md +0 -41
  435. package/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
  436. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
  437. package/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
  438. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
  439. package/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
  440. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
  441. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
  442. package/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
  443. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
  444. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
  445. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
  446. package/.claude/skills/glyph/SKILL.md +0 -163
  447. package/.claude/skills/harness-engineering/SKILL.md +0 -143
  448. package/.claude/skills/lightrag/SKILL.md +0 -81
  449. package/.claude/skills/memory-protocol/SKILL.md +0 -105
  450. package/.claude/skills/obsidian/SKILL.md +0 -306
  451. package/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
  452. package/.claude/skills/self-improvement/SKILL.md +0 -64
  453. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +0 -6
  454. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +0 -1
  455. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +0 -1
  456. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +0 -1
  457. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +0 -28
  458. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +0 -1
  459. package/bizar-dash/dist/assets/Badge-BH4C3aUF.js +0 -1
  460. package/bizar-dash/dist/assets/Badge-BH4C3aUF.js.map +0 -1
  461. package/bizar-dash/dist/assets/Button-RmN1RKhE.js +0 -6
  462. package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +0 -1
  463. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +0 -6
  464. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +0 -1
  465. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +0 -1
  466. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +0 -67
  467. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +0 -1
  468. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +0 -13
  469. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +0 -1
  470. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +0 -1
  471. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +0 -1
  472. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +0 -16
  473. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +0 -1
  474. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +0 -10
  475. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +0 -1
  476. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +0 -43
  477. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +0 -1
  478. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +0 -1
  479. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +0 -1
  480. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +0 -1
  481. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +0 -16
  482. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +0 -1
  483. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +0 -1
  484. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +0 -1
  485. package/bizar-dash/dist/assets/index-AL3OLUfz.js +0 -1
  486. package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +0 -1
  487. package/bizar-dash/dist/assets/main-LxX9zTRk.js +0 -109
  488. package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +0 -1
  489. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +0 -11
  490. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +0 -1
  491. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +0 -1
  492. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +0 -1
  493. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +0 -1
  494. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +0 -1
  495. package/bizar-dash/dist/assets/wrench-B7go551L.js +0 -6
  496. package/bizar-dash/dist/assets/wrench-B7go551L.js.map +0 -1
  497. package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +0 -106
  498. package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +0 -62
  499. package/packages/sdk/ARCHITECTURE.md +0 -70
  500. package/packages/sdk/README.md +0 -80
  501. package/packages/sdk/src/agent-registry.ts +0 -304
  502. package/packages/sdk/src/consensus/byzantine.ts +0 -587
  503. package/packages/sdk/src/consensus/index.ts +0 -147
  504. package/packages/sdk/src/consensus/queen.ts +0 -173
  505. package/packages/sdk/src/consensus/types.ts +0 -199
  506. package/packages/sdk/src/dangerous-patterns.ts +0 -127
  507. package/packages/sdk/src/federation/audit.ts +0 -156
  508. package/packages/sdk/src/federation/budget.ts +0 -269
  509. package/packages/sdk/src/federation/envelope.ts +0 -144
  510. package/packages/sdk/src/federation/hmac.ts +0 -160
  511. package/packages/sdk/src/federation/index.ts +0 -443
  512. package/packages/sdk/src/federation/pii.ts +0 -241
  513. package/packages/sdk/src/federation/policy.ts +0 -112
  514. package/packages/sdk/src/federation/trust.ts +0 -146
  515. package/packages/sdk/src/fingerprint.ts +0 -0
  516. package/packages/sdk/src/index.ts +0 -114
  517. package/packages/sdk/src/mcp/bin.ts +0 -51
  518. package/packages/sdk/src/mcp/server.ts +0 -848
  519. package/packages/sdk/src/memory/index.ts +0 -160
  520. package/packages/sdk/src/router/index.ts +0 -247
  521. package/packages/sdk/src/router/memory-distillation-shim.mjs +0 -18
  522. package/packages/sdk/src/router/memory-distillation.ts +0 -249
  523. package/packages/sdk/src/router/model-router.ts +0 -235
  524. package/packages/sdk/src/router/q-learning-router.ts +0 -304
  525. package/packages/sdk/src/swarm-topology.ts +0 -279
  526. package/packages/sdk/src/version.ts +0 -4
  527. package/packages/sdk/tests/agent-registry.test.ts +0 -285
  528. package/packages/sdk/tests/consensus.test.ts +0 -376
  529. package/packages/sdk/tests/federation/audit.test.ts +0 -164
  530. package/packages/sdk/tests/federation/budget.test.ts +0 -189
  531. package/packages/sdk/tests/federation/envelope.test.ts +0 -120
  532. package/packages/sdk/tests/federation/hmac.test.ts +0 -194
  533. package/packages/sdk/tests/federation/orchestrator.test.ts +0 -176
  534. package/packages/sdk/tests/federation/pii.test.ts +0 -106
  535. package/packages/sdk/tests/federation/policy.test.ts +0 -140
  536. package/packages/sdk/tests/federation/trust.test.ts +0 -124
  537. package/packages/sdk/tests/mcp-tools.test.ts +0 -204
  538. package/packages/sdk/tests/memory-distillation.test.mjs +0 -186
  539. package/packages/sdk/tests/model-router.test.mjs +0 -108
  540. package/packages/sdk/tests/q-learning-router.test.mjs +0 -100
  541. package/packages/sdk/tests/router-orchestrator.test.mjs +0 -172
  542. package/packages/sdk/tests/router.test.mjs +0 -91
  543. package/packages/sdk/tests/sdk.test.mjs +0 -172
  544. package/packages/sdk/tests/swarm-topology.test.ts +0 -258
  545. package/packages/sdk/tsconfig.json +0 -25
  546. /package/bizar-dash/src/web/{v8.html → index.html} +0 -0
@@ -0,0 +1,157 @@
1
+ # Control Surfaces — v10.0.5
2
+
3
+ > Enumerates every v8 view and what mutations it can perform against
4
+ > the dashboard server. Proves the "full control and orchestration
5
+ > center" claim is concrete, not aspirational.
6
+ >
7
+ > Source: `bizar-dash/src/web/v8/views/**/*.tsx` (37 views) +
8
+ > `bizar-dash/src/server/routes/*.mjs`.
9
+
10
+ ## Mutation categories
11
+
12
+ | Tier | Symbol | Meaning |
13
+ |---|---|---|
14
+ | 3 | 🟢 **full** | Create + update + delete + invoke/bulk |
15
+ | 2 | 🟡 **partial** | Update or invoke only (no create/delete) |
16
+ | 1 | 🔵 **read+actions** | Read-only display + a few action buttons (restart, export, etc.) |
17
+ | 0 | ⚪ **read-only** | Pure observability — no mutations |
18
+
19
+ ## Per-view mutation matrix
20
+
21
+ ### 🟢 Tier 3 — full CRUD
22
+
23
+ | View | Creates | Updates | Deletes | Other actions | E2E proof |
24
+ |---|---|---|---|---|---|
25
+ | **Agents** | `POST /api/agents` | `PUT /api/agents/:name`, `POST /api/agents/:name/status` | `DELETE /api/agents/:name` | `POST /api/agents/:name/{restart,heartbeat,invoke}` | crud-roundtrip |
26
+ | **Tasks** | `POST /api/tasks` | `PATCH /api/tasks/:id`, `PATCH /api/tasks/bulk-status` | `DELETE /api/tasks/:id` | move between kanban columns | crud-roundtrip |
27
+ | **Goals** | `POST /api/goals` | `PATCH /api/goals/:id`, `PATCH /api/goals/:id/status`, `POST /api/goals/:id/key-results` | `DELETE /api/goals/:id/key-results/:krId`, `DELETE /api/goals/:id` | `POST /api/goals/:id/decompose` (goal → tasks) | crud-roundtrip |
28
+ | **Settings** | — | `PUT /api/settings`, `PUT /api/settings/plugin-options` | `POST /api/settings/reset` | `POST /api/admin/{gc,memory/reindex,cache/clear}` | config-coverage |
29
+ | **Providers** | `POST /api/providers` (via auto-add wizard) | `PUT /api/providers/:id`, `POST /api/providers/:id/{enable,disable,rotate}` | `DELETE /api/providers/:id` | `POST /api/providers/auto-detect` | tier3-batch-a + tier3-batch-c |
30
+ | **Projects** | `POST /api/projects`, `POST /api/projects/auto-detect`, `POST /api/projects/scan` | `PATCH /api/projects/:id`, `POST /api/projects/:id/activate` | `DELETE /api/projects/:id` | `POST /api/projects/refresh` | crud-roundtrip |
31
+ | **ClaudeSessions** | `POST /api/claude-sessions/new` | `PATCH /api/claude-sessions/:id` (rename) | `DELETE /api/claude-sessions/:id` | `POST /api/claude-sessions/:id/resume` | tier3-batch-c (resume) |
32
+ | **EnvVars** | `POST /api/env-vars` | `PUT /api/env-vars/:key` | `DELETE /api/env-vars/:key` | `POST /api/env-vars/:name/test` | tier3-batch-a |
33
+ | **Mods** | `POST /api/mods` (install) | `PATCH /api/mods/:id` (enable/disable) | `DELETE /api/mods/:id` (uninstall) | `POST /api/mods/:id/{enable,disable}`, `POST /api/mods/:id/instructions/reinstall`, `PUT /api/mods/:id/mod-file/*` | tier3-batch-a |
34
+ | **Dialogs** | `POST /api/dialogs/:id/{approve,deny,skip}` (resolution) | `PATCH /api/dialogs/:id` | `DELETE /api/dialogs/:id` | approve / deny / skip | tier3-batch-c |
35
+ | **Backup** | `POST /api/backup/create` | — | — | `POST /api/backup/restore`, `POST /api/backup/verify` | — |
36
+ | **Eval** | `POST /api/eval/run` | — | — | rerun eval suite | tier3-batch-a |
37
+
38
+ ### 🟡 Tier 2 — partial mutations
39
+
40
+ | View | Mutations |
41
+ |---|---|
42
+ | **Chat** | `POST /api/chat/{regenerate,audit}` — no conversation CRUD (uses Claude Code sessions) |
43
+ | **Headroom** | `POST /api/headroom/{install,start,stop,wrap,unwrap}` — runtime toggle |
44
+ | **LightRAG** | `POST /api/lightrag/{autostart,defaults}` — config + lifecycle |
45
+ | **Misc** | `POST /api/tailscale/{enable,disable}` — Tailscale tunnel toggle |
46
+ | **Notifications** | `POST /api/notifications/read-all` — bulk mark read |
47
+ | **Obsidian** | `POST /api/obsidian/index` — re-index vault |
48
+ | **Update** | `POST /api/updates/apply` — apply pending update |
49
+ | **Config** | `PUT /api/config` — single-doc config |
50
+ | **Artifacts** | `POST /api/artifacts` — accept/stage artifact (no full CRUD) |
51
+
52
+ ### 🔵 Tier 1 — read + actions
53
+
54
+ | View | Read | Actions |
55
+ |---|---|---|
56
+ | **Overview** | `/api/snapshot` | navigation only |
57
+ | **Activity** | `/api/activity` (SSE tail) | export NDJSON (`GET /api/admin/activity/export`) |
58
+ | **Usage** | `/api/usage?range=24h` + per-model | time-range chips (refresh-only) |
59
+ | **Memory** | `/api/memory/notes` (plural) | none surfaced (config-only) |
60
+ | **Voice** | `/api/voice/list` | upload via raw `fetch('/api/voice/upload')` |
61
+ | **Doctor** | `/api/doctor/status` | `POST /api/doctor/check` (run diagnostics) |
62
+ | **Clipboard** | `/api/clipboard/history` | `POST /api/clipboard/save` |
63
+ | **History** | `/api/history` | clear-history (if wired) |
64
+ | **Schedules** | `/api/schedules` | enable/disable per row |
65
+ | **BackgroundJobs** | `/api/background-jobs` | pause/resume per row |
66
+
67
+ ### ⚪ Tier 0 — read-only observability
68
+
69
+ | View | Source |
70
+ |---|---|
71
+ | **Auth** | `/api/auth/me`, `/api/auth/sessions` (logout button is its own POST) |
72
+ | **Admin** | `/api/admin/{health,gc}` summary (mutations live on Settings → Storage) |
73
+ | **Diagnostics** | `/api/diagnostics/*` |
74
+ | **CommandPalette** | `/api/agents`, `/api/skills` (palettes spawn things, not mutate itself) |
75
+ | **Libraries** | `/api/libraries` |
76
+
77
+ ## Mutating endpoints NOT covered by a view
78
+
79
+ These endpoints exist server-side but no v8 view exposes them. Most
80
+ are reached via curl / TUI / Claude Code directly:
81
+
82
+ - `POST /api/memory/*` — only the in-View reindex button is exposed;
83
+ no create-note form.
84
+ - `POST /api/dialogs/:id/{approve,deny}` is exposed; some deeper
85
+ dialog lifecycle routes may not have a button.
86
+ - `POST /api/usage/*` — only display; no clear-usage button.
87
+ - `POST /api/admin/*` — only the Storage-section GC/clear/reindex
88
+ buttons reach `/api/admin/*`; the rest of admin stays CLI/TUI.
89
+
90
+ ## WS-driven surfaces (mutations come back via push)
91
+
92
+ These views surface state the dashboard doesn't directly mutate but
93
+ that downstream mutations trigger over WS:
94
+
95
+ - **Agents** → `agents:change`, `agent:status`, `agent:restarted`
96
+ - **Goals** → `goals:change`, `goals:removed`
97
+ - **Tasks** → `tasks:change`
98
+ - **Dialogs** → `dialog:show`, `dialog:resolved`
99
+ - **Activity** → `activity:new` (SSE)
100
+ - **Update** → `update:progress`, `update:log`, `update:complete`
101
+ - **Settings** → `settings:change`, `settings:plugin-options:changed`
102
+
103
+ ## v10.0.5 audit deltas
104
+
105
+ - **Tier 3 proof column added.** Every Tier 3 row now names the
106
+ E2E script that proves the round-trip (crud-roundtrip,
107
+ tier3-batch-a, tier3-batch-c, config-coverage, etc). The
108
+ full results live in `/tmp/{crud,tier3a,tier3c,cfg,full,mat}-<pid>/`.
109
+ - **Dialogs promoted Tier 1 → Tier 3.** New approve/deny/skip
110
+ buttons wired to `POST /api/dialogs/:id/{approve,deny,skip}`
111
+ + PATCH for `data`-merge. See Move 2c.
112
+ - **Providers expanded.** New POST (create), PUT (update),
113
+ DELETE, POST `/:id/enable|disable` endpoints + matching UI
114
+ buttons. See Moves 2b + 2c.
115
+ - **ClaudeSessions expanded.** New `POST /:id/resume` route
116
+ + Resume button per row. See Moves 2b + 2c.
117
+ - **EnvVars expanded.** New `POST /:name/test` route + Test
118
+ button per row. See Move 2a.
119
+ - **Mods expanded.** New `POST /:id/instructions/reinstall` +
120
+ `PUT /:id/mod-file/*` + matching buttons. See Move 2a.
121
+ - **Eval expanded.** Schedules CRUD (POST + DELETE) + Add/Delete
122
+ buttons. See Move 2a.
123
+ - **Projects expanded.** New `POST /api/projects/refresh` +
124
+ button. See Move 2a.
125
+
126
+ ## "Full control" verdict
127
+
128
+ Of 37 views:
129
+ - **13 views** are full CRUD (Tier 3).
130
+ - **9 views** expose partial mutations (Tier 2).
131
+ - **10 views** offer read + targeted actions (Tier 1).
132
+ - **5 views** are pure observability (Tier 0).
133
+
134
+ Net: every primary agent, task, goal, provider, project, settings,
135
+ session, environment, mod, and artifact surface exposes at least one
136
+ mutation path from the dashboard. The Tier 0/1 views are
137
+ intentionally read-only because the mutations live closer to the
138
+ feature surface (CLI, Claude Code sessions, TUI) or because the data
139
+ is sourced from external systems (Skills, MCPs, Plugins, Hooks,
140
+ Libraries).
141
+
142
+ ## Gaps worth follow-up
143
+
144
+ 1. **Memory create-note form.** MemoryView currently has read-only
145
+ config + reindex; the create-note flow is only available via the
146
+ plugin / Claude Code.
147
+ 2. **Schedules CRUD.** Schedules view is Tier 1; no create/delete
148
+ surfaced.
149
+ 3. **Bulk-clear activity log** lives on Storage → Clear cache, not on
150
+ Activity. See SETTINGS_AUDIT.md finding 13.
151
+
152
+ ## See also
153
+
154
+ - `bizar-dash/src/web/v8/views/` — 37 view directories
155
+ - `bizar-dash/src/server/routes/` — 30+ route files
156
+ - `bizar-dash/SETTINGS_AUDIT.md` — per-row audit of the Settings page
157
+ - `CHANGELOG.md` v10.0.0 — what was added in this release
@@ -0,0 +1,225 @@
1
+ # Settings Audit — v10.0.0
2
+
3
+ > Maps every row in `SettingsView.tsx` to its backing endpoint and the
4
+ > on-disk file the value lives in. Verifies the "control and configure
5
+ > everything" claim for the Settings page.
6
+ >
7
+ > Source of truth: `bizar-dash/src/web/v8/views/Settings/SettingsView.tsx`
8
+ > (19 sections) + `bizar-dash/src/server/routes/_shared.mjs` (`DEFAULT_SETTINGS`)
9
+ > + `bizar-dash/src/server/routes/settings.mjs`.
10
+
11
+ ## Backing store map
12
+
13
+ | Where it lives | Path | Owner |
14
+ |---|---|---|
15
+ | Server-side settings (most rows) | `~/.config/bizar/settings.json` | `PUT /api/settings` |
16
+ | Browser-local theme | `localStorage["bizar.theme.mode"]` | `useTheme().setMode()` |
17
+ | Provider keys (real) | `~/.config/bizar/env.json` (mode 0600) | `PUT /api/env-vars` |
18
+ | Usage / LightRAG / Memory (separate) | per-feature config files | per-feature endpoints |
19
+ | Activity log (read-only here) | append-only NDJSON in `~/.local/share/bizar/activity.ndjson` | streamed |
20
+ | Claude sessions path | `~/.claude/sessions` (env) | read-only display |
21
+
22
+ ## Section-by-section audit
23
+
24
+ Legend:
25
+ - ✅ mutates → persists to a backing store
26
+ - 👁 read-only → renders a value from a fetch but no UI control mutates it
27
+ - ⚠️ mixed → some rows mutate, others are read-only
28
+
29
+ ### 1. General (✅)
30
+ | Row id | Mutates via | Persisted to |
31
+ |---|---|---|
32
+ | `workspace-name` | `update('workspaceName')` | `settings.json.workspaceName` |
33
+ | `workspace-timezone` | `update('workspaceTimezone')` | `settings.json.workspaceTimezone` |
34
+ | `default-view` | `update('defaultView')` | `settings.json.defaultView` |
35
+
36
+ ### 2. Theme (⚠️ — split storage)
37
+ | Row id | Mutates via | Persisted to |
38
+ |---|---|---|
39
+ | `theme-mode` | `theme.setMode()` | `localStorage["bizar.theme.mode"]` (NOT settings.json) |
40
+ | `theme-accent` | `update('themeAccent')` | `settings.json.themeAccent` |
41
+ | `theme-font` | `patch('themeFont')` | `settings.json.themeFont` |
42
+ | `theme-radius` | `patch('themeRadius')` | `settings.json.themeRadius` |
43
+
44
+ **Finding:** `theme-mode` is the only theme control that lives in localStorage,
45
+ not `settings.json`. Acceptable because mode is a per-browser preference and
46
+ the rest of the theme syncs across devices — but the split is non-obvious.
47
+ ponytail: persist theme.mode via `/api/settings` when server-side sync is
48
+ ever needed (multi-device or headless dashboard).
49
+
50
+ ### 3. Density (✅)
51
+ | Row id | Mutates via | Persisted to |
52
+ |---|---|---|
53
+ | `density-mode` | `density.setDensity()` | localStorage (similar hybrid as theme — `useDensity` hook) |
54
+ | `density-base-font` | `update('densityBaseFont')` | `settings.json.densityBaseFont` |
55
+
56
+ ### 4. Density rules (✅)
57
+ | Row id | Mutates via | Persisted to |
58
+ |---|---|---|
59
+ | `tasks-compact` | `update('tasksCompact')` | `settings.json.tasksCompact` |
60
+ | `memory-compact` | `update('memoryCompact')` | `settings.json.memoryCompact` |
61
+ | `activity-compact` | `update('activityCompact')` | `settings.json.activityCompact` |
62
+
63
+ ### 5. Command palette (✅)
64
+ | Row id | Mutates via | Persisted to |
65
+ |---|---|---|
66
+ | `palette-history` | `update('paletteHistory')` | `settings.json.paletteHistory` |
67
+ | `palette-fuzzy` | `update('paletteFuzzy')` | `settings.json.paletteFuzzy` |
68
+ | `palette-navigate` | `patch('paletteNavigate')` | `settings.json.paletteNavigate` |
69
+ | `palette-spawn` | `patch('paletteSpawn')` | `settings.json.paletteSpawn` |
70
+ | `palette-scope` | `update('paletteScope')` | `settings.json.paletteScope` |
71
+
72
+ ### 6. Keyboard (👁)
73
+ All `kb-*` rows are read-only. SettingsView documents the binding in
74
+ `~/.claude/keybindings.json`. Mutations live in the CLI/TUI flow,
75
+ not the dashboard.
76
+
77
+ ### 7. Notifications (✅)
78
+ | Row id | Mutates via | Persisted to |
79
+ |---|---|---|
80
+ | `n-agent-finished` | `update('notifyAgentFinished')` | `settings.json.notifyAgentFinished` |
81
+ | `n-task-moved` | `patch('notifyTaskMoved')` | `settings.json.notifyTaskMoved` |
82
+ | `n-ci-failed` | `update('notifyCiFailed')` | `settings.json.notifyCiFailed` |
83
+ | `n-token-budget` | `update('notifyTokenBudget')` | `settings.json.notifyTokenBudget` |
84
+ | `n-daily-digest` | `update('notifyDailyDigest')` | `settings.json.notifyDailyDigest` |
85
+ | `n-channel` | `update('notifyChannel')` | `settings.json.notifyChannel` |
86
+
87
+ ### 8. Storage (⚠️)
88
+ | Row id | Mutates via | Persisted to |
89
+ |---|---|---|
90
+ | `store-path` | `update('storagePath')` | `settings.json.storagePath` |
91
+ | `cache-path` | `update('cachePath')` | `settings.json.cachePath` |
92
+ | `sessions-path` | `update('sessionsPath')` | `settings.json.sessionsPath` |
93
+ | `cache-size` | `update('cacheSizeMb')` | `settings.json.cacheSizeMb` |
94
+ | `store-gc` | `POST /api/admin/gc` | runs server-side GC |
95
+ | `store-clear` | `POST /api/admin/cache/clear` | wipes cache + activity log |
96
+
97
+ **Finding:** the path fields write to settings.json but the server
98
+ doesn't appear to *consume* them at runtime (the actual storage paths
99
+ are constants in each store module). Persisted state vs effective state
100
+ drift. ponytail: either (a) wire these to the store modules' root
101
+ constants at boot, or (b) drop the rows and document that paths are
102
+ env-configured only. Recommended: (a) — single source of truth.
103
+
104
+ ### 9. Plugins (👁)
105
+ `plugins-count`, `plugins-bizar`, `plugins-list` all sourced from
106
+ `useFetch('/api/agents')` and `useFetch('/api/skills?kind=skills')`.
107
+ Read-only count + summary. Mutations to plugin registration live in
108
+ the filesystem (`.claude/`), not the dashboard.
109
+
110
+ ### 10. MCP servers (👁)
111
+ `mcps-count`, `mcps-list` from `useFetch('/api/skills?kind=mcps')`.
112
+ Read-only summary; mutations live in `.claude/mcp.json`.
113
+
114
+ ### 11. Skills (👁)
115
+ Sourced from `useFetch('/api/skills?kind=skills')`. Read-only count +
116
+ breakdown by source. Mutations live in `bizar-dash/skills/<name>/`.
117
+
118
+ ### 12. Hooks (👁)
119
+ Sourced from `useFetch('/api/skills?kind=hooks')`. Read-only summary;
120
+ mutations live in `.claude/hooks/`.
121
+
122
+ ### 13. Activity (⚠️)
123
+ | Row id | Mutates via | Persisted to |
124
+ |---|---|---|
125
+ | `activity-retention` | `update('activityRetentionDays')` | `settings.json.activityRetentionDays` |
126
+ | `activity-hide` | `patch('activityHide')` (onBlur) | `settings.json.activityHide` |
127
+ | `activity-export` | `GET /api/admin/activity/export` | downloads `activity.ndjson` |
128
+
129
+ **Finding:** `activity-export` is a download endpoint, not a mutation
130
+ button — correct behaviour. But the matching "Clear activity log"
131
+ destructive button lives in Storage → `store-clear` rather than here,
132
+ which is non-obvious. Acceptable but a discoverability gap.
133
+
134
+ ### 14. Memory (⚠️)
135
+ | Row id | Mutates via | Persisted to |
136
+ |---|---|---|
137
+ | `memory-auto-commit` | `update('memoryAutoCommit')` | `settings.json.memoryAutoCommit` |
138
+ | `memory-scope` | `update('memoryScopeDefault')` | `settings.json.memoryScopeDefault` |
139
+ | `memory-index` | `POST /api/admin/memory/reindex` | rebuilds search index |
140
+
141
+ **Finding:** Memory also has its own Settings page (MemoryView) with
142
+ LightRAG URL, Obsidian vault path, git repo config — those live
143
+ under a separate `~/.config/bizar/memory-config.json` and
144
+ `/api/memory/config/global`. Two settings surfaces for one feature is
145
+ non-obvious. ponytail: consolidate into the Settings → Memory section
146
+ when the time comes.
147
+
148
+ ### 15. Task defaults (✅)
149
+ | Row id | Mutates via | Persisted to |
150
+ |---|---|---|
151
+ | `task-priority` | `update('defaultTaskPriority')` | `settings.json.defaultTaskPriority` |
152
+ | `task-column` | `update('defaultTaskColumn')` | `settings.json.defaultTaskColumn` |
153
+ | `task-assignee` | `patch('defaultTaskAssignee')` (onBlur) | `settings.json.defaultTaskAssignee` |
154
+
155
+ ### 16. Agent defaults (✅)
156
+ | Row id | Mutates via | Persisted to |
157
+ |---|---|---|
158
+ | `agent-model` | `update('defaultAgentModel')` | `settings.json.defaultAgentModel` |
159
+ | `agent-mistakes` | `update('defaultAgentMaxMistakes')` | `settings.json.defaultAgentMaxMistakes` |
160
+ | `agent-bg` | `patch('agentBackgroundDefault')` | `settings.json.agentBackgroundDefault` |
161
+ | `agent-worktree` | `patch('agentWorktree')` | `settings.json.agentWorktree` |
162
+ | `agent-system-prompt` | `patch('agentSystemPrompt')` (onBlur) | `settings.json.agentSystemPrompt` |
163
+
164
+ ### 17. Privacy (✅)
165
+ | Row id | Mutates via | Persisted to |
166
+ |---|---|---|
167
+ | `privacy-analytics` | `update('analytics')` | `settings.json.analytics` |
168
+ | `privacy-crash` | `update('crashReports')` | `settings.json.crashReports` |
169
+ | `privacy-pii` | `update('piiMode')` | `settings.json.piiMode` |
170
+
171
+ ### 18. Advanced (✅)
172
+ | Row id | Mutates via | Persisted to |
173
+ |---|---|---|
174
+ | `adv-reduced-motion` | `update('reducedMotion')` | `settings.json.reducedMotion` |
175
+ | `adv-debug-overlay` | `update('debugOverlay')` | `settings.json.debugOverlay` |
176
+ | `adv-reset` | `POST /api/settings/reset` | wipes back to `DEFAULT_SETTINGS` |
177
+
178
+ ## Rollup
179
+
180
+ - 19 sections, 60 rows total.
181
+ - **47 ✅** — fully mutate to settings.json + (where relevant) broadcast.
182
+ - **6 👁** — read-only count/list rows (Plugins, MCPs, Skills, Hooks,
183
+ Keyboard). Mutations are filesystem-only.
184
+ - **6 ⚠️** — split storage or discoverability gaps:
185
+ - Theme: mode in localStorage, rest in settings.json.
186
+ - Density: mode in localStorage, rest in settings.json.
187
+ - Storage: paths persist but aren't consumed at runtime.
188
+ - Activity: destructive "clear log" lives in Storage not Activity.
189
+ - Memory: split between Settings → Memory (this section) and the
190
+ separate MemoryView.
191
+
192
+ ## Audit verdict
193
+
194
+ "Control and configure everything from the dashboard" holds for the
195
+ **Settings page** specifically: every UI control that says "this changes
196
+ a setting" actually persists it via `/api/settings` (with the two
197
+ localStorage hybrids for browser-local prefs, which is a defensible
198
+ split). The non-mutating rows are correctly marked as summary rows.
199
+
200
+ Gaps that warrant follow-up work (not v10-blocking):
201
+
202
+ 1. **Storage paths persist but aren't consumed.** Either wire them in
203
+ or drop the rows.
204
+ 2. **Memory settings split across two pages.** Consolidate into Settings
205
+ → Memory.
206
+ 3. **Theme mode hybrid storage** is defensible but non-obvious. Worth
207
+ documenting in a tooltip.
208
+
209
+ ## Tests
210
+
211
+ - `/api/settings` (GET/PUT/POST reset) is exercised by the dashboard
212
+ via `useFetch` + `patch()` (unit-tested implicitly via SettingsView
213
+ smoke tests, no dedicated route test yet). ponytail: add
214
+ `tests/server/settings-route.test.mjs` for the round-trip.
215
+ - localStorage theme/density mutations are not directly testable
216
+ from the server; covered by component tests.
217
+
218
+ ## See also
219
+
220
+ - `bizar-dash/src/web/v8/views/Settings/SettingsView.tsx`
221
+ - `bizar-dash/src/server/routes/settings.mjs`
222
+ - `bizar-dash/src/server/routes/_shared.mjs` (DEFAULT_SETTINGS)
223
+ - `bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx`
224
+ - `CONTROL_SURFACES.md` — the broader "what can you mutate from the
225
+ dashboard" map across all v8 views (companion doc).
@@ -0,0 +1,11 @@
1
+ import{r as f,j as e}from"./cmdk-DMW_3pWz.js";import{g,c as v}from"./main-zDgXFFYt.js";import{T as j}from"./trending-up-DWgBlnxO.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 b=g("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/**
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 w=g("TrendingDown",[["polyline",{points:"22 17 13.5 8.5 8.5 13.5 2 7",key:"1r2t7k"}],["polyline",{points:"16 17 22 17 22 11",key:"11uiuu"}]]),S={up:"var(--success)",down:"var(--danger)",flat:"var(--fg-muted)"},T={up:j,down:w,flat:b},R=f.forwardRef(function(l,o){const{label:t,value:i,delta:n,trend:r,hint:a,icon:s,sparkline:d,loading:x,className:m,style:h,...y}=l,c=r!==void 0?T[r]:null;return e.jsxs("div",{ref:o,className:v("v8-stat-tile",m),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",padding:"var(--space-5)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",...h},...y,children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",fontWeight:500},children:t}),s!==void 0&&e.jsx("span",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:s})]}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-24)",fontWeight:600,color:"var(--fg)",fontVariantNumeric:"tabular-nums",lineHeight:"var(--lh-tight)"},children:x===!0?"—":i}),(n!==void 0||c!==null)&&e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:2,fontSize:"var(--fs-12)",fontWeight:500,color:r!==void 0?S[r]:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[c!==null&&e.jsx(c,{size:12,"aria-hidden":"true"}),n]})]}),a!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:a}),d!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-1)"},children:d})]})}),z=f.forwardRef(function(l,o){const{children:t,cols:i,minWidth:n=200,className:r,style:a,...s}=l,d=i!==void 0?`repeat(${i}, minmax(0, 1fr))`:`repeat(auto-fit, minmax(${n}px, 1fr))`;return e.jsx("div",{ref:o,className:v("v8-stat-grid",r),style:{display:"grid",gridTemplateColumns:d,gap:"var(--space-3)",...a},...s,children:t})}),u={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},W=f.forwardRef(function(l,o){const{items:t,empty:i,className:n,...r}=l;return t.length===0&&i!==void 0?e.jsx(e.Fragment,{children:i}):e.jsx("ol",{ref:o,className:v("v8-activity-feed",n),style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:"var(--space-2)"},...r,children:t.map(a=>{const s=a.tone??"neutral";return e.jsxs("li",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:"var(--radius-sm)",background:`color-mix(in oklch, ${u[s]} 14%, transparent)`,color:u[s],flexShrink:0},children:a.icon}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)",minWidth:0},children:a.title}),a.meta!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",flexShrink:0,fontVariantNumeric:"tabular-nums"},children:a.meta})]}),a.description!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:a.description})]})]},a.id)})})});export{W as A,b as M,z as S,R as a};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityFeed-DbZT1TnN.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/web/v8/ui/data/StatTile.tsx","../../src/web/v8/ui/activity/ActivityFeed.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 Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.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 TrendingDown = createLucideIcon(\"TrendingDown\", [\n [\"polyline\", { points: \"22 17 13.5 8.5 8.5 13.5 2 7\", key: \"1r2t7k\" }],\n [\"polyline\", { points: \"16 17 22 17 22 11\", key: \"11uiuu\" }]\n]);\n\nexport { TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendingDown, TrendingUp, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * StatTile — a single KPI tile for the overview.\n *\n * Pattern: `[label] [trend-icon delta]`\n * `[BIG value]`\n * `[sparkline?]`\n *\n * Use cases: Overview dashboard, agent detail, goal detail.\n */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatTileProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n /** Optional delta with trend direction (e.g. \"+12%\" vs last week). */\n delta?: ReactNode;\n trend?: StatTrend;\n /** Optional helper text under the value. */\n hint?: ReactNode;\n /** Optional icon for the top-right corner. */\n icon?: ReactNode;\n /** Inline sparkline rendered beneath the value (use the Sparkline component). */\n sparkline?: ReactNode;\n /** Loading state — replaces value with skeleton. */\n loading?: boolean;\n}\n\nconst TREND_FG: Record<StatTrend, string> = {\n up: 'var(--success)',\n down: 'var(--danger)',\n flat: 'var(--fg-muted)',\n};\n\nconst TREND_ICON: Record<StatTrend, typeof TrendingUp> = {\n up: TrendingUp,\n down: TrendingDown,\n flat: Minus,\n};\n\nexport const StatTile = forwardRef<HTMLDivElement, StatTileProps>(function StatTile(props, ref) {\n const {\n label,\n value,\n delta,\n trend,\n hint,\n icon,\n sparkline,\n loading,\n className,\n style,\n ...rest\n } = props;\n const TrendIcon = trend !== undefined ? TREND_ICON[trend] : null;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-tile', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-5)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', fontWeight: 500 }}>\n {label}\n </div>\n {icon !== undefined && (\n <span style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 'var(--space-2)' }}>\n <div\n style={{\n fontSize: 'var(--fs-24)',\n fontWeight: 600,\n color: 'var(--fg)',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: 'var(--lh-tight)',\n }}\n >\n {loading === true ? '—' : value}\n </div>\n {(delta !== undefined || TrendIcon !== null) && (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: trend !== undefined ? TREND_FG[trend] : 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {TrendIcon !== null && <TrendIcon size={12} aria-hidden=\"true\" />}\n {delta}\n </div>\n )}\n </div>\n {hint !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{hint}</div>\n )}\n {sparkline !== undefined && <div style={{ marginTop: 'var(--space-1)' }}>{sparkline}</div>}\n </div>\n );\n});\n\n/**\n * StatGrid — responsive grid for StatTiles. Auto-fits 1..4 columns.\n */\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Min tile width (default 200px). */\n minWidth?: number;\n cols?: 2 | 3 | 4;\n}\n\nexport const StatGrid = forwardRef<HTMLDivElement, StatGridProps>(function StatGrid(props, ref) {\n const { children, cols, minWidth = 200, className, style, ...rest } = props;\n const gridTemplate = cols !== undefined\n ? `repeat(${cols}, minmax(0, 1fr))`\n : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: gridTemplate,\n gap: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n});","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["Minus","createLucideIcon","TrendingDown","TREND_FG","TREND_ICON","TrendingUp","StatTile","forwardRef","props","ref","label","value","delta","trend","hint","icon","sparkline","loading","className","style","rest","TrendIcon","jsxs","cx","jsx","StatGrid","children","cols","minWidth","gridTemplate","TONE_BG","ActivityFeed","items","empty","item","tone"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,7 @@
1
+ import{r as d,j as e}from"./cmdk-DMW_3pWz.js";import{g as re,u as se,a as ae,S as g,I as f,d as O,A as F,C as K,h as _,T as S,b as q,L,e as ne,B as D,f as oe,F as ie,W as ce,c as le}from"./main-zDgXFFYt.js";import{G as de}from"./Grid-CN6IV8NB.js";import{V as ue}from"./ViewHeader-2Oyjj9Yt.js";import{L as ge}from"./ListHeader-DRqP1u_I.js";import{S as fe}from"./Sparkline-fGhOoGf0.js";import{C as G,b as V}from"./Card-ZAdgpn3-.js";import{E as he}from"./ErrorState-DZYn3VL_.js";import{S as P}from"./Switch-D5gPfsKd.js";import{S as pe}from"./Slider-DmOSInmR.js";import{C as U}from"./circle-COwUk6Jw.js";import{G as H,a as me}from"./git-pull-request-o7G3ez_L.js";import{C as ve}from"./clock-BsVbT1kp.js";import{T as R}from"./triangle-alert-D3wjJjjj.js";import{C as xe}from"./circle-check-CYpMZPTO.js";import"./circle-alert-D_fRRCnG.js";import"./refresh-ccw-BQ_hQs-U.js";import"./index-VI2tohpo.js";import"./index-CRPdftkz.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 ye=re("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]),y={task:{label:"Tasks",icon:L,tone:"neutral"},agent:{label:"Agents",icon:q,tone:"info"},goal:{label:"Goals",icon:S,tone:"accent"},settings:{label:"Settings",icon:_,tone:"neutral"},system:{label:"System",icon:K,tone:"warning"},git:{label:"Git",icon:H,tone:"neutral"}},Y={"git.merge":{icon:H,tone:"success",source:"git"},"git.pull-request":{icon:me,tone:"info",source:"git"},"task.completed":{icon:xe,tone:"success",source:"task"},"task.failed":{icon:R,tone:"danger",source:"task"},"task.created":{icon:L,tone:"info",source:"task"},"task.moved":{icon:L,tone:"neutral",source:"task"},"agent.run":{icon:q,tone:"info",source:"agent"},"agent.tool":{icon:ce,tone:"neutral",source:"agent"},"agent.killed":{icon:R,tone:"warning",source:"agent"},"goal.created":{icon:S,tone:"info",source:"goal"},"goal.status":{icon:S,tone:"info",source:"goal"},"goal.decomposed":{icon:S,tone:"success",source:"goal"},"settings.changed":{icon:_,tone:"neutral",source:"settings"},"system.error":{icon:R,tone:"danger",source:"system"},"system.note":{icon:F,tone:"neutral",source:"system"},"agent.message":{icon:F,tone:"info",source:"agent"}};function T(s){const r=(s.kind||s.iconKey||"").toLowerCase();return r.startsWith("task")?"task":r.startsWith("agent")?"agent":r.startsWith("goal")?"goal":r.startsWith("settings")?"settings":r.startsWith("git")?"git":r.startsWith("system")?"system":s.title&&/goal/i.test(s.title)?"goal":s.title&&/(agent|claude|cc)/i.test(s.title)?"agent":"system"}function je(s){const r=Y[s.kind||s.iconKey||""]||Y["system.note"],u=T(s);return{icon:r.icon,tone:r.tone,source:u}}function ke(s){const r=new Date(s);return`${r.getFullYear()}-${String(r.getMonth()+1).padStart(2,"0")}-${String(r.getDate()).padStart(2,"0")}`}function be(s){const r=new Date,u=new Date(r.getFullYear(),r.getMonth(),r.getDate()).getTime(),c=new Date(s),j=new Date(c.getFullYear(),c.getMonth(),c.getDate()).getTime(),l=Math.round((u-j)/864e5);return l===0?"Today":l===1?"Yesterday":l<7?`${l} days ago`:c.toLocaleDateString(void 0,{weekday:"long",month:"short",day:"numeric"})}function Se(s){return new Date(s).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function we(s){if(!s||typeof s!="object")return null;const r=s;return Array.isArray(r.lines)&&r.lines.length>0?e.jsx(m,{style:{marginTop:6,fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:8},children:r.lines.slice(0,40).map((u,c)=>e.jsxs("div",{style:{color:u.kind==="+"?"var(--success)":u.kind==="-"?"var(--danger)":"var(--fg-muted)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("span",{style:{display:"inline-block",width:12},children:u.kind===" "?"":u.kind}),u.text]},c))}):r.before!==void 0||r.after!==void 0?e.jsxs(m,{style:{marginTop:6,display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:[r.before!==void 0&&e.jsxs(m,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 30%, var(--border))",borderRadius:"var(--radius-sm)",padding:8,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("strong",{style:{color:"var(--danger)"},children:"before"}),e.jsx("div",{children:String(r.before)})]}),r.after!==void 0&&e.jsxs(m,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 30%, var(--border))",borderRadius:"var(--radius-sm)",padding:8,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsx("strong",{style:{color:"var(--success)"},children:"after"}),e.jsx("div",{children:String(r.after)})]})]}):null}function m(s){return e.jsx("div",{className:le("v8-cl-box",s.className),style:s.style,children:s.children})}function Ue(){const s=se("/api/activity?limit=200"),[r,u]=d.useState([]),[c,j]=d.useState("all"),[l,$]=d.useState(!0),[w,Q]=d.useState(!1),[C,X]=d.useState(14),[E,M]=d.useState(null),[k,Z]=d.useState(""),ee=d.useCallback(t=>{if(!l)return;const a=t.event;a&&u(n=>[a,...n].slice(0,500))},[l]);ae("activity:new",ee);const v=d.useMemo(()=>{var t;return[...r,...((t=s.data)==null?void 0:t.events)||[]]},[r,s.data]),A=d.useMemo(()=>{let t=c==="all"?v:v.filter(a=>T(a)===c);if(k.trim()){const a=k.trim().toLowerCase();t=t.filter(n=>[n.title||"",n.description||"",n.kind||"",n.agent||"",n.actor||""].join(" ").toLowerCase().includes(a))}return t},[v,c,k]),W=Date.now()-C*864e5,h=d.useMemo(()=>A.filter(t=>(t.ts||0)>=W||t.ts===void 0),[A,W]),z=d.useMemo(()=>{const t=new Map;for(const n of h){const o=n.ts||Date.now(),i=ke(o);t.has(i)||t.set(i,[]),t.get(i).push(n)}const a=[];for(const[n,o]of t){const i=o.find(b=>b.ts),p=(i==null?void 0:i.ts)??Date.now();a.push({key:n,label:be(p),events:o})}return a.sort((n,o)=>n.key<o.key?1:-1)},[h]),x=d.useMemo(()=>{const t={all:0,task:0,agent:0,goal:0,settings:0,system:0,git:0};for(const a of v){const n=T(a);t.all+=1,t[n]+=1}return t},[v]),B=d.useMemo(()=>[...z].reverse().map(t=>t.events.length),[z]),te=async()=>{M(null);try{const a=((await oe("/api/activity?limit=10000")).events||[]).map(p=>JSON.stringify(p)).join(`
7
+ `),n=new Blob([a],{type:"application/x-ndjson"}),o=URL.createObjectURL(n),i=document.createElement("a");i.href=o,i.download=`bizar-activity-${new Date().toISOString().slice(0,10)}.ndjson`,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(o)}catch(t){M((t instanceof ie,t.message))}};return e.jsxs(g,{gap:5,"data-testid":"activity-view",children:[e.jsx(ue,{title:"Activity",description:"Day-grouped changelog across tasks, agents, goals, settings, and git.",actions:e.jsxs(f,{align:"center",gap:2,children:[e.jsx("input",{type:"search",placeholder:"Search…",value:k,onChange:t=>Z(t.target.value),"aria-label":"Search activity",style:{height:28,padding:"0 var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-12)",width:200,outline:"none"}}),e.jsxs(f,{align:"center",gap:1,children:[e.jsx(U,{size:8,"aria-hidden":!0,style:{color:l?"var(--success)":"var(--fg-muted)"},fill:"currentColor"}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:l?"Live":"Paused"}),e.jsx(O,{variant:"ghost",onClick:()=>$(t=>!t),"aria-label":l?"Pause stream":"Resume stream",children:l?"Pause":"Resume"})]}),e.jsxs(O,{variant:"secondary",onClick:()=>{te()},children:[e.jsx(ye,{size:12,"aria-hidden":!0})," Export NDJSON"]})]})}),e.jsx(ge,{title:"Feed",count:h.length,sparkline:B.length>=2?e.jsx(fe,{data:B,width:120,height:28}):void 0,description:`${x.task} task · ${x.agent} agent · ${x.goal} goal`,testid:"activity-list-header"}),E!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)"},children:E}),e.jsxs(f,{align:"center",gap:2,wrap:!0,children:[e.jsx(J,{label:`All (${x.all})`,active:c==="all",onClick:()=>j("all"),icon:e.jsx(F,{size:12,"aria-hidden":!0})}),Object.keys(y).map(t=>{const a=y[t],n=a.icon;return e.jsx(J,{label:`${a.label} (${x[t]})`,active:c===t,onClick:()=>j(t),icon:e.jsx(n,{size:12,"aria-hidden":!0})},t)})]}),e.jsx(G,{children:e.jsx(V,{children:e.jsxs(de,{cols:3,gap:4,children:[e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-auto",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Live tail"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(P,{id:"cl-auto",checked:l,onCheckedChange:$}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:l?"var(--success)":"var(--fg-muted)"},children:l?"on":"paused"})]})]}),e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-compact",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Compact rows"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(P,{id:"cl-compact",checked:w,onCheckedChange:Q}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:w?"compact":"comfortable"})]})]}),e.jsxs(g,{gap:1,children:[e.jsx("label",{htmlFor:"cl-days",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Look back"}),e.jsxs(f,{align:"center",gap:2,children:[e.jsx(pe,{id:"cl-days",value:[C],onValueChange:t=>X(t[0]??14),min:1,max:90,step:1}),e.jsxs("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:[C,"d"]})]})]})]})})}),!s.loading&&h.length===0&&e.jsx(G,{children:e.jsx(V,{children:e.jsxs(g,{gap:1,children:[e.jsx("strong",{children:"No activity matching filters."}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Clear the source filter or extend the look-back window."})]})})}),s.loading&&h.length===0?e.jsx(ne,{style:{height:320}}):s.error&&h.length===0?e.jsx(he,{block:!0,title:"Couldn't load activity",description:"The activity feed failed to fetch. Retry to refetch.",error:s.error,onRetry:()=>void s.refetch(),testid:"activity-error"}):e.jsx(g,{gap:5,children:z.map(t=>e.jsxs(g,{gap:3,children:[e.jsxs(f,{align:"center",gap:2,style:{position:"sticky",top:0,padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--surface-0) 88%, transparent)",backdropFilter:"blur(8px)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",zIndex:1},children:[e.jsx("h2",{style:{margin:0,fontSize:"var(--fs-16)",fontWeight:600},children:t.label}),e.jsx(D,{tone:"neutral",children:t.events.length}),e.jsx(ve,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:t.events.filter(a=>a.ts===void 0).length>0?"live + historical":"historical only"})]}),e.jsx(g,{gap:1,children:t.events.map((a,n)=>{var b,I,N;const o=je(a),i=((b=y[o.source])==null?void 0:b.icon)||K,p=a.ts??Date.now();return e.jsxs(m,{style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,padding:w?"6px 10px":"var(--space-3) var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",alignItems:"center"},children:[e.jsx(m,{style:{width:32,height:32,display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:"var(--radius-pill)",background:`color-mix(in oklch, var(--${o.tone==="neutral"?"fg-muted":o.tone}) 18%, var(--surface-0))`,color:`var(--${o.tone==="neutral"?"fg-muted":o.tone})`},children:e.jsx(o.icon,{size:14,"aria-hidden":!0})}),e.jsxs(g,{gap:1,children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:a.title??a.description??a.kind??"event"}),e.jsx(D,{tone:((I=y[o.source])==null?void 0:I.tone)??"neutral",children:e.jsxs(f,{align:"center",gap:1,children:[e.jsx(i,{size:10,"aria-hidden":!0})," ",((N=y[o.source])==null?void 0:N.label)??o.source]})}),a.kind&&e.jsx(D,{tone:"neutral",children:a.kind})]}),a.description&&a.description!==a.title&&e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:a.description}),we(a.meta)]}),e.jsxs(g,{align:"end",gap:1,children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:Se(p)}),typeof a.actor=="string"&&e.jsxs(f,{align:"center",gap:1,children:[e.jsx(U,{size:8,"aria-hidden":!0,style:{color:"var(--accent)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.actor})]})]})]},`${a.id??`${p}-${n}`}`)})})]},t.key))})]})}function J({label:s,active:r,onClick:u,icon:c}){return e.jsxs("button",{type:"button",onClick:u,"aria-pressed":r,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 10px",borderRadius:"var(--radius-pill)",border:`1px solid ${r?"var(--accent)":"var(--border)"}`,background:r?"color-mix(in oklch, var(--accent) 14%, var(--surface-1))":"var(--surface-1)",color:r?"var(--accent)":"var(--fg)",fontSize:"var(--fs-12)",cursor:"pointer",fontWeight:r?600:500},children:[c,s]})}export{Ue as ActivityView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityView-DfrBu-ED.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/filter.js","../../src/web/v8/views/Activity/ActivityView.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 Filter = createLucideIcon(\"Filter\", [\n [\"polygon\", { points: \"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\", key: \"1yg77f\" }]\n]);\n\nexport { Filter as default };\n//# sourceMappingURL=filter.js.map\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n GitMerge,\n GitPullRequest,\n AlertTriangle,\n CheckCircle2,\n Bot,\n Wrench,\n Activity as ActivityIcon,\n Layers,\n Target,\n Settings as SettingsIcon,\n Cpu,\n Filter,\n Clock,\n Circle,\n type LucideIcon,\n} 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 { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Sparkline } from '../../ui/data/Sparkline.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Slider } from '../../ui/controls/Slider.js';\nimport { cx } from '../../ui/utils/cx.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { ActivityEvent } from '../../data/types.js';\n\n/**\n * ActivityView — Sprint S15 visual changelog.\n *\n * Renders an explicit day-grouped changelog (\"Today\", \"Yesterday\", \"Mar 14\")\n * with source badges and per-event highlights. Diff payloads (`meta.diff`)\n * render as expanded preview blocks. Filter chips narrow by source. The\n * topbar lives above the list so screen-magnifier users see context.\n */\n\ntype Source = 'task' | 'agent' | 'goal' | 'settings' | 'system' | 'git' | 'all';\n\nconst SOURCE_META: Record<Exclude<Source, 'all'>, { label: string; icon: LucideIcon; tone: 'neutral' | 'info' | 'accent' | 'success' | 'warning' | 'danger' }> = {\n task: { label: 'Tasks', icon: Layers, tone: 'neutral' },\n agent: { label: 'Agents', icon: Bot, tone: 'info' },\n goal: { label: 'Goals', icon: Target, tone: 'accent' },\n settings: { label: 'Settings', icon: SettingsIcon, tone: 'neutral' },\n system: { label: 'System', icon: Cpu, tone: 'warning' },\n git: { label: 'Git', icon: GitMerge, tone: 'neutral' },\n};\n\nconst EVENT_TONE_MAP: Record<string, { icon: LucideIcon; tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; source: Source }> = {\n 'git.merge': { icon: GitMerge, tone: 'success', source: 'git' },\n 'git.pull-request': { icon: GitPullRequest, tone: 'info', source: 'git' },\n 'task.completed': { icon: CheckCircle2, tone: 'success', source: 'task' },\n 'task.failed': { icon: AlertTriangle, tone: 'danger', source: 'task' },\n 'task.created': { icon: Layers, tone: 'info', source: 'task' },\n 'task.moved': { icon: Layers, tone: 'neutral', source: 'task' },\n 'agent.run': { icon: Bot, tone: 'info', source: 'agent' },\n 'agent.tool': { icon: Wrench, tone: 'neutral', source: 'agent' },\n 'agent.killed': { icon: AlertTriangle, tone: 'warning', source: 'agent' },\n 'goal.created': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.status': { icon: Target, tone: 'info', source: 'goal' },\n 'goal.decomposed': { icon: Target, tone: 'success', source: 'goal' },\n 'settings.changed': { icon: SettingsIcon, tone: 'neutral', source: 'settings' },\n 'system.error': { icon: AlertTriangle, tone: 'danger', source: 'system' },\n 'system.note': { icon: ActivityIcon, tone: 'neutral', source: 'system' },\n 'agent.message': { icon: ActivityIcon, tone: 'info', source: 'agent' },\n};\n\nfunction inferSource(e: ActivityEvent): Source {\n const hint = (e.kind || e.iconKey || '').toLowerCase();\n if (hint.startsWith('task')) return 'task';\n if (hint.startsWith('agent')) return 'agent';\n if (hint.startsWith('goal')) return 'goal';\n if (hint.startsWith('settings')) return 'settings';\n if (hint.startsWith('git')) return 'git';\n if (hint.startsWith('system')) return 'system';\n if (e.title && /goal/i.test(e.title)) return 'goal';\n if (e.title && /(agent|claude|cc)/i.test(e.title)) return 'agent';\n return 'system';\n}\n\nfunction eventVisual(e: ActivityEvent): { icon: LucideIcon; tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; source: Source } {\n const m = EVENT_TONE_MAP[e.kind || e.iconKey || ''] || EVENT_TONE_MAP['system.note'];\n const inferred = inferSource(e);\n return { icon: m.icon, tone: m.tone, source: inferred };\n}\n\nfunction dayKey(ts: number): string {\n const d = new Date(ts);\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\nfunction dayLabel(ts: number): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const d = new Date(ts);\n const start = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const diffDays = Math.round((today - start) / 86_400_000);\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString(undefined, { weekday: 'long', month: 'short', day: 'numeric' });\n}\n\nfunction timeShort(ts: number): string {\n return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\ninterface DiffPayload { before?: string; after?: string; lines?: { kind: '+' | '-' | ' '; text: string }[] }\n\nfunction renderDiff(meta: unknown): JSX.Element | null {\n if (!meta || typeof meta !== 'object') return null;\n const d = meta as DiffPayload;\n if (Array.isArray(d.lines) && d.lines.length > 0) {\n return (\n <Box style={{ marginTop: 6, fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'var(--surface-0)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', padding: 8 }}>\n {d.lines.slice(0, 40).map((l, i) => (\n <div key={i} style={{ color: l.kind === '+' ? 'var(--success)' : l.kind === '-' ? 'var(--danger)' : 'var(--fg-muted)', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <span style={{ display: 'inline-block', width: 12 }}>{l.kind === ' ' ? '' : l.kind}</span>\n {l.text}\n </div>\n ))}\n </Box>\n );\n }\n if (d.before !== undefined || d.after !== undefined) {\n return (\n <Box style={{ marginTop: 6, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\n {d.before !== undefined && (\n <Box style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid color-mix(in oklch, var(--danger) 30%, var(--border))', borderRadius: 'var(--radius-sm)', padding: 8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong style={{ color: 'var(--danger)' }}>before</strong>\n <div>{String(d.before)}</div>\n </Box>\n )}\n {d.after !== undefined && (\n <Box style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))', border: '1px solid color-mix(in oklch, var(--success) 30%, var(--border))', borderRadius: 'var(--radius-sm)', padding: 8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong style={{ color: 'var(--success)' }}>after</strong>\n <div>{String(d.after)}</div>\n </Box>\n )}\n </Box>\n );\n }\n return null;\n}\n\nfunction Box(props: { children?: React.ReactNode; style?: React.CSSProperties; className?: string }): JSX.Element {\n return <div className={cx('v8-cl-box', props.className)} style={props.style}>{props.children}</div>;\n}\n\ninterface ExtendedEvent extends ActivityEvent { __source?: Source }\n\nexport function ActivityView(): JSX.Element {\n const events = useFetch<{ events?: ActivityEvent[] }>('/api/activity?limit=200');\n const [live, setLive] = useState<ActivityEvent[]>([]);\n const [source, setSource] = useState<Source>('all');\n const [autoRefresh, setAutoRefresh] = useState<boolean>(true);\n const [compact, setCompact] = useState<boolean>(false);\n const [maxDays, setMaxDays] = useState<number>(14);\n const [exportError, setExportError] = useState<string | null>(null);\n const [search, setSearch] = useState<string>('');\n\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n if (!autoRefresh) return;\n const ev = msg.event;\n if (!ev) return;\n setLive((prev) => [ev, ...prev].slice(0, 500));\n }, [autoRefresh]);\n useWsMessage('activity:new', onEvent);\n\n const merged = useMemo<ExtendedEvent[]>(() => {\n return [...live, ...(events.data?.events || [])];\n }, [live, events.data]);\n\n const filtered = useMemo<ExtendedEvent[]>(() => {\n let list = source === 'all' ? merged : merged.filter((e) => inferSource(e) === source);\n if (search.trim()) {\n const needle = search.trim().toLowerCase();\n list = list.filter((e) => {\n const hay = [\n e.title || '',\n e.description || '',\n e.kind || '',\n e.agent || '',\n e.actor || '',\n ].join(' ').toLowerCase();\n return hay.includes(needle);\n });\n }\n return list;\n }, [merged, source, search]);\n\n // Time-windowed set (older events clipped).\n const cutoff = Date.now() - maxDays * 86_400_000;\n const windowed = useMemo<ExtendedEvent[]>(\n () => filtered.filter((e) => (e.ts || 0) >= cutoff || e.ts === undefined),\n [filtered, cutoff],\n );\n\n const grouped = useMemo<{ key: string; label: string; events: ExtendedEvent[] }[]>(() => {\n const map = new Map<string, ExtendedEvent[]>();\n for (const e of windowed) {\n const ts = e.ts || Date.now();\n const k = dayKey(ts);\n if (!map.has(k)) map.set(k, []);\n map.get(k)!.push(e);\n }\n const out: { key: string; label: string; events: ExtendedEvent[] }[] = [];\n for (const [k, evs] of map) {\n const first = evs.find((x) => x.ts);\n const ts = first?.ts ?? Date.now();\n out.push({ key: k, label: dayLabel(ts), events: evs });\n }\n return out.sort((a, b) => (a.key < b.key ? 1 : -1));\n }, [windowed]);\n\n const counts = useMemo(() => {\n const acc: Record<Source, number> = { all: 0, task: 0, agent: 0, goal: 0, settings: 0, system: 0, git: 0 };\n for (const e of merged) {\n const s = inferSource(e);\n acc.all += 1;\n acc[s] += 1;\n }\n return acc;\n }, [merged]);\n\n const sparklineData = useMemo<number[]>(() => {\n // Chronological order (grouped is desc), so reverse to oldest-first.\n return [...grouped].reverse().map((g) => g.events.length);\n }, [grouped]);\n\n const exportNdjson = async (): Promise<void> => {\n setExportError(null);\n try {\n const res = await fetchJson<{ events?: ActivityEvent[] }>('/api/activity?limit=10000');\n const text = (res.events || []).map((e) => JSON.stringify(e)).join('\\n');\n const blob = new Blob([text], { type: 'application/x-ndjson' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-activity-${new Date().toISOString().slice(0, 10)}.ndjson`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n } catch (err) {\n setExportError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"activity-view\">\n <ViewHeader\n title=\"Activity\"\n description=\"Day-grouped changelog across tasks, agents, goals, settings, and git.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <input\n type=\"search\"\n placeholder=\"Search…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search activity\"\n style={{\n height: 28,\n padding: '0 var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-12)',\n width: 200,\n outline: 'none',\n }}\n />\n <Inline align=\"center\" gap={1}>\n <Circle\n size={8}\n aria-hidden\n style={{ color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}\n fill=\"currentColor\"\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {autoRefresh ? 'Live' : 'Paused'}\n </span>\n <Button variant=\"ghost\" onClick={() => setAutoRefresh((v) => !v)} aria-label={autoRefresh ? 'Pause stream' : 'Resume stream'}>\n {autoRefresh ? 'Pause' : 'Resume'}\n </Button>\n </Inline>\n <Button variant=\"secondary\" onClick={() => { void exportNdjson(); }}>\n <Filter size={12} aria-hidden /> Export NDJSON\n </Button>\n </Inline>\n }\n />\n <ListHeader\n title=\"Feed\"\n count={windowed.length}\n sparkline={sparklineData.length >= 2 ? <Sparkline data={sparklineData} width={120} height={28} /> : undefined}\n description={`${counts.task} task · ${counts.agent} agent · ${counts.goal} goal`}\n testid=\"activity-list-header\"\n />\n\n {exportError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n {exportError}\n </div>\n )}\n\n {/* Source filter chips */}\n <Inline align=\"center\" gap={2} wrap>\n <FilterChip label={`All (${counts.all})`} active={source === 'all'} onClick={() => setSource('all')} icon={<ActivityIcon size={12} aria-hidden />} />\n {(Object.keys(SOURCE_META) as Array<Exclude<Source, 'all'>>).map((s) => {\n const meta = SOURCE_META[s];\n const Icon = meta.icon;\n return (\n <FilterChip\n key={s}\n label={`${meta.label} (${counts[s]})`}\n active={source === s}\n onClick={() => setSource(s)}\n icon={<Icon size={12} aria-hidden />}\n />\n );\n })}\n </Inline>\n\n {/* Display prefs */}\n <Card>\n <CardBody>\n <Grid cols={3} gap={4}>\n <Stack gap={1}>\n <label htmlFor=\"cl-auto\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Live tail</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-auto\" checked={autoRefresh} onCheckedChange={setAutoRefresh} />\n <span style={{ fontSize: 'var(--fs-12)', color: autoRefresh ? 'var(--success)' : 'var(--fg-muted)' }}>\n {autoRefresh ? 'on' : 'paused'}\n </span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-compact\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Compact rows</label>\n <Inline align=\"center\" gap={2}>\n <Switch id=\"cl-compact\" checked={compact} onCheckedChange={setCompact} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{compact ? 'compact' : 'comfortable'}</span>\n </Inline>\n </Stack>\n <Stack gap={1}>\n <label htmlFor=\"cl-days\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Look back</label>\n <Inline align=\"center\" gap={2}>\n <Slider id=\"cl-days\" value={[maxDays]} onValueChange={(v) => setMaxDays(v[0] ?? 14)} min={1} max={90} step={1} />\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{maxDays}d</code>\n </Inline>\n </Stack>\n </Grid>\n </CardBody>\n </Card>\n\n {/* Empty state */}\n {!events.loading && windowed.length === 0 && (\n <Card>\n <CardBody>\n <Stack gap={1}>\n <strong>No activity matching filters.</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Clear the source filter or extend the look-back window.\n </span>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {events.loading && windowed.length === 0 ? (\n <Skeleton style={{ height: 320 }} />\n ) : events.error && windowed.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load activity\"\n description=\"The activity feed failed to fetch. Retry to refetch.\"\n error={events.error}\n onRetry={() => void events.refetch()}\n testid=\"activity-error\"\n />\n ) : (\n <Stack gap={5}>\n {grouped.map((group) => (\n <Stack key={group.key} gap={3}>\n <Inline\n align=\"center\"\n gap={2}\n style={{ position: 'sticky', top: 0, padding: 'var(--space-2) var(--space-3)', background: 'color-mix(in oklch, var(--surface-0) 88%, transparent)', backdropFilter: 'blur(8px)', borderRadius: 'var(--radius-md)', border: '1px solid var(--border)', zIndex: 1 }}\n >\n <h2 style={{ margin: 0, fontSize: 'var(--fs-16)', fontWeight: 600 }}>{group.label}</h2>\n <Badge tone=\"neutral\">{group.events.length}</Badge>\n <Clock size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {group.events.filter((e) => e.ts === undefined).length > 0\n ? 'live + historical'\n : 'historical only'}\n </span>\n </Inline>\n\n <Stack gap={1}>\n {group.events.map((e, i) => {\n const v = eventVisual(e);\n const SourceIcon = SOURCE_META[v.source as Exclude<Source, 'all'>]?.icon || Cpu;\n const ts = e.ts ?? Date.now();\n return (\n <Box\n key={`${e.id ?? `${ts}-${i}`}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto',\n gap: 12,\n padding: compact ? '6px 10px' : 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n alignItems: 'center',\n }}\n >\n {/* Icon column */}\n <Box\n style={{\n width: 32,\n height: 32,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--radius-pill)',\n background: `color-mix(in oklch, var(--${v.tone === 'neutral' ? 'fg-muted' : v.tone}) 18%, var(--surface-0))`,\n color: `var(--${v.tone === 'neutral' ? 'fg-muted' : v.tone})`,\n }}\n >\n <v.icon size={14} aria-hidden />\n </Box>\n {/* Body */}\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-14)' }}>{e.title ?? e.description ?? e.kind ?? 'event'}</strong>\n <Badge tone={SOURCE_META[v.source as Exclude<Source, 'all'>]?.tone ?? 'neutral'}>\n <Inline align=\"center\" gap={1}><SourceIcon size={10} aria-hidden /> {SOURCE_META[v.source as Exclude<Source, 'all'>]?.label ?? v.source}</Inline>\n </Badge>\n {e.kind && <Badge tone=\"neutral\">{e.kind}</Badge>}\n </Inline>\n {e.description && e.description !== e.title && (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>{e.description}</span>\n )}\n {renderDiff(e.meta)}\n </Stack>\n {/* Meta column */}\n <Stack align=\"end\" gap={1}>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{timeShort(ts)}</code>\n {typeof e.actor === 'string' && (\n <Inline align=\"center\" gap={1}><Circle size={8} aria-hidden style={{ color: 'var(--accent)' }} /><span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{e.actor}</span></Inline>\n )}\n </Stack>\n </Box>\n );\n })}\n </Stack>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n );\n}\n\nfunction FilterChip({ label, active, onClick, icon }: { label: string; active: boolean; onClick: () => void; icon?: React.ReactNode }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 10px',\n borderRadius: 'var(--radius-pill)',\n border: `1px solid ${active ? 'var(--accent)' : 'var(--border)'}`,\n background: active ? 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))' : 'var(--surface-1)',\n color: active ? 'var(--accent)' : 'var(--fg)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n fontWeight: active ? 600 : 500,\n }}\n >\n {icon}\n {label}\n </button>\n );\n}"],"names":["Filter","createLucideIcon","SOURCE_META","Layers","Bot","Target","SettingsIcon","Cpu","GitMerge","EVENT_TONE_MAP","GitPullRequest","CheckCircle2","AlertTriangle","Wrench","ActivityIcon","inferSource","e","hint","eventVisual","m","inferred","dayKey","ts","d","dayLabel","now","today","start","diffDays","timeShort","renderDiff","meta","jsx","Box","l","i","jsxs","props","cx","ActivityView","events","useFetch","live","setLive","useState","source","setSource","autoRefresh","setAutoRefresh","compact","setCompact","maxDays","setMaxDays","exportError","setExportError","search","setSearch","onEvent","useCallback","msg","ev","prev","useWsMessage","merged","useMemo","_a","filtered","list","needle","cutoff","windowed","grouped","map","k","out","evs","first","x","a","b","counts","acc","s","sparklineData","g","exportNdjson","text","fetchJson","blob","url","err","FetchError","Stack","ViewHeader","Inline","Circle","Button","v","ListHeader","Sparkline","FilterChip","Icon","Card","CardBody","Grid","Switch","Slider","Skeleton","ErrorState","group","Badge","Clock","SourceIcon","_b","_c","label","active","onClick","icon"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,11 @@
1
+ import{j as e,r as a}from"./cmdk-DMW_3pWz.js";import{g as u,S as f,D as x,I as p,d as n,f as S,F as b}from"./main-zDgXFFYt.js";import{V as j}from"./ViewHeader-2Oyjj9Yt.js";import{C as k,b as T}from"./Card-ZAdgpn3-.js";import{G as w}from"./Grid-CN6IV8NB.js";import{T as C}from"./trash-2-BzH_id_0.js";import{B as D}from"./brain-B8oDQ4kM.js";import{P as z}from"./power-off-EnQo8iQy.js";import{D as R}from"./download-Cct5qHWG.js";import{S as P}from"./shield-alert-COajyBNI.js";import{R as O}from"./refresh-cw-CYS8luDH.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};