@polderlabs/bizar 7.0.4 → 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 (627) 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 +7 -0
  17. package/bizar-dash/DESIGN.md +729 -969
  18. package/bizar-dash/GLYPH.md +418 -0
  19. package/bizar-dash/PLAN.md +1135 -0
  20. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +6 -0
  21. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +1 -0
  22. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +1 -0
  23. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +1 -0
  24. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +28 -0
  25. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +1 -0
  26. package/bizar-dash/dist/assets/Badge-BH4C3aUF.js +1 -0
  27. package/bizar-dash/dist/assets/Badge-BH4C3aUF.js.map +1 -0
  28. package/bizar-dash/dist/assets/Button-RmN1RKhE.js +6 -0
  29. package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +1 -0
  30. package/bizar-dash/dist/assets/Card-BzJeYR2D.js +1 -0
  31. package/bizar-dash/dist/assets/Card-BzJeYR2D.js.map +1 -0
  32. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js +1 -0
  33. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js.map +1 -0
  34. package/bizar-dash/dist/assets/EmptyState-DEiBv4-r.js +1 -0
  35. package/bizar-dash/dist/assets/EmptyState-DEiBv4-r.js.map +1 -0
  36. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +6 -0
  37. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +1 -0
  38. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js +21 -0
  39. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +1 -0
  40. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +67 -0
  41. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +1 -0
  42. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +13 -0
  43. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +1 -0
  44. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +1 -0
  45. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +1 -0
  46. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +16 -0
  47. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +1 -0
  48. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +10 -0
  49. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +1 -0
  50. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +43 -0
  51. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +1 -0
  52. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +1 -0
  53. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js.map +1 -0
  54. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +1 -0
  55. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +1 -0
  56. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +16 -0
  57. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +1 -0
  58. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +1 -0
  59. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +1 -0
  60. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js +1 -0
  61. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js.map +1 -0
  62. package/bizar-dash/dist/assets/ViewHeader-dPd4zAyj.js +6 -0
  63. package/bizar-dash/dist/assets/ViewHeader-dPd4zAyj.js.map +1 -0
  64. package/bizar-dash/dist/assets/brain-BajPVibR.js +6 -0
  65. package/bizar-dash/dist/assets/brain-BajPVibR.js.map +1 -0
  66. package/bizar-dash/dist/assets/calendar-CaP_Bbgc.js +6 -0
  67. package/bizar-dash/dist/assets/calendar-CaP_Bbgc.js.map +1 -0
  68. package/bizar-dash/dist/assets/cmdk-BLWIhKrV.js +80 -0
  69. package/bizar-dash/dist/assets/cmdk-BLWIhKrV.js.map +1 -0
  70. package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js +5 -0
  71. package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js.map +1 -0
  72. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js +11 -0
  73. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js.map +1 -0
  74. package/bizar-dash/dist/assets/index-AL3OLUfz.js +1 -0
  75. package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +1 -0
  76. package/bizar-dash/dist/assets/main-CcQfRfIJ.css +1 -0
  77. package/bizar-dash/dist/assets/main-LxX9zTRk.js +109 -0
  78. package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +1 -0
  79. package/bizar-dash/dist/assets/plus-CVH1JB04.js +6 -0
  80. package/bizar-dash/dist/assets/plus-CVH1JB04.js.map +1 -0
  81. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +11 -0
  82. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +1 -0
  83. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js +6 -0
  84. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js.map +1 -0
  85. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js +6 -0
  86. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js.map +1 -0
  87. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +1 -0
  88. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +1 -0
  89. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +1 -0
  90. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +1 -0
  91. package/bizar-dash/dist/assets/wrench-B7go551L.js +6 -0
  92. package/bizar-dash/dist/assets/wrench-B7go551L.js.map +1 -0
  93. package/bizar-dash/dist/{mobile.html → v8.html} +6 -9
  94. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  95. package/bizar-dash/src/server/api.mjs +10 -0
  96. package/bizar-dash/src/server/bg-poller.mjs +81 -1
  97. package/bizar-dash/src/server/bg-poller.test.mjs +28 -0
  98. package/bizar-dash/src/server/progress-parser.mjs +221 -0
  99. package/bizar-dash/src/server/progress-parser.test.mjs +105 -0
  100. package/bizar-dash/src/server/routes/agents-cc.mjs +381 -0
  101. package/bizar-dash/src/server/routes/agents-cc.test.mjs +35 -0
  102. package/bizar-dash/src/server/routes/goals.mjs +307 -0
  103. package/bizar-dash/src/server/routes/tasks.mjs +11 -0
  104. package/bizar-dash/src/server/server.mjs +1 -57
  105. package/bizar-dash/src/web/v8/App.tsx +188 -0
  106. package/bizar-dash/src/web/v8/__tests__/App.test.tsx +102 -0
  107. package/bizar-dash/src/web/v8/__tests__/AppShell.test.tsx +79 -0
  108. package/bizar-dash/src/web/v8/__tests__/PageSkeleton.test.tsx +12 -0
  109. package/bizar-dash/src/web/v8/__tests__/SettingsView.test.tsx +84 -0
  110. package/bizar-dash/src/web/v8/__tests__/Sidebar.test.tsx +95 -0
  111. package/bizar-dash/src/web/v8/__tests__/activity.test.tsx +63 -0
  112. package/bizar-dash/src/web/v8/__tests__/agents.test.tsx +90 -0
  113. package/bizar-dash/src/web/v8/__tests__/control-plane.test.tsx +104 -0
  114. package/bizar-dash/src/web/v8/__tests__/controls.test.tsx +135 -0
  115. package/bizar-dash/src/web/v8/__tests__/cx.test.ts +25 -0
  116. package/bizar-dash/src/web/v8/__tests__/data.test.tsx +293 -0
  117. package/bizar-dash/src/web/v8/__tests__/feedback.test.tsx +213 -0
  118. package/bizar-dash/src/web/v8/__tests__/goals.test.tsx +105 -0
  119. package/bizar-dash/src/web/v8/__tests__/kanban.test.tsx +176 -0
  120. package/bizar-dash/src/web/v8/__tests__/libraries.test.tsx +70 -0
  121. package/bizar-dash/src/web/v8/__tests__/memory.test.tsx +60 -0
  122. package/bizar-dash/src/web/v8/__tests__/navigation.test.tsx +137 -0
  123. package/bizar-dash/src/web/v8/__tests__/settings.test.tsx +104 -0
  124. package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +98 -0
  125. package/bizar-dash/src/web/v8/__tests__/useFetch.test.ts +92 -0
  126. package/bizar-dash/src/web/v8/__tests__/useWebSocket.test.ts +87 -0
  127. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +182 -0
  128. package/bizar-dash/src/web/v8/data/fetcher.ts +59 -0
  129. package/bizar-dash/src/web/v8/data/types.ts +154 -0
  130. package/bizar-dash/src/web/v8/data/useFetch.ts +62 -0
  131. package/bizar-dash/src/web/v8/data/useWebSocket.ts +153 -0
  132. package/bizar-dash/src/web/v8/main.tsx +28 -0
  133. package/bizar-dash/src/web/v8/shell/AppShell.tsx +90 -0
  134. package/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +29 -0
  135. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +361 -0
  136. package/bizar-dash/src/web/v8/shell/StatusBar.tsx +63 -0
  137. package/bizar-dash/src/web/v8/shell/Topbar.tsx +113 -0
  138. package/bizar-dash/src/web/v8/shell/index.ts +15 -0
  139. package/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +137 -0
  140. package/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +101 -0
  141. package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +158 -0
  142. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +252 -0
  143. package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +371 -0
  144. package/bizar-dash/src/web/v8/ui/controls/Button.tsx +141 -0
  145. package/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +32 -0
  146. package/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +49 -0
  147. package/bizar-dash/src/web/v8/ui/controls/Field.tsx +78 -0
  148. package/bizar-dash/src/web/v8/ui/controls/Form.tsx +23 -0
  149. package/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +112 -0
  150. package/bizar-dash/src/web/v8/ui/controls/Input.tsx +94 -0
  151. package/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +74 -0
  152. package/bizar-dash/src/web/v8/ui/controls/Select.tsx +171 -0
  153. package/bizar-dash/src/web/v8/ui/controls/Slider.tsx +68 -0
  154. package/bizar-dash/src/web/v8/ui/controls/Switch.tsx +56 -0
  155. package/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +64 -0
  156. package/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +36 -0
  157. package/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +85 -0
  158. package/bizar-dash/src/web/v8/ui/data/Accordion.tsx +134 -0
  159. package/bizar-dash/src/web/v8/ui/data/Avatar.tsx +175 -0
  160. package/bizar-dash/src/web/v8/ui/data/Badge.tsx +93 -0
  161. package/bizar-dash/src/web/v8/ui/data/BarList.tsx +101 -0
  162. package/bizar-dash/src/web/v8/ui/data/Card.tsx +140 -0
  163. package/bizar-dash/src/web/v8/ui/data/Chip.tsx +96 -0
  164. package/bizar-dash/src/web/v8/ui/data/Kbd.tsx +42 -0
  165. package/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +93 -0
  166. package/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +98 -0
  167. package/bizar-dash/src/web/v8/ui/data/StatTile.tsx +150 -0
  168. package/bizar-dash/src/web/v8/ui/data/Table.tsx +170 -0
  169. package/bizar-dash/src/web/v8/ui/data/Timeline.tsx +130 -0
  170. package/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +122 -0
  171. package/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +95 -0
  172. package/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +39 -0
  173. package/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +143 -0
  174. package/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +149 -0
  175. package/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +8 -0
  176. package/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +231 -0
  177. package/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +48 -0
  178. package/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +56 -0
  179. package/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +103 -0
  180. package/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +67 -0
  181. package/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +30 -0
  182. package/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +66 -0
  183. package/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +89 -0
  184. package/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +176 -0
  185. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +245 -0
  186. package/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +115 -0
  187. package/bizar-dash/src/web/v8/ui/index.ts +322 -0
  188. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +83 -0
  189. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +247 -0
  190. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +186 -0
  191. package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +122 -0
  192. package/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +141 -0
  193. package/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +30 -0
  194. package/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +161 -0
  195. package/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +144 -0
  196. package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +224 -0
  197. package/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +81 -0
  198. package/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +164 -0
  199. package/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +128 -0
  200. package/bizar-dash/src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts +79 -0
  201. package/bizar-dash/src/web/v8/ui/primitives/Box.tsx +144 -0
  202. package/bizar-dash/src/web/v8/ui/primitives/Center.tsx +40 -0
  203. package/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +67 -0
  204. package/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +104 -0
  205. package/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +77 -0
  206. package/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +33 -0
  207. package/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +62 -0
  208. package/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +42 -0
  209. package/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +73 -0
  210. package/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +49 -0
  211. package/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +91 -0
  212. package/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +88 -0
  213. package/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +109 -0
  214. package/bizar-dash/src/web/v8/ui/styles/globals.css +225 -0
  215. package/bizar-dash/src/web/v8/ui/styles/reset.css +57 -0
  216. package/bizar-dash/src/web/v8/ui/styles/tokens.css +217 -0
  217. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.test.tsx +74 -0
  218. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +66 -0
  219. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.test.tsx +86 -0
  220. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +94 -0
  221. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +88 -0
  222. package/bizar-dash/src/web/v8/ui/theme/useDensity.ts +15 -0
  223. package/bizar-dash/src/web/v8/ui/theme/useTheme.ts +16 -0
  224. package/bizar-dash/src/web/v8/ui/utils/cx.ts +19 -0
  225. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +71 -0
  226. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +172 -0
  227. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +142 -0
  228. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +247 -0
  229. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +193 -0
  230. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +108 -0
  231. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +77 -0
  232. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +152 -0
  233. package/bizar-dash/src/web/v8/views/Router.tsx +72 -0
  234. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +730 -0
  235. package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +106 -0
  236. package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +62 -0
  237. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +165 -0
  238. package/bizar-dash/src/web/v8/vite-env.d.ts +15 -0
  239. package/bizar-dash/src/web/{mobile.html → v8.html} +4 -7
  240. package/bizar-dash/tests/components/Button.test.tsx +51 -14
  241. package/bizar-dash/tests/components/Card.test.tsx +37 -20
  242. package/bizar-dash/tests/components/Dialog.test.tsx +80 -0
  243. package/bizar-dash/tests/components/Toast.test.tsx +48 -95
  244. package/bizar-dash/tests/goals-decompose.test.mjs +177 -0
  245. package/bizar-dash/tests/setup.ts +47 -0
  246. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +30 -15
  247. package/bizar-dash/vite.config.ts +41 -2
  248. package/bizar-dash/vitest.config.ts +9 -4
  249. package/cli/bin.mjs +32 -0
  250. package/cli/install.mjs +26 -1
  251. package/cli/provision-claude.mjs +86 -0
  252. package/package.json +36 -3
  253. package/scripts/run-dev.mjs +84 -0
  254. package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js +0 -114
  255. package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js.map +0 -1
  256. package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js +0 -1
  257. package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js.map +0 -1
  258. package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js +0 -1
  259. package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js.map +0 -1
  260. package/bizar-dash/dist/assets/Toast-ATSAmbdi.js +0 -26
  261. package/bizar-dash/dist/assets/Toast-ATSAmbdi.js.map +0 -1
  262. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  263. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +0 -1
  264. package/bizar-dash/dist/assets/main-CJAtrosO.css +0 -1
  265. package/bizar-dash/dist/assets/main-DKKj9dsq.js +0 -430
  266. package/bizar-dash/dist/assets/main-DKKj9dsq.js.map +0 -1
  267. package/bizar-dash/dist/assets/mobile-C_naUN91.js +0 -1
  268. package/bizar-dash/dist/assets/mobile-C_naUN91.js.map +0 -1
  269. package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +0 -1
  270. package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js +0 -211
  271. package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js.map +0 -1
  272. package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js +0 -65
  273. package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js.map +0 -1
  274. package/bizar-dash/dist/index.html +0 -43
  275. package/bizar-dash/src/web/App.tsx +0 -915
  276. package/bizar-dash/src/web/MobileApp.tsx +0 -414
  277. package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +0 -95
  278. package/bizar-dash/src/web/components/ArtifactListDialog.tsx +0 -55
  279. package/bizar-dash/src/web/components/ArtifactViewer.tsx +0 -144
  280. package/bizar-dash/src/web/components/AuditDialog.tsx +0 -79
  281. package/bizar-dash/src/web/components/AutosaveField.tsx +0 -50
  282. package/bizar-dash/src/web/components/BackupRestore.tsx +0 -330
  283. package/bizar-dash/src/web/components/BgStatusBadge.tsx +0 -32
  284. package/bizar-dash/src/web/components/Button.tsx +0 -56
  285. package/bizar-dash/src/web/components/CanvasContextMenu.tsx +0 -68
  286. package/bizar-dash/src/web/components/Card.tsx +0 -40
  287. package/bizar-dash/src/web/components/CollapsibleSection.tsx +0 -72
  288. package/bizar-dash/src/web/components/CommandDialog.tsx +0 -66
  289. package/bizar-dash/src/web/components/DoctorPanel.tsx +0 -160
  290. package/bizar-dash/src/web/components/EmptyState.tsx +0 -30
  291. package/bizar-dash/src/web/components/EnvVarManager.tsx +0 -430
  292. package/bizar-dash/src/web/components/EvalDiff.tsx +0 -157
  293. package/bizar-dash/src/web/components/EvalExportButton.tsx +0 -27
  294. package/bizar-dash/src/web/components/EvalRunCard.tsx +0 -78
  295. package/bizar-dash/src/web/components/FileBrowser.tsx +0 -633
  296. package/bizar-dash/src/web/components/HeadroomSettings.tsx +0 -418
  297. package/bizar-dash/src/web/components/HeadroomStatus.tsx +0 -158
  298. package/bizar-dash/src/web/components/HelpDialog.tsx +0 -55
  299. package/bizar-dash/src/web/components/InviteDialog.tsx +0 -205
  300. package/bizar-dash/src/web/components/KillConfirmDialog.tsx +0 -88
  301. package/bizar-dash/src/web/components/MobileBottomNav.tsx +0 -38
  302. package/bizar-dash/src/web/components/MobileDrawer.tsx +0 -68
  303. package/bizar-dash/src/web/components/MobileHeader.tsx +0 -50
  304. package/bizar-dash/src/web/components/MobileLayout.tsx +0 -63
  305. package/bizar-dash/src/web/components/Modal.tsx +0 -215
  306. package/bizar-dash/src/web/components/Notifications.tsx +0 -242
  307. package/bizar-dash/src/web/components/ScheduleTemplateCard.tsx +0 -72
  308. package/bizar-dash/src/web/components/ScreenshotCapture.tsx +0 -138
  309. package/bizar-dash/src/web/components/ScreenshotOCR.tsx +0 -42
  310. package/bizar-dash/src/web/components/SearchModal.tsx +0 -227
  311. package/bizar-dash/src/web/components/SettingsNav.tsx +0 -117
  312. package/bizar-dash/src/web/components/SettingsSearch.tsx +0 -328
  313. package/bizar-dash/src/web/components/Sidebar.tsx +0 -89
  314. package/bizar-dash/src/web/components/Spinner.tsx +0 -19
  315. package/bizar-dash/src/web/components/StatusBadge.tsx +0 -56
  316. package/bizar-dash/src/web/components/Tag.tsx +0 -41
  317. package/bizar-dash/src/web/components/TailscaleSettings.tsx +0 -161
  318. package/bizar-dash/src/web/components/TaskCard.tsx +0 -69
  319. package/bizar-dash/src/web/components/TaskCreateSheet.tsx +0 -76
  320. package/bizar-dash/src/web/components/Toast.tsx +0 -150
  321. package/bizar-dash/src/web/components/Toggle.tsx +0 -31
  322. package/bizar-dash/src/web/components/Topbar.tsx +0 -455
  323. package/bizar-dash/src/web/components/UsageChart.tsx +0 -250
  324. package/bizar-dash/src/web/components/UsageTable.tsx +0 -90
  325. package/bizar-dash/src/web/components/VirtualList.tsx +0 -53
  326. package/bizar-dash/src/web/components/VisualPlanDialog.tsx +0 -58
  327. package/bizar-dash/src/web/components/VoiceNotesPanel.tsx +0 -211
  328. package/bizar-dash/src/web/components/VoiceRecorder.tsx +0 -105
  329. package/bizar-dash/src/web/components/WorkspaceSelector.tsx +0 -158
  330. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +0 -126
  331. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +0 -163
  332. package/bizar-dash/src/web/components/agents/QualityGates.tsx +0 -123
  333. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +0 -127
  334. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +0 -148
  335. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +0 -160
  336. package/bizar-dash/src/web/components/background/AttachButton.tsx +0 -96
  337. package/bizar-dash/src/web/components/background/TmuxAttachCard.tsx +0 -122
  338. package/bizar-dash/src/web/components/chat/AgentChip.tsx +0 -68
  339. package/bizar-dash/src/web/components/chat/AgentNode.tsx +0 -127
  340. package/bizar-dash/src/web/components/chat/AgentTree.tsx +0 -80
  341. package/bizar-dash/src/web/components/chat/ChatBubble.tsx +0 -60
  342. package/bizar-dash/src/web/components/chat/ChatComposer.tsx +0 -72
  343. package/bizar-dash/src/web/components/chat/ChatInfoPanel.tsx +0 -370
  344. package/bizar-dash/src/web/components/chat/ChatRail.tsx +0 -387
  345. package/bizar-dash/src/web/components/chat/ChatThread.tsx +0 -127
  346. package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +0 -50
  347. package/bizar-dash/src/web/components/chat/Composer.tsx +0 -166
  348. package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +0 -54
  349. package/bizar-dash/src/web/components/chat/EmptyState.tsx +0 -21
  350. package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +0 -18
  351. package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +0 -38
  352. package/bizar-dash/src/web/components/chat/InfoPanel.tsx +0 -184
  353. package/bizar-dash/src/web/components/chat/JumpToLatest.tsx +0 -58
  354. package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +0 -19
  355. package/bizar-dash/src/web/components/chat/MessageBlock.tsx +0 -260
  356. package/bizar-dash/src/web/components/chat/MessageBubble.tsx +0 -60
  357. package/bizar-dash/src/web/components/chat/SessionList.tsx +0 -163
  358. package/bizar-dash/src/web/components/chat/SessionRowMenu.tsx +0 -206
  359. package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +0 -37
  360. package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +0 -55
  361. package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +0 -36
  362. package/bizar-dash/src/web/components/chat/_legacy.ts +0 -30
  363. package/bizar-dash/src/web/components/chat/index.ts +0 -31
  364. package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +0 -18
  365. package/bizar-dash/src/web/components/chat/useChat.ts +0 -1190
  366. package/bizar-dash/src/web/components/chat/useSlashCommands.ts +0 -47
  367. package/bizar-dash/src/web/components/goals/GoalInput.tsx +0 -86
  368. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +0 -111
  369. package/bizar-dash/src/web/components/tasks/BacklogPanel.css +0 -109
  370. package/bizar-dash/src/web/components/tasks/BacklogPanel.tsx +0 -209
  371. package/bizar-dash/src/web/hooks/useAutosave.ts +0 -107
  372. package/bizar-dash/src/web/hooks/useI18n.ts +0 -13
  373. package/bizar-dash/src/web/index.html +0 -37
  374. package/bizar-dash/src/web/lib/api.ts +0 -237
  375. package/bizar-dash/src/web/lib/goapPlanner.ts +0 -614
  376. package/bizar-dash/src/web/lib/i18n.ts +0 -25
  377. package/bizar-dash/src/web/lib/logger.ts +0 -30
  378. package/bizar-dash/src/web/lib/markdown.tsx +0 -59
  379. package/bizar-dash/src/web/lib/search.ts +0 -115
  380. package/bizar-dash/src/web/lib/types.ts +0 -894
  381. package/bizar-dash/src/web/lib/utils.ts +0 -114
  382. package/bizar-dash/src/web/lib/ws.ts +0 -177
  383. package/bizar-dash/src/web/locales/en.json +0 -52
  384. package/bizar-dash/src/web/main.tsx +0 -43
  385. package/bizar-dash/src/web/mobile/MobileApp.tsx +0 -309
  386. package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +0 -38
  387. package/bizar-dash/src/web/mobile/MobileChat.tsx +0 -138
  388. package/bizar-dash/src/web/mobile/MobileDoctor.tsx +0 -80
  389. package/bizar-dash/src/web/mobile/MobileEval.tsx +0 -167
  390. package/bizar-dash/src/web/mobile/MobileMemory.tsx +0 -108
  391. package/bizar-dash/src/web/mobile/MobileOverview.tsx +0 -213
  392. package/bizar-dash/src/web/mobile/MobileSettings.tsx +0 -251
  393. package/bizar-dash/src/web/mobile/MobileTasks.tsx +0 -94
  394. package/bizar-dash/src/web/mobile/MobileTopbar.tsx +0 -115
  395. package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +0 -182
  396. package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +0 -64
  397. package/bizar-dash/src/web/mobile/components/MobileModal.tsx +0 -123
  398. package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +0 -273
  399. package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +0 -374
  400. package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +0 -439
  401. package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +0 -143
  402. package/bizar-dash/src/web/mobile/views/MobileChat.tsx +0 -257
  403. package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +0 -175
  404. package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +0 -191
  405. package/bizar-dash/src/web/mobile/views/MobileMods.tsx +0 -149
  406. package/bizar-dash/src/web/mobile/views/MobileMore.tsx +0 -121
  407. package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +0 -137
  408. package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +0 -26
  409. package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +0 -685
  410. package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +0 -172
  411. package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +0 -363
  412. package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +0 -153
  413. package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +0 -564
  414. package/bizar-dash/src/web/mobile/views/QrCodePanel.tsx +0 -69
  415. package/bizar-dash/src/web/mobile.tsx +0 -14
  416. package/bizar-dash/src/web/styles/agents-redesign.css +0 -311
  417. package/bizar-dash/src/web/styles/chat.css +0 -1740
  418. package/bizar-dash/src/web/styles/glyphs.css +0 -960
  419. package/bizar-dash/src/web/styles/main.css +0 -10389
  420. package/bizar-dash/src/web/styles/memory.css +0 -1177
  421. package/bizar-dash/src/web/styles/minimax-usage.css +0 -842
  422. package/bizar-dash/src/web/styles/mobile-chat.css +0 -5
  423. package/bizar-dash/src/web/styles/mobile-layout.css +0 -233
  424. package/bizar-dash/src/web/styles/mobile.css +0 -2181
  425. package/bizar-dash/src/web/styles/settings.css +0 -775
  426. package/bizar-dash/src/web/styles/skills.css +0 -302
  427. package/bizar-dash/src/web/styles/tasks-redesign.css +0 -253
  428. package/bizar-dash/src/web/styles/tasks.css +0 -605
  429. package/bizar-dash/src/web/ui/controls/Button.tsx +0 -77
  430. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +0 -95
  431. package/bizar-dash/src/web/ui/controls/IconButton.tsx +0 -66
  432. package/bizar-dash/src/web/ui/controls/Kbd.tsx +0 -24
  433. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +0 -77
  434. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +0 -109
  435. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +0 -91
  436. package/bizar-dash/src/web/ui/controls/Select.tsx +0 -92
  437. package/bizar-dash/src/web/ui/controls/Slider.tsx +0 -70
  438. package/bizar-dash/src/web/ui/controls/TextInput.tsx +0 -67
  439. package/bizar-dash/src/web/ui/controls/Textarea.tsx +0 -56
  440. package/bizar-dash/src/web/ui/controls/Toggle.tsx +0 -79
  441. package/bizar-dash/src/web/ui/controls/controls.css +0 -476
  442. package/bizar-dash/src/web/ui/controls/index.ts +0 -35
  443. package/bizar-dash/src/web/ui/data/BarChart.tsx +0 -60
  444. package/bizar-dash/src/web/ui/data/DataTable.tsx +0 -216
  445. package/bizar-dash/src/web/ui/data/EmptyState.tsx +0 -60
  446. package/bizar-dash/src/web/ui/data/ErrorState.tsx +0 -56
  447. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +0 -106
  448. package/bizar-dash/src/web/ui/data/LoadingState.tsx +0 -65
  449. package/bizar-dash/src/web/ui/data/Sparkline.tsx +0 -87
  450. package/bizar-dash/src/web/ui/data/StatTile.tsx +0 -87
  451. package/bizar-dash/src/web/ui/data/data.css +0 -540
  452. package/bizar-dash/src/web/ui/data/index.ts +0 -31
  453. package/bizar-dash/src/web/ui/feedback/Badge.tsx +0 -49
  454. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +0 -209
  455. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +0 -69
  456. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +0 -50
  457. package/bizar-dash/src/web/ui/feedback/Toast.tsx +0 -200
  458. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +0 -126
  459. package/bizar-dash/src/web/ui/feedback/feedback.css +0 -314
  460. package/bizar-dash/src/web/ui/feedback/index.ts +0 -43
  461. package/bizar-dash/src/web/ui/index.ts +0 -57
  462. package/bizar-dash/src/web/ui/layout/AppShell.tsx +0 -51
  463. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +0 -97
  464. package/bizar-dash/src/web/ui/layout/Panel.tsx +0 -73
  465. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +0 -39
  466. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +0 -131
  467. package/bizar-dash/src/web/ui/layout/Tabs.tsx +0 -133
  468. package/bizar-dash/src/web/ui/layout/Topbar.tsx +0 -42
  469. package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +0 -48
  470. package/bizar-dash/src/web/ui/layout/index.ts +0 -34
  471. package/bizar-dash/src/web/ui/layout/layout.css +0 -464
  472. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +0 -199
  473. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +0 -95
  474. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +0 -93
  475. package/bizar-dash/src/web/ui/navigation/index.ts +0 -17
  476. package/bizar-dash/src/web/ui/navigation/navigation.css +0 -343
  477. package/bizar-dash/src/web/ui/primitives/Box.tsx +0 -91
  478. package/bizar-dash/src/web/ui/primitives/Grid.tsx +0 -49
  479. package/bizar-dash/src/web/ui/primitives/Inline.tsx +0 -55
  480. package/bizar-dash/src/web/ui/primitives/Separator.tsx +0 -46
  481. package/bizar-dash/src/web/ui/primitives/Stack.tsx +0 -54
  482. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +0 -26
  483. package/bizar-dash/src/web/ui/primitives/index.ts +0 -23
  484. package/bizar-dash/src/web/ui/primitives/primitives.css +0 -183
  485. package/bizar-dash/src/web/ui/styles/globals.css +0 -86
  486. package/bizar-dash/src/web/ui/styles/reset.css +0 -125
  487. package/bizar-dash/src/web/ui/styles/tokens.css +0 -208
  488. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +0 -142
  489. package/bizar-dash/src/web/ui/theme/tokens.ts +0 -131
  490. package/bizar-dash/src/web/ui/theme/useTheme.ts +0 -22
  491. package/bizar-dash/src/web/ui/utils/cx.ts +0 -42
  492. package/bizar-dash/src/web/views/Activity.tsx +0 -1221
  493. package/bizar-dash/src/web/views/Agents.tsx +0 -964
  494. package/bizar-dash/src/web/views/Artifacts.tsx +0 -1494
  495. package/bizar-dash/src/web/views/BackgroundAgents.tsx +0 -822
  496. package/bizar-dash/src/web/views/Chat.tsx +0 -532
  497. package/bizar-dash/src/web/views/Config.tsx +0 -3
  498. package/bizar-dash/src/web/views/Doctor.tsx +0 -317
  499. package/bizar-dash/src/web/views/Eval.tsx +0 -372
  500. package/bizar-dash/src/web/views/EvalReport.tsx +0 -353
  501. package/bizar-dash/src/web/views/GoalPlanner.tsx +0 -158
  502. package/bizar-dash/src/web/views/Harness.tsx +0 -306
  503. package/bizar-dash/src/web/views/History.tsx +0 -353
  504. package/bizar-dash/src/web/views/Memory.tsx +0 -193
  505. package/bizar-dash/src/web/views/MiniMaxUsage.tsx +0 -942
  506. package/bizar-dash/src/web/views/ModView.tsx +0 -207
  507. package/bizar-dash/src/web/views/Mods.tsx +0 -706
  508. package/bizar-dash/src/web/views/Overview.tsx +0 -1343
  509. package/bizar-dash/src/web/views/Providers.tsx +0 -302
  510. package/bizar-dash/src/web/views/Schedules.tsx +0 -902
  511. package/bizar-dash/src/web/views/Settings.tsx +0 -308
  512. package/bizar-dash/src/web/views/Skills.tsx +0 -383
  513. package/bizar-dash/src/web/views/SpawnAgentModal.tsx +0 -221
  514. package/bizar-dash/src/web/views/Tasks.tsx +0 -789
  515. package/bizar-dash/src/web/views/Workspace.tsx +0 -294
  516. package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +0 -844
  517. package/bizar-dash/src/web/views/glyphs/components.tsx +0 -1098
  518. package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +0 -426
  519. package/bizar-dash/src/web/views/memory/FromScreenshotPanel.tsx +0 -23
  520. package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +0 -220
  521. package/bizar-dash/src/web/views/memory/LightragPanel.tsx +0 -310
  522. package/bizar-dash/src/web/views/memory/MemoryGraphLegend.tsx +0 -29
  523. package/bizar-dash/src/web/views/memory/MemoryGraphPanel.tsx +0 -192
  524. package/bizar-dash/src/web/views/memory/MemoryGraphView.tsx +0 -336
  525. package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +0 -367
  526. package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +0 -160
  527. package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +0 -650
  528. package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +0 -197
  529. package/bizar-dash/src/web/views/memory/VaultFromClipboardPanel.tsx +0 -101
  530. package/bizar-dash/src/web/views/settings/ActivitySection.tsx +0 -205
  531. package/bizar-dash/src/web/views/settings/AgentSection.tsx +0 -305
  532. package/bizar-dash/src/web/views/settings/AuthSection.tsx +0 -159
  533. package/bizar-dash/src/web/views/settings/EnvVarsSection.tsx +0 -15
  534. package/bizar-dash/src/web/views/settings/GeneralSection.tsx +0 -128
  535. package/bizar-dash/src/web/views/settings/HeadroomSection.tsx +0 -39
  536. package/bizar-dash/src/web/views/settings/MemorySection.tsx +0 -154
  537. package/bizar-dash/src/web/views/settings/NetworkSection.tsx +0 -87
  538. package/bizar-dash/src/web/views/settings/NotificationsSection.tsx +0 -34
  539. package/bizar-dash/src/web/views/settings/SystemLlmSection.tsx +0 -81
  540. package/bizar-dash/src/web/views/settings/ThemeSection.tsx +0 -168
  541. package/bizar-dash/src/web/views/settings/UpdatesSection.tsx +0 -256
  542. package/bizar-dash/src/web/views/settings/WorkspacesSection.tsx +0 -189
  543. package/packages/sdk/.harness/agents.json +0 -17
  544. package/packages/sdk/.harness/topology.json +0 -4
  545. /package/bizar-dash/tests/{BackgroundAgents.test.tsx → v7-archive/BackgroundAgents.test.tsx} +0 -0
  546. /package/bizar-dash/tests/{a11y → v7-archive/a11y}/forms.test.tsx +0 -0
  547. /package/bizar-dash/tests/{a11y.test.tsx → v7-archive/a11y.test.tsx} +0 -0
  548. /package/bizar-dash/tests/{autosave.test.tsx → v7-archive/autosave.test.tsx} +0 -0
  549. /package/bizar-dash/tests/{backup-restore.test.tsx → v7-archive/backup-restore.test.tsx} +0 -0
  550. /package/bizar-dash/tests/{chat-composer.test.tsx → v7-archive/chat-composer.test.tsx} +0 -0
  551. /package/bizar-dash/tests/{communication-log.test.tsx → v7-archive/communication-log.test.tsx} +0 -0
  552. /package/bizar-dash/tests/{components → v7-archive/components}/Modal.test.tsx +0 -0
  553. /package/bizar-dash/tests/{components → v7-archive/components}/Spinner.test.tsx +0 -0
  554. /package/bizar-dash/tests/{components → v7-archive/components}/StatusBadge.test.tsx +0 -0
  555. /package/bizar-dash/tests/{components → v7-archive/components}/doctor-panel.test.tsx +0 -0
  556. /package/bizar-dash/tests/{components → v7-archive/components}/screenshot-ocr.test.tsx +0 -0
  557. /package/bizar-dash/tests/{components → v7-archive/components}/settings-search.test.tsx +0 -0
  558. /package/bizar-dash/tests/{components → v7-archive/components}/workspace-selector.test.tsx +0 -0
  559. /package/bizar-dash/tests/{ui → v7-archive}/controls/Button.test.tsx +0 -0
  560. /package/bizar-dash/tests/{ui → v7-archive}/controls/Checkbox.test.tsx +0 -0
  561. /package/bizar-dash/tests/{ui → v7-archive}/controls/IconButton.test.tsx +0 -0
  562. /package/bizar-dash/tests/{ui → v7-archive}/controls/Kbd.test.tsx +0 -0
  563. /package/bizar-dash/tests/{ui → v7-archive}/controls/NumberInput.test.tsx +0 -0
  564. /package/bizar-dash/tests/{ui → v7-archive}/controls/RadioGroup.test.tsx +0 -0
  565. /package/bizar-dash/tests/{ui → v7-archive}/controls/SearchInput.test.tsx +0 -0
  566. /package/bizar-dash/tests/{ui → v7-archive}/controls/Select.test.tsx +0 -0
  567. /package/bizar-dash/tests/{ui → v7-archive}/controls/Slider.test.tsx +0 -0
  568. /package/bizar-dash/tests/{ui → v7-archive}/controls/TextInput.test.tsx +0 -0
  569. /package/bizar-dash/tests/{ui → v7-archive}/controls/Textarea.test.tsx +0 -0
  570. /package/bizar-dash/tests/{ui → v7-archive}/controls/Toggle.test.tsx +0 -0
  571. /package/bizar-dash/tests/{ui → v7-archive}/data/BarChart.test.tsx +0 -0
  572. /package/bizar-dash/tests/{ui → v7-archive}/data/DataTable.test.tsx +0 -0
  573. /package/bizar-dash/tests/{ui → v7-archive}/data/EmptyState.test.tsx +0 -0
  574. /package/bizar-dash/tests/{ui → v7-archive}/data/ErrorState.test.tsx +0 -0
  575. /package/bizar-dash/tests/{ui → v7-archive}/data/KeyValueList.test.tsx +0 -0
  576. /package/bizar-dash/tests/{ui → v7-archive}/data/LoadingState.test.tsx +0 -0
  577. /package/bizar-dash/tests/{ui → v7-archive}/data/Sparkline.test.tsx +0 -0
  578. /package/bizar-dash/tests/{ui → v7-archive}/data/StatTile.test.tsx +0 -0
  579. /package/bizar-dash/tests/{dep-graph.test.tsx → v7-archive/dep-graph.test.tsx} +0 -0
  580. /package/bizar-dash/tests/{eval-web-ui.test.tsx → v7-archive/eval-web-ui.test.tsx} +0 -0
  581. /package/bizar-dash/tests/{event-log.test.tsx → v7-archive/event-log.test.tsx} +0 -0
  582. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Badge.test.tsx +0 -0
  583. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Dialog.test.tsx +0 -0
  584. /package/bizar-dash/tests/{ui → v7-archive}/feedback/ProgressBar.test.tsx +0 -0
  585. /package/bizar-dash/tests/{ui → v7-archive}/feedback/StatusDot.test.tsx +0 -0
  586. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Toast.test.tsx +0 -0
  587. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Tooltip.test.tsx +0 -0
  588. /package/bizar-dash/tests/{goal-input.test.tsx → v7-archive/goal-input.test.tsx} +0 -0
  589. /package/bizar-dash/tests/{goap-planner.test.ts → v7-archive/goap-planner.test.ts} +0 -0
  590. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useModal.test.tsx +0 -0
  591. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useToast.test.tsx +0 -0
  592. /package/bizar-dash/tests/{ui → v7-archive}/layout/AppShell.test.tsx +0 -0
  593. /package/bizar-dash/tests/{ui → v7-archive}/layout/Breadcrumbs.test.tsx +0 -0
  594. /package/bizar-dash/tests/{ui → v7-archive}/layout/Panel.test.tsx +0 -0
  595. /package/bizar-dash/tests/{ui → v7-archive}/layout/PanelHeader.test.tsx +0 -0
  596. /package/bizar-dash/tests/{ui → v7-archive}/layout/Sidebar.test.tsx +0 -0
  597. /package/bizar-dash/tests/{ui → v7-archive}/layout/Tabs.test.tsx +0 -0
  598. /package/bizar-dash/tests/{ui → v7-archive}/layout/Topbar.test.tsx +0 -0
  599. /package/bizar-dash/tests/{ui → v7-archive}/layout/ViewHeader.test.tsx +0 -0
  600. /package/bizar-dash/tests/{lib → v7-archive/lib}/i18n.test.ts +0 -0
  601. /package/bizar-dash/tests/{lib → v7-archive/lib}/search-fuzzy.test.ts +0 -0
  602. /package/bizar-dash/tests/{lib → v7-archive/lib}/utils.test.ts +0 -0
  603. /package/bizar-dash/tests/{memory-graph-view.test.tsx → v7-archive/memory-graph-view.test.tsx} +0 -0
  604. /package/bizar-dash/tests/{mobile-chat.test.tsx → v7-archive/mobile-chat.test.tsx} +0 -0
  605. /package/bizar-dash/tests/{mobile-layout.test.tsx → v7-archive/mobile-layout.test.tsx} +0 -0
  606. /package/bizar-dash/tests/{mobile-overview.test.tsx → v7-archive/mobile-overview.test.tsx} +0 -0
  607. /package/bizar-dash/tests/{mobile-settings.test.tsx → v7-archive/mobile-settings.test.tsx} +0 -0
  608. /package/bizar-dash/tests/{mobile-tasks.test.tsx → v7-archive/mobile-tasks.test.tsx} +0 -0
  609. /package/bizar-dash/tests/{ui → v7-archive}/navigation/CommandPalette.test.tsx +0 -0
  610. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavGroup.test.tsx +0 -0
  611. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavLink.test.tsx +0 -0
  612. /package/bizar-dash/tests/{quality-gates.test.tsx → v7-archive/quality-gates.test.tsx} +0 -0
  613. /package/bizar-dash/tests/{settings-layout.test.tsx → v7-archive/settings-layout.test.tsx} +0 -0
  614. /package/bizar-dash/tests/{settings-mode-wiring.test.tsx → v7-archive/settings-mode-wiring.test.tsx} +0 -0
  615. /package/bizar-dash/tests/{settings-nav.test.tsx → v7-archive/settings-nav.test.tsx} +0 -0
  616. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Box.test.tsx +0 -0
  617. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Grid.test.tsx +0 -0
  618. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Inline.test.tsx +0 -0
  619. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Separator.test.tsx +0 -0
  620. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Stack.test.tsx +0 -0
  621. /package/bizar-dash/tests/{views → v7-archive/views}/Agents.test.tsx +0 -0
  622. /package/bizar-dash/tests/{views → v7-archive/views}/Memory.test.tsx +0 -0
  623. /package/bizar-dash/tests/{views → v7-archive/views}/Overview.test.tsx +0 -0
  624. /package/bizar-dash/tests/{views → v7-archive/views}/Tasks.test.tsx +0 -0
  625. /package/bizar-dash/tests/{views → v7-archive/views}/sidebar.test.tsx +0 -0
  626. /package/bizar-dash/tests/{views → v7-archive/views}/topbar.test.tsx +0 -0
  627. /package/bizar-dash/tests/{voice-recorder.test.tsx → v7-archive/voice-recorder.test.tsx} +0 -0
