@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 e}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 a=e("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);export{a as P};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plus-CVH1JB04.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/plus.js"],"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 Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n"],"names":["Plus","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,11 @@
1
+ import{b as e}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 a=e("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]);/**
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 o=e("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);export{a as R,o as T};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-B2sSd5t7.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../../node_modules/lucide-react/dist/esm/icons/terminal.js"],"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 RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-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 Terminal = createLucideIcon(\"Terminal\", [\n [\"polyline\", { points: \"4 17 10 11 4 5\", key: \"akl6gq\" }],\n [\"line\", { x1: \"12\", x2: \"20\", y1: \"19\", y2: \"19\", key: \"q2wloq\" }]\n]);\n\nexport { Terminal as default };\n//# sourceMappingURL=terminal.js.map\n"],"names":["RotateCw","createLucideIcon","Terminal"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,oDAAqD,IAAK,QAAQ,CAAE,EAClF,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC,ECZD;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACC,EAAWD,EAAiB,WAAY,CAC5C,CAAC,WAAY,CAAE,OAAQ,iBAAkB,IAAK,QAAQ,CAAE,EACxD,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,CACpE,CAAC","x_google_ignoreList":[0,1]}
@@ -0,0 +1,6 @@
1
+ import{b as e}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 t=e("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);export{t as T};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash-2-JtYRQ79q.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/trash-2.js"],"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 Trash2 = createLucideIcon(\"Trash2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n"],"names":["Trash2","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,QAAQ,CAAE,EACtE,CAAC,OAAQ,CAAE,EAAG,qCAAsC,IAAK,QAAQ,CAAE,EACnE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,OAAO,CAAE,CACnE,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,6 @@
1
+ import{b as e}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 t=e("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);export{t as T};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triangle-alert-Nzbrm0I2.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js"],"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 TriangleAlert = createLucideIcon(\"TriangleAlert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n"],"names":["TriangleAlert","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAgBC,EAAiB,gBAAiB,CACtD,CACE,OACA,CACE,EAAG,2EACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ import{r as e}from"./cmdk-BLWIhKrV.js";import{f as b,F as g}from"./main-LxX9zTRk.js";function d(n){const[l,c]=e.useState(null),[u,r]=e.useState(null),[f,o]=e.useState(!!n),[i,h]=e.useState(0),m=e.useRef(n);m.current=n,e.useEffect(()=>{if(!n){c(null),r(null),o(!1);return}const s=new AbortController;let a=!1;return o(!0),r(null),b(n,{signal:s.signal}).then(t=>{a||(c(t),o(!1))}).catch(t=>{a||t&&typeof t=="object"&&"name"in t&&t.name==="AbortError"||(r(t instanceof Error?t:new g(0,String(t),null)),o(!1))}),()=>{a=!0,s.abort()}},[n,i]);const E=e.useCallback(()=>{h(s=>s+1)},[]);return{data:l,error:u,loading:f,refetch:E}}export{d as u};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetch-CoVWwbml.js","sources":["../../src/web/v8/data/useFetch.ts"],"sourcesContent":["/**\n * v8/data/useFetch.ts — React-side `useFetch<T>(url)` hook.\n *\n * Returns `{ data, error, loading, refetch }`. Calls `fetchJson` with\n * an AbortController that's tied to the component lifecycle so an\n * unmount mid-request doesn't trigger a state update.\n *\n * Re-fetches when `url` changes (deep-equal via JSON.stringify — fine\n * for the small REST surfaces the dashboard uses).\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { fetchJson, FetchError } from './fetcher.js';\n\nexport interface UseFetchState<T> {\n data: T | null;\n error: Error | null;\n loading: boolean;\n refetch: () => void;\n}\n\nexport function useFetch<T>(url: string | null): UseFetchState<T> {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [loading, setLoading] = useState<boolean>(Boolean(url));\n const [tick, setTick] = useState(0);\n const urlRef = useRef<string | null>(url);\n urlRef.current = url;\n\n useEffect(() => {\n if (!url) {\n setData(null);\n setError(null);\n setLoading(false);\n return;\n }\n const ctrl = new AbortController();\n let cancelled = false;\n setLoading(true);\n setError(null);\n fetchJson<T>(url, { signal: ctrl.signal })\n .then((res) => {\n if (cancelled) return;\n setData(res);\n setLoading(false);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err && typeof err === 'object' && 'name' in err && err.name === 'AbortError') return;\n setError(err instanceof Error ? err : new FetchError(0, String(err), null));\n setLoading(false);\n });\n return () => {\n cancelled = true;\n ctrl.abort();\n };\n }, [url, tick]);\n\n const refetch = useCallback(() => { setTick((n) => n + 1); }, []);\n\n return { data, error, loading, refetch };\n}"],"names":["useFetch","url","data","setData","useState","error","setError","loading","setLoading","tick","setTick","urlRef","useRef","useEffect","ctrl","cancelled","fetchJson","res","err","FetchError","refetch","useCallback","n"],"mappings":"qFAqBO,SAASA,EAAYC,EAAsC,CAChE,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAmB,IAAI,EACzC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAuB,IAAI,EAC/C,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAkB,EAAQH,CAAI,EACtD,CAACQ,EAAMC,CAAO,EAAIN,EAAAA,SAAS,CAAC,EAC5BO,EAASC,EAAAA,OAAsBX,CAAG,EACxCU,EAAO,QAAUV,EAEjBY,EAAAA,UAAU,IAAM,CACd,GAAI,CAACZ,EAAK,CACRE,EAAQ,IAAI,EACZG,EAAS,IAAI,EACbE,EAAW,EAAK,EAChB,MACF,CACA,MAAMM,EAAO,IAAI,gBACjB,IAAIC,EAAY,GAChB,OAAAP,EAAW,EAAI,EACfF,EAAS,IAAI,EACbU,EAAaf,EAAK,CAAE,OAAQa,EAAK,OAAQ,EACtC,KAAMG,GAAQ,CACTF,IACJZ,EAAQc,CAAG,EACXT,EAAW,EAAK,EAClB,CAAC,EACA,MAAOU,GAAQ,CACVH,GACAG,GAAO,OAAOA,GAAQ,UAAY,SAAUA,GAAOA,EAAI,OAAS,eACpEZ,EAASY,aAAe,MAAQA,EAAM,IAAIC,EAAW,EAAG,OAAOD,CAAG,EAAG,IAAI,CAAC,EAC1EV,EAAW,EAAK,EAClB,CAAC,EACI,IAAM,CACXO,EAAY,GACZD,EAAK,MAAA,CACP,CACF,EAAG,CAACb,EAAKQ,CAAI,CAAC,EAEd,MAAMW,EAAUC,EAAAA,YAAY,IAAM,CAAEX,EAASY,GAAMA,EAAI,CAAC,CAAG,EAAG,CAAA,CAAE,EAEhE,MAAO,CAAE,KAAApB,EAAM,MAAAG,EAAO,QAAAE,EAAS,QAAAa,CAAA,CACjC"}
@@ -0,0 +1 @@
1
+ import{r as a}from"./cmdk-BLWIhKrV.js";const t={socket:null,listeners:new Set,retries:0,retryTimer:null,connectedListeners:new Set};function f(){return typeof window>"u"?"":`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`}function s(e){for(const r of t.connectedListeners)try{r(e)}catch{}}function i(){if(typeof window>"u"||t.socket&&(t.socket.readyState===WebSocket.OPEN||t.socket.readyState===WebSocket.CONNECTING))return;let e;try{e=new WebSocket(f())}catch{c();return}t.socket=e,e.addEventListener("open",()=>{t.retries=0,s(!0)}),e.addEventListener("message",r=>{let o;try{o=JSON.parse(typeof r.data=="string"?r.data:"")}catch{return}for(const n of t.listeners)try{n(o)}catch{}}),e.addEventListener("close",()=>{t.socket=null,s(!1),c()}),e.addEventListener("error",()=>{})}function c(){if(t.retryTimer)return;const e=Math.min(3e4,500*Math.pow(2,t.retries++));t.retryTimer=setTimeout(()=>{t.retryTimer=null,i()},e)}function u(e){a.useEffect(()=>(t.listeners.add(e),t.socket||i(),()=>{t.listeners.delete(e)}),[e])}function l(e,r){const o=Array.isArray(e)?new Set(e):new Set([e]);u(n=>{typeof n=="object"&&n&&"type"in n&&o.has(n.type)&&r(n)})}export{l as u};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWebSocket-CVIQB8yG.js","sources":["../../src/web/v8/data/useWebSocket.ts"],"sourcesContent":["/**\n * v8/data/useWebSocket.ts — singleton WS client for the v8 dashboard.\n *\n * The dashboard server exposes `/ws` (one WebSocket per browser tab).\n * We open the socket exactly once per page-load and fan-out messages\n * to every subscriber via a tiny event-bus.\n *\n * Why a module-singleton instead of a per-component socket? The\n * dashboard has at least 7 views that all want live updates — opening\n * one socket per view would multiply the server's fan-out cost.\n */\n\nimport { useEffect } from 'react';\nimport type { WsMessage } from './types.js';\n\ntype Listener = (msg: WsMessage) => void;\n\ninterface SocketState {\n socket: WebSocket | null;\n listeners: Set<Listener>;\n retries: number;\n retryTimer: ReturnType<typeof setTimeout> | null;\n connectedListeners: Set<(connected: boolean) => void>;\n}\n\nconst state: SocketState = {\n socket: null,\n listeners: new Set(),\n retries: 0,\n retryTimer: null,\n connectedListeners: new Set(),\n};\n\nfunction url(): string {\n if (typeof window === 'undefined') return '';\n const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${proto}//${window.location.host}/ws`;\n}\n\nfunction notifyConnected(connected: boolean): void {\n for (const fn of state.connectedListeners) {\n try { fn(connected); } catch { /* swallow */ }\n }\n}\n\nfunction connect(): void {\n if (typeof window === 'undefined') return;\n if (state.socket && (state.socket.readyState === WebSocket.OPEN || state.socket.readyState === WebSocket.CONNECTING)) return;\n let sock: WebSocket;\n try {\n sock = new WebSocket(url());\n } catch {\n scheduleReconnect();\n return;\n }\n state.socket = sock;\n sock.addEventListener('open', () => {\n state.retries = 0;\n notifyConnected(true);\n });\n sock.addEventListener('message', (ev) => {\n let msg: WsMessage;\n try { msg = JSON.parse(typeof ev.data === 'string' ? ev.data : ''); }\n catch { return; }\n for (const fn of state.listeners) {\n try { fn(msg); } catch { /* swallow listener errors */ }\n }\n });\n sock.addEventListener('close', () => {\n state.socket = null;\n notifyConnected(false);\n scheduleReconnect();\n });\n sock.addEventListener('error', () => {\n // close handler will run after this.\n });\n}\n\nfunction scheduleReconnect(): void {\n if (state.retryTimer) return;\n const delay = Math.min(30_000, 500 * Math.pow(2, state.retries++));\n state.retryTimer = setTimeout(() => {\n state.retryTimer = null;\n connect();\n }, delay);\n}\n\n/** Force a reconnect (useful for the topbar \"Reconnect\" button). */\nexport function reconnect(): void {\n if (state.socket) {\n try { state.socket.close(); } catch { /* */ }\n state.socket = null;\n }\n state.retries = 0;\n connect();\n}\n\n/**\n * Subscribe to every WS message. The listener is called once per\n * matching message. Cleanup happens on unmount.\n */\nexport function useWsMessages(cb: (msg: WsMessage) => void): void {\n useEffect(() => {\n state.listeners.add(cb);\n if (!state.socket) connect();\n return () => {\n state.listeners.delete(cb);\n };\n }, [cb]);\n}\n\n/**\n * Subscribe only to messages whose `type` matches `predicate`. Convenience\n * over `useWsMessages` for the common case of \"just give me X events\".\n */\nexport function useWsMessage(\n predicate: string | string[],\n cb: (msg: WsMessage) => void,\n): void {\n const set = Array.isArray(predicate) ? new Set(predicate) : new Set([predicate]);\n useWsMessages((msg) => {\n if (typeof msg === 'object' && msg && 'type' in msg && set.has((msg as { type: string }).type)) {\n cb(msg);\n }\n });\n}\n\n/** Track WS connection status (for the topbar live indicator). */\nexport function useWsConnected(cb: (connected: boolean) => void): void {\n useEffect(() => {\n state.connectedListeners.add(cb);\n // Seed with current state.\n cb(state.socket?.readyState === WebSocket.OPEN);\n return () => {\n state.connectedListeners.delete(cb);\n };\n }, [cb]);\n}\n\n/** Test seam — reset module state. Not exported from the barrel. */\nexport function _resetForTests(): void {\n if (state.socket) {\n try { state.socket.close(); } catch { /* */ }\n }\n state.socket = null;\n state.listeners.clear();\n state.connectedListeners.clear();\n if (state.retryTimer) {\n clearTimeout(state.retryTimer);\n state.retryTimer = null;\n }\n state.retries = 0;\n}"],"names":["state","url","notifyConnected","connected","fn","connect","sock","scheduleReconnect","ev","msg","delay","useWsMessages","cb","useEffect","useWsMessage","predicate","set"],"mappings":"uCAyBA,MAAMA,EAAqB,CACzB,OAAQ,KACR,cAAe,IACf,QAAS,EACT,WAAY,KACZ,uBAAwB,GAC1B,EAEA,SAASC,GAAc,CACrB,OAAI,OAAO,OAAW,IAAoB,GAEnC,GADO,OAAO,SAAS,WAAa,SAAW,OAAS,KAChD,KAAK,OAAO,SAAS,IAAI,KAC1C,CAEA,SAASC,EAAgBC,EAA0B,CACjD,UAAWC,KAAMJ,EAAM,mBACrB,GAAI,CAAEI,EAAGD,CAAS,CAAG,MAAQ,CAAgB,CAEjD,CAEA,SAASE,GAAgB,CAEvB,GADI,OAAO,OAAW,KAClBL,EAAM,SAAWA,EAAM,OAAO,aAAe,UAAU,MAAQA,EAAM,OAAO,aAAe,UAAU,YAAa,OACtH,IAAIM,EACJ,GAAI,CACFA,EAAO,IAAI,UAAUL,GAAK,CAC5B,MAAQ,CACNM,EAAA,EACA,MACF,CACAP,EAAM,OAASM,EACfA,EAAK,iBAAiB,OAAQ,IAAM,CAClCN,EAAM,QAAU,EAChBE,EAAgB,EAAI,CACtB,CAAC,EACDI,EAAK,iBAAiB,UAAYE,GAAO,CACvC,IAAIC,EACJ,GAAI,CAAEA,EAAM,KAAK,MAAM,OAAOD,EAAG,MAAS,SAAWA,EAAG,KAAO,EAAE,CAAG,MAC9D,CAAE,MAAQ,CAChB,UAAWJ,KAAMJ,EAAM,UACrB,GAAI,CAAEI,EAAGK,CAAG,CAAG,MAAQ,CAAgC,CAE3D,CAAC,EACDH,EAAK,iBAAiB,QAAS,IAAM,CACnCN,EAAM,OAAS,KACfE,EAAgB,EAAK,EACrBK,EAAA,CACF,CAAC,EACDD,EAAK,iBAAiB,QAAS,IAAM,CAErC,CAAC,CACH,CAEA,SAASC,GAA0B,CACjC,GAAIP,EAAM,WAAY,OACtB,MAAMU,EAAQ,KAAK,IAAI,IAAQ,IAAM,KAAK,IAAI,EAAGV,EAAM,SAAS,CAAC,EACjEA,EAAM,WAAa,WAAW,IAAM,CAClCA,EAAM,WAAa,KACnBK,EAAA,CACF,EAAGK,CAAK,CACV,CAgBO,SAASC,EAAcC,EAAoC,CAChEC,EAAAA,UAAU,KACRb,EAAM,UAAU,IAAIY,CAAE,EACjBZ,EAAM,QAAQK,EAAA,EACZ,IAAM,CACXL,EAAM,UAAU,OAAOY,CAAE,CAC3B,GACC,CAACA,CAAE,CAAC,CACT,CAMO,SAASE,EACdC,EACAH,EACM,CACN,MAAMI,EAAM,MAAM,QAAQD,CAAS,EAAI,IAAI,IAAIA,CAAS,EAAI,IAAI,IAAI,CAACA,CAAS,CAAC,EAC/EJ,EAAeF,GAAQ,CACjB,OAAOA,GAAQ,UAAYA,GAAO,SAAUA,GAAOO,EAAI,IAAKP,EAAyB,IAAI,GAC3FG,EAAGH,CAAG,CAEV,CAAC,CACH"}
@@ -0,0 +1,6 @@
1
+ import{b as a}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 e=a("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);export{e as W};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrench-B7go551L.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/wrench.js"],"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 Wrench = createLucideIcon(\"Wrench\", [\n [\n \"path\",\n {\n d: \"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\",\n key: \"cbrjhi\"\n }\n ]\n]);\n\nexport { Wrench as default };\n//# sourceMappingURL=wrench.js.map\n"],"names":["Wrench","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,2JACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
@@ -2,21 +2,18 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
- <meta name="apple-mobile-web-app-capable" content="yes" />
7
- <meta name="mobile-web-app-capable" content="yes" />
8
- <meta name="theme-color" content="#8b5cf6" />
9
- <title>Bizar</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Bizar Dashboard · v8 (preview)</title>
10
7
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🪩</text></svg>" />
11
8
  <link rel="preconnect" href="https://rsms.me/" />
12
9
  <link rel="preconnect" href="https://fonts.googleapis.com" />
13
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
14
11
  <link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
15
- <script type="module" crossorigin src="/assets/mobile-C_naUN91.js"></script>
16
- <link rel="modulepreload" crossorigin href="/assets/mobile-layout-GZ3bE8L6.js">
17
- <link rel="stylesheet" crossorigin href="/assets/mobile-layout-BWLtwtfQ.css">
12
+ <script type="module" crossorigin src="/assets/main-LxX9zTRk.js"></script>
13
+ <link rel="modulepreload" crossorigin href="/assets/cmdk-BLWIhKrV.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/main-CcQfRfIJ.css">
18
15
  </head>
19
16
  <body>
20
17
  <div id="root"></div>
21
18
  </body>
22
- </html>
19
+ </html>
@@ -1 +1 @@
1
- {"version":"4.1.10","results":[[":tests/views/Memory.test.tsx",{"duration":427.588434,"failed":false}],[":tests/BackgroundAgents.test.tsx",{"duration":268.359411,"failed":false}],[":tests/autosave.test.tsx",{"duration":258.93156,"failed":false}],[":tests/views/Overview.test.tsx",{"duration":493.33852,"failed":false}],[":tests/mobile-layout.test.tsx",{"duration":284.669842,"failed":false}],[":tests/views/Agents.test.tsx",{"duration":622.547519,"failed":false}],[":tests/components/settings-search.test.tsx",{"duration":742.6605920000001,"failed":false}],[":tests/eval-web-ui.test.tsx",{"duration":134.72983299999999,"failed":false}],[":tests/views/Tasks.test.tsx",{"duration":443.49187600000005,"failed":false}],[":tests/a11y/forms.test.tsx",{"duration":89.58849199999997,"failed":true}],[":tests/mobile-settings.test.tsx",{"duration":214.629275,"failed":false}],[":tests/a11y.test.tsx",{"duration":2510.271573,"failed":false}],[":tests/backup-restore.test.tsx",{"duration":199.76050199999997,"failed":false}],[":tests/mobile-tasks.test.tsx",{"duration":200.3035920000001,"failed":false}],[":tests/chat-composer.test.tsx",{"duration":273.03698099999997,"failed":false}],[":tests/mobile-overview.test.tsx",{"duration":251.19768999999985,"failed":false}],[":src/web/components/agents/RoutingDecisions.test.tsx",{"duration":96.87386300000003,"failed":false}],[":tests/lib/utils.test.ts",{"duration":16.848490000000027,"failed":false}],[":tests/ui/data/DataTable.test.tsx",{"duration":194.62984499999993,"failed":false}],[":tests/lib/search-fuzzy.test.ts",{"duration":4.908913999999982,"failed":false}],[":tests/settings-layout.test.tsx",{"duration":206.809751,"failed":false}],[":tests/settings-nav.test.tsx",{"duration":282.1045120000001,"failed":false}],[":tests/settings-mode-wiring.test.tsx",{"duration":312.29586500000005,"failed":false}],[":tests/minimax-bar.test.tsx",{"duration":32.567679999999996,"failed":false}],[":tests/ui/feedback/Toast.test.tsx",{"duration":250.11323599999992,"failed":false}],[":tests/ui/navigation/CommandPalette.test.tsx",{"duration":282.23178600000006,"failed":false}],[":tests/components/doctor-panel.test.tsx",{"duration":91.71197599999994,"failed":false}],[":tests/views/sidebar.test.tsx",{"duration":129.53635500000007,"failed":false}],[":tests/ui/layout/Tabs.test.tsx",{"duration":192.45391100000006,"failed":false}],[":tests/views/topbar.test.tsx",{"duration":519.7306729999999,"failed":false}],[":tests/components/Toast.test.tsx",{"duration":201.75069100000007,"failed":false}],[":tests/ui/feedback/Tooltip.test.tsx",{"duration":93.07135800000003,"failed":false}],[":tests/voice-recorder.test.tsx",{"duration":144.5129629999999,"failed":false}],[":tests/mobile-chat.test.tsx",{"duration":81.44125299999996,"failed":false}],[":tests/ui/data/StatTile.test.tsx",{"duration":112.04556500000001,"failed":false}],[":tests/ui/layout/Sidebar.test.tsx",{"duration":160.56550000000004,"failed":false}],[":tests/ui/feedback/Dialog.test.tsx",{"duration":169.84368500000005,"failed":false}],[":tests/goal-input.test.tsx",{"duration":195.10940199999993,"failed":false}],[":tests/goap-planner.test.ts",{"duration":3.8911860000000047,"failed":false}],[":tests/components/Modal.test.tsx",{"duration":201.81510500000002,"failed":false}],[":tests/communication-log.test.tsx",{"duration":76.99420199999997,"failed":false}],[":tests/ui/feedback/ProgressBar.test.tsx",{"duration":76.68909899999994,"failed":false}],[":tests/memory-graph-view.test.tsx",{"duration":46.589782000000014,"failed":false}],[":tests/ui/data/KeyValueList.test.tsx",{"duration":152.445653,"failed":false}],[":tests/ui/layout/Breadcrumbs.test.tsx",{"duration":136.796558,"failed":false}],[":tests/ui/navigation/NavLink.test.tsx",{"duration":178.380541,"failed":false}],[":tests/components/screenshot-ocr.test.tsx",{"duration":34.225052000000005,"failed":false}],[":tests/hooks/useModal.test.tsx",{"duration":147.95084200000008,"failed":false}],[":tests/ui/data/BarChart.test.tsx",{"duration":94.56861200000003,"failed":false}],[":tests/ui/controls/Textarea.test.tsx",{"duration":112.77774600000009,"failed":false}],[":tests/event-log.test.tsx",{"duration":65.03253399999994,"failed":false}],[":tests/ui/controls/Select.test.tsx",{"duration":152.022293,"failed":false}],[":tests/ui/data/Sparkline.test.tsx",{"duration":32.044768999999974,"failed":false}],[":tests/components/workspace-selector.test.tsx",{"duration":137.78600100000006,"failed":false}],[":tests/ui/navigation/NavGroup.test.tsx",{"duration":171.45922700000006,"failed":false}],[":tests/dep-graph.test.tsx",{"duration":118.61701100000005,"failed":false}],[":tests/ui/controls/RadioGroup.test.tsx",{"duration":167.64945699999998,"failed":false}],[":tests/ui/layout/Panel.test.tsx",{"duration":34.87961399999995,"failed":false}],[":tests/quality-gates.test.tsx",{"duration":43.57956200000001,"failed":false}],[":tests/ui/controls/NumberInput.test.tsx",{"duration":149.17823099999998,"failed":false}],[":tests/ui/data/EmptyState.test.tsx",{"duration":104.00983799999995,"failed":false}],[":tests/ui/layout/ViewHeader.test.tsx",{"duration":39.52563399999997,"failed":false}],[":tests/ui/controls/SearchInput.test.tsx",{"duration":150.78952400000003,"failed":false}],[":tests/ui/primitives/Box.test.tsx",{"duration":32.86741299999994,"failed":false}],[":tests/ui/layout/AppShell.test.tsx",{"duration":27.480504999999994,"failed":false}],[":tests/ui/controls/Button.test.tsx",{"duration":141.232436,"failed":false}],[":tests/ui/controls/Slider.test.tsx",{"duration":83.16240600000003,"failed":false}],[":tests/hooks/useToast.test.tsx",{"duration":125.98108200000001,"failed":false}],[":tests/ui/data/ErrorState.test.tsx",{"duration":117.94075600000008,"failed":false}],[":tests/ui/data/LoadingState.test.tsx",{"duration":77.70447200000001,"failed":false}],[":tests/ui/controls/TextInput.test.tsx",{"duration":117.05886900000007,"failed":false}],[":tests/ui/layout/Topbar.test.tsx",{"duration":70.17956199999992,"failed":false}],[":tests/ui/feedback/StatusDot.test.tsx",{"duration":80.754097,"failed":false}],[":tests/lib/i18n.test.ts",{"duration":2.413669000000027,"failed":false}],[":tests/ui/feedback/Badge.test.tsx",{"duration":48.463427000000024,"failed":false}],[":tests/ui/controls/Checkbox.test.tsx",{"duration":116.98734100000001,"failed":false}],[":tests/components/Button.test.tsx",{"duration":115.24144100000001,"failed":false}],[":tests/components/Card.test.tsx",{"duration":25.367482000000052,"failed":false}],[":tests/ui/primitives/Stack.test.tsx",{"duration":25.539912000000072,"failed":false}],[":tests/components/StatusBadge.test.tsx",{"duration":35.74661299999991,"failed":false}],[":tests/ui/controls/Toggle.test.tsx",{"duration":142.27458000000001,"failed":false}],[":tests/ui/primitives/Separator.test.tsx",{"duration":17.745345999999984,"failed":false}],[":tests/ui/controls/IconButton.test.tsx",{"duration":96.80897900000002,"failed":false}],[":tests/ui/controls/Kbd.test.tsx",{"duration":19.74353099999996,"failed":false}],[":tests/ui/primitives/Inline.test.tsx",{"duration":15.097170000000006,"failed":false}],[":tests/ui/primitives/Grid.test.tsx",{"duration":21.766181000000017,"failed":false}],[":tests/ui/layout/PanelHeader.test.tsx",{"duration":18.773353999999983,"failed":false}],[":tests/ui/primitives/VisuallyHidden.test.tsx",{"duration":15.98928699999999,"failed":false}],[":tests/components/Spinner.test.tsx",{"duration":61.72107700000004,"failed":false}]]}
1
+ {"version":"4.1.10","results":[[":tests/views/Agents.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/data.test.tsx",{"duration":360.81851200000006,"failed":false}],[":tests/views/Tasks.test.tsx",{"duration":0,"failed":true}],[":tests/views/Memory.test.tsx",{"duration":0,"failed":true}],[":tests/eval-web-ui.test.tsx",{"duration":0,"failed":true}],[":tests/a11y.test.tsx",{"duration":0,"failed":true}],[":tests/autosave.test.tsx",{"duration":0,"failed":true}],[":tests/a11y/forms.test.tsx",{"duration":0,"failed":true}],[":tests/views/Overview.test.tsx",{"duration":0,"failed":true}],[":tests/mobile-layout.test.tsx",{"duration":0,"failed":true}],[":tests/mobile-overview.test.tsx",{"duration":0,"failed":true}],[":tests/mobile-tasks.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/kanban.test.tsx",{"duration":604.367681,"failed":false}],[":tests/BackgroundAgents.test.tsx",{"duration":0,"failed":true}],[":tests/components/settings-search.test.tsx",{"duration":0,"failed":true}],[":tests/lib/utils.test.ts",{"duration":0,"failed":true}],[":tests/mobile-settings.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/feedback.test.tsx",{"duration":748.5428200000001,"failed":false}],[":src/web/v8/__tests__/views.test.tsx",{"duration":700.2177759999997,"failed":false}],[":tests/chat-composer.test.tsx",{"duration":0,"failed":true}],[":tests/lib/search-fuzzy.test.ts",{"duration":0,"failed":true}],[":src/web/v8/__tests__/navigation.test.tsx",{"duration":436.66578400000003,"failed":false}],[":src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx",{"duration":881.3757560000001,"failed":false}],[":tests/settings-mode-wiring.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/controls.test.tsx",{"duration":371.7304609999999,"failed":false}],[":tests/backup-restore.test.tsx",{"duration":0,"failed":true}],[":tests/settings-layout.test.tsx",{"duration":0,"failed":true}],[":tests/settings-nav.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/DataTable.test.tsx",{"duration":0,"failed":true}],[":tests/ui/feedback/Toast.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/settings.test.tsx",{"duration":180.78419700000006,"failed":false}],[":tests/ui/navigation/CommandPalette.test.tsx",{"duration":0,"failed":true}],[":tests/minimax-bar.test.tsx",{"duration":27.861580000000004,"failed":false}],[":tests/components/doctor-panel.test.tsx",{"duration":0,"failed":true}],[":tests/views/sidebar.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/goals.test.tsx",{"duration":246.09761900000012,"failed":false}],[":src/web/v8/__tests__/theme.test.tsx",{"duration":73.54684800000007,"failed":false}],[":src/web/v8/__tests__/Sidebar.test.tsx",{"duration":311.952814,"failed":false}],[":tests/views/topbar.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/Tabs.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/App.test.tsx",{"duration":768.5281889999999,"failed":false}],[":tests/ui/feedback/Tooltip.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/SettingsView.test.tsx",{"duration":1152.8078779999998,"failed":false}],[":tests/components/Toast.test.tsx",{"duration":392.4640519999998,"failed":false}],[":src/web/v8/ui/theme/ThemeProvider.test.tsx",{"duration":50.02361600000006,"failed":false}],[":tests/voice-recorder.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/agents.test.tsx",{"duration":166.16384400000015,"failed":false}],[":tests/mobile-chat.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts",{"duration":24.20512199999996,"failed":false}],[":tests/ui/data/StatTile.test.tsx",{"duration":0,"failed":true}],[":tests/ui/feedback/Dialog.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/Sidebar.test.tsx",{"duration":0,"failed":true}],[":tests/goal-input.test.tsx",{"duration":0,"failed":true}],[":tests/goap-planner.test.ts",{"duration":0,"failed":true}],[":tests/components/Modal.test.tsx",{"duration":0,"failed":true}],[":tests/communication-log.test.tsx",{"duration":0,"failed":true}],[":tests/ui/feedback/ProgressBar.test.tsx",{"duration":0,"failed":true}],[":tests/memory-graph-view.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/KeyValueList.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/Breadcrumbs.test.tsx",{"duration":0,"failed":true}],[":tests/hooks/useModal.test.tsx",{"duration":0,"failed":true}],[":tests/ui/navigation/NavLink.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/libraries.test.tsx",{"duration":158.73642600000005,"failed":false}],[":tests/components/screenshot-ocr.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/ui/theme/DensityProvider.test.tsx",{"duration":60.33897200000001,"failed":false}],[":tests/ui/data/BarChart.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/Textarea.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/memory.test.tsx",{"duration":178.08053800000005,"failed":false}],[":src/web/v8/__tests__/activity.test.tsx",{"duration":95.98654599999998,"failed":false}],[":tests/ui/controls/Select.test.tsx",{"duration":0,"failed":true}],[":tests/event-log.test.tsx",{"duration":0,"failed":true}],[":tests/components/workspace-selector.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/Sparkline.test.tsx",{"duration":0,"failed":true}],[":tests/ui/navigation/NavGroup.test.tsx",{"duration":0,"failed":true}],[":src/web/v8/__tests__/AppShell.test.tsx",{"duration":285.96209999999996,"failed":false}],[":tests/dep-graph.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/RadioGroup.test.tsx",{"duration":0,"failed":true}],[":tests/quality-gates.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/NumberInput.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/EmptyState.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/Panel.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/ViewHeader.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/SearchInput.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/Box.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/Button.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/AppShell.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/ErrorState.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/Slider.test.tsx",{"duration":0,"failed":true}],[":tests/ui/feedback/StatusDot.test.tsx",{"duration":0,"failed":true}],[":tests/hooks/useToast.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/Topbar.test.tsx",{"duration":0,"failed":true}],[":tests/ui/data/LoadingState.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/TextInput.test.tsx",{"duration":0,"failed":true}],[":tests/lib/i18n.test.ts",{"duration":0,"failed":true}],[":tests/ui/controls/Checkbox.test.tsx",{"duration":0,"failed":true}],[":tests/ui/feedback/Badge.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/Stack.test.tsx",{"duration":0,"failed":true}],[":tests/components/Button.test.tsx",{"duration":149.96657699999992,"failed":false}],[":tests/components/Card.test.tsx",{"duration":43.13733100000002,"failed":false}],[":tests/components/StatusBadge.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/Toggle.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/Separator.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/Grid.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/IconButton.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/Inline.test.tsx",{"duration":0,"failed":true}],[":tests/ui/layout/PanelHeader.test.tsx",{"duration":0,"failed":true}],[":tests/ui/controls/Kbd.test.tsx",{"duration":0,"failed":true}],[":tests/components/Spinner.test.tsx",{"duration":0,"failed":true}],[":tests/ui/primitives/VisuallyHidden.test.tsx",{"duration":25.869405999999913,"failed":false}],[":src/web/v8/__tests__/cx.test.ts",{"duration":13.622602000000029,"failed":false}],[":src/web/v8/__tests__/PageSkeleton.test.tsx",{"duration":83.31864999999993,"failed":false}],[":src/web/v8/__tests__/useFetch.test.ts",{"duration":131.309793,"failed":false}],[":src/web/v8/__tests__/useWebSocket.test.ts",{"duration":26.84266200000002,"failed":false}],[":tests/components/Dialog.test.tsx",{"duration":365.423223,"failed":false}],[":src/web/v8/__tests__/control-plane.test.tsx",{"duration":675.3359230000001,"failed":false}]]}
@@ -62,6 +62,11 @@ import { createVoiceRouter } from './routes/voice.mjs';
62
62
  // v6.4.0 — F-036 Goal Planner UI. POST /api/goal-planner/plan returns
63
63
  // a GOAP-style A* plan for a plain-English goal.
64
64
  import { createGoalPlannerRouter } from './routes/goal-planner.mjs';
65
+ // Sprint S10 — v8 dashboard live data. /api/goals parses .bizar/PROGRESS.md;
66
+ // /api/cc-agents exposes `claude agents --json` enriched with worktree + counts;
67
+ // /api/agent-stream SSE tails the session JSONL for live agent output.
68
+ import { createGoalsRouter } from './routes/goals.mjs';
69
+ import { createCCAgentsRouter, createAgentStreamRouter } from './routes/agents-cc.mjs';
65
70
  import { attachUserContext } from './auth.mjs';
66
71
 
67
72
  /**
@@ -117,6 +122,9 @@ export async function createApiRouter({
117
122
  router.use(createModsRouter());
118
123
  router.use(createAgentsRouter({ state, broadcast }));
119
124
  router.use(createBackgroundRouter({ broadcast }));
125
+ // Sprint S10 — live CC agents + SSE stream for the dashboard output panel.
126
+ router.use(createCCAgentsRouter({ broadcast }));
127
+ router.use(createAgentStreamRouter());
120
128
  router.use(createActivityRouter({ state }));
121
129
  router.use(createHistoryRouter({ projectRoot }));
122
130
  router.use(createConfigRouter({ state, watcher }));
@@ -158,6 +166,8 @@ export async function createApiRouter({
158
166
  router.use(createPairRouter({ state, broadcast }));
159
167
  // v6.4.0 — F-036 Goal Planner UI. Plain-English goal → A* plan.
160
168
  router.use(createGoalPlannerRouter({ broadcast }));
169
+ // Sprint S10 — goals CRUD on .bizar/PROGRESS.md.
170
+ router.use(createGoalsRouter({ broadcast }));
161
171
  router.use(createThemesRouter({ state }));
162
172
  router.use(createNotificationsRouter({ broadcast }));
163
173
  router.use(createArtifactsRouter({ state, broadcast, projectRoot }));
@@ -30,7 +30,8 @@ import { tasksStore } from './tasks-store.mjs';
30
30
  import { projectsStore } from './projects-store.mjs';
31
31
  import { artifactsStore, extractArtifactFromMessage } from './artifacts-store.mjs';
32
32
  import { listClaudeMessages, readLastAssistantText } from './claude-info.mjs';
33
- import { execFileSync } from 'node:child_process';
33
+ import { execFileSync, spawn } from 'node:child_process';
34
+ import { createHash } from 'node:crypto';
34
35
 
35
36
  const POLL_INTERVAL_MS = 3_000;
36
37
  const ARTIFACT_SCAN_TIMEOUT_MS = 6_000;
@@ -267,8 +268,10 @@ export function startBgPoller() {
267
268
  // Tick once immediately so completions that happened while the
268
269
  // dashboard was down are reflected on the first WS snapshot.
269
270
  tick().catch((err) => console.error('[bg-poller] initial tick:', err.message));
271
+ tickCCAgents().catch(() => { /* best effort */ });
270
272
  _interval = setInterval(() => {
271
273
  tick().catch((err) => console.error('[bg-poller] tick:', err.message));
274
+ tickCCAgents().catch(() => { /* best effort */ });
272
275
  }, POLL_INTERVAL_MS);
