@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":"Avatar-DZPv9pvd.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/web/v8/ui/feedback/Banner.tsx","../../src/web/v8/ui/data/Avatar.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 GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Banner — a top-of-page contextual announcement.\n *\n * Use sparingly. Distinct from StatusBar (which is system-level) and\n * Alert (which is inline). Banner occupies its own row above the page header.\n */\nexport interface BannerProps extends HTMLAttributes<HTMLDivElement> {\n tone?: 'info' | 'warning' | 'success' | 'danger';\n children: ReactNode;\n action?: ReactNode;\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(props, ref) {\n const { tone = 'info', children, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n role={tone === 'danger' ? 'alert' : 'status'}\n className={cx('v8-banner', `v8-banner--${tone}`, className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-3) var(--space-4)',\n background: `color-mix(in oklch, var(--${tone}) 8%, var(--surface-1))`,\n borderBottom: '1px solid var(--border)',\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>{children}</div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Avatar — user/agent representation. Falls back to initials when no image.\n *\n * Sizes: xs (20) | sm (24) | md (32) | lg (40) | xl (56).\n * Renders a <span> by default; use `asChild` to swap for a button/link.\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n /** Override the generated initials. */\n initials?: string;\n /** Optional status dot (online/offline/busy). */\n status?: 'online' | 'offline' | 'busy' | 'away';\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = { xs: 20, sm: 24, md: 32, lg: 40, xl: 56 };\nconst SIZE_FS: Record<AvatarSize, string> = {\n xs: 'var(--fs-12)',\n sm: 'var(--fs-12)',\n md: 'var(--fs-13)',\n lg: 'var(--fs-14)',\n xl: 'var(--fs-18)',\n};\n\nconst STATUS_FG = {\n online: 'var(--success)',\n offline: 'var(--fg-subtle)',\n busy: 'var(--danger)',\n away: 'var(--warning)',\n} as const;\n\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || parts[0] === undefined) return '?';\n if (parts.length === 1) {\n const first = parts[0] ?? '';\n return first.slice(0, 2).toUpperCase();\n }\n const first = parts[0]?.[0] ?? '';\n const last = parts[parts.length - 1]?.[0] ?? '';\n return `${first}${last}`.toUpperCase();\n}\n\n// Deterministic color from name — used as fallback when no image.\nfunction hashName(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nconst FALLBACK_PALETTE = [\n 'oklch(0.65 0.15 240)',\n 'oklch(0.65 0.15 30)',\n 'oklch(0.65 0.15 140)',\n 'oklch(0.65 0.15 320)',\n 'oklch(0.65 0.15 80)',\n 'oklch(0.65 0.15 200)',\n];\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(props, ref) {\n const { name, src, size = 'md', initials, status, className, style, ...rest } = props;\n const px = SIZE_PX[size];\n const init = initials ?? deriveInitials(name);\n const fallbackBg = FALLBACK_PALETTE[hashName(name) % FALLBACK_PALETTE.length];\n\n return (\n <span\n ref={ref}\n className={cx('v8-avatar', `v8-avatar--${size}`, className)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: px,\n height: px,\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n background: fallbackBg,\n color: 'white',\n fontSize: SIZE_FS[size],\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...style,\n }}\n aria-label={name}\n {...rest}\n >\n {src !== undefined ? (\n <img\n src={src}\n alt=\"\"\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n init\n )}\n {status !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: Math.max(6, Math.floor(px * 0.28)),\n height: Math.max(6, Math.floor(px * 0.28)),\n borderRadius: 'var(--radius-pill)',\n background: STATUS_FG[status],\n border: '2px solid var(--surface-0)',\n }}\n />\n )}\n </span>\n );\n});\n\n/**\n * AvatarStack — overlapping avatars. Use for \"assigned to N people\" lists.\n */\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: AvatarSize;\n max?: number;\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n props,\n ref,\n) {\n const { children, size = 'sm', className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-avatar-stack', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n {...rest}\n >\n <StackedChildren size={size}>{children}</StackedChildren>\n </div>\n );\n});\n\nfunction StackedChildren({ children, size }: { children: ReactNode; size: AvatarSize }) {\n const px = SIZE_PX[size];\n return (\n <>\n {Array.isArray(children)\n ? children.map((child, i) => (\n <span\n key={i}\n style={{\n marginLeft: i === 0 ? 0 : -Math.floor(px * 0.3),\n border: '2px solid var(--surface-0)',\n borderRadius: 'var(--radius-pill)',\n display: 'inline-flex',\n }}\n >\n {child}\n </span>\n ))\n : <span style={{ border: '2px solid var(--surface-0)', borderRadius: 'var(--radius-pill)' }}>{children}</span>}\n </>\n );\n}"],"names":["GitBranch","createLucideIcon","Banner","forwardRef","props","ref","tone","children","action","className","rest","jsxs","cx","jsx","SIZE_PX","SIZE_FS","STATUS_FG","deriveInitials","name","parts","first","_a","last","_b","hashName","h","i","FALLBACK_PALETTE","Avatar","src","size","initials","status","style","px","init","fallbackBg","StackedChildren","Fragment","child"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as t,j as e}from"./cmdk-DVxytz9i.js";import{u as X,a as Z,i as f,S as g,I as a,B as S,h as M,j as A,d as l,x as _,F as v}from"./main-CdOm1Pj9.js";import{V as ee}from"./ViewHeader-BqIPVKuG.js";import{C as y,b as k}from"./Card-Tyboihu7.js";import{P as F}from"./pause-C9hgd8wX.js";import{P as K}from"./play-CawUZ02_.js";import{R as O}from"./rotate-cw-DHooc0Tx.js";import{T as W}from"./trash-2-CL4khSRv.js";import{T as H}from"./triangle-alert-BPLb7uLt.js";import{C as ne}from"./circle-check-rVKMQmZp.js";function L(s){switch(s){case"running":return K;case"paused":return F;case"done":return ne;case"error":return H;case"killed":return W;default:return A}}function h(s){switch(s){case"running":return"info";case"paused":return"warning";case"done":return"success";case"error":return"danger";case"killed":return"neutral";default:return"neutral"}}function re(s){if(!s)return"—";const c=Math.floor((Date.now()-s)/1e3);if(c<60)return`${c}s`;const p=Math.floor(c/60);return p<60?`${p}m ${c%60}s`:`${Math.floor(p/60)}h ${p%60}m`}function he(){const s=X("/api/background"),[c,p]=t.useState([]),[i,w]=t.useState(null),[C,z]=t.useState([]),[J,$]=t.useState(!1),[R,T]=t.useState(!1),[B,o]=t.useState(null),[P,b]=t.useState(null);Z("background:change",t.useCallback(n=>{const r=n;s.refetch(),r.id&&r.id===i&&I(r.id)},[s,i]));const d=t.useMemo(()=>{var n;return[...c,...((n=s.data)==null?void 0:n.instances)||[]]},[c,s.data]),x=t.useMemo(()=>i?d.find(n=>n.instanceId===i)??null:null,[i,d]),I=async n=>{$(!0);try{const r=await f(`/api/background/${encodeURIComponent(n)}/output?lines=100`);z(r.lines??[])}catch{z([])}finally{$(!1)}},V=async n=>{w(n.instanceId),await I(n.instanceId)},m=()=>{s.refetch()},D=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/pause`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},N=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/resume`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},G=async n=>{o(null);try{await f(`/api/background/${encodeURIComponent(n)}/retry`,{method:"POST"}),m()}catch(r){o(r instanceof v?r.message:String(r))}},Y=async n=>{o(null),T(!0);try{await f(`/api/background/${encodeURIComponent(n)}`,{method:"DELETE"}),b(null),i===n&&w(null),m()}catch(r){o(r instanceof v?r.message:String(r))}finally{T(!1)}},q=t.useMemo(()=>{const n={pending:0,running:0,paused:0,done:0,error:0,killed:0,unknown:0};for(const r of d){const u=r.status||"unknown";n[u]=(n[u]??0)+1}return n},[d]);return e.jsxs(g,{gap:5,"data-testid":"background-view",children:[e.jsx(ee,{title:"Background Jobs",description:"Live background agent sessions. Pause, resume, retry, or kill."}),B!==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 var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:B}),d.length>0&&e.jsx(a,{gap:3,wrap:!0,children:["running","paused","pending","done","error"].map(n=>{const r=q[n];if(r===0)return null;const u=L(n);return e.jsxs(a,{align:"center",gap:2,style:{padding:"4px 10px",background:"var(--surface-1)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)"},children:[e.jsx(u,{size:12,"aria-hidden":!0,style:{color:`var(--${h(n)==="neutral"?"fg-muted":h(n)})`}}),e.jsx("span",{style:{fontSize:"var(--fs-12)"},children:n}),e.jsx(S,{tone:h(n),children:r})]},n)})}),s.loading&&d.length===0?e.jsx(M,{style:{height:240}}):d.length===0?e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:1,align:"center",children:[e.jsx(A,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No background jobs"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Background agents appear here when spawned."})]})})}):e.jsxs(U,{style:{display:"grid",gridTemplateColumns:x?"1fr 380px":"1fr",gap:"var(--space-4)"},children:[e.jsx(g,{gap:2,children:d.map(n=>{var E;const r=n.status||"unknown",u=L(r),Q=n.instanceId===i;return e.jsx(y,{"data-testid":`bg-instance-${n.instanceId}`,style:{cursor:"pointer",outline:Q?"2px solid var(--accent)":void 0,outlineOffset:-2},onClick:()=>{V(n)},children:e.jsx(k,{children:e.jsxs(a,{align:"center",gap:3,children:[e.jsx(u,{size:16,"aria-hidden":!0,style:{color:`var(--${h(r)==="neutral"?"fg-muted":h(r)})`}}),e.jsxs(g,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:n.agent??n.instanceId.slice(0,8)}),e.jsx(S,{tone:h(r),children:r}),(E=n.tags)==null?void 0:E.map(j=>e.jsx(S,{tone:"neutral",children:j},j))]}),e.jsxs(a,{gap:3,children:[n.worktree&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:n.worktree}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:re(n.startedAt??n.createdAt)}),n.pid&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["pid ",n.pid]})]})]}),e.jsxs(a,{gap:1,align:"center",onClick:j=>j.stopPropagation(),children:[r==="running"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{D(n.instanceId)},"data-testid":`bg-pause-${n.instanceId}`,title:"Pause",children:e.jsx(F,{size:12,"aria-hidden":!0})}),r==="paused"&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{N(n.instanceId)},"data-testid":`bg-resume-${n.instanceId}`,title:"Resume",children:e.jsx(K,{size:12,"aria-hidden":!0})}),(r==="error"||r==="killed")&&e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{G(n.instanceId)},"data-testid":`bg-retry-${n.instanceId}`,title:"Retry",children:e.jsx(O,{size:12,"aria-hidden":!0})}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>b(n.instanceId),"data-testid":`bg-kill-${n.instanceId}`,title:"Kill",children:e.jsx(W,{size:12,"aria-hidden":!0})})]})]})})},n.instanceId)})}),x&&e.jsx(y,{children:e.jsx(k,{children:e.jsxs(g,{gap:3,children:[e.jsxs(a,{align:"center",justify:"between",children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(_,{size:12,"aria-hidden":!0}),e.jsx("span",{style:{fontSize:"var(--fs-13)",fontWeight:600},children:"Output"})]}),e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>{x&&I(x.instanceId)},children:e.jsx(O,{size:12,"aria-hidden":!0})})]}),J?e.jsx(M,{style:{height:160}}):C.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No output captured yet."}):e.jsx(U,{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-3)",maxHeight:320,overflowY:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",lineHeight:1.6},children:C.map((n,r)=>e.jsx("div",{children:n},r))})]})})})]}),P&&e.jsx("div",{role:"dialog","aria-modal":!0,style:{position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.4)",zIndex:100},"data-testid":"bg-kill-confirm",children:e.jsx(y,{style:{maxWidth:400},children:e.jsx(k,{children:e.jsxs(g,{gap:4,children:[e.jsxs(a,{align:"center",gap:2,children:[e.jsx(H,{size:16,"aria-hidden":!0,style:{color:"var(--danger)"}}),e.jsx("strong",{children:"Kill this background job?"})]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"This sends SIGTERM to the process. The instance will transition to “killed” status."}),e.jsxs(a,{gap:2,children:[e.jsx(l,{variant:"danger",onClick:()=>{Y(P)},disabled:R,children:"Kill"}),e.jsx(l,{variant:"ghost",onClick:()=>b(null),disabled:R,children:"Cancel"})]})]})})})})]})}function U(s){return e.jsx("div",{style:s.style,children:s.children})}export{he as BackgroundJobsView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackgroundJobsView-D8O-EyMD.js","sources":["../../src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { Play, Pause, RotateCw, Trash2, Terminal, Cpu, Bot, AlertTriangle, CheckCircle2, type LucideIcon } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { WsMessage } from '../../data/types.js';\n\n/**\n * BackgroundJobsView — live background agent instances.\n *\n * Renders `/api/background` (list + status counts), shows per-instance\n * output panels, and exposes pause / resume / retry / kill controls.\n */\n\ntype BgStatus = 'pending' | 'running' | 'paused' | 'done' | 'error' | 'killed' | 'unknown';\n\ninterface BgAction {\n type: string;\n prompt?: string;\n agent?: string;\n command?: string;\n}\n\ninterface BgInstance {\n instanceId: string;\n agent?: string;\n status: BgStatus;\n worktree?: string;\n createdAt?: number;\n startedAt?: number;\n endedAt?: number;\n exitCode?: number;\n error?: string;\n tags?: string[];\n action?: BgAction;\n sessionId?: string;\n pid?: number;\n messageCount?: number;\n lastMessageAt?: number;\n lastError?: { ts: number; message: string };\n toolCalls?: unknown[];\n}\n\ninterface BackgroundResponse {\n instances: BgInstance[];\n status?: { running: number; paused: number; done: number; error: number };\n}\n\nfunction statusIcon(s: BgStatus): LucideIcon {\n switch (s) {\n case 'running': return Play;\n case 'paused': return Pause;\n case 'done': return CheckCircle2;\n case 'error': return AlertTriangle;\n case 'killed': return Trash2;\n default: return Cpu;\n }\n}\n\nfunction statusTone(s: BgStatus): 'neutral' | 'info' | 'success' | 'danger' | 'warning' {\n switch (s) {\n case 'running': return 'info';\n case 'paused': return 'warning';\n case 'done': return 'success';\n case 'error': return 'danger';\n case 'killed': return 'neutral';\n default: return 'neutral';\n }\n}\n\nfunction elapsed(ms?: number): string {\n if (!ms) return '—';\n const s = Math.floor((Date.now() - ms) / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nexport function BackgroundJobsView(): JSX.Element {\n const res = useFetch<BackgroundResponse>('/api/background');\n const [live, setLive] = useState<BgInstance[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [outputLoading, setOutputLoading] = useState<boolean>(false);\n const [busy, setBusy] = useState<boolean>(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const [killConfirm, setKillConfirm] = useState<string | null>(null);\n\n useWsMessage('background:change', useCallback((msg: WsMessage) => {\n const m = msg as { id?: string; status?: string };\n void res.refetch();\n if (m.id && m.id === selectedId) loadOutput(m.id);\n }, [res, selectedId]));\n\n const instances = useMemo<BgInstance[]>(() => [...live, ...(res.data?.instances || [])], [live, res.data]);\n\n const selected = useMemo<BgInstance | null>(() => {\n if (!selectedId) return null;\n return instances.find((i) => i.instanceId === selectedId) ?? null;\n }, [selectedId, instances]);\n\n const loadOutput = async (id: string): Promise<void> => {\n setOutputLoading(true);\n try {\n const data = await fetchJson<{ lines?: string[] }>(`/api/background/${encodeURIComponent(id)}/output?lines=100`);\n setOutputLines(data.lines ?? []);\n } catch {\n setOutputLines([]);\n } finally {\n setOutputLoading(false);\n }\n };\n\n const selectInstance = async (inst: BgInstance): Promise<void> => {\n setSelectedId(inst.instanceId);\n await loadOutput(inst.instanceId);\n };\n\n const refresh = (): void => { void res.refetch(); };\n\n const pauseInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/pause`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const resumeInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/resume`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const retryInstance = async (id: string): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}/retry`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const killInstance = async (id: string): Promise<void> => {\n setActionError(null);\n setBusy(true);\n try {\n await fetchJson(`/api/background/${encodeURIComponent(id)}`, { method: 'DELETE' });\n setKillConfirm(null);\n if (selectedId === id) setSelectedId(null);\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const statusCounts = useMemo(() => {\n const counts: Record<BgStatus, number> = { pending: 0, running: 0, paused: 0, done: 0, error: 0, killed: 0, unknown: 0 };\n for (const i of instances) {\n const s: BgStatus = i.status || 'unknown';\n counts[s] = (counts[s] ?? 0) + 1;\n }\n return counts;\n }, [instances]);\n\n return (\n <Stack gap={5} data-testid=\"background-view\">\n <ViewHeader\n title=\"Background Jobs\"\n description=\"Live background agent sessions. Pause, resume, retry, or kill.\"\n />\n\n {actionError !== null && (\n <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 var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {actionError}\n </div>\n )}\n\n {/* Status summary bar */}\n {instances.length > 0 && (\n <Inline gap={3} wrap>\n {(['running', 'paused', 'pending', 'done', 'error'] as BgStatus[]).map((s) => {\n const count = statusCounts[s];\n if (count === 0) return null;\n const Icon = statusIcon(s);\n return (\n <Inline key={s} align=\"center\" gap={2} style={{ padding: '4px 10px', background: 'var(--surface-1)', borderRadius: 'var(--radius-pill)', border: '1px solid var(--border)' }}>\n <Icon size={12} aria-hidden style={{ color: `var(--${statusTone(s) === 'neutral' ? 'fg-muted' : statusTone(s)})` }} />\n <span style={{ fontSize: 'var(--fs-12)' }}>{s}</span>\n <Badge tone={statusTone(s)}>{count}</Badge>\n </Inline>\n );\n })}\n </Inline>\n )}\n\n {res.loading && instances.length === 0 ? (\n <Skeleton style={{ height: 240 }} />\n ) : instances.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={1} align=\"center\">\n <Cpu size={32} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong>No background jobs</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Background agents appear here when spawned.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Box style={{ display: 'grid', gridTemplateColumns: selected ? '1fr 380px' : '1fr', gap: 'var(--space-4)' }}>\n {/* Instance list */}\n <Stack gap={2}>\n {instances.map((inst) => {\n const s: BgStatus = inst.status || 'unknown';\n const Icon = statusIcon(s);\n const isSelected = inst.instanceId === selectedId;\n return (\n <Card\n key={inst.instanceId}\n data-testid={`bg-instance-${inst.instanceId}`}\n style={{\n cursor: 'pointer',\n outline: isSelected ? '2px solid var(--accent)' : undefined,\n outlineOffset: -2,\n }}\n onClick={() => { void selectInstance(inst); }}\n >\n <CardBody>\n <Inline align=\"center\" gap={3}>\n <Icon\n size={16}\n aria-hidden\n style={{ color: `var(--${statusTone(s) === 'neutral' ? 'fg-muted' : statusTone(s)})` }}\n />\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-14)' }}>\n {inst.agent ?? inst.instanceId.slice(0, 8)}\n </strong>\n <Badge tone={statusTone(s)}>{s}</Badge>\n {inst.tags?.map((t) => (\n <Badge key={t} tone=\"neutral\">{t}</Badge>\n ))}\n </Inline>\n <Inline gap={3}>\n {inst.worktree && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {inst.worktree}\n </span>\n )}\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {elapsed(inst.startedAt ?? inst.createdAt)}\n </span>\n {inst.pid && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n pid {inst.pid}\n </span>\n )}\n </Inline>\n </Stack>\n {/* Action buttons — stop propagation so clicking doesn't navigate away */}\n <Inline\n gap={1}\n align=\"center\"\n onClick={(e) => e.stopPropagation()}\n >\n {s === 'running' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void pauseInstance(inst.instanceId); }}\n data-testid={`bg-pause-${inst.instanceId}`}\n title=\"Pause\"\n >\n <Pause size={12} aria-hidden />\n </Button>\n )}\n {s === 'paused' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void resumeInstance(inst.instanceId); }}\n data-testid={`bg-resume-${inst.instanceId}`}\n title=\"Resume\"\n >\n <Play size={12} aria-hidden />\n </Button>\n )}\n {(s === 'error' || s === 'killed') && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void retryInstance(inst.instanceId); }}\n data-testid={`bg-retry-${inst.instanceId}`}\n title=\"Retry\"\n >\n <RotateCw size={12} aria-hidden />\n </Button>\n )}\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={() => setKillConfirm(inst.instanceId)}\n data-testid={`bg-kill-${inst.instanceId}`}\n title=\"Kill\"\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n\n {/* Output panel */}\n {selected && (\n <Card>\n <CardBody>\n <Stack gap={3}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <Terminal size={12} aria-hidden />\n <span style={{ fontSize: 'var(--fs-13)', fontWeight: 600 }}>Output</span>\n </Inline>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { if (selected) void loadOutput(selected.instanceId); }}\n >\n <RotateCw size={12} aria-hidden />\n </Button>\n </Inline>\n\n {outputLoading ? (\n <Skeleton style={{ height: 160 }} />\n ) : outputLines.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>No output captured yet.</span>\n ) : (\n <Box\n style={{\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-3)',\n maxHeight: 320,\n overflowY: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: 1.6,\n }}\n >\n {outputLines.map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n </Box>\n )}\n </Stack>\n </CardBody>\n </Card>\n )}\n </Box>\n )}\n\n {/* Kill confirmation inline dialog */}\n {killConfirm && (\n <div\n role=\"dialog\"\n aria-modal\n style={{\n position: 'fixed',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0,0,0,0.4)',\n zIndex: 100,\n }}\n data-testid=\"bg-kill-confirm\"\n >\n <Card style={{ maxWidth: 400 }}>\n <CardBody>\n <Stack gap={4}>\n <Inline align=\"center\" gap={2}>\n <AlertTriangle size={16} aria-hidden style={{ color: 'var(--danger)' }} />\n <strong>Kill this background job?</strong>\n </Inline>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n This sends SIGTERM to the process. The instance will transition to &ldquo;killed&rdquo; status.\n </span>\n <Inline gap={2}>\n <Button\n variant=\"danger\"\n onClick={() => { void killInstance(killConfirm); }}\n disabled={busy}\n >\n Kill\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setKillConfirm(null)}\n disabled={busy}\n >\n Cancel\n </Button>\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n </div>\n )}\n </Stack>\n );\n}\n\nfunction Box(props: { children?: React.ReactNode; style?: React.CSSProperties }): JSX.Element {\n return <div style={props.style}>{props.children}</div>;\n}\n"],"names":["statusIcon","Play","Pause","CheckCircle2","AlertTriangle","Trash2","Cpu","statusTone","elapsed","ms","s","m","BackgroundJobsView","res","useFetch","live","setLive","useState","selectedId","setSelectedId","outputLines","setOutputLines","outputLoading","setOutputLoading","busy","setBusy","actionError","setActionError","killConfirm","setKillConfirm","useWsMessage","useCallback","msg","loadOutput","instances","useMemo","_a","selected","i","id","data","fetchJson","selectInstance","inst","refresh","pauseInstance","err","FetchError","resumeInstance","retryInstance","killInstance","statusCounts","counts","jsxs","Stack","jsx","ViewHeader","Inline","count","Icon","Badge","Skeleton","Card","CardBody","Box","isSelected","t","e","Button","RotateCw","Terminal","line","props"],"mappings":"6fAwDA,SAASA,EAAW,EAAyB,CAC3C,OAAQ,EAAA,CACN,IAAK,UAAW,OAAOC,EACvB,IAAK,SAAU,OAAOC,EACtB,IAAK,OAAQ,OAAOC,GACpB,IAAK,QAAS,OAAOC,EACrB,IAAK,SAAU,OAAOC,EACtB,QAAS,OAAOC,CAAA,CAEpB,CAEA,SAASC,EAAW,EAAoE,CACtF,OAAQ,EAAA,CACN,IAAK,UAAW,MAAO,OACvB,IAAK,SAAU,MAAO,UACtB,IAAK,OAAQ,MAAO,UACpB,IAAK,QAAS,MAAO,SACrB,IAAK,SAAU,MAAO,UACtB,QAAS,MAAO,SAAA,CAEpB,CAEA,SAASC,GAAQC,EAAqB,CACpC,GAAI,CAACA,EAAI,MAAO,IAChB,MAAMC,EAAI,KAAK,OAAO,KAAK,IAAA,EAAQD,GAAM,GAAI,EAC7C,GAAIC,EAAI,GAAI,MAAO,GAAGA,CAAC,IACvB,MAAMC,EAAI,KAAK,MAAMD,EAAI,EAAE,EAC3B,OAAIC,EAAI,GAAW,GAAGA,CAAC,KAAKD,EAAI,EAAE,IAE3B,GADG,KAAK,MAAMC,EAAI,EAAE,CAChB,KAAKA,EAAI,EAAE,GACxB,CAEO,SAASC,IAAkC,CAChD,MAAMC,EAAMC,EAA6B,iBAAiB,EACpD,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAuB,CAAA,CAAE,EAC3C,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAmB,CAAA,CAAE,EACrD,CAACK,EAAeC,CAAgB,EAAIN,EAAAA,SAAkB,EAAK,EAC3D,CAACO,EAAMC,CAAO,EAAIR,EAAAA,SAAkB,EAAK,EACzC,CAACS,EAAaC,CAAc,EAAIV,EAAAA,SAAwB,IAAI,EAC5D,CAACW,EAAaC,CAAc,EAAIZ,EAAAA,SAAwB,IAAI,EAElEa,EAAa,oBAAqBC,cAAaC,GAAmB,CAChE,MAAMrB,EAAIqB,EACLnB,EAAI,QAAA,EACLF,EAAE,IAAMA,EAAE,KAAOO,GAAYe,EAAWtB,EAAE,EAAE,CAClD,EAAG,CAACE,EAAKK,CAAU,CAAC,CAAC,EAErB,MAAMgB,EAAYC,EAAAA,QAAsB,IAAA,OAAM,OAAC,GAAGpB,EAAM,KAAIqB,EAAAvB,EAAI,OAAJ,YAAAuB,EAAU,YAAa,CAAA,CAAG,GAAG,CAACrB,EAAMF,EAAI,IAAI,CAAC,EAEnGwB,EAAWF,EAAAA,QAA2B,IACrCjB,EACEgB,EAAU,KAAMI,GAAMA,EAAE,aAAepB,CAAU,GAAK,KADrC,KAEvB,CAACA,EAAYgB,CAAS,CAAC,EAEpBD,EAAa,MAAOM,GAA8B,CACtDhB,EAAiB,EAAI,EACrB,GAAI,CACF,MAAMiB,EAAO,MAAMC,EAAgC,mBAAmB,mBAAmBF,CAAE,CAAC,mBAAmB,EAC/GlB,EAAemB,EAAK,OAAS,EAAE,CACjC,MAAQ,CACNnB,EAAe,CAAA,CAAE,CACnB,QAAA,CACEE,EAAiB,EAAK,CACxB,CACF,EAEMmB,EAAiB,MAAOC,GAAoC,CAChExB,EAAcwB,EAAK,UAAU,EAC7B,MAAMV,EAAWU,EAAK,UAAU,CAClC,EAEMC,EAAU,IAAY,CAAO/B,EAAI,QAAA,CAAW,EAE5CgC,EAAgB,MAAON,GAA8B,CACzDZ,EAAe,IAAI,EACnB,GAAI,CACF,MAAMc,EAAU,mBAAmB,mBAAmBF,CAAE,CAAC,SAAU,CAAE,OAAQ,OAAQ,EACrFK,EAAA,CACF,OAASE,EAAK,CACZnB,EAAemB,aAAeC,EAAaD,EAAI,QAAU,OAAOA,CAAG,CAAC,CACtE,CACF,EAEME,EAAiB,MAAOT,GAA8B,CAC1DZ,EAAe,IAAI,EACnB,GAAI,CACF,MAAMc,EAAU,mBAAmB,mBAAmBF,CAAE,CAAC,UAAW,CAAE,OAAQ,OAAQ,EACtFK,EAAA,CACF,OAASE,EAAK,CACZnB,EAAemB,aAAeC,EAAaD,EAAI,QAAU,OAAOA,CAAG,CAAC,CACtE,CACF,EAEMG,EAAgB,MAAOV,GAA8B,CACzDZ,EAAe,IAAI,EACnB,GAAI,CACF,MAAMc,EAAU,mBAAmB,mBAAmBF,CAAE,CAAC,SAAU,CAAE,OAAQ,OAAQ,EACrFK,EAAA,CACF,OAASE,EAAK,CACZnB,EAAemB,aAAeC,EAAaD,EAAI,QAAU,OAAOA,CAAG,CAAC,CACtE,CACF,EAEMI,EAAe,MAAOX,GAA8B,CACxDZ,EAAe,IAAI,EACnBF,EAAQ,EAAI,EACZ,GAAI,CACF,MAAMgB,EAAU,mBAAmB,mBAAmBF,CAAE,CAAC,GAAI,CAAE,OAAQ,SAAU,EACjFV,EAAe,IAAI,EACfX,IAAeqB,GAAIpB,EAAc,IAAI,EACzCyB,EAAA,CACF,OAASE,EAAK,CACZnB,EAAemB,aAAeC,EAAaD,EAAI,QAAU,OAAOA,CAAG,CAAC,CACtE,QAAA,CACErB,EAAQ,EAAK,CACf,CACF,EAEM0B,EAAehB,EAAAA,QAAQ,IAAM,CACjC,MAAMiB,EAAmC,CAAE,QAAS,EAAG,QAAS,EAAG,OAAQ,EAAG,KAAM,EAAG,MAAO,EAAG,OAAQ,EAAG,QAAS,CAAA,EACrH,UAAWd,KAAKJ,EAAW,CACzB,MAAMxB,EAAc4B,EAAE,QAAU,UAChCc,EAAO1C,CAAC,GAAK0C,EAAO1C,CAAC,GAAK,GAAK,CACjC,CACA,OAAO0C,CACT,EAAG,CAAClB,CAAS,CAAC,EAEd,OACEmB,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,kBACzB,SAAA,CAAAC,EAAAA,IAACC,GAAA,CACC,MAAM,kBACN,YAAY,gEAAA,CAAA,EAGb9B,IAAgB,MACf6B,MAAC,MAAA,CAAI,KAAK,QAAQ,MAAO,CAAE,QAAS,gCAAiC,WAAY,2DAA4D,OAAQ,0BAA2B,aAAc,mBAAoB,SAAU,eAAgB,MAAO,eAAA,EAChP,SAAA7B,CAAA,CACH,EAIDQ,EAAU,OAAS,SACjBuB,EAAA,CAAO,IAAK,EAAG,KAAI,GAChB,SAAA,CAAC,UAAW,SAAU,UAAW,OAAQ,OAAO,EAAiB,IAAK/C,GAAM,CAC5E,MAAMgD,EAAQP,EAAazC,CAAC,EAC5B,GAAIgD,IAAU,EAAG,OAAO,KACxB,MAAMC,EAAO3D,EAAWU,CAAC,EACzB,cACG+C,EAAA,CAAe,MAAM,SAAS,IAAK,EAAG,MAAO,CAAE,QAAS,WAAY,WAAY,mBAAoB,aAAc,qBAAsB,OAAQ,2BAC/I,SAAA,CAAAF,MAACI,GAAK,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,SAASpD,EAAWG,CAAC,IAAM,UAAY,WAAaH,EAAWG,CAAC,CAAC,KAAO,QACnH,OAAA,CAAK,MAAO,CAAE,SAAU,cAAA,EAAmB,SAAAA,EAAE,QAC7CkD,EAAA,CAAM,KAAMrD,EAAWG,CAAC,EAAI,SAAAgD,CAAA,CAAM,CAAA,CAAA,EAHxBhD,CAIb,CAEJ,CAAC,CAAA,CACH,EAGDG,EAAI,SAAWqB,EAAU,SAAW,QAClC2B,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAA,CAAI,CAAG,EAChC3B,EAAU,SAAW,EACvBqB,EAAAA,IAACO,EAAA,CACC,SAAAP,EAAAA,IAACQ,EAAA,CACC,SAAAV,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,MAAM,SACnB,SAAA,CAAAC,EAAAA,IAACjD,EAAA,CAAI,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,iBAAA,CAAkB,CAAG,EAChEiD,EAAAA,IAAC,UAAO,SAAA,oBAAA,CAAkB,EAC1BA,EAAAA,IAAC,QAAK,MAAO,CAAE,MAAO,kBAAmB,SAAU,cAAA,EAAkB,SAAA,6CAAA,CAErE,CAAA,CAAA,CACF,CAAA,CACF,EACF,EAEAF,EAAAA,KAACW,GAAI,MAAO,CAAE,QAAS,OAAQ,oBAAqB3B,EAAW,YAAc,MAAO,IAAK,kBAEvF,SAAA,CAAAkB,MAACD,GAAM,IAAK,EACT,SAAApB,EAAU,IAAKS,GAAS,OACvB,MAAMjC,EAAciC,EAAK,QAAU,UAC7BgB,EAAO3D,EAAWU,CAAC,EACnBuD,EAAatB,EAAK,aAAezB,EACvC,OACEqC,EAAAA,IAACO,EAAA,CAEC,cAAa,eAAenB,EAAK,UAAU,GAC3C,MAAO,CACL,OAAQ,UACR,QAASsB,EAAa,0BAA4B,OAClD,cAAe,EAAA,EAEjB,QAAS,IAAM,CAAOvB,EAAeC,CAAI,CAAG,EAE5C,eAACoB,EAAA,CACC,SAAAV,EAAAA,KAACI,GAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAACI,EAAA,CACC,KAAM,GACN,cAAW,GACX,MAAO,CAAE,MAAO,SAASpD,EAAWG,CAAC,IAAM,UAAY,WAAaH,EAAWG,CAAC,CAAC,GAAA,CAAI,CAAA,EAEvF2C,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,KAAM,EAAG,SAAU,CAAA,EACzC,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,SAAU,cAAA,EACxB,SAAAZ,EAAK,OAASA,EAAK,WAAW,MAAM,EAAG,CAAC,EAC3C,QACCiB,EAAA,CAAM,KAAMrD,EAAWG,CAAC,EAAI,SAAAA,EAAE,GAC9B0B,EAAAO,EAAK,OAAL,YAAAP,EAAW,IAAK8B,GACfX,EAAAA,IAACK,EAAA,CAAc,KAAK,UAAW,SAAAM,CAAA,EAAnBA,CAAqB,EAClC,EACH,EACAb,EAAAA,KAACI,EAAA,CAAO,IAAK,EACV,SAAA,CAAAd,EAAK,UACJY,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC7C,SAAAZ,EAAK,QAAA,CACR,EAEFY,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC7C,SAAA/C,GAAQmC,EAAK,WAAaA,EAAK,SAAS,EAC3C,EACCA,EAAK,KACJU,OAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,CAAA,OAC9DV,EAAK,GAAA,CAAA,CACZ,CAAA,CAAA,CAEJ,CAAA,EACF,EAEAU,EAAAA,KAACI,EAAA,CACC,IAAK,EACL,MAAM,SACN,QAAUU,GAAMA,EAAE,gBAAA,EAEjB,SAAA,CAAAzD,IAAM,WACL6C,EAAAA,IAACa,EAAA,CACC,QAAQ,YACR,KAAK,KACL,QAAS,IAAM,CAAOvB,EAAcF,EAAK,UAAU,CAAG,EACtD,cAAa,YAAYA,EAAK,UAAU,GACxC,MAAM,QAEN,SAAAY,EAAAA,IAACrD,EAAA,CAAM,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,EAGhCQ,IAAM,UACL6C,EAAAA,IAACa,EAAA,CACC,QAAQ,YACR,KAAK,KACL,QAAS,IAAM,CAAOpB,EAAeL,EAAK,UAAU,CAAG,EACvD,cAAa,aAAaA,EAAK,UAAU,GACzC,MAAM,SAEN,SAAAY,EAAAA,IAACtD,EAAA,CAAK,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,GAG9BS,IAAM,SAAWA,IAAM,WACvB6C,EAAAA,IAACa,EAAA,CACC,QAAQ,YACR,KAAK,KACL,QAAS,IAAM,CAAOnB,EAAcN,EAAK,UAAU,CAAG,EACtD,cAAa,YAAYA,EAAK,UAAU,GACxC,MAAM,QAEN,SAAAY,EAAAA,IAACc,EAAA,CAAS,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,EAGpCd,EAAAA,IAACa,EAAA,CACC,QAAQ,SACR,KAAK,KACL,QAAS,IAAMvC,EAAec,EAAK,UAAU,EAC7C,cAAa,WAAWA,EAAK,UAAU,GACvC,MAAM,OAEN,SAAAY,EAAAA,IAAClD,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAAA,EA5FKsC,EAAK,UAAA,CA+FhB,CAAC,CAAA,CACH,EAGCN,SACEyB,EAAA,CACC,SAAAP,EAAAA,IAACQ,GACC,SAAAV,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,QAAQ,UAC7B,SAAA,CAAAJ,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAACe,EAAA,CAAS,KAAM,GAAI,cAAW,GAAC,EAChCf,EAAAA,IAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,WAAY,GAAA,EAAO,SAAA,QAAA,CAAM,CAAA,EACpE,EACAA,EAAAA,IAACa,EAAA,CACC,QAAQ,QACR,KAAK,KACL,QAAS,IAAM,CAAM/B,GAAeJ,EAAWI,EAAS,UAAU,CAAG,EAErE,SAAAkB,EAAAA,IAACc,EAAA,CAAS,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,CAClC,EACF,EAEC/C,QACEuC,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAI,CAAG,EAChCzC,EAAY,SAAW,EACzBmC,MAAC,OAAA,CAAK,MAAO,CAAE,MAAO,kBAAmB,SAAU,gBAAkB,SAAA,yBAAA,CAAuB,EAE5FA,EAAAA,IAACS,EAAA,CACC,MAAO,CACL,WAAY,mBACZ,SAAU,eACV,WAAY,mBACZ,OAAQ,0BACR,aAAc,mBACd,QAAS,iBACT,UAAW,IACX,UAAW,OACX,WAAY,WACZ,UAAW,aACX,WAAY,GAAA,EAGb,SAAA5C,EAAY,IAAI,CAACmD,EAAMjC,IACtBiB,MAAC,MAAA,CAAa,SAAAgB,CAAA,EAAJjC,CAAS,CACpB,CAAA,CAAA,CACH,CAAA,CAEJ,EACF,CAAA,CACF,CAAA,EAEJ,EAIDV,GACC2B,EAAAA,IAAC,MAAA,CACC,KAAK,SACL,aAAU,GACV,MAAO,CACL,SAAU,QACV,MAAO,EACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,kBACZ,OAAQ,GAAA,EAEV,cAAY,kBAEZ,SAAAA,EAAAA,IAACO,EAAA,CAAK,MAAO,CAAE,SAAU,GAAA,EACvB,SAAAP,EAAAA,IAACQ,EAAA,CACC,SAAAV,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAACnD,EAAA,CAAc,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,MAAO,eAAA,CAAgB,CAAG,EACxEmD,EAAAA,IAAC,UAAO,SAAA,2BAAA,CAAyB,CAAA,EACnC,EACAA,EAAAA,IAAC,QAAK,MAAO,CAAE,MAAO,kBAAmB,SAAU,cAAA,EAAkB,SAAA,qFAAA,CAErE,EACAF,EAAAA,KAACI,EAAA,CAAO,IAAK,EACX,SAAA,CAAAF,EAAAA,IAACa,EAAA,CACC,QAAQ,SACR,QAAS,IAAM,CAAOlB,EAAatB,CAAW,CAAG,EACjD,SAAUJ,EACX,SAAA,MAAA,CAAA,EAGD+B,EAAAA,IAACa,EAAA,CACC,QAAQ,QACR,QAAS,IAAMvC,EAAe,IAAI,EAClC,SAAUL,EACX,SAAA,QAAA,CAAA,CAED,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CACF,CAAA,CAAA,CACF,EAEJ,CAEJ,CAEA,SAASwC,EAAIQ,EAAiF,CAC5F,aAAQ,MAAA,CAAI,MAAOA,EAAM,MAAQ,WAAM,SAAS,CAClD"}
@@ -0,0 +1 @@
1
+ import{r as c,j as a}from"./cmdk-DVxytz9i.js";import{u as P,a as I,S as o,I as d,d as p,h as v,e as b,B as F,G as R,i as u,F as f}from"./main-CdOm1Pj9.js";import{V as T}from"./ViewHeader-BqIPVKuG.js";import{L}from"./ListHeader-BGjm11Z0.js";import{C as O,b as D}from"./Card-Tyboihu7.js";import{I as V}from"./Input-BbFUDQnS.js";import{E as A}from"./EmptyState-DZ2ouKwd.js";import{S as N,a as G}from"./Sheet-DH-WNJ3Y.js";import{P as H}from"./plus-M6LYiKX8.js";import{R as M}from"./rotate-cw-DHooc0Tx.js";import{T as W}from"./trash-2-CL4khSRv.js";function J(t){return!t||t<=0?"—":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(2)} GB`}function se(){const t=P("/api/backup/list"),[l,g]=c.useState([]),[S,h]=c.useState(!1),[m,x]=c.useState(""),[j,k]=c.useState(!1),[r,i]=c.useState(null),[y,n]=c.useState(null);c.useEffect(()=>{var e;(e=t.data)!=null&&e.backups&&g(t.data.backups)},[t.data]);const C=c.useCallback(e=>{e.type==="backups:change"&&t.refetch()},[t]);I("backups:change",C);const w=async()=>{i("create"),n(null);try{await u("/api/backup/create",{method:"POST",body:{label:m.trim()||null,includeProject:j}}),x(""),k(!1),h(!1),t.refetch()}catch(e){n((e instanceof f,e.message))}finally{i(null)}},z=async e=>{i(e),n(null);try{await u("/api/backup/verify",{method:"POST",body:{backupPath:e}})}catch(s){n((s instanceof f,s.message))}finally{i(null)}},$=async e=>{if(!(typeof window<"u"&&!window.confirm(`Restore from ${e}? This overwrites current settings + tasks.`))){i(e),n(null);try{await u("/api/backup/restore",{method:"POST",body:{backupPath:e,dryRun:!1}})}catch(s){n((s instanceof f,s.message))}finally{i(null)}}},B=async e=>{if(!(typeof window<"u"&&!window.confirm(`Delete backup ${e}?`))){i(e),n(null);try{await u(`/api/backup/${encodeURIComponent(e)}`,{method:"DELETE"}),g(s=>s.filter(E=>E.path!==e))}catch(s){n((s instanceof f,s.message))}finally{i(null)}}};return a.jsxs(o,{gap:5,"data-testid":"backup-view",children:[a.jsx(T,{title:"Backups",description:`${l.length} backup${l.length===1?"":"s"} in ~/.config/bizar/backups/. Create, restore, verify, or delete.`,actions:a.jsxs(d,{gap:2,align:"center",children:[y!==null&&a.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:y}),a.jsxs(p,{variant:"primary",onClick:()=>h(!0),"data-testid":"backup-create-open",children:[a.jsx(H,{size:14,"aria-hidden":!0})," New backup"]})]})}),a.jsx(L,{title:"Snapshots",count:l.length,testid:"backup-list-header"}),t.loading&&l.length===0?a.jsxs(o,{gap:2,children:[a.jsx(v,{style:{height:80}}),a.jsx(v,{style:{height:80}})]}):l.length===0?a.jsx(A,{icon:a.jsx(b,{size:32,"aria-hidden":!0}),title:"No backups yet",description:"Create your first snapshot before risky changes."}):a.jsx(o,{gap:2,children:l.map(e=>a.jsx(O,{variant:"default",children:a.jsx(D,{children:a.jsxs(d,{align:"center",justify:"between",gap:3,children:[a.jsxs(o,{gap:1,style:{flex:1,minWidth:0},children:[a.jsxs(d,{align:"center",gap:2,children:[a.jsx(b,{size:14,"aria-hidden":!0}),a.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:e.label||e.path.split("/").pop()}),e.includesProject&&a.jsx(F,{tone:"info",children:"project"})]}),a.jsxs(d,{align:"center",gap:3,style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:[a.jsx("span",{children:J(e.size)}),a.jsx("span",{children:e.createdAt?new Date(e.createdAt).toLocaleString():""})]})]}),a.jsxs(d,{gap:1,children:[a.jsxs(p,{variant:"ghost",onClick:()=>void z(e.path),disabled:r===e.path,"data-testid":`backup-verify-${e.path}`,children:[a.jsx(R,{size:12,"aria-hidden":!0})," Verify"]}),a.jsxs(p,{variant:"ghost",onClick:()=>void $(e.path),disabled:r===e.path,"data-testid":`backup-restore-${e.path}`,children:[a.jsx(M,{size:12,"aria-hidden":!0})," Restore"]}),a.jsxs(p,{variant:"ghost",onClick:()=>void B(e.path),disabled:r===e.path,"data-testid":`backup-delete-${e.path}`,children:[a.jsx(W,{size:12,"aria-hidden":!0})," Delete"]})]})]})})},e.path))}),a.jsx(N,{open:S,onOpenChange:e=>{e||h(!1)},children:a.jsx(G,{side:"right",title:"New backup",children:a.jsxs(o,{gap:4,style:{padding:"var(--space-4)"},children:[a.jsxs(o,{gap:2,children:[a.jsx("label",{htmlFor:"backup-label",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Label (optional)"}),a.jsx(V,{id:"backup-label",value:m,onChange:e=>x(e.target.value),placeholder:"e.g. pre-v9.2.0",disabled:r==="create","data-testid":"backup-create-label"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[a.jsx("input",{type:"checkbox",checked:j,onChange:e=>k(e.target.checked),disabled:r==="create","data-testid":"backup-create-include-project"}),a.jsx("span",{style:{fontSize:"var(--fs-13)"},children:"Include project files (larger snapshot)"})]}),a.jsxs(d,{gap:2,children:[a.jsx(p,{variant:"primary",onClick:()=>void w(),disabled:r==="create","data-testid":"backup-create-submit",children:r==="create"?"Creating…":"Create backup"}),a.jsx(p,{variant:"ghost",onClick:()=>h(!1),disabled:r==="create",children:"Cancel"})]})]})})})]})}export{se as BackupView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackupView-uwXkhxOV.js","sources":["../../src/web/v8/views/Backup/BackupView.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { Archive, Plus, Trash2, RotateCw, ShieldCheck, FileText } 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 { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.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 * BackupView — Sprint S35. Snapshot creation, restore, verify, delete.\n */\n\ninterface BackupEntry {\n path: string;\n label?: string;\n size?: number;\n createdAt?: string;\n includesProject?: boolean;\n}\n\nfunction fmtSize(bytes: number | undefined): string {\n if (!bytes || bytes <= 0) return '—';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\nexport function BackupView(): JSX.Element {\n const list = useFetch<{ ok: boolean; backups: BackupEntry[] }>('/api/backup/list');\n const [items, setItems] = useState<BackupEntry[]>([]);\n const [createOpen, setCreateOpen] = useState(false);\n const [label, setLabel] = useState('');\n const [includeProject, setIncludeProject] = useState(false);\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (list.data?.backups) setItems(list.data.backups);\n }, [list.data]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type === 'backups:change') void list.refetch();\n }, [list]);\n useWsMessage('backups:change', onChange);\n\n const create = async (): Promise<void> => {\n setBusy('create');\n setError(null);\n try {\n await fetchJson('/api/backup/create', { method: 'POST', body: { label: label.trim() || null, includeProject } });\n setLabel('');\n setIncludeProject(false);\n setCreateOpen(false);\n void list.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 verify = async (path: string): Promise<void> => {\n setBusy(path);\n setError(null);\n try {\n await fetchJson('/api/backup/verify', { method: 'POST', body: { backupPath: path } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const restore = async (path: string): Promise<void> => {\n if (typeof window !== 'undefined' && !window.confirm(`Restore from ${path}? This overwrites current settings + tasks.`)) return;\n setBusy(path);\n setError(null);\n try {\n await fetchJson('/api/backup/restore', { method: 'POST', body: { backupPath: path, dryRun: false } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n const remove = async (path: string): Promise<void> => {\n if (typeof window !== 'undefined' && !window.confirm(`Delete backup ${path}?`)) return;\n setBusy(path);\n setError(null);\n try {\n await fetchJson(`/api/backup/${encodeURIComponent(path)}`, { method: 'DELETE' });\n setItems((prev) => prev.filter((b) => b.path !== path));\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"backup-view\">\n <ViewHeader\n title=\"Backups\"\n description={`${items.length} backup${items.length === 1 ? '' : 's'} in ~/.config/bizar/backups/. Create, restore, verify, or delete.`}\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=\"primary\" onClick={() => setCreateOpen(true)} data-testid=\"backup-create-open\">\n <Plus size={14} aria-hidden /> New backup\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Snapshots\" count={items.length} testid=\"backup-list-header\" />\n {list.loading && items.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 80 }} />\n <Skeleton style={{ height: 80 }} />\n </Stack>\n ) : items.length === 0 ? (\n <EmptyState\n icon={<Archive size={32} aria-hidden />}\n title=\"No backups yet\"\n description=\"Create your first snapshot before risky changes.\"\n />\n ) : (\n <Stack gap={2}>\n {items.map((b) => (\n <Card key={b.path} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <Archive size={14} aria-hidden />\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{b.label || b.path.split('/').pop()}</strong>\n {b.includesProject && <Badge tone=\"info\">project</Badge>}\n </Inline>\n <Inline align=\"center\" gap={3} style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n <span>{fmtSize(b.size)}</span>\n <span>{b.createdAt ? new Date(b.createdAt).toLocaleString() : ''}</span>\n </Inline>\n </Stack>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => void verify(b.path)} disabled={busy === b.path} data-testid={`backup-verify-${b.path}`}>\n <ShieldCheck size={12} aria-hidden /> Verify\n </Button>\n <Button variant=\"ghost\" onClick={() => void restore(b.path)} disabled={busy === b.path} data-testid={`backup-restore-${b.path}`}>\n <RotateCw size={12} aria-hidden /> Restore\n </Button>\n <Button variant=\"ghost\" onClick={() => void remove(b.path)} disabled={busy === b.path} data-testid={`backup-delete-${b.path}`}>\n <Trash2 size={12} aria-hidden /> Delete\n </Button>\n </Inline>\n </Inline>\n </CardBody>\n </Card>\n ))}\n </Stack>\n )}\n\n <Sheet open={createOpen} onOpenChange={(o) => { if (!o) setCreateOpen(false); }}>\n <SheetContent side=\"right\" title=\"New backup\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"backup-label\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Label (optional)</label>\n <Input\n id=\"backup-label\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"e.g. pre-v9.2.0\"\n disabled={busy === 'create'}\n data-testid=\"backup-create-label\"\n />\n </Stack>\n <label style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <input type=\"checkbox\" checked={includeProject} onChange={(e) => setIncludeProject(e.target.checked)} disabled={busy === 'create'} data-testid=\"backup-create-include-project\" />\n <span style={{ fontSize: 'var(--fs-13)' }}>Include project files (larger snapshot)</span>\n </label>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => void create()} disabled={busy === 'create'} data-testid=\"backup-create-submit\">\n {busy === 'create' ? 'Creating…' : 'Create backup'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateOpen(false)} disabled={busy === 'create'}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["fmtSize","bytes","BackupView","list","useFetch","items","setItems","useState","createOpen","setCreateOpen","label","setLabel","includeProject","setIncludeProject","busy","setBusy","error","setError","useEffect","_a","onChange","useCallback","msg","useWsMessage","create","fetchJson","err","FetchError","verify","path","restore","remove","prev","b","jsxs","Stack","jsx","ViewHeader","Inline","Button","Plus","ListHeader","Skeleton","EmptyState","Archive","Card","CardBody","Badge","ShieldCheck","RotateCw","Trash2","Sheet","o","SheetContent","Input"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as d,j as o}from"./cmdk-DVxytz9i.js";import{g as n}from"./main-CdOm1Pj9.js";const f={default:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"none"},elevated:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"var(--shadow-2)"},ghost:{background:"transparent",border:"1px solid transparent",boxShadow:"none"},outlined:{background:"var(--surface-0)",border:"1px solid var(--border)",boxShadow:"none"}},x=d.forwardRef(function(s,t){const{variant:r="default",flush:a,interactive:e,className:c,style:l,...v}=s;return o.jsx("div",{ref:t,className:n("v8-card",`v8-card--${r}`,e&&"is-interactive",c),style:{borderRadius:"var(--radius-lg)",padding:a===!0?0:"var(--density-card-pad)",cursor:e===!0?"pointer":void 0,transition:e===!0?"border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)":void 0,...f[r],...l},...v})}),m=d.forwardRef(function(s,t){const{title:r,description:a,action:e,className:c,style:l,...v}=s;return o.jsxs("div",{ref:t,className:n("v8-card__header",c),style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-3)",marginBottom:"var(--space-3)",...l},...v,children:[o.jsxs("div",{style:{flex:1,minWidth:0},children:[o.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)"},children:r}),a!==void 0&&o.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:2},children:a})]}),e!==void 0&&o.jsx("div",{style:{flexShrink:0},children:e})]})}),b=d.forwardRef(function(s,t){const{className:r,...a}=s;return o.jsx("div",{ref:t,className:n("v8-card__body",r),...a})});d.forwardRef(function(s,t){const{className:r,style:a,...e}=s;return o.jsx("div",{ref:t,className:n("v8-card__footer",r),style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:"var(--space-2)",marginTop:"var(--space-3)",paddingTop:"var(--space-3)",borderTop:"1px solid var(--border)",...a},...e})});export{x as C,m as a,b};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card-Tyboihu7.js","sources":["../../src/web/v8/ui/data/Card.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Card — the v8 surface primitive.\n *\n * Variants:\n * - default: bordered, --surface-1 background, used for kanban cards, settings groups.\n * - elevated: --surface-1 background + shadow, used for popovers/dropdowns hovering over content.\n * - ghost: no border, transparent background, used inside other Cards (nested).\n * - outlined: thicker border, --surface-0 background, used for group containers.\n *\n * All variants have a consistent --radius-lg corner and pad via --density-card-pad.\n * The header / body / footer slots are conventions — pass any children you want.\n */\nexport type CardVariant = 'default' | 'elevated' | 'ghost' | 'outlined';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n variant?: CardVariant;\n /** Removes padding so the child fills the card edge-to-edge. */\n flush?: boolean;\n /** Adds hover lift + cursor pointer for clickable cards. */\n interactive?: boolean;\n children?: ReactNode;\n}\n\nconst VARIANT_STYLE: Record<CardVariant, React.CSSProperties> = {\n default: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n elevated: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'var(--shadow-2)',\n },\n ghost: {\n background: 'transparent',\n border: '1px solid transparent',\n boxShadow: 'none',\n },\n outlined: {\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n};\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(props, ref) {\n const { variant = 'default', flush, interactive, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card', `v8-card--${variant}`, interactive && 'is-interactive', className)}\n style={{\n borderRadius: 'var(--radius-lg)',\n padding: flush === true ? 0 : 'var(--density-card-pad)',\n cursor: interactive === true ? 'pointer' : undefined,\n transition: interactive === true\n ? 'border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)'\n : undefined,\n ...VARIANT_STYLE[variant],\n ...style,\n }}\n {...rest}\n />\n );\n});\n\n/** Card header — title row + optional actions. */\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n props,\n ref,\n) {\n const { title, description, action, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__header', className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 'var(--space-3)',\n marginBottom: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {description}\n </div>\n )}\n </div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});\n\n/** Card body — main content slot. */\nexport const CardBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardBody(props, ref) {\n const { className, ...rest } = props;\n return <div ref={ref} className={cx('v8-card__body', className)} {...rest} />;\n },\n);\n\n/** Card footer — typically action buttons right-aligned. */\nexport const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardFooter(props, ref) {\n const { className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__footer', className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 'var(--space-2)',\n marginTop: 'var(--space-3)',\n paddingTop: 'var(--space-3)',\n borderTop: '1px solid var(--border)',\n ...style,\n }}\n {...rest}\n />\n );\n },\n);"],"names":["VARIANT_STYLE","Card","forwardRef","props","ref","variant","flush","interactive","className","style","rest","jsx","cx","CardHeader","title","description","action","jsxs","CardBody"],"mappings":"qFA0BA,MAAMA,EAA0D,CAC9D,QAAS,CACP,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,iBAAA,EAEb,MAAO,CACL,WAAY,cACZ,OAAQ,wBACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,CAEf,EAEaC,EAAOC,EAAAA,WAAsC,SAAcC,EAAOC,EAAK,CAClF,KAAM,CAAE,QAAAC,EAAU,UAAW,MAAAC,EAAO,YAAAC,EAAa,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASP,EAC/E,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,UAAW,YAAYP,CAAO,GAAIE,GAAe,iBAAkBC,CAAS,EAC1F,MAAO,CACL,aAAc,mBACd,QAASF,IAAU,GAAO,EAAI,0BAC9B,OAAQC,IAAgB,GAAO,UAAY,OAC3C,WAAYA,IAAgB,GACxB,+IACA,OACJ,GAAGP,EAAcK,CAAO,EACxB,GAAGI,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CAAC,EASYG,EAAaX,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAU,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAR,EAAW,MAAAC,EAAO,GAAGC,GAASP,EAClE,OACEc,EAAAA,KAAC,MAAA,CACC,IAAAb,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,aACZ,eAAgB,gBAChB,IAAK,iBACL,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEJ,SAAA,CAAAO,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAN,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAG,CAAA,CAAM,EACrFC,IAAgB,QACfJ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAI,CAAA,CACH,CAAA,EAEJ,EACCC,IAAW,QAAaL,MAAC,MAAA,CAAI,MAAO,CAAE,WAAY,CAAA,EAAM,SAAAK,CAAA,CAAO,CAAA,CAAA,CAAA,CAGtE,CAAC,EAGYE,EAAWhB,EAAAA,WACtB,SAAkBC,EAAOC,EAAK,CAC5B,KAAM,CAAE,UAAAI,EAAW,GAAGE,CAAA,EAASP,EAC/B,OAAOQ,MAAC,OAAI,IAAAP,EAAU,UAAWQ,EAAG,gBAAiBJ,CAAS,EAAI,GAAGE,EAAM,CAC7E,CACF,EAG0BR,EAAAA,WACxB,SAAoBC,EAAOC,EAAK,CAC9B,KAAM,CAAE,UAAAI,EAAW,MAAAC,EAAO,GAAGC,GAASP,EACtC,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,IAAK,iBACL,UAAW,iBACX,WAAY,iBACZ,UAAW,0BACX,GAAGC,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CACF"}
@@ -0,0 +1,9 @@
1
+ import{r as c,j as t}from"./cmdk-DVxytz9i.js";import{c as V,u as R,a as J,S as T,I as w,d as S,G as q,h as $,i as D,F as I}from"./main-CdOm1Pj9.js";import{V as K}from"./ViewHeader-BqIPVKuG.js";import{C as A,b as H}from"./Card-Tyboihu7.js";import{T as G}from"./Textarea-qYDf3yds.js";import{E as L}from"./EmptyState-DZ2ouKwd.js";import{E as Y,M as W}from"./MessageBubble-5vUAquDx.js";import{R as _}from"./refresh-cw-1RBqDKgJ.js";import{S as Q}from"./send-xgy3RAi7.js";/**
2
+ * @license lucide-react v0.460.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const B=V("MessageSquarePlus",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}],["path",{d:"M12 7v6",key:"lw1j43"}],["path",{d:"M9 10h6",key:"9gxzsh"}]]);async function U(a,k,d){const{signal:i,onChunk:u,onEvent:g,onDone:l,onError:h}=d;try{const n=await fetch(a,{...k,signal:i});if(!n.ok||n.body===null)throw new Error(`HTTP ${n.status} reading ${a}`);const E=n.body.getReader(),b=new TextDecoder;let m="",C=!1;for(;!C&&!(i!=null&&i.aborted);){const{value:o,done:M}=await E.read();if(M)break;m+=b.decode(o,{stream:!0});const v=m.split(`
7
+
8
+ `);m=v.pop()??"";for(const x of v){const P=x.split(`
9
+ `).filter(f=>f.length>0);let p="",y="message";for(const f of P)f.startsWith("data:")?p+=f.slice(5).trim():f.startsWith("event:")&&(y=f.slice(6).trim());if(p.length!==0){if(y==="done"){C=!0,l==null||l();break}y!=="message"?g==null||g(y,p):u==null||u(p)}}}l==null||l()}catch(n){if(i!=null&&i.aborted)return;h==null||h(n instanceof Error?n:new Error(String(n)))}}function oe(){const a=R("/api/chat"),k=R("/api/chat/sessions"),[d,i]=c.useState(null),[u,g]=c.useState([]),[l,h]=c.useState(""),[n,E]=c.useState(""),[b,m]=c.useState(!1),[C,o]=c.useState(null),[M,v]=c.useState(null);c.useEffect(()=>{var e;d===null&&((e=a.data)!=null&&e.sessions.length)&&i(a.data.sessions[0].id)},[a.data,d]),c.useEffect(()=>{if(!a.data||d===null){g([]);return}g(a.data.messages.filter(e=>{var s;return((s=a.data)==null?void 0:s.sessions.find(j=>j.id===d))!==void 0}))},[a.data,d]);const x=c.useMemo(()=>{var e;return(((e=a.data)==null?void 0:e.sessions)??[]).map(s=>({id:s.id,messageCount:s.size>0?Math.floor(s.size/200):0}))},[a.data]),P=c.useCallback(e=>{e.type==="chat:message"&&e.message&&a.refetch()},[a]);J("chat:message",P);const p=async()=>{const e=n.trim();if(!e||b)return;o(null),m(!0),E("");const s={id:`local_${Date.now().toString(36)}`,ts:new Date().toISOString(),role:"user",content:e};g(r=>[...r,s]),h("");const j=new AbortController;try{await U("/api/chat",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({message:e,session:d??void 0})},{signal:j.signal,onChunk:r=>h(z=>z+r),onEvent:(r,z)=>{if(r==="session")try{const O=JSON.parse(z);O.session&&i(O.session)}catch{}else r==="error"&&o(z)},onDone:()=>h(""),onError:r=>o(r.message)}),a.refetch(),k.refetch()}catch(r){o(r instanceof Error?r.message:String(r))}finally{m(!1),h("")}},y=async()=>{var e;o(null);try{const s=await D("/api/chat/sessions",{method:"POST",body:{}});(e=s.session)!=null&&e.id&&(i(s.session.id),a.refetch(),k.refetch())}catch(s){o((s instanceof I,s.message))}},f=async e=>{o(null);try{await D("/api/chat/regenerate",{method:"POST",body:{messageId:e.id,session:d}}),a.refetch()}catch(s){o((s instanceof I,s.message))}},F=async()=>{o(null);try{await D("/api/chat/audit",{method:"POST",body:{session:d}})}catch(e){o((e instanceof I,e.message))}},N=e=>{v(s=>s===e?null:e)};return t.jsxs(T,{gap:4,"data-testid":"chat-view",children:[t.jsx(K,{title:"Chat",description:"Multi-turn Claude Code sessions for the active project. Streams over WebSocket.",actions:t.jsxs(w,{gap:2,align:"center",children:[C!==null&&t.jsx("span",{role:"alert","data-testid":"chat-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:C}),t.jsxs(S,{variant:"ghost",onClick:()=>void a.refetch(),"data-testid":"chat-refresh",children:[t.jsx(_,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(S,{variant:"ghost",onClick:()=>void F(),"data-testid":"chat-audit",children:[t.jsx(q,{size:14,"aria-hidden":!0})," Audit"]}),t.jsxs(S,{variant:"primary",onClick:()=>void y(),"data-testid":"chat-create-session",children:[t.jsx(B,{size:14,"aria-hidden":!0})," New session"]})]})}),t.jsxs(w,{align:"stretch",gap:3,wrap:!1,style:{minHeight:480},children:[t.jsx(A,{variant:"default",style:{width:260,flexShrink:0},children:t.jsx(H,{children:t.jsxs(T,{gap:2,children:[t.jsxs("strong",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Sessions (",x.length,")"]}),a.loading&&x.length===0?t.jsx($,{style:{height:32}}):x.length===0?t.jsx(L,{icon:t.jsx(B,{size:28,"aria-hidden":!0}),title:"No sessions",description:"Create one to start chatting."}):x.map(e=>{const s=e.id===d,j=M===e.id;return t.jsxs("div",{"data-testid":`chat-session-${e.id}`,style:{padding:"var(--space-2)",borderRadius:"var(--radius-sm)",border:s?"1px solid var(--accent)":"1px solid var(--border)",background:s?"color-mix(in oklch, var(--accent) 12%, transparent)":"var(--surface-0)",cursor:"pointer"},onClick:()=>{j||i(e.id)},children:[t.jsxs(w,{align:"center",justify:"between",gap:2,children:[t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:e.id}),t.jsx("button",{type:"button",onClick:r=>{r.stopPropagation(),N(e.id)},"data-testid":`chat-session-delete-${e.id}`,"aria-label":`Delete session ${e.id}`,style:{background:"transparent",border:0,color:"var(--fg-muted)",cursor:"pointer",fontSize:"var(--fs-11)"},children:"×"})]}),e.messageCount!==void 0&&t.jsxs("div",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:[e.messageCount," messages"]}),j&&t.jsxs(w,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(S,{variant:"danger",onClick:r=>{r.stopPropagation(),v(null)},"data-testid":`chat-session-confirm-delete-${e.id}`,children:"Confirm delete"}),t.jsx(S,{variant:"ghost",onClick:r=>{r.stopPropagation(),v(null)},"data-testid":`chat-session-cancel-delete-${e.id}`,children:"Cancel"})]})]},e.id)})]})})}),t.jsx(A,{variant:"default",style:{flex:1,minWidth:0},children:t.jsx(H,{children:t.jsxs(T,{gap:2,style:{height:"100%"},children:[t.jsx("div",{"data-testid":"chat-transcript",style:{flex:1,minHeight:320,overflowY:"auto",padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-0)"},children:a.loading&&u.length===0?t.jsx($,{style:{height:200}}):u.length===0&&l===""?t.jsx(Y,{}):t.jsxs(T,{gap:1,children:[u.map(e=>t.jsx(W,{message:e,onRegenerate:s=>void f(s)},e.id)),l!==""&&t.jsx(W,{message:{id:"streaming",ts:new Date().toISOString(),role:"assistant",content:l}})]})}),t.jsxs(w,{align:"end",gap:2,children:[t.jsx("span",{style:{flex:1,color:"var(--fg-muted)",fontSize:"var(--fs-11)"},children:"Enter to send · Shift+Enter newline"}),t.jsxs(S,{variant:"primary",onClick:()=>void p(),disabled:b||n.trim()==="","data-testid":"chat-send",children:[t.jsx(Q,{size:14,"aria-hidden":!0})," ",b?"Sending…":"Send"]})]}),t.jsx(G,{value:n,placeholder:"Ask Claude anything…",rows:4,"data-testid":"chat-input",onChange:e=>E(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),p())}})]})})})]})]})}export{oe as ChatView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatView-DRBHzgay.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/message-square-plus.js","../../src/web/v8/ui/chat/EventStream.tsx","../../src/web/v8/views/Chat/ChatView.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 MessageSquarePlus = createLucideIcon(\"MessageSquarePlus\", [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }],\n [\"path\", { d: \"M12 7v6\", key: \"lw1j43\" }],\n [\"path\", { d: \"M9 10h6\", key: \"9gxzsh\" }]\n]);\n\nexport { MessageSquarePlus as default };\n//# sourceMappingURL=message-square-plus.js.map\n","/**\n * v8/ui/chat/EventStream.tsx — text/event-stream reader.\n *\n * Thin helper over `fetch()` that parses `data:` lines from a server\n * response and yields each event to a callback. Used by the chat\n * composer (POST /api/chat sends, response is a stream) and by the\n * Claude session detail (GET /api/claude-sessions/:id/stream).\n *\n * The server emits either:\n * - JSON envelopes per line (`fetchJson`-compatible), used when\n * handlers prefer that shape;\n * - SSE-formatted `data:` lines for streaming tokens.\n *\n * This reader handles both. JSON-only payloads (no `data:` prefix)\n * are forwarded verbatim. `event:` lines are split into separate\n * callbacks when present.\n */\n\nexport interface EventStreamHandlers {\n onChunk?: (text: string) => void;\n onEvent?: (event: string, data: string) => void;\n onDone?: () => void;\n onError?: (err: Error) => void;\n}\n\nexport interface EventStreamOptions extends EventStreamHandlers {\n signal?: AbortSignal;\n}\n\nexport async function readEventStream(\n url: string,\n init: RequestInit,\n handlers: EventStreamOptions,\n): Promise<void> {\n const { signal, onChunk, onEvent, onDone, onError } = handlers;\n try {\n const response = await fetch(url, { ...init, signal });\n if (!response.ok || response.body === null) {\n throw new Error(`HTTP ${response.status} reading ${url}`);\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let sawDone = false;\n // pump until the stream is fully drained or the caller aborts\n while (!sawDone) {\n if (signal?.aborted) break;\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // SSE frames are separated by a blank line. Split and process.\n const frames = buffer.split('\\n\\n');\n buffer = frames.pop() ?? '';\n for (const frame of frames) {\n const lines = frame.split('\\n').filter((l) => l.length > 0);\n let data = '';\n let event = 'message';\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data += line.slice(5).trim();\n } else if (line.startsWith('event:')) {\n event = line.slice(6).trim();\n }\n }\n if (data.length === 0) continue;\n if (event === 'done') {\n sawDone = true;\n onDone?.();\n break;\n }\n if (event !== 'message') {\n onEvent?.(event, data);\n } else {\n onChunk?.(data);\n }\n }\n }\n onDone?.();\n } catch (err) {\n if (signal?.aborted) return;\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","/**\n * v8/views/Chat/ChatView.tsx — Sprint S38, v9.3.0.\n *\n * Three-pane chat surface: session list (left) · transcript (center) ·\n * composer (bottom). Backed by `/api/chat` + `/api/chat/sessions` +\n * `/api/chat/regenerate` + `/api/chat/audit`. Live deltas arrive via\n * the `chat:delta` / `chat:message` WS events added in S37.\n *\n * No window.confirm / window.prompt. Session creation uses an inline\n * `+` button that POSTs and selects the new session on success.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { MessageSquarePlus, RefreshCw, Send, ShieldCheck } 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 { Textarea } from '../../ui/controls/Textarea.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { MessageBubble, EmptyTranscript } from '../../ui/chat/MessageBubble.js';\nimport { readEventStream } from '../../ui/chat/EventStream.js';\nimport type { ChatMessage, ChatSession, WsMessage } from '../../data/types.js';\n\ninterface ChatPayload {\n messages: ChatMessage[];\n sessions: Array<{ id: string; file: string; mtime: number; size: number }>;\n}\n\ninterface SessionsPayload {\n sessions: Array<{ id: string; title?: string; updatedAt?: number; messageCount?: number; agent?: string | null }>;\n}\n\nfunction fmtRel(ts: number | undefined): string {\n if (!ts) return '';\n const delta = Math.max(0, Date.now() - ts);\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(ts).toLocaleString();\n}\n\nexport function ChatView(): JSX.Element {\n const payload = useFetch<ChatPayload>('/api/chat');\n const sessionsPayload = useFetch<SessionsPayload>('/api/chat/sessions');\n const [activeId, setActiveId] = useState<string | null>(null);\n const [transcript, setTranscript] = useState<ChatMessage[]>([]);\n const [streaming, setStreaming] = useState<string>('');\n const [draft, setDraft] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n // Seed active session from the first row in the response.\n useEffect(() => {\n if (activeId === null && payload.data?.sessions.length) {\n setActiveId(payload.data.sessions[0].id);\n }\n }, [payload.data, activeId]);\n\n // Seed transcript from payload when active session changes.\n useEffect(() => {\n if (!payload.data || activeId === null) {\n setTranscript([]);\n return;\n }\n setTranscript(payload.data.messages.filter((m) => payload.data?.sessions.find((s) => s.id === activeId) !== undefined));\n }, [payload.data, activeId]);\n\n const sessions = useMemo<ChatSession[]>(() => {\n return (payload.data?.sessions ?? []).map((s) => ({\n id: s.id,\n messageCount: s.size > 0 ? Math.floor(s.size / 200) : 0,\n }));\n }, [payload.data]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type === 'chat:message' && msg.message) {\n // A new persisted turn arrived for the active session; refresh the transcript.\n void payload.refetch();\n }\n }, [payload]);\n useWsMessage('chat:message', onChange);\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (!text || busy) return;\n setError(null);\n setBusy(true);\n setDraft('');\n const optimistic: ChatMessage = {\n id: `local_${Date.now().toString(36)}`,\n ts: new Date().toISOString(),\n role: 'user',\n content: text,\n };\n setTranscript((prev) => [...prev, optimistic]);\n setStreaming('');\n const ctrl = new AbortController();\n try {\n await readEventStream(\n '/api/chat',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message: text, session: activeId ?? undefined }),\n },\n {\n signal: ctrl.signal,\n onChunk: (chunk) => setStreaming((cur) => cur + chunk),\n onEvent: (event, data) => {\n if (event === 'session') {\n try {\n const parsed = JSON.parse(data) as { session?: string };\n if (parsed.session) setActiveId(parsed.session);\n } catch { /* swallow */ }\n } else if (event === 'error') {\n setError(data);\n }\n },\n onDone: () => setStreaming(''),\n onError: (err) => setError(err.message),\n },\n );\n // After stream completes the persisted turn is in the JSONL log;\n // pull a fresh transcript.\n void payload.refetch();\n void sessionsPayload.refetch();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n setStreaming('');\n }\n };\n\n const createSession = async (): Promise<void> => {\n setError(null);\n try {\n const res = await fetchJson<{ session?: ChatSession }>(\n '/api/chat/sessions',\n { method: 'POST', body: {} },\n );\n if (res.session?.id) {\n setActiveId(res.session.id);\n void payload.refetch();\n void sessionsPayload.refetch();\n }\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const regenerate = async (msg: ChatMessage): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/chat/regenerate', { method: 'POST', body: { messageId: msg.id, session: activeId } });\n void payload.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const audit = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/chat/audit', { method: 'POST', body: { session: activeId } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const dropSession = (id: string): void => {\n // Inline confirm row pattern from F-061. No window.confirm.\n setConfirmDeleteId((cur) => (cur === id ? null : id));\n };\n\n return (\n <Stack gap={4} data-testid=\"chat-view\">\n <ViewHeader\n title=\"Chat\"\n description=\"Multi-turn Claude Code sessions for the active project. Streams over WebSocket.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && (\n <span role=\"alert\" data-testid=\"chat-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void payload.refetch()} data-testid=\"chat-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void audit()} data-testid=\"chat-audit\">\n <ShieldCheck size={14} aria-hidden /> Audit\n </Button>\n <Button variant=\"primary\" onClick={() => void createSession()} data-testid=\"chat-create-session\">\n <MessageSquarePlus size={14} aria-hidden /> New session\n </Button>\n </Inline>\n }\n />\n <Inline align=\"stretch\" gap={3} wrap={false} style={{ minHeight: 480 }}>\n {/* Session list */}\n <Card variant=\"default\" style={{ width: 260, flexShrink: 0 }}>\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Sessions ({sessions.length})\n </strong>\n {payload.loading && sessions.length === 0 ? (\n <Skeleton style={{ height: 32 }} />\n ) : sessions.length === 0 ? (\n <EmptyState\n icon={<MessageSquarePlus size={28} aria-hidden />}\n title=\"No sessions\"\n description=\"Create one to start chatting.\"\n />\n ) : (\n sessions.map((s) => {\n const isActive = s.id === activeId;\n const isConfirmingDelete = confirmDeleteId === s.id;\n return (\n <div\n key={s.id}\n data-testid={`chat-session-${s.id}`}\n style={{\n padding: 'var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: isActive ? '1px solid var(--accent)' : '1px solid var(--border)',\n background: isActive ? 'color-mix(in oklch, var(--accent) 12%, transparent)' : 'var(--surface-0)',\n cursor: 'pointer',\n }}\n onClick={() => { if (!isConfirmingDelete) setActiveId(s.id); }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {s.id}\n </span>\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); dropSession(s.id); }}\n data-testid={`chat-session-delete-${s.id}`}\n aria-label={`Delete session ${s.id}`}\n style={{\n background: 'transparent',\n border: 0,\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n fontSize: 'var(--fs-11)',\n }}\n >\n ×\n </button>\n </Inline>\n {s.messageCount !== undefined && (\n <div style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n {s.messageCount} messages\n </div>\n )}\n {isConfirmingDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button\n variant=\"danger\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n data-testid={`chat-session-confirm-delete-${s.id}`}\n >\n Confirm delete\n </Button>\n <Button\n variant=\"ghost\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n data-testid={`chat-session-cancel-delete-${s.id}`}\n >\n Cancel\n </Button>\n </Inline>\n )}\n </div>\n );\n })\n )}\n </Stack>\n </CardBody>\n </Card>\n\n {/* Transcript + composer */}\n <Card variant=\"default\" style={{ flex: 1, minWidth: 0 }}>\n <CardBody>\n <Stack gap={2} style={{ height: '100%' }}>\n <div\n data-testid=\"chat-transcript\"\n style={{\n flex: 1,\n minHeight: 320,\n overflowY: 'auto',\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-0)',\n }}\n >\n {payload.loading && transcript.length === 0 ? (\n <Skeleton style={{ height: 200 }} />\n ) : transcript.length === 0 && streaming === '' ? (\n <EmptyTranscript />\n ) : (\n <Stack gap={1}>\n {transcript.map((m) => (\n <MessageBubble key={m.id} message={m} onRegenerate={(msg) => void regenerate(msg)} />\n ))}\n {streaming !== '' && (\n <MessageBubble\n message={{\n id: 'streaming',\n ts: new Date().toISOString(),\n role: 'assistant',\n content: streaming,\n }}\n />\n )}\n </Stack>\n )}\n </div>\n <Inline align=\"end\" gap={2}>\n <span style={{ flex: 1, color: 'var(--fg-muted)', fontSize: 'var(--fs-11)' }}>\n Enter to send · Shift+Enter newline\n </span>\n <Button variant=\"primary\" onClick={() => void send()} disabled={busy || draft.trim() === ''} data-testid=\"chat-send\">\n <Send size={14} aria-hidden /> {busy ? 'Sending…' : 'Send'}\n </Button>\n </Inline>\n <Textarea\n value={draft}\n placeholder=\"Ask Claude anything…\"\n rows={4}\n data-testid=\"chat-input\"\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n void send();\n }\n }}\n />\n </Stack>\n </CardBody>\n </Card>\n </Inline>\n </Stack>\n );\n}"],"names":["MessageSquarePlus","createLucideIcon","readEventStream","url","init","handlers","signal","onChunk","onEvent","onDone","onError","response","reader","decoder","buffer","sawDone","value","done","frames","frame","lines","l","data","event","line","err","ChatView","payload","useFetch","sessionsPayload","activeId","setActiveId","useState","transcript","setTranscript","streaming","setStreaming","draft","setDraft","busy","setBusy","error","setError","confirmDeleteId","setConfirmDeleteId","useEffect","_a","m","s","sessions","useMemo","onChange","useCallback","msg","useWsMessage","send","text","optimistic","prev","ctrl","chunk","cur","parsed","createSession","res","fetchJson","FetchError","regenerate","audit","dropSession","id","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","ShieldCheck","Card","CardBody","Skeleton","EmptyState","isActive","isConfirmingDelete","e","EmptyTranscript","MessageBubble","Send","Textarea"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as u,j as o}from"./cmdk-DVxytz9i.js";import{X as h,g as p}from"./main-CdOm1Pj9.js";const f={neutral:"var(--surface-1)",info:"color-mix(in oklch, var(--info) 14%, var(--surface-1))",success:"color-mix(in oklch, var(--success) 14%, var(--surface-1))",warning:"color-mix(in oklch, var(--warning) 14%, var(--surface-1))",danger:"color-mix(in oklch, var(--danger) 14%, var(--surface-1))",accent:"color-mix(in oklch, var(--accent) 14%, var(--surface-1))"},m={neutral:"var(--border)",info:"color-mix(in oklch, var(--info) 30%, var(--border))",success:"color-mix(in oklch, var(--success) 30%, var(--border))",warning:"color-mix(in oklch, var(--warning) 30%, var(--border))",danger:"color-mix(in oklch, var(--danger) 30%, var(--border))",accent:"color-mix(in oklch, var(--accent) 30%, var(--border))"},k=u.forwardRef(function(n,c){const{tone:e="neutral",selected:r,onRemove:a,children:i,className:t,style:s,...l}=n,d=r!==void 0||a!==void 0;return o.jsxs("span",{ref:c,className:p("v8-chip",`v8-chip--${e}`,r===!0&&"is-selected",t),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",height:24,padding:"0 8px",background:r===!0?"color-mix(in oklch, var(--accent) 18%, var(--surface-1))":f[e],border:"1px solid",borderColor:r===!0?"var(--accent)":m[e],borderRadius:"var(--radius-pill)",fontSize:"var(--fs-12)",fontWeight:500,color:r===!0?"var(--accent)":"var(--fg)",cursor:d===!0?"pointer":"default",whiteSpace:"nowrap",...s},...l,children:[i,a!==void 0&&o.jsx("button",{type:"button",onClick:v=>{v.stopPropagation(),a()},"aria-label":"Remove",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:14,height:14,marginLeft:2,marginRight:-4,padding:0,background:"transparent",border:0,borderRadius:"var(--radius-sm)",color:"var(--fg-muted)",cursor:"pointer"},children:o.jsx(h,{size:10,"aria-hidden":"true"})})]})});export{k as C};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip-BrXIlR9w.js","sources":["../../src/web/v8/ui/data/Chip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Chip — filter pill with an optional remove button.\n *\n * Different from Badge: Badge is a status indicator (read-only).\n * Chip is interactive — clickable for selection, removable for filters.\n */\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n /** Visual tone. */\n tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n /** When true, render with selected styling (used for filter chips). */\n selected?: boolean;\n /** When provided, render a close button that invokes this handler. */\n onRemove?: () => void;\n children: ReactNode;\n}\n\nconst TONE_BG: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--surface-1)',\n info: 'color-mix(in oklch, var(--info) 14%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 14%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 14%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 14%, var(--surface-1))',\n accent: 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))',\n};\n\nconst TONE_BORDER: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--border)',\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n accent: 'color-mix(in oklch, var(--accent) 30%, var(--border))',\n};\n\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(props, ref) {\n const { tone = 'neutral', selected, onRemove, children, className, style, ...rest } = props;\n const isInteractive = selected !== undefined || onRemove !== undefined;\n return (\n <span\n ref={ref}\n className={cx('v8-chip', `v8-chip--${tone}`, selected === true && 'is-selected', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height: 24,\n padding: '0 8px',\n background: selected === true ? `color-mix(in oklch, var(--accent) 18%, var(--surface-1))` : TONE_BG[tone],\n border: '1px solid',\n borderColor: selected === true ? 'var(--accent)' : TONE_BORDER[tone],\n borderRadius: 'var(--radius-pill)',\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: selected === true ? 'var(--accent)' : 'var(--fg)',\n cursor: isInteractive === true ? 'pointer' : 'default',\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {children}\n {onRemove !== undefined && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label=\"Remove\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 14,\n height: 14,\n marginLeft: 2,\n marginRight: -4,\n padding: 0,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <X size={10} aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n});"],"names":["TONE_BG","TONE_BORDER","Chip","forwardRef","props","ref","tone","selected","onRemove","children","className","style","rest","isInteractive","jsxs","cx","jsx","e","X"],"mappings":"4FAqBA,MAAMA,EAA0D,CAC9D,QAAS,mBACT,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,2DACR,OAAQ,0DACV,EAEMC,EAA8D,CAClE,QAAS,gBACT,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,wDACR,OAAQ,uDACV,EAEaC,EAAOC,EAAAA,WAAuC,SAAcC,EAAOC,EAAK,CACnF,KAAM,CAAE,KAAAC,EAAO,UAAW,SAAAC,EAAU,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAChFS,EAAgBN,IAAa,QAAaC,IAAa,OAC7D,OACEM,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,UAAW,YAAYT,CAAI,GAAIC,IAAa,IAAQ,cAAeG,CAAS,EAC1F,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAQ,GACR,QAAS,QACT,WAAYH,IAAa,GAAO,2DAA6DP,EAAQM,CAAI,EACzG,OAAQ,YACR,YAAaC,IAAa,GAAO,gBAAkBN,EAAYK,CAAI,EACnE,aAAc,qBACd,SAAU,eACV,WAAY,IACZ,MAAOC,IAAa,GAAO,gBAAkB,YAC7C,OAAQM,IAAkB,GAAO,UAAY,UAC7C,WAAY,SACZ,GAAGF,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAH,EACAD,IAAa,QACZQ,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAUC,GAAM,CACdA,EAAE,gBAAA,EACFT,EAAA,CACF,EACA,aAAW,SACX,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,WAAY,EACZ,YAAa,GACb,QAAS,EACT,WAAY,cACZ,OAAQ,EACR,aAAc,mBACd,MAAO,kBACP,OAAQ,SAAA,EAGV,SAAAQ,EAAAA,IAACE,EAAA,CAAE,KAAM,GAAI,cAAY,MAAA,CAAO,CAAA,CAAA,CAClC,CAAA,CAAA,CAIR,CAAC"}
@@ -0,0 +1 @@
1
+ import{r,j as e}from"./cmdk-DVxytz9i.js";import{u as D,S as j,I as g,d as c,h as z,i as S,F as C,P as F}from"./main-CdOm1Pj9.js";import{V as P}from"./ViewHeader-BqIPVKuG.js";import{C as R,b as T}from"./Card-Tyboihu7.js";import{I as b}from"./Input-BbFUDQnS.js";import{S as $,a as k,b as O}from"./Sheet-DH-WNJ3Y.js";import{E as A}from"./EmptyState-DZ2ouKwd.js";import{M as B}from"./MessageBubble-5vUAquDx.js";import{R as E}from"./refresh-ccw-CHMprsm5.js";import{S as N}from"./send-xgy3RAi7.js";import{P as M}from"./plus-M6LYiKX8.js";import{P as V}from"./pencil-BanqaMw7.js";import{T as H}from"./trash-2-CL4khSRv.js";function W({sessionId:a}){var t;const m=`/api/claude-sessions/${a}/messages`,l=D(m),[u,n]=r.useState(""),[d,o]=r.useState("general"),[h,i]=r.useState(!1),[x,f]=r.useState(null),v=r.useCallback(()=>{l.refetch()},[l]),p=((t=l.data)==null?void 0:t.messages)??[],y=async()=>{const s=u.trim();if(!(!s||!d.trim()||h)){i(!0),f(null);try{await S(`/api/claude-sessions/${a}/send`,{method:"POST",body:{message:s,agent:d.trim()}}),n(""),window.setTimeout(()=>{v()},750)}catch(w){f((w instanceof C,w.message))}finally{i(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},"data-testid":`claude-session-detail-${a}`,children:[e.jsxs(g,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:a}),e.jsxs(c,{variant:"ghost",onClick:()=>void v(),"data-testid":`claude-session-detail-refresh-${a}`,children:[e.jsx(E,{size:14,"aria-hidden":!0})," Refresh"]})]}),e.jsx(R,{variant:"default",children:e.jsx(T,{children:l.loading&&p.length===0?e.jsx(z,{style:{height:120}}):p.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No messages yet — start with a follow-up."}):e.jsx(j,{gap:1,children:p.map(s=>e.jsx(B,{message:s},s.id||`${s.ts}-${s.role}`))})})}),x!==null&&e.jsx("span",{role:"alert","data-testid":`claude-session-detail-error-${a}`,style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),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:"Agent"}),e.jsx(b,{value:d,"data-testid":`claude-session-detail-agent-${a}`,onChange:s=>o(s.target.value)})]}),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:"Follow-up"}),e.jsx("textarea",{value:u,rows:4,"data-testid":`claude-session-detail-draft-${a}`,onChange:s=>n(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),e.jsx(g,{justify:"end",gap:2,children:e.jsxs(c,{variant:"primary",onClick:()=>void y(),disabled:h||u.trim()===""||d.trim()==="","data-testid":`claude-session-detail-send-${a}`,children:[e.jsx(N,{size:14,"aria-hidden":!0})," ",h?"Sending…":"Send"]})})]})}function te(){var h;const a=D("/api/claude-sessions"),[m,l]=r.useState(!1),[u,n]=r.useState(null),d=((h=a.data)==null?void 0:h.sessions)??[],o=r.useCallback(()=>{a.refetch()},[a]);return e.jsxs(j,{gap:4,"data-testid":"claude-sessions-view",children:[e.jsx(P,{title:"Claude sessions",description:"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.",actions:e.jsxs(g,{align:"center",gap:2,children:[e.jsxs(c,{variant:"ghost",onClick:()=>void o(),"data-testid":"claude-sessions-refresh",children:[e.jsx(E,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(c,{variant:"primary",onClick:()=>l(!0),"data-testid":"claude-sessions-new",children:[e.jsx(M,{size:14,"aria-hidden":!0})," New session"]})]})}),e.jsx(R,{variant:"default",children:e.jsx(T,{children:a.loading&&d.length===0?e.jsxs(j,{gap:2,children:[e.jsx(z,{style:{height:36}}),e.jsx(z,{style:{height:36}})]}):d.length===0?e.jsx(A,{icon:e.jsx(F,{size:28,"aria-hidden":!0}),title:"No Claude sessions",description:"Create one to start a multi-turn conversation with Claude Code."}):e.jsx(j,{gap:2,children:d.map(i=>e.jsx(q,{session:i,onRefresh:o,onOpen:n},i.id))})})}),e.jsx($,{open:m,onOpenChange:l,children:e.jsx(k,{side:"right",title:"New Claude session",description:"Spawn a Claude Code session via the runner.",children:e.jsx(J,{onCreated:i=>{l(!1),o(),n(i)},onCancel:()=>l(!1)})})}),e.jsx($,{open:u!==null,onOpenChange:i=>{i||n(null)},children:e.jsx(k,{side:"right",title:"Session detail",description:u??"",children:u!==null&&e.jsx(W,{sessionId:u})})})]})}function q({session:a,onRefresh:m,onOpen:l}){const[u,n]=r.useState(!1),[d,o]=r.useState(a.title??""),[h,i]=r.useState(!1),[x,f]=r.useState(null),v=async()=>{if(d.trim()){f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"PATCH",body:{title:d.trim()}}),n(!1),m()}catch(t){f((t instanceof C,t.message))}}},p=async t=>{f(null);try{await S(`/api/claude-sessions/${t}/resume`,{method:"POST",body:{}})}catch(s){f((s instanceof C,s.message))}},y=async()=>{f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"DELETE"}),i(!1),m()}catch(t){f((t instanceof C,t.message))}};return e.jsxs("div",{"data-testid":`claude-session-row-${a.id}`,style:{padding:"var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:"var(--surface-0)"},children:[e.jsxs(g,{align:"center",justify:"between",gap:3,children:[e.jsxs(j,{gap:1,style:{minWidth:0,flex:1},children:[u?e.jsxs(g,{gap:1,children:[e.jsx(b,{value:d,"data-testid":`claude-session-rename-input-${a.id}`,onChange:t=>o(t.target.value)}),e.jsx(c,{variant:"primary",onClick:()=>void v(),"data-testid":`claude-session-rename-submit-${a.id}`,children:"Save"}),e.jsx(c,{variant:"ghost",onClick:()=>{n(!1),o(a.title??"")},children:"Cancel"})]}):e.jsxs(g,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.title||a.id}),a.agent&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:["@",a.agent]})]}),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.id}),x!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x})]}),e.jsxs(g,{gap:1,children:[e.jsx(c,{variant:"primary",onClick:()=>void p(a.id),"data-testid":`claude-session-resume-${a.id}`,"aria-label":`Resume ${a.id}`,children:"Resume"}),e.jsx(c,{variant:"ghost",onClick:()=>l(a.id),"data-testid":`claude-session-open-${a.id}`,children:"Open"}),e.jsx(c,{variant:"ghost",onClick:()=>{n(!0),o(a.title??"")},"data-testid":`claude-session-rename-${a.id}`,"aria-label":`Rename session ${a.id}`,children:e.jsx(V,{size:14,"aria-hidden":!0})}),e.jsx(c,{variant:"ghost",onClick:()=>i(t=>!t),"data-testid":`claude-session-delete-${a.id}`,"aria-label":`Delete session ${a.id}`,children:e.jsx(H,{size:14,"aria-hidden":!0})})]})]}),h&&e.jsxs(g,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(c,{variant:"danger",onClick:()=>void y(),"data-testid":`claude-session-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(c,{variant:"ghost",onClick:()=>i(!1),"data-testid":`claude-session-cancel-delete-${a.id}`,children:"Cancel"})]})]})}function J({onCreated:a,onCancel:m}){const[l,u]=r.useState(""),[n,d]=r.useState("general"),[o,h]=r.useState(""),[i,x]=r.useState(""),[f,v]=r.useState(!1),[p,y]=r.useState(null),t=async()=>{if(!(!n.trim()||!o.trim()||f)){v(!0),y(null);try{const s=await S("/api/claude-sessions/new",{method:"POST",body:{title:l.trim()||null,agent:n.trim(),prompt:o.trim(),directory:i.trim()||void 0}});a(s.id)}catch(s){y((s instanceof C,s.message))}finally{v(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},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:"Title (optional)"}),e.jsx(b,{value:l,"data-testid":"claude-sessions-new-title",onChange:s=>u(s.target.value)})]}),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:"Agent"}),e.jsx(b,{value:n,"data-testid":"claude-sessions-new-agent",onChange:s=>d(s.target.value)})]}),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:"Seed prompt"}),e.jsx("textarea",{value:o,rows:4,"data-testid":"claude-sessions-new-prompt",onChange:s=>h(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),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:"Working directory (optional)"}),e.jsx(b,{value:i,"data-testid":"claude-sessions-new-directory",onChange:s=>x(s.target.value)})]}),p!==null&&e.jsx("span",{role:"alert","data-testid":"claude-sessions-new-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(g,{justify:"end",gap:2,children:[e.jsx(O,{asChild:!0,children:e.jsx(c,{variant:"ghost",onClick:m,"data-testid":"claude-sessions-new-cancel",children:"Cancel"})}),e.jsx(c,{variant:"primary",onClick:()=>void t(),disabled:f||!n.trim()||!o.trim(),"data-testid":"claude-sessions-new-submit",children:"Create"})]})]})}export{te as ClaudeSessionsView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeSessionsView-Ck62jaOr.js","sources":["../../src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx","../../src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx"],"sourcesContent":["/**\n * v8/views/ClaudeSessions/ClaudeSessionDetail.tsx — Sprint S39, v9.3.0.\n *\n * Right-pane content for the ClaudeSessionSheet. Pulls messages\n * from /api/claude-sessions/:id/messages, lets the user send a\n * follow-up via /api/claude-sessions/:id/send. No streaming in\n * this initial cut — the server's SSE endpoint\n * (/api/claude-sessions/:id/stream) is read by the SDK in\n * production, but for the dashboard we treat send as fire-and-\n * refresh so the user sees the new turn after the resume exits.\n */\n\nimport { useCallback, useState } from 'react';\nimport { Send, RefreshCcw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.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';\nimport type { ChatMessage } from '../../data/types.js';\nimport { MessageBubble } from '../../ui/chat/MessageBubble.js';\n\ninterface MessagesPayload {\n messages: ChatMessage[];\n}\n\nexport function ClaudeSessionDetail({ sessionId }: { sessionId: string }): JSX.Element {\n const url = `/api/claude-sessions/${sessionId}/messages`;\n const payload = useFetch<MessagesPayload>(url);\n const [draft, setDraft] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n const messages = payload.data?.messages ?? [];\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (!text || !agent.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${sessionId}/send`, {\n method: 'POST',\n body: { message: text, agent: agent.trim() },\n });\n setDraft('');\n // The resume spawn is asynchronous; give it a moment then refresh.\n window.setTimeout(() => { refresh(); }, 750);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }} data-testid={`claude-session-detail-${sessionId}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{sessionId}</strong>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid={`claude-session-detail-refresh-${sessionId}`}>\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && messages.length === 0 ? (\n <Skeleton style={{ height: 120 }} />\n ) : messages.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n No messages yet — start with a follow-up.\n </span>\n ) : (\n <Stack gap={1}>\n {messages.map((m) => (\n <MessageBubble key={m.id || `${m.ts}-${m.role}`} message={m} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n {error !== null && (\n <span role=\"alert\" data-testid={`claude-session-detail-error-${sessionId}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid={`claude-session-detail-agent-${sessionId}`}\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Follow-up</span>\n <textarea\n value={draft}\n rows={4}\n data-testid={`claude-session-detail-draft-${sessionId}`}\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <Inline justify=\"end\" gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => void send()}\n disabled={busy || draft.trim() === '' || agent.trim() === ''}\n data-testid={`claude-session-detail-send-${sessionId}`}\n >\n <Send size={14} aria-hidden /> {busy ? 'Sending…' : 'Send'}\n </Button>\n </Inline>\n </Stack>\n );\n}","/**\n * v8/views/ClaudeSessions/ClaudeSessionsView.tsx — Sprint S39, v9.3.0.\n *\n * Claude Code session explorer. Lists sessions on disk (via\n * /api/claude-sessions), lets the user create a new one via Sheet\n * (POST /api/claude-sessions/new), inline-rename (PATCH\n * /api/claude-sessions/:id), inline-confirm delete (DELETE\n * /api/claude-sessions/:id), and opens a right Drawer with the\n * session detail (ClaudeSessionDetail).\n */\n\nimport { useCallback, useState } from 'react';\nimport { Plus, Trash2, Pencil, RefreshCcw, MessageSquareText } 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 { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { ClaudeSession } from '../../data/types.js';\nimport { ClaudeSessionDetail } from './ClaudeSessionDetail.js';\n\ninterface SessionsPayload {\n sessions: ClaudeSession[];\n}\n\nexport function ClaudeSessionsView(): JSX.Element {\n const payload = useFetch<SessionsPayload>('/api/claude-sessions');\n const [creating, setCreating] = useState<boolean>(false);\n const [detailId, setDetailId] = useState<string | null>(null);\n\n const sessions = payload.data?.sessions ?? [];\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n return (\n <Stack gap={4} data-testid=\"claude-sessions-view\">\n <ViewHeader\n title=\"Claude sessions\"\n description=\"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"claude-sessions-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setCreating(true)} data-testid=\"claude-sessions-new\">\n <Plus size={14} aria-hidden /> New session\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && sessions.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : sessions.length === 0 ? (\n <EmptyState\n icon={<MessageSquareText size={28} aria-hidden />}\n title=\"No Claude sessions\"\n description=\"Create one to start a multi-turn conversation with Claude Code.\"\n />\n ) : (\n <Stack gap={2}>\n {sessions.map((s) => (\n <SessionRow key={s.id} session={s} onRefresh={refresh} onOpen={setDetailId} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={creating} onOpenChange={setCreating}>\n <SheetContent side=\"right\" title=\"New Claude session\" description=\"Spawn a Claude Code session via the runner.\">\n <NewSessionForm\n onCreated={(id) => {\n setCreating(false);\n refresh();\n setDetailId(id);\n }}\n onCancel={() => setCreating(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={detailId !== null} onOpenChange={(open) => { if (!open) setDetailId(null); }}>\n <SheetContent side=\"right\" title=\"Session detail\" description={detailId ?? ''}>\n {detailId !== null && <ClaudeSessionDetail sessionId={detailId} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction SessionRow({\n session,\n onRefresh,\n onOpen,\n}: {\n session: ClaudeSession;\n onRefresh: () => void;\n onOpen: (id: string) => void;\n}): JSX.Element {\n const [renaming, setRenaming] = useState<boolean>(false);\n const [title, setTitle] = useState<string>(session.title ?? '');\n const [confirmDelete, setConfirmDelete] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const rename = async (): Promise<void> => {\n if (!title.trim()) return;\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, {\n method: 'PATCH',\n body: { title: title.trim() },\n });\n setRenaming(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const resume = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${id}/resume`, { method: 'POST', body: {} });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const remove = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, { method: 'DELETE' });\n setConfirmDelete(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <div\n data-testid={`claude-session-row-${session.id}`}\n style={{\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-md)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ minWidth: 0, flex: 1 }}>\n {renaming ? (\n <Inline gap={1}>\n <Input\n value={title}\n data-testid={`claude-session-rename-input-${session.id}`}\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n <Button variant=\"primary\" onClick={() => void rename()} data-testid={`claude-session-rename-submit-${session.id}`}>Save</Button>\n <Button variant=\"ghost\" onClick={() => { setRenaming(false); setTitle(session.title ?? ''); }}>Cancel</Button>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{session.title || session.id}</strong>\n {session.agent && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n @{session.agent}\n </span>\n )}\n </Inline>\n )}\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {session.id}\n </span>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"primary\" onClick={() => void resume(session.id)} data-testid={`claude-session-resume-${session.id}`} aria-label={`Resume ${session.id}`}>\n Resume\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpen(session.id)} data-testid={`claude-session-open-${session.id}`}>\n Open\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => { setRenaming(true); setTitle(session.title ?? ''); }}\n data-testid={`claude-session-rename-${session.id}`}\n aria-label={`Rename session ${session.id}`}\n >\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => !cur)}\n data-testid={`claude-session-delete-${session.id}`}\n aria-label={`Delete session ${session.id}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {confirmDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Button variant=\"danger\" onClick={() => void remove()} data-testid={`claude-session-confirm-delete-${session.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(false)} data-testid={`claude-session-cancel-delete-${session.id}`}>\n Cancel\n </Button>\n </Inline>\n )}\n </div>\n );\n}\n\nfunction NewSessionForm({\n onCreated,\n onCancel,\n}: {\n onCreated: (id: string) => void;\n onCancel: () => void;\n}): JSX.Element {\n const [title, setTitle] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [prompt, setPrompt] = useState<string>('');\n const [directory, setDirectory] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!agent.trim() || !prompt.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ id: string }>('/api/claude-sessions/new', {\n method: 'POST',\n body: {\n title: title.trim() || null,\n agent: agent.trim(),\n prompt: prompt.trim(),\n directory: directory.trim() || undefined,\n },\n });\n onCreated(res.id);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>\n <Input\n value={title}\n data-testid=\"claude-sessions-new-title\"\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid=\"claude-sessions-new-agent\"\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Seed prompt</span>\n <textarea\n value={prompt}\n rows={4}\n data-testid=\"claude-sessions-new-prompt\"\n onChange={(e) => setPrompt((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Working directory (optional)</span>\n <Input\n value={directory}\n data-testid=\"claude-sessions-new-directory\"\n onChange={(e) => setDirectory((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid=\"claude-sessions-new-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"claude-sessions-new-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !agent.trim() || !prompt.trim()}\n data-testid=\"claude-sessions-new-submit\"\n >\n Create\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["ClaudeSessionDetail","sessionId","url","payload","useFetch","draft","setDraft","useState","agent","setAgent","busy","setBusy","error","setError","refresh","useCallback","messages","_a","send","text","fetchJson","err","FetchError","jsxs","Stack","Inline","jsx","Button","RefreshCcw","Card","CardBody","Skeleton","m","MessageBubble","Input","e","Send","ClaudeSessionsView","creating","setCreating","detailId","setDetailId","sessions","ViewHeader","Plus","EmptyState","MessageSquareText","s","SessionRow","Sheet","SheetContent","NewSessionForm","id","open","session","onRefresh","onOpen","renaming","setRenaming","title","setTitle","confirmDelete","setConfirmDelete","rename","resume","remove","Pencil","cur","Trash2","onCreated","onCancel","prompt","setPrompt","directory","setDirectory","submit","res","SheetClose"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as s,j as e}from"./cmdk-DVxytz9i.js";import{u as k,S as h,I as f,d as n,h as y,$ as w,i as S,F as z}from"./main-CdOm1Pj9.js";import{V as E}from"./ViewHeader-BqIPVKuG.js";import{C as T,b as D}from"./Card-Tyboihu7.js";import{I as b}from"./Input-BbFUDQnS.js";import{T as C}from"./Textarea-qYDf3yds.js";import{S as R,a as $}from"./Sheet-DH-WNJ3Y.js";import{E as L}from"./EmptyState-DZ2ouKwd.js";import{R as F}from"./refresh-ccw-CHMprsm5.js";import{P as I}from"./plus-M6LYiKX8.js";import{E as P}from"./external-link-DA3_VGm-.js";import{T as U}from"./trash-2-CL4khSRv.js";function Q(){const l=k("/api/clipboard/list"),[v,r]=s.useState(!1),[x,o]=s.useState(null),[u,d]=s.useState(null),p=s.useMemo(()=>{var t;return((t=l.data)==null?void 0:t.clips)??[]},[l.data]),c=s.useCallback(()=>{l.refetch()},[l]),g=async t=>{d(null);try{await S(`/api/clipboard/${t}`,{method:"DELETE"}),o(null),c()}catch(i){d((i instanceof z,i.message))}};return e.jsxs(h,{gap:4,"data-testid":"clipboard-view",children:[e.jsx(E,{title:"Clipboard",description:"Saved clips. Each becomes a markdown note under clips/.",actions:e.jsxs(f,{align:"center",gap:2,children:[u!==null&&e.jsx("span",{role:"alert","data-testid":"clipboard-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:u}),e.jsxs(n,{variant:"ghost",onClick:()=>void c(),"data-testid":"clipboard-refresh",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(n,{variant:"primary",onClick:()=>r(!0),"data-testid":"clipboard-add",children:[e.jsx(I,{size:14,"aria-hidden":!0})," Save clip"]})]})}),e.jsx(T,{variant:"default",children:e.jsx(D,{children:l.loading&&p.length===0?e.jsxs(h,{gap:1,children:[e.jsx(y,{style:{height:60}}),e.jsx(y,{style:{height:60}})]}):p.length===0?e.jsx(L,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No saved clips",description:"Save one with a URL + content."}):e.jsx(h,{gap:1,children:p.map(t=>{const i=x===t.id;return e.jsxs("div",{"data-testid":`clipboard-row-${t.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs(h,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.title||t.id}),t.url&&e.jsxs("a",{href:t.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-11)",color:"var(--accent)"},children:[e.jsx(P,{size:10,"aria-hidden":!0,style:{verticalAlign:"middle"}})," ",t.url]}),t.savedAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.savedAt})]}),(t.selection||t.content)&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:(t.selection||t.content||"").length>200?`${(t.selection||t.content||"").slice(0,200)}…`:t.selection||t.content})]}),e.jsx(n,{variant:"ghost",onClick:()=>o(m=>m===t.id?null:t.id),"data-testid":`clipboard-delete-${t.id}`,"aria-label":`Delete ${t.id}`,children:e.jsx(U,{size:14,"aria-hidden":!0})})]}),i&&e.jsxs(f,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(n,{variant:"danger",onClick:()=>void g(t.id),"data-testid":`clipboard-confirm-delete-${t.id}`,children:"Confirm delete"}),e.jsx(n,{variant:"ghost",onClick:()=>o(null),children:"Cancel"})]})]},t.id)})})})}),e.jsx(R,{open:v,onOpenChange:r,children:e.jsx($,{side:"right",title:"Save clip",description:"URL or content required.",children:e.jsx(A,{onSubmit:async t=>{await S("/api/clipboard/save",{method:"POST",body:t}),r(!1),c()},onCancel:()=>r(!1)})})})]})}function A({onSubmit:l,onCancel:v}){const[r,x]=s.useState(""),[o,u]=s.useState(""),[d,p]=s.useState(""),[c,g]=s.useState(""),[t,i]=s.useState(!1),[m,j]=s.useState(null);return e.jsxs(h,{gap:3,style:{padding:"var(--space-4)"},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:"URL (optional)"}),e.jsx(b,{value:r,onChange:a=>x(a.target.value),"data-testid":"clipboard-form-url"})]}),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:"Title (optional)"}),e.jsx(b,{value:o,onChange:a=>u(a.target.value),"data-testid":"clipboard-form-title"})]}),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:"Content"}),e.jsx(C,{value:d,rows:6,onChange:a=>p(a.target.value),"data-testid":"clipboard-form-content"})]}),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:"Selection (optional)"}),e.jsx(C,{value:c,rows:3,onChange:a=>g(a.target.value),"data-testid":"clipboard-form-selection"})]}),m!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(n,{variant:"ghost",onClick:v,children:"Cancel"}),e.jsx(n,{variant:"primary",disabled:t||!r.trim()&&!d.trim(),"data-testid":"clipboard-form-submit",onClick:async()=>{i(!0),j(null);try{await l({url:r.trim()||void 0,title:o.trim()||void 0,content:d.trim()||void 0,selection:c.trim()||void 0})}catch(a){j((a instanceof z,a.message)),i(!1)}},children:t?"Saving…":"Save"})]})]})}export{Q as ClipboardView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClipboardView-DfND6xL6.js","sources":["../../src/web/v8/views/Clipboard/ClipboardView.tsx"],"sourcesContent":["/**\n * v8/views/Clipboard/ClipboardView.tsx — Sprint S43, v9.3.0.\n *\n * Saved clip list (GET /api/clipboard/list), Save Sheet\n * (POST /api/clipboard/save with {url, title, content, selection}),\n * inline-confirm Delete (DELETE /api/clipboard/:id). Each row links\n * to the source URL when present.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { ClipboardPaste, Plus, Trash2, ExternalLink, 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 { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Clip {\n id: string;\n url?: string;\n title?: string;\n content?: string;\n selection?: string;\n savedAt?: string;\n}\n\nexport function ClipboardView(): JSX.Element {\n const payload = useFetch<{ clips: Clip[] }>('/api/clipboard/list');\n const [saving, setSaving] = useState<boolean>(false);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const clips = useMemo<Clip[]>(() => payload.data?.clips ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/clipboard/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"clipboard-view\">\n <ViewHeader\n title=\"Clipboard\"\n description=\"Saved clips. Each becomes a markdown note under clips/.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"clipboard-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"clipboard-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setSaving(true)} data-testid=\"clipboard-add\">\n <Plus size={14} aria-hidden /> Save clip\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && clips.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 60 }} />\n <Skeleton style={{ height: 60 }} />\n </Stack>\n ) : clips.length === 0 ? (\n <EmptyState icon={<ClipboardPaste size={28} aria-hidden />} title=\"No saved clips\" description=\"Save one with a URL + content.\" />\n ) : (\n <Stack gap={1}>\n {clips.map((c) => {\n const isConfirming = confirmDelete === c.id;\n return (\n <div\n key={c.id}\n data-testid={`clipboard-row-${c.id}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{c.title || c.id}</strong>\n {c.url && (\n <a href={c.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-11)', color: 'var(--accent)' }}>\n <ExternalLink size={10} aria-hidden style={{ verticalAlign: 'middle' }} /> {c.url}\n </a>\n )}\n {c.savedAt && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{c.savedAt}</span>}\n </Inline>\n {(c.selection || c.content) && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {(c.selection || c.content || '').length > 200\n ? `${(c.selection || c.content || '').slice(0, 200)}…`\n : (c.selection || c.content)}\n </span>\n )}\n </Stack>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === c.id ? null : c.id))} data-testid={`clipboard-delete-${c.id}`} aria-label={`Delete ${c.id}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(c.id)} data-testid={`clipboard-confirm-delete-${c.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={saving} onOpenChange={setSaving}>\n <SheetContent side=\"right\" title=\"Save clip\" description=\"URL or content required.\">\n <SaveForm\n onSubmit={async (body) => {\n await fetchJson('/api/clipboard/save', { method: 'POST', body });\n setSaving(false);\n refresh();\n }}\n onCancel={() => setSaving(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction SaveForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { url?: string; title?: string; content?: string; selection?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [url, setUrl] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [content, setContent] = useState<string>('');\n const [selection, setSelection] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>URL (optional)</span>\n <Input value={url} onChange={(e) => setUrl((e.target as HTMLInputElement).value)} data-testid=\"clipboard-form-url\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"clipboard-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Content</span>\n <Textarea value={content} rows={6} onChange={(e) => setContent((e.target as HTMLTextAreaElement).value)} data-testid=\"clipboard-form-content\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Selection (optional)</span>\n <Textarea value={selection} rows={3} onChange={(e) => setSelection((e.target as HTMLTextAreaElement).value)} data-testid=\"clipboard-form-selection\" />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || (!url.trim() && !content.trim())}\n data-testid=\"clipboard-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n await onSubmit({\n url: url.trim() || undefined,\n title: title.trim() || undefined,\n content: content.trim() || undefined,\n selection: selection.trim() || undefined,\n });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["ClipboardView","payload","useFetch","saving","setSaving","useState","confirmDelete","setConfirmDelete","error","setError","clips","useMemo","_a","refresh","useCallback","drop","id","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","ClipboardPaste","c","isConfirming","ExternalLink","cur","Trash2","Sheet","SheetContent","SaveForm","body","onSubmit","onCancel","url","setUrl","title","setTitle","content","setContent","selection","setSelection","busy","setBusy","Input","e","Textarea"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as t,j as e}from"./cmdk-DVxytz9i.js";import{S as v,I as o,k as I,j as w,U as L,u as y,d as c,h as S,i as z,F as k}from"./main-CdOm1Pj9.js";import{V as D}from"./ViewHeader-BqIPVKuG.js";import{C as b,b as C}from"./Card-Tyboihu7.js";import{I as P}from"./Input-BbFUDQnS.js";import{E}from"./EmptyState-DZ2ouKwd.js";import{P as R}from"./plug-Cmv0-T_e.js";import{R as M}from"./refresh-ccw-CHMprsm5.js";import{S as $}from"./save-DQKCKyZK.js";import{P as T}from"./plus-M6LYiKX8.js";import{P as A}from"./pencil-BanqaMw7.js";import{T as B}from"./trash-2-CL4khSRv.js";const F=[{id:"runtime",label:"Runtime config",icon:I},{id:"providers",label:"Providers",icon:w},{id:"mcps",label:"MCPs",icon:R},{id:"system-llm",label:"System LLM",icon:L}];function se(){const[s,n]=t.useState("runtime");return e.jsxs(v,{gap:4,"data-testid":"config-view",children:[e.jsx(D,{title:"Config",description:"Runtime config + providers + MCPs + system LLM."}),e.jsx(o,{gap:1,role:"tablist",children:F.map(r=>e.jsxs("button",{type:"button",role:"tab","aria-selected":s===r.id,onClick:()=>n(r.id),"data-testid":`config-tab-${r.id}`,style:{padding:"var(--space-2) var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:s===r.id?"color-mix(in oklch, var(--accent) 14%, transparent)":"var(--surface-0)",color:s===r.id?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:[e.jsx(r.icon,{size:14,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:6}}),r.label]},r.id))}),s==="runtime"&&e.jsx(N,{}),s==="providers"&&e.jsx(U,{}),s==="mcps"&&e.jsx(V,{}),s==="system-llm"&&e.jsx(H,{})]})}function N(){var h;const s=y("/api/config"),[n,r]=t.useState(""),[i,m]=t.useState(!1),[x,l]=t.useState(!1),[f,u]=t.useState(null);t.useEffect(()=>{var a;((a=s.data)==null?void 0:a.raw)!==void 0&&r(s.data.raw)},[(h=s.data)==null?void 0:h.raw]);const j=t.useCallback(()=>{s.refetch()},[s]),g=async()=>{m(!0),u(null),l(!1);try{await z("/api/config",{method:"PUT",body:n}),l(!0),j()}catch(a){u((a instanceof k,a.message))}finally{m(!1)}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Runtime config"}),e.jsxs(o,{gap:1,children:[e.jsxs(c,{variant:"ghost",onClick:j,"data-testid":"config-runtime-reload",children:[e.jsx(M,{size:14,"aria-hidden":!0})," Reload"]}),e.jsxs(c,{variant:"primary",onClick:()=>void g(),disabled:i,"data-testid":"config-runtime-save",children:[e.jsx($,{size:14,"aria-hidden":!0})," ",i?"Saving…":"Save"]})]})]}),s.loading&&s.data===null?e.jsx(S,{style:{height:240}}):e.jsx("textarea",{value:n,rows:16,"data-testid":"config-runtime-raw",onChange:a=>r(a.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",resize:"vertical"}}),x&&e.jsx("span",{"data-testid":"config-runtime-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"}),f!==null&&e.jsx("span",{role:"alert","data-testid":"config-runtime-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:f})]})})})}function U(){const s=y("/api/config/providers"),[n,r]=t.useState(!1),[i,m]=t.useState(null),[x,l]=t.useState(null),[f,u]=t.useState(null),j=t.useCallback(()=>{s.refetch()},[s]),g=t.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.providers)??[]},[s.data]),h=async a=>{u(null);try{await z(`/api/config/providers/${a}`,{method:"DELETE"}),l(null),j()}catch(p){u((p instanceof k,p.message))}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Providers"}),e.jsxs(o,{gap:1,children:[f!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:f}),e.jsxs(c,{variant:"primary",onClick:()=>r(!0),"data-testid":"config-providers-add",children:[e.jsx(T,{size:14,"aria-hidden":!0})," Add"]})]})]}),s.loading&&g.length===0?e.jsx(S,{style:{height:100}}):g.length===0?e.jsx(E,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No providers",description:"Add one or use Auto-add with key."}):e.jsx(v,{gap:1,children:g.map(a=>{const p=x===a.id;return e.jsxs("div",{"data-testid":`config-provider-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsxs(o,{align:"center",gap:2,children:[e.jsx("strong",{children:a.name||a.id}),a.groupId&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["group=",a.groupId]})]}),e.jsxs(o,{gap:1,children:[e.jsx(c,{variant:"ghost",onClick:()=>m(a.id),"data-testid":`config-provider-edit-${a.id}`,"aria-label":`Edit ${a.id}`,children:e.jsx(A,{size:14,"aria-hidden":!0})}),e.jsx(c,{variant:"ghost",onClick:()=>l(d=>d===a.id?null:a.id),"data-testid":`config-provider-delete-${a.id}`,"aria-label":`Delete ${a.id}`,children:e.jsx(B,{size:14,"aria-hidden":!0})})]})]}),p&&e.jsxs(o,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(c,{variant:"danger",onClick:()=>void h(a.id),"data-testid":`config-provider-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(c,{variant:"ghost",onClick:()=>l(null),children:"Cancel"})]})]},a.id)})})]})})})}function V(){const s=y("/api/config/mcps"),n=t.useMemo(()=>{var i;return((i=s.data)==null?void 0:i.mcps)??[]},[s.data]),r=t.useCallback(()=>{s.refetch()},[s]);return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsx(o,{align:"center",justify:"between",gap:2,children:e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"MCP servers"})}),s.loading&&n.length===0?e.jsx(S,{style:{height:60}}):n.length===0?e.jsx(E,{icon:e.jsx(R,{size:28,"aria-hidden":!0}),title:"No MCPs",description:"Add one via /api/config/mcps."}):e.jsx(v,{gap:1,children:n.map(i=>e.jsxs("div",{"data-testid":`config-mcp-row-${i.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",display:"flex",justifyContent:"space-between"},children:[e.jsx("strong",{children:i.name||i.id}),i.command&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:i.command})]},i.id))}),e.jsxs(c,{variant:"ghost",onClick:r,"data-testid":"config-mcps-refresh",children:[e.jsx(M,{size:14,"aria-hidden":!0})," Refresh"]})]})})})}function H(){const s=y("/api/llm/system-llm"),[n,r]=t.useState(!1),[i,m]=t.useState(""),[x,l]=t.useState(""),[f,u]=t.useState(!1),[j,g]=t.useState(!1),[h,a]=t.useState(null);t.useEffect(()=>{s.data&&(r(s.data.enabled),m(s.data.provider??""),l(s.data.model??""))},[s.data]);const p=async()=>{u(!0),a(null),g(!1);try{await z("/api/llm/system-llm",{method:"PUT",body:{enabled:n,provider:i,model:x}}),g(!0),s.refetch()}catch(d){a((d instanceof k,d.message))}finally{u(!1)}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"System LLM"}),s.loading&&s.data===null?e.jsx(S,{style:{height:100}}):e.jsxs(v,{gap:2,children:[e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("input",{type:"checkbox",checked:n,"data-testid":"config-system-llm-enabled",onChange:d=>r(d.target.checked)}),e.jsx("span",{style:{fontSize:"var(--fs-13)"},children:"Enabled"})]}),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:"Provider"}),e.jsx(P,{value:i,"data-testid":"config-system-llm-provider",onChange:d=>m(d.target.value)})]}),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:"Model"}),e.jsx(P,{value:x,"data-testid":"config-system-llm-model",onChange:d=>l(d.target.value)})]}),e.jsx(o,{justify:"end",gap:2,children:e.jsxs(c,{variant:"primary",onClick:()=>void p(),disabled:f,"data-testid":"config-system-llm-save",children:[e.jsx($,{size:14,"aria-hidden":!0})," ",f?"Saving…":"Save"]})}),j&&e.jsx("span",{"data-testid":"config-system-llm-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"}),h!==null&&e.jsx("span",{role:"alert","data-testid":"config-system-llm-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:h})]})]})})})}export{se as ConfigView};