@polderlabs/bizar 9.0.0 → 10.0.7

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 (1306) hide show
  1. package/bizar-dash/BROWSER_VERIFICATION.md +190 -0
  2. package/bizar-dash/CHANGELOG.md +572 -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-Da-JCrE6.js +11 -0
  6. package/bizar-dash/dist/assets/ActivityFeed-Da-JCrE6.js.map +1 -0
  7. package/bizar-dash/dist/assets/ActivityView-nIRsSETb.js +2 -0
  8. package/bizar-dash/dist/assets/ActivityView-nIRsSETb.js.map +1 -0
  9. package/bizar-dash/dist/assets/AdminView-DP1NMxmG.js +11 -0
  10. package/bizar-dash/dist/assets/AdminView-DP1NMxmG.js.map +1 -0
  11. package/bizar-dash/dist/assets/AgentActivity-lSPkOr-O.js +67 -0
  12. package/bizar-dash/dist/assets/AgentActivity-lSPkOr-O.js.map +1 -0
  13. package/bizar-dash/dist/assets/AgentsView-BIWGkz7w.js +13 -0
  14. package/bizar-dash/dist/assets/AgentsView-BIWGkz7w.js.map +1 -0
  15. package/bizar-dash/dist/assets/Alert-DN0UysMg.js +6 -0
  16. package/bizar-dash/dist/assets/Alert-DN0UysMg.js.map +1 -0
  17. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js +6 -0
  18. package/bizar-dash/dist/assets/ArtifactsView-CDIhPBAx.js.map +1 -0
  19. package/bizar-dash/dist/assets/AuthView-DW5cs7ma.js +16 -0
  20. package/bizar-dash/dist/assets/AuthView-DW5cs7ma.js.map +1 -0
  21. package/bizar-dash/dist/assets/Avatar-DZPv9pvd.js +6 -0
  22. package/bizar-dash/dist/assets/Avatar-DZPv9pvd.js.map +1 -0
  23. package/bizar-dash/dist/assets/BackgroundJobsView-D8O-EyMD.js +1 -0
  24. package/bizar-dash/dist/assets/BackgroundJobsView-D8O-EyMD.js.map +1 -0
  25. package/bizar-dash/dist/assets/BackupView-uwXkhxOV.js +1 -0
  26. package/bizar-dash/dist/assets/BackupView-uwXkhxOV.js.map +1 -0
  27. package/bizar-dash/dist/assets/Card-Tyboihu7.js +1 -0
  28. package/bizar-dash/dist/assets/Card-Tyboihu7.js.map +1 -0
  29. package/bizar-dash/dist/assets/ChatView-DRBHzgay.js +9 -0
  30. package/bizar-dash/dist/assets/ChatView-DRBHzgay.js.map +1 -0
  31. package/bizar-dash/dist/assets/Chip-BrXIlR9w.js +1 -0
  32. package/bizar-dash/dist/assets/Chip-BrXIlR9w.js.map +1 -0
  33. package/bizar-dash/dist/assets/ClaudeSessionsView-Ck62jaOr.js +1 -0
  34. package/bizar-dash/dist/assets/ClaudeSessionsView-Ck62jaOr.js.map +1 -0
  35. package/bizar-dash/dist/assets/ClipboardView-DfND6xL6.js +1 -0
  36. package/bizar-dash/dist/assets/ClipboardView-DfND6xL6.js.map +1 -0
  37. package/bizar-dash/dist/assets/ConfigView-DjJmSrOJ.js +1 -0
  38. package/bizar-dash/dist/assets/ConfigView-DjJmSrOJ.js.map +1 -0
  39. package/bizar-dash/dist/assets/DiagnosticsView-CKgItf0J.js +2 -0
  40. package/bizar-dash/dist/assets/DiagnosticsView-CKgItf0J.js.map +1 -0
  41. package/bizar-dash/dist/assets/DialogsView-DHYF8dE1.js +6 -0
  42. package/bizar-dash/dist/assets/DialogsView-DHYF8dE1.js.map +1 -0
  43. package/bizar-dash/dist/assets/DoctorView-DDLHrSKk.js +6 -0
  44. package/bizar-dash/dist/assets/DoctorView-DDLHrSKk.js.map +1 -0
  45. package/bizar-dash/dist/assets/EmptyState-DZ2ouKwd.js +1 -0
  46. package/bizar-dash/dist/assets/EmptyState-DZ2ouKwd.js.map +1 -0
  47. package/bizar-dash/dist/assets/EnvVarsView-D1cx83mB.js +8 -0
  48. package/bizar-dash/dist/assets/EnvVarsView-D1cx83mB.js.map +1 -0
  49. package/bizar-dash/dist/assets/ErrorState-DwwJ2-Jq.js +1 -0
  50. package/bizar-dash/dist/assets/ErrorState-DwwJ2-Jq.js.map +1 -0
  51. package/bizar-dash/dist/assets/EvalView-C9aYixXW.js +1 -0
  52. package/bizar-dash/dist/assets/EvalView-C9aYixXW.js.map +1 -0
  53. package/bizar-dash/dist/assets/GoalsView-DZa_mGmh.js +6 -0
  54. package/bizar-dash/dist/assets/GoalsView-DZa_mGmh.js.map +1 -0
  55. package/bizar-dash/dist/assets/Grid-CiRyhAgR.js +1 -0
  56. package/bizar-dash/dist/assets/Grid-CiRyhAgR.js.map +1 -0
  57. package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js +11 -0
  58. package/bizar-dash/dist/assets/HeadroomView-CNc-TI7u.js.map +1 -0
  59. package/bizar-dash/dist/assets/HistoryView-Dv7aPxJE.js +1 -0
  60. package/bizar-dash/dist/assets/HistoryView-Dv7aPxJE.js.map +1 -0
  61. package/bizar-dash/dist/assets/Input-BbFUDQnS.js +1 -0
  62. package/bizar-dash/dist/assets/Input-BbFUDQnS.js.map +1 -0
  63. package/bizar-dash/dist/assets/LibrariesView-DBQ83TNa.js +6 -0
  64. package/bizar-dash/dist/assets/LibrariesView-DBQ83TNa.js.map +1 -0
  65. package/bizar-dash/dist/assets/LightRAGView-JYpE5u9p.js +6 -0
  66. package/bizar-dash/dist/assets/LightRAGView-JYpE5u9p.js.map +1 -0
  67. package/bizar-dash/dist/assets/ListHeader-BGjm11Z0.js +1 -0
  68. package/bizar-dash/dist/assets/ListHeader-BGjm11Z0.js.map +1 -0
  69. package/bizar-dash/dist/assets/MemoryView-CnOP2MvM.js +8 -0
  70. package/bizar-dash/dist/assets/MemoryView-CnOP2MvM.js.map +1 -0
  71. package/bizar-dash/dist/assets/MessageBubble-5vUAquDx.js +29 -0
  72. package/bizar-dash/dist/assets/MessageBubble-5vUAquDx.js.map +1 -0
  73. package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js +1 -0
  74. package/bizar-dash/dist/assets/MiscView-BBcpUbZZ.js.map +1 -0
  75. package/bizar-dash/dist/assets/ModsView-CU4cAmIz.js +6 -0
  76. package/bizar-dash/dist/assets/ModsView-CU4cAmIz.js.map +1 -0
  77. package/bizar-dash/dist/assets/NotificationsView-BYffvthq.js +6 -0
  78. package/bizar-dash/dist/assets/NotificationsView-BYffvthq.js.map +1 -0
  79. package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js +1 -0
  80. package/bizar-dash/dist/assets/ObsidianView-D3bI0row.js.map +1 -0
  81. package/bizar-dash/dist/assets/OverviewView-0tq8f-Y0.js +1 -0
  82. package/bizar-dash/dist/assets/OverviewView-0tq8f-Y0.js.map +1 -0
  83. package/bizar-dash/dist/assets/ProgressBar-B-h60LKA.js +1 -0
  84. package/bizar-dash/dist/assets/ProgressBar-B-h60LKA.js.map +1 -0
  85. package/bizar-dash/dist/assets/ProjectsView-DhX5lzHS.js +11 -0
  86. package/bizar-dash/dist/assets/ProjectsView-DhX5lzHS.js.map +1 -0
  87. package/bizar-dash/dist/assets/ProvidersView-CJMX7jm9.js +11 -0
  88. package/bizar-dash/dist/assets/ProvidersView-CJMX7jm9.js.map +1 -0
  89. package/bizar-dash/dist/assets/SchedulesView-CcwDQ9Nm.js +1 -0
  90. package/bizar-dash/dist/assets/SchedulesView-CcwDQ9Nm.js.map +1 -0
  91. package/bizar-dash/dist/assets/Select-Cw7Qtz2M.js +6 -0
  92. package/bizar-dash/dist/assets/Select-Cw7Qtz2M.js.map +1 -0
  93. package/bizar-dash/dist/assets/SettingsRow-DgsgbPSI.js +1 -0
  94. package/bizar-dash/dist/assets/SettingsRow-DgsgbPSI.js.map +1 -0
  95. package/bizar-dash/dist/assets/SettingsView-DTAFdKyK.js +18 -0
  96. package/bizar-dash/dist/assets/SettingsView-DTAFdKyK.js.map +1 -0
  97. package/bizar-dash/dist/assets/Sheet-DH-WNJ3Y.js +1 -0
  98. package/bizar-dash/dist/assets/Sheet-DH-WNJ3Y.js.map +1 -0
  99. package/bizar-dash/dist/assets/Slider-DXbJuQ7y.js +1 -0
  100. package/bizar-dash/dist/assets/Slider-DXbJuQ7y.js.map +1 -0
  101. package/bizar-dash/dist/assets/Sparkline-CYtAn82j.js +1 -0
  102. package/bizar-dash/dist/assets/Sparkline-CYtAn82j.js.map +1 -0
  103. package/bizar-dash/dist/assets/Switch-BItGrPqr.js +10 -0
  104. package/bizar-dash/dist/assets/Switch-BItGrPqr.js.map +1 -0
  105. package/bizar-dash/dist/assets/TasksView-i5tm6CkX.js +6 -0
  106. package/bizar-dash/dist/assets/TasksView-i5tm6CkX.js.map +1 -0
  107. package/bizar-dash/dist/assets/Textarea-qYDf3yds.js +1 -0
  108. package/bizar-dash/dist/assets/Textarea-qYDf3yds.js.map +1 -0
  109. package/bizar-dash/dist/assets/UpdateView-Xln-ej26.js +6 -0
  110. package/bizar-dash/dist/assets/UpdateView-Xln-ej26.js.map +1 -0
  111. package/bizar-dash/dist/assets/UsageView-BGuZSUZ6.js +1 -0
  112. package/bizar-dash/dist/assets/UsageView-BGuZSUZ6.js.map +1 -0
  113. package/bizar-dash/dist/assets/ViewHeader-BqIPVKuG.js +6 -0
  114. package/bizar-dash/dist/assets/ViewHeader-BqIPVKuG.js.map +1 -0
  115. package/bizar-dash/dist/assets/VoiceView-CWUOCQs_.js +1 -0
  116. package/bizar-dash/dist/assets/VoiceView-CWUOCQs_.js.map +1 -0
  117. package/bizar-dash/dist/assets/brain-fsBSDl2g.js +6 -0
  118. package/bizar-dash/dist/assets/brain-fsBSDl2g.js.map +1 -0
  119. package/bizar-dash/dist/assets/calendar-DsHTZoCU.js +6 -0
  120. package/bizar-dash/dist/assets/calendar-DsHTZoCU.js.map +1 -0
  121. package/bizar-dash/dist/assets/circle-CqSxqqeJ.js +6 -0
  122. package/bizar-dash/dist/assets/circle-CqSxqqeJ.js.map +1 -0
  123. package/bizar-dash/dist/assets/circle-alert-BsLl001l.js +6 -0
  124. package/bizar-dash/dist/assets/circle-alert-BsLl001l.js.map +1 -0
  125. package/bizar-dash/dist/assets/circle-check-rVKMQmZp.js +6 -0
  126. package/bizar-dash/dist/assets/circle-check-rVKMQmZp.js.map +1 -0
  127. package/bizar-dash/dist/assets/clock-OuficfgH.js +6 -0
  128. package/bizar-dash/dist/assets/clock-OuficfgH.js.map +1 -0
  129. package/bizar-dash/dist/assets/cmdk-DVxytz9i.js +80 -0
  130. package/bizar-dash/dist/assets/cmdk-DVxytz9i.js.map +1 -0
  131. package/bizar-dash/dist/assets/dnd-kit-DrHErSkw.js +5 -0
  132. package/bizar-dash/dist/assets/dnd-kit-DrHErSkw.js.map +1 -0
  133. package/bizar-dash/dist/assets/download-BdHlstUY.js +6 -0
  134. package/bizar-dash/dist/assets/download-BdHlstUY.js.map +1 -0
  135. package/bizar-dash/dist/assets/external-link-DA3_VGm-.js +6 -0
  136. package/bizar-dash/dist/assets/external-link-DA3_VGm-.js.map +1 -0
  137. package/bizar-dash/dist/assets/file-text-B-g8H227.js +6 -0
  138. package/bizar-dash/dist/assets/file-text-B-g8H227.js.map +1 -0
  139. package/bizar-dash/dist/assets/filter-D9B8s5CG.js +6 -0
  140. package/bizar-dash/dist/assets/filter-D9B8s5CG.js.map +1 -0
  141. package/bizar-dash/dist/assets/git-pull-request-ByH0YuVz.js +11 -0
  142. package/bizar-dash/dist/assets/git-pull-request-ByH0YuVz.js.map +1 -0
  143. package/bizar-dash/dist/assets/index-C4Vq_2LM.js +1 -0
  144. package/bizar-dash/dist/assets/index-C4Vq_2LM.js.map +1 -0
  145. package/bizar-dash/dist/assets/index-CASP1n-5.js +1 -0
  146. package/bizar-dash/dist/assets/index-CASP1n-5.js.map +1 -0
  147. package/bizar-dash/dist/assets/main-CdOm1Pj9.js +249 -0
  148. package/bizar-dash/dist/assets/main-CdOm1Pj9.js.map +1 -0
  149. package/bizar-dash/dist/assets/pause-C9hgd8wX.js +6 -0
  150. package/bizar-dash/dist/assets/pause-C9hgd8wX.js.map +1 -0
  151. package/bizar-dash/dist/assets/pencil-BanqaMw7.js +6 -0
  152. package/bizar-dash/dist/assets/pencil-BanqaMw7.js.map +1 -0
  153. package/bizar-dash/dist/assets/play-CawUZ02_.js +6 -0
  154. package/bizar-dash/dist/assets/play-CawUZ02_.js.map +1 -0
  155. package/bizar-dash/dist/assets/plug-Cmv0-T_e.js +6 -0
  156. package/bizar-dash/dist/assets/plug-Cmv0-T_e.js.map +1 -0
  157. package/bizar-dash/dist/assets/plus-M6LYiKX8.js +6 -0
  158. package/bizar-dash/dist/assets/plus-M6LYiKX8.js.map +1 -0
  159. package/bizar-dash/dist/assets/power-DP5x_SRF.js +6 -0
  160. package/bizar-dash/dist/assets/power-DP5x_SRF.js.map +1 -0
  161. package/bizar-dash/dist/assets/power-off-NOJRLAIs.js +6 -0
  162. package/bizar-dash/dist/assets/power-off-NOJRLAIs.js.map +1 -0
  163. package/bizar-dash/dist/assets/refresh-ccw-CHMprsm5.js +6 -0
  164. package/bizar-dash/dist/assets/refresh-ccw-CHMprsm5.js.map +1 -0
  165. package/bizar-dash/dist/assets/refresh-cw-1RBqDKgJ.js +6 -0
  166. package/bizar-dash/dist/assets/refresh-cw-1RBqDKgJ.js.map +1 -0
  167. package/bizar-dash/dist/assets/rotate-ccw-DJRekBbi.js +6 -0
  168. package/bizar-dash/dist/assets/rotate-ccw-DJRekBbi.js.map +1 -0
  169. package/bizar-dash/dist/assets/rotate-cw-DHooc0Tx.js +6 -0
  170. package/bizar-dash/dist/assets/rotate-cw-DHooc0Tx.js.map +1 -0
  171. package/bizar-dash/dist/assets/save-DQKCKyZK.js +6 -0
  172. package/bizar-dash/dist/assets/save-DQKCKyZK.js.map +1 -0
  173. package/bizar-dash/dist/assets/send-xgy3RAi7.js +6 -0
  174. package/bizar-dash/dist/assets/send-xgy3RAi7.js.map +1 -0
  175. package/bizar-dash/dist/assets/shield-alert-CWV2F5ab.js +6 -0
  176. package/bizar-dash/dist/assets/shield-alert-CWV2F5ab.js.map +1 -0
  177. package/bizar-dash/dist/assets/trash-2-CL4khSRv.js +6 -0
  178. package/bizar-dash/dist/assets/trash-2-CL4khSRv.js.map +1 -0
  179. package/bizar-dash/dist/assets/trending-up-CSJJhWTS.js +6 -0
  180. package/bizar-dash/dist/assets/trending-up-CSJJhWTS.js.map +1 -0
  181. package/bizar-dash/dist/assets/triangle-alert-BPLb7uLt.js +6 -0
  182. package/bizar-dash/dist/assets/triangle-alert-BPLb7uLt.js.map +1 -0
  183. package/bizar-dash/dist/assets/upload-Cww6MvFq.js +6 -0
  184. package/bizar-dash/dist/assets/upload-Cww6MvFq.js.map +1 -0
  185. package/bizar-dash/dist/assets/zap-DmhVUzRA.js +6 -0
  186. package/bizar-dash/dist/assets/zap-DmhVUzRA.js.map +1 -0
  187. package/bizar-dash/dist/index.html +19 -0
  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 +7 -2
  191. package/bizar-dash/src/server/artifact-mint.mjs +69 -0
  192. package/bizar-dash/src/server/claude-runner.mjs +5 -0
  193. package/bizar-dash/src/server/dialog-store.mjs +84 -2
  194. package/bizar-dash/src/server/memory-lightrag.mjs +14 -9
  195. package/bizar-dash/src/server/progress-parser.mjs +13 -1
  196. package/bizar-dash/src/server/progress-parser.test.mjs +24 -0
  197. package/bizar-dash/src/server/routes/activity.mjs +22 -2
  198. package/bizar-dash/src/server/routes/admin.mjs +163 -0
  199. package/bizar-dash/src/server/routes/agents-cc.mjs +196 -26
  200. package/bizar-dash/src/server/routes/agents.mjs +20 -5
  201. package/bizar-dash/src/server/routes/claude-session-detail.mjs +38 -0
  202. package/bizar-dash/src/server/routes/dialogs.mjs +49 -1
  203. package/bizar-dash/src/server/routes/goals.mjs +125 -4
  204. package/bizar-dash/src/server/routes/overview.mjs +131 -4
  205. package/bizar-dash/src/server/routes/overview.test.mjs +65 -0
  206. package/bizar-dash/src/server/routes/providers.mjs +53 -0
  207. package/bizar-dash/src/server/routes/skills.mjs +6 -1
  208. package/bizar-dash/src/server/routes/tasks.mjs +51 -1
  209. package/bizar-dash/src/server/server.mjs +20 -9
  210. package/bizar-dash/src/server/skills-store.mjs +2 -0
  211. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  212. package/bizar-dash/src/web/v8/App.tsx +113 -1
  213. package/bizar-dash/src/web/v8/__tests__/admin-view.test.tsx +105 -0
  214. package/bizar-dash/src/web/v8/__tests__/agent-card-metrics.test.tsx +54 -0
  215. package/bizar-dash/src/web/v8/__tests__/agent-detail-tasks.test.tsx +68 -0
  216. package/bizar-dash/src/web/v8/__tests__/agent-hierarchy.test.tsx +79 -0
  217. package/bizar-dash/src/web/v8/__tests__/agents-stuck-banner.test.tsx +142 -0
  218. package/bizar-dash/src/web/v8/__tests__/artifacts-view.test.tsx +102 -0
  219. package/bizar-dash/src/web/v8/__tests__/audit-fixes.test.tsx +139 -0
  220. package/bizar-dash/src/web/v8/__tests__/auth-view.test.tsx +94 -0
  221. package/bizar-dash/src/web/v8/__tests__/chat-types.test.ts +55 -0
  222. package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +142 -0
  223. package/bizar-dash/src/web/v8/__tests__/claude-sessions-view.test.tsx +159 -0
  224. package/bizar-dash/src/web/v8/__tests__/clipboard-view.test.tsx +90 -0
  225. package/bizar-dash/src/web/v8/__tests__/config-view.test.tsx +111 -0
  226. package/bizar-dash/src/web/v8/__tests__/dialogs-view.test.tsx +81 -0
  227. package/bizar-dash/src/web/v8/__tests__/env-vars-view.test.tsx +123 -0
  228. package/bizar-dash/src/web/v8/__tests__/goals-cc-roundtrip.test.tsx +94 -0
  229. package/bizar-dash/src/web/v8/__tests__/history-view.test.tsx +96 -0
  230. package/bizar-dash/src/web/v8/__tests__/lightrag-view.test.tsx +90 -0
  231. package/bizar-dash/src/web/v8/__tests__/misc-view.test.tsx +79 -0
  232. package/bizar-dash/src/web/v8/__tests__/mods-view.test.tsx +123 -0
  233. package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +177 -0
  234. package/bizar-dash/src/web/v8/__tests__/obsidian-view.test.tsx +82 -0
  235. package/bizar-dash/src/web/v8/__tests__/overview-trends.test.tsx +87 -0
  236. package/bizar-dash/src/web/v8/__tests__/projects-view.test.tsx +134 -0
  237. package/bizar-dash/src/web/v8/__tests__/providers-view.test.tsx +100 -0
  238. package/bizar-dash/src/web/v8/__tests__/update-view.test.tsx +89 -0
  239. package/bizar-dash/src/web/v8/__tests__/voice-view.test.tsx +80 -0
  240. package/bizar-dash/src/web/v8/data/types.ts +86 -3
  241. package/bizar-dash/src/web/v8/data/useViewNavigate.ts +54 -0
  242. package/bizar-dash/src/web/v8/data/useWebSocket.ts +45 -0
  243. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +111 -14
  244. package/bizar-dash/src/web/v8/shell/Topbar.tsx +100 -8
  245. package/bizar-dash/src/web/v8/ui/activity/ActivityLane.tsx +315 -0
  246. package/bizar-dash/src/web/v8/ui/activity/ActivityLanes.tsx +51 -0
  247. package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +96 -15
  248. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +168 -12
  249. package/bizar-dash/src/web/v8/ui/agents/AgentLiveOutput.tsx +252 -0
  250. package/bizar-dash/src/web/v8/ui/chat/ChatDrawer.tsx +208 -0
  251. package/bizar-dash/src/web/v8/ui/chat/EventStream.tsx +83 -0
  252. package/bizar-dash/src/web/v8/ui/chat/MessageBubble.tsx +174 -0
  253. package/bizar-dash/src/web/v8/ui/data/ListHeader.tsx +94 -0
  254. package/bizar-dash/src/web/v8/ui/feedback/ErrorState.tsx +116 -0
  255. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +27 -0
  256. package/bizar-dash/src/web/v8/ui/index.ts +49 -2
  257. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +61 -27
  258. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +156 -12
  259. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +5 -10
  260. package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +4 -0
  261. package/bizar-dash/src/web/v8/ui/kanban/KanbanDetailDialog.tsx +638 -0
  262. package/bizar-dash/src/web/v8/ui/tasks/TaskDetail.tsx +313 -0
  263. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +203 -178
  264. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +210 -0
  265. package/bizar-dash/src/web/v8/views/Agents/AgentHierarchy.tsx +212 -0
  266. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +328 -21
  267. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +241 -0
  268. package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +175 -0
  269. package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +1 -1
  270. package/bizar-dash/src/web/v8/views/Backup/BackupView.tsx +204 -0
  271. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +356 -0
  272. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +133 -0
  273. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx +331 -0
  274. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +210 -0
  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 +168 -10
  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 +30 -3
  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 +125 -0
  295. package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +46 -14
  296. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +322 -29
  297. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +229 -10
  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/tasks-patch-routes.test.mjs +194 -0
  302. package/bizar-dash/vite.config.ts +11 -3
  303. package/cli/__tests__/esm-no-require.test.mjs +97 -0
  304. package/cli/commands/tailscale.mjs +1 -3
  305. package/cli/commands/voice.mjs +2 -2
  306. package/cli/service-env.mjs +4 -5
  307. package/package.json +13 -3
  308. package/packages/sdk/dist/agent-registry.d.ts +134 -0
  309. package/packages/sdk/dist/agent-registry.js +228 -0
  310. package/packages/sdk/dist/consensus/byzantine.d.ts +159 -0
  311. package/packages/sdk/dist/consensus/byzantine.js +507 -0
  312. package/packages/sdk/dist/consensus/index.d.ts +60 -0
  313. package/packages/sdk/dist/consensus/index.js +76 -0
  314. package/packages/sdk/dist/consensus/queen.d.ts +86 -0
  315. package/packages/sdk/dist/consensus/queen.js +158 -0
  316. package/packages/sdk/dist/consensus/types.d.ts +155 -0
  317. package/packages/sdk/dist/consensus/types.js +29 -0
  318. package/packages/sdk/dist/dangerous-patterns.d.ts +27 -0
  319. package/packages/sdk/dist/dangerous-patterns.js +107 -0
  320. package/packages/sdk/dist/federation/audit.d.ts +71 -0
  321. package/packages/sdk/dist/federation/audit.js +133 -0
  322. package/packages/sdk/dist/federation/budget.d.ts +111 -0
  323. package/packages/sdk/dist/federation/budget.js +227 -0
  324. package/packages/sdk/dist/federation/envelope.d.ts +83 -0
  325. package/packages/sdk/dist/federation/envelope.js +92 -0
  326. package/packages/sdk/dist/federation/hmac.d.ts +61 -0
  327. package/packages/sdk/dist/federation/hmac.js +120 -0
  328. package/packages/sdk/dist/federation/index.d.ts +108 -0
  329. package/packages/sdk/dist/federation/index.js +275 -0
  330. package/packages/sdk/dist/federation/pii.d.ts +72 -0
  331. package/packages/sdk/dist/federation/pii.js +178 -0
  332. package/packages/sdk/dist/federation/policy.d.ts +50 -0
  333. package/packages/sdk/dist/federation/policy.js +76 -0
  334. package/packages/sdk/dist/federation/trust.d.ts +80 -0
  335. package/packages/sdk/dist/federation/trust.js +126 -0
  336. package/packages/sdk/dist/fingerprint.d.ts +18 -0
  337. package/packages/sdk/dist/fingerprint.js +0 -0
  338. package/packages/sdk/dist/index.d.ts +25 -0
  339. package/packages/sdk/dist/index.js +25 -0
  340. package/packages/sdk/dist/mcp/bin.d.ts +16 -0
  341. package/packages/sdk/dist/mcp/bin.js +46 -0
  342. package/packages/sdk/dist/mcp/server.d.ts +105 -0
  343. package/packages/sdk/dist/mcp/server.js +682 -0
  344. package/packages/sdk/dist/memory/index.d.ts +43 -0
  345. package/packages/sdk/dist/memory/index.js +159 -0
  346. package/packages/sdk/dist/router/codemod-intent.d.ts +68 -0
  347. package/packages/sdk/dist/router/codemod-intent.js +112 -0
  348. package/packages/sdk/dist/router/index.d.ts +100 -0
  349. package/packages/sdk/dist/router/index.js +149 -0
  350. package/packages/sdk/dist/router/memory-distillation.d.ts +58 -0
  351. package/packages/sdk/dist/router/memory-distillation.js +195 -0
  352. package/packages/sdk/dist/router/model-router.d.ts +83 -0
  353. package/packages/sdk/dist/router/model-router.js +207 -0
  354. package/packages/sdk/dist/router/q-learning-router.d.ts +85 -0
  355. package/packages/sdk/dist/router/q-learning-router.js +273 -0
  356. package/packages/sdk/dist/swarm-topology.d.ts +87 -0
  357. package/packages/sdk/dist/swarm-topology.js +219 -0
  358. package/packages/sdk/dist/version.d.ts +5 -0
  359. package/packages/sdk/dist/version.js +5 -0
  360. package/packages/sdk/package.json +1 -1
  361. package/plugins/bizar/dist/index.d.ts +25 -0
  362. package/plugins/bizar/dist/index.js +32 -0
  363. package/plugins/bizar/package.json +18 -0
  364. package/.claude/CLAUDE.md +0 -15
  365. package/.claude/agents/_shared/AGENT_BASELINE.md +0 -168
  366. package/.claude/agents/_shared/CLAUDE_TOOLS.md +0 -412
  367. package/.claude/agents/_shared/SKILLS.md +0 -109
  368. package/.claude/agents/agent-browser.md +0 -80
  369. package/.claude/agents/baldr.md +0 -49
  370. package/.claude/agents/forseti.md +0 -51
  371. package/.claude/agents/frigg.md +0 -42
  372. package/.claude/agents/heimdall.md +0 -33
  373. package/.claude/agents/hermod.md +0 -53
  374. package/.claude/agents/mimir.md +0 -49
  375. package/.claude/agents/odin.md +0 -287
  376. package/.claude/agents/quick.md +0 -34
  377. package/.claude/agents/semble-search.md +0 -50
  378. package/.claude/agents/thor.md +0 -53
  379. package/.claude/agents/tyr.md +0 -56
  380. package/.claude/agents/vidarr.md +0 -54
  381. package/.claude/agents/vor.md +0 -53
  382. package/.claude/commands/audit.md +0 -25
  383. package/.claude/commands/bizar.md +0 -22
  384. package/.claude/commands/explain.md +0 -17
  385. package/.claude/commands/goal.md +0 -98
  386. package/.claude/commands/init.md +0 -29
  387. package/.claude/commands/learn.md +0 -44
  388. package/.claude/commands/plan.md +0 -35
  389. package/.claude/commands/plow-through.md +0 -50
  390. package/.claude/commands/pr-review.md +0 -49
  391. package/.claude/commands/setup-provider.md +0 -96
  392. package/.claude/commands/tailscale-serve.md +0 -100
  393. package/.claude/commands/team.md +0 -132
  394. package/.claude/commands/test.md +0 -62
  395. package/.claude/commands/validate.md +0 -68
  396. package/.claude/commands/visual-plan.md +0 -24
  397. package/.claude/hooks/README.md +0 -92
  398. package/.claude/hooks/posttooluse-editwrite.mjs +0 -91
  399. package/.claude/hooks/pretooluse-bash.mjs +0 -81
  400. package/.claude/hooks/pretooluse-editwrite.mjs +0 -139
  401. package/.claude/hooks/sessionend-recall.mjs +0 -74
  402. package/.claude/hooks/sessionstart-prime.mjs +0 -80
  403. package/.claude/hooks/userpromptsubmit-tag.mjs +0 -80
  404. package/.claude/hooks/worker-suggest.mjs +0 -110
  405. package/.claude/settings.json +0 -125
  406. package/.claude/settings.local.json +0 -7
  407. package/.claude/skills/9router/SKILL.md +0 -80
  408. package/.claude/skills/9router-chat/SKILL.md +0 -73
  409. package/.claude/skills/9router-embeddings/SKILL.md +0 -69
  410. package/.claude/skills/9router-image/SKILL.md +0 -86
  411. package/.claude/skills/9router-stt/SKILL.md +0 -79
  412. package/.claude/skills/9router-tts/SKILL.md +0 -80
  413. package/.claude/skills/9router-web-fetch/SKILL.md +0 -99
  414. package/.claude/skills/9router-web-search/SKILL.md +0 -91
  415. package/.claude/skills/bizar/README.md +0 -9
  416. package/.claude/skills/bizar/SKILL.md +0 -450
  417. package/.claude/skills/cpp-coding-standards/README.md +0 -28
  418. package/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
  419. package/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
  420. package/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
  421. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
  422. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
  423. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
  424. package/.claude/skills/cpp-testing/README.md +0 -28
  425. package/.claude/skills/cpp-testing/SKILL.md +0 -304
  426. package/.claude/skills/cpp-testing/references/coverage.md +0 -370
  427. package/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
  428. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
  429. package/.claude/skills/cpp-testing/references/mocking.md +0 -364
  430. package/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
  431. package/.claude/skills/cubesandbox/SKILL.md +0 -148
  432. package/.claude/skills/embedded-esp-idf/README.md +0 -41
  433. package/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
  434. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
  435. package/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
  436. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
  437. package/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
  438. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
  439. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
  440. package/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
  441. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
  442. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
  443. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
  444. package/.claude/skills/glyph/SKILL.md +0 -163
  445. package/.claude/skills/harness-engineering/SKILL.md +0 -143
  446. package/.claude/skills/lightrag/SKILL.md +0 -81
  447. package/.claude/skills/memory-protocol/SKILL.md +0 -105
  448. package/.claude/skills/obsidian/SKILL.md +0 -306
  449. package/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
  450. package/.claude/skills/self-improvement/SKILL.md +0 -64
  451. package/.claude/worktrees/kanban-overhaul/.claude/CLAUDE.md +0 -15
  452. package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/AGENT_BASELINE.md +0 -168
  453. package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/CLAUDE_TOOLS.md +0 -412
  454. package/.claude/worktrees/kanban-overhaul/.claude/agents/_shared/SKILLS.md +0 -109
  455. package/.claude/worktrees/kanban-overhaul/.claude/agents/agent-browser.md +0 -80
  456. package/.claude/worktrees/kanban-overhaul/.claude/agents/baldr.md +0 -49
  457. package/.claude/worktrees/kanban-overhaul/.claude/agents/forseti.md +0 -51
  458. package/.claude/worktrees/kanban-overhaul/.claude/agents/frigg.md +0 -42
  459. package/.claude/worktrees/kanban-overhaul/.claude/agents/heimdall.md +0 -33
  460. package/.claude/worktrees/kanban-overhaul/.claude/agents/hermod.md +0 -53
  461. package/.claude/worktrees/kanban-overhaul/.claude/agents/mimir.md +0 -49
  462. package/.claude/worktrees/kanban-overhaul/.claude/agents/odin.md +0 -287
  463. package/.claude/worktrees/kanban-overhaul/.claude/agents/quick.md +0 -34
  464. package/.claude/worktrees/kanban-overhaul/.claude/agents/semble-search.md +0 -50
  465. package/.claude/worktrees/kanban-overhaul/.claude/agents/thor.md +0 -53
  466. package/.claude/worktrees/kanban-overhaul/.claude/agents/tyr.md +0 -56
  467. package/.claude/worktrees/kanban-overhaul/.claude/agents/vidarr.md +0 -54
  468. package/.claude/worktrees/kanban-overhaul/.claude/agents/vor.md +0 -53
  469. package/.claude/worktrees/kanban-overhaul/.claude/commands/audit.md +0 -25
  470. package/.claude/worktrees/kanban-overhaul/.claude/commands/bizar.md +0 -22
  471. package/.claude/worktrees/kanban-overhaul/.claude/commands/explain.md +0 -17
  472. package/.claude/worktrees/kanban-overhaul/.claude/commands/init.md +0 -29
  473. package/.claude/worktrees/kanban-overhaul/.claude/commands/learn.md +0 -44
  474. package/.claude/worktrees/kanban-overhaul/.claude/commands/plan.md +0 -35
  475. package/.claude/worktrees/kanban-overhaul/.claude/commands/plow-through.md +0 -50
  476. package/.claude/worktrees/kanban-overhaul/.claude/commands/pr-review.md +0 -49
  477. package/.claude/worktrees/kanban-overhaul/.claude/commands/setup-provider.md +0 -96
  478. package/.claude/worktrees/kanban-overhaul/.claude/commands/tailscale-serve.md +0 -100
  479. package/.claude/worktrees/kanban-overhaul/.claude/commands/team.md +0 -132
  480. package/.claude/worktrees/kanban-overhaul/.claude/commands/test.md +0 -62
  481. package/.claude/worktrees/kanban-overhaul/.claude/commands/validate.md +0 -68
  482. package/.claude/worktrees/kanban-overhaul/.claude/commands/visual-plan.md +0 -24
  483. package/.claude/worktrees/kanban-overhaul/.claude/hooks/README.md +0 -92
  484. package/.claude/worktrees/kanban-overhaul/.claude/hooks/posttooluse-editwrite.mjs +0 -91
  485. package/.claude/worktrees/kanban-overhaul/.claude/hooks/pretooluse-bash.mjs +0 -81
  486. package/.claude/worktrees/kanban-overhaul/.claude/hooks/pretooluse-editwrite.mjs +0 -139
  487. package/.claude/worktrees/kanban-overhaul/.claude/hooks/sessionend-recall.mjs +0 -74
  488. package/.claude/worktrees/kanban-overhaul/.claude/hooks/sessionstart-prime.mjs +0 -80
  489. package/.claude/worktrees/kanban-overhaul/.claude/hooks/userpromptsubmit-tag.mjs +0 -80
  490. package/.claude/worktrees/kanban-overhaul/.claude/hooks/worker-suggest.mjs +0 -110
  491. package/.claude/worktrees/kanban-overhaul/.claude/settings.json +0 -125
  492. package/.claude/worktrees/kanban-overhaul/.claude/settings.local.json +0 -8
  493. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router/SKILL.md +0 -80
  494. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-chat/SKILL.md +0 -73
  495. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-embeddings/SKILL.md +0 -69
  496. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-image/SKILL.md +0 -86
  497. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-stt/SKILL.md +0 -79
  498. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-tts/SKILL.md +0 -80
  499. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-web-fetch/SKILL.md +0 -99
  500. package/.claude/worktrees/kanban-overhaul/.claude/skills/9router-web-search/SKILL.md +0 -91
  501. package/.claude/worktrees/kanban-overhaul/.claude/skills/bizar/README.md +0 -9
  502. package/.claude/worktrees/kanban-overhaul/.claude/skills/bizar/SKILL.md +0 -450
  503. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/README.md +0 -28
  504. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
  505. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
  506. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
  507. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
  508. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
  509. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
  510. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/README.md +0 -28
  511. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/SKILL.md +0 -304
  512. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/coverage.md +0 -370
  513. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
  514. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
  515. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/mocking.md +0 -364
  516. package/.claude/worktrees/kanban-overhaul/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
  517. package/.claude/worktrees/kanban-overhaul/.claude/skills/cubesandbox/SKILL.md +0 -148
  518. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/README.md +0 -41
  519. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
  520. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
  521. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
  522. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
  523. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
  524. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
  525. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
  526. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
  527. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
  528. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
  529. package/.claude/worktrees/kanban-overhaul/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
  530. package/.claude/worktrees/kanban-overhaul/.claude/skills/glyph/SKILL.md +0 -163
  531. package/.claude/worktrees/kanban-overhaul/.claude/skills/harness-engineering/SKILL.md +0 -143
  532. package/.claude/worktrees/kanban-overhaul/.claude/skills/lightrag/SKILL.md +0 -81
  533. package/.claude/worktrees/kanban-overhaul/.claude/skills/memory-protocol/SKILL.md +0 -105
  534. package/.claude/worktrees/kanban-overhaul/.claude/skills/obsidian/SKILL.md +0 -306
  535. package/.claude/worktrees/kanban-overhaul/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
  536. package/.claude/worktrees/kanban-overhaul/.claude/skills/self-improvement/SKILL.md +0 -64
  537. package/.claude/worktrees/kanban-overhaul/.dockerignore +0 -31
  538. package/.claude/worktrees/kanban-overhaul/.gitattributes +0 -27
  539. package/.claude/worktrees/kanban-overhaul/.harness/agents.json +0 -17
  540. package/.claude/worktrees/kanban-overhaul/.harness/arch-rules.json +0 -69
  541. package/.claude/worktrees/kanban-overhaul/.harness/topology.json +0 -4
  542. package/.claude/worktrees/kanban-overhaul/.nvmrc +0 -1
  543. package/.claude/worktrees/kanban-overhaul/.serena/project.yml +0 -159
  544. package/.claude/worktrees/kanban-overhaul/AGENTS.md +0 -250
  545. package/.claude/worktrees/kanban-overhaul/CHANGELOG.md +0 -5410
  546. package/.claude/worktrees/kanban-overhaul/CLAUDE.md +0 -260
  547. package/.claude/worktrees/kanban-overhaul/CURRENT_ISSUES_ AND_NEW_FEATURES.md +0 -18
  548. package/.claude/worktrees/kanban-overhaul/DECISIONS.md +0 -66
  549. package/.claude/worktrees/kanban-overhaul/Dockerfile +0 -48
  550. package/.claude/worktrees/kanban-overhaul/FINAL_GOAL.md +0 -397
  551. package/.claude/worktrees/kanban-overhaul/IMPLEMENTATION_PLAN.md +0 -250
  552. package/.claude/worktrees/kanban-overhaul/MILESTONES.md +0 -257
  553. package/.claude/worktrees/kanban-overhaul/Makefile +0 -93
  554. package/.claude/worktrees/kanban-overhaul/PROGRESS.md +0 -1406
  555. package/.claude/worktrees/kanban-overhaul/README.md +0 -483
  556. package/.claude/worktrees/kanban-overhaul/ROADMAP.md +0 -609
  557. package/.claude/worktrees/kanban-overhaul/bizar-dash/.graphifyignore +0 -40
  558. package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/README.md +0 -14
  559. package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/daily/2026-06-25.md +0 -9
  560. package/.claude/worktrees/kanban-overhaul/bizar-dash/.obsidian/vault.json +0 -7
  561. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +0 -103
  562. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +0 -338
  563. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +0 -81
  564. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +0 -172
  565. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +0 -44
  566. package/.claude/worktrees/kanban-overhaul/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +0 -247
  567. package/.claude/worktrees/kanban-overhaul/bizar-dash/ARCHITECTURE.md +0 -197
  568. package/.claude/worktrees/kanban-overhaul/bizar-dash/CHANGELOG.md +0 -235
  569. package/.claude/worktrees/kanban-overhaul/bizar-dash/DESIGN.md +0 -912
  570. package/.claude/worktrees/kanban-overhaul/bizar-dash/GLYPH.md +0 -418
  571. package/.claude/worktrees/kanban-overhaul/bizar-dash/PLAN.md +0 -1135
  572. package/.claude/worktrees/kanban-overhaul/bizar-dash/critique.json +0 -26
  573. package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/comments.json +0 -1
  574. package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/meta.json +0 -10
  575. package/.claude/worktrees/kanban-overhaul/bizar-dash/plans/debug-plan/plan.json +0 -174
  576. package/.claude/worktrees/kanban-overhaul/bizar-dash/scripts/smoke-bg-retry.mjs +0 -246
  577. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/agent-baseline/SKILL.md +0 -80
  578. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/agent-browser/SKILL.md +0 -181
  579. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/bizar/SKILL.md +0 -116
  580. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/chat/SKILL.md +0 -74
  581. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/eval/SKILL.md +0 -237
  582. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/headroom/SKILL.md +0 -94
  583. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/lightrag/SKILL.md +0 -86
  584. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/minimax/SKILL.md +0 -80
  585. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/obsidian/SKILL.md +0 -68
  586. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/providers/SKILL.md +0 -75
  587. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/publishing/SKILL.md +0 -146
  588. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/sdk/SKILL.md +0 -138
  589. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/self-improvement/SKILL.md +0 -53
  590. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/skills-cli/SKILL.md +0 -94
  591. package/.claude/worktrees/kanban-overhaul/bizar-dash/skills/usage/SKILL.md +0 -62
  592. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/cli/dashboard-ports.mjs +0 -488
  593. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/cli.mjs +0 -537
  594. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/activity-log.mjs +0 -174
  595. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/agents-store.mjs +0 -465
  596. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/api.mjs +0 -223
  597. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/artifact-template.html +0 -810
  598. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/artifacts-store.mjs +0 -733
  599. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/auth.mjs +0 -548
  600. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/background-store.mjs +0 -446
  601. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/backup-store.mjs +0 -530
  602. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-poller.mjs +0 -375
  603. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-retry.mjs +0 -446
  604. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/bg-spawner.mjs +0 -390
  605. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/browser.mjs +0 -40
  606. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-bg-spawner.mjs +0 -390
  607. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-info.mjs +0 -412
  608. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-runner.mjs +0 -284
  609. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/claude-sdk.mjs +0 -191
  610. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/diagnostics-store.mjs +0 -598
  611. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/dialog-poller.mjs +0 -105
  612. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/dialog-store.mjs +0 -177
  613. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/digest-store.mjs +0 -558
  614. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/eval-store.mjs +0 -281
  615. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/eval.mjs +0 -500
  616. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/glyphs/mdx-compiler.mjs +0 -596
  617. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/headroom.mjs +0 -649
  618. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/lib/path-safe.mjs +0 -283
  619. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/lib/rate-limit.mjs +0 -122
  620. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/logger.mjs +0 -71
  621. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-consolidator.mjs +0 -225
  622. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-distillation.mjs +0 -296
  623. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-git.mjs +0 -473
  624. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-lightrag.mjs +0 -1478
  625. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-obsidian.mjs +0 -230
  626. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-schema.mjs +0 -145
  627. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-secrets.mjs +0 -84
  628. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/memory-store.mjs +0 -1093
  629. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/metrics.mjs +0 -268
  630. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/minimax-usage-store.mjs +0 -372
  631. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/minimax.mjs +0 -683
  632. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/mod-security.mjs +0 -398
  633. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/mods-loader.mjs +0 -1243
  634. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/notifications-store.mjs +0 -243
  635. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/obsidian-store.mjs +0 -318
  636. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/ocr.mjs +0 -55
  637. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/otel.mjs +0 -260
  638. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/pair-store.mjs +0 -138
  639. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/progress-parser.mjs +0 -221
  640. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/projects-store.mjs +0 -364
  641. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/providers-store.mjs +0 -1801
  642. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/_shared.mjs +0 -447
  643. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/activity.mjs +0 -195
  644. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/agents-cc.mjs +0 -194
  645. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/agents.mjs +0 -134
  646. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/artifacts.mjs +0 -279
  647. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/auth.mjs +0 -69
  648. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/background.mjs +0 -422
  649. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/backup.mjs +0 -112
  650. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/chat.mjs +0 -727
  651. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/claude-session-detail.mjs +0 -329
  652. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/claude-sessions.mjs +0 -259
  653. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/clipboard.mjs +0 -173
  654. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/config.mjs +0 -180
  655. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/diagnostics.mjs +0 -50
  656. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/dialogs.mjs +0 -86
  657. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/digests.mjs +0 -82
  658. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/distill.mjs +0 -129
  659. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/doctor.mjs +0 -71
  660. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/env-vars.mjs +0 -231
  661. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/eval.mjs +0 -187
  662. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/fs.mjs +0 -429
  663. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/goal-planner.mjs +0 -236
  664. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/goals.mjs +0 -212
  665. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/headroom.mjs +0 -126
  666. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/history.mjs +0 -78
  667. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/lightrag.mjs +0 -169
  668. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/memory.mjs +0 -1524
  669. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/minimax.mjs +0 -133
  670. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/misc.mjs +0 -90
  671. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/mods.mjs +0 -359
  672. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/notifications.mjs +0 -54
  673. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/obsidian.mjs +0 -239
  674. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/ocr.mjs +0 -182
  675. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/overview.mjs +0 -92
  676. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/pair.mjs +0 -67
  677. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/projects.mjs +0 -175
  678. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/providers.mjs +0 -308
  679. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/schedules.mjs +0 -159
  680. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/settings.mjs +0 -51
  681. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/skills.mjs +0 -65
  682. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/tailscale.mjs +0 -46
  683. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/tasks.mjs +0 -518
  684. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/themes.mjs +0 -51
  685. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/update.mjs +0 -340
  686. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/usage.mjs +0 -136
  687. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/users.mjs +0 -102
  688. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/voice.mjs +0 -167
  689. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes/workspaces.mjs +0 -299
  690. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/auth.mjs +0 -59
  691. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/events.mjs +0 -121
  692. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/health.mjs +0 -21
  693. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/index.mjs +0 -90
  694. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/routes-v2/sessions.mjs +0 -111
  695. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/schedules-runner.mjs +0 -556
  696. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/schedules-store.mjs +0 -268
  697. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/search-store.mjs +0 -220
  698. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/serve-info.mjs +0 -1110
  699. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/server.mjs +0 -966
  700. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/settings-store.mjs +0 -45
  701. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/skills-store.mjs +0 -190
  702. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/state.mjs +0 -437
  703. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tailscale-store.mjs +0 -113
  704. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/task-delegator.mjs +0 -969
  705. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tasks-store.mjs +0 -556
  706. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/tui.mjs +0 -923
  707. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/update-store.mjs +0 -168
  708. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/v2-auth-file.mjs +0 -99
  709. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/v2-event-bus.mjs +0 -128
  710. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/voice-store.mjs +0 -229
  711. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/voice-transcribe.mjs +0 -72
  712. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/watcher.mjs +0 -81
  713. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/workers/transcription-worker.mjs +0 -213
  714. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/workspaces.mjs +0 -626
  715. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/server/yaml.mjs +0 -238
  716. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/App.tsx +0 -200
  717. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/fetcher.ts +0 -59
  718. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/types.ts +0 -168
  719. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/useFetch.ts +0 -62
  720. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/data/useWebSocket.ts +0 -153
  721. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/main.tsx +0 -28
  722. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/AppShell.tsx +0 -90
  723. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +0 -29
  724. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/Sidebar.tsx +0 -361
  725. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/StatusBar.tsx +0 -63
  726. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/Topbar.tsx +0 -113
  727. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/shell/index.ts +0 -15
  728. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +0 -137
  729. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +0 -101
  730. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +0 -158
  731. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +0 -232
  732. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Button.tsx +0 -141
  733. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +0 -32
  734. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +0 -49
  735. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Field.tsx +0 -78
  736. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Form.tsx +0 -23
  737. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +0 -112
  738. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Input.tsx +0 -94
  739. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +0 -74
  740. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Select.tsx +0 -171
  741. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Slider.tsx +0 -68
  742. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Switch.tsx +0 -56
  743. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +0 -64
  744. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +0 -36
  745. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +0 -85
  746. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Accordion.tsx +0 -134
  747. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Avatar.tsx +0 -175
  748. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Badge.tsx +0 -93
  749. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/BarList.tsx +0 -101
  750. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Card.tsx +0 -140
  751. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Chip.tsx +0 -96
  752. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Kbd.tsx +0 -42
  753. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +0 -93
  754. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +0 -98
  755. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/StatTile.tsx +0 -150
  756. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Table.tsx +0 -170
  757. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/Timeline.tsx +0 -130
  758. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +0 -122
  759. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +0 -95
  760. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +0 -39
  761. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +0 -143
  762. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +0 -149
  763. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +0 -8
  764. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +0 -231
  765. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +0 -48
  766. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +0 -56
  767. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +0 -103
  768. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +0 -67
  769. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +0 -30
  770. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +0 -66
  771. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +0 -89
  772. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +0 -176
  773. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +0 -245
  774. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +0 -115
  775. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/index.ts +0 -349
  776. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +0 -115
  777. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +0 -391
  778. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +0 -181
  779. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +0 -126
  780. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanDetailDialog.tsx +0 -638
  781. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +0 -141
  782. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +0 -30
  783. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +0 -161
  784. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +0 -144
  785. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +0 -224
  786. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +0 -81
  787. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +0 -164
  788. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +0 -128
  789. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Box.tsx +0 -144
  790. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Center.tsx +0 -40
  791. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +0 -67
  792. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +0 -104
  793. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +0 -77
  794. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +0 -33
  795. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +0 -62
  796. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +0 -42
  797. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +0 -73
  798. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +0 -49
  799. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +0 -91
  800. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +0 -88
  801. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +0 -109
  802. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/globals.css +0 -220
  803. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/reset.css +0 -57
  804. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/styles/tokens.css +0 -217
  805. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +0 -66
  806. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +0 -94
  807. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +0 -88
  808. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/useDensity.ts +0 -15
  809. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/theme/useTheme.ts +0 -16
  810. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/ui/utils/cx.ts +0 -19
  811. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +0 -71
  812. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +0 -172
  813. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +0 -247
  814. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +0 -137
  815. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +0 -108
  816. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +0 -77
  817. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +0 -152
  818. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Router.tsx +0 -72
  819. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +0 -330
  820. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +0 -106
  821. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +0 -792
  822. package/.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8/vite-env.d.ts +0 -15
  823. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/FORMAT.md +0 -76
  824. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/README.md +0 -19
  825. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/agents/greeter.md +0 -8
  826. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/commands/hello.md +0 -6
  827. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/mod.json +0 -20
  828. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +0 -9
  829. package/.claude/worktrees/kanban-overhaul/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +0 -10
  830. package/.claude/worktrees/kanban-overhaul/bizar-dash/tests/setup.ts +0 -63
  831. package/.claude/worktrees/kanban-overhaul/bizar-dash/tests/smoke-v2.mjs +0 -212
  832. package/.claude/worktrees/kanban-overhaul/bizar-dash/tsconfig.json +0 -23
  833. package/.claude/worktrees/kanban-overhaul/bizar-dash/vite.config.ts +0 -66
  834. package/.claude/worktrees/kanban-overhaul/bizar-dash/vitest.config.ts +0 -20
  835. package/.claude/worktrees/kanban-overhaul/bizar-plugins/registry.json +0 -62
  836. package/.claude/worktrees/kanban-overhaul/bookmarklet/bizar-clipper.js +0 -48
  837. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/README.md +0 -43
  838. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/background.js +0 -95
  839. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/content.js +0 -170
  840. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-128.png +0 -0
  841. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-16.png +0 -0
  842. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon-48.png +0 -0
  843. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/icons/icon.svg +0 -4
  844. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/manifest.json +0 -32
  845. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/popup.html +0 -66
  846. package/.claude/worktrees/kanban-overhaul/browser-extensions/bizar-clipper/popup.js +0 -110
  847. package/.claude/worktrees/kanban-overhaul/bun.lock +0 -1558
  848. package/.claude/worktrees/kanban-overhaul/cli/agent-browser-up.sh +0 -152
  849. package/.claude/worktrees/kanban-overhaul/cli/agent-browser-update.mjs +0 -322
  850. package/.claude/worktrees/kanban-overhaul/cli/artifact-cli.mjs +0 -605
  851. package/.claude/worktrees/kanban-overhaul/cli/artifact-render.mjs +0 -621
  852. package/.claude/worktrees/kanban-overhaul/cli/artifact-server.mjs +0 -847
  853. package/.claude/worktrees/kanban-overhaul/cli/artifact-templates.mjs +0 -523
  854. package/.claude/worktrees/kanban-overhaul/cli/artifact.mjs +0 -63
  855. package/.claude/worktrees/kanban-overhaul/cli/atomic.mjs +0 -73
  856. package/.claude/worktrees/kanban-overhaul/cli/audit.mjs +0 -141
  857. package/.claude/worktrees/kanban-overhaul/cli/banner.mjs +0 -41
  858. package/.claude/worktrees/kanban-overhaul/cli/bg.mjs +0 -471
  859. package/.claude/worktrees/kanban-overhaul/cli/bin.mjs +0 -698
  860. package/.claude/worktrees/kanban-overhaul/cli/bootstrap.mjs +0 -77
  861. package/.claude/worktrees/kanban-overhaul/cli/commands/artifact.mjs +0 -20
  862. package/.claude/worktrees/kanban-overhaul/cli/commands/claim.mjs +0 -282
  863. package/.claude/worktrees/kanban-overhaul/cli/commands/claude-cmd.mjs +0 -348
  864. package/.claude/worktrees/kanban-overhaul/cli/commands/clip.mjs +0 -163
  865. package/.claude/worktrees/kanban-overhaul/cli/commands/cost.mjs +0 -279
  866. package/.claude/worktrees/kanban-overhaul/cli/commands/dash.mjs +0 -193
  867. package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/cloudflare.mjs +0 -250
  868. package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/docker.mjs +0 -222
  869. package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/fly.mjs +0 -161
  870. package/.claude/worktrees/kanban-overhaul/cli/commands/deploy/vercel.mjs +0 -225
  871. package/.claude/worktrees/kanban-overhaul/cli/commands/deploy.mjs +0 -240
  872. package/.claude/worktrees/kanban-overhaul/cli/commands/eval.mjs +0 -396
  873. package/.claude/worktrees/kanban-overhaul/cli/commands/headroom.mjs +0 -204
  874. package/.claude/worktrees/kanban-overhaul/cli/commands/install.mjs +0 -170
  875. package/.claude/worktrees/kanban-overhaul/cli/commands/lightrag.mjs +0 -170
  876. package/.claude/worktrees/kanban-overhaul/cli/commands/marketplace.mjs +0 -64
  877. package/.claude/worktrees/kanban-overhaul/cli/commands/memory.mjs +0 -25
  878. package/.claude/worktrees/kanban-overhaul/cli/commands/minimax.mjs +0 -288
  879. package/.claude/worktrees/kanban-overhaul/cli/commands/mod.mjs +0 -185
  880. package/.claude/worktrees/kanban-overhaul/cli/commands/ocr.mjs +0 -182
  881. package/.claude/worktrees/kanban-overhaul/cli/commands/plugin.mjs +0 -358
  882. package/.claude/worktrees/kanban-overhaul/cli/commands/rca.mjs +0 -198
  883. package/.claude/worktrees/kanban-overhaul/cli/commands/sandbox.mjs +0 -220
  884. package/.claude/worktrees/kanban-overhaul/cli/commands/service.mjs +0 -79
  885. package/.claude/worktrees/kanban-overhaul/cli/commands/setup-provider.mjs +0 -466
  886. package/.claude/worktrees/kanban-overhaul/cli/commands/tailscale.mjs +0 -258
  887. package/.claude/worktrees/kanban-overhaul/cli/commands/usage.mjs +0 -113
  888. package/.claude/worktrees/kanban-overhaul/cli/commands/util.mjs +0 -577
  889. package/.claude/worktrees/kanban-overhaul/cli/commands/validate.mjs +0 -541
  890. package/.claude/worktrees/kanban-overhaul/cli/commands/voice.mjs +0 -211
  891. package/.claude/worktrees/kanban-overhaul/cli/commands/workspace.mjs +0 -247
  892. package/.claude/worktrees/kanban-overhaul/cli/copy.mjs +0 -586
  893. package/.claude/worktrees/kanban-overhaul/cli/cost-gate.mjs +0 -501
  894. package/.claude/worktrees/kanban-overhaul/cli/dev-link.mjs +0 -191
  895. package/.claude/worktrees/kanban-overhaul/cli/digest.mjs +0 -149
  896. package/.claude/worktrees/kanban-overhaul/cli/doctor.mjs +0 -217
  897. package/.claude/worktrees/kanban-overhaul/cli/export.mjs +0 -95
  898. package/.claude/worktrees/kanban-overhaul/cli/feature-list-bridge.mjs +0 -400
  899. package/.claude/worktrees/kanban-overhaul/cli/heads-up.mjs +0 -295
  900. package/.claude/worktrees/kanban-overhaul/cli/init.mjs +0 -368
  901. package/.claude/worktrees/kanban-overhaul/cli/install.mjs +0 -640
  902. package/.claude/worktrees/kanban-overhaul/cli/memory-constants.mjs +0 -76
  903. package/.claude/worktrees/kanban-overhaul/cli/memory.mjs +0 -1850
  904. package/.claude/worktrees/kanban-overhaul/cli/plugin-runtime-deps.mjs +0 -250
  905. package/.claude/worktrees/kanban-overhaul/cli/post-install-smoke.mjs +0 -256
  906. package/.claude/worktrees/kanban-overhaul/cli/prompts.mjs +0 -168
  907. package/.claude/worktrees/kanban-overhaul/cli/providers-detect.mjs +0 -233
  908. package/.claude/worktrees/kanban-overhaul/cli/provision-claude.mjs +0 -1176
  909. package/.claude/worktrees/kanban-overhaul/cli/provision.mjs +0 -2233
  910. package/.claude/worktrees/kanban-overhaul/cli/repair.mjs +0 -209
  911. package/.claude/worktrees/kanban-overhaul/cli/service-controller.mjs +0 -927
  912. package/.claude/worktrees/kanban-overhaul/cli/service-env.mjs +0 -139
  913. package/.claude/worktrees/kanban-overhaul/cli/service.mjs +0 -492
  914. package/.claude/worktrees/kanban-overhaul/cli/update.mjs +0 -29
  915. package/.claude/worktrees/kanban-overhaul/cli/utils.mjs +0 -221
  916. package/.claude/worktrees/kanban-overhaul/cli/worker-dispatcher.mjs +0 -259
  917. package/.claude/worktrees/kanban-overhaul/config/AGENTS.md +0 -595
  918. package/.claude/worktrees/kanban-overhaul/config/agents/_shared/AGENT_BASELINE.md +0 -155
  919. package/.claude/worktrees/kanban-overhaul/config/agents/_shared/CLINE_TOOLS.md +0 -398
  920. package/.claude/worktrees/kanban-overhaul/config/agents/_shared/SKILLS.md +0 -109
  921. package/.claude/worktrees/kanban-overhaul/config/agents/agent-browser.md +0 -90
  922. package/.claude/worktrees/kanban-overhaul/config/agents/baldr.md +0 -60
  923. package/.claude/worktrees/kanban-overhaul/config/agents/forseti.md +0 -60
  924. package/.claude/worktrees/kanban-overhaul/config/agents/frigg.md +0 -52
  925. package/.claude/worktrees/kanban-overhaul/config/agents/heimdall.md +0 -44
  926. package/.claude/worktrees/kanban-overhaul/config/agents/hermod.md +0 -64
  927. package/.claude/worktrees/kanban-overhaul/config/agents/mimir.md +0 -60
  928. package/.claude/worktrees/kanban-overhaul/config/agents/odin.md +0 -310
  929. package/.claude/worktrees/kanban-overhaul/config/agents/quick.md +0 -47
  930. package/.claude/worktrees/kanban-overhaul/config/agents/semble-search.md +0 -59
  931. package/.claude/worktrees/kanban-overhaul/config/agents/thor.md +0 -64
  932. package/.claude/worktrees/kanban-overhaul/config/agents/tyr.md +0 -67
  933. package/.claude/worktrees/kanban-overhaul/config/agents/vidarr.md +0 -65
  934. package/.claude/worktrees/kanban-overhaul/config/agents/vor.md +0 -62
  935. package/.claude/worktrees/kanban-overhaul/config/commands/audit.md +0 -5
  936. package/.claude/worktrees/kanban-overhaul/config/commands/bizar.md +0 -22
  937. package/.claude/worktrees/kanban-overhaul/config/commands/explain.md +0 -5
  938. package/.claude/worktrees/kanban-overhaul/config/commands/init.md +0 -26
  939. package/.claude/worktrees/kanban-overhaul/config/commands/learn.md +0 -5
  940. package/.claude/worktrees/kanban-overhaul/config/commands/plan.md +0 -30
  941. package/.claude/worktrees/kanban-overhaul/config/commands/plow-through.md +0 -47
  942. package/.claude/worktrees/kanban-overhaul/config/commands/pr-review.md +0 -5
  943. package/.claude/worktrees/kanban-overhaul/config/commands/setup-provider.md +0 -95
  944. package/.claude/worktrees/kanban-overhaul/config/commands/tailscale-serve.md +0 -97
  945. package/.claude/worktrees/kanban-overhaul/config/commands/team.md +0 -124
  946. package/.claude/worktrees/kanban-overhaul/config/commands/test.md +0 -60
  947. package/.claude/worktrees/kanban-overhaul/config/commands/validate.md +0 -66
  948. package/.claude/worktrees/kanban-overhaul/config/commands/visual-plan.md +0 -19
  949. package/.claude/worktrees/kanban-overhaul/config/hooks/PostToolUse +0 -66
  950. package/.claude/worktrees/kanban-overhaul/config/hooks/PreToolUse +0 -82
  951. package/.claude/worktrees/kanban-overhaul/config/hooks/README.md +0 -68
  952. package/.claude/worktrees/kanban-overhaul/config/hooks/TaskResume +0 -48
  953. package/.claude/worktrees/kanban-overhaul/config/hooks/TaskStart +0 -47
  954. package/.claude/worktrees/kanban-overhaul/config/hooks/UserPromptSubmit +0 -55
  955. package/.claude/worktrees/kanban-overhaul/config/rules/general.md +0 -9
  956. package/.claude/worktrees/kanban-overhaul/config/rules/git.md +0 -11
  957. package/.claude/worktrees/kanban-overhaul/config/rules/javascript.md +0 -10
  958. package/.claude/worktrees/kanban-overhaul/config/rules/python.md +0 -10
  959. package/.claude/worktrees/kanban-overhaul/config/rules/testing.md +0 -10
  960. package/.claude/worktrees/kanban-overhaul/config/rules/thinking.md +0 -56
  961. package/.claude/worktrees/kanban-overhaul/config/rules/uncertainty.md +0 -70
  962. package/.claude/worktrees/kanban-overhaul/config/skills/9router/SKILL.md +0 -80
  963. package/.claude/worktrees/kanban-overhaul/config/skills/9router-chat/SKILL.md +0 -73
  964. package/.claude/worktrees/kanban-overhaul/config/skills/9router-embeddings/SKILL.md +0 -69
  965. package/.claude/worktrees/kanban-overhaul/config/skills/9router-image/SKILL.md +0 -86
  966. package/.claude/worktrees/kanban-overhaul/config/skills/9router-stt/SKILL.md +0 -79
  967. package/.claude/worktrees/kanban-overhaul/config/skills/9router-tts/SKILL.md +0 -80
  968. package/.claude/worktrees/kanban-overhaul/config/skills/9router-web-fetch/SKILL.md +0 -99
  969. package/.claude/worktrees/kanban-overhaul/config/skills/9router-web-search/SKILL.md +0 -91
  970. package/.claude/worktrees/kanban-overhaul/config/skills/bizar/README.md +0 -9
  971. package/.claude/worktrees/kanban-overhaul/config/skills/bizar/SKILL.md +0 -447
  972. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/README.md +0 -28
  973. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/SKILL.md +0 -634
  974. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/agents/openai.yaml +0 -4
  975. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/concurrency.md +0 -320
  976. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/error-handling.md +0 -229
  977. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/memory-safety.md +0 -216
  978. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
  979. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-coding-standards/references/review-checklist.md +0 -96
  980. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/README.md +0 -28
  981. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/SKILL.md +0 -304
  982. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/agents/openai.yaml +0 -4
  983. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/coverage.md +0 -370
  984. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/framework-compare.md +0 -175
  985. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
  986. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/mocking.md +0 -364
  987. package/.claude/worktrees/kanban-overhaul/config/skills/cpp-testing/references/tdd-workflow.md +0 -308
  988. package/.claude/worktrees/kanban-overhaul/config/skills/cubesandbox/SKILL.md +0 -148
  989. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/README.md +0 -41
  990. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/SKILL.md +0 -439
  991. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/agents/openai.yaml +0 -4
  992. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
  993. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/host-tests.md +0 -164
  994. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
  995. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/kconfig.md +0 -159
  996. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
  997. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
  998. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/nvs.md +0 -121
  999. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/references/packed-structs.md +0 -192
  1000. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
  1001. package/.claude/worktrees/kanban-overhaul/config/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
  1002. package/.claude/worktrees/kanban-overhaul/config/skills/glyph/SKILL.md +0 -163
  1003. package/.claude/worktrees/kanban-overhaul/config/skills/harness-engineering/SKILL.md +0 -142
  1004. package/.claude/worktrees/kanban-overhaul/config/skills/lightrag/SKILL.md +0 -81
  1005. package/.claude/worktrees/kanban-overhaul/config/skills/memory-protocol/SKILL.md +0 -105
  1006. package/.claude/worktrees/kanban-overhaul/config/skills/obsidian/SKILL.md +0 -306
  1007. package/.claude/worktrees/kanban-overhaul/config/skills/read-the-damn-docs/SKILL.md +0 -113
  1008. package/.claude/worktrees/kanban-overhaul/config/skills/self-improvement/SKILL.md +0 -64
  1009. package/.claude/worktrees/kanban-overhaul/config/trigger-patterns.json +0 -186
  1010. package/.claude/worktrees/kanban-overhaul/docker-compose.yml +0 -50
  1011. package/.claude/worktrees/kanban-overhaul/docs/A11Y.md +0 -81
  1012. package/.claude/worktrees/kanban-overhaul/docs/DEPLOY.md +0 -360
  1013. package/.claude/worktrees/kanban-overhaul/docs/DOCKER.md +0 -250
  1014. package/.claude/worktrees/kanban-overhaul/docs/INDEX.md +0 -223
  1015. package/.claude/worktrees/kanban-overhaul/docs/PLUGIN_REGISTRY.md +0 -107
  1016. package/.claude/worktrees/kanban-overhaul/docs/RELEASING.md +0 -693
  1017. package/.claude/worktrees/kanban-overhaul/docs/architecture.md +0 -317
  1018. package/.claude/worktrees/kanban-overhaul/docs/code-review.md +0 -242
  1019. package/.claude/worktrees/kanban-overhaul/docs/curator.md +0 -144
  1020. package/.claude/worktrees/kanban-overhaul/docs/dashboard-ui-migration.md +0 -807
  1021. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-001-cline-rewrite.md +0 -114
  1022. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-002-in-process-clinecore.md +0 -139
  1023. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-003-in-process-memory-vault.md +0 -101
  1024. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-004-cline-agent-teams.md +0 -112
  1025. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-005-bg-agents-via-dashboard.md +0 -77
  1026. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-006-kanban-board.md +0 -69
  1027. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-007-tool-approval-gate.md +0 -147
  1028. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-008-skill-curator.md +0 -100
  1029. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-009-pre-compaction-flush.md +0 -106
  1030. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-010-knowledge-graph-tools.md +0 -95
  1031. package/.claude/worktrees/kanban-overhaul/docs/decisions/DEC-011-claude-code-migration.md +0 -172
  1032. package/.claude/worktrees/kanban-overhaul/docs/graph-tools.md +0 -130
  1033. package/.claude/worktrees/kanban-overhaul/docs/migration-guide.md +0 -471
  1034. package/.claude/worktrees/kanban-overhaul/docs/migrations/cline-replacement.md +0 -118
  1035. package/.claude/worktrees/kanban-overhaul/docs/postmortems/2026-06-18-plugin-state-deadlock.md +0 -250
  1036. package/.claude/worktrees/kanban-overhaul/docs/quality-document.md +0 -74
  1037. package/.claude/worktrees/kanban-overhaul/docs/releases/v0.5.2.md +0 -66
  1038. package/.claude/worktrees/kanban-overhaul/docs/releases/v0.5.4.md +0 -85
  1039. package/.claude/worktrees/kanban-overhaul/docs/releases/v2.3.0.md +0 -96
  1040. package/.claude/worktrees/kanban-overhaul/docs/releases/v3.24.0.md +0 -155
  1041. package/.claude/worktrees/kanban-overhaul/docs/releases/v4.0.0.md +0 -123
  1042. package/.claude/worktrees/kanban-overhaul/docs/releases/v7.0.0.md +0 -173
  1043. package/.claude/worktrees/kanban-overhaul/docs/safety.md +0 -216
  1044. package/.claude/worktrees/kanban-overhaul/feature_list.json +0 -1297
  1045. package/.claude/worktrees/kanban-overhaul/init.sh +0 -211
  1046. package/.claude/worktrees/kanban-overhaul/install.sh +0 -498
  1047. package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/INSTRUCTIONS.md +0 -82
  1048. package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/mod.json +0 -37
  1049. package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/route.mjs +0 -136
  1050. package/.claude/worktrees/kanban-overhaul/mods-examples/impeccable/web/index.html +0 -180
  1051. package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/INSTRUCTIONS.md +0 -81
  1052. package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/mod.json +0 -61
  1053. package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/route.mjs +0 -461
  1054. package/.claude/worktrees/kanban-overhaul/mods-examples/lightrag/web/index.html +0 -263
  1055. package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/INSTRUCTIONS.md +0 -87
  1056. package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/agents/thor.md +0 -64
  1057. package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/mod.json +0 -36
  1058. package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/route.mjs +0 -98
  1059. package/.claude/worktrees/kanban-overhaul/mods-examples/ponytail/web/index.html +0 -126
  1060. package/.claude/worktrees/kanban-overhaul/package.json +0 -154
  1061. package/.claude/worktrees/kanban-overhaul/packages/sdk/ARCHITECTURE.md +0 -70
  1062. package/.claude/worktrees/kanban-overhaul/packages/sdk/LICENSE +0 -21
  1063. package/.claude/worktrees/kanban-overhaul/packages/sdk/README.md +0 -80
  1064. package/.claude/worktrees/kanban-overhaul/packages/sdk/package.json +0 -30
  1065. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/agent-registry.ts +0 -304
  1066. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/byzantine.ts +0 -587
  1067. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/index.ts +0 -147
  1068. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/queen.ts +0 -173
  1069. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/consensus/types.ts +0 -199
  1070. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/dangerous-patterns.ts +0 -127
  1071. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/audit.ts +0 -156
  1072. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/budget.ts +0 -269
  1073. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/envelope.ts +0 -144
  1074. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/hmac.ts +0 -160
  1075. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/index.ts +0 -443
  1076. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/pii.ts +0 -241
  1077. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/policy.ts +0 -112
  1078. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/federation/trust.ts +0 -146
  1079. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/fingerprint.ts +0 -0
  1080. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/index.ts +0 -114
  1081. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/mcp/bin.ts +0 -51
  1082. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/mcp/server.ts +0 -848
  1083. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/memory/index.ts +0 -160
  1084. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/codemod-intent.ts +0 -125
  1085. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/index.ts +0 -247
  1086. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/memory-distillation-shim.mjs +0 -18
  1087. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/memory-distillation.ts +0 -249
  1088. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/model-router.ts +0 -235
  1089. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/router/q-learning-router.ts +0 -304
  1090. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/swarm-topology.ts +0 -279
  1091. package/.claude/worktrees/kanban-overhaul/packages/sdk/src/version.ts +0 -4
  1092. package/.claude/worktrees/kanban-overhaul/packages/sdk/tsconfig.json +0 -25
  1093. package/.claude/worktrees/kanban-overhaul/packages/sdk/vitest.config.ts +0 -9
  1094. package/.claude/worktrees/kanban-overhaul/plugins/bizar/ARCHITECTURE.md +0 -72
  1095. package/.claude/worktrees/kanban-overhaul/plugins/bizar/CONSTRAINTS.md +0 -62
  1096. package/.claude/worktrees/kanban-overhaul/plugins/bizar/LICENSE +0 -21
  1097. package/.claude/worktrees/kanban-overhaul/plugins/bizar/README.md +0 -46
  1098. package/.claude/worktrees/kanban-overhaul/plugins/bizar/index.ts +0 -50
  1099. package/.claude/worktrees/kanban-overhaul/plugins/bizar/package.json +0 -18
  1100. package/.claude/worktrees/kanban-overhaul/plugins/bizar/tsconfig.json +0 -29
  1101. package/.claude/worktrees/kanban-overhaul/scripts/bh-full-e2e.mjs +0 -298
  1102. package/.claude/worktrees/kanban-overhaul/scripts/check-agents.mjs +0 -73
  1103. package/.claude/worktrees/kanban-overhaul/scripts/check-arch.sh +0 -80
  1104. package/.claude/worktrees/kanban-overhaul/scripts/check-deps.mjs +0 -492
  1105. package/.claude/worktrees/kanban-overhaul/scripts/clean-state-check.sh +0 -81
  1106. package/.claude/worktrees/kanban-overhaul/scripts/git-hooks/pre-commit +0 -59
  1107. package/.claude/worktrees/kanban-overhaul/scripts/git-hooks/pre-push +0 -54
  1108. package/.claude/worktrees/kanban-overhaul/scripts/install-hooks.sh +0 -29
  1109. package/.claude/worktrees/kanban-overhaul/scripts/install-service.mjs +0 -190
  1110. package/.claude/worktrees/kanban-overhaul/scripts/mirror-claude-md.sh +0 -78
  1111. package/.claude/worktrees/kanban-overhaul/scripts/session-trace.sh +0 -52
  1112. package/.claude/worktrees/kanban-overhaul/scripts/test-in-container.sh +0 -157
  1113. package/.claude/worktrees/kanban-overhaul/scripts/verify-feature.sh +0 -102
  1114. package/.claude/worktrees/kanban-overhaul/skills-lock.json +0 -11
  1115. package/.claude/worktrees/kanban-overhaul/templates/clean-state-checklist.md +0 -55
  1116. package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/README.md +0 -32
  1117. package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/functions-index.template.js +0 -15
  1118. package/.claude/worktrees/kanban-overhaul/templates/deploy/cloudflare/wrangler.toml.template +0 -9
  1119. package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/.env.template +0 -16
  1120. package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/README.md +0 -58
  1121. package/.claude/worktrees/kanban-overhaul/templates/deploy/docker/docker-compose.template.yml +0 -23
  1122. package/.claude/worktrees/kanban-overhaul/templates/deploy/fly/README.md +0 -35
  1123. package/.claude/worktrees/kanban-overhaul/templates/deploy/fly/fly.toml.template +0 -28
  1124. package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/README.md +0 -29
  1125. package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/api-index.template.js +0 -18
  1126. package/.claude/worktrees/kanban-overhaul/templates/deploy/vercel/vercel.json.template +0 -16
  1127. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/README.md +0 -58
  1128. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/citation.json +0 -16
  1129. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/code-review.json +0 -16
  1130. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/code-search-basic.json +0 -28
  1131. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/concise-output.json +0 -16
  1132. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/context-window.json +0 -16
  1133. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/error-recovery.json +0 -16
  1134. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/json-output.json +0 -20
  1135. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/latency-bounds.json +0 -16
  1136. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/multi-language.json +0 -16
  1137. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/regression-suite.json +0 -79
  1138. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/response-format.json +0 -30
  1139. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/safe-paths.json +0 -16
  1140. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/tool-call-correctness.json +0 -24
  1141. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/tool-call-multi-step.json +0 -18
  1142. package/.claude/worktrees/kanban-overhaul/templates/eval-fixtures/unicode-handling.json +0 -16
  1143. package/.claude/worktrees/kanban-overhaul/templates/evaluator-rubric.md +0 -50
  1144. package/.claude/worktrees/kanban-overhaul/templates/plan/htmx.min.js +0 -1
  1145. package/.claude/worktrees/kanban-overhaul/templates/plan/library/bug-investigation.mdx +0 -79
  1146. package/.claude/worktrees/kanban-overhaul/templates/plan/library/decision-record.mdx +0 -71
  1147. package/.claude/worktrees/kanban-overhaul/templates/plan/library/feature-design.mdx +0 -92
  1148. package/.claude/worktrees/kanban-overhaul/templates/plan/meta.json.template +0 -8
  1149. package/.claude/worktrees/kanban-overhaul/templates/plan/plan.mdx.template +0 -46
  1150. package/.claude/worktrees/kanban-overhaul/templates/plugin-template/README.md +0 -121
  1151. package/.claude/worktrees/kanban-overhaul/templates/plugin-template/index.js +0 -66
  1152. package/.claude/worktrees/kanban-overhaul/templates/plugin-template/plugin.json +0 -42
  1153. package/.claude/worktrees/kanban-overhaul/templates/plugin-template/tests/plugin.test.js +0 -83
  1154. package/.claude/worktrees/kanban-overhaul/templates/schedules/daily-backup.json +0 -12
  1155. package/.claude/worktrees/kanban-overhaul/templates/schedules/daily-cleanup.json +0 -12
  1156. package/.claude/worktrees/kanban-overhaul/templates/schedules/hourly-health-check.json +0 -12
  1157. package/.claude/worktrees/kanban-overhaul/templates/schedules/webhook-on-push.json +0 -13
  1158. package/.claude/worktrees/kanban-overhaul/templates/schedules/weekly-digest.json +0 -13
  1159. package/.claude/worktrees/kanban-overhaul/templates/sprint-contract.md +0 -47
  1160. package/.claude/worktrees/kanban-overhaul/tsconfig.json +0 -44
  1161. package/.claude/worktrees/kanban-overhaul/vite.config.ts +0 -51
  1162. package/bizar-dash/dist/assets/ActivityFeed-BXIkGGQ1.js +0 -16
  1163. package/bizar-dash/dist/assets/ActivityFeed-BXIkGGQ1.js.map +0 -1
  1164. package/bizar-dash/dist/assets/ActivityView-CBxNNrZa.js +0 -12
  1165. package/bizar-dash/dist/assets/ActivityView-CBxNNrZa.js.map +0 -1
  1166. package/bizar-dash/dist/assets/AgentsView-uv4l21AH.js +0 -23
  1167. package/bizar-dash/dist/assets/AgentsView-uv4l21AH.js.map +0 -1
  1168. package/bizar-dash/dist/assets/BackgroundJobsView-CB4WXIpk.js +0 -6
  1169. package/bizar-dash/dist/assets/BackgroundJobsView-CB4WXIpk.js.map +0 -1
  1170. package/bizar-dash/dist/assets/Card-CeZsWlcP.js +0 -1
  1171. package/bizar-dash/dist/assets/Card-CeZsWlcP.js.map +0 -1
  1172. package/bizar-dash/dist/assets/Chip-OPjSKl2I.js +0 -1
  1173. package/bizar-dash/dist/assets/Chip-OPjSKl2I.js.map +0 -1
  1174. package/bizar-dash/dist/assets/EmptyState-BrLA8mbE.js +0 -1
  1175. package/bizar-dash/dist/assets/EmptyState-BrLA8mbE.js.map +0 -1
  1176. package/bizar-dash/dist/assets/GoalsView-B8R-kxQr.js +0 -11
  1177. package/bizar-dash/dist/assets/GoalsView-B8R-kxQr.js.map +0 -1
  1178. package/bizar-dash/dist/assets/Grid-B7NgNtff.js +0 -1
  1179. package/bizar-dash/dist/assets/Grid-B7NgNtff.js.map +0 -1
  1180. package/bizar-dash/dist/assets/Input-BW_5Sl6N.js +0 -1
  1181. package/bizar-dash/dist/assets/Input-BW_5Sl6N.js.map +0 -1
  1182. package/bizar-dash/dist/assets/KanbanCard-B-NOSfMN.js +0 -21
  1183. package/bizar-dash/dist/assets/KanbanCard-B-NOSfMN.js.map +0 -1
  1184. package/bizar-dash/dist/assets/LibrariesView-D6eB7B2A.js +0 -67
  1185. package/bizar-dash/dist/assets/LibrariesView-D6eB7B2A.js.map +0 -1
  1186. package/bizar-dash/dist/assets/MemoryView-MK4m1KbR.js +0 -13
  1187. package/bizar-dash/dist/assets/MemoryView-MK4m1KbR.js.map +0 -1
  1188. package/bizar-dash/dist/assets/OverviewView-CHavfYBa.js +0 -1
  1189. package/bizar-dash/dist/assets/OverviewView-CHavfYBa.js.map +0 -1
  1190. package/bizar-dash/dist/assets/SchedulesView-zV-0pbsz.js +0 -1
  1191. package/bizar-dash/dist/assets/SchedulesView-zV-0pbsz.js.map +0 -1
  1192. package/bizar-dash/dist/assets/Select-B6Ho36Tq.js +0 -11
  1193. package/bizar-dash/dist/assets/Select-B6Ho36Tq.js.map +0 -1
  1194. package/bizar-dash/dist/assets/SettingsRow-Br21uRFz.js +0 -1
  1195. package/bizar-dash/dist/assets/SettingsRow-Br21uRFz.js.map +0 -1
  1196. package/bizar-dash/dist/assets/SettingsView-Cx3uJrus.js +0 -38
  1197. package/bizar-dash/dist/assets/SettingsView-Cx3uJrus.js.map +0 -1
  1198. package/bizar-dash/dist/assets/Sheet-Cmu_4Zea.js +0 -1
  1199. package/bizar-dash/dist/assets/Sheet-Cmu_4Zea.js.map +0 -1
  1200. package/bizar-dash/dist/assets/Slider-B_jPr-SR.js +0 -1
  1201. package/bizar-dash/dist/assets/Slider-B_jPr-SR.js.map +0 -1
  1202. package/bizar-dash/dist/assets/Sparkline-Cmqw0N39.js +0 -1
  1203. package/bizar-dash/dist/assets/Sparkline-Cmqw0N39.js.map +0 -1
  1204. package/bizar-dash/dist/assets/Switch-C7Qyu50Y.js +0 -10
  1205. package/bizar-dash/dist/assets/Switch-C7Qyu50Y.js.map +0 -1
  1206. package/bizar-dash/dist/assets/TasksView-BXADmjgb.js +0 -1
  1207. package/bizar-dash/dist/assets/TasksView-BXADmjgb.js.map +0 -1
  1208. package/bizar-dash/dist/assets/Textarea-KIN98DVH.js +0 -1
  1209. package/bizar-dash/dist/assets/Textarea-KIN98DVH.js.map +0 -1
  1210. package/bizar-dash/dist/assets/ViewHeader-CPbqI-w8.js +0 -6
  1211. package/bizar-dash/dist/assets/ViewHeader-CPbqI-w8.js.map +0 -1
  1212. package/bizar-dash/dist/assets/brain-jN_ldx3U.js +0 -6
  1213. package/bizar-dash/dist/assets/brain-jN_ldx3U.js.map +0 -1
  1214. package/bizar-dash/dist/assets/calendar-DZGgPP2_.js +0 -6
  1215. package/bizar-dash/dist/assets/calendar-DZGgPP2_.js.map +0 -1
  1216. package/bizar-dash/dist/assets/circle-check-XhUtiACZ.js +0 -6
  1217. package/bizar-dash/dist/assets/circle-check-XhUtiACZ.js.map +0 -1
  1218. package/bizar-dash/dist/assets/clock-BXBnSbox.js +0 -6
  1219. package/bizar-dash/dist/assets/clock-BXBnSbox.js.map +0 -1
  1220. package/bizar-dash/dist/assets/cmdk-D15rXxc5.js +0 -80
  1221. package/bizar-dash/dist/assets/cmdk-D15rXxc5.js.map +0 -1
  1222. package/bizar-dash/dist/assets/dnd-kit-Bormfg7j.js +0 -5
  1223. package/bizar-dash/dist/assets/dnd-kit-Bormfg7j.js.map +0 -1
  1224. package/bizar-dash/dist/assets/git-pull-request-BCt0CEjc.js +0 -11
  1225. package/bizar-dash/dist/assets/git-pull-request-BCt0CEjc.js.map +0 -1
  1226. package/bizar-dash/dist/assets/index-C0JBGB5M.js +0 -1
  1227. package/bizar-dash/dist/assets/index-C0JBGB5M.js.map +0 -1
  1228. package/bizar-dash/dist/assets/index-CrWI7sQR.js +0 -1
  1229. package/bizar-dash/dist/assets/index-CrWI7sQR.js.map +0 -1
  1230. package/bizar-dash/dist/assets/main-CCimEcWH.js +0 -134
  1231. package/bizar-dash/dist/assets/main-CCimEcWH.js.map +0 -1
  1232. package/bizar-dash/dist/assets/play-B0rTjpSg.js +0 -6
  1233. package/bizar-dash/dist/assets/play-B0rTjpSg.js.map +0 -1
  1234. package/bizar-dash/dist/assets/plus-BaTQsS9G.js +0 -6
  1235. package/bizar-dash/dist/assets/plus-BaTQsS9G.js.map +0 -1
  1236. package/bizar-dash/dist/assets/refresh-cw-CoatVcs3.js +0 -6
  1237. package/bizar-dash/dist/assets/refresh-cw-CoatVcs3.js.map +0 -1
  1238. package/bizar-dash/dist/assets/terminal-k-1HFHcN.js +0 -11
  1239. package/bizar-dash/dist/assets/terminal-k-1HFHcN.js.map +0 -1
  1240. package/bizar-dash/dist/assets/trash-2-DtpKnAn2.js +0 -6
  1241. package/bizar-dash/dist/assets/trash-2-DtpKnAn2.js.map +0 -1
  1242. package/bizar-dash/dist/assets/triangle-alert-FHSs_e5b.js +0 -6
  1243. package/bizar-dash/dist/assets/triangle-alert-FHSs_e5b.js.map +0 -1
  1244. package/bizar-dash/dist/assets/wrench-CbBE0oQ0.js +0 -6
  1245. package/bizar-dash/dist/assets/wrench-CbBE0oQ0.js.map +0 -1
  1246. package/bizar-dash/dist/v8.html +0 -19
  1247. package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +0 -106
  1248. package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +0 -62
  1249. package/bizar-dash/src/web/v8.html +0 -17
  1250. package/packages/sdk/.harness/agents.json +0 -17
  1251. package/packages/sdk/.harness/topology.json +0 -4
  1252. package/packages/sdk/ARCHITECTURE.md +0 -70
  1253. package/packages/sdk/README.md +0 -80
  1254. package/packages/sdk/src/agent-registry.ts +0 -304
  1255. package/packages/sdk/src/consensus/byzantine.ts +0 -587
  1256. package/packages/sdk/src/consensus/index.ts +0 -147
  1257. package/packages/sdk/src/consensus/queen.ts +0 -173
  1258. package/packages/sdk/src/consensus/types.ts +0 -199
  1259. package/packages/sdk/src/dangerous-patterns.ts +0 -127
  1260. package/packages/sdk/src/federation/audit.ts +0 -156
  1261. package/packages/sdk/src/federation/budget.ts +0 -269
  1262. package/packages/sdk/src/federation/envelope.ts +0 -144
  1263. package/packages/sdk/src/federation/hmac.ts +0 -160
  1264. package/packages/sdk/src/federation/index.ts +0 -443
  1265. package/packages/sdk/src/federation/pii.ts +0 -241
  1266. package/packages/sdk/src/federation/policy.ts +0 -112
  1267. package/packages/sdk/src/federation/trust.ts +0 -146
  1268. package/packages/sdk/src/fingerprint.ts +0 -0
  1269. package/packages/sdk/src/index.ts +0 -114
  1270. package/packages/sdk/src/mcp/bin.ts +0 -51
  1271. package/packages/sdk/src/mcp/server.ts +0 -848
  1272. package/packages/sdk/src/memory/index.ts +0 -160
  1273. package/packages/sdk/src/router/codemod-intent.ts +0 -125
  1274. package/packages/sdk/src/router/index.ts +0 -247
  1275. package/packages/sdk/src/router/memory-distillation-shim.mjs +0 -18
  1276. package/packages/sdk/src/router/memory-distillation.ts +0 -249
  1277. package/packages/sdk/src/router/model-router.ts +0 -235
  1278. package/packages/sdk/src/router/q-learning-router.ts +0 -304
  1279. package/packages/sdk/src/swarm-topology.ts +0 -279
  1280. package/packages/sdk/src/version.ts +0 -4
  1281. package/packages/sdk/tests/agent-registry.test.ts +0 -285
  1282. package/packages/sdk/tests/consensus.test.ts +0 -376
  1283. package/packages/sdk/tests/federation/audit.test.ts +0 -164
  1284. package/packages/sdk/tests/federation/budget.test.ts +0 -189
  1285. package/packages/sdk/tests/federation/envelope.test.ts +0 -120
  1286. package/packages/sdk/tests/federation/hmac.test.ts +0 -194
  1287. package/packages/sdk/tests/federation/orchestrator.test.ts +0 -176
  1288. package/packages/sdk/tests/federation/pii.test.ts +0 -106
  1289. package/packages/sdk/tests/federation/policy.test.ts +0 -140
  1290. package/packages/sdk/tests/federation/trust.test.ts +0 -124
  1291. package/packages/sdk/tests/mcp-tools.test.ts +0 -204
  1292. package/packages/sdk/tests/memory-distillation.test.mjs +0 -186
  1293. package/packages/sdk/tests/model-router.test.mjs +0 -108
  1294. package/packages/sdk/tests/q-learning-router.test.mjs +0 -100
  1295. package/packages/sdk/tests/router-orchestrator.test.mjs +0 -172
  1296. package/packages/sdk/tests/router.test.mjs +0 -91
  1297. package/packages/sdk/tests/sdk.test.mjs +0 -172
  1298. package/packages/sdk/tests/swarm-topology.test.ts +0 -258
  1299. package/packages/sdk/tsconfig.json +0 -25
  1300. /package/{.claude/worktrees/kanban-overhaul/bizar-dash/src/web/v8.html → bizar-dash/src/web/index.html} +0 -0
  1301. /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanCardBadges.tsx +0 -0
  1302. /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanEmptyColumn.tsx +0 -0
  1303. /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanProgress.tsx +0 -0
  1304. /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/KanbanToolbar.tsx +0 -0
  1305. /package/{.claude/worktrees/kanban-overhaul/bizar-dash → bizar-dash}/src/web/v8/ui/kanban/useKanbanSelection.ts +0 -0
  1306. /package/{.claude/worktrees/kanban-overhaul → plugins/bizar}/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoalsView-DZa_mGmh.js","sources":["../../src/web/v8/ui/goals/GoalCard.tsx","../../src/web/v8/ui/goals/GoalDetail.tsx","../../src/web/v8/views/Goals/GoalsView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Calendar, ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * GoalCard — long-horizon goal surface (PLAN.md: \"Goals page\").\n *\n * Goals are NOT kanban cards. They are intentional commitments tracked\n * over weeks/months. Each card shows: title, why (description), status,\n * progress, due, owner, key results count.\n */\n\nexport type GoalStatus = 'on-track' | 'at-risk' | 'off-track' | 'done';\n\nexport interface GoalCardProps {\n id: string;\n title: string;\n /** Why this goal matters (the \"because\"). */\n description?: string;\n status: GoalStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Due date label (e.g. \"Q3 2026\", \"Mar 31\"). */\n due?: string;\n /** Owner name (renders as Avatar when paired with avatarUrl). */\n ownerName?: string;\n ownerAvatarUrl?: string;\n /** Key results count + done count (e.g. \"3 / 5 key results\"). */\n keyResultsDone?: number;\n keyResultsTotal?: number;\n /** Optional badges row (priority, tags). */\n badges?: ReactNode;\n /** Click handler — opens the goal detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<GoalStatus, string> = {\n 'on-track': 'On track',\n 'at-risk': 'At risk',\n 'off-track': 'Off track',\n done: 'Done',\n};\n\nconst STATUS_TONE: Record<GoalStatus, 'success' | 'warning' | 'danger' | 'neutral'> = {\n 'on-track': 'success',\n 'at-risk': 'warning',\n 'off-track': 'danger',\n done: 'neutral',\n};\n\nexport function GoalCard(props: GoalCardProps) {\n const {\n title,\n description,\n status,\n progress,\n due,\n ownerName,\n ownerAvatarUrl,\n keyResultsDone,\n keyResultsTotal,\n badges,\n onOpen,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-goal-card', `v8-goal-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {title}\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg-muted)',\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n <div>\n <ProgressBar\n value={progress}\n tone={status === 'on-track' ? 'success' : status === 'at-risk' ? 'warning' : status === 'off-track' ? 'danger' : 'accent'}\n />\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontVariantNumeric: 'tabular-nums' }}>\n <span>{Math.round(progress * 100)}% complete</span>\n {keyResultsDone !== undefined && keyResultsTotal !== undefined && (\n <span>\n {keyResultsDone} / {keyResultsTotal} key results\n </span>\n )}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n {due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {due}\n </span>\n )}\n {ownerName !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span\n aria-hidden=\"true\"\n style={{\n width: 16,\n height: 16,\n borderRadius: 'var(--radius-pill)',\n background: ownerAvatarUrl !== undefined ? `url(${ownerAvatarUrl}) center/cover` : 'var(--accent)',\n display: 'inline-block',\n }}\n />\n {ownerName}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n {badges}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n <style>{`\n .v8-goal-card:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { useEffect, useState } from 'react';\nimport { Plus, Trash2, ExternalLink } from 'lucide-react';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\nimport { Input } from '../controls/Input.js';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../controls/Select.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Badge } from '../data/Badge.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal } from '../../data/types.js';\n\n/**\n * GoalDetail — Sprint S12. Right-side Drawer with editable\n * title / status / due / owner / key-results.\n *\n * Source-of-truth = `.bizar/PROGRESS.md` (per user direction). Each\n * edit PATCHes `/api/goals/:id` and the server re-broadcasts the\n * canonical state via `goals:change`.\n */\n\nconst STATUS_OPTIONS = [\n { value: 'on-track', label: 'On track' },\n { value: 'at-risk', label: 'At risk' },\n { value: 'off-track', label: 'Off track' },\n { value: 'blocked', label: 'Blocked' },\n { value: 'active', label: 'Active' },\n { value: 'done', label: 'Done' },\n];\n\nexport interface GoalDetailProps {\n goal: Goal;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function GoalDetail(props: GoalDetailProps): JSX.Element {\n const { goal, open, onOpenChange } = props;\n const [deleting, setDeleting] = useState<boolean>(false);\n\n const removeGoal = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete goal \"${goal.title}\"? This removes it from PROGRESS.md.`)\n : true;\n if (!ok) return;\n setDeleting(true);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'DELETE' });\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setDeleting(false);\n }\n };\n const [title, setTitle] = useState<string>(goal.title);\n const [status, setStatus] = useState<string>(goal.status);\n const [owner, setOwner] = useState<string>(goal.owner || '');\n const [due, setDue] = useState<string>(goal.due || '');\n const [newKr, setNewKr] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setTitle(goal.title);\n setStatus(goal.status);\n setOwner(goal.owner || '');\n setDue(goal.due || '');\n setMessage(null);\n setError(null);\n setNewKr('');\n }\n }, [open, goal]);\n\n const patch = async (body: Record<string, unknown>, label: string): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'PATCH', body });\n setMessage(`${label} saved.`);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (): void => {\n if (title.trim() && title !== goal.title) void patch({ title: title.trim() }, 'Title');\n };\n const saveStatus = (v: string): void => {\n setStatus(v);\n if (v !== goal.status) void patch({ status: v }, 'Status');\n };\n const saveOwner = (): void => {\n const v = owner.trim();\n if (v !== (goal.owner || '')) void patch({ owner: v }, 'Owner');\n };\n const saveDue = (): void => {\n const v = due.trim();\n if (v !== (goal.due || '')) void patch({ due: v }, 'Due');\n };\n\n const toggleKr = async (krId: string, current: boolean): Promise<void> => {\n setBusy(`kr-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'PATCH',\n body: { done: !current },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const addKr = async (): Promise<void> => {\n const v = newKr.trim();\n if (!v) return;\n setNewKr('');\n setBusy('add-kr');\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results`, {\n method: 'POST',\n body: { title: v },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const removeKr = async (krId: string): Promise<void> => {\n setBusy(`remove-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'DELETE',\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title=\"Edit goal\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Title\n </label>\n <Inline gap={2}>\n <Input\n id=\"goal-title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveTitle}\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"goal-status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Status\n </label>\n <Select value={status} onValueChange={saveStatus}>\n <SelectTrigger id=\"goal-status\" size=\"sm\" placeholder=\"Status\" />\n <SelectContent>\n {STATUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-owner\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Owner\n </label>\n <Input id=\"goal-owner\" value={owner} onChange={(e) => setOwner(e.target.value)} onBlur={saveOwner} disabled={busy !== null} />\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-due\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Due\n </label>\n <Input id=\"goal-due\" value={due} onChange={(e) => setDue(e.target.value)} onBlur={saveDue} placeholder=\"2026-09-30\" disabled={busy !== null} />\n </Stack>\n </Inline>\n\n <Stack gap={2}>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Key results</div>\n <Stack gap={1}>\n {goal.keyResults.length === 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>None yet.</div>\n )}\n {goal.keyResults.map((kr) => (\n <Inline key={kr.id} gap={2} align=\"center\">\n <input\n type=\"checkbox\"\n checked={kr.done}\n onChange={() => { void toggleKr(kr.id, kr.done); }}\n aria-label={`Toggle ${kr.title}`}\n disabled={busy !== null}\n />\n <span style={{ flex: 1, fontSize: 'var(--fs-13)', textDecoration: kr.done ? 'line-through' : 'none' }}>\n {kr.title}\n </span>\n {kr.assignee && <Badge tone=\"neutral\">{kr.assignee}</Badge>}\n {kr.taskId && (\n <Badge tone=\"info\" title={`Decomposed task: ${kr.taskId}`}>\n <ExternalLink size={10} aria-hidden style={{ marginRight: 4, verticalAlign: 'text-bottom' }} />\n task\n </Badge>\n )}\n <Button\n variant=\"ghost\"\n onClick={() => { void removeKr(kr.id); }}\n disabled={busy !== null}\n aria-label={`Remove ${kr.title}`}\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n <Inline gap={2}>\n <Input\n value={newKr}\n onChange={(e) => setNewKr(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void addKr(); } }}\n placeholder=\"Add key result…\"\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n <Button variant=\"secondary\" onClick={() => { void addKr(); }} disabled={!newKr.trim() || busy !== null}>\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n </Stack>\n\n <div style={{ borderTop: '1px solid var(--border)', paddingTop: 'var(--space-3)' }}>\n <Button\n variant=\"danger\"\n onClick={() => { void removeGoal(); }}\n disabled={deleting || busy !== null}\n >\n <Trash2 size={14} aria-hidden /> {deleting ? 'Deleting…' : 'Delete goal'}\n </Button>\n </div>\n\n {message !== null && (\n <div role=\"status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>{message}</div>\n )}\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n {busy !== null && <Skeleton style={{ height: 12 }} />}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}","import { useCallback, useEffect, useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { GoalCard, type GoalCardProps, type GoalStatus } from '../../ui/goals/GoalCard.js';\nimport { GoalDetail } from '../../ui/goals/GoalDetail.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal, WsMessage } from '../../data/types.js';\n\n/**\n * GoalsView — Sprint S10/S12. Pulls `/api/goals` (parsed PROGRESS.md).\n * Card click → `GoalDetail` Drawer (editable title / status / due /\n * owner / KR add/toggle/remove). \"+ New goal\" button creates a fresh\n * goal via `POST /api/goals`. Live updates via `goals:change`.\n */\n\nfunction goalToCard(g: Goal): GoalCardProps {\n return {\n id: g.id,\n title: g.title,\n description: g.description || '',\n status: g.status as GoalStatus,\n progress: g.progress,\n due: g.due,\n ownerName: g.owner,\n keyResultsDone: g.keyResults.filter((k) => k.done).length,\n keyResultsTotal: g.keyResults.length,\n };\n}\n\nexport function GoalsView(): JSX.Element {\n const goals = useFetch<{ goals?: Goal[]; count?: number }>('/api/goals');\n const [local, setLocal] = useState<Goal[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openGoalId, setOpenGoalId] = useState<string | null>(null);\n const [creating, setCreating] = useState<boolean>(false);\n const [decomposing, setDecomposing] = useState<string | null>(null);\n const [decomposeError, setDecomposeError] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<string>('all');\n // v9.1.1 — replace window.prompt/window.confirm with an inline Sheet\n // form for create + a per-card confirm row for delete. Same data\n // contract; better UX, accessible, no popup blockers.\n const [createDraft, setCreateDraft] = useState<{ title: string; description: string } | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const filteredGoals = statusFilter === 'all' ? local : local.filter((g) => g.status === statusFilter);\n\n const STATUS_FILTERS = ['all', 'active', 'on-track', 'at-risk', 'off-track', 'blocked', 'done'] as const;\n\n useEffect(() => {\n if (goals.data?.goals && !initialized) {\n setInitialized(true);\n setLocal(goals.data.goals);\n }\n }, [goals.data, initialized]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'goals:change') return;\n const g = (msg as Extract<WsMessage, { type: 'goals:change' }>).goal;\n if (!g) return;\n // Tombstone broadcast from the server after a DELETE — drop the card.\n if ('removed' in g && (g as { removed?: boolean }).removed) {\n setLocal((prev) => prev.filter((x) => x.id !== g.id));\n if (openGoalId === g.id) setOpenGoalId(null);\n return;\n }\n setLocal((prev) => {\n const idx = prev.findIndex((x) => x.id === g.id);\n if (idx === -1) return [...prev, g];\n const copy = prev.slice();\n copy[idx] = g;\n return copy;\n });\n }, [openGoalId]);\n useWsMessage('goals:change', onChange);\n useWsMessage('goals:removed', (msg) => {\n const id = (msg as Extract<WsMessage, { type: 'goals:removed' }>).id;\n setLocal((prev) => prev.filter((x) => x.id !== id));\n if (openGoalId === id) setOpenGoalId(null);\n });\n\n const createGoal = useCallback(async () => {\n // v9.1.1 — open the Sheet form. POST happens when the user clicks\n // Create inside the Sheet (see saveCreate below).\n setCreateDraft({ title: '', description: '' });\n }, []);\n\n const saveCreate = useCallback(async () => {\n if (!createDraft || !createDraft.title.trim()) return;\n setCreating(true);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goal?: Goal; id?: string }>('/api/goals', {\n method: 'POST',\n body: {\n title: createDraft.title.trim(),\n description: createDraft.description.trim() || undefined,\n status: 'active',\n },\n });\n if (res.goal) setLocal((prev) => [...prev, res.goal as Goal]);\n if (res.id) setOpenGoalId(res.id);\n setCreateDraft(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setCreating(false);\n }\n }, [createDraft]);\n\n const openGoal = openGoalId ? local.find((g) => g.id === openGoalId) ?? null : null;\n\n const decompose = useCallback(async (goalId: string) => {\n setDecomposing(goalId);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goalId: string; created: { kr: string; task: string }[] }>(\n `/api/goals/${encodeURIComponent(goalId)}/decompose`,\n { method: 'POST' },\n );\n // Patch local state with the new taskIds so the button reflects\n // \"Decomposed\" without waiting for the WS roundtrip.\n if (Array.isArray(res.created) && res.created.length > 0) {\n setLocal((prev) => prev.map((g) => {\n if (g.id !== goalId) return g;\n const krs = (g.keyResults ?? []).map((kr) => {\n const link = res.created.find((c) => c.kr === kr.id);\n return link ? { ...kr, taskId: link.task } : kr;\n });\n return { ...g, keyResults: krs };\n }));\n }\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setDecomposing(null);\n }\n }, []);\n\n const deleteGoal = useCallback(async (goalId: string) => {\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: 'DELETE' });\n // Server broadcasts goals:removed + goals:change tombstone; the\n // WS handler drops the card. Close the drawer if it was open.\n setLocal((prev) => prev.filter((x) => x.id !== goalId));\n if (openGoalId === goalId) setOpenGoalId(null);\n setConfirmDeleteId(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n }\n }, [openGoalId]);\n\n return (\n <Stack gap={5} data-testid=\"goals-view\">\n <ViewHeader\n title=\"Goals\"\n description=\"Long-horizon commitments parsed from .bizar/PROGRESS.md.\"\n actions={\n <Button variant=\"primary\" onClick={() => { void createGoal(); }} disabled={creating}>\n <Plus size={14} aria-hidden /> New goal\n </Button>\n }\n />\n <ListHeader\n title=\"All goals\"\n count={local.length}\n testid=\"goals-list-header\"\n filters={\n <Inline gap={1} wrap>\n {STATUS_FILTERS.map((s) => (\n <Chip key={s} selected={statusFilter === s} onClick={() => setStatusFilter(s)}>\n {s === 'all' ? 'All' : s.replace(/-/g, ' ')}\n {s !== 'all' && ` · ${local.filter((g) => g.status === s).length}`}\n </Chip>\n ))}\n </Inline>\n }\n />\n {decomposeError !== 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 Decompose failed: {decomposeError}\n </div>\n )}\n {goals.loading && local.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 160 }} />\n <Skeleton style={{ height: 160 }} />\n </Stack>\n ) : goals.error && local.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load goals\"\n description=\"The goals endpoint failed. Retry to refetch.\"\n error={goals.error}\n onRetry={() => void goals.refetch()}\n testid=\"goals-error\"\n />\n ) : filteredGoals.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={2}>\n <strong>No goals {statusFilter === 'all' ? 'yet' : `with status “${statusFilter}”`}.</strong>\n <span style={{ color: 'var(--fg-muted)' }}>\n Create one with the dashboard or via CC's <code>/goal &lt;text&gt;</code>.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Grid cols={2}>\n {filteredGoals.map((g) => {\n const krCount = g.keyResults?.length ?? 0;\n const decomposed = (g.keyResults ?? []).every((kr) => Boolean(kr.taskId));\n return (\n <div\n key={g.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpenGoalId(g.id)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenGoalId(g.id); } }}\n style={{ cursor: 'pointer', outline: 'none' }}\n data-testid={`goal-card-${g.id}`}\n >\n <Stack gap={2}>\n <GoalCard {...goalToCard(g)} />\n {confirmDeleteId === g.id ? (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Delete this goal and remove it from PROGRESS.md?\n </span>\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); void deleteGoal(g.id); }}\n data-testid={`goal-confirm-delete-${g.id}`}\n >\n Delete\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n >\n Cancel\n </Button>\n </Inline>\n ) : (\n <Inline align=\"center\" justify=\"end\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(g.id); }}\n title=\"Delete goal\"\n aria-label={`Delete goal ${g.title}`}\n data-testid={`goal-delete-${g.id}`}\n >\n <Trash2 size={12} aria-hidden /> Delete\n </Button>\n </Inline>\n )}\n {krCount > 0 && (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {decomposed ? 'Decomposed' : `${krCount} key result${krCount === 1 ? '' : 's'} · not yet linked`}\n </span>\n <Button\n variant=\"secondary\"\n onClick={(e) => { e.stopPropagation(); void decompose(g.id); }}\n disabled={decomposing === g.id}\n title={decomposed ? 'Re-create missing task links' : 'Create one task per key result'}\n >\n <Plus size={12} aria-hidden /> {decomposed ? 'Re-link tasks' : 'Decompose → Tasks'}\n </Button>\n </Inline>\n )}\n </Stack>\n </div>\n );\n })}\n </Grid>\n )}\n\n {openGoal && (\n <GoalDetail\n goal={openGoal}\n open={openGoalId !== null}\n onOpenChange={(o) => { if (!o) setOpenGoalId(null); }}\n />\n )}\n\n {/* v9.1.1 — create-goal Sheet form. Replaces window.prompt which\n blocked the user's \"professional and data-driven\" ask. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New goal\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</label>\n <Input\n id=\"goal-create-title\"\n value={createDraft.title}\n onChange={(e) => setCreateDraft({ ...createDraft, title: e.target.value })}\n placeholder=\"Ship the orchestration center\"\n disabled={creating}\n data-testid=\"goal-create-title\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-desc\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description (optional)</label>\n <Textarea\n id=\"goal-create-desc\"\n value={createDraft.description}\n onChange={(e) => setCreateDraft({ ...createDraft, description: e.target.value })}\n rows={4}\n placeholder=\"Why this goal exists and what 'done' looks like.\"\n disabled={creating}\n data-testid=\"goal-create-desc\"\n />\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveCreate(); }}\n disabled={creating || !createDraft.title.trim()}\n data-testid=\"goal-create-submit\"\n >\n Create goal\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","GoalCard","props","title","description","status","progress","due","ownerName","ownerAvatarUrl","keyResultsDone","keyResultsTotal","badges","onOpen","className","jsxs","cx","jsx","Badge","ProgressBar","Calendar","ChevronRight","STATUS_OPTIONS","GoalDetail","goal","open","onOpenChange","deleting","setDeleting","useState","removeGoal","fetchJson","err","setError","setTitle","setStatus","owner","setOwner","setDue","newKr","setNewKr","busy","setBusy","message","setMessage","error","useEffect","patch","body","label","saveTitle","saveStatus","v","saveOwner","saveDue","toggleKr","krId","current","addKr","removeKr","Sheet","SheetContent","Stack","Inline","Input","e","Select","SelectTrigger","SelectContent","opt","SelectItem","kr","ExternalLink","Button","Trash2","Plus","Skeleton","goalToCard","g","k","GoalsView","goals","useFetch","local","setLocal","initialized","setInitialized","openGoalId","setOpenGoalId","creating","setCreating","decomposing","setDecomposing","decomposeError","setDecomposeError","statusFilter","setStatusFilter","createDraft","setCreateDraft","confirmDeleteId","setConfirmDeleteId","filteredGoals","STATUS_FILTERS","_a","onChange","useCallback","msg","prev","x","idx","copy","useWsMessage","id","createGoal","saveCreate","res","openGoal","decompose","goalId","krs","link","c","deleteGoal","ViewHeader","ListHeader","Chip","ErrorState","Card","CardBody","Grid","krCount","decomposed","o","Textarea"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as w,j as A}from"./cmdk-DVxytz9i.js";import{g as T}from"./main-CdOm1Pj9.js";const a={0:"0",1:"var(--space-1)",2:"var(--space-2)",3:"var(--space-3)",4:"var(--space-4)",5:"var(--space-5)",6:"var(--space-6)",8:"var(--space-8)",10:"var(--space-10)",12:"var(--space-12)",16:"var(--space-16)"},p={1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"};function h(e){if(e===void 0)return{};if(typeof e=="number")return{gridTemplateColumns:p[e]};const r=e.base??1;return{gridTemplateColumns:p[r]}}const j={start:"start",center:"center",end:"end",stretch:"stretch"},R={start:"start",center:"center",end:"end",stretch:"stretch"},I=w.forwardRef(function(r,m){const{as:d,gap:f=4,rowGap:t,colGap:s,cols:v,rows:n,autoFlow:o,align:i,justify:c,children:l,className:u,style:x,...g}=r,y=d??"div",G={display:"grid",gap:a[f],...t!==void 0&&{rowGap:a[t]},...s!==void 0&&{columnGap:a[s]},...h(v),...n!==void 0&&{gridTemplateRows:`repeat(${n}, minmax(0, 1fr))`},...o!==void 0&&{gridAutoFlow:o},...i!==void 0&&{alignItems:j[i]},...c!==void 0&&{justifyItems:R[c]},...x};return A.jsx(y,{ref:m,className:T("v8-grid",u),style:G,...g,children:l})});export{I as G};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid-CiRyhAgR.js","sources":["../../src/web/v8/ui/primitives/Grid.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Grid — CSS grid wrapper with token-driven gap and template columns.\n *\n * For responsive grids: pass `cols` as an object { base, sm, md, lg }.\n * Otherwise pass a single number (1..12) for a uniform grid.\n */\nexport type GridCols =\n | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12\n | { base?: number; sm?: number; md?: number; lg?: number; xl?: number };\n\nexport interface GridProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n as?: ElementType;\n gap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n rowGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n colGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n cols?: GridCols;\n rows?: 1 | 2 | 3 | 4;\n autoFlow?: 'row' | 'column' | 'dense';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'stretch';\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SPACE_VAR: Record<NonNullable<GridProps['gap']>, string> = {\n 0: '0',\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n};\n\nconst COLS_VAR: Record<number, string> = {\n 1: 'repeat(1, minmax(0, 1fr))',\n 2: 'repeat(2, minmax(0, 1fr))',\n 3: 'repeat(3, minmax(0, 1fr))',\n 4: 'repeat(4, minmax(0, 1fr))',\n 5: 'repeat(5, minmax(0, 1fr))',\n 6: 'repeat(6, minmax(0, 1fr))',\n 8: 'repeat(8, minmax(0, 1fr))',\n 12: 'repeat(12, minmax(0, 1fr))',\n};\n\nfunction colsToStyle(cols: GridCols | undefined): CSSProperties {\n if (cols === undefined) return {};\n if (typeof cols === 'number') return { gridTemplateColumns: COLS_VAR[cols] };\n // Responsive object — apply base as the default gridTemplateColumns; the\n // breakpoint variants should be handled by the parent component or a\n // generated class. We export the base here; responsive overrides can\n // compose via additional style overrides at the call site.\n const base = cols.base ?? 1;\n return { gridTemplateColumns: COLS_VAR[base] };\n}\n\nconst ALIGN_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\nconst JUSTIFY_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\n\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(props, ref) {\n const {\n as,\n gap = 4,\n rowGap,\n colGap,\n cols,\n rows,\n autoFlow,\n align,\n justify,\n children,\n className,\n style,\n ...rest\n } = props;\n\n const Tag = (as ?? 'div') as ElementType;\n const computedStyle: CSSProperties = {\n display: 'grid',\n gap: SPACE_VAR[gap],\n ...(rowGap !== undefined && { rowGap: SPACE_VAR[rowGap] }),\n ...(colGap !== undefined && { columnGap: SPACE_VAR[colGap] }),\n ...colsToStyle(cols),\n ...(rows !== undefined && { gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }),\n ...(autoFlow !== undefined && { gridAutoFlow: autoFlow }),\n ...(align !== undefined && { alignItems: ALIGN_MAP[align] }),\n ...(justify !== undefined && { justifyItems: JUSTIFY_MAP[justify] }),\n ...style,\n };\n\n return (\n <Tag ref={ref} className={cx('v8-grid', className)} style={computedStyle} {...rest}>\n {children}\n </Tag>\n );\n});"],"names":["SPACE_VAR","COLS_VAR","colsToStyle","cols","base","ALIGN_MAP","JUSTIFY_MAP","Grid","forwardRef","props","ref","as","gap","rowGap","colGap","rows","autoFlow","align","justify","children","className","style","rest","Tag","computedStyle","jsx","cx"],"mappings":"qFA4BA,MAAMA,EAA2D,CAC/D,EAAG,IACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,GAAI,kBACJ,GAAI,kBACJ,GAAI,iBACN,EAEMC,EAAmC,CACvC,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,4BACN,EAEA,SAASC,EAAYC,EAA2C,CAC9D,GAAIA,IAAS,OAAW,MAAO,CAAA,EAC/B,GAAI,OAAOA,GAAS,SAAU,MAAO,CAAE,oBAAqBF,EAASE,CAAI,CAAA,EAKzE,MAAMC,EAAOD,EAAK,MAAQ,EAC1B,MAAO,CAAE,oBAAqBF,EAASG,CAAI,CAAA,CAC7C,CAEA,MAAMC,EAAY,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EACrEC,EAAc,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EAEhEC,EAAOC,EAAAA,WAAmC,SAAcC,EAAOC,EAAK,CAC/E,KAAM,CACJ,GAAAC,EACA,IAAAC,EAAM,EACN,OAAAC,EACA,OAAAC,EACA,KAAAX,EACA,KAAAY,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDb,EAEEc,EAAOZ,GAAM,MACba,EAA+B,CACnC,QAAS,OACT,IAAKxB,EAAUY,CAAG,EAClB,GAAIC,IAAW,QAAa,CAAE,OAAQb,EAAUa,CAAM,CAAA,EACtD,GAAIC,IAAW,QAAa,CAAE,UAAWd,EAAUc,CAAM,CAAA,EACzD,GAAGZ,EAAYC,CAAI,EACnB,GAAIY,IAAS,QAAa,CAAE,iBAAkB,UAAUA,CAAI,mBAAA,EAC5D,GAAIC,IAAa,QAAa,CAAE,aAAcA,CAAA,EAC9C,GAAIC,IAAU,QAAa,CAAE,WAAYZ,EAAUY,CAAK,CAAA,EACxD,GAAIC,IAAY,QAAa,CAAE,aAAcZ,EAAYY,CAAO,CAAA,EAChE,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAACF,EAAA,CAAI,IAAAb,EAAU,UAAWgB,EAAG,UAAWN,CAAS,EAAG,MAAOI,EAAgB,GAAGF,EAC3E,SAAAH,CAAA,CACH,CAEJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import{r as g,j as a}from"./cmdk-DVxytz9i.js";import{c as C,u as k,S as o,I as m,d as l,h as T,N as B,B as z,i as d,F as c}from"./main-CdOm1Pj9.js";import{G as E}from"./Grid-CiRyhAgR.js";import{V as O}from"./ViewHeader-BqIPVKuG.js";import{C as f,b as u}from"./Card-Tyboihu7.js";import{R as q}from"./refresh-cw-1RBqDKgJ.js";import{P as H}from"./plug-Cmv0-T_e.js";import{P as M}from"./play-CawUZ02_.js";import{R as U}from"./rotate-cw-DHooc0Tx.js";/**
2
+ * @license lucide-react v0.460.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const L=C("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/**
7
+ * @license lucide-react v0.460.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const V=C("Unplug",[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]]);function X(){var v,j,w,S;const s=k("/api/headroom/status"),h=k("/api/headroom/stats?hours=24"),[r,n]=g.useState(null),[x,i]=g.useState(null);g.useEffect(()=>{const t=setInterval(()=>{s.refetch()},15e3);return()=>clearInterval(t)},[s]);const b=async()=>{n("install"),i(null);try{await d("/api/headroom/install",{method:"POST",body:{force:!1}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},I=async()=>{n("wrap"),i(null);try{await d("/api/headroom/wrap",{method:"POST",body:{port:8787}}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},P=async()=>{n("unwrap"),i(null);try{await d("/api/headroom/unwrap",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},R=async()=>{n("start"),i(null);try{await d("/api/headroom/start",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},F=async()=>{n("stop"),i(null);try{await d("/api/headroom/stop",{method:"POST"}),s.refetch()}catch(t){i((t instanceof c,t.message))}finally{n(null)}},e=s.data,y=e&&e.status!=="not-installed",p=(e==null?void 0:e.status)==="running";return a.jsxs(o,{gap:5,"data-testid":"headroom-view",children:[a.jsx(O,{title:"Headroom",description:"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.",actions:a.jsxs(m,{gap:2,align:"center",children:[x!==null&&a.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),a.jsxs(l,{variant:"ghost",onClick:()=>{s.refetch()},"data-testid":"headroom-refresh",children:[a.jsx(q,{size:14,"aria-hidden":!0})," Refresh"]})]})}),a.jsx(f,{variant:"elevated",children:a.jsx(u,{children:s.loading&&!e?a.jsx(T,{style:{height:60}}):a.jsxs(m,{align:"center",justify:"between",gap:3,children:[a.jsxs(o,{gap:1,children:[a.jsxs(m,{align:"center",gap:2,children:[a.jsx(B,{size:16,"aria-hidden":!0}),a.jsx("strong",{children:(e==null?void 0:e.status)??"unknown"}),(e==null?void 0:e.version)&&a.jsxs(z,{tone:"neutral",children:["v",e.version]}),(e==null?void 0:e.port)&&a.jsxs(z,{tone:"info",children:["port ",e.port]})]}),(e==null?void 0:e.message)&&a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:e.message})]}),a.jsxs(m,{gap:1,wrap:!0,children:[!y&&a.jsxs(l,{variant:"primary",onClick:()=>void b(),disabled:r==="install","data-testid":"headroom-install",children:[a.jsx(H,{size:12,"aria-hidden":!0})," ",r==="install"?"Installing…":"Install"]}),y&&a.jsxs(a.Fragment,{children:[a.jsxs(l,{variant:p?"secondary":"primary",onClick:()=>void(p?F():R()),disabled:r==="start"||r==="stop","data-testid":"headroom-toggle-running",children:[p?a.jsx(L,{size:12,"aria-hidden":!0}):a.jsx(M,{size:12,"aria-hidden":!0}),p?r==="stop"?"Stopping…":"Stop":r==="start"?"Starting…":"Start"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void I(),disabled:r==="wrap","data-testid":"headroom-wrap",children:[a.jsx(U,{size:12,"aria-hidden":!0})," ",r==="wrap"?"Wrapping…":"Wrap Cline"]}),a.jsxs(l,{variant:"ghost",onClick:()=>void P(),disabled:r==="unwrap","data-testid":"headroom-unwrap",children:[a.jsx(V,{size:12,"aria-hidden":!0})," ",r==="unwrap"?"Unwrapping…":"Unwrap"]})]})]})]})})}),a.jsxs(E,{cols:3,children:[a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Requests (24h)"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((v=h.data)==null?void 0:v.requests)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Tokens saved"}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:((j=h.data)==null?void 0:j.tokensSaved)??0})]})})}),a.jsx(f,{variant:"default",children:a.jsx(u,{children:a.jsxs(o,{gap:1,children:[a.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Cache hits / misses"}),a.jsxs("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-18)"},children:[((w=h.data)==null?void 0:w.cacheHits)??0," / ",((S=h.data)==null?void 0:S.cacheMisses)??0]})]})})})]})]})}export{X as HeadroomView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadroomView-CNc-TI7u.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/square.js","../../../node_modules/lucide-react/dist/esm/icons/unplug.js","../../src/web/v8/views/Headroom/HeadroomView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Square = createLucideIcon(\"Square\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n]);\n\nexport { Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Unplug = createLucideIcon(\"Unplug\", [\n [\"path\", { d: \"m19 5 3-3\", key: \"yk6iyv\" }],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\n \"path\",\n { d: \"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z\", key: \"1snsnr\" }\n ]\n]);\n\nexport { Unplug as default };\n//# sourceMappingURL=unplug.js.map\n","import { useEffect, useState } from 'react';\nimport { Network, Play, Square, Plug, Unplug, RotateCw, RefreshCw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * HeadroomView — Sprint S35. Headroom proxy install + lifecycle.\n */\n\ntype Status = 'installed' | 'not-installed' | 'running' | 'stopped';\n\ninterface HeadroomStatus {\n status: Status;\n version?: string;\n port?: number;\n message?: string;\n}\n\ninterface HeadroomStats {\n hours?: number;\n requests?: number;\n tokensSaved?: number;\n cacheHits?: number;\n cacheMisses?: number;\n}\n\nexport function HeadroomView(): JSX.Element {\n const status = useFetch<HeadroomStatus>('/api/headroom/status');\n const stats = useFetch<HeadroomStats>('/api/headroom/stats?hours=24');\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const id = setInterval(() => { void status.refetch(); }, 15_000);\n return () => clearInterval(id);\n }, [status]);\n\n const install = async (): Promise<void> => {\n setBusy('install');\n setError(null);\n try {\n await fetchJson('/api/headroom/install', { method: 'POST', body: { force: false } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const wrap = async (): Promise<void> => {\n setBusy('wrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/wrap', { method: 'POST', body: { port: 8787 } });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const unwrap = async (): Promise<void> => {\n setBusy('unwrap');\n setError(null);\n try {\n await fetchJson('/api/headroom/unwrap', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const start = async (): Promise<void> => {\n setBusy('start');\n setError(null);\n try {\n await fetchJson('/api/headroom/start', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const stop = async (): Promise<void> => {\n setBusy('stop');\n setError(null);\n try {\n await fetchJson('/api/headroom/stop', { method: 'POST' });\n void status.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const s = status.data;\n const isInstalled = s && s.status !== 'not-installed';\n const isRunning = s?.status === 'running';\n\n return (\n <Stack gap={5} data-testid=\"headroom-view\">\n <ViewHeader\n title=\"Headroom\"\n description=\"Local proxy that reduces token cost via caching + batching. Install, wrap Cline, start/stop.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => { void status.refetch(); }} data-testid=\"headroom-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"elevated\">\n <CardBody>\n {status.loading && !s ? (\n <Skeleton style={{ height: 60 }} />\n ) : (\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <Network size={16} aria-hidden />\n <strong>{s?.status ?? 'unknown'}</strong>\n {s?.version && <Badge tone=\"neutral\">v{s.version}</Badge>}\n {s?.port && <Badge tone=\"info\">port {s.port}</Badge>}\n </Inline>\n {s?.message && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.message}</span>}\n </Stack>\n <Inline gap={1} wrap={true}>\n {!isInstalled && (\n <Button variant=\"primary\" onClick={() => void install()} disabled={busy === 'install'} data-testid=\"headroom-install\">\n <Plug size={12} aria-hidden /> {busy === 'install' ? 'Installing…' : 'Install'}\n </Button>\n )}\n {isInstalled && (\n <>\n <Button variant={isRunning ? 'secondary' : 'primary'} onClick={() => void (isRunning ? stop() : start())} disabled={busy === 'start' || busy === 'stop'} data-testid=\"headroom-toggle-running\">\n {isRunning ? <Square size={12} aria-hidden /> : <Play size={12} aria-hidden />}\n {isRunning ? (busy === 'stop' ? 'Stopping…' : 'Stop') : (busy === 'start' ? 'Starting…' : 'Start')}\n </Button>\n <Button variant=\"ghost\" onClick={() => void wrap()} disabled={busy === 'wrap'} data-testid=\"headroom-wrap\">\n <RotateCw size={12} aria-hidden /> {busy === 'wrap' ? 'Wrapping…' : 'Wrap Cline'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void unwrap()} disabled={busy === 'unwrap'} data-testid=\"headroom-unwrap\">\n <Unplug size={12} aria-hidden /> {busy === 'unwrap' ? 'Unwrapping…' : 'Unwrap'}\n </Button>\n </>\n )}\n </Inline>\n </Inline>\n )}\n </CardBody>\n </Card>\n\n <Grid cols={3}>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Requests (24h)</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.requests ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Tokens saved</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>{stats.data?.tokensSaved ?? 0}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Cache hits / misses</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-18)' }}>\n {stats.data?.cacheHits ?? 0} / {stats.data?.cacheMisses ?? 0}\n </strong>\n </Stack>\n </CardBody>\n </Card>\n </Grid>\n </Stack>\n );\n}"],"names":["Square","createLucideIcon","Unplug","HeadroomView","status","useFetch","stats","busy","setBusy","useState","error","setError","useEffect","id","install","fetchJson","err","FetchError","wrap","unwrap","start","stop","s","isInstalled","isRunning","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Card","CardBody","Skeleton","Network","Badge","Plug","Fragment","Play","RotateCw","Grid","_a","_b","_c","_d"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1 @@
1
+ import{r as a,j as e}from"./cmdk-DVxytz9i.js";import{u as x,a as y,S as f,d as g,I as v,h,Q as b,B as k}from"./main-CdOm1Pj9.js";import{V as w}from"./ViewHeader-BqIPVKuG.js";import{C,b as S}from"./Card-Tyboihu7.js";import{E as F}from"./EmptyState-DZ2ouKwd.js";import{E as M}from"./ErrorState-DwwJ2-Jq.js";import{R}from"./refresh-ccw-CHMprsm5.js";import"./Alert-DN0UysMg.js";import"./circle-alert-BsLl001l.js";import"./triangle-alert-BPLb7uLt.js";import"./circle-check-rVKMQmZp.js";function E(i){if(!i)return"";const r=new Date(i).getTime();if(!Number.isFinite(r))return"";const s=Math.max(0,Date.now()-r);return s<6e4?"just now":s<36e5?`${Math.round(s/6e4)}m ago`:s<864e5?`${Math.round(s/36e5)}h ago`:new Date(r).toLocaleString()}function K(){const i=x("/api/history"),[r,s]=a.useState(null),[o,p]=a.useState(null),c=a.useCallback(()=>{i.refetch()},[i]);y("history:new",c);const l=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.events)??[]},[i.data]),m=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.projects)??[]},[i.data]),u=a.useMemo(()=>{const t=new Set;for(const n of l)n.kind&&t.add(n.kind);return Array.from(t).sort()},[l]);a.useEffect(()=>{r!==null&&!u.includes(r)&&s(null)},[u,r]);const j=a.useMemo(()=>l.filter(t=>!(r!==null&&t.kind!==r||o!==null&&t.project!==o)),[l,r,o]);return e.jsxs(f,{gap:4,"data-testid":"history-view",children:[e.jsx(w,{title:"History",description:"Cross-project activity timeline. Filter by kind or project. Live updates on new events.",actions:e.jsxs(g,{variant:"ghost",onClick:()=>void c(),"data-testid":"history-refresh",children:[e.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]})}),e.jsxs(v,{gap:2,wrap:!0,children:[e.jsx(d,{label:"All kinds",active:r===null,onClick:()=>s(null),testid:"history-filter-kind-all"}),u.map(t=>e.jsx(d,{label:t,active:r===t,onClick:()=>s(n=>n===t?null:t),testid:`history-filter-kind-${t}`},t)),m.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,alignSelf:"stretch",background:"var(--border)"},"aria-hidden":!0}),e.jsx(d,{label:"All projects",active:o===null,onClick:()=>p(null),testid:"history-filter-project-all"}),m.map(t=>e.jsx(d,{label:t.name||t.id,active:o===t.id,onClick:()=>p(n=>n===t.id?null:t.id),testid:`history-filter-project-${t.id}`},t.id))]})]}),e.jsx(C,{variant:"default",children:e.jsx(S,{children:i.loading&&l.length===0?e.jsxs(f,{gap:2,children:[e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}})]}):i.error&&l.length===0?e.jsx(M,{block:!0,title:"Couldn't load history",description:"The timeline endpoint failed. Retry to refetch.",error:i.error,onRetry:c,testid:"history-error"}):j.length===0?e.jsx(F,{icon:e.jsx(b,{size:28,"aria-hidden":!0}),title:"No events",description:r||o?"No events match the current filter.":"No activity yet."}):e.jsx(f,{gap:1,children:j.map((t,n)=>e.jsxs("div",{"data-testid":`history-row-${n}`,style:{display:"grid",gridTemplateColumns:"120px 1fr",gap:"var(--space-3)",padding:"var(--space-2)",borderBottom:"1px solid var(--border)"},children:[e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:E(t.ts)}),e.jsxs(v,{align:"center",gap:2,wrap:!0,children:[t.kind&&e.jsx(k,{tone:"info",size:"sm",children:t.kind}),e.jsx("span",{children:t.title||t.description||t.id||"event"}),t.project&&e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["· ",t.project]})]})]},t.id??`${t.ts}-${n}`))})})})]})}function d({label:i,active:r,onClick:s,testid:o}){return e.jsx("button",{type:"button",onClick:s,"data-testid":o,style:{padding:"var(--space-1) var(--space-3)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)",background:r?"color-mix(in oklch, var(--accent) 18%, transparent)":"var(--surface-0)",color:r?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:i})}export{K as HistoryView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryView-Dv7aPxJE.js","sources":["../../src/web/v8/views/History/HistoryView.tsx"],"sourcesContent":["/**\n * v8/views/History/HistoryView.tsx — Sprint S40, v9.3.0.\n *\n * Cross-project timeline surface. Pulls from /api/history and shows\n * a list of recent events grouped per project. Filter chips along\n * the top let the user narrow by kind. Live updates on the\n * `history:new` WS event the server broadcasts.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { History, RefreshCcw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\n\ninterface HistoryProject {\n id: string;\n name?: string;\n path?: string;\n active?: boolean;\n tasks?: { total: number; done: number; doing: number; blocked: number; queued: number };\n plans?: number;\n}\n\ninterface HistoryEventRow {\n id?: string;\n ts?: string;\n kind?: string;\n project?: string;\n agent?: string;\n title?: string;\n description?: string;\n}\n\ninterface HistoryPayload {\n events: HistoryEventRow[];\n projects: HistoryProject[];\n stats?: Record<string, unknown>;\n generatedAt?: string;\n}\n\nfunction fmtRel(ts: string | undefined): string {\n if (!ts) return '';\n const t = new Date(ts).getTime();\n if (!Number.isFinite(t)) return '';\n const delta = Math.max(0, Date.now() - t);\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.round(delta / 60_000)}m ago`;\n if (delta < 86_400_000) return `${Math.round(delta / 3_600_000)}h ago`;\n return new Date(t).toLocaleString();\n}\n\nexport function HistoryView(): JSX.Element {\n const payload = useFetch<HistoryPayload>('/api/history');\n const [kindFilter, setKindFilter] = useState<string | null>(null);\n const [projectFilter, setProjectFilter] = useState<string | null>(null);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n useWsMessage('history:new', refresh);\n\n const events = useMemo(() => payload.data?.events ?? [], [payload.data]);\n const projects = useMemo(() => payload.data?.projects ?? [], [payload.data]);\n const kinds = useMemo(() => {\n const set = new Set<string>();\n for (const e of events) if (e.kind) set.add(e.kind);\n return Array.from(set).sort();\n }, [events]);\n\n useEffect(() => {\n if (kindFilter !== null && !kinds.includes(kindFilter)) setKindFilter(null);\n }, [kinds, kindFilter]);\n\n const filtered = useMemo(() => {\n return events.filter((e) => {\n if (kindFilter !== null && e.kind !== kindFilter) return false;\n if (projectFilter !== null && e.project !== projectFilter) return false;\n return true;\n });\n }, [events, kindFilter, projectFilter]);\n\n return (\n <Stack gap={4} data-testid=\"history-view\">\n <ViewHeader\n title=\"History\"\n description=\"Cross-project activity timeline. Filter by kind or project. Live updates on new events.\"\n actions={\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"history-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n }\n />\n\n <Inline gap={2} wrap>\n <FilterChip\n label=\"All kinds\"\n active={kindFilter === null}\n onClick={() => setKindFilter(null)}\n testid=\"history-filter-kind-all\"\n />\n {kinds.map((k) => (\n <FilterChip\n key={k}\n label={k}\n active={kindFilter === k}\n onClick={() => setKindFilter((cur) => (cur === k ? null : k))}\n testid={`history-filter-kind-${k}`}\n />\n ))}\n {projects.length > 0 && (\n <>\n <span style={{ width: 1, alignSelf: 'stretch', background: 'var(--border)' }} aria-hidden />\n <FilterChip\n label=\"All projects\"\n active={projectFilter === null}\n onClick={() => setProjectFilter(null)}\n testid=\"history-filter-project-all\"\n />\n {projects.map((p) => (\n <FilterChip\n key={p.id}\n label={p.name || p.id}\n active={projectFilter === p.id}\n onClick={() => setProjectFilter((cur) => (cur === p.id ? null : p.id))}\n testid={`history-filter-project-${p.id}`}\n />\n ))}\n </>\n )}\n </Inline>\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && events.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : payload.error && events.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load history\"\n description=\"The timeline endpoint failed. Retry to refetch.\"\n error={payload.error}\n onRetry={refresh}\n testid=\"history-error\"\n />\n ) : filtered.length === 0 ? (\n <EmptyState\n icon={<History size={28} aria-hidden />}\n title=\"No events\"\n description={kindFilter || projectFilter ? 'No events match the current filter.' : 'No activity yet.'}\n />\n ) : (\n <Stack gap={1}>\n {filtered.map((e, idx) => (\n <div\n key={e.id ?? `${e.ts}-${idx}`}\n data-testid={`history-row-${idx}`}\n style={{\n display: 'grid',\n gridTemplateColumns: '120px 1fr',\n gap: 'var(--space-3)',\n padding: 'var(--space-2)',\n borderBottom: '1px solid var(--border)',\n }}\n >\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {fmtRel(e.ts)}\n </span>\n <Inline align=\"center\" gap={2} wrap>\n {e.kind && <Badge tone=\"info\" size=\"sm\">{e.kind}</Badge>}\n <span>{e.title || e.description || e.id || 'event'}</span>\n {e.project && (\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n · {e.project}\n </span>\n )}\n </Inline>\n </div>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nfunction FilterChip({\n label,\n active,\n onClick,\n testid,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n testid: string;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testid}\n style={{\n padding: 'var(--space-1) var(--space-3)',\n borderRadius: 'var(--radius-pill)',\n border: '1px solid var(--border)',\n background: active ? 'color-mix(in oklch, var(--accent) 18%, transparent)' : 'var(--surface-0)',\n color: active ? 'var(--accent)' : 'var(--fg-muted)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n }}\n >\n {label}\n </button>\n );\n}"],"names":["fmtRel","ts","t","delta","HistoryView","payload","useFetch","kindFilter","setKindFilter","useState","projectFilter","setProjectFilter","refresh","useCallback","useWsMessage","events","useMemo","_a","projects","kinds","set","e","useEffect","filtered","jsxs","Stack","jsx","ViewHeader","Button","RefreshCcw","Inline","FilterChip","k","cur","Fragment","p","Card","CardBody","Skeleton","ErrorState","EmptyState","History","idx","Badge","label","active","onClick","testid"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as c,j as s}from"./cmdk-DVxytz9i.js";import{g as x}from"./main-CdOm1Pj9.js";const h={sm:{h:28,fs:"var(--fs-12)",px:10},md:{h:32,fs:"var(--fs-13)",px:12},lg:{h:40,fs:"var(--fs-14)",px:14}},y=c.forwardRef(function(o,n){const{size:l="md",variant:r="default",invalid:a,leftAddon:t,rightAddon:d,disabled:i,className:p,style:f,...u}=o,e=h[l],v={display:"inline-flex",alignItems:"center",gap:"var(--space-2)",width:"100%",height:e.h,paddingLeft:r==="flushed"?0:e.px,paddingRight:r==="flushed"?0:e.px,background:r==="filled"?"var(--surface-2)":r==="flushed"?"transparent":"var(--input-bg)",border:r==="flushed"?"none":"1px solid",borderBottom:r==="flushed"?"1px solid var(--border)":void 0,borderColor:a===!0?"var(--danger)":"var(--border)",borderRadius:r==="flushed"?0:"var(--radius-sm)",opacity:i===!0?.55:1,transition:"border-color var(--motion-fast) var(--ease-out)",...f};return s.jsxs("div",{className:x("v8-input-wrap",p),style:v,children:[t!==void 0&&s.jsx("span",{style:{color:"var(--fg-muted)",display:"inline-flex"},children:t}),s.jsx("input",{ref:n,disabled:i,"aria-invalid":a===!0?"true":void 0,className:"v8-input",style:{flex:1,minWidth:0,background:"transparent",border:0,outline:0,fontSize:e.fs,color:"var(--fg)"},...u}),d!==void 0&&s.jsx("span",{style:{color:"var(--fg-muted)",display:"inline-flex"},children:d})]})});export{y as I};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input-BbFUDQnS.js","sources":["../../src/web/v8/ui/controls/Input.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Input — single-line text input.\n *\n * Variants:\n * - default: bordered, surface-1 background\n * - filled: surface-2 background, no visible border until focus\n * - flushed: no border except a bottom rule (used inside cards/forms)\n *\n * Pair with <Field> for label + hint + error.\n */\nexport type InputSize = 'sm' | 'md' | 'lg';\nexport type InputVariant = 'default' | 'filled' | 'flushed';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n size?: InputSize;\n variant?: InputVariant;\n invalid?: boolean;\n leftAddon?: ReactNode;\n rightAddon?: ReactNode;\n}\n\nconst SIZE: Record<InputSize, { h: number; fs: string; px: number }> = {\n sm: { h: 28, fs: 'var(--fs-12)', px: 10 },\n md: { h: 32, fs: 'var(--fs-13)', px: 12 },\n lg: { h: 40, fs: 'var(--fs-14)', px: 14 },\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(props, ref) {\n const {\n size = 'md',\n variant = 'default',\n invalid,\n leftAddon,\n rightAddon,\n disabled,\n className,\n style,\n ...rest\n } = props;\n const sz = SIZE[size];\n\n const wrapperStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n width: '100%',\n height: sz.h,\n paddingLeft: variant === 'flushed' ? 0 : sz.px,\n paddingRight: variant === 'flushed' ? 0 : sz.px,\n background:\n variant === 'filled'\n ? 'var(--surface-2)'\n : variant === 'flushed'\n ? 'transparent'\n : 'var(--input-bg)',\n border: variant === 'flushed' ? 'none' : '1px solid',\n borderBottom: variant === 'flushed' ? '1px solid var(--border)' : undefined,\n borderColor: invalid === true ? 'var(--danger)' : 'var(--border)',\n borderRadius: variant === 'flushed' ? 0 : 'var(--radius-sm)',\n opacity: disabled === true ? 0.55 : 1,\n transition: 'border-color var(--motion-fast) var(--ease-out)',\n ...style,\n } as const;\n\n return (\n <div className={cx('v8-input-wrap', className)} style={wrapperStyle}>\n {leftAddon !== undefined && (\n <span style={{ color: 'var(--fg-muted)', display: 'inline-flex' }}>{leftAddon}</span>\n )}\n <input\n ref={ref}\n disabled={disabled}\n aria-invalid={invalid === true ? 'true' : undefined}\n className=\"v8-input\"\n style={{\n flex: 1,\n minWidth: 0,\n background: 'transparent',\n border: 0,\n outline: 0,\n fontSize: sz.fs,\n color: 'var(--fg)',\n }}\n {...rest}\n />\n {rightAddon !== undefined && (\n <span style={{ color: 'var(--fg-muted)', display: 'inline-flex' }}>{rightAddon}</span>\n )}\n </div>\n );\n});"],"names":["SIZE","Input","forwardRef","props","ref","size","variant","invalid","leftAddon","rightAddon","disabled","className","style","rest","sz","wrapperStyle","jsxs","cx","jsx"],"mappings":"qFAwBA,MAAMA,EAAiE,CACrE,GAAI,CAAE,EAAG,GAAI,GAAI,eAAgB,GAAI,EAAA,EACrC,GAAI,CAAE,EAAG,GAAI,GAAI,eAAgB,GAAI,EAAA,EACrC,GAAI,CAAE,EAAG,GAAI,GAAI,eAAgB,GAAI,EAAA,CACvC,EAEaC,EAAQC,EAAAA,WAAyC,SAAeC,EAAOC,EAAK,CACvF,KAAM,CACJ,KAAAC,EAAO,KACP,QAAAC,EAAU,UACV,QAAAC,EACA,UAAAC,EACA,WAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDV,EACEW,EAAKd,EAAKK,CAAI,EAEdU,EAAe,CACnB,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,MAAO,OACP,OAAQD,EAAG,EACX,YAAaR,IAAY,UAAY,EAAIQ,EAAG,GAC5C,aAAcR,IAAY,UAAY,EAAIQ,EAAG,GAC7C,WACER,IAAY,SACR,mBACAA,IAAY,UACV,cACA,kBACR,OAAQA,IAAY,UAAY,OAAS,YACzC,aAAcA,IAAY,UAAY,0BAA4B,OAClE,YAAaC,IAAY,GAAO,gBAAkB,gBAClD,aAAcD,IAAY,UAAY,EAAI,mBAC1C,QAASI,IAAa,GAAO,IAAO,EACpC,WAAY,kDACZ,GAAGE,CAAA,EAGL,OACEI,OAAC,OAAI,UAAWC,EAAG,gBAAiBN,CAAS,EAAG,MAAOI,EACpD,SAAA,CAAAP,IAAc,QACbU,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO,kBAAmB,QAAS,aAAA,EAAkB,SAAAV,CAAA,CAAU,EAEhFU,EAAAA,IAAC,QAAA,CACC,IAAAd,EACA,SAAAM,EACA,eAAcH,IAAY,GAAO,OAAS,OAC1C,UAAU,WACV,MAAO,CACL,KAAM,EACN,SAAU,EACV,WAAY,cACZ,OAAQ,EACR,QAAS,EACT,SAAUO,EAAG,GACb,MAAO,WAAA,EAER,GAAGD,CAAA,CAAA,EAELJ,IAAe,QACdS,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO,kBAAmB,QAAS,eAAkB,SAAAT,CAAA,CAAW,CAAA,EAEnF,CAEJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import{j as e,r as m}from"./cmdk-DVxytz9i.js";import{B as v,g,u as f,a as x,S as b,h as k}from"./main-CdOm1Pj9.js";import{C as y,V as j}from"./ViewHeader-BqIPVKuG.js";import"./Grid-CiRyhAgR.js";import"./AgentActivity-lSPkOr-O.js";import"./Input-BbFUDQnS.js";import"./Textarea-qYDf3yds.js";import"./Switch-BItGrPqr.js";import"./Select-Cw7Qtz2M.js";import"./Slider-DXbJuQ7y.js";import"./Alert-DN0UysMg.js";import"./Avatar-DZPv9pvd.js";import{E as S}from"./EmptyState-DZ2ouKwd.js";import"./Sheet-DH-WNJ3Y.js";import"./Card-Tyboihu7.js";import"./Chip-BrXIlR9w.js";import"./ActivityFeed-Da-JCrE6.js";import"./Sparkline-CYtAn82j.js";import"./ProgressBar-B-h60LKA.js";import{P as E}from"./power-DP5x_SRF.js";import"./SettingsRow-DgsgbPSI.js";import"./MessageBubble-5vUAquDx.js";import{E as T}from"./ErrorState-DwwJ2-Jq.js";import"./dnd-kit-DrHErSkw.js";import"./plus-M6LYiKX8.js";import"./calendar-DsHTZoCU.js";import"./index-CASP1n-5.js";import"./index-C4Vq_2LM.js";import"./circle-alert-BsLl001l.js";import"./triangle-alert-BPLb7uLt.js";import"./circle-check-rVKMQmZp.js";import"./trending-up-CSJJhWTS.js";import"./refresh-ccw-CHMprsm5.js";const C={enabled:"Enabled",disabled:"Disabled",error:"Error"},N={enabled:"success",disabled:"neutral",error:"danger"};function I(s){const{name:t,slug:i,status:r,description:o,meta:l,actions:p,onOpen:c,className:n}=s;return e.jsxs("button",{type:"button",onClick:c,className:g("v8-library-item",`v8-library-item--${r}`,n),style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",width:"100%",padding:"var(--space-3) var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius)",textAlign:"left",cursor:c!==void 0?"pointer":"default",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:28,height:28,marginTop:2,borderRadius:"var(--radius-sm)",background:r==="enabled"?"color-mix(in oklch, var(--success) 14%, transparent)":r==="error"?"color-mix(in oklch, var(--danger) 14%, transparent)":"var(--surface-2)",color:r==="enabled"?"var(--success)":r==="error"?"var(--danger)":"var(--fg-muted)",flexShrink:0},children:e.jsx(E,{size:14,"aria-hidden":"true"})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:t}),e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",fontFamily:"var(--font-mono, ui-monospace, monospace)"},children:i})]}),o!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:o}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",marginTop:6},children:[l!==void 0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:l}):e.jsx("span",{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx(v,{tone:N[r],size:"sm",children:C[r]}),p,e.jsx(y,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]})]}),e.jsx("style",{children:`
2
+ .v8-library-item:hover {
3
+ border-color: var(--accent);
4
+ background: var(--surface-2);
5
+ }
6
+ `})]})}function L(s){const{children:t,className:i}=s;return e.jsx("div",{className:g("v8-library-grid",i),style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(min(100%, 320px), 1fr))",gap:"var(--space-3)"},children:t})}const d={skills:"Skills",mcps:"MCPs",hooks:"Hooks"},w={skills:"Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.",mcps:"MCP server registrations under `.claude/settings.json` → `mcpServers`.",hooks:"Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd)."},z={skills:"/api/skills",mcps:"/api/skills?kind=mcps",hooks:"/api/skills?kind=hooks"},A={skills:["skills:change","agents:change"],mcps:["mcps:change","agents:change"],hooks:["hooks:change","agents:change"]},P=["skills:change","mcps:change","hooks:change","agents:change"];function B(s){const t=s.status==="enabled"||s.status==="disabled"||s.status==="error"?s.status:"disabled";return{id:s.id,name:s.name,slug:s.slug??s.id,status:t,description:s.description,meta:s.meta}}function ue(s){var h,u;const{kind:t}=s,i=z[t],r=f(i),[o,l]=m.useState(0),p=A[t],c=m.useCallback(()=>l(a=>a+1),[]);for(const a of P)x(a,p.includes(a)?c:()=>{});m.useEffect(()=>{o>0&&r.refetch()},[o,r]);const n=(((h=r.data)==null?void 0:h.skills)||((u=r.data)==null?void 0:u.items)||[]).map(B);return e.jsxs(b,{gap:5,"data-testid":`${t}-view`,children:[e.jsx(j,{title:d[t],description:w[t]}),r.loading?e.jsx(k,{style:{height:240}}):r.error&&n.length===0?e.jsx(T,{block:!0,title:`Couldn't load ${d[t].toLowerCase()}`,description:"The library endpoint failed. Retry to refetch.",error:r.error,onRetry:()=>void r.refetch(),testid:`libraries-${t}-error`}):n.length===0?e.jsx(S,{icon:e.jsx("span",{children:"📚"}),title:`No ${d[t].toLowerCase()} installed`,description:`${d[t]} appear here as soon as they are registered.`}):e.jsx(L,{children:n.map(a=>e.jsx(I,{...a},a.id))})]})}export{ue as LibrariesView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LibrariesView-DBQ83TNa.js","sources":["../../src/web/v8/ui/libraries/LibraryItem.tsx","../../src/web/v8/ui/libraries/LibraryGrid.tsx","../../src/web/v8/views/Libraries/LibrariesView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { ChevronRight, Power } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge, type BadgeTone } from '../data/Badge.js';\n\n/**\n * LibraryItem — generic inventory card used by the Skill/MCP/Hook libraries.\n *\n * PLAN.md: each \"library\" lists the same three facts about an installable\n * resource: identity (name + slug), status (enabled/disabled/error), and\n * provenance (description, version, last-used, owner). LibraryItem renders\n * those facts consistently so all three libraries feel like one product.\n */\n\nexport type LibraryStatus = 'enabled' | 'disabled' | 'error';\n\nexport interface LibraryItemProps {\n id: string;\n /** Display name (e.g. \"Frigg — Codebase Q&A\"). */\n name: string;\n /** Identifier (e.g. \"frigg\", \"semble\", \"PreToolUse:check-arch\"). */\n slug: string;\n status: LibraryStatus;\n description?: string;\n /** One-line metadata row (e.g. \"v1.2.0 · used 14× today · @anthropic\"). */\n meta?: string;\n /** Optional trailing action area (toggle, menu trigger, etc). */\n actions?: ReactNode;\n /** Click handler — opens detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<LibraryStatus, string> = {\n enabled: 'Enabled',\n disabled: 'Disabled',\n error: 'Error',\n};\n\nconst STATUS_TONE: Record<LibraryStatus, BadgeTone> = {\n enabled: 'success',\n disabled: 'neutral',\n error: 'danger',\n};\n\nexport function LibraryItem(props: LibraryItemProps) {\n const { name, slug, status, description, meta, actions, onOpen, className } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-library-item', `v8-library-item--${status}`, className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n marginTop: 2,\n borderRadius: 'var(--radius-sm)',\n background:\n status === 'enabled'\n ? 'color-mix(in oklch, var(--success) 14%, transparent)'\n : status === 'error'\n ? 'color-mix(in oklch, var(--danger) 14%, transparent)'\n : 'var(--surface-2)',\n color:\n status === 'enabled' ? 'var(--success)' : status === 'error' ? 'var(--danger)' : 'var(--fg-muted)',\n flexShrink: 0,\n }}\n >\n <Power size={14} aria-hidden=\"true\" />\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <span\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 600,\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {name}\n </span>\n <code\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontFamily: 'var(--font-mono, ui-monospace, monospace)',\n }}\n >\n {slug}\n </code>\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginTop: 6,\n }}\n >\n {meta !== undefined ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{meta}</span>\n ) : (\n <span />\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <Badge tone={STATUS_TONE[status]} size=\"sm\">\n {STATUS_LABEL[status]}\n </Badge>\n {actions}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n </div>\n <style>{`\n .v8-library-item:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * LibraryGrid — responsive grid for LibraryItem lists.\n *\n * Renders 1 column on narrow viewports, 2 columns on md, 3 columns on lg.\n * Uses CSS grid + auto-fit; items auto-size to fill available space.\n */\n\nexport interface LibraryGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function LibraryGrid(props: LibraryGridProps) {\n const { children, className } = props;\n return (\n <div\n className={cx('v8-library-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(100%, 320px), 1fr))',\n gap: 'var(--space-3)',\n }}\n >\n {children}\n </div>\n );\n}","import { useEffect, useState, useCallback } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { LibraryGrid, LibraryItem, type LibraryItemProps, type LibraryStatus } from '../../ui/index.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { LibraryItem as LibItem } from '../../data/types.js';\n\n/**\n * LibrariesView — Sprint S10. Generic Skills / MCPs / Hooks surface.\n *\n * The parent (`Router.tsx`) picks the data source per kind. This\n * view pulls live data from `/api/skills`, `/api/mcps`,\n * `/api/hooks` instead of seeded arrays.\n */\n\nexport type LibraryKind = 'skills' | 'mcps' | 'hooks';\n\nconst KIND_LABEL: Record<LibraryKind, string> = {\n skills: 'Skills',\n mcps: 'MCPs',\n hooks: 'Hooks',\n};\n\nconst KIND_DESCRIPTION: Record<LibraryKind, string> = {\n skills: 'Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.',\n mcps: 'MCP server registrations under `.claude/settings.json` → `mcpServers`.',\n hooks: 'Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd).',\n};\n\nconst ENDPOINT: Record<LibraryKind, string> = {\n skills: '/api/skills',\n mcps: '/api/skills?kind=mcps',\n hooks: '/api/skills?kind=hooks',\n};\n\nconst CHANGE_EVENTS: Record<LibraryKind, readonly string[]> = {\n skills: ['skills:change', 'agents:change'] as const,\n mcps: ['mcps:change', 'agents:change'] as const,\n hooks: ['hooks:change', 'agents:change'] as const,\n};\n// Stable hook count: always register listeners for all possible events,\n// filter inside the handler so kind navigation never changes hook order.\nconst ALL_EVENTS = ['skills:change', 'mcps:change', 'hooks:change', 'agents:change'] as const;\n\nfunction mapItem(it: LibItem): LibraryItemProps {\n const status: LibraryStatus =\n it.status === 'enabled' || it.status === 'disabled' || it.status === 'error'\n ? it.status\n : 'disabled';\n return {\n id: it.id,\n name: it.name,\n slug: it.slug ?? it.id,\n status,\n description: it.description,\n meta: it.meta,\n };\n}\n\nexport interface LibrariesViewProps {\n kind: LibraryKind;\n}\n\nexport function LibrariesView(props: LibrariesViewProps): JSX.Element {\n const { kind } = props;\n const url = ENDPOINT[kind];\n const res = useFetch<{ skills?: LibItem[]; items?: LibItem[]; count?: number }>(url);\n const [bust, setBust] = useState(0);\n\n // Force a re-fetch when the matching change event fires. Hook count\n // is fixed (ALL_EVENTS.length) so navigating between kinds can't trip\n // React's \"Rendered fewer hooks than expected\" runtime guard.\n const events = CHANGE_EVENTS[kind];\n const handler = useCallback((): void => setBust((n) => n + 1), []);\n for (const evt of ALL_EVENTS) {\n useWsMessage(evt, events.includes(evt) ? handler : () => {});\n }\n\n useEffect(() => {\n if (bust > 0) res.refetch();\n }, [bust, res]);\n\n const items: LibraryItemProps[] = (res.data?.skills || res.data?.items || []).map(mapItem);\n\n return (\n <Stack gap={5} data-testid={`${kind}-view`}>\n <ViewHeader title={KIND_LABEL[kind]} description={KIND_DESCRIPTION[kind]} />\n {res.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : res.error && items.length === 0 ? (\n <ErrorState\n block\n title={`Couldn't load ${KIND_LABEL[kind].toLowerCase()}`}\n description=\"The library endpoint failed. Retry to refetch.\"\n error={res.error}\n onRetry={() => void res.refetch()}\n testid={`libraries-${kind}-error`}\n />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<span>📚</span>}\n title={`No ${KIND_LABEL[kind].toLowerCase()} installed`}\n description={`${KIND_LABEL[kind]} appear here as soon as they are registered.`}\n />\n ) : (\n <LibraryGrid>\n {items.map((item) => (\n <LibraryItem key={item.id} {...item} />\n ))}\n </LibraryGrid>\n )}\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","LibraryItem","props","name","slug","status","description","meta","actions","onOpen","className","jsxs","cx","jsx","Power","Badge","ChevronRight","LibraryGrid","children","KIND_LABEL","KIND_DESCRIPTION","ENDPOINT","CHANGE_EVENTS","ALL_EVENTS","mapItem","it","LibrariesView","kind","url","res","useFetch","bust","setBust","useState","events","handler","useCallback","n","evt","useWsMessage","useEffect","items","_a","_b","Stack","ViewHeader","Skeleton","ErrorState","EmptyState","item"],"mappings":"+mCAiCA,MAAMA,EAA8C,CAClD,QAAS,UACT,SAAU,WACV,MAAO,OACT,EAEMC,EAAgD,CACpD,QAAS,UACT,SAAU,UACV,MAAO,QACT,EAEO,SAASC,EAAYC,EAAyB,CACnD,KAAM,CAAE,KAAAC,EAAM,KAAAC,EAAM,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,EAAM,QAAAC,EAAS,OAAAC,EAAQ,UAAAC,CAAA,EAAcR,EAE9E,OACES,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAASF,EACT,UAAWG,EAAG,kBAAmB,oBAAoBP,CAAM,GAAIK,CAAS,EACxE,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,MAAO,OACP,QAAS,gCACT,WAAY,mBACZ,OAAQ,0BACR,aAAc,gBACd,UAAW,OACX,OAAQD,IAAW,OAAY,UAAY,UAC3C,KAAM,UACN,MAAO,UACP,WAAY,gGAAA,EAGd,SAAA,CAAAI,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,UAAW,EACX,aAAc,mBACd,WACER,IAAW,UACP,uDACAA,IAAW,QACT,sDACA,mBACR,MACEA,IAAW,UAAY,iBAAmBA,IAAW,QAAU,gBAAkB,kBACnF,WAAY,CAAA,EAGd,SAAAQ,EAAAA,IAACC,EAAA,CAAM,KAAM,GAAI,cAAY,MAAA,CAAO,CAAA,CAAA,EAEtCH,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,gBAAA,EACxD,SAAA,CAAAE,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,eACV,WAAY,IACZ,MAAO,YACP,WAAY,gBAAA,EAGb,SAAAV,CAAA,CAAA,EAEHU,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,mBACP,WAAY,2CAAA,EAGb,SAAAT,CAAA,CAAA,CACH,EACF,EACCE,IAAgB,QACfO,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,UAAW,EACX,QAAS,cACT,gBAAiB,EACjB,gBAAiB,WACjB,SAAU,QAAA,EAGX,SAAAP,CAAA,CAAA,EAGLK,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,IAAK,iBACL,UAAW,CAAA,EAGZ,SAAA,CAAAJ,IAAS,OACRM,MAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAN,CAAA,CAAK,QAE3E,OAAA,EAAK,EAERI,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,gBAAA,EACxD,SAAA,CAAAE,EAAAA,IAACE,EAAA,CAAM,KAAMf,EAAYK,CAAM,EAAG,KAAK,KACpC,SAAAN,EAAaM,CAAM,CAAA,CACtB,EACCG,EACDK,EAAAA,IAACG,EAAA,CAAa,KAAM,GAAI,cAAY,OAAO,MAAO,CAAE,MAAO,mBAAmB,CAAG,CAAA,CAAA,CACnF,CAAA,CAAA,CAAA,CACF,EACF,QACC,QAAA,CAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAKN,CAAA,CAAA,CAAA,CAGR,CCjJO,SAASC,EAAYf,EAAyB,CACnD,KAAM,CAAE,SAAAgB,EAAU,UAAAR,CAAA,EAAcR,EAChC,OACEW,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAG,kBAAmBF,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,oBAAqB,mDACrB,IAAK,gBAAA,EAGN,SAAAQ,CAAA,CAAA,CAGP,CCRA,MAAMC,EAA0C,CAC9C,OAAQ,SACR,KAAM,OACN,MAAO,OACT,EAEMC,EAAgD,CACpD,OAAQ,2EACR,KAAM,yEACN,MAAO,iFACT,EAEMC,EAAwC,CAC5C,OAAQ,cACR,KAAM,wBACN,MAAO,wBACT,EAEMC,EAAwD,CAC5D,OAAQ,CAAC,gBAAiB,eAAe,EACzC,KAAM,CAAC,cAAe,eAAe,EACrC,MAAO,CAAC,eAAgB,eAAe,CACzC,EAGMC,EAAa,CAAC,gBAAiB,cAAe,eAAgB,eAAe,EAEnF,SAASC,EAAQC,EAA+B,CAC9C,MAAMpB,EACJoB,EAAG,SAAW,WAAaA,EAAG,SAAW,YAAcA,EAAG,SAAW,QACjEA,EAAG,OACH,WACN,MAAO,CACL,GAAIA,EAAG,GACP,KAAMA,EAAG,KACT,KAAMA,EAAG,MAAQA,EAAG,GACpB,OAAApB,EACA,YAAaoB,EAAG,YAChB,KAAMA,EAAG,IAAA,CAEb,CAMO,SAASC,GAAcxB,EAAwC,SACpE,KAAM,CAAE,KAAAyB,GAASzB,EACX0B,EAAMP,EAASM,CAAI,EACnBE,EAAMC,EAAoEF,CAAG,EAC7E,CAACG,EAAMC,CAAO,EAAIC,EAAAA,SAAS,CAAC,EAK5BC,EAASZ,EAAcK,CAAI,EAC3BQ,EAAUC,EAAAA,YAAY,IAAYJ,EAASK,GAAMA,EAAI,CAAC,EAAG,EAAE,EACjE,UAAWC,KAAOf,EAChBgB,EAAaD,EAAKJ,EAAO,SAASI,CAAG,EAAIH,EAAU,IAAM,CAAC,CAAC,EAG7DK,EAAAA,UAAU,IAAM,CACVT,EAAO,GAAGF,EAAI,QAAA,CACpB,EAAG,CAACE,EAAMF,CAAG,CAAC,EAEd,MAAMY,KAA6BC,EAAAb,EAAI,OAAJ,YAAAa,EAAU,WAAUC,EAAAd,EAAI,OAAJ,YAAAc,EAAU,QAAS,IAAI,IAAInB,CAAO,EAEzF,cACGoB,EAAA,CAAM,IAAK,EAAG,cAAa,GAAGjB,CAAI,QACjC,SAAA,CAAAd,MAACgC,EAAA,CAAW,MAAO1B,EAAWQ,CAAI,EAAG,YAAaP,EAAiBO,CAAI,EAAG,EACzEE,EAAI,QACHhB,EAAAA,IAACiC,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAA,CAAI,CAAG,EAChCjB,EAAI,OAASY,EAAM,SAAW,EAChC5B,EAAAA,IAACkC,EAAA,CACC,MAAK,GACL,MAAO,iBAAiB5B,EAAWQ,CAAI,EAAE,aAAa,GACtD,YAAY,iDACZ,MAAOE,EAAI,MACX,QAAS,IAAM,KAAKA,EAAI,QAAA,EACxB,OAAQ,aAAaF,CAAI,QAAA,CAAA,EAEzBc,EAAM,SAAW,EACnB5B,EAAAA,IAACmC,EAAA,CACC,KAAMnC,EAAAA,IAAC,OAAA,CAAK,SAAA,IAAA,CAAE,EACd,MAAO,MAAMM,EAAWQ,CAAI,EAAE,aAAa,aAC3C,YAAa,GAAGR,EAAWQ,CAAI,CAAC,8CAAA,CAAA,EAGlCd,EAAAA,IAACI,EAAA,CACE,SAAAwB,EAAM,IAAKQ,GACVpC,EAAAA,IAACZ,EAAA,CAA2B,GAAGgD,CAAA,EAAbA,EAAK,EAAc,CACtC,CAAA,CACH,CAAA,EAEJ,CAEJ"}
@@ -0,0 +1,6 @@
1
+ import{r as i,j as e}from"./cmdk-DVxytz9i.js";import{c as D,u as b,S as o,I as r,d as c,h as z,D as I,i as C,F as k}from"./main-CdOm1Pj9.js";import{V as F}from"./ViewHeader-BqIPVKuG.js";import{C as w,b as B}from"./Card-Tyboihu7.js";import{I as R}from"./Input-BbFUDQnS.js";import{R as G}from"./refresh-ccw-CHMprsm5.js";import{S as V}from"./save-DQKCKyZK.js";import{C as T}from"./circle-CqSxqqeJ.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 H=D("CirclePlay",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polygon",{points:"10 8 16 12 10 16 10 8",key:"1cimsy"}]]);function W(){var S;const t=b("/api/lightrag/defaults"),n=b("/api/lightrag/status"),[g,h]=i.useState(""),[u,f]=i.useState(""),[m,v]=i.useState(!1),[E,p]=i.useState(!1),[x,j]=i.useState(!1),[y,l]=i.useState(null);i.useEffect(()=>{t.data&&(h(t.data.llm??""),f(t.data.embedding??""))},[t.data]);const d=i.useCallback(()=>{t.refetch(),n.refetch()},[t,n]),L=async()=>{v(!0),l(null),p(!1);try{await C("/api/lightrag/defaults",{method:"PUT",body:{llm:g,embedding:u}}),p(!0),d()}catch(s){l((s instanceof k,s.message))}finally{v(!1)}},P=async()=>{j(!0),l(null);try{await C("/api/lightrag/autostart",{method:"POST"}),d()}catch(s){l((s instanceof k,s.message))}finally{j(!1)}},a=n.data;return e.jsxs(o,{gap:4,"data-testid":"lightrag-view",children:[e.jsx(F,{title:"LightRAG",description:"LightRAG defaults + runtime status + autostart.",actions:e.jsxs(r,{align:"center",gap:2,children:[y!==null&&e.jsx("span",{role:"alert","data-testid":"lightrag-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:y}),e.jsxs(c,{variant:"ghost",onClick:()=>void d(),"data-testid":"lightrag-refresh",children:[e.jsx(G,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(c,{variant:"primary",onClick:()=>void L(),disabled:m,"data-testid":"lightrag-save",children:[e.jsx(V,{size:14,"aria-hidden":!0})," ",m?"Saving…":"Save"]})]})}),e.jsx(w,{variant:"default",children:e.jsxs(B,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Defaults"}),t.loading&&t.data===null?e.jsx(z,{style:{height:100,marginTop:"var(--space-2)"}}):e.jsxs(o,{gap:2,style:{marginTop:"var(--space-2)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"LLM binding"}),e.jsx(R,{value:g,onChange:s=>h(s.target.value),"data-testid":"lightrag-llm"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Embedding binding"}),e.jsx(R,{value:u,onChange:s=>f(s.target.value),"data-testid":"lightrag-embedding"})]}),((S=t.data)==null?void 0:S.builtin)&&e.jsxs(r,{gap:2,style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[e.jsx("span",{children:"built-in:"}),e.jsx("code",{children:t.data.builtin.llm})," /",e.jsx("code",{children:t.data.builtin.embedding})]}),E&&e.jsx("span",{"data-testid":"lightrag-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"})]})]})}),e.jsx(w,{variant:"default",children:e.jsxs(B,{children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Status"}),e.jsxs(r,{align:"center",gap:2,children:[a==null?e.jsx(z,{style:{width:80,height:14}}):a.running?e.jsxs(r,{align:"center",gap:1,"data-testid":"lightrag-running",children:[e.jsx(T,{size:10,"aria-hidden":!0,style:{color:"var(--success)",fill:"var(--success)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:["running · pid ",a.pid]})]}):e.jsxs(r,{align:"center",gap:1,"data-testid":"lightrag-stopped",children:[e.jsx(T,{size:10,"aria-hidden":!0,style:{color:"var(--fg-muted)",fill:"var(--fg-muted)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"stopped"})]}),e.jsxs(c,{variant:"ghost",onClick:()=>void P(),disabled:x,"data-testid":"lightrag-autostart",children:[e.jsx(H,{size:14,"aria-hidden":!0})," ",x?"Starting…":"Autostart"]})]})]}),a&&e.jsxs(o,{gap:1,style:{marginTop:"var(--space-2)",fontSize:"var(--fs-12)"},children:[e.jsxs(r,{gap:2,children:[e.jsx(I,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsxs("code",{children:[a.host,":",a.port]}),a.llmBinding&&e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["· llm: ",e.jsx("code",{children:a.llmBinding})]}),a.embeddingBinding&&e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["· embedding: ",e.jsx("code",{children:a.embeddingBinding})]})]}),a.logTail&&a.logTail.length>0&&e.jsx("div",{"data-testid":"lightrag-log",style:{background:"var(--surface-1)",borderRadius:"var(--radius-sm)",padding:"var(--space-2)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-11)",maxHeight:160,overflow:"auto"},children:a.logTail.filter(Boolean).slice(-10).map((s,A)=>e.jsx("div",{children:s},A))})]})]})})]})}export{W as LightRAGView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightRAGView-JYpE5u9p.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-play.js","../../src/web/v8/views/LightRAG/LightRAGView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CirclePlay = createLucideIcon(\"CirclePlay\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polygon\", { points: \"10 8 16 12 10 16 10 8\", key: \"1cimsy\" }]\n]);\n\nexport { CirclePlay as default };\n//# sourceMappingURL=circle-play.js.map\n","/**\n * v8/views/LightRAG/LightRAGView.tsx — Sprint S43, v9.3.0.\n *\n * Defaults override form (GET/PUT /api/lightrag/defaults), runtime\n * status (GET /api/lightrag/status: running, pid, host:port, log\n * tail), and an Autostart trigger (POST /api/lightrag/autostart).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Database, RefreshCcw, Save, PlayCircle, Circle } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Defaults {\n llm: string;\n embedding: string;\n source?: string;\n llmSource?: string;\n embeddingSource?: string;\n builtin?: { llm: string; embedding: string };\n envVars?: { BIZAR_LIGHTRAG_LLM: string | null; BIZAR_LIGHTRAG_EMBEDDING: string | null };\n}\n\ninterface Status {\n running: boolean;\n pid: number | null;\n host?: string;\n port?: number;\n llmBinding?: string;\n embeddingBinding?: string;\n llmModel?: string;\n embeddingModel?: string;\n logSize?: number;\n logTail?: string[];\n}\n\nexport function LightRAGView(): JSX.Element {\n const defaultsPayload = useFetch<Defaults>('/api/lightrag/defaults');\n const statusPayload = useFetch<Status>('/api/lightrag/status');\n const [llm, setLlm] = useState<string>('');\n const [embedding, setEmbedding] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [autostarting, setAutostarting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (defaultsPayload.data) {\n setLlm(defaultsPayload.data.llm ?? '');\n setEmbedding(defaultsPayload.data.embedding ?? '');\n }\n }, [defaultsPayload.data]);\n\n const refresh = useCallback(() => { void defaultsPayload.refetch(); void statusPayload.refetch(); }, [defaultsPayload, statusPayload]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/lightrag/defaults', { method: 'PUT', body: { llm, embedding } });\n setSaved(true);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const autostart = async (): Promise<void> => {\n setAutostarting(true);\n setError(null);\n try {\n await fetchJson('/api/lightrag/autostart', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setAutostarting(false);\n }\n };\n\n const status = statusPayload.data;\n\n return (\n <Stack gap={4} data-testid=\"lightrag-view\">\n <ViewHeader\n title=\"LightRAG\"\n description=\"LightRAG defaults + runtime status + autostart.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"lightrag-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"lightrag-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"lightrag-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Defaults</strong>\n {defaultsPayload.loading && defaultsPayload.data === null ? (\n <Skeleton style={{ height: 100, marginTop: 'var(--space-2)' }} />\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-2)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>LLM binding</span>\n <Input value={llm} onChange={(e) => setLlm((e.target as HTMLInputElement).value)} data-testid=\"lightrag-llm\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Embedding binding</span>\n <Input value={embedding} onChange={(e) => setEmbedding((e.target as HTMLInputElement).value)} data-testid=\"lightrag-embedding\" />\n </label>\n {defaultsPayload.data?.builtin && (\n <Inline gap={2} style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n <span>built-in:</span>\n <code>{defaultsPayload.data.builtin.llm}</code> /\n <code>{defaultsPayload.data.builtin.embedding}</code>\n </Inline>\n )}\n {saved && <span data-testid=\"lightrag-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n <Inline align=\"center\" gap={2}>\n {status === null || status === undefined ? (\n <Skeleton style={{ width: 80, height: 14 }} />\n ) : status.running ? (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-running\">\n <Circle size={10} aria-hidden style={{ color: 'var(--success)', fill: 'var(--success)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>running · pid {status.pid}</span>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-stopped\">\n <Circle size={10} aria-hidden style={{ color: 'var(--fg-muted)', fill: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>stopped</span>\n </Inline>\n )}\n <Button variant=\"ghost\" onClick={() => void autostart()} disabled={autostarting} data-testid=\"lightrag-autostart\">\n <PlayCircle size={14} aria-hidden /> {autostarting ? 'Starting…' : 'Autostart'}\n </Button>\n </Inline>\n </Inline>\n {status && (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)' }}>\n <Inline gap={2}>\n <Database size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <code>{status.host}:{status.port}</code>\n {status.llmBinding && <span style={{ color: 'var(--fg-muted)' }}>· llm: <code>{status.llmBinding}</code></span>}\n {status.embeddingBinding && <span style={{ color: 'var(--fg-muted)' }}>· embedding: <code>{status.embeddingBinding}</code></span>}\n </Inline>\n {status.logTail && status.logTail.length > 0 && (\n <div data-testid=\"lightrag-log\" style={{ background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', padding: 'var(--space-2)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-11)', maxHeight: 160, overflow: 'auto' }}>\n {status.logTail.filter(Boolean).slice(-10).map((l, i) => (<div key={i}>{l}</div>))}\n </div>\n )}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["CirclePlay","createLucideIcon","LightRAGView","defaultsPayload","useFetch","statusPayload","llm","setLlm","useState","embedding","setEmbedding","busy","setBusy","saved","setSaved","autostarting","setAutostarting","error","setError","useEffect","refresh","useCallback","save","fetchJson","err","FetchError","autostart","status","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Save","Card","CardBody","Skeleton","Input","e","_a","Circle","PlayCircle","Database","l","i"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as f,j as e}from"./cmdk-DVxytz9i.js";import{g as x}from"./main-CdOm1Pj9.js";const g=f.forwardRef(function(l,d){const{title:n,count:a,sparkline:s,filters:r,actions:t,description:i,testid:o,className:c,...p}=l;return e.jsxs("div",{ref:d,"data-testid":o??"list-header",className:x("v8-list-header",c),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",marginBottom:"var(--space-2)"},...p,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",flexWrap:"wrap"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)",flex:1,minWidth:0},children:[e.jsx("h2",{style:{margin:0,fontSize:"var(--fs-16)",fontWeight:600},children:n}),a!=null&&e.jsx("span",{"data-testid":"list-header-count",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums",background:"var(--surface-1)",padding:"2px 8px",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:a}),s!==void 0&&e.jsx("span",{"data-testid":"list-header-sparkline",children:s}),i!==void 0&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i})]}),t!==void 0&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-1)",flexShrink:0},children:t})]}),r!==void 0&&e.jsx("div",{"data-testid":"list-header-filters",style:{display:"flex",alignItems:"center",gap:"var(--space-1)",flexWrap:"wrap"},children:r})]})});export{g as L};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListHeader-BGjm11Z0.js","sources":["../../src/web/v8/ui/data/ListHeader.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ListHeader — section header for list/grid views.\n *\n * Composes a label + count badge + optional sparkline + optional\n * filter chips + right-aligned actions. Use at the top of a Card\n * or as a standalone section divider.\n *\n * Two patterns supported:\n * - Minimal: `<title> <count?> <actions?>`\n * - Data-driven: `<title> <sparkline?> <chips?> <actions?>`\n */\nexport interface ListHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n /** Optional numeric badge — e.g. `42` rendered as `42 items`. */\n count?: number | null;\n /** Inline sparkline (pass a Sparkline node, not raw data). */\n sparkline?: ReactNode;\n /** Inline filter chips — rendered as a wrapping row. */\n filters?: ReactNode;\n /** Right-aligned action area (buttons, refresh, etc). */\n actions?: ReactNode;\n /** Optional helper text under the title. */\n description?: ReactNode;\n testid?: string;\n}\n\nexport const ListHeader = forwardRef<HTMLDivElement, ListHeaderProps>(function ListHeader(props, ref) {\n const { title, count, sparkline, filters, actions, description, testid, className, ...rest } = props;\n return (\n <div\n ref={ref}\n data-testid={testid ?? 'list-header'}\n className={cx('v8-list-header', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n marginBottom: 'var(--space-2)',\n }}\n {...rest}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n flexWrap: 'wrap',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flex: 1, minWidth: 0 }}>\n <h2 style={{ margin: 0, fontSize: 'var(--fs-16)', fontWeight: 600 }}>{title}</h2>\n {count !== undefined && count !== null && (\n <span\n data-testid=\"list-header-count\"\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n background: 'var(--surface-1)',\n padding: '2px 8px',\n borderRadius: 'var(--radius-pill)',\n border: '1px solid var(--border)',\n }}\n >\n {count}\n </span>\n )}\n {sparkline !== undefined && (\n <span data-testid=\"list-header-sparkline\">{sparkline}</span>\n )}\n {description !== undefined && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{description}</span>\n )}\n </div>\n {actions !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-1)', flexShrink: 0 }}>\n {actions}\n </div>\n )}\n </div>\n {filters !== undefined && (\n <div\n data-testid=\"list-header-filters\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-1)', flexWrap: 'wrap' }}\n >\n {filters}\n </div>\n )}\n </div>\n );\n});"],"names":["ListHeader","forwardRef","props","ref","title","count","sparkline","filters","actions","description","testid","className","rest","jsxs","cx","jsx"],"mappings":"qFA6BO,MAAMA,EAAaC,EAAAA,WAA4C,SAAoBC,EAAOC,EAAK,CACpG,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,QAAAC,EAAS,QAAAC,EAAS,YAAAC,EAAa,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,CAAA,EAASV,EAC/F,OACEW,EAAAA,KAAC,MAAA,CACC,IAAAV,EACA,cAAaO,GAAU,cACvB,UAAWI,EAAG,iBAAkBH,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,iBACL,aAAc,gBAAA,EAEf,GAAGC,EAEJ,SAAA,CAAAC,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,iBACL,SAAU,MAAA,EAGZ,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,KAAM,EAAG,SAAU,GAC7F,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,OAAQ,EAAG,SAAU,eAAgB,WAAY,GAAA,EAAQ,SAAAX,CAAA,CAAM,EACpDC,GAAU,MAChCU,EAAAA,IAAC,OAAA,CACC,cAAY,oBACZ,MAAO,CACL,SAAU,eACV,MAAO,kBACP,mBAAoB,eACpB,WAAY,mBACZ,QAAS,UACT,aAAc,qBACd,OAAQ,yBAAA,EAGT,SAAAV,CAAA,CAAA,EAGJC,IAAc,QACbS,EAAAA,IAAC,OAAA,CAAK,cAAY,wBAAyB,SAAAT,EAAU,EAEtDG,IAAgB,QACfM,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,oBAAuB,SAAAN,CAAA,CAAY,CAAA,EAEvF,EACCD,IAAY,QACXO,MAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,WAAY,CAAA,EACrF,SAAAP,CAAA,CACH,CAAA,CAAA,CAAA,EAGHD,IAAY,QACXQ,EAAAA,IAAC,MAAA,CACC,cAAY,sBACZ,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,SAAU,MAAA,EAEhF,SAAAR,CAAA,CAAA,CACH,CAAA,CAAA,CAIR,CAAC"}
@@ -0,0 +1,8 @@
1
+ import{j as e,r as m}from"./cmdk-DVxytz9i.js";import{c as N,B,g as j,u as L,a as O,S as y,d as p,I as g,h as P,i as x,F as b}from"./main-CdOm1Pj9.js";import{V as A}from"./ViewHeader-BqIPVKuG.js";import{F as I}from"./file-text-B-g8H227.js";import{E as R}from"./EmptyState-DZ2ouKwd.js";import{C as S}from"./Chip-BrXIlR9w.js";import{S as D,a as T}from"./Sheet-DH-WNJ3Y.js";import{T as _}from"./Textarea-qYDf3yds.js";import{D as F}from"./download-BdHlstUY.js";import{P as w}from"./plus-M6LYiKX8.js";import{B as M}from"./brain-fsBSDl2g.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 U=N("Hash",[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]]),V={project:"Project",global:"Global"},H={project:"accent",global:"info"};function W(r){const{entries:i,onOpen:d,empty:o,className:s}=r;return i.length===0&&o!==void 0?e.jsx(e.Fragment,{children:o}):e.jsxs("div",{className:j("v8-memory-vault",s),children:[i.map(n=>e.jsxs("button",{type:"button",onClick:()=>d==null?void 0:d(n),className:j("v8-memory-vault__item",`v8-memory-vault__item--${n.scope}`),style:{display:"block",width:"100%",padding:"var(--space-3) var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius)",textAlign:"left",cursor:d!==void 0?"pointer":"default",font:"inherit",color:"inherit",marginBottom:"var(--space-2)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",marginBottom:6},children:[e.jsx(B,{tone:H[n.scope],size:"sm",children:V[n.scope]}),e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:"var(--fs-12)",color:"var(--fg-subtle)",fontVariantNumeric:"tabular-nums"},children:[e.jsx(I,{size:12,"aria-hidden":"true"}),n.updatedAt]})]}),e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",lineHeight:"var(--lh-snug)",display:"-webkit-box",WebkitLineClamp:3,WebkitBoxOrient:"vertical",overflow:"hidden"},children:n.content}),n.tags!==void 0&&n.tags.length>0&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:"var(--space-2)",flexWrap:"wrap"},children:[e.jsx(U,{size:11,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}}),n.tags.map(l=>e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:l},l))]})]},n.id)),e.jsx("style",{children:`
7
+ .v8-memory-vault__item:hover { border-color: var(--accent); }
8
+ `})]})}function $(r){return{id:r.id||"",content:r.content||"",tags:r.tags||[],scope:r.scope||"project",updatedAt:typeof r.updatedAt=="number"?new Date(r.updatedAt).toLocaleString():r.updatedAt||""}}function re(){const r=L("/api/memory/notes"),[i,d]=m.useState("all"),[o,s]=m.useState(null),[n,l]=m.useState(!1),[f,u]=m.useState(null),h=m.useMemo(()=>{var a;const t=(((a=r.data)==null?void 0:a.notes)||[]).map($);return i==="all"?t:t.filter(c=>c.scope===i)},[r.data,i]),v=()=>{r.refetch()},k=m.useCallback(t=>{const a=t;(a.type==="memory:change"||a.type==="memory:new"||a.type==="memory:removed")&&v()},[r]);O(["memory:change","memory:new","memory:removed"],k);const C=()=>{const t=new Blob([JSON.stringify(h,null,2)],{type:"application/json"}),a=URL.createObjectURL(t),c=document.createElement("a");c.href=a,c.download=`bizar-memory-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(c),c.click(),c.remove(),URL.revokeObjectURL(a)},E=async()=>{if(!(!o||!o.content.trim())){l(!0),u(null);try{o.id?await x(`/api/memory/notes/${encodeURIComponent(o.id)}`,{method:"PUT",body:{content:o.content,scope:o.scope}}):await x("/api/memory/notes",{method:"POST",body:{content:o.content,scope:o.scope}}),s(null),v()}catch(t){u(t instanceof b?t.message:String(t))}finally{l(!1)}}},z=async t=>{l(!0),u(null);try{await x(`/api/memory/notes/${encodeURIComponent(t)}`,{method:"DELETE"}),s(null),v()}catch(a){u(a instanceof b?a.message:String(a))}finally{l(!1)}};return e.jsxs(y,{gap:5,"data-testid":"memory-view",children:[e.jsx(A,{title:"Memory",description:"Cross-session notes. Project memos live in the repo; global memos live on the user.",actions:e.jsxs(p,{variant:"secondary",onClick:C,disabled:h.length===0,children:[e.jsx(F,{size:12,"aria-hidden":!0})," Export JSON"]})}),e.jsxs(g,{align:"center",justify:"between",gap:2,wrap:!0,children:[e.jsx(g,{gap:2,children:["all","project","global"].map(t=>e.jsx(S,{selected:i===t,onClick:()=>d(t),children:t==="all"?"All":t==="project"?"Project":"Global"},t))}),e.jsxs(p,{variant:"primary",size:"sm",onClick:()=>s({content:"",scope:"project"}),"data-testid":"memory-new",children:[e.jsx(w,{size:14,"aria-hidden":!0})," New note"]})]}),f!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:f}),r.loading?e.jsx(P,{style:{height:240}}):h.length===0?e.jsx(R,{icon:e.jsx(M,{size:32,"aria-hidden":!0}),title:"No memory entries",description:"Memos land here once they are written via the memory tools. Add one with the button above.",action:e.jsxs(p,{variant:"primary",size:"sm",onClick:()=>s({content:"",scope:"project"}),children:[e.jsx(w,{size:14,"aria-hidden":!0})," New note"]})}):e.jsx(W,{entries:h,onOpen:t=>s({id:t.id,content:t.content,scope:t.scope})}),e.jsx(D,{open:o!==null,onOpenChange:t=>{t||s(null)},children:e.jsx(T,{side:"right",title:o!=null&&o.id?"Edit note":"New note",children:o!==null&&e.jsxs(y,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(y,{gap:2,children:[e.jsx("label",{htmlFor:"memory-content",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Content"}),e.jsx(_,{id:"memory-content",value:o.content,onChange:t=>s({...o,content:t.target.value}),rows:10,disabled:n,"data-testid":"memory-content"})]}),e.jsxs(y,{gap:2,children:[e.jsx("label",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Scope"}),e.jsx(g,{gap:2,children:["project","global"].map(t=>e.jsx(S,{selected:o.scope===t,onClick:()=>s({...o,scope:t}),children:t==="project"?"Project (in-repo)":"Global (user-wide)"},t))})]}),e.jsxs(g,{gap:2,children:[e.jsx(p,{variant:"primary",onClick:()=>{E()},disabled:n||!o.content.trim(),children:o.id?"Save":"Create"}),e.jsx(p,{variant:"ghost",onClick:()=>s(null),disabled:n,children:"Cancel"}),o.id!==void 0&&e.jsx(p,{variant:"danger",onClick:()=>{z(o.id)},disabled:n,style:{marginLeft:"auto"},children:"Delete"})]})]})})})]})}export{re as MemoryView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryView-CnOP2MvM.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/hash.js","../../src/web/v8/ui/memory/MemoryVault.tsx","../../src/web/v8/views/Memory/MemoryView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Hash = createLucideIcon(\"Hash\", [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"9\", y2: \"9\", key: \"4lhtct\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"15\", y2: \"15\", key: \"vyu0kd\" }],\n [\"line\", { x1: \"10\", x2: \"8\", y1: \"3\", y2: \"21\", key: \"1ggp8o\" }],\n [\"line\", { x1: \"16\", x2: \"14\", y1: \"3\", y2: \"21\", key: \"weycgp\" }]\n]);\n\nexport { Hash as default };\n//# sourceMappingURL=hash.js.map\n","import { type ReactNode } from 'react';\nimport { FileText, Hash } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * MemoryVault — list of memory entries (memos) grouped by scope.\n *\n * PLAN.md: memos are the durable cross-session notes the harness writes\n * down. Scopes: `project` (committed to repo) vs `global` (user-wide).\n * Each entry: content (truncated to 3 lines), tags, last-updated time,\n * scope badge.\n */\n\nexport type MemoryScope = 'project' | 'global';\n\nexport interface MemoryEntry {\n id: string;\n content: string;\n tags?: readonly string[];\n scope: MemoryScope;\n /** Relative time label (\"3 days ago\", \"Just now\"). */\n updatedAt: string;\n}\n\nexport interface MemoryVaultProps {\n entries: readonly MemoryEntry[];\n /** Optional click handler — opens memo detail. */\n onOpen?: (entry: MemoryEntry) => void;\n /** Optional empty state. */\n empty?: ReactNode;\n className?: string;\n}\n\nconst SCOPE_LABEL: Record<MemoryScope, string> = {\n project: 'Project',\n global: 'Global',\n};\n\nconst SCOPE_TONE: Record<MemoryScope, 'accent' | 'info'> = {\n project: 'accent',\n global: 'info',\n};\n\nexport function MemoryVault(props: MemoryVaultProps) {\n const { entries, onOpen, empty, className } = props;\n\n if (entries.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n\n return (\n <div className={cx('v8-memory-vault', className)}>\n {entries.map((entry) => (\n <button\n type=\"button\"\n key={entry.id}\n onClick={() => onOpen?.(entry)}\n className={cx('v8-memory-vault__item', `v8-memory-vault__item--${entry.scope}`)}\n style={{\n display: 'block',\n width: '100%',\n padding: 'var(--space-3) var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n textAlign: 'left',\n cursor: onOpen !== undefined ? 'pointer' : 'default',\n font: 'inherit',\n color: 'inherit',\n marginBottom: 'var(--space-2)',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n marginBottom: 6,\n }}\n >\n <Badge tone={SCOPE_TONE[entry.scope]} size=\"sm\">\n {SCOPE_LABEL[entry.scope]}\n </Badge>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n <FileText size={12} aria-hidden=\"true\" />\n {entry.updatedAt}\n </span>\n </div>\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n lineHeight: 'var(--lh-snug)',\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {entry.content}\n </div>\n {entry.tags !== undefined && entry.tags.length > 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginTop: 'var(--space-2)',\n flexWrap: 'wrap',\n }}\n >\n <Hash size={11} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n {entry.tags.map((tag) => (\n <span\n key={tag}\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </button>\n ))}\n <style>{`\n .v8-memory-vault__item:hover { border-color: var(--accent); }\n `}</style>\n </div>\n );\n}","import { useMemo, useState, useCallback } from 'react';\nimport { Plus, Download } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { MemoryVault, type MemoryEntry, type MemoryScope } from '../../ui/memory/MemoryVault.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Brain } from 'lucide-react';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * MemoryView — Sprint S10 + S15b. Pulls `/api/memory`, lets the user\n * create / edit / delete notes via the dashboard's control surface.\n *\n * Notes are stored via `/api/memory/notes` (POST create, PUT/DELETE\n * per-note). Scope is `project` (in the repo) vs `global` (user-wide).\n */\n\ninterface RawMemoryEntry {\n id?: string;\n content?: string;\n tags?: string[];\n scope?: 'project' | 'global';\n updatedAt?: string | number;\n}\n\ninterface MemoryResponse {\n notes?: RawMemoryEntry[];\n count?: number;\n}\n\nfunction toEntry(e: RawMemoryEntry): MemoryEntry {\n return {\n id: e.id || '',\n content: e.content || '',\n tags: e.tags || [],\n scope: (e.scope || 'project') as MemoryScope,\n updatedAt:\n typeof e.updatedAt === 'number'\n ? new Date(e.updatedAt).toLocaleString()\n : e.updatedAt || '',\n };\n}\n\ninterface NoteDraft {\n id?: string;\n content: string;\n scope: MemoryScope;\n}\n\nexport function MemoryView(): JSX.Element {\n const mem = useFetch<MemoryResponse>('/api/memory/notes');\n const [scope, setScope] = useState<MemoryScope | 'all'>('all');\n const [draft, setDraft] = useState<NoteDraft | null>(null);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const entries = useMemo<MemoryEntry[]>(() => {\n const list = (mem.data?.notes || []).map(toEntry);\n if (scope === 'all') return list;\n return list.filter((e) => e.scope === scope);\n }, [mem.data, scope]);\n\n const refresh = (): void => { void mem.refetch(); };\n\n const onMemoryChange = useCallback((msg: WsMessage) => {\n const m = msg as { type?: string };\n if (m.type === 'memory:change' || m.type === 'memory:new' || m.type === 'memory:removed') {\n refresh();\n }\n }, [mem]);\n useWsMessage(['memory:change', 'memory:new', 'memory:removed'], onMemoryChange);\n\n const exportNotes = (): void => {\n const blob = new Blob([JSON.stringify(entries, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `bizar-memory-${new Date().toISOString().slice(0, 10)}.json`;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n };\n\n const saveDraft = async (): Promise<void> => {\n if (!draft || !draft.content.trim()) return;\n setBusy(true);\n setError(null);\n try {\n if (draft.id) {\n // Edit\n await fetchJson(`/api/memory/notes/${encodeURIComponent(draft.id)}`, {\n method: 'PUT',\n body: { content: draft.content, scope: draft.scope },\n });\n } else {\n await fetchJson('/api/memory/notes', {\n method: 'POST',\n body: { content: draft.content, scope: draft.scope },\n });\n }\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const deleteEntry = async (id: string): Promise<void> => {\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/memory/notes/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"memory-view\">\n <ViewHeader\n title=\"Memory\"\n description=\"Cross-session notes. Project memos live in the repo; global memos live on the user.\"\n actions={\n <Button variant=\"secondary\" onClick={exportNotes} disabled={entries.length === 0}>\n <Download size={12} aria-hidden /> Export JSON\n </Button>\n }\n />\n <Inline align=\"center\" justify=\"between\" gap={2} wrap>\n <Inline gap={2}>\n {(['all', 'project', 'global'] as const).map((s) => (\n <Chip key={s} selected={scope === s} onClick={() => setScope(s)}>\n {s === 'all' ? 'All' : s === 'project' ? 'Project' : 'Global'}\n </Chip>\n ))}\n </Inline>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => setDraft({ content: '', scope: 'project' })}\n data-testid=\"memory-new\"\n >\n <Plus size={14} aria-hidden /> New note\n </Button>\n </Inline>\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n {mem.loading ? (\n <Skeleton style={{ height: 240 }} />\n ) : entries.length === 0 ? (\n <EmptyState\n icon={<Brain size={32} aria-hidden />}\n title=\"No memory entries\"\n description=\"Memos land here once they are written via the memory tools. Add one with the button above.\"\n action={\n <Button variant=\"primary\" size=\"sm\" onClick={() => setDraft({ content: '', scope: 'project' })}>\n <Plus size={14} aria-hidden /> New note\n </Button>\n }\n />\n ) : (\n <MemoryVault\n entries={entries}\n onOpen={(e) => setDraft({ id: e.id, content: e.content, scope: e.scope })}\n />\n )}\n <Sheet open={draft !== null} onOpenChange={(o) => { if (!o) setDraft(null); }}>\n <SheetContent side=\"right\" title={draft?.id ? 'Edit note' : 'New note'}>\n {draft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label\n htmlFor=\"memory-content\"\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Content\n </label>\n <Textarea\n id=\"memory-content\"\n value={draft.content}\n onChange={(e) => setDraft({ ...draft, content: e.target.value })}\n rows={10}\n disabled={busy}\n data-testid=\"memory-content\"\n />\n </Stack>\n <Stack gap={2}>\n <label style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Scope</label>\n <Inline gap={2}>\n {(['project', 'global'] as const).map((s) => (\n <Chip\n key={s}\n selected={draft.scope === s}\n onClick={() => setDraft({ ...draft, scope: s })}\n >\n {s === 'project' ? 'Project (in-repo)' : 'Global (user-wide)'}\n </Chip>\n ))}\n </Inline>\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveDraft(); }}\n disabled={busy || !draft.content.trim()}\n >\n {draft.id ? 'Save' : 'Create'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setDraft(null)} disabled={busy}>\n Cancel\n </Button>\n {draft.id !== undefined && (\n <Button\n variant=\"danger\"\n onClick={() => { void deleteEntry(draft.id!); }}\n disabled={busy}\n style={{ marginLeft: 'auto' }}\n >\n Delete\n </Button>\n )}\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["Hash","createLucideIcon","SCOPE_LABEL","SCOPE_TONE","MemoryVault","props","entries","onOpen","empty","className","cx","entry","jsxs","jsx","Badge","FileText","tag","toEntry","e","MemoryView","mem","useFetch","scope","setScope","useState","draft","setDraft","busy","setBusy","error","setError","useMemo","list","_a","refresh","onMemoryChange","useCallback","msg","m","useWsMessage","exportNotes","blob","url","a","saveDraft","fetchJson","err","FetchError","deleteEntry","id","Stack","ViewHeader","Button","Download","Inline","s","Chip","Plus","Skeleton","EmptyState","Brain","Sheet","o","SheetContent","Textarea"],"mappings":"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","x_google_ignoreList":[0]}