273
276
  // Don't keep the event loop alive just for the poller — the http
274
277
  // server already does that. `unref()` is safe because we tear down
@@ -279,6 +282,81 @@ export function startBgPoller() {
279
282
  console.log(`[bg-poller] started (interval=${POLL_INTERVAL_MS}ms)`);
280
283
  }
281
284
 
285
+ // ── Sprint S10 — CC background agent change detection ────────────────────
286
+ // Polls `claude agents --json --all` on the same cadence and emits
287
+ // `agents:change` when the digest changes (so the unified Agents
288
+ // view updates without the browser polling).
289
+
290
+ let _lastCCDigest = null;
291
+ const CC_TIMEOUT_MS = 4_000;
292
+
293
+ function runClaudeAgentsJson() {
294
+ return new Promise((resolve) => {
295
+ let stdout = '';
296
+ let stderr = '';
297
+ let done = false;
298
+ let proc;
299
+ try {
300
+ proc = spawn('claude', ['agents', '--json', '--all'], { stdio: ['ignore', 'pipe', 'pipe'] });
301
+ } catch (err) {
302
+ resolve({ ok: false, error: err.message });
303
+ return;
304
+ }
305
+ const timer = setTimeout(() => {
306
+ if (done) return;
307
+ done = true;
308
+ try { proc.kill('SIGTERM'); } catch { /* */ }
309
+ resolve({ ok: false, error: 'timeout', stderr: stderr.slice(0, 200) });
310
+ }, CC_TIMEOUT_MS);
311
+ proc.stdout.on('data', (c) => { stdout += c.toString('utf8'); });
312
+ proc.stderr.on('data', (c) => { stderr += c.toString('utf8'); });
313
+ proc.on('error', (err) => {
314
+ if (done) return;
315
+ done = true;
316
+ clearTimeout(timer);
317
+ resolve({ ok: false, error: err.message });
318
+ });
319
+ proc.on('exit', (code) => {
320
+ if (done) return;
321
+ done = true;
322
+ clearTimeout(timer);
323
+ if (code !== 0) {
324
+ resolve({ ok: false, error: `exit ${code}`, stderr: stderr.slice(0, 200) });
325
+ return;
326
+ }
327
+ try {
328
+ const parsed = JSON.parse(stdout || '[]');
329
+ resolve({ ok: true, agents: Array.isArray(parsed) ? parsed : [] });
330
+ } catch (err) {
331
+ resolve({ ok: false, error: `parse: ${err.message}` });
332
+ }
333
+ });
334
+ });
335
+ }
336
+
337
+ function digestAgents(agents) {
338
+ const h = createHash('sha1');
339
+ // Sort by id so the digest is order-independent — `claude agents --json`
340
+ // may return background agents in any order.
341
+ const sorted = [...agents].sort((a, b) => String(a.id).localeCompare(String(b.id)));
342
+ for (const a of sorted) {
343
+ h.update(`${a.id}|${a.status || ''}|${a.state || ''}|${a.cwd || ''}|${a.name || ''}\n`);
344
+ }
345
+ return h.digest('hex').slice(0, 16);
346
+ }
347
+
348
+ export async function tickCCAgents() {
349
+ const r = await runClaudeAgentsJson();
350
+ if (!r.ok) return; // CC not on PATH or timed out — leave the previous digest alone.
351
+ const d = digestAgents(r.agents);
352
+ if (d === _lastCCDigest) return;
353
+ _lastCCDigest = d;
354
+ try {
355
+ const { broadcast } = await import('./server.mjs');
356
+ broadcast({ type: 'agents:change', source: 'claude-code', digest: d });
357
+ } catch { /* server not ready yet — swallow */ }
358
+ }
359
+
282
360
  export function stopBgPoller() {
283
361
  if (_interval) {
284
362
  clearInterval(_interval);
@@ -291,5 +369,7 @@ export const _pollerInternals = {
291
369
  trackedStatuses,
292
370
  processedArtifacts,
293
371
  tick,
372
+ tickCCAgents,
294
373
  POLL_INTERVAL_MS,
374
+ digestAgents,
295
375
  };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * src/server/bg-poller.test.mjs
3
+ *
4
+ * Sprint S10 — Digest test for the CC-agents change detector.
5
+ */
6
+
7
+ import { test } from 'node:test';
8
+ import assert from 'node:assert/strict';
9
+ import { _pollerInternals } from './bg-poller.mjs';
10
+ const { digestAgents } = _pollerInternals;
11
+
12
+ test('digestAgents stable for identical input', () => {
13
+ const a = [{ id: '1', status: 'busy' }];
14
+ const b = [{ id: '1', status: 'busy' }];
15
+ assert.equal(digestAgents(a), digestAgents(b));
16
+ });
17
+
18
+ test('digestAgents changes when status changes', () => {
19
+ const a = [{ id: '1', status: 'busy' }];
20
+ const b = [{ id: '1', status: 'idle' }];
21
+ assert.notEqual(digestAgents(a), digestAgents(b));
22
+ });
23
+
24
+ test('digestAgents order-independent', () => {
25
+ const a = [{ id: '1' }, { id: '2' }];
26
+ const b = [{ id: '2' }, { id: '1' }];
27
+ assert.equal(digestAgents(a), digestAgents(b));
28
+ });
@@ -0,0 +1,221 @@
1
+ /**
2
+ * src/server/progress-parser.mjs
3
+ *
4
+ * Sprint S10 — Parse `.bizar/PROGRESS.md` into a structured goal list
5
+ * for the v8 dashboard.
6
+ *
7
+ * Goals are the `## F-NNN — Title` (or `## Some — Title`) headings.
8
+ * Each goal's status is parsed from the first paragraph:
9
+ * "Goal is **on-track**" / "**at-risk**" / "**done**" / "**blocked**"
10
+ * Key results are `- [ ] text` / `- [x] text` lines inside the goal block.
11
+ * `Owner:` / `Due:` lines are extracted from the goal header lines.
12
+ *
13
+ * Pure: no I/O. Callers pass the raw text in. Deterministic.
14
+ *
15
+ * Reuses none — there is no existing goal state in the dashboard.
16
+ */
17
+
18
+ const STATUS_VALUES = new Set([
19
+ 'on-track',
20
+ 'at-risk',
21
+ 'off-track',
22
+ 'done',
23
+ 'blocked',
24
+ 'active',
25
+ ]);
26
+
27
+ /**
28
+ * Parse raw PROGRESS.md content into a structured goal list.
29
+ *
30
+ * @param {string} text raw file content
31
+ * @returns {{
32
+ * goals: Array<{
33
+ * id: string,
34
+ * title: string,
35
+ * status: string,
36
+ * description: string,
37
+ * progress: number,
38
+ * keyResults: Array<{ id: string, title: string, done: boolean, assignee?: string }>,
39
+ * due?: string,
40
+ * owner?: string,
41
+ * section: 'in-progress' | 'next' | 'recent' | 'backlog' | 'unknown'
42
+ * }>,
43
+ * preamble: string,
44
+ * postamble: string
45
+ * }}
46
+ */
47
+ export function parseProgress(text) {
48
+ if (typeof text !== 'string' || !text) {
49
+ return { goals: [], preamble: '', postamble: '' };
50
+ }
51
+ const lines = text.split(/\r?\n/);
52
+ /** @type {ReturnType<typeof parseProgress>['goals']} */
53
+ const goals = [];
54
+ let preamble = '';
55
+ let current = null;
56
+ let currentSection = 'unknown';
57
+ let postambleStart = -1;
58
+
59
+ function pushCurrent() {
60
+ if (current) {
61
+ // finalise: derive progress from KRs
62
+ const done = current.keyResults.filter((kr) => kr.done).length;
63
+ current.progress = current.keyResults.length > 0
64
+ ? done / current.keyResults.length
65
+ : current.progress || 0;
66
+ current.section = currentSection;
67
+ goals.push(current);
68
+ current = null;
69
+ }
70
+ }
71
+
72
+ let i = 0;
73
+ // preamble — everything before the first `## ` heading.
74
+ while (i < lines.length && !lines[i].startsWith('## ')) {
75
+ preamble += lines[i] + '\n';
76
+ i += 1;
77
+ }
78
+ while (i < lines.length) {
79
+ const line = lines[i];
80
+ if (line.startsWith('## ')) {
81
+ pushCurrent();
82
+ const headerText = line.slice(3).trim();
83
+ const { id, title } = parseHeader(headerText);
84
+ current = {
85
+ id,
86
+ title,
87
+ status: 'on-track',
88
+ description: '',
89
+ progress: 0,
90
+ keyResults: [],
91
+ section: currentSection,
92
+ };
93
+ currentSection = inferSection(text, i, headerText);
94
+ i += 1;
95
+ continue;
96
+ }
97
+ if (!current) {
98
+ // Lines between sections — accumulate into preamble/postamble.
99
+ if (goals.length === 0) preamble += line + '\n';
100
+ else { postambleStart = postambleStart === -1 ? i : postambleStart; }
101
+ i += 1;
102
+ continue;
103
+ }
104
+ // Body lines under the current goal.
105
+ const kr = parseKeyResultLine(line);
106
+ if (kr) {
107
+ current.keyResults.push({ id: `kr-${current.id}-${current.keyResults.length + 1}`, ...kr });
108
+ i += 1;
109
+ continue;
110
+ }
111
+ const ownerMatch = /^owner:\s*([^\n]+)/i.exec(line);
112
+ if (ownerMatch) {
113
+ current.owner = ownerMatch[1].trim();
114
+ i += 1;
115
+ continue;
116
+ }
117
+ const dueMatch = /\bdue\s*:?\s*([^\n,;]+)/i.exec(line);
118
+ if (dueMatch && !current.due) {
119
+ current.due = dueMatch[1].trim();
120
+ }
121
+ const statusMatch = /\*\*\s*(on-track|at-risk|off-track|done|blocked|active)\s*\*\*/i.exec(line);
122
+ if (statusMatch && current.status === 'on-track') {
123
+ current.status = statusMatch[1].toLowerCase();
124
+ }
125
+ const pctMatch = /(\d{1,3})\s*%/.exec(line);
126
+ if (pctMatch && current.progress === 0) {
127
+ const pct = Math.max(0, Math.min(100, parseInt(pctMatch[1], 10)));
128
+ current.progress = pct / 100;
129
+ }
130
+ if (line.trim()) current.description = appendLine(current.description, line);
131
+ i += 1;
132
+ }
133
+ pushCurrent();
134
+
135
+ const postamble = postambleStart === -1 ? '' : lines.slice(postambleStart).join('\n');
136
+ return { goals, preamble: preamble.trimEnd() + '\n', postamble };
137
+ }
138
+
139
+ /**
140
+ * Parse the header text — `"F-052 — Title"`, `"Some title"`, or
141
+ * `"## Title with — em-dash"`. Returns a stable id derived from the
142
+ * header (or a slug fallback).
143
+ */
144
+ function parseHeader(headerText) {
145
+ const m = /^([A-Za-z0-9_-]+)\s*[—\-]\s*(.+)$/.exec(headerText);
146
+ if (m) return { id: m[1], title: m[2].trim() };
147
+ const id = slugify(headerText);
148
+ return { id, title: headerText };
149
+ }
150
+
151
+ function slugify(s) {
152
+ return s
153
+ .toLowerCase()
154
+ .replace(/[^a-z0-9]+/g, '-')
155
+ .replace(/^-+|-+$/g, '')
156
+ .slice(0, 64) || 'goal';
157
+ }
158
+
159
+ function inferSection(fullText, headerIndex, headerText) {
160
+ // Look back for a section divider (`### In Progress`, etc.).
161
+ const before = fullText.slice(0, fullText.indexOf(headerText));
162
+ if (/In Progress/i.test(before.slice(-200))) return 'in-progress';
163
+ if (/Next Steps?/i.test(before.slice(-200))) return 'next';
164
+ if (/Recent/i.test(before.slice(-200))) return 'recent';
165
+ if (/Backlog|Blockers/i.test(before.slice(-200))) return 'backlog';
166
+ return 'unknown';
167
+ }
168
+
169
+ function parseKeyResultLine(line) {
170
+ const m = /^\s*-\s+\[(x|X| )\]\s+(.+)$/.exec(line);
171
+ if (!m) return null;
172
+ const done = m[1].toLowerCase() === 'x';
173
+ const rest = m[2].trim();
174
+ const assignee = /\(@([a-z0-9_-]+)\)\s*$/.exec(rest);
175
+ return {
176
+ title: assignee ? rest.slice(0, assignee.index).trim() : rest,
177
+ done,
178
+ assignee: assignee ? assignee[1] : undefined,
179
+ };
180
+ }
181
+
182
+ function appendLine(current, line) {
183
+ if (!current) return line.trim();
184
+ return current + '\n' + line.trim();
185
+ }
186
+
187
+ /**
188
+ * Serialise a goal list back to PROGRESS.md-shaped text. Preserves the
189
+ * preamble and postamble so non-goal sections (Current State, etc.)
190
+ * aren't clobbered.
191
+ *
192
+ * @param {ReturnType<typeof parseProgress>} parsed
193
+ * @returns {string}
194
+ */
195
+ export function serializeProgress(parsed) {
196
+ const out = [];
197
+ if (parsed.preamble) out.push(parsed.preamble.trimEnd());
198
+ for (const goal of parsed.goals) {
199
+ out.push(`## ${goal.id} — ${goal.title}`);
200
+ if (goal.owner || goal.due) {
201
+ const meta = [];
202
+ if (goal.owner) meta.push(`Owner: ${goal.owner}`);
203
+ if (goal.due) meta.push(`Due: ${goal.due}`);
204
+ out.push(meta.join(' · '));
205
+ }
206
+ out.push(`Goal is **${goal.status}**.`);
207
+ if (goal.description) out.push(goal.description);
208
+ if (goal.keyResults.length) {
209
+ out.push('Key results:');
210
+ for (const kr of goal.keyResults) {
211
+ const assignee = kr.assignee ? ` (@${kr.assignee})` : '';
212
+ out.push(`- [${kr.done ? 'x' : ' '}] ${kr.title}${assignee}`);
213
+ }
214
+ }
215
+ out.push('');
216
+ }
217
+ if (parsed.postamble) out.push(parsed.postamble.trimEnd());
218
+ return out.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
219
+ }
220
+
221
+ export const _internals = { STATUS_VALUES };