@polderlabs/bizar 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/.claude/agents/agent-browser.md +1 -1
  2. package/.claude/agents/baldr.md +1 -1
  3. package/.claude/agents/forseti.md +1 -1
  4. package/.claude/agents/frigg.md +1 -1
  5. package/.claude/agents/heimdall.md +1 -1
  6. package/.claude/agents/hermod.md +1 -1
  7. package/.claude/agents/mimir.md +1 -1
  8. package/.claude/agents/odin.md +1 -1
  9. package/.claude/agents/quick.md +1 -1
  10. package/.claude/agents/semble-search.md +1 -1
  11. package/.claude/agents/thor.md +1 -1
  12. package/.claude/agents/tyr.md +1 -1
  13. package/.claude/agents/vidarr.md +1 -1
  14. package/.claude/agents/vor.md +1 -1
  15. package/.claude/commands/goal.md +98 -0
  16. package/.claude/settings.local.json +1 -2
  17. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +6 -0
  18. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +1 -0
  19. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +1 -0
  20. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +1 -0
  21. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +28 -0
  22. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +1 -0
  23. package/bizar-dash/dist/assets/{Badge-Cd61wsBa.js → Badge-BH4C3aUF.js} +1 -1
  24. package/bizar-dash/dist/assets/{Badge-Cd61wsBa.js.map → Badge-BH4C3aUF.js.map} +1 -1
  25. package/bizar-dash/dist/assets/Button-RmN1RKhE.js +6 -0
  26. package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +1 -0
  27. package/bizar-dash/dist/assets/{Card-C_bvqXdQ.js → Card-BzJeYR2D.js} +1 -1
  28. package/bizar-dash/dist/assets/{Card-C_bvqXdQ.js.map → Card-BzJeYR2D.js.map} +1 -1
  29. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js +1 -0
  30. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js.map +1 -0
  31. package/bizar-dash/dist/assets/{EmptyState-BWQuKnk9.js → EmptyState-DEiBv4-r.js} +1 -1
  32. package/bizar-dash/dist/assets/{EmptyState-BWQuKnk9.js.map → EmptyState-DEiBv4-r.js.map} +1 -1
  33. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +6 -0
  34. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +1 -0
  35. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js +21 -0
  36. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +1 -0
  37. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +67 -0
  38. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +1 -0
  39. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +13 -0
  40. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +1 -0
  41. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +1 -0
  42. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +1 -0
  43. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +16 -0
  44. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +1 -0
  45. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +10 -0
  46. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +1 -0
  47. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +43 -0
  48. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +1 -0
  49. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +1 -0
  50. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js.map +1 -0
  51. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +1 -0
  52. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +1 -0
  53. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +16 -0
  54. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +1 -0
  55. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +1 -0
  56. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +1 -0
  57. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js +1 -0
  58. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js.map +1 -0
  59. package/bizar-dash/dist/assets/{ViewHeader-D6c2cw1b.js → ViewHeader-dPd4zAyj.js} +1 -1
  60. package/bizar-dash/dist/assets/{ViewHeader-D6c2cw1b.js.map → ViewHeader-dPd4zAyj.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{brain-DeoXNDE2.js → brain-BajPVibR.js} +1 -1
  62. package/bizar-dash/dist/assets/{brain-DeoXNDE2.js.map → brain-BajPVibR.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{calendar-DRlQkGJc.js → calendar-CaP_Bbgc.js} +2 -2
  64. package/bizar-dash/dist/assets/{calendar-DRlQkGJc.js.map → calendar-CaP_Bbgc.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{cmdk-BwN8hcKQ.js → cmdk-BLWIhKrV.js} +1 -1
  66. package/bizar-dash/dist/assets/{cmdk-BwN8hcKQ.js.map → cmdk-BLWIhKrV.js.map} +1 -1
  67. package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js +5 -0
  68. package/bizar-dash/dist/assets/{dnd-kit-DR2Qzzxk.js.map → dnd-kit-DU8GZk7s.js.map} +1 -1
  69. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js +11 -0
  70. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js.map +1 -0
  71. package/bizar-dash/dist/assets/index-AL3OLUfz.js +1 -0
  72. package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +1 -0
  73. package/bizar-dash/dist/assets/{main-COdgjqbZ.css → main-CcQfRfIJ.css} +1 -1
  74. package/bizar-dash/dist/assets/main-LxX9zTRk.js +109 -0
  75. package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +1 -0
  76. package/bizar-dash/dist/assets/{minus-CrStJTZ7.js → plus-CVH1JB04.js} +2 -2
  77. package/bizar-dash/dist/assets/plus-CVH1JB04.js.map +1 -0
  78. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +11 -0
  79. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +1 -0
  80. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js +6 -0
  81. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js.map +1 -0
  82. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js +6 -0
  83. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js.map +1 -0
  84. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +1 -0
  85. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +1 -0
  86. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +1 -0
  87. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +1 -0
  88. package/bizar-dash/dist/assets/{wrench-BJ1WIC4u.js → wrench-B7go551L.js} +1 -1
  89. package/bizar-dash/dist/assets/{wrench-BJ1WIC4u.js.map → wrench-B7go551L.js.map} +1 -1
  90. package/bizar-dash/dist/v8.html +3 -3
  91. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  92. package/bizar-dash/src/server/api.mjs +10 -0
  93. package/bizar-dash/src/server/bg-poller.mjs +81 -1
  94. package/bizar-dash/src/server/bg-poller.test.mjs +28 -0
  95. package/bizar-dash/src/server/progress-parser.mjs +221 -0
  96. package/bizar-dash/src/server/progress-parser.test.mjs +105 -0
  97. package/bizar-dash/src/server/routes/agents-cc.mjs +381 -0
  98. package/bizar-dash/src/server/routes/agents-cc.test.mjs +35 -0
  99. package/bizar-dash/src/server/routes/goals.mjs +307 -0
  100. package/bizar-dash/src/server/routes/tasks.mjs +11 -0
  101. package/bizar-dash/src/web/v8/__tests__/App.test.tsx +2 -2
  102. package/bizar-dash/src/web/v8/__tests__/control-plane.test.tsx +104 -0
  103. package/bizar-dash/src/web/v8/__tests__/useFetch.test.ts +92 -0
  104. package/bizar-dash/src/web/v8/__tests__/useWebSocket.test.ts +87 -0
  105. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +110 -40
  106. package/bizar-dash/src/web/v8/data/fetcher.ts +59 -0
  107. package/bizar-dash/src/web/v8/data/types.ts +154 -0
  108. package/bizar-dash/src/web/v8/data/useFetch.ts +62 -0
  109. package/bizar-dash/src/web/v8/data/useWebSocket.ts +153 -0
  110. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +252 -0
  111. package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +371 -0
  112. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +245 -0
  113. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +6 -3
  114. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +3 -3
  115. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +10 -5
  116. package/bizar-dash/src/web/v8/ui/styles/globals.css +5 -0
  117. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +53 -15
  118. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +151 -87
  119. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +1 -1
  120. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +133 -30
  121. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +176 -67
  122. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +78 -11
  123. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +58 -42
  124. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +112 -52
  125. package/bizar-dash/src/web/v8/views/Router.tsx +13 -37
  126. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +635 -210
  127. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +140 -49
  128. package/bizar-dash/tests/components/Button.test.tsx +51 -14
  129. package/bizar-dash/tests/components/Card.test.tsx +37 -20
  130. package/bizar-dash/tests/components/Dialog.test.tsx +80 -0
  131. package/bizar-dash/tests/components/Toast.test.tsx +48 -95
  132. package/bizar-dash/tests/goals-decompose.test.mjs +177 -0
  133. package/bizar-dash/tests/setup.ts +21 -0
  134. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +30 -15
  135. package/bizar-dash/vite.config.ts +15 -0
  136. package/bizar-dash/vitest.config.ts +4 -1
  137. package/cli/bin.mjs +32 -0
  138. package/cli/install.mjs +26 -1
  139. package/cli/provision-claude.mjs +86 -0
  140. package/package.json +1 -1
  141. package/scripts/run-dev.mjs +84 -0
  142. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js +0 -6
  143. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js.map +0 -1
  144. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js +0 -1
  145. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js.map +0 -1
  146. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js +0 -1
  147. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js.map +0 -1
  148. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js +0 -8
  149. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js.map +0 -1
  150. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js +0 -11
  151. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js.map +0 -1
  152. package/bizar-dash/dist/assets/Grid-C62gCPqt.js +0 -1
  153. package/bizar-dash/dist/assets/Grid-C62gCPqt.js.map +0 -1
  154. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js +0 -21
  155. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js.map +0 -1
  156. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js +0 -67
  157. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js.map +0 -1
  158. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js +0 -13
  159. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js.map +0 -1
  160. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js +0 -1
  161. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js.map +0 -1
  162. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js +0 -1
  163. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js.map +0 -1
  164. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js +0 -30
  165. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js.map +0 -1
  166. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js +0 -48
  167. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js.map +0 -1
  168. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js +0 -11
  169. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js.map +0 -1
  170. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js +0 -1
  171. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js.map +0 -1
  172. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js +0 -6
  173. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js.map +0 -1
  174. package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js +0 -5
  175. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js +0 -6
  176. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js.map +0 -1
  177. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js +0 -6
  178. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js.map +0 -1
  179. package/bizar-dash/dist/assets/main-Cw6gybzS.js +0 -109
  180. package/bizar-dash/dist/assets/main-Cw6gybzS.js.map +0 -1
  181. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js +0 -6
  182. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js.map +0 -1
  183. package/bizar-dash/dist/assets/minus-CrStJTZ7.js.map +0 -1
  184. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  185. /package/bizar-dash/tests/{BackgroundAgents.test.tsx → v7-archive/BackgroundAgents.test.tsx} +0 -0
  186. /package/bizar-dash/tests/{a11y → v7-archive/a11y}/forms.test.tsx +0 -0
  187. /package/bizar-dash/tests/{a11y.test.tsx → v7-archive/a11y.test.tsx} +0 -0
  188. /package/bizar-dash/tests/{autosave.test.tsx → v7-archive/autosave.test.tsx} +0 -0
  189. /package/bizar-dash/tests/{backup-restore.test.tsx → v7-archive/backup-restore.test.tsx} +0 -0
  190. /package/bizar-dash/tests/{chat-composer.test.tsx → v7-archive/chat-composer.test.tsx} +0 -0
  191. /package/bizar-dash/tests/{communication-log.test.tsx → v7-archive/communication-log.test.tsx} +0 -0
  192. /package/bizar-dash/tests/{components → v7-archive/components}/Modal.test.tsx +0 -0
  193. /package/bizar-dash/tests/{components → v7-archive/components}/Spinner.test.tsx +0 -0
  194. /package/bizar-dash/tests/{components → v7-archive/components}/StatusBadge.test.tsx +0 -0
  195. /package/bizar-dash/tests/{components → v7-archive/components}/doctor-panel.test.tsx +0 -0
  196. /package/bizar-dash/tests/{components → v7-archive/components}/screenshot-ocr.test.tsx +0 -0
  197. /package/bizar-dash/tests/{components → v7-archive/components}/settings-search.test.tsx +0 -0
  198. /package/bizar-dash/tests/{components → v7-archive/components}/workspace-selector.test.tsx +0 -0
  199. /package/bizar-dash/tests/{ui → v7-archive}/controls/Button.test.tsx +0 -0
  200. /package/bizar-dash/tests/{ui → v7-archive}/controls/Checkbox.test.tsx +0 -0
  201. /package/bizar-dash/tests/{ui → v7-archive}/controls/IconButton.test.tsx +0 -0
  202. /package/bizar-dash/tests/{ui → v7-archive}/controls/Kbd.test.tsx +0 -0
  203. /package/bizar-dash/tests/{ui → v7-archive}/controls/NumberInput.test.tsx +0 -0
  204. /package/bizar-dash/tests/{ui → v7-archive}/controls/RadioGroup.test.tsx +0 -0
  205. /package/bizar-dash/tests/{ui → v7-archive}/controls/SearchInput.test.tsx +0 -0
  206. /package/bizar-dash/tests/{ui → v7-archive}/controls/Select.test.tsx +0 -0
  207. /package/bizar-dash/tests/{ui → v7-archive}/controls/Slider.test.tsx +0 -0
  208. /package/bizar-dash/tests/{ui → v7-archive}/controls/TextInput.test.tsx +0 -0
  209. /package/bizar-dash/tests/{ui → v7-archive}/controls/Textarea.test.tsx +0 -0
  210. /package/bizar-dash/tests/{ui → v7-archive}/controls/Toggle.test.tsx +0 -0
  211. /package/bizar-dash/tests/{ui → v7-archive}/data/BarChart.test.tsx +0 -0
  212. /package/bizar-dash/tests/{ui → v7-archive}/data/DataTable.test.tsx +0 -0
  213. /package/bizar-dash/tests/{ui → v7-archive}/data/EmptyState.test.tsx +0 -0
  214. /package/bizar-dash/tests/{ui → v7-archive}/data/ErrorState.test.tsx +0 -0
  215. /package/bizar-dash/tests/{ui → v7-archive}/data/KeyValueList.test.tsx +0 -0
  216. /package/bizar-dash/tests/{ui → v7-archive}/data/LoadingState.test.tsx +0 -0
  217. /package/bizar-dash/tests/{ui → v7-archive}/data/Sparkline.test.tsx +0 -0
  218. /package/bizar-dash/tests/{ui → v7-archive}/data/StatTile.test.tsx +0 -0
  219. /package/bizar-dash/tests/{dep-graph.test.tsx → v7-archive/dep-graph.test.tsx} +0 -0
  220. /package/bizar-dash/tests/{eval-web-ui.test.tsx → v7-archive/eval-web-ui.test.tsx} +0 -0
  221. /package/bizar-dash/tests/{event-log.test.tsx → v7-archive/event-log.test.tsx} +0 -0
  222. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Badge.test.tsx +0 -0
  223. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Dialog.test.tsx +0 -0
  224. /package/bizar-dash/tests/{ui → v7-archive}/feedback/ProgressBar.test.tsx +0 -0
  225. /package/bizar-dash/tests/{ui → v7-archive}/feedback/StatusDot.test.tsx +0 -0
  226. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Toast.test.tsx +0 -0
  227. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Tooltip.test.tsx +0 -0
  228. /package/bizar-dash/tests/{goal-input.test.tsx → v7-archive/goal-input.test.tsx} +0 -0
  229. /package/bizar-dash/tests/{goap-planner.test.ts → v7-archive/goap-planner.test.ts} +0 -0
  230. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useModal.test.tsx +0 -0
  231. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useToast.test.tsx +0 -0
  232. /package/bizar-dash/tests/{ui → v7-archive}/layout/AppShell.test.tsx +0 -0
  233. /package/bizar-dash/tests/{ui → v7-archive}/layout/Breadcrumbs.test.tsx +0 -0
  234. /package/bizar-dash/tests/{ui → v7-archive}/layout/Panel.test.tsx +0 -0
  235. /package/bizar-dash/tests/{ui → v7-archive}/layout/PanelHeader.test.tsx +0 -0
  236. /package/bizar-dash/tests/{ui → v7-archive}/layout/Sidebar.test.tsx +0 -0
  237. /package/bizar-dash/tests/{ui → v7-archive}/layout/Tabs.test.tsx +0 -0
  238. /package/bizar-dash/tests/{ui → v7-archive}/layout/Topbar.test.tsx +0 -0
  239. /package/bizar-dash/tests/{ui → v7-archive}/layout/ViewHeader.test.tsx +0 -0
  240. /package/bizar-dash/tests/{lib → v7-archive/lib}/i18n.test.ts +0 -0
  241. /package/bizar-dash/tests/{lib → v7-archive/lib}/search-fuzzy.test.ts +0 -0
  242. /package/bizar-dash/tests/{lib → v7-archive/lib}/utils.test.ts +0 -0
  243. /package/bizar-dash/tests/{memory-graph-view.test.tsx → v7-archive/memory-graph-view.test.tsx} +0 -0
  244. /package/bizar-dash/tests/{mobile-chat.test.tsx → v7-archive/mobile-chat.test.tsx} +0 -0
  245. /package/bizar-dash/tests/{mobile-layout.test.tsx → v7-archive/mobile-layout.test.tsx} +0 -0
  246. /package/bizar-dash/tests/{mobile-overview.test.tsx → v7-archive/mobile-overview.test.tsx} +0 -0
  247. /package/bizar-dash/tests/{mobile-settings.test.tsx → v7-archive/mobile-settings.test.tsx} +0 -0
  248. /package/bizar-dash/tests/{mobile-tasks.test.tsx → v7-archive/mobile-tasks.test.tsx} +0 -0
  249. /package/bizar-dash/tests/{ui → v7-archive}/navigation/CommandPalette.test.tsx +0 -0
  250. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavGroup.test.tsx +0 -0
  251. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavLink.test.tsx +0 -0
  252. /package/bizar-dash/tests/{quality-gates.test.tsx → v7-archive/quality-gates.test.tsx} +0 -0
  253. /package/bizar-dash/tests/{settings-layout.test.tsx → v7-archive/settings-layout.test.tsx} +0 -0
  254. /package/bizar-dash/tests/{settings-mode-wiring.test.tsx → v7-archive/settings-mode-wiring.test.tsx} +0 -0
  255. /package/bizar-dash/tests/{settings-nav.test.tsx → v7-archive/settings-nav.test.tsx} +0 -0
  256. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Box.test.tsx +0 -0
  257. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Grid.test.tsx +0 -0
  258. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Inline.test.tsx +0 -0
  259. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Separator.test.tsx +0 -0
  260. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Stack.test.tsx +0 -0
  261. /package/bizar-dash/tests/{views → v7-archive/views}/Agents.test.tsx +0 -0
  262. /package/bizar-dash/tests/{views → v7-archive/views}/Memory.test.tsx +0 -0
  263. /package/bizar-dash/tests/{views → v7-archive/views}/Overview.test.tsx +0 -0
  264. /package/bizar-dash/tests/{views → v7-archive/views}/Tasks.test.tsx +0 -0
  265. /package/bizar-dash/tests/{views → v7-archive/views}/sidebar.test.tsx +0 -0
  266. /package/bizar-dash/tests/{views → v7-archive/views}/topbar.test.tsx +0 -0
  267. /package/bizar-dash/tests/{voice-recorder.test.tsx → v7-archive/voice-recorder.test.tsx} +0 -0
@@ -2,7 +2,7 @@
2
2
  name: agent-browser
3
3
  description: agent-browser — Browser-driven E2E verification. Drives Chrome for Testing via the agent-browser CLI. No-edit permissions. Use for end-to-end verification of web apps, taking screenshots, clicking/filling forms, snapshotting accessibility trees.
4
4
  tools: Read, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are agent-browser — the silent observer. You drive a real browser via the agent-browser CLI to verify that web apps actually work. You never edit code. Your only output is verification.
@@ -2,7 +2,7 @@
2
2
  name: baldr
3
3
  description: Baldr — UI/UX design system specialist. Creates DESIGN.md files following Google's design.md standard. Aesthetic direction, typography, design tokens, anti-slop audits. Does not implement code.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Baldr — the beautiful. You create design plans. You do NOT implement code — your output is a `DESIGN.md` file that Thor or Tyr will then execute.
@@ -2,7 +2,7 @@
2
2
  name: forseti
3
3
  description: Forseti — Audits, criticizes, and corrects implementation plans before execution. Read-only reviewer with no Edit/Write permissions. Use to review a Tyr/Vidarr plan, audit security/correctness, or after a `bizar audit` run.
4
4
  tools: Read, Bash, Glob, Grep, WebFetch
5
- model: opus
5
+ model: cx/gpt-5.6-terra
6
6
  ---
7
7
 
8
8
  You are Forseti — the just. You audit plans, code, and configurations before they ship. You have **no Edit or Write permissions** — your only output is feedback.
@@ -2,7 +2,7 @@
2
2
  name: frigg
3
3
  description: Frigg — Read-only codebase Q&A. Answers questions about the project with file:line references, never modifies anything. Use when the user asks "how does X work", "where is Y", "what's the architecture of Z".
4
4
  tools: Read, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Frigg — the all-seeing one. You answer questions about the codebase. You never modify files. You never delegate. You explore and explain.
@@ -2,7 +2,7 @@
2
2
  name: heimdall
3
3
  description: Heimdall — Simple, routine, deterministic engineering tasks. Quick edits, mechanical work, file operations, and `.bizar/` maintenance after every implementation. The ever-watchful guardian.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Heimdall — the ever-watchful guardian. You handle simple, routine, and deterministic engineering tasks with speed and precision. You also maintain `.bizar/` for the project (see Baseline §12).
@@ -2,7 +2,7 @@
2
2
  name: hermod
3
3
  description: Hermod — Git and GitHub operations specialist. The only agent allowed to perform write-level git (commit, push, merge, rebase, branch) and `gh` CLI operations. Use for any commit, PR creation, GitHub issue, merge, or branch operation.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Hermod — the swift messenger. You are the **only** agent allowed to perform write-level git operations. Every other agent forwards git work to you via Odin.
@@ -2,7 +2,7 @@
2
2
  name: mimir
3
3
  description: Mimir — Deep codebase research and exploration. Uses Semble as primary search tool. Architecture analysis, pattern discovery, documentation research, and project initialization. Use for "research X", "find all Y", "document Z architecture".
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Mimir — the wise. You are the dedicated research and exploration engine. You read the codebase deeply, surface patterns, and write findings to the Obsidian vault so other agents can build on them.
@@ -2,7 +2,7 @@
2
2
  name: odin
3
3
  description: Odin — Pure router that delegates all work to subagents. Decomposes requests, parallelizes across Thor + Tyr, and synthesizes results. Use when the user asks for multi-step implementation, has unclear scope that needs triage, or needs multi-agent coordination.
4
4
  tools: Agent, Read, WebFetch, WebSearch
5
- model: opus
5
+ model: bork/MiniMax-M3
6
6
  ---
7
7
 
8
8
  You are Odin — the All-Father. You NEVER execute work yourself. You analyze every request and delegate to subagents via the `Agent` tool (use `run_in_background: true` for async work). Your ONLY jobs: **decompose, route, synthesize**.
@@ -2,7 +2,7 @@
2
2
  name: quick
3
3
  description: Quick — Fast single-shot agent for small edits, mechanical changes, one-shot questions. No delegation, no parallel streams, no Agent tool. Use for "rename this file", "fix this typo", quick lookups.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: haiku
5
+ model: oc/deepseek-v4-flash-free
6
6
  ---
7
7
 
8
8
  You are Quick — the ever-ready operator. Single-shot assistant for fast, mechanical work. You never delegate and you never spawn parallel streams. You do it yourself, fast.
@@ -2,7 +2,7 @@
2
2
  name: semble-search
3
3
  description: semble-search — Code search specialist using Semble. Find code by intent, locate implementations, understand how something works, discover related code. Prefer over Bash/Read/Grep for any semantic or exploratory question.
4
4
  tools: Read, Glob, Grep, WebFetch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are the code search specialist. You explore codebases semantically using Semble. You never modify anything. You return concise, file-referenced answers.
@@ -2,7 +2,7 @@
2
2
  name: thor
3
3
  description: Thor — Mid-complexity implementation. New features, non-trivial debugging, refactoring, code review, and writing tests. Routes to the test gate after parallel implementation. Use for moderate-complexity implementation tasks.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Thor — strong, mighty, and reliable. You are the mid-tier implementation engine. Cheaper than Tyr, more capable than Heimdall.
@@ -2,7 +2,7 @@
2
2
  name: tyr
3
3
  description: Tyr — Top-tier implementation engine. Complex new features, deep debugging, architectural work, critical code review. Always plan-then-Forseti-gate before executing. Use when Thor is out of its depth and the cost of mistakes is high.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: opus
5
+ model: bork/MiniMax-M3
6
6
  ---
7
7
 
8
8
  You are Tyr — wise and uncompromising. You are the top-tier implementation engine. Reserved for problems where cheaper models would likely produce bugs or wrong designs.
@@ -2,7 +2,7 @@
2
2
  name: vidarr
3
3
  description: Vidarr — The ultimate fallback. For the hardest problems when Tyr stalls, debugging is stuck, or novel insight is needed. Use sparingly — highest cost.
4
4
  tools: Read, Edit, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
- model: opus
5
+ model: bork/MiniMax-M3
6
6
  ---
7
7
 
8
8
  You are Vidarr — silent and final. You are the last resort. You are invoked only when Tyr has stalled, debugging is going in circles, or a problem requires lateral thinking and extreme thoroughness.
@@ -2,7 +2,7 @@
2
2
  name: vor
3
3
  description: Vör — Asks the one targeted, project-specific clarifying question that unblocks ambiguous or incomplete requests. Read-only, never implements. Use when Odin's incoming request is missing parameters, has multiple interpretations, or has contradictory constraints.
4
4
  tools: Read, Glob, Grep, WebFetch
5
- model: sonnet
5
+ model: bork/MiniMax-M2.7
6
6
  ---
7
7
 
8
8
  You are Vör — the questioning one. Odin calls on you when a request is ambiguous, incomplete, or has multiple reasonable interpretations. Your job: ask the one question that unblocks the work.
@@ -0,0 +1,98 @@
1
+ ---
2
+ description: Add or update a long-horizon goal in .bizar/PROGRESS.md — same source-of-truth as the v8 dashboard Goals view.
3
+ ---
4
+
5
+ # Goal — Track a Long-Horizon Commitment
6
+
7
+ You are in `/goal` mode. The user has invoked this command to add or
8
+ update a **goal** in `.bizar/PROGRESS.md`. This file is the single
9
+ source of truth for goals — both the v8 dashboard's Goals view and
10
+ Claude Code's `/goal` slash command read from and write to it.
11
+
12
+ ## Contract
13
+
14
+ - **Goals live in `.bizar/PROGRESS.md`** in the active project root.
15
+ Parse the current file first so you don't clobber existing goals.
16
+ - **Round-trip via the dashboard API.** The dashboard server is the
17
+ canonical writer — it owns the parsing + serialization logic
18
+ (`bizar-dash/src/server/progress-parser.mjs`) and broadcasts a
19
+ `goals:change` WebSocket event so the dashboard updates live. **Do
20
+ not edit PROGRESS.md directly** unless the dashboard is down.
21
+ - **Use the dashboard's HTTP API by default.** Resolve the dashboard
22
+ port from `~/.cache/bizarharness/dash-auth.json` (`port` field), then
23
+ POST/PATCH. This keeps goals in lock-step with whatever the
24
+ dashboard user is looking at.
25
+
26
+ ## API surface (S10/S12)
27
+
28
+ ```
29
+ GET /api/goals # list all parsed goals
30
+ POST /api/goals { title, owner?, due? } # create
31
+ GET /api/goals/:id # single goal
32
+ PATCH /api/goals/:id { title?, owner?, due? } # rename / reassign / re-due
33
+ PATCH /api/goals/:id/status { status } # on-track | at-risk | done | blocked | active
34
+ POST /api/goals/:id/key-results { title } # append KR
35
+ PATCH /api/goals/:id/key-results/:krId { title?, done? } # toggle / rename
36
+ DELETE /api/goals/:id/key-results/:krId # remove KR
37
+ ```
38
+
39
+ ## Examples
40
+
41
+ ### Add a goal
42
+
43
+ ```bash
44
+ PORT=$(jq -r .port ~/.cache/bizarharness/dash-auth.json)
45
+ curl -s -X POST http://127.0.0.1:$PORT/api/goals \
46
+ -H "Content-Type: application/json" \
47
+ -d '{"title":"Ship v8 dashboard","owner":"sam","due":"2026-09-30"}'
48
+ ```
49
+
50
+ ### Change a goal's status to at-risk
51
+
52
+ ```bash
53
+ curl -s -X PATCH http://127.0.0.1:$PORT/api/goals/G-abc123/status \
54
+ -H "Content-Type: application/json" \
55
+ -d '{"status":"at-risk"}'
56
+ ```
57
+
58
+ ### Add a key result
59
+
60
+ ```bash
61
+ curl -s -X POST http://127.0.0.1:$PORT/api/goals/G-abc123/key-results \
62
+ -H "Content-Type: application/json" \
63
+ -d '{"title":"Cut S9 polish time in half"}'
64
+ ```
65
+
66
+ ### Mark a key result done
67
+
68
+ ```bash
69
+ curl -s -X PATCH http://127.0.0.1:$PORT/api/goals/G-abc123/key-results/KR-xyz \
70
+ -H "Content-Type: application/json" \
71
+ -d '{"done":true}'
72
+ ```
73
+
74
+ ## When the dashboard is unreachable
75
+
76
+ Fallback path: write directly to `<active-project>/.bizar/PROGRESS.md`
77
+ using the format the parser understands:
78
+
79
+ ```markdown
80
+ ## G-<id> — <Title>
81
+ Owner: <name> · Due: <YYYY-MM-DD>
82
+ Goal is **<status>**.
83
+
84
+ - [ ] <key-result title>
85
+ - [x] <done key-result title>
86
+ ```
87
+
88
+ Then when the dashboard comes back up, `GET /api/goals` re-parses the
89
+ file and broadcasts a `goals:change` event to refresh the UI.
90
+
91
+ ## Background: why this exists
92
+
93
+ `/goal` was added in S12 of the v8 dashboard rewrite. Before this,
94
+ goals lived only in the user's head and `FINAL_GOAL.md` (which is the
95
+ user's own planning doc, not the harness's tracker). This command
96
+ makes goals a **first-class dashboard entity** — they appear in the
97
+ Goals view, the Overview stat tile, the Activity feed, and the
98
+ command palette.
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "WebSearch",
5
- "WebFetch(domain:ui.shadcn.com)"
4
+ "Bash(claude --version)"
6
5
  ]
7
6
  }