@@ -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]}
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button-RmN1RKhE.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../src/web/v8/ui/primitives/Grid.tsx","../../src/web/v8/ui/controls/Button.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 LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Grid — CSS grid wrapper with token-driven gap and template columns.\n *\n * For responsive grids: pass `cols` as an object { base, sm, md, lg }.\n * Otherwise pass a single number (1..12) for a uniform grid.\n */\nexport type GridCols =\n | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12\n | { base?: number; sm?: number; md?: number; lg?: number; xl?: number };\n\nexport interface GridProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n as?: ElementType;\n gap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n rowGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n colGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n cols?: GridCols;\n rows?: 1 | 2 | 3 | 4;\n autoFlow?: 'row' | 'column' | 'dense';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'stretch';\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SPACE_VAR: Record<NonNullable<GridProps['gap']>, string> = {\n 0: '0',\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n};\n\nconst COLS_VAR: Record<number, string> = {\n 1: 'repeat(1, minmax(0, 1fr))',\n 2: 'repeat(2, minmax(0, 1fr))',\n 3: 'repeat(3, minmax(0, 1fr))',\n 4: 'repeat(4, minmax(0, 1fr))',\n 5: 'repeat(5, minmax(0, 1fr))',\n 6: 'repeat(6, minmax(0, 1fr))',\n 8: 'repeat(8, minmax(0, 1fr))',\n 12: 'repeat(12, minmax(0, 1fr))',\n};\n\nfunction colsToStyle(cols: GridCols | undefined): CSSProperties {\n if (cols === undefined) return {};\n if (typeof cols === 'number') return { gridTemplateColumns: COLS_VAR[cols] };\n // Responsive object — apply base as the default gridTemplateColumns; the\n // breakpoint variants should be handled by the parent component or a\n // generated class. We export the base here; responsive overrides can\n // compose via additional style overrides at the call site.\n const base = cols.base ?? 1;\n return { gridTemplateColumns: COLS_VAR[base] };\n}\n\nconst ALIGN_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\nconst JUSTIFY_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\n\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(props, ref) {\n const {\n as,\n gap = 4,\n rowGap,\n colGap,\n cols,\n rows,\n autoFlow,\n align,\n justify,\n children,\n className,\n style,\n ...rest\n } = props;\n\n const Tag = (as ?? 'div') as ElementType;\n const computedStyle: CSSProperties = {\n display: 'grid',\n gap: SPACE_VAR[gap],\n ...(rowGap !== undefined && { rowGap: SPACE_VAR[rowGap] }),\n ...(colGap !== undefined && { columnGap: SPACE_VAR[colGap] }),\n ...colsToStyle(cols),\n ...(rows !== undefined && { gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }),\n ...(autoFlow !== undefined && { gridAutoFlow: autoFlow }),\n ...(align !== undefined && { alignItems: ALIGN_MAP[align] }),\n ...(justify !== undefined && { justifyItems: JUSTIFY_MAP[justify] }),\n ...style,\n };\n\n return (\n <Tag ref={ref} className={cx('v8-grid', className)} style={computedStyle} {...rest}>\n {children}\n </Tag>\n );\n});","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Loader2 } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Button — the v8 primary action surface.\n *\n * Variants:\n * - primary — the only loud button. Use sparingly (DESIGN.md §1).\n * - secondary — bordered, default for most actions.\n * - ghost — text-only, used inside surfaces (toolbars, cards).\n * - danger — destructive actions.\n *\n * Sizes:\n * - sm (28px), md (32px), lg (40px), icon (32px square)\n *\n * Loading: shows a spinner and disables interaction. Default label stays visible\n * so the button doesn't reflow.\n */\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** When true, render as a Slot so the child <a> / <Link> inherits styling. */\n asChild?: boolean;\n loading?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n}\n\nconst SIZE: Record<ButtonSize, { h: number; px: number; fs: string }> = {\n sm: { h: 28, px: 10, fs: 'var(--fs-12)' },\n md: { h: 32, px: 14, fs: 'var(--fs-13)' },\n lg: { h: 40, px: 18, fs: 'var(--fs-14)' },\n icon: { h: 32, px: 0, fs: 'var(--fs-13)' },\n};\n\nconst VARIANT_BG: Record<ButtonVariant, string> = {\n primary: 'var(--accent)',\n secondary: 'var(--surface-1)',\n ghost: 'transparent',\n danger: 'var(--danger)',\n outline: 'transparent',\n};\n\nconst VARIANT_FG: Record<ButtonVariant, string> = {\n primary: 'var(--fg-on-accent)',\n secondary: 'var(--fg)',\n ghost: 'var(--fg-muted)',\n danger: 'var(--fg-on-accent)',\n outline: 'var(--fg)',\n};\n\nconst VARIANT_BORDER: Record<ButtonVariant, string> = {\n primary: 'transparent',\n secondary: 'var(--border)',\n ghost: 'transparent',\n danger: 'transparent',\n outline: 'var(--border)',\n};\n\nconst VARIANT_HOVER_BG: Record<ButtonVariant, string> = {\n primary: 'var(--accent-hover)',\n secondary: 'var(--surface-2)',\n ghost: 'var(--surface-1)',\n danger: 'color-mix(in oklch, var(--danger), black 10%)',\n outline: 'var(--surface-1)',\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(props, ref) {\n const {\n variant = 'secondary',\n size = 'md',\n asChild,\n loading,\n disabled,\n leftIcon,\n rightIcon,\n fullWidth,\n children,\n className,\n style,\n type,\n ...rest\n } = props;\n\n const Comp = (asChild ? Slot : 'button') as React.ElementType;\n const sz = SIZE[size];\n const isDisabled = disabled === true || loading === true;\n\n const computedStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-2)',\n height: sz.h,\n paddingLeft: sz.px,\n paddingRight: sz.px,\n width: fullWidth === true ? '100%' : undefined,\n fontSize: sz.fs,\n fontWeight: 500,\n lineHeight: 1,\n letterSpacing: 'var(--tracking-base)',\n background: VARIANT_BG[variant],\n color: VARIANT_FG[variant],\n border: '1px solid',\n borderColor: VARIANT_BORDER[variant],\n borderRadius: 'var(--radius-sm)',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n opacity: isDisabled ? 0.55 : 1,\n transition:\n 'background var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out)',\n whiteSpace: 'nowrap',\n userSelect: 'none',\n ...style,\n } as const;\n\n // For hover effect we have to inject a CSS variable that :hover can use.\n const hoverStyle = { '--btn-hover-bg': VARIANT_HOVER_BG[variant] } as React.CSSProperties;\n\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n type={asChild ? undefined : type ?? 'button'}\n disabled={isDisabled}\n aria-busy={loading === true ? 'true' : undefined}\n className={cx('v8-btn', `v8-btn--${variant}`, `v8-btn--${size}`, className)}\n style={{ ...computedStyle, ...hoverStyle }}\n {...rest}\n >\n {loading === true ? <Loader2 size={14} aria-hidden=\"true\" className=\"v8-btn__spinner\" /> : leftIcon}\n {children}\n {rightIcon}\n </Comp>\n );\n});"],"names":["LoaderCircle","createLucideIcon","SPACE_VAR","COLS_VAR","colsToStyle","cols","base","ALIGN_MAP","JUSTIFY_MAP","Grid","forwardRef","props","ref","as","gap","rowGap","colGap","rows","autoFlow","align","justify","children","className","style","rest","Tag","computedStyle","jsx","cx","SIZE","VARIANT_BG","VARIANT_FG","VARIANT_BORDER","VARIANT_HOVER_BG","Button","variant","size","asChild","loading","disabled","leftIcon","rightIcon","fullWidth","type","Comp","Slot","sz","isDisabled","hoverStyle","jsxs","Loader2"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as d,j as o}from"./cmdk-BLWIhKrV.js";import{c as n}from"./main-LxX9zTRk.js";const f={default:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"none"},elevated:{background:"var(--surface-1)",border:"1px solid var(--border)",boxShadow:"var(--shadow-2)"},ghost:{background:"transparent",border:"1px solid transparent",boxShadow:"none"},outlined:{background:"var(--surface-0)",border:"1px solid var(--border)",boxShadow:"none"}},x=d.forwardRef(function(s,t){const{variant:r="default",flush:a,interactive:e,className:c,style:l,...v}=s;return o.jsx("div",{ref:t,className:n("v8-card",`v8-card--${r}`,e&&"is-interactive",c),style:{borderRadius:"var(--radius-lg)",padding:a===!0?0:"var(--density-card-pad)",cursor:e===!0?"pointer":void 0,transition:e===!0?"border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)":void 0,...f[r],...l},...v})}),m=d.forwardRef(function(s,t){const{title:r,description:a,action:e,className:c,style:l,...v}=s;return o.jsxs("div",{ref:t,className:n("v8-card__header",c),style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-3)",marginBottom:"var(--space-3)",...l},...v,children:[o.jsxs("div",{style:{flex:1,minWidth:0},children:[o.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)"},children:r}),a!==void 0&&o.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:2},children:a})]}),e!==void 0&&o.jsx("div",{style:{flexShrink:0},children:e})]})}),b=d.forwardRef(function(s,t){const{className:r,...a}=s;return o.jsx("div",{ref:t,className:n("v8-card__body",r),...a})});d.forwardRef(function(s,t){const{className:r,style:a,...e}=s;return o.jsx("div",{ref:t,className:n("v8-card__footer",r),style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:"var(--space-2)",marginTop:"var(--space-3)",paddingTop:"var(--space-3)",borderTop:"1px solid var(--border)",...a},...e})});export{x as C,m as a,b};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card-BzJeYR2D.js","sources":["../../src/web/v8/ui/data/Card.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Card — the v8 surface primitive.\n *\n * Variants:\n * - default: bordered, --surface-1 background, used for kanban cards, settings groups.\n * - elevated: --surface-1 background + shadow, used for popovers/dropdowns hovering over content.\n * - ghost: no border, transparent background, used inside other Cards (nested).\n * - outlined: thicker border, --surface-0 background, used for group containers.\n *\n * All variants have a consistent --radius-lg corner and pad via --density-card-pad.\n * The header / body / footer slots are conventions — pass any children you want.\n */\nexport type CardVariant = 'default' | 'elevated' | 'ghost' | 'outlined';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n variant?: CardVariant;\n /** Removes padding so the child fills the card edge-to-edge. */\n flush?: boolean;\n /** Adds hover lift + cursor pointer for clickable cards. */\n interactive?: boolean;\n children?: ReactNode;\n}\n\nconst VARIANT_STYLE: Record<CardVariant, React.CSSProperties> = {\n default: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n elevated: {\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n boxShadow: 'var(--shadow-2)',\n },\n ghost: {\n background: 'transparent',\n border: '1px solid transparent',\n boxShadow: 'none',\n },\n outlined: {\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n boxShadow: 'none',\n },\n};\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(props, ref) {\n const { variant = 'default', flush, interactive, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card', `v8-card--${variant}`, interactive && 'is-interactive', className)}\n style={{\n borderRadius: 'var(--radius-lg)',\n padding: flush === true ? 0 : 'var(--density-card-pad)',\n cursor: interactive === true ? 'pointer' : undefined,\n transition: interactive === true\n ? 'border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out)'\n : undefined,\n ...VARIANT_STYLE[variant],\n ...style,\n }}\n {...rest}\n />\n );\n});\n\n/** Card header — title row + optional actions. */\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n props,\n ref,\n) {\n const { title, description, action, className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__header', className)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 'var(--space-3)',\n marginBottom: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {description}\n </div>\n )}\n </div>\n {action !== undefined && <div style={{ flexShrink: 0 }}>{action}</div>}\n </div>\n );\n});\n\n/** Card body — main content slot. */\nexport const CardBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardBody(props, ref) {\n const { className, ...rest } = props;\n return <div ref={ref} className={cx('v8-card__body', className)} {...rest} />;\n },\n);\n\n/** Card footer — typically action buttons right-aligned. */\nexport const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n function CardFooter(props, ref) {\n const { className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-card__footer', className)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 'var(--space-2)',\n marginTop: 'var(--space-3)',\n paddingTop: 'var(--space-3)',\n borderTop: '1px solid var(--border)',\n ...style,\n }}\n {...rest}\n />\n );\n },\n);"],"names":["VARIANT_STYLE","Card","forwardRef","props","ref","variant","flush","interactive","className","style","rest","jsx","cx","CardHeader","title","description","action","jsxs","CardBody"],"mappings":"qFA0BA,MAAMA,EAA0D,CAC9D,QAAS,CACP,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,iBAAA,EAEb,MAAO,CACL,WAAY,cACZ,OAAQ,wBACR,UAAW,MAAA,EAEb,SAAU,CACR,WAAY,mBACZ,OAAQ,0BACR,UAAW,MAAA,CAEf,EAEaC,EAAOC,EAAAA,WAAsC,SAAcC,EAAOC,EAAK,CAClF,KAAM,CAAE,QAAAC,EAAU,UAAW,MAAAC,EAAO,YAAAC,EAAa,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASP,EAC/E,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,UAAW,YAAYP,CAAO,GAAIE,GAAe,iBAAkBC,CAAS,EAC1F,MAAO,CACL,aAAc,mBACd,QAASF,IAAU,GAAO,EAAI,0BAC9B,OAAQC,IAAgB,GAAO,UAAY,OAC3C,WAAYA,IAAgB,GACxB,+IACA,OACJ,GAAGP,EAAcK,CAAO,EACxB,GAAGI,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CAAC,EASYG,EAAaX,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAU,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAR,EAAW,MAAAC,EAAO,GAAGC,GAASP,EAClE,OACEc,EAAAA,KAAC,MAAA,CACC,IAAAb,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,aACZ,eAAgB,gBAChB,IAAK,iBACL,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEJ,SAAA,CAAAO,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAN,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAG,CAAA,CAAM,EACrFC,IAAgB,QACfJ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAI,CAAA,CACH,CAAA,EAEJ,EACCC,IAAW,QAAaL,MAAC,MAAA,CAAI,MAAO,CAAE,WAAY,CAAA,EAAM,SAAAK,CAAA,CAAO,CAAA,CAAA,CAAA,CAGtE,CAAC,EAGYE,EAAWhB,EAAAA,WACtB,SAAkBC,EAAOC,EAAK,CAC5B,KAAM,CAAE,UAAAI,EAAW,GAAGE,CAAA,EAASP,EAC/B,OAAOQ,MAAC,OAAI,IAAAP,EAAU,UAAWQ,EAAG,gBAAiBJ,CAAS,EAAI,GAAGE,EAAM,CAC7E,CACF,EAG0BR,EAAAA,WACxB,SAAoBC,EAAOC,EAAK,CAC9B,KAAM,CAAE,UAAAI,EAAW,MAAAC,EAAO,GAAGC,GAASP,EACtC,OACEQ,EAAAA,IAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,kBAAmBJ,CAAS,EAC1C,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,IAAK,iBACL,UAAW,iBACX,WAAY,iBACZ,UAAW,0BACX,GAAGC,CAAA,EAEJ,GAAGC,CAAA,CAAA,CAGV,CACF"}
@@ -0,0 +1 @@
1
+ import{r as u,j as o}from"./cmdk-BLWIhKrV.js";import{X as h,c as p}from"./main-LxX9zTRk.js";const f={neutral:"var(--surface-1)",info:"color-mix(in oklch, var(--info) 14%, var(--surface-1))",success:"color-mix(in oklch, var(--success) 14%, var(--surface-1))",warning:"color-mix(in oklch, var(--warning) 14%, var(--surface-1))",danger:"color-mix(in oklch, var(--danger) 14%, var(--surface-1))",accent:"color-mix(in oklch, var(--accent) 14%, var(--surface-1))"},m={neutral:"var(--border)",info:"color-mix(in oklch, var(--info) 30%, var(--border))",success:"color-mix(in oklch, var(--success) 30%, var(--border))",warning:"color-mix(in oklch, var(--warning) 30%, var(--border))",danger:"color-mix(in oklch, var(--danger) 30%, var(--border))",accent:"color-mix(in oklch, var(--accent) 30%, var(--border))"},k=u.forwardRef(function(c,n){const{tone:e="neutral",selected:r,onRemove:a,children:i,className:t,style:s,...l}=c,d=r!==void 0||a!==void 0;return o.jsxs("span",{ref:n,className:p("v8-chip",`v8-chip--${e}`,r===!0&&"is-selected",t),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-1)",height:24,padding:"0 8px",background:r===!0?"color-mix(in oklch, var(--accent) 18%, var(--surface-1))":f[e],border:"1px solid",borderColor:r===!0?"var(--accent)":m[e],borderRadius:"var(--radius-pill)",fontSize:"var(--fs-12)",fontWeight:500,color:r===!0?"var(--accent)":"var(--fg)",cursor:d===!0?"pointer":"default",whiteSpace:"nowrap",...s},...l,children:[i,a!==void 0&&o.jsx("button",{type:"button",onClick:v=>{v.stopPropagation(),a()},"aria-label":"Remove",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:14,height:14,marginLeft:2,marginRight:-4,padding:0,background:"transparent",border:0,borderRadius:"var(--radius-sm)",color:"var(--fg-muted)",cursor:"pointer"},children:o.jsx(h,{size:10,"aria-hidden":"true"})})]})});export{k as C};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip-CN2bvm7a.js","sources":["../../src/web/v8/ui/data/Chip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Chip — filter pill with an optional remove button.\n *\n * Different from Badge: Badge is a status indicator (read-only).\n * Chip is interactive — clickable for selection, removable for filters.\n */\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n /** Visual tone. */\n tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n /** When true, render with selected styling (used for filter chips). */\n selected?: boolean;\n /** When provided, render a close button that invokes this handler. */\n onRemove?: () => void;\n children: ReactNode;\n}\n\nconst TONE_BG: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--surface-1)',\n info: 'color-mix(in oklch, var(--info) 14%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 14%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 14%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 14%, var(--surface-1))',\n accent: 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))',\n};\n\nconst TONE_BORDER: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--border)',\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n accent: 'color-mix(in oklch, var(--accent) 30%, var(--border))',\n};\n\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(props, ref) {\n const { tone = 'neutral', selected, onRemove, children, className, style, ...rest } = props;\n const isInteractive = selected !== undefined || onRemove !== undefined;\n return (\n <span\n ref={ref}\n className={cx('v8-chip', `v8-chip--${tone}`, selected === true && 'is-selected', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height: 24,\n padding: '0 8px',\n background: selected === true ? `color-mix(in oklch, var(--accent) 18%, var(--surface-1))` : TONE_BG[tone],\n border: '1px solid',\n borderColor: selected === true ? 'var(--accent)' : TONE_BORDER[tone],\n borderRadius: 'var(--radius-pill)',\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: selected === true ? 'var(--accent)' : 'var(--fg)',\n cursor: isInteractive === true ? 'pointer' : 'default',\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {children}\n {onRemove !== undefined && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label=\"Remove\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 14,\n height: 14,\n marginLeft: 2,\n marginRight: -4,\n padding: 0,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <X size={10} aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n});"],"names":["TONE_BG","TONE_BORDER","Chip","forwardRef","props","ref","tone","selected","onRemove","children","className","style","rest","isInteractive","jsxs","cx","jsx","e","X"],"mappings":"4FAqBA,MAAMA,EAA0D,CAC9D,QAAS,mBACT,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,2DACR,OAAQ,0DACV,EAEMC,EAA8D,CAClE,QAAS,gBACT,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,wDACR,OAAQ,uDACV,EAEaC,EAAOC,EAAAA,WAAuC,SAAcC,EAAOC,EAAK,CACnF,KAAM,CAAE,KAAAC,EAAO,UAAW,SAAAC,EAAU,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAChFS,EAAgBN,IAAa,QAAaC,IAAa,OAC7D,OACEM,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,UAAW,YAAYT,CAAI,GAAIC,IAAa,IAAQ,cAAeG,CAAS,EAC1F,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAQ,GACR,QAAS,QACT,WAAYH,IAAa,GAAO,2DAA6DP,EAAQM,CAAI,EACzG,OAAQ,YACR,YAAaC,IAAa,GAAO,gBAAkBN,EAAYK,CAAI,EACnE,aAAc,qBACd,SAAU,eACV,WAAY,IACZ,MAAOC,IAAa,GAAO,gBAAkB,YAC7C,OAAQM,IAAkB,GAAO,UAAY,UAC7C,WAAY,SACZ,GAAGF,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAH,EACAD,IAAa,QACZQ,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAUC,GAAM,CACdA,EAAE,gBAAA,EACFT,EAAA,CACF,EACA,aAAW,SACX,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,WAAY,EACZ,YAAa,GACb,QAAS,EACT,WAAY,cACZ,OAAQ,EACR,aAAc,mBACd,MAAO,kBACP,OAAQ,SAAA,EAGV,SAAAQ,EAAAA,IAACE,EAAA,CAAE,KAAM,GAAI,cAAY,MAAA,CAAO,CAAA,CAAA,CAClC,CAAA,CAAA,CAIR,CAAC"}
@@ -0,0 +1 @@
1
+ import{r as l,j as e}from"./cmdk-BLWIhKrV.js";import{c as d}from"./main-LxX9zTRk.js";const m=l.forwardRef(function(r,a){const{icon:t,title:n,description:s,action:i,className:o,...c}=r;return e.jsxs("div",{ref:a,className:d("v8-empty-state",o),style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[t!==void 0&&e.jsx("div",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:t}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:n}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:i})]})});export{m as E};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState-DEiBv4-r.js","sources":["../../src/web/v8/ui/feedback/EmptyState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * EmptyState — placeholder for empty lists / zero-data views.\n *\n * Use when a view has no rows. Never use a spinner; the data is\n * genuinely empty.\n */\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n props,\n ref,\n) {\n const { icon, title, description, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-empty-state', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n {icon !== undefined && (\n <div style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</div>\n )}\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {action !== undefined && <div style={{ marginTop: 'var(--space-2)' }}>{action}</div>}\n </div>\n );\n});"],"names":["EmptyState","forwardRef","props","ref","icon","title","description","action","className","rest","jsxs","cx","jsx"],"mappings":"qFAgBO,MAAMA,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,GAASP,EACjE,OACEQ,EAAAA,KAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,iBAAkBH,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEH,SAAA,CAAAL,IAAS,QACRQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,mBAAoB,QAAS,aAAA,EAAkB,SAAAR,CAAA,CAAK,EAE3EQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAP,CAAA,CAAM,EACrFC,IAAgB,QACfM,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAN,CAAA,CAAY,EAEvEC,IAAW,QAAaK,MAAC,MAAA,CAAI,MAAO,CAAE,UAAW,gBAAA,EAAqB,SAAAL,CAAA,CAAO,CAAA,CAAA,CAAA,CAGpF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import{j as e,r}from"./cmdk-BLWIhKrV.js";import{c as L,S as h,I,a as B,f as T}from"./main-LxX9zTRk.js";import{B as $,G as F}from"./Button-RmN1RKhE.js";import{C as V,V as W}from"./ViewHeader-dPd4zAyj.js";import{P as H,S as M,a as _,b as J,c as q}from"./Select-xwxbK8Ed.js";import{B as G}from"./Badge-BH4C3aUF.js";import{C as Q}from"./calendar-CaP_Bbgc.js";import{S as X,a as Y}from"./Sheet-C_sIEw35.js";import{I as O}from"./index-AL3OLUfz.js";import{T as Z}from"./trash-2-JtYRQ79q.js";import{P as N}from"./plus-CVH1JB04.js";import{C as ee,b as se}from"./Card-BzJeYR2D.js";import{u as te}from"./useFetch-CoVWwbml.js";import{u as ae}from"./useWebSocket-CVIQB8yG.js";const ne={"on-track":"On track","at-risk":"At risk","off-track":"Off track",done:"Done"},le={"on-track":"success","at-risk":"warning","off-track":"danger",done:"neutral"};function re(o){const{title:a,description:u,status:f,progress:v,due:m,ownerName:x,ownerAvatarUrl:k,keyResultsDone:y,keyResultsTotal:b,badges:S,onOpen:C,className:j}=o;return e.jsxs("button",{type:"button",onClick:C,className:L("v8-goal-card",`v8-goal-card--${f}`,j),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), background var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[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:a}),u!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:u})]}),e.jsx(G,{tone:le[f],dot:!0,children:ne[f]})]}),e.jsxs("div",{children:[e.jsx(H,{value:v,tone:f==="on-track"?"success":f==="at-risk"?"warning":f==="off-track"?"danger":"accent"}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.jsxs("span",{children:[Math.round(v*100),"% complete"]}),y!==void 0&&b!==void 0&&e.jsxs("span",{children:[y," / ",b," key results"]})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[m!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(Q,{size:12,"aria-hidden":"true"}),m]}),x!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{"aria-hidden":"true",style:{width:16,height:16,borderRadius:"var(--radius-pill)",background:k!==void 0?`url(${k}) center/cover`:"var(--accent)",display:"inline-block"}}),x]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[S,e.jsx(V,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]}),e.jsx("style",{children:`
2
+ .v8-goal-card:hover {
3
+ border-color: var(--accent);
4
+ background: var(--surface-2);
5
+ }
6
+ `})]})}const oe=[{value:"on-track",label:"On track"},{value:"at-risk",label:"At risk"},{value:"off-track",label:"Off track"},{value:"blocked",label:"Blocked"},{value:"active",label:"Active"},{value:"done",label:"Done"}];function ie(o){const{goal:a,open:u,onOpenChange:f}=o,[v,m]=r.useState(a.title),[x,k]=r.useState(a.status),[y,b]=r.useState(a.owner||""),[S,C]=r.useState(a.due||""),[j,z]=r.useState(""),[p,g]=r.useState(null),[D,t]=r.useState(null),[n,l]=r.useState(null);r.useEffect(()=>{u&&(m(a.title),k(a.status),b(a.owner||""),C(a.due||""),t(null),l(null),z(""))},[u,a]);const i=async(s,c)=>{g(c),t(null),l(null);try{await T(`/api/goals/${encodeURIComponent(a.id)}`,{method:"PATCH",body:s}),t(`${c} saved.`)}catch(R){l(R instanceof Error?R.message:String(R))}finally{g(null)}},d=()=>{v.trim()&&v!==a.title&&i({title:v.trim()},"Title")},w=s=>{k(s),s!==a.status&&i({status:s},"Status")},E=()=>{const s=y.trim();s!==(a.owner||"")&&i({owner:s},"Owner")},A=()=>{const s=S.trim();s!==(a.due||"")&&i({due:s},"Due")},U=async(s,c)=>{g(`kr-${s}`),l(null);try{await T(`/api/goals/${encodeURIComponent(a.id)}/key-results/${encodeURIComponent(s)}`,{method:"PATCH",body:{done:!c}})}catch(R){l(R instanceof Error?R.message:String(R))}finally{g(null)}},P=async()=>{const s=j.trim();if(s){z(""),g("add-kr"),l(null);try{await T(`/api/goals/${encodeURIComponent(a.id)}/key-results`,{method:"POST",body:{title:s}})}catch(c){l(c instanceof Error?c.message:String(c))}finally{g(null)}}},K=async s=>{g(`remove-${s}`),l(null);try{await T(`/api/goals/${encodeURIComponent(a.id)}/key-results/${encodeURIComponent(s)}`,{method:"DELETE"})}catch(c){l(c instanceof Error?c.message:String(c))}finally{g(null)}};return e.jsx(X,{open:u,onOpenChange:f,children:e.jsx(Y,{side:"right",title:"Edit goal",children:e.jsxs(h,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(h,{gap:2,children:[e.jsx("label",{htmlFor:"goal-title",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),e.jsx(I,{gap:2,children:e.jsx(O,{id:"goal-title",value:v,onChange:s=>m(s.target.value),onBlur:d,disabled:p!==null,style:{flex:1}})})]}),e.jsxs(h,{gap:2,children:[e.jsx("label",{htmlFor:"goal-status",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Status"}),e.jsxs(M,{value:x,onValueChange:w,children:[e.jsx(_,{id:"goal-status",size:"sm",placeholder:"Status"}),e.jsx(J,{children:oe.map(s=>e.jsx(q,{value:s.value,children:s.label},s.value))})]})]}),e.jsxs(I,{gap:2,children:[e.jsxs(h,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"goal-owner",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Owner"}),e.jsx(O,{id:"goal-owner",value:y,onChange:s=>b(s.target.value),onBlur:E,disabled:p!==null})]}),e.jsxs(h,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"goal-due",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Due"}),e.jsx(O,{id:"goal-due",value:S,onChange:s=>C(s.target.value),onBlur:A,placeholder:"2026-09-30",disabled:p!==null})]})]}),e.jsxs(h,{gap:2,children:[e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Key results"}),e.jsxs(h,{gap:1,children:[a.keyResults.length===0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"None yet."}),a.keyResults.map(s=>e.jsxs(I,{gap:2,align:"center",children:[e.jsx("input",{type:"checkbox",checked:s.done,onChange:()=>{U(s.id,s.done)},"aria-label":`Toggle ${s.title}`,disabled:p!==null}),e.jsx("span",{style:{flex:1,fontSize:"var(--fs-13)",textDecoration:s.done?"line-through":"none"},children:s.title}),s.assignee&&e.jsx(G,{tone:"neutral",children:s.assignee}),e.jsx($,{variant:"ghost",onClick:()=>{K(s.id)},disabled:p!==null,"aria-label":`Remove ${s.title}`,children:e.jsx(Z,{size:12,"aria-hidden":!0})})]},s.id))]}),e.jsxs(I,{gap:2,children:[e.jsx(O,{value:j,onChange:s=>z(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),P())},placeholder:"Add key result…",disabled:p!==null,style:{flex:1}}),e.jsxs($,{variant:"secondary",onClick:()=>{P()},disabled:!j.trim()||p!==null,children:[e.jsx(N,{size:14,"aria-hidden":!0})," Add"]})]})]}),D!==null&&e.jsx("div",{role:"status",style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:D}),n!==null&&e.jsx("div",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:n}),p!==null&&e.jsx(B,{style:{height:12}})]})})})}function de(o){return{id:o.id,title:o.title,description:o.description||"",status:o.status,progress:o.progress,due:o.due,ownerName:o.owner,keyResultsDone:o.keyResults.filter(a=>a.done).length,keyResultsTotal:o.keyResults.length}}function Ce(){const o=te("/api/goals"),[a,u]=r.useState([]),[f,v]=r.useState(!1),[m,x]=r.useState(null),[k,y]=r.useState(!1),[b,S]=r.useState(null),[C,j]=r.useState(null);r.useEffect(()=>{var t;(t=o.data)!=null&&t.goals&&!f&&(v(!0),u(o.data.goals))},[o.data,f]);const z=r.useCallback(t=>{if(t.type!=="goals:change")return;const n=t.goal;n&&u(l=>{const i=l.findIndex(w=>w.id===n.id);if(i===-1)return[...l,n];const d=l.slice();return d[i]=n,d})},[]);ae("goals:change",z);const p=r.useCallback(async()=>{y(!0);try{const t=await T("/api/goals",{method:"POST",body:{title:"New goal"}});t.goal&&u(n=>[...n,t.goal]),t.id&&x(t.id)}catch{}finally{y(!1)}},[]),g=m?a.find(t=>t.id===m)??null:null,D=r.useCallback(async t=>{S(t),j(null);try{const n=await T(`/api/goals/${encodeURIComponent(t)}/decompose`,{method:"POST"});Array.isArray(n.created)&&n.created.length>0&&u(l=>l.map(i=>{if(i.id!==t)return i;const d=(i.keyResults??[]).map(w=>{const E=n.created.find(A=>A.kr===w.id);return E?{...w,taskId:E.task}:w});return{...i,keyResults:d}}))}catch(n){j(n instanceof Error?n.message:String(n))}finally{S(null)}},[]);return e.jsxs(h,{gap:5,children:[e.jsx(W,{title:"Goals",description:"Long-horizon commitments parsed from .bizar/PROGRESS.md.",actions:e.jsxs($,{variant:"primary",onClick:()=>{p()},disabled:k,children:[e.jsx(N,{size:14,"aria-hidden":!0})," New goal"]})}),C!==null&&e.jsxs("div",{role:"alert",style:{padding:"var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)"},children:["Decompose failed: ",C]}),o.loading&&a.length===0?e.jsxs(h,{gap:3,children:[e.jsx(B,{style:{height:160}}),e.jsx(B,{style:{height:160}})]}):a.length===0?e.jsx(ee,{children:e.jsx(se,{children:e.jsxs(h,{gap:2,children:[e.jsx("strong",{children:"No goals yet."}),e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["Create one with the dashboard or via CC's ",e.jsx("code",{children:"/goal <text>"}),"."]})]})})}):e.jsx(F,{cols:2,children:a.map(t=>{var i;const n=((i=t.keyResults)==null?void 0:i.length)??0,l=(t.keyResults??[]).every(d=>!!d.taskId);return e.jsx("div",{role:"button",tabIndex:0,onClick:()=>x(t.id),onKeyDown:d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),x(t.id))},style:{cursor:"pointer",outline:"none"},"data-testid":`goal-card-${t.id}`,children:e.jsxs(h,{gap:2,children:[e.jsx(re,{...de(t)}),n>0&&e.jsxs(I,{align:"center",justify:"flex-end",gap:2,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:l?"Decomposed":`${n} key result${n===1?"":"s"} · not yet linked`}),e.jsxs($,{variant:"secondary",onClick:d=>{d.stopPropagation(),D(t.id)},disabled:b===t.id,title:l?"Re-create missing task links":"Create one task per key result",children:[e.jsx(N,{size:12,"aria-hidden":!0})," ",l?"Re-link tasks":"Decompose → Tasks"]})]})]})},t.id)})}),g&&e.jsx(ie,{goal:g,open:m!==null,onOpenChange:t=>{t||x(null)}})]})}export{Ce as GoalsView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoalsView-CvsrzEez.js","sources":["../../src/web/v8/ui/goals/GoalCard.tsx","../../src/web/v8/ui/goals/GoalDetail.tsx","../../src/web/v8/views/Goals/GoalsView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Calendar, ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * GoalCard — long-horizon goal surface (PLAN.md: \"Goals page\").\n *\n * Goals are NOT kanban cards. They are intentional commitments tracked\n * over weeks/months. Each card shows: title, why (description), status,\n * progress, due, owner, key results count.\n */\n\nexport type GoalStatus = 'on-track' | 'at-risk' | 'off-track' | 'done';\n\nexport interface GoalCardProps {\n id: string;\n title: string;\n /** Why this goal matters (the \"because\"). */\n description?: string;\n status: GoalStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Due date label (e.g. \"Q3 2026\", \"Mar 31\"). */\n due?: string;\n /** Owner name (renders as Avatar when paired with avatarUrl). */\n ownerName?: string;\n ownerAvatarUrl?: string;\n /** Key results count + done count (e.g. \"3 / 5 key results\"). */\n keyResultsDone?: number;\n keyResultsTotal?: number;\n /** Optional badges row (priority, tags). */\n badges?: ReactNode;\n /** Click handler — opens the goal detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<GoalStatus, string> = {\n 'on-track': 'On track',\n 'at-risk': 'At risk',\n 'off-track': 'Off track',\n done: 'Done',\n};\n\nconst STATUS_TONE: Record<GoalStatus, 'success' | 'warning' | 'danger' | 'neutral'> = {\n 'on-track': 'success',\n 'at-risk': 'warning',\n 'off-track': 'danger',\n done: 'neutral',\n};\n\nexport function GoalCard(props: GoalCardProps) {\n const {\n title,\n description,\n status,\n progress,\n due,\n ownerName,\n ownerAvatarUrl,\n keyResultsDone,\n keyResultsTotal,\n badges,\n onOpen,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-goal-card', `v8-goal-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {title}\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg-muted)',\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n <div>\n <ProgressBar\n value={progress}\n tone={status === 'on-track' ? 'success' : status === 'at-risk' ? 'warning' : status === 'off-track' ? 'danger' : 'accent'}\n />\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontVariantNumeric: 'tabular-nums' }}>\n <span>{Math.round(progress * 100)}% complete</span>\n {keyResultsDone !== undefined && keyResultsTotal !== undefined && (\n <span>\n {keyResultsDone} / {keyResultsTotal} key results\n </span>\n )}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n {due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {due}\n </span>\n )}\n {ownerName !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span\n aria-hidden=\"true\"\n style={{\n width: 16,\n height: 16,\n borderRadius: 'var(--radius-pill)',\n background: ownerAvatarUrl !== undefined ? `url(${ownerAvatarUrl}) center/cover` : 'var(--accent)',\n display: 'inline-block',\n }}\n />\n {ownerName}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n {badges}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n <style>{`\n .v8-goal-card:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { useEffect, useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\nimport { Input } from '../controls/Input.js';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../controls/Select.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Badge } from '../data/Badge.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal } from '../../data/types.js';\n\n/**\n * GoalDetail — Sprint S12. Right-side Drawer with editable\n * title / status / due / owner / key-results.\n *\n * Source-of-truth = `.bizar/PROGRESS.md` (per user direction). Each\n * edit PATCHes `/api/goals/:id` and the server re-broadcasts the\n * canonical state via `goals:change`.\n */\n\nconst STATUS_OPTIONS = [\n { value: 'on-track', label: 'On track' },\n { value: 'at-risk', label: 'At risk' },\n { value: 'off-track', label: 'Off track' },\n { value: 'blocked', label: 'Blocked' },\n { value: 'active', label: 'Active' },\n { value: 'done', label: 'Done' },\n];\n\nexport interface GoalDetailProps {\n goal: Goal;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function GoalDetail(props: GoalDetailProps): JSX.Element {\n const { goal, open, onOpenChange } = props;\n const [title, setTitle] = useState<string>(goal.title);\n const [status, setStatus] = useState<string>(goal.status);\n const [owner, setOwner] = useState<string>(goal.owner || '');\n const [due, setDue] = useState<string>(goal.due || '');\n const [newKr, setNewKr] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setTitle(goal.title);\n setStatus(goal.status);\n setOwner(goal.owner || '');\n setDue(goal.due || '');\n setMessage(null);\n setError(null);\n setNewKr('');\n }\n }, [open, goal]);\n\n const patch = async (body: Record<string, unknown>, label: string): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'PATCH', body });\n setMessage(`${label} saved.`);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (): void => {\n if (title.trim() && title !== goal.title) void patch({ title: title.trim() }, 'Title');\n };\n const saveStatus = (v: string): void => {\n setStatus(v);\n if (v !== goal.status) void patch({ status: v }, 'Status');\n };\n const saveOwner = (): void => {\n const v = owner.trim();\n if (v !== (goal.owner || '')) void patch({ owner: v }, 'Owner');\n };\n const saveDue = (): void => {\n const v = due.trim();\n if (v !== (goal.due || '')) void patch({ due: v }, 'Due');\n };\n\n const toggleKr = async (krId: string, current: boolean): Promise<void> => {\n setBusy(`kr-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'PATCH',\n body: { done: !current },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const addKr = async (): Promise<void> => {\n const v = newKr.trim();\n if (!v) return;\n setNewKr('');\n setBusy('add-kr');\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results`, {\n method: 'POST',\n body: { title: v },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const removeKr = async (krId: string): Promise<void> => {\n setBusy(`remove-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'DELETE',\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title=\"Edit goal\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Title\n </label>\n <Inline gap={2}>\n <Input\n id=\"goal-title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveTitle}\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"goal-status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Status\n </label>\n <Select value={status} onValueChange={saveStatus}>\n <SelectTrigger id=\"goal-status\" size=\"sm\" placeholder=\"Status\" />\n <SelectContent>\n {STATUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-owner\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Owner\n </label>\n <Input id=\"goal-owner\" value={owner} onChange={(e) => setOwner(e.target.value)} onBlur={saveOwner} disabled={busy !== null} />\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-due\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Due\n </label>\n <Input id=\"goal-due\" value={due} onChange={(e) => setDue(e.target.value)} onBlur={saveDue} placeholder=\"2026-09-30\" disabled={busy !== null} />\n </Stack>\n </Inline>\n\n <Stack gap={2}>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Key results</div>\n <Stack gap={1}>\n {goal.keyResults.length === 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>None yet.</div>\n )}\n {goal.keyResults.map((kr) => (\n <Inline key={kr.id} gap={2} align=\"center\">\n <input\n type=\"checkbox\"\n checked={kr.done}\n onChange={() => { void toggleKr(kr.id, kr.done); }}\n aria-label={`Toggle ${kr.title}`}\n disabled={busy !== null}\n />\n <span style={{ flex: 1, fontSize: 'var(--fs-13)', textDecoration: kr.done ? 'line-through' : 'none' }}>\n {kr.title}\n </span>\n {kr.assignee && <Badge tone=\"neutral\">{kr.assignee}</Badge>}\n <Button\n variant=\"ghost\"\n onClick={() => { void removeKr(kr.id); }}\n disabled={busy !== null}\n aria-label={`Remove ${kr.title}`}\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n <Inline gap={2}>\n <Input\n value={newKr}\n onChange={(e) => setNewKr(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void addKr(); } }}\n placeholder=\"Add key result…\"\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n <Button variant=\"secondary\" onClick={() => { void addKr(); }} disabled={!newKr.trim() || busy !== null}>\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n </Stack>\n\n {message !== null && (\n <div role=\"status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>{message}</div>\n )}\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n {busy !== null && <Skeleton style={{ height: 12 }} />}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}","import { useCallback, useEffect, useState } from 'react';\nimport { Plus } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { GoalCard, type GoalCardProps, type GoalStatus } from '../../ui/goals/GoalCard.js';\nimport { GoalDetail } from '../../ui/goals/GoalDetail.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal, WsMessage } from '../../data/types.js';\n\n/**\n * GoalsView — Sprint S10/S12. Pulls `/api/goals` (parsed PROGRESS.md).\n * Card click → `GoalDetail` Drawer (editable title / status / due /\n * owner / KR add/toggle/remove). \"+ New goal\" button creates a fresh\n * goal via `POST /api/goals`. Live updates via `goals:change`.\n */\n\nfunction goalToCard(g: Goal): GoalCardProps {\n return {\n id: g.id,\n title: g.title,\n description: g.description || '',\n status: g.status as GoalStatus,\n progress: g.progress,\n due: g.due,\n ownerName: g.owner,\n keyResultsDone: g.keyResults.filter((k) => k.done).length,\n keyResultsTotal: g.keyResults.length,\n };\n}\n\nexport function GoalsView(): JSX.Element {\n const goals = useFetch<{ goals?: Goal[]; count?: number }>('/api/goals');\n const [local, setLocal] = useState<Goal[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openGoalId, setOpenGoalId] = useState<string | null>(null);\n const [creating, setCreating] = useState<boolean>(false);\n const [decomposing, setDecomposing] = useState<string | null>(null);\n const [decomposeError, setDecomposeError] = useState<string | null>(null);\n\n useEffect(() => {\n if (goals.data?.goals && !initialized) {\n setInitialized(true);\n setLocal(goals.data.goals);\n }\n }, [goals.data, initialized]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'goals:change') return;\n const g = (msg as Extract<WsMessage, { type: 'goals:change' }>).goal;\n if (!g) return;\n setLocal((prev) => {\n const idx = prev.findIndex((x) => x.id === g.id);\n if (idx === -1) return [...prev, g];\n const copy = prev.slice();\n copy[idx] = g;\n return copy;\n });\n }, []);\n useWsMessage('goals:change', onChange);\n\n const createGoal = useCallback(async () => {\n setCreating(true);\n try {\n const res = await fetchJson<{ goal?: Goal; id?: string }>('/api/goals', {\n method: 'POST',\n body: { title: 'New goal' },\n });\n if (res.goal) setLocal((prev) => [...prev, res.goal as Goal]);\n if (res.id) setOpenGoalId(res.id);\n } catch {\n // server will broadcast the canonical state via WS on the next reload\n } finally {\n setCreating(false);\n }\n }, []);\n\n const openGoal = openGoalId ? local.find((g) => g.id === openGoalId) ?? null : null;\n\n const decompose = useCallback(async (goalId: string) => {\n setDecomposing(goalId);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goalId: string; created: { kr: string; task: string }[] }>(\n `/api/goals/${encodeURIComponent(goalId)}/decompose`,\n { method: 'POST' },\n );\n // Patch local state with the new taskIds so the button reflects\n // \"Decomposed\" without waiting for the WS roundtrip.\n if (Array.isArray(res.created) && res.created.length > 0) {\n setLocal((prev) => prev.map((g) => {\n if (g.id !== goalId) return g;\n const krs = (g.keyResults ?? []).map((kr) => {\n const link = res.created.find((c) => c.kr === kr.id);\n return link ? { ...kr, taskId: link.task } : kr;\n });\n return { ...g, keyResults: krs };\n }));\n }\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setDecomposing(null);\n }\n }, []);\n\n return (\n <Stack gap={5}>\n <ViewHeader\n title=\"Goals\"\n description=\"Long-horizon commitments parsed from .bizar/PROGRESS.md.\"\n actions={\n <Button variant=\"primary\" onClick={() => { void createGoal(); }} disabled={creating}>\n <Plus size={14} aria-hidden /> New goal\n </Button>\n }\n />\n {decomposeError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n Decompose failed: {decomposeError}\n </div>\n )}\n {goals.loading && local.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 160 }} />\n <Skeleton style={{ height: 160 }} />\n </Stack>\n ) : local.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={2}>\n <strong>No goals yet.</strong>\n <span style={{ color: 'var(--fg-muted)' }}>\n Create one with the dashboard or via CC's <code>/goal &lt;text&gt;</code>.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Grid cols={2}>\n {local.map((g) => {\n const krCount = g.keyResults?.length ?? 0;\n const decomposed = (g.keyResults ?? []).every((kr) => Boolean(kr.taskId));\n return (\n <div\n key={g.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpenGoalId(g.id)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenGoalId(g.id); } }}\n style={{ cursor: 'pointer', outline: 'none' }}\n data-testid={`goal-card-${g.id}`}\n >\n <Stack gap={2}>\n <GoalCard {...goalToCard(g)} />\n {krCount > 0 && (\n <Inline align=\"center\" justify=\"flex-end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {decomposed ? 'Decomposed' : `${krCount} key result${krCount === 1 ? '' : 's'} · not yet linked`}\n </span>\n <Button\n variant=\"secondary\"\n onClick={(e) => { e.stopPropagation(); void decompose(g.id); }}\n disabled={decomposing === g.id}\n title={decomposed ? 'Re-create missing task links' : 'Create one task per key result'}\n >\n <Plus size={12} aria-hidden /> {decomposed ? 'Re-link tasks' : 'Decompose → Tasks'}\n </Button>\n </Inline>\n )}\n </Stack>\n </div>\n );\n })}\n </Grid>\n )}\n\n {openGoal && (\n <GoalDetail\n goal={openGoal}\n open={openGoalId !== null}\n onOpenChange={(o) => { if (!o) setOpenGoalId(null); }}\n />\n )}\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","GoalCard","props","title","description","status","progress","due","ownerName","ownerAvatarUrl","keyResultsDone","keyResultsTotal","badges","onOpen","className","jsxs","cx","jsx","Badge","ProgressBar","Calendar","ChevronRight","STATUS_OPTIONS","GoalDetail","goal","open","onOpenChange","setTitle","useState","setStatus","owner","setOwner","setDue","newKr","setNewKr","busy","setBusy","message","setMessage","error","setError","useEffect","patch","body","label","fetchJson","err","saveTitle","saveStatus","v","saveOwner","saveDue","toggleKr","krId","current","addKr","removeKr","Sheet","SheetContent","Stack","Inline","Input","e","Select","SelectTrigger","SelectContent","opt","SelectItem","kr","Button","Trash2","Plus","Skeleton","goalToCard","g","k","GoalsView","goals","useFetch","local","setLocal","initialized","setInitialized","openGoalId","setOpenGoalId","creating","setCreating","decomposing","setDecomposing","decomposeError","setDecomposeError","_a","onChange","useCallback","msg","prev","idx","x","copy","useWsMessage","createGoal","res","openGoal","decompose","goalId","krs","link","c","ViewHeader","Card","CardBody","Grid","krCount","decomposed","o"],"mappings":"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"}