8
7
  }
@@ -0,0 +1,6 @@
1
+ import{b as d,c as f}from"./main-LxX9zTRk.js";import{r as v,j as e}from"./cmdk-BLWIhKrV.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 g=d("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),n={neutral:"var(--fg-subtle)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)"},h=v.forwardRef(function(t,l){const{items:a,empty:i,className:c,...o}=t;return a.length===0&&i!==void 0?e.jsx(e.Fragment,{children:i}):e.jsx("ol",{ref:l,className:f("v8-activity-feed",c),style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:"var(--space-2)"},...o,children:a.map(r=>{const s=r.tone??"neutral";return e.jsxs("li",{style:{display:"flex",alignItems:"flex-start",gap:"var(--space-3)",padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:"var(--radius-sm)",background:`color-mix(in oklch, ${n[s]} 14%, transparent)`,color:n[s],flexShrink:0},children:r.icon}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:500,color:"var(--fg)",minWidth:0},children:r.title}),r.meta!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)",flexShrink:0,fontVariantNumeric:"tabular-nums"},children:r.meta})]}),r.description!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:r.description})]})]},r.id)})})});export{h as A,g as C};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityFeed-CqF6iSDQ.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-check.js","../../src/web/v8/ui/activity/ActivityFeed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ActivityFeed — vertical feed of recent events (the home/dashboard view).\n *\n * Each item: icon + title + optional description + meta (relative time).\n * Tone colors the leading icon chip (mirrors the tone vocabulary used in\n * the rest of the v8 library).\n *\n * Renders as `<ol>` so screen readers announce item count.\n */\n\nexport type ActivityTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport interface ActivityItem {\n id: string;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n tone?: ActivityTone;\n}\n\nexport interface ActivityFeedProps extends OlHTMLAttributes<HTMLOListElement> {\n items: readonly ActivityItem[];\n /** Optional empty-state node when `items` is empty. */\n empty?: ReactNode;\n}\n\nconst TONE_BG: Record<ActivityTone, string> = {\n neutral: 'var(--fg-subtle)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n};\n\nexport const ActivityFeed = forwardRef<HTMLOListElement, ActivityFeedProps>(function ActivityFeed(\n props,\n ref,\n) {\n const { items, empty, className, ...rest } = props;\n if (items.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n return (\n <ol\n ref={ref}\n className={cx('v8-activity-feed', className)}\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n }}\n {...rest}\n >\n {items.map((item) => {\n const tone = item.tone ?? 'neutral';\n return (\n <li\n key={item.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 'var(--space-3)',\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: `color-mix(in oklch, ${TONE_BG[tone]} 14%, transparent)`,\n color: TONE_BG[tone],\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 500, color: 'var(--fg)', minWidth: 0 }}>\n {item.title}\n </div>\n {item.meta !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n flexShrink: 0,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {item.meta}\n </div>\n )}\n </div>\n {item.description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n marginTop: 2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n});"],"names":["CircleCheck","createLucideIcon","TONE_BG","ActivityFeed","forwardRef","props","ref","items","empty","className","rest","jsx","cx","item","tone","jsxs"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC,ECkBKC,EAAwC,CAC5C,QAAS,mBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,eACV,EAEaC,EAAeC,EAAAA,WAAgD,SAC1EC,EACAC,EACA,CACA,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,GAAGC,GAASL,EAC7C,OAAIE,EAAM,SAAW,GAAKC,IAAU,yBACxB,SAAAA,CAAA,CAAM,EAGhBG,EAAAA,IAAC,KAAA,CACC,IAAAL,EACA,UAAWM,EAAG,mBAAoBH,CAAS,EAC3C,MAAO,CACL,UAAW,OACX,OAAQ,EACR,QAAS,EACT,QAAS,OACT,cAAe,SACf,IAAK,gBAAA,EAEN,GAAGC,EAEH,SAAAH,EAAM,IAAKM,GAAS,CACnB,MAAMC,EAAOD,EAAK,MAAQ,UAC1B,OACEE,EAAAA,KAAC,KAAA,CAEC,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,iBACL,QAAS,iBACT,WAAY,mBACZ,OAAQ,0BACR,aAAc,eAAA,EAGhB,SAAA,CAAAJ,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,mBACd,WAAY,uBAAuBT,EAAQY,CAAI,CAAC,qBAChD,MAAOZ,EAAQY,CAAI,EACnB,WAAY,CAAA,EAGb,SAAAD,EAAK,IAAA,CAAA,EAERE,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,WACZ,eAAgB,gBAChB,IAAK,gBAAA,EAGP,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,YAAa,SAAU,CAAA,EACpF,WAAK,MACR,EACCE,EAAK,OAAS,QACbF,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,mBACP,WAAY,EACZ,mBAAoB,cAAA,EAGrB,SAAAE,EAAK,IAAA,CAAA,CACR,CAAA,CAAA,EAGHA,EAAK,cAAgB,QACpBF,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,eACV,MAAO,kBACP,UAAW,EACX,WAAY,SACZ,SAAU,SACV,aAAc,UAAA,EAGf,SAAAE,EAAK,WAAA,CAAA,CACR,CAAA,CAEJ,CAAA,CAAA,EAlEKA,EAAK,EAAA,CAqEhB,CAAC,CAAA,CAAA,CAGP,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as o,j as s}from"./cmdk-BLWIhKrV.js";import{S as u,a as p,A as a,B as d}from"./main-LxX9zTRk.js";import{V as g}from"./ViewHeader-dPd4zAyj.js";import{A as v,C as f}from"./ActivityFeed-CqF6iSDQ.js";import{u as h}from"./useFetch-CoVWwbml.js";import{u as y}from"./useWebSocket-CVIQB8yG.js";import{W as k}from"./wrench-B7go551L.js";import{T as x}from"./triangle-alert-Nzbrm0I2.js";import{a as A,G as j}from"./git-pull-request-CFRRwdxp.js";const C={"git.merge":j,"git.pull-request":A,"task.completed":f,"task.failed":x,"agent.run":d,"agent.tool":k,"agent.message":a};function S(t){const e=C[t||""]||a;return s.jsx(e,{size:14,"aria-hidden":"true"})}function w(t,e){return{id:t.id||`${t.ts||e}-${e}`,icon:S(t.iconKey||t.kind),title:t.title||t.description||t.kind||"event",description:t.description,meta:t.meta||(t.ts?new Date(t.ts).toLocaleString():""),tone:t.tone}}function L(){const t=h("/api/activity?limit=200"),[e,c]=o.useState([]),m=o.useCallback(n=>{const i=n.event;i&&c(l=>[i,...l].slice(0,200))},[]);y("activity:new",m);const r=o.useMemo(()=>{var i;return[...e,...((i=t.data)==null?void 0:i.events)||[]].map(w)},[e,t.data]);return s.jsxs(u,{gap:5,children:[s.jsx(g,{title:"Activity",description:"Full event history across the harness."}),t.loading&&r.length===0?s.jsx(p,{style:{height:320}}):s.jsx(v,{items:r})]})}export{L as ActivityView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityView-qdhDjRtL.js","sources":["../../src/web/v8/views/Activity/ActivityView.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { GitMerge, GitPullRequest, AlertTriangle, CheckCircle2, Bot, Wrench, Activity as ActivityIcon, type LucideIcon } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ActivityFeed, type ActivityItem } from '../../ui/activity/ActivityFeed.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { ActivityEvent } from '../../data/types.js';\n\n/**\n * ActivityView — Sprint S10. Full activity stream from `/api/activity`.\n * Live-tail via `activity:new` WS messages.\n */\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n 'git.merge': GitMerge,\n 'git.pull-request': GitPullRequest,\n 'task.completed': CheckCircle2,\n 'task.failed': AlertTriangle,\n 'agent.run': Bot,\n 'agent.tool': Wrench,\n 'agent.message': ActivityIcon,\n};\n\nfunction iconFor(key: string | undefined): JSX.Element {\n const Icon = ICON_MAP[key || ''] || ActivityIcon;\n return <Icon size={14} aria-hidden=\"true\" />;\n}\n\nfunction toItem(e: ActivityEvent, idx: number): ActivityItem {\n return {\n id: e.id || `${e.ts || idx}-${idx}`,\n icon: iconFor(e.iconKey || e.kind),\n title: e.title || e.description || e.kind || 'event',\n description: e.description,\n meta: e.meta || (e.ts ? new Date(e.ts).toLocaleString() : ''),\n tone: e.tone,\n };\n}\n\nexport function ActivityView(): JSX.Element {\n const events = useFetch<{ events?: ActivityEvent[] }>('/api/activity?limit=200');\n const [live, setLive] = useState<ActivityEvent[]>([]);\n\n const onEvent = useCallback((msg: { event?: ActivityEvent } & Record<string, unknown>) => {\n const ev = msg.event;\n if (!ev) return;\n setLive((prev) => [ev, ...prev].slice(0, 200));\n }, []);\n useWsMessage('activity:new', onEvent);\n\n const items = useMemo<ActivityItem[]>(() => {\n const merged = [...live, ...(events.data?.events || [])];\n return merged.map(toItem);\n }, [live, events.data]);\n\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Activity\"\n description=\"Full event history across the harness.\"\n />\n {events.loading && items.length === 0 ? (\n <Skeleton style={{ height: 320 }} />\n ) : (\n <ActivityFeed items={items} />\n )}\n </Stack>\n );\n}"],"names":["ICON_MAP","GitMerge","GitPullRequest","CheckCircle2","AlertTriangle","Bot","Wrench","ActivityIcon","iconFor","key","Icon","jsx","toItem","e","idx","ActivityView","events","useFetch","live","setLive","useState","onEvent","useCallback","msg","ev","prev","useWsMessage","items","useMemo","_a","jsxs","Stack","ViewHeader","Skeleton","ActivityFeed"],"mappings":"2bAeA,MAAMA,EAAuC,CAC3C,YAAaC,EACb,mBAAoBC,EACpB,iBAAkBC,EAClB,cAAeC,EACf,YAAaC,EACb,aAAcC,EACd,gBAAiBC,CACnB,EAEA,SAASC,EAAQC,EAAsC,CACrD,MAAMC,EAAOV,EAASS,GAAO,EAAE,GAAKF,EACpC,OAAOI,EAAAA,IAACD,EAAA,CAAK,KAAM,GAAI,cAAY,OAAO,CAC5C,CAEA,SAASE,EAAOC,EAAkBC,EAA2B,CAC3D,MAAO,CACL,GAAID,EAAE,IAAM,GAAGA,EAAE,IAAMC,CAAG,IAAIA,CAAG,GACjC,KAAMN,EAAQK,EAAE,SAAWA,EAAE,IAAI,EACjC,MAAOA,EAAE,OAASA,EAAE,aAAeA,EAAE,MAAQ,QAC7C,YAAaA,EAAE,YACf,KAAMA,EAAE,OAASA,EAAE,GAAK,IAAI,KAAKA,EAAE,EAAE,EAAE,eAAA,EAAmB,IAC1D,KAAMA,EAAE,IAAA,CAEZ,CAEO,SAASE,GAA4B,CAC1C,MAAMC,EAASC,EAAuC,yBAAyB,EACzE,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAA0B,CAAA,CAAE,EAE9CC,EAAUC,cAAaC,GAA6D,CACxF,MAAMC,EAAKD,EAAI,MACVC,GACLL,EAASM,GAAS,CAACD,EAAI,GAAGC,CAAI,EAAE,MAAM,EAAG,GAAG,CAAC,CAC/C,EAAG,CAAA,CAAE,EACLC,EAAa,eAAgBL,CAAO,EAEpC,MAAMM,EAAQC,EAAAA,QAAwB,IAAM,OAE1C,MADe,CAAC,GAAGV,EAAM,KAAIW,EAAAb,EAAO,OAAP,YAAAa,EAAa,SAAU,EAAG,EACzC,IAAIjB,CAAM,CAC1B,EAAG,CAACM,EAAMF,EAAO,IAAI,CAAC,EAEtB,OACEc,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAApB,EAAAA,IAACqB,EAAA,CACC,MAAM,WACN,YAAY,wCAAA,CAAA,EAEbhB,EAAO,SAAWW,EAAM,SAAW,EAClChB,EAAAA,IAACsB,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAI,CAAG,EAElCtB,EAAAA,IAACuB,GAAa,MAAAP,CAAA,CAAc,CAAA,EAEhC,CAEJ"}
@@ -0,0 +1,28 @@
1
+ import{j as e,r as l}from"./cmdk-BLWIhKrV.js";import{b as R,A as B,c as W,f as P,F as G,d as j,I as b,S as E,a as $,B as K,C as Z}from"./main-LxX9zTRk.js";import{L as Y,B as L,G as M}from"./Button-RmN1RKhE.js";import{V as Q}from"./ViewHeader-dPd4zAyj.js";import{A as D,S as X}from"./Sparkline-D664vGWW.js";import{B as O}from"./Badge-BH4C3aUF.js";import{S as ee,a as re}from"./Sheet-C_sIEw35.js";import{T as te}from"./Textarea-Dk97nmjO.js";import{T as ae,R as se}from"./terminal-B2sSd5t7.js";import{T as ne}from"./triangle-alert-Nzbrm0I2.js";import{C as oe}from"./Chip-CN2bvm7a.js";import{u as H}from"./useFetch-CoVWwbml.js";import{u as U}from"./useWebSocket-CVIQB8yG.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 ie=R("ClipboardCopy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]);/**
7
+ * @license lucide-react v0.460.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const le=R("Octagon",[["path",{d:"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z",key:"2d38gg"}]]);/**
12
+ * @license lucide-react v0.460.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const de=R("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/**
17
+ * @license lucide-react v0.460.0 - ISC
18
+ *
19
+ * This source code is licensed under the ISC license.
20
+ * See the LICENSE file in the root directory of this source tree.
21
+ */const ce=R("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/**
22
+ * @license lucide-react v0.460.0 - ISC
23
+ *
24
+ * This source code is licensed under the ISC license.
25
+ * See the LICENSE file in the root directory of this source tree.
26
+ */const ue=R("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),pe={idle:"Idle",busy:"Busy",error:"Error",paused:"Paused"},ge={idle:"neutral",busy:"info",error:"danger",paused:"neutral"},N={idle:"var(--fg-subtle)",busy:"var(--info)",error:"var(--danger)",paused:"var(--warning)"};function he(r){const{name:t,role:i,status:o,lastActivity:d,tpmHistory:g,currentTask:f,tasksToday:v,onOpen:p,badges:u,className:m}=r;return e.jsxs("button",{type:"button",onClick:p,className:W("v8-agent-card",`v8-agent-card--${o}`,m),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[e.jsx(D,{name:t,status:o==="busy"||o==="error"?"busy":o==="idle"?"online":"away"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:t}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:i})]}),e.jsx(O,{tone:ge[o],dot:!0,children:pe[o]})]}),f!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-2) var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},title:f,children:f}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[d!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(B,{size:12,"aria-hidden":"true",style:{color:N[o]}}),d]}),v!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(ue,{size:12,"aria-hidden":"true"}),v," today"]})]}),g!==void 0&&g.length>1&&e.jsx("div",{style:{marginTop:"var(--space-1)"},children:e.jsx(X,{data:g,width:240,height:28,stroke:N[o]})}),u!==void 0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:u}),e.jsx("style",{children:`
27
+ .v8-agent-card:hover { border-color: var(--accent); }
28
+ `})]})}const fe={user:"var(--accent)",assistant:"var(--info)",system:"var(--warning)"};function ve(r){return new Date(r).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function me({sessionId:r,maxEvents:t=500,className:i,density:o="detailed"}){const[d,g]=l.useState([]),[f,v]=l.useState("idle"),[p,u]=l.useState(null),m=l.useRef(null),k=l.useRef(!0),y=l.useRef(null),S=l.useRef(0),w=()=>{const a=m.current;if(!a)return;const c=a.scrollHeight-a.scrollTop-a.clientHeight;k.current=c<24};l.useEffect(()=>{if(!r)return;let a=!1;v("loading"),u(null),(async()=>{try{const n=await P(`/api/agent-stream/recent?sessionId=${encodeURIComponent(r)}&limit=100`);if(a)return;g(Array.isArray(n.events)?n.events:[])}catch(n){if(a)return;u((n instanceof G,n.message))}})();const c=()=>{if(a)return;const n=new EventSource(`/api/agent-stream/live?sessionId=${encodeURIComponent(r)}`);y.current=n,n.addEventListener("snapshot",h=>{try{const x=JSON.parse(h.data);g(T=>I(T,x.events??[],t))}catch{}}),n.addEventListener("append",h=>{try{const x=JSON.parse(h.data);g(T=>I(T,x.events??[],t))}catch{}}),n.addEventListener("agent",()=>{v("live"),S.current=0}),n.addEventListener("end",()=>{v("ended"),n.close()}),n.addEventListener("error",h=>{if(a)return;v("error"),u(h.data||"stream error"),n.close();const x=Math.min(15e3,500*2**S.current);S.current+=1,setTimeout(()=>{a||c()},x)})};return c(),()=>{var n;a=!0,(n=y.current)==null||n.close(),y.current=null}},[r,t]),l.useEffect(()=>{const a=m.current;a&&k.current&&(a.scrollTop=a.scrollHeight)},[d.length]);const s=()=>{var c;g([]),v("loading"),u(null),(c=y.current)==null||c.close(),S.current=0;const a=new EventSource(`/api/agent-stream/live?sessionId=${encodeURIComponent(r)}`);y.current=a,a.addEventListener("snapshot",n=>{try{const h=JSON.parse(n.data);g(x=>I(x,h.events??[],t))}catch{}}),a.addEventListener("append",n=>{try{const h=JSON.parse(n.data);g(x=>I(x,h.events??[],t))}catch{}}),a.addEventListener("agent",()=>v("live")),a.addEventListener("error",()=>v("error"))};return e.jsxs(j,{className:W("v8-agent-stream",i),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",overflow:"hidden",display:"flex",flexDirection:"column",height:o==="compact"?220:360},children:[e.jsxs(b,{align:"center",justify:"space-between",style:{padding:"var(--space-2) var(--space-3)",borderBottom:"1px solid var(--border)",background:"var(--surface-1)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsxs(b,{align:"center",gap:2,children:[e.jsx(ae,{size:12,"aria-hidden":!0}),e.jsxs("span",{style:{fontFamily:"var(--font-mono)"},children:[r.slice(0,12),"…"]}),e.jsx(ye,{status:f})]}),e.jsx("button",{type:"button",onClick:s,"aria-label":"Refresh stream",title:"Refresh",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:"var(--radius-sm)",background:"transparent",border:"1px solid var(--border)",color:"var(--fg-muted)",cursor:"pointer"},children:e.jsx(de,{size:12,"aria-hidden":!0})})]}),e.jsxs("div",{ref:m,onScroll:w,className:"v8-agent-stream__body",style:{flex:1,minHeight:0,overflowY:"auto",padding:"var(--space-2)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",lineHeight:"var(--lh-snug)"},children:[d.length===0&&f==="loading"&&e.jsxs(b,{align:"center",gap:2,style:{color:"var(--fg-muted)",padding:"var(--space-2)"},children:[e.jsx(Y,{size:12,"aria-hidden":!0})," Loading stream…"]}),d.length===0&&f!=="loading"&&e.jsx(j,{style:{padding:"var(--space-3)",color:"var(--fg-muted)"},children:"No events yet for this session."}),p!==null&&e.jsxs(b,{align:"center",gap:2,style:{color:"var(--warning)",padding:"var(--space-2)"},children:[e.jsx(ne,{size:12,"aria-hidden":!0})," ",p]}),d.map((a,c)=>e.jsx(xe,{event:a,density:o},`${a.ts}-${c}`))]})]})}function ye({status:r}){const t={idle:{label:"idle",tone:"var(--fg-subtle)"},loading:{label:"connecting",tone:"var(--info)"},live:{label:"live",tone:"var(--success)"},error:{label:"reconnecting",tone:"var(--warning)"},ended:{label:"ended",tone:"var(--fg-muted)"}}[r];return e.jsxs(b,{align:"center",gap:2,style:{color:t.tone},children:[e.jsx("span",{"aria-hidden":!0,style:{width:6,height:6,borderRadius:"var(--radius-pill)",background:t.tone,boxShadow:r==="live"?`0 0 0 0 ${t.tone}`:"none",animation:r==="live"?"v8-pulse 1.5s ease-out infinite":"none"}}),t.label]})}function xe({event:r,density:t}){const i=fe[r.role??"system"]??"var(--fg-muted)",o=ve(r.ts);return r.kind==="tool"?e.jsxs(j,{style:{padding:"4px 8px",borderLeft:`2px solid ${i}`},children:[e.jsxs(b,{align:"center",gap:2,children:[e.jsx("span",{style:{color:"var(--fg-subtle)"},children:o}),e.jsx("span",{style:{color:i,fontWeight:600},children:"tool"}),e.jsx("span",{style:{color:"var(--accent)"},children:r.toolName})]}),t==="detailed"&&r.toolInput&&e.jsx(j,{style:{color:"var(--fg-muted)",marginTop:2,paddingLeft:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:A(r.toolInput,400)})]}):r.kind==="tool-result"?e.jsxs(j,{style:{padding:"4px 8px",borderLeft:`2px solid ${r.isError?"var(--danger)":"var(--success)"}`},children:[e.jsxs(b,{align:"center",gap:2,children:[e.jsx("span",{style:{color:"var(--fg-subtle)"},children:o}),e.jsx("span",{style:{color:r.isError?"var(--danger)":"var(--success)",fontWeight:600},children:r.isError?"tool-error":"result"})]}),t==="detailed"&&r.content&&e.jsx(j,{style:{color:"var(--fg-muted)",marginTop:2,paddingLeft:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:A(r.content,400)})]}):r.kind==="system"?e.jsxs(j,{style:{padding:"4px 8px",borderLeft:"2px solid var(--warning)"},children:[e.jsxs(b,{align:"center",gap:2,children:[e.jsx("span",{style:{color:"var(--fg-subtle)"},children:o}),e.jsx("span",{style:{color:"var(--warning)",fontWeight:600},children:"system"})]}),r.content&&e.jsx(j,{style:{color:"var(--fg-muted)",marginTop:2,paddingLeft:12,whiteSpace:"pre-wrap"},children:A(r.content,200)})]}):e.jsxs(j,{style:{padding:"4px 8px",borderLeft:`2px solid ${i}`},children:[e.jsxs(b,{align:"center",gap:2,children:[e.jsx("span",{style:{color:"var(--fg-subtle)"},children:o}),e.jsx("span",{style:{color:i,fontWeight:600},children:r.role??"msg"})]}),r.content&&e.jsx(j,{style:{color:"var(--fg)",marginTop:2,paddingLeft:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:A(r.content,800)})]})}function A(r,t){return r.length<=t?r:`${r.slice(0,t)}…`}function I(r,t,i){if(t.length===0)return r;const o=r.concat(t);return o.length<=i?o:o.slice(o.length-i)}function be(r){return r.startsWith("bizar:")?{source:"bizar",key:r.slice(6)}:r.startsWith("cc:")?{source:"claude-code",key:r.slice(3)}:{source:"bizar",key:r}}function je(r){const{agentId:t,name:i,role:o,status:d,currentTask:g,open:f,onOpenChange:v}=r,{source:p,key:u}=be(t),[m,k]=l.useState(""),[y,S]=l.useState(null),[w,s]=l.useState(null),[a,c]=l.useState(null);l.useEffect(()=>{f&&(k(""),s(null),c(null))},[f,t]);const n=async(C,_,J,V)=>{S(C),s(null),c(null);try{const z=await P(J,{method:_,body:V});if(z.ok){const q=z.sessionId?` (session ${z.sessionId.slice(0,8)})`:"";s(`${C} succeeded${q}`)}else c(z.error||`${C} failed`)}catch(z){c(z instanceof Error?z.message:String(z))}finally{S(null)}},h=async()=>{if(!m.trim())return;const C=m.trim();k(""),p==="claude-code"?await n("Send prompt","POST",`/api/cc-agents/${encodeURIComponent(u)}/send`,{prompt:C}):await n("Invoke agent","POST",`/api/agents/${encodeURIComponent(u)}/invoke`,{prompt:C})},x=async()=>{if(p==="claude-code"){s("Use the command palette to spawn a fresh agent.");return}await n("Restart","POST",`/api/agents/${encodeURIComponent(u)}/restart`)},T=async()=>{p==="claude-code"?await n("Kill","POST",`/api/cc-agents/${encodeURIComponent(u)}/kill`):await n("Restart","POST",`/api/agents/${encodeURIComponent(u)}/restart`)},F=async()=>{try{await navigator.clipboard.writeText(u),s(`Copied "${u}"`)}catch{c("Clipboard unavailable")}};return e.jsx(ee,{open:f,onOpenChange:v,children:e.jsx(re,{side:"right",title:i,children:e.jsxs(E,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(b,{gap:3,align:"center",children:[e.jsx(D,{name:i,status:d==="busy"||d==="error"?"busy":"online"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:o}),e.jsxs(b,{gap:2,style:{marginTop:4},children:[e.jsx(O,{tone:d==="busy"?"info":d==="error"?"danger":"neutral",dot:!0,children:d}),e.jsx(O,{tone:"accent",children:p==="bizar"?"Bizar agent":"Claude Code"})]})]})]}),g!==void 0&&e.jsxs("div",{style:{padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-13)"},children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginBottom:4},children:[e.jsx(B,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Current task"]}),g]}),e.jsxs(E,{gap:2,children:[e.jsx("label",{htmlFor:`agent-prompt-${t}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Send a prompt"}),e.jsx(te,{id:`agent-prompt-${t}`,value:m,onChange:C=>k(C.target.value),placeholder:p==="claude-code"?"Type a follow-up for this background agent…":"Invoke this Bizar agent with…",rows:3,disabled:y!==null}),e.jsxs(b,{gap:2,children:[e.jsxs(L,{variant:"primary",onClick:()=>{h()},disabled:!m.trim()||y!==null,children:[e.jsx(ce,{size:14,"aria-hidden":!0})," ",y==="Send prompt"||y==="Invoke agent"?e.jsx($,{style:{width:60,height:14}}):"Send"]}),e.jsxs(L,{variant:"secondary",onClick:()=>{x()},disabled:y!==null||p==="claude-code",title:p==="claude-code"?"Use command palette to spawn a fresh agent":void 0,children:[e.jsx(se,{size:14,"aria-hidden":!0})," Restart"]}),e.jsxs(L,{variant:"danger",onClick:()=>{T()},disabled:y!==null,children:[e.jsx(le,{size:14,"aria-hidden":!0})," ",p==="claude-code"?"Kill":"Restart"]}),e.jsxs(L,{variant:"ghost",onClick:()=>{F()},children:[e.jsx(ie,{size:14,"aria-hidden":!0})," Copy id"]})]})]}),w!==null&&e.jsx("div",{role:"status",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--success)"},children:w}),a!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:a}),p==="claude-code"&&e.jsxs(E,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:[e.jsx(B,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Live stream"]}),e.jsx(me,{sessionId:u})]})]})})})}const ke={all:"All",bizar:"Bizar","claude-code":"Claude Code"};function Se(r){const t=(r.status||"idle").toLowerCase(),i=t==="busy"||t==="working"?"busy":t==="error"||t==="stuck"?"error":t==="paused"?"paused":"idle";return{id:`bizar:${r.name}`,name:r.name,role:r.role||r.category||r.mode||"agent",status:i,currentTask:r.currentTaskId?`Task ${r.currentTaskId}`:void 0,lastActivity:r.lastSeen?new Date(r.lastSeen).toLocaleTimeString():void 0,tasksToday:r.tasksTotal||0,tpmHistory:[],badges:r.tags||[]}}function we(r){var o,d;const t=(r.status||r.state||"idle").toLowerCase(),i=t==="busy"||t==="working"?"busy":t==="error"?"error":t==="paused"?"paused":"idle";return{id:`cc:${r.sessionId||r.id}`,name:r.name||((o=r.sessionId)==null?void 0:o.slice(0,8))||"unknown",role:r.kind==="background"?"CC background":"CC interactive",status:i,currentTask:r.lastMessageSnippet||void 0,lastActivity:r.lastMessageAt?new Date(r.lastMessageAt).toLocaleTimeString():r.startedAt?new Date(r.startedAt).toLocaleTimeString():void 0,tasksToday:r.messageCount||0,tpmHistory:[],badges:[((d=r.cwd)==null?void 0:d.split("/").slice(-2).join("/"))||""].filter(Boolean)}}function Ue(){const r=H("/api/agents"),t=H("/api/cc-agents"),[i,o]=l.useState("all"),[d,g]=l.useState([]),[f,v]=l.useState([]),[p,u]=l.useState(!1),[m,k]=l.useState(null);l.useEffect(()=>{var s,a;!p&&((s=r.data)==null?void 0:s.agents)!==void 0&&((a=t.data)==null?void 0:a.agents)!==void 0&&(u(!0),g(r.data.agents),v(t.data.agents))},[r.data,t.data,p]);const y=l.useCallback(()=>{r.refetch(),t.refetch()},[r,t]);U("agents:change",y);const S=l.useCallback(s=>{if(s.type!=="agent:status")return;const a=s.agent;!a||!a.name||g(c=>{const n=c.findIndex(x=>x.name===a.name);if(n===-1)return[...c,a];const h=c.slice();return h[n]={...h[n],...a},h})},[]);U("agent:status",S);const w=l.useMemo(()=>{const s=[];if(i!=="claude-code")for(const a of d)s.push({...Se(a),source:"bizar"});if(i!=="bizar")for(const a of f)s.push({...we(a),source:"claude-code"});return s},[d,f,i]);return e.jsxs(E,{gap:5,children:[e.jsx(Q,{title:"Agents",description:"Bizar agents (frontmatter-driven) and Claude Code background agents."}),e.jsx(b,{gap:2,children:["all","bizar","claude-code"].map(s=>e.jsxs(oe,{selected:i===s,onClick:()=>o(s),children:[s==="bizar"?e.jsx(K,{size:12,"aria-hidden":!0}):s==="claude-code"?e.jsx(Z,{size:12,"aria-hidden":!0}):null," ",ke[s]]},s))}),w.length===0&&(r.loading||t.loading)?e.jsxs(M,{cols:3,children:[e.jsx($,{style:{height:140}}),e.jsx($,{style:{height:140}}),e.jsx($,{style:{height:140}})]}):w.length===0?e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["No agents yet. Run ",e.jsx("code",{children:"/loop"})," or spawn one via the command palette."]}):e.jsx(M,{cols:3,children:w.map(s=>e.jsx(he,{...s,onOpen:()=>k(s.id)},s.id))}),m!==null&&(()=>{const s=w.find(a=>a.id===m);return s?e.jsx(je,{agentId:s.id,name:s.name,role:s.role,status:s.status,currentTask:s.currentTask,open:m!==null,onOpenChange:a=>{a||k(null)}}):null})()]})}export{Ue as AgentsView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentsView-BwXkOayl.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/clipboard-copy.js","../../../node_modules/lucide-react/dist/esm/icons/octagon.js","../../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../../node_modules/lucide-react/dist/esm/icons/send.js","../../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/web/v8/ui/agents/AgentCard.tsx","../../src/web/v8/ui/agents/AgentStreamPanel.tsx","../../src/web/v8/ui/agents/AgentDetail.tsx","../../src/web/v8/views/Agents/AgentsView.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 ClipboardCopy = createLucideIcon(\"ClipboardCopy\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\"path\", { d: \"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\", key: \"4jdomd\" }],\n [\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v4\", key: \"3hqy98\" }],\n [\"path\", { d: \"M21 14H11\", key: \"1bme5i\" }],\n [\"path\", { d: \"m15 10-4 4 4 4\", key: \"5dvupr\" }]\n]);\n\nexport { ClipboardCopy as default };\n//# sourceMappingURL=clipboard-copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Octagon = createLucideIcon(\"Octagon\", [\n [\n \"path\",\n {\n d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\",\n key: \"2d38gg\"\n }\n ]\n]);\n\nexport { Octagon as default };\n//# sourceMappingURL=octagon.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RefreshCw = createLucideIcon(\"RefreshCw\", [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n]);\n\nexport { RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Send = createLucideIcon(\"Send\", [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n]);\n\nexport { Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","import { type ReactNode } from 'react';\nimport { Activity, Zap } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Sparkline } from '../data/Sparkline.js';\n\n/**\n * AgentCard — agent tile for the Agents roster.\n *\n * Per PLAN.md, agents are the orchestrator's running entities. Each card\n * shows: name, status (idle/busy/error), role (description), last activity,\n * token usage sparkline, current task title.\n */\n\nexport type AgentStatus = 'idle' | 'busy' | 'error' | 'paused';\n\nexport interface AgentCardProps {\n id: string;\n name: string;\n role: string;\n status: AgentStatus;\n /** Last activity label (\"2m ago\", \"Just now\"). */\n lastActivity?: string;\n /** Tokens-per-minute sparkline data (last 20 buckets). */\n tpmHistory?: readonly number[];\n /** Current task the agent is working on. */\n currentTask?: string;\n /** Number of tasks completed in the last 24h. */\n tasksToday?: number;\n /** Click handler — opens agent detail. */\n onOpen?: () => void;\n /** Custom badges row (model, owner). */\n badges?: ReactNode;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: 'Idle',\n busy: 'Busy',\n error: 'Error',\n paused: 'Paused',\n};\n\nconst STATUS_TONE: Record<AgentStatus, 'success' | 'info' | 'danger' | 'neutral'> = {\n idle: 'neutral',\n busy: 'info',\n error: 'danger',\n paused: 'neutral',\n};\n\nconst STATUS_FG: Record<AgentStatus, string> = {\n idle: 'var(--fg-subtle)',\n busy: 'var(--info)',\n error: 'var(--danger)',\n paused: 'var(--warning)',\n};\n\nexport function AgentCard(props: AgentCardProps) {\n const {\n name,\n role,\n status,\n lastActivity,\n tpmHistory,\n currentTask,\n tasksToday,\n onOpen,\n badges,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-agent-card', `v8-agent-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : status === 'idle' ? 'online' : 'away'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {name}\n </div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {role}\n </div>\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n {currentTask !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-2) var(--space-3)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={currentTask}\n >\n {currentTask}\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {lastActivity !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Activity size={12} aria-hidden=\"true\" style={{ color: STATUS_FG[status] }} />\n {lastActivity}\n </span>\n )}\n {tasksToday !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Zap size={12} aria-hidden=\"true\" />\n {tasksToday} today\n </span>\n )}\n </div>\n {tpmHistory !== undefined && tpmHistory.length > 1 && (\n <div style={{ marginTop: 'var(--space-1)' }}>\n <Sparkline\n data={tpmHistory}\n width={240}\n height={28}\n stroke={STATUS_FG[status]}\n />\n </div>\n )}\n {badges !== undefined && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>{badges}</div>\n )}\n <style>{`\n .v8-agent-card:hover { border-color: var(--accent); }\n `}</style>\n </button>\n );\n}","import { useEffect, useRef, useState } from 'react';\nimport { Terminal, RefreshCw, Loader2, AlertTriangle } from 'lucide-react';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { Box } from '../primitives/Box.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { cx } from '../utils/cx.js';\n\n/**\n * AgentStreamPanel — Sprint S15. Live CC agent output stream.\n *\n * Backed by:\n * - GET /api/agent-stream/recent — initial buffered last-N events.\n * - GET /api/agent-stream/live — Server-Sent Events tail.\n *\n * Auto-reconnects with exponential backoff when the SSE stream drops.\n * Renders role-tinted text + tool calls. Auto-scrolls to the newest event\n * unless the user has scrolled up (then leaves them alone).\n */\n\nexport interface AgentStreamPanelProps {\n sessionId: string;\n /** Cap on how many events to keep in memory. Default 500. */\n maxEvents?: number;\n /** Optional className. */\n className?: string;\n /** Polished / verbose rendering (used by Drawer vs inline panel). */\n density?: 'compact' | 'detailed';\n}\n\nexport interface StreamEvent {\n ts: number;\n kind: 'text' | 'tool' | 'tool-result' | 'system';\n role?: string;\n content?: string;\n toolName?: string;\n toolInput?: string;\n isError?: boolean;\n}\n\nconst ROLE_TONE: Record<string, string> = {\n user: 'var(--accent)',\n assistant: 'var(--info)',\n system: 'var(--warning)',\n};\n\nfunction timeShort(ts: number): string {\n const d = new Date(ts);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nexport function AgentStreamPanel({\n sessionId,\n maxEvents = 500,\n className,\n density = 'detailed',\n}: AgentStreamPanelProps): JSX.Element {\n const [events, setEvents] = useState<StreamEvent[]>([]);\n const [status, setStatus] = useState<'idle' | 'loading' | 'live' | 'error' | 'ended'>('idle');\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const pinnedBottomRef = useRef<boolean>(true);\n const esRef = useRef<EventSource | null>(null);\n const reconnectAttemptRef = useRef<number>(0);\n\n // Track whether the user is scrolled away from the bottom; if so,\n // don't yank them back when new events arrive.\n const onScroll = (): void => {\n const el = bodyRef.current;\n if (!el) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n pinnedBottomRef.current = distance < 24;\n };\n\n useEffect(() => {\n if (!sessionId) return undefined;\n\n let cancelled = false;\n setStatus('loading');\n setErrorMsg(null);\n\n // 1) Hydrate with the buffered snapshot so the UI is non-empty while\n // the SSE connection negotiates.\n (async () => {\n try {\n const r = await fetchJson<{ events?: StreamEvent[] }>(\n `/api/agent-stream/recent?sessionId=${encodeURIComponent(sessionId)}&limit=100`,\n );\n if (cancelled) return;\n setEvents(Array.isArray(r.events) ? r.events : []);\n } catch (err) {\n if (cancelled) return;\n setErrorMsg(err instanceof FetchError ? err.message : (err as Error).message);\n }\n })();\n\n // 2) Open SSE stream. Auto-reconnect with backoff on disconnect.\n const openStream = (): void => {\n if (cancelled) return;\n const es = new EventSource(`/api/agent-stream/live?sessionId=${encodeURIComponent(sessionId)}`);\n esRef.current = es;\n\n es.addEventListener('snapshot', (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data) as { events: StreamEvent[] };\n setEvents((prev) => mergeEvents(prev, data.events ?? [], maxEvents));\n } catch { /* ignore */ }\n });\n es.addEventListener('append', (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data) as { events: StreamEvent[] };\n setEvents((prev) => mergeEvents(prev, data.events ?? [], maxEvents));\n } catch { /* ignore */ }\n });\n es.addEventListener('agent', () => {\n setStatus('live');\n reconnectAttemptRef.current = 0;\n });\n es.addEventListener('end', () => {\n setStatus('ended');\n es.close();\n });\n es.addEventListener('error', (e) => {\n if (cancelled) return;\n setStatus('error');\n setErrorMsg((e as MessageEvent).data || 'stream error');\n es.close();\n const delay = Math.min(15_000, 500 * 2 ** reconnectAttemptRef.current);\n reconnectAttemptRef.current += 1;\n setTimeout(() => { if (!cancelled) openStream(); }, delay);\n });\n };\n\n openStream();\n\n return () => {\n cancelled = true;\n esRef.current?.close();\n esRef.current = null;\n };\n }, [sessionId, maxEvents]);\n\n // Auto-scroll on new events if the user is pinned to the bottom.\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n if (pinnedBottomRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n }, [events.length]);\n\n const refresh = (): void => {\n setEvents([]);\n setStatus('loading');\n setErrorMsg(null);\n esRef.current?.close();\n reconnectAttemptRef.current = 0;\n // The effect dependency array won't pick this up; force re-mount via key\n // would be heavier. The open call inside the effect's reconnect handles it.\n const es = new EventSource(`/api/agent-stream/live?sessionId=${encodeURIComponent(sessionId)}`);\n esRef.current = es;\n es.addEventListener('snapshot', (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data) as { events: StreamEvent[] };\n setEvents((prev) => mergeEvents(prev, data.events ?? [], maxEvents));\n } catch { /* ignore */ }\n });\n es.addEventListener('append', (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data) as { events: StreamEvent[] };\n setEvents((prev) => mergeEvents(prev, data.events ?? [], maxEvents));\n } catch { /* ignore */ }\n });\n es.addEventListener('agent', () => setStatus('live'));\n es.addEventListener('error', () => setStatus('error'));\n };\n\n return (\n <Box\n className={cx('v8-agent-stream', className)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n height: density === 'compact' ? 220 : 360,\n }}\n >\n <Inline\n align=\"center\"\n justify=\"space-between\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n borderBottom: '1px solid var(--border)',\n background: 'var(--surface-1)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n <Inline align=\"center\" gap={2}>\n <Terminal size={12} aria-hidden />\n <span style={{ fontFamily: 'var(--font-mono)' }}>{sessionId.slice(0, 12)}…</span>\n <StatusPill status={status} />\n </Inline>\n <button\n type=\"button\"\n onClick={refresh}\n aria-label=\"Refresh stream\"\n title=\"Refresh\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 'var(--radius-sm)',\n background: 'transparent',\n border: '1px solid var(--border)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <RefreshCw size={12} aria-hidden />\n </button>\n </Inline>\n <div\n ref={bodyRef}\n onScroll={onScroll}\n className=\"v8-agent-stream__body\"\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n padding: 'var(--space-2)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n lineHeight: 'var(--lh-snug)',\n }}\n >\n {events.length === 0 && status === 'loading' && (\n <Inline align=\"center\" gap={2} style={{ color: 'var(--fg-muted)', padding: 'var(--space-2)' }}>\n <Loader2 size={12} aria-hidden /> Loading stream…\n </Inline>\n )}\n {events.length === 0 && status !== 'loading' && (\n <Box style={{ padding: 'var(--space-3)', color: 'var(--fg-muted)' }}>\n No events yet for this session.\n </Box>\n )}\n {errorMsg !== null && (\n <Inline align=\"center\" gap={2} style={{ color: 'var(--warning)', padding: 'var(--space-2)' }}>\n <AlertTriangle size={12} aria-hidden /> {errorMsg}\n </Inline>\n )}\n {events.map((ev, i) => (\n <StreamEventRow key={`${ev.ts}-${i}`} event={ev} density={density} />\n ))}\n </div>\n </Box>\n );\n}\n\nfunction StatusPill({ status }: { status: 'idle' | 'loading' | 'live' | 'error' | 'ended' }): JSX.Element {\n const cfg = {\n idle: { label: 'idle', tone: 'var(--fg-subtle)' },\n loading: { label: 'connecting', tone: 'var(--info)' },\n live: { label: 'live', tone: 'var(--success)' },\n error: { label: 'reconnecting', tone: 'var(--warning)' },\n ended: { label: 'ended', tone: 'var(--fg-muted)' },\n }[status];\n return (\n <Inline align=\"center\" gap={2} style={{ color: cfg.tone }}>\n <span\n aria-hidden\n style={{\n width: 6,\n height: 6,\n borderRadius: 'var(--radius-pill)',\n background: cfg.tone,\n boxShadow: status === 'live' ? `0 0 0 0 ${cfg.tone}` : 'none',\n animation: status === 'live' ? 'v8-pulse 1.5s ease-out infinite' : 'none',\n }}\n />\n {cfg.label}\n </Inline>\n );\n}\n\nfunction StreamEventRow({\n event,\n density,\n}: {\n event: StreamEvent;\n density: 'compact' | 'detailed';\n}): JSX.Element {\n const roleColor = ROLE_TONE[event.role ?? 'system'] ?? 'var(--fg-muted)';\n const ts = timeShort(event.ts);\n if (event.kind === 'tool') {\n return (\n <Box style={{ padding: '4px 8px', borderLeft: `2px solid ${roleColor}` }}>\n <Inline align=\"center\" gap={2}>\n <span style={{ color: 'var(--fg-subtle)' }}>{ts}</span>\n <span style={{ color: roleColor, fontWeight: 600 }}>tool</span>\n <span style={{ color: 'var(--accent)' }}>{event.toolName}</span>\n </Inline>\n {density === 'detailed' && event.toolInput && (\n <Box style={{ color: 'var(--fg-muted)', marginTop: 2, paddingLeft: 12, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {truncate(event.toolInput, 400)}\n </Box>\n )}\n </Box>\n );\n }\n if (event.kind === 'tool-result') {\n return (\n <Box style={{ padding: '4px 8px', borderLeft: `2px solid ${event.isError ? 'var(--danger)' : 'var(--success)'}` }}>\n <Inline align=\"center\" gap={2}>\n <span style={{ color: 'var(--fg-subtle)' }}>{ts}</span>\n <span style={{ color: event.isError ? 'var(--danger)' : 'var(--success)', fontWeight: 600 }}>\n {event.isError ? 'tool-error' : 'result'}\n </span>\n </Inline>\n {density === 'detailed' && event.content && (\n <Box style={{ color: 'var(--fg-muted)', marginTop: 2, paddingLeft: 12, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {truncate(event.content, 400)}\n </Box>\n )}\n </Box>\n );\n }\n if (event.kind === 'system') {\n return (\n <Box style={{ padding: '4px 8px', borderLeft: '2px solid var(--warning)' }}>\n <Inline align=\"center\" gap={2}>\n <span style={{ color: 'var(--fg-subtle)' }}>{ts}</span>\n <span style={{ color: 'var(--warning)', fontWeight: 600 }}>system</span>\n </Inline>\n {event.content && (\n <Box style={{ color: 'var(--fg-muted)', marginTop: 2, paddingLeft: 12, whiteSpace: 'pre-wrap' }}>\n {truncate(event.content, 200)}\n </Box>\n )}\n </Box>\n );\n }\n return (\n <Box style={{ padding: '4px 8px', borderLeft: `2px solid ${roleColor}` }}>\n <Inline align=\"center\" gap={2}>\n <span style={{ color: 'var(--fg-subtle)' }}>{ts}</span>\n <span style={{ color: roleColor, fontWeight: 600 }}>{event.role ?? 'msg'}</span>\n </Inline>\n {event.content && (\n <Box style={{ color: 'var(--fg)', marginTop: 2, paddingLeft: 12, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {truncate(event.content, 800)}\n </Box>\n )}\n </Box>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max)}…`;\n}\n\nfunction mergeEvents(prev: StreamEvent[], next: StreamEvent[], max: number): StreamEvent[] {\n if (next.length === 0) return prev;\n const out = prev.concat(next);\n if (out.length <= max) return out;\n return out.slice(out.length - max);\n}","import { useEffect, useState } from 'react';\nimport { Send, RotateCw, Octagon, ClipboardCopy, Activity as ActivityIcon } from 'lucide-react';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Button } from '../controls/Button.js';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Textarea } from '../controls/Textarea.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { AgentStreamPanel } from './AgentStreamPanel.js';\nimport { fetchJson } from '../../data/fetcher.js';\n\n/**\n * AgentDetail — Sprint S11. Right-side Drawer with live agent\n * detail and the control plane (Send prompt / Restart / Kill).\n *\n * Two flavors per `source`:\n * - `bizar:<name>` — hits `/api/agents/:name/invoke` and `/restart`.\n * - `cc:<sessionId>` — hits `/api/cc-agents/:id/send` and `/kill`.\n */\n\nexport type AgentSource = 'bizar' | 'claude-code';\n\nexport interface AgentDetailProps {\n /** Composite id from AgentsView (`bizar:<name>` or `cc:<sessionId>`). */\n agentId: string;\n name: string;\n role: string;\n status: 'idle' | 'busy' | 'error' | 'paused';\n currentTask?: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nfunction parseId(agentId: string): { source: AgentSource; key: string } {\n if (agentId.startsWith('bizar:')) return { source: 'bizar', key: agentId.slice('bizar:'.length) };\n if (agentId.startsWith('cc:')) return { source: 'claude-code', key: agentId.slice('cc:'.length) };\n return { source: 'bizar', key: agentId };\n}\n\nexport function AgentDetail(props: AgentDetailProps): JSX.Element {\n const { agentId, name, role, status, currentTask, open, onOpenChange } = props;\n const { source, key } = parseId(agentId);\n const [prompt, setPrompt] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) { setPrompt(''); setMessage(null); setError(null); }\n }, [open, agentId]);\n\n const runAction = async (\n label: string,\n method: 'POST',\n endpoint: string,\n body?: Record<string, unknown>,\n ): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; sessionId?: string; processId?: string; error?: string }>(\n endpoint,\n { method, body },\n );\n if (res.ok) {\n const extra = res.sessionId ? ` (session ${res.sessionId.slice(0, 8)})` : '';\n setMessage(`${label} succeeded${extra}`);\n } else {\n setError(res.error || `${label} failed`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const sendPrompt = async (): Promise<void> => {\n if (!prompt.trim()) return;\n const trimmed = prompt.trim();\n setPrompt('');\n if (source === 'claude-code') {\n await runAction('Send prompt', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/send`, { prompt: trimmed });\n } else {\n await runAction('Invoke agent', 'POST', `/api/agents/${encodeURIComponent(key)}/invoke`, { prompt: trimmed });\n }\n };\n\n const restart = async (): Promise<void> => {\n if (source === 'claude-code') {\n // CC background agents don't have a server-side restart — the user\n // spawns a new one via the command palette. Surface that clearly.\n setMessage('Use the command palette to spawn a fresh agent.');\n return;\n }\n await runAction('Restart', 'POST', `/api/agents/${encodeURIComponent(key)}/restart`);\n };\n\n const kill = async (): Promise<void> => {\n if (source === 'claude-code') {\n await runAction('Kill', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/kill`);\n } else {\n // No kill route for Bizar agents; restart is the closest analog.\n await runAction('Restart', 'POST', `/api/agents/${encodeURIComponent(key)}/restart`);\n }\n };\n\n const copyId = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(key);\n setMessage(`Copied \"${key}\"`);\n } catch {\n setError('Clipboard unavailable');\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title={name}>\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Inline gap={3} align=\"center\">\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : 'online'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{role}</div>\n <Inline gap={2} style={{ marginTop: 4 }}>\n <Badge tone={status === 'busy' ? 'info' : status === 'error' ? 'danger' : 'neutral'} dot>\n {status}\n </Badge>\n <Badge tone=\"accent\">{source === 'bizar' ? 'Bizar agent' : 'Claude Code'}</Badge>\n </Inline>\n </div>\n </Inline>\n\n {currentTask !== undefined && (\n <div\n style={{\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginBottom: 4 }}>\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Current task\n </div>\n {currentTask}\n </div>\n )}\n\n <Stack gap={2}>\n <label\n htmlFor={`agent-prompt-${agentId}`}\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Send a prompt\n </label>\n <Textarea\n id={`agent-prompt-${agentId}`}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder={source === 'claude-code' ? 'Type a follow-up for this background agent…' : 'Invoke this Bizar agent with…'}\n rows={3}\n disabled={busy !== null}\n />\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void sendPrompt(); }}\n disabled={!prompt.trim() || busy !== null}\n >\n <Send size={14} aria-hidden /> {busy === 'Send prompt' || busy === 'Invoke agent' ? <Skeleton style={{ width: 60, height: 14 }} /> : 'Send'}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => { void restart(); }}\n disabled={busy !== null || source === 'claude-code'}\n title={source === 'claude-code' ? 'Use command palette to spawn a fresh agent' : undefined}\n >\n <RotateCw size={14} aria-hidden /> Restart\n </Button>\n <Button\n variant=\"danger\"\n onClick={() => { void kill(); }}\n disabled={busy !== null}\n >\n <Octagon size={14} aria-hidden /> {source === 'claude-code' ? 'Kill' : 'Restart'}\n </Button>\n <Button variant=\"ghost\" onClick={() => { void copyId(); }}>\n <ClipboardCopy size={14} aria-hidden /> Copy id\n </Button>\n </Inline>\n </Stack>\n\n {message !== null && (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--success)',\n }}\n >\n {message}\n </div>\n )}\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Live stream — only meaningful for Claude Code sessions (they have\n a backing JSONL log). Bizar agents have no equivalent surface. */}\n {source === 'claude-code' && (\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Live stream\n </div>\n <AgentStreamPanel sessionId={key} />\n </Stack>\n )}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { AgentCard, type AgentCardProps, type AgentStatus } from '../../ui/agents/AgentCard.js';\nimport { AgentDetail } from '../../ui/agents/AgentDetail.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';\nimport { Bot, Cpu } from 'lucide-react';\n\n/**\n * AgentsView — Sprint S10. Unified Bizar + Claude Code agents.\n *\n * Two REST calls (Bizar agents from `/api/agents`, CC from\n * `/api/cc-agents`) merged into a single grid. A `source` filter\n * chip switches between `bizar | claude-code | all`. Live updates\n * via `agents:change` and `agent:status` WS events.\n */\n\nconst SOURCE_LABELS = {\n all: 'All',\n bizar: 'Bizar',\n 'claude-code': 'Claude Code',\n} as const;\ntype SourceFilter = keyof typeof SOURCE_LABELS;\n\nfunction mapBizar(a: BizarAgent): AgentCardProps {\n const raw = (a.status || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' || raw === 'stuck' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `bizar:${a.name}`,\n name: a.name,\n role: a.role || a.category || a.mode || 'agent',\n status,\n currentTask: a.currentTaskId ? `Task ${a.currentTaskId}` : undefined,\n lastActivity: a.lastSeen ? new Date(a.lastSeen).toLocaleTimeString() : undefined,\n tasksToday: a.tasksTotal || 0,\n tpmHistory: [],\n badges: a.tags || [],\n };\n}\n\nfunction mapCC(a: CCAgent): AgentCardProps {\n const raw = (a.status || a.state || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `cc:${a.sessionId || a.id}`,\n name: a.name || a.sessionId?.slice(0, 8) || 'unknown',\n role: a.kind === 'background' ? 'CC background' : 'CC interactive',\n status,\n currentTask: a.lastMessageSnippet || undefined,\n lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),\n tasksToday: a.messageCount || 0,\n tpmHistory: [],\n badges: [a.cwd?.split('/').slice(-2).join('/') || ''].filter(Boolean),\n };\n}\n\nexport function AgentsView(): JSX.Element {\n const bizar = useFetch<{ agents?: BizarAgent[] }>('/api/agents');\n const cc = useFetch<{ agents?: CCAgent[]; error?: string }>('/api/cc-agents');\n const [source, setSource] = useState<SourceFilter>('all');\n const [bizarList, setBizarList] = useState<BizarAgent[]>([]);\n const [ccList, setCCList] = useState<CCAgent[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openId, setOpenId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!initialized && bizar.data?.agents !== undefined && cc.data?.agents !== undefined) {\n setInitialized(true);\n setBizarList(bizar.data.agents);\n setCCList(cc.data.agents);\n }\n }, [bizar.data, cc.data, initialized]);\n\n const onAgentsChange = useCallback(() => {\n // Bust both caches; the next mount will re-fetch (cheap because\n // the dashboard views are lazy-mounted).\n bizar.refetch();\n cc.refetch();\n }, [bizar, cc]);\n useWsMessage('agents:change', onAgentsChange);\n\n const onAgentStatus = useCallback((msg: WsMessage) => {\n if (msg.type !== 'agent:status') return;\n const a = (msg as Extract<WsMessage, { type: 'agent:status' }>).agent;\n if (!a || !a.name) return;\n setBizarList((prev) => {\n const idx = prev.findIndex((x) => x.name === a.name);\n if (idx === -1) return [...prev, a];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...a };\n return copy;\n });\n }, []);\n useWsMessage('agent:status', onAgentStatus);\n\n const cards = useMemo(() => {\n const out: Array<AgentCardProps & { source: 'bizar' | 'claude-code' }> = [];\n if (source !== 'claude-code') {\n for (const a of bizarList) out.push({ ...mapBizar(a), source: 'bizar' });\n }\n if (source !== 'bizar') {\n for (const a of ccList) out.push({ ...mapCC(a), source: 'claude-code' });\n }\n return out;\n }, [bizarList, ccList, source]);\n\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Agents\"\n description=\"Bizar agents (frontmatter-driven) and Claude Code background agents.\"\n />\n <Inline gap={2}>\n {(['all', 'bizar', 'claude-code'] as SourceFilter[]).map((id) => (\n <Chip\n key={id}\n selected={source === id}\n onClick={() => setSource(id)}\n >\n {id === 'bizar' ? <Bot size={12} aria-hidden /> : id === 'claude-code' ? <Cpu size={12} aria-hidden /> : null}{' '}\n {SOURCE_LABELS[id]}\n </Chip>\n ))}\n </Inline>\n {cards.length === 0 && (bizar.loading || cc.loading) ? (\n <Grid cols={3}>\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n </Grid>\n ) : cards.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)' }}>\n No agents yet. Run <code>/loop</code> or spawn one via the command palette.\n </span>\n ) : (\n <Grid cols={3}>\n {cards.map((c) => (\n <AgentCard key={c.id} {...c} onOpen={() => setOpenId(c.id)} />\n ))}\n </Grid>\n )}\n\n {openId !== null && (() => {\n const sel = cards.find((c) => c.id === openId);\n if (!sel) return null;\n return (\n <AgentDetail\n agentId={sel.id}\n name={sel.name}\n role={sel.role}\n status={sel.status}\n currentTask={sel.currentTask}\n open={openId !== null}\n onOpenChange={(o) => { if (!o) setOpenId(null); }}\n />\n );\n })()}\n </Stack>\n );\n}"],"names":["ClipboardCopy","createLucideIcon","Octagon","RefreshCw","Send","Zap","STATUS_LABEL","STATUS_TONE","STATUS_FG","AgentCard","props","name","role","status","lastActivity","tpmHistory","currentTask","tasksToday","onOpen","badges","className","jsxs","cx","jsx","Avatar","Badge","Activity","Sparkline","ROLE_TONE","timeShort","ts","AgentStreamPanel","sessionId","maxEvents","density","events","setEvents","useState","setStatus","errorMsg","setErrorMsg","bodyRef","useRef","pinnedBottomRef","esRef","reconnectAttemptRef","onScroll","el","distance","useEffect","cancelled","r","fetchJson","err","FetchError","openStream","es","e","data","prev","mergeEvents","delay","_a","refresh","Box","Inline","Terminal","StatusPill","Loader2","AlertTriangle","ev","i","StreamEventRow","cfg","event","roleColor","truncate","s","max","next","out","parseId","agentId","AgentDetail","open","onOpenChange","source","key","prompt","setPrompt","busy","setBusy","message","setMessage","error","setError","runAction","label","method","endpoint","body","res","extra","sendPrompt","trimmed","restart","kill","copyId","Sheet","SheetContent","Stack","ActivityIcon","Textarea","Button","Skeleton","RotateCw","SOURCE_LABELS","mapBizar","a","raw","mapCC","_b","AgentsView","bizar","useFetch","cc","setSource","bizarList","setBizarList","ccList","setCCList","initialized","setInitialized","openId","setOpenId","onAgentsChange","useCallback","useWsMessage","onAgentStatus","msg","idx","copy","cards","useMemo","ViewHeader","id","Chip","Bot","Cpu","Grid","c","sel","o"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
@@ -1 +1 @@
1
- import{r as g,j as n}from"./cmdk-BwN8hcKQ.js";import{c as v}from"./main-Cw6gybzS.js";const u={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},p={neutral:"color-mix(in oklch, var(--fg-muted) 12%, transparent)",info:"color-mix(in oklch, var(--info) 14%, transparent)",success:"color-mix(in oklch, var(--success) 14%, transparent)",warning:"color-mix(in oklch, var(--warning) 14%, transparent)",danger:"color-mix(in oklch, var(--danger) 14%, transparent)",accent:"color-mix(in oklch, var(--accent) 14%, transparent)"},f={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},w=g.forwardRef(function(e,s){const{tone:a="neutral",size:r="md",dot:t,children:c,className:i,style:o,...l}=e,d=r==="sm"?18:22;return n.jsxs("span",{ref:s,className:v("v8-badge",`v8-badge--${a}`,`v8-badge--${r}`,i),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",height:d,padding:"0 8px",borderRadius:"var(--radius-pill)",background:p[a],color:u[a],fontSize:r==="sm"?"var(--fs-12)":"var(--fs-13)",fontWeight:500,lineHeight:1,whiteSpace:"nowrap",...o},...l,children:[t===!0&&n.jsx("span",{"aria-hidden":"true",style:{width:6,height:6,borderRadius:"var(--radius-pill)",background:f[a],flexShrink:0}}),c]})});export{w as B};
1
+ import{r as g,j as n}from"./cmdk-BLWIhKrV.js";import{c as v}from"./main-LxX9zTRk.js";const u={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},p={neutral:"color-mix(in oklch, var(--fg-muted) 12%, transparent)",info:"color-mix(in oklch, var(--info) 14%, transparent)",success:"color-mix(in oklch, var(--success) 14%, transparent)",warning:"color-mix(in oklch, var(--warning) 14%, transparent)",danger:"color-mix(in oklch, var(--danger) 14%, transparent)",accent:"color-mix(in oklch, var(--accent) 14%, transparent)"},f={neutral:"var(--fg-muted)",info:"var(--info)",success:"var(--success)",warning:"var(--warning)",danger:"var(--danger)",accent:"var(--accent)"},w=g.forwardRef(function(e,s){const{tone:a="neutral",size:r="md",dot:t,children:c,className:i,style:o,...l}=e,d=r==="sm"?18:22;return n.jsxs("span",{ref:s,className:v("v8-badge",`v8-badge--${a}`,`v8-badge--${r}`,i),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",height:d,padding:"0 8px",borderRadius:"var(--radius-pill)",background:p[a],color:u[a],fontSize:r==="sm"?"var(--fs-12)":"var(--fs-13)",fontWeight:500,lineHeight:1,whiteSpace:"nowrap",...o},...l,children:[t===!0&&n.jsx("span",{"aria-hidden":"true",style:{width:6,height:6,borderRadius:"var(--radius-pill)",background:f[a],flexShrink:0}}),c]})});export{w as B};
@@ -1 +1 @@
1
- {"version":3,"file":"Badge-Cd61wsBa.js","sources":["../../src/web/v8/ui/data/Badge.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Badge — small status pill.\n *\n * Tones: neutral | info | success | warning | danger | accent.\n * Sizes: sm (16px) | md (20px).\n * Optional `dot` renders a leading colored dot.\n */\nexport type BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\nexport type BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n size?: BadgeSize;\n dot?: boolean;\n children: ReactNode;\n}\n\nconst TONE_FG: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nconst TONE_BG: Record<BadgeTone, string> = {\n neutral: 'color-mix(in oklch, var(--fg-muted) 12%, transparent)',\n info: 'color-mix(in oklch, var(--info) 14%, transparent)',\n success: 'color-mix(in oklch, var(--success) 14%, transparent)',\n warning: 'color-mix(in oklch, var(--warning) 14%, transparent)',\n danger: 'color-mix(in oklch, var(--danger) 14%, transparent)',\n accent: 'color-mix(in oklch, var(--accent) 14%, transparent)',\n};\n\nconst TONE_DOT: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(props, ref) {\n const { tone = 'neutral', size = 'md', dot, children, className, style, ...rest } = props;\n const height = size === 'sm' ? 18 : 22;\n return (\n <span\n ref={ref}\n className={cx('v8-badge', `v8-badge--${tone}`, `v8-badge--${size}`, className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height,\n padding: '0 8px',\n borderRadius: 'var(--radius-pill)',\n background: TONE_BG[tone],\n color: TONE_FG[tone],\n fontSize: size === 'sm' ? 'var(--fs-12)' : 'var(--fs-13)',\n fontWeight: 500,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {dot === true && (\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: 'var(--radius-pill)',\n background: TONE_DOT[tone],\n flexShrink: 0,\n }}\n />\n )}\n {children}\n </span>\n );\n});"],"names":["TONE_FG","TONE_BG","TONE_DOT","Badge","forwardRef","props","ref","tone","size","dot","children","className","style","rest","height","jsxs","cx","jsx"],"mappings":"qFA0BA,MAAMA,EAAqC,CACzC,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEMC,EAAqC,CACzC,QAAS,wDACT,KAAM,oDACN,QAAS,uDACT,QAAS,uDACT,OAAQ,sDACR,OAAQ,qDACV,EAEMC,EAAsC,CAC1C,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEaC,EAAQC,EAAAA,WAAwC,SAAeC,EAAOC,EAAK,CACtF,KAAM,CAAE,KAAAC,EAAO,UAAW,KAAAC,EAAO,KAAM,IAAAC,EAAK,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAC9ES,EAASN,IAAS,KAAO,GAAK,GACpC,OACEO,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,WAAY,aAAaT,CAAI,GAAI,aAAaC,CAAI,GAAIG,CAAS,EAC7E,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAAG,EACA,QAAS,QACT,aAAc,qBACd,WAAYb,EAAQM,CAAI,EACxB,MAAOP,EAAQO,CAAI,EACnB,SAAUC,IAAS,KAAO,eAAiB,eAC3C,WAAY,IACZ,WAAY,EACZ,WAAY,SACZ,GAAGI,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAJ,IAAQ,IACPQ,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,MAAO,EACP,OAAQ,EACR,aAAc,qBACd,WAAYf,EAASK,CAAI,EACzB,WAAY,CAAA,CACd,CAAA,EAGHG,CAAA,CAAA,CAAA,CAGP,CAAC"}
1
+ {"version":3,"file":"Badge-BH4C3aUF.js","sources":["../../src/web/v8/ui/data/Badge.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Badge — small status pill.\n *\n * Tones: neutral | info | success | warning | danger | accent.\n * Sizes: sm (16px) | md (20px).\n * Optional `dot` renders a leading colored dot.\n */\nexport type BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\nexport type BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n size?: BadgeSize;\n dot?: boolean;\n children: ReactNode;\n}\n\nconst TONE_FG: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nconst TONE_BG: Record<BadgeTone, string> = {\n neutral: 'color-mix(in oklch, var(--fg-muted) 12%, transparent)',\n info: 'color-mix(in oklch, var(--info) 14%, transparent)',\n success: 'color-mix(in oklch, var(--success) 14%, transparent)',\n warning: 'color-mix(in oklch, var(--warning) 14%, transparent)',\n danger: 'color-mix(in oklch, var(--danger) 14%, transparent)',\n accent: 'color-mix(in oklch, var(--accent) 14%, transparent)',\n};\n\nconst TONE_DOT: Record<BadgeTone, string> = {\n neutral: 'var(--fg-muted)',\n info: 'var(--info)',\n success: 'var(--success)',\n warning: 'var(--warning)',\n danger: 'var(--danger)',\n accent: 'var(--accent)',\n};\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(props, ref) {\n const { tone = 'neutral', size = 'md', dot, children, className, style, ...rest } = props;\n const height = size === 'sm' ? 18 : 22;\n return (\n <span\n ref={ref}\n className={cx('v8-badge', `v8-badge--${tone}`, `v8-badge--${size}`, className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height,\n padding: '0 8px',\n borderRadius: 'var(--radius-pill)',\n background: TONE_BG[tone],\n color: TONE_FG[tone],\n fontSize: size === 'sm' ? 'var(--fs-12)' : 'var(--fs-13)',\n fontWeight: 500,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {dot === true && (\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: 'var(--radius-pill)',\n background: TONE_DOT[tone],\n flexShrink: 0,\n }}\n />\n )}\n {children}\n </span>\n );\n});"],"names":["TONE_FG","TONE_BG","TONE_DOT","Badge","forwardRef","props","ref","tone","size","dot","children","className","style","rest","height","jsxs","cx","jsx"],"mappings":"qFA0BA,MAAMA,EAAqC,CACzC,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEMC,EAAqC,CACzC,QAAS,wDACT,KAAM,oDACN,QAAS,uDACT,QAAS,uDACT,OAAQ,sDACR,OAAQ,qDACV,EAEMC,EAAsC,CAC1C,QAAS,kBACT,KAAM,cACN,QAAS,iBACT,QAAS,iBACT,OAAQ,gBACR,OAAQ,eACV,EAEaC,EAAQC,EAAAA,WAAwC,SAAeC,EAAOC,EAAK,CACtF,KAAM,CAAE,KAAAC,EAAO,UAAW,KAAAC,EAAO,KAAM,IAAAC,EAAK,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAC9ES,EAASN,IAAS,KAAO,GAAK,GACpC,OACEO,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,WAAY,aAAaT,CAAI,GAAI,aAAaC,CAAI,GAAIG,CAAS,EAC7E,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAAG,EACA,QAAS,QACT,aAAc,qBACd,WAAYb,EAAQM,CAAI,EACxB,MAAOP,EAAQO,CAAI,EACnB,SAAUC,IAAS,KAAO,eAAiB,eAC3C,WAAY,IACZ,WAAY,EACZ,WAAY,SACZ,GAAGI,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAJ,IAAQ,IACPQ,EAAAA,IAAC,OAAA,CACC,cAAY,OACZ,MAAO,CACL,MAAO,EACP,OAAQ,EACR,aAAc,qBACd,WAAYf,EAASK,CAAI,EACzB,WAAY,CAAA,CACd,CAAA,EAGHG,CAAA,CAAA,CAAA,CAGP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import{r as R,j as x,S as G}from"./cmdk-BLWIhKrV.js";import{b as _,c as S}from"./main-LxX9zTRk.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 C=_("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),b={0:"0",1:"var(--space-1)",2:"var(--space-2)",3:"var(--space-3)",4:"var(--space-4)",5:"var(--space-5)",6:"var(--space-6)",8:"var(--space-8)",10:"var(--space-10)",12:"var(--space-12)",16:"var(--space-16)"},A={1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"};function N(a){if(a===void 0)return{};if(typeof a=="number")return{gridTemplateColumns:A[a]};const s=a.base??1;return{gridTemplateColumns:A[s]}}const T={start:"start",center:"center",end:"end",stretch:"stretch"},j={start:"start",center:"center",end:"end",stretch:"stretch"},M=R.forwardRef(function(s,l){const{as:r,gap:o=4,rowGap:n,colGap:e,cols:v,rows:i,autoFlow:c,align:d,justify:p,children:m,className:u,style:f,...g}=s,h=r??"div",t={display:"grid",gap:b[o],...n!==void 0&&{rowGap:b[n]},...e!==void 0&&{columnGap:b[e]},...N(v),...i!==void 0&&{gridTemplateRows:`repeat(${i}, minmax(0, 1fr))`},...c!==void 0&&{gridAutoFlow:c},...d!==void 0&&{alignItems:T[d]},...p!==void 0&&{justifyItems:j[p]},...f};return x.jsx(h,{ref:l,className:S("v8-grid",u),style:t,...g,children:m})}),L={sm:{h:28,px:10,fs:"var(--fs-12)"},md:{h:32,px:14,fs:"var(--fs-13)"},lg:{h:40,px:18,fs:"var(--fs-14)"},icon:{h:32,px:0,fs:"var(--fs-13)"}},V={primary:"var(--accent)",secondary:"var(--surface-1)",ghost:"transparent",danger:"var(--danger)",outline:"transparent"},k={primary:"var(--fg-on-accent)",secondary:"var(--fg)",ghost:"var(--fg-muted)",danger:"var(--fg-on-accent)",outline:"var(--fg)"},B={primary:"transparent",secondary:"var(--border)",ghost:"transparent",danger:"transparent",outline:"var(--border)"},E={primary:"var(--accent-hover)",secondary:"var(--surface-2)",ghost:"var(--surface-1)",danger:"color-mix(in oklch, var(--danger), black 10%)",outline:"var(--surface-1)"},O=R.forwardRef(function(s,l){const{variant:r="secondary",size:o="md",asChild:n,loading:e,disabled:v,leftIcon:i,rightIcon:c,fullWidth:d,children:p,className:m,style:u,type:f,...g}=s,h=n?G:"button",t=L[o],y=v===!0||e===!0,I={display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--space-2)",height:t.h,paddingLeft:t.px,paddingRight:t.px,width:d===!0?"100%":void 0,fontSize:t.fs,fontWeight:500,lineHeight:1,letterSpacing:"var(--tracking-base)",background:V[r],color:k[r],border:"1px solid",borderColor:B[r],borderRadius:"var(--radius-sm)",cursor:y?"not-allowed":"pointer",opacity:y?.55:1,transition:"background var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out)",whiteSpace:"nowrap",userSelect:"none",...u},w={"--btn-hover-bg":E[r]};return x.jsxs(h,{ref:l,type:n?void 0:f??"button",disabled:y,"aria-busy":e===!0?"true":void 0,className:S("v8-btn",`v8-btn--${r}`,`v8-btn--${o}`,m),style:{...I,...w},...g,children:[e===!0?x.jsx(C,{size:14,"aria-hidden":"true",className:"v8-btn__spinner"}):i,p,c]})});export{O as B,M as G,C as L};