@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,142 @@
1
+ import { describe, expect, it, vi, beforeEach } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { ThemeProvider } from '../../ui/theme/ThemeProvider.js';
5
+ import { DensityProvider } from '../../ui/theme/DensityProvider.js';
6
+ import { AppCommandPalette } from './AppCommandPalette.js';
7
+
8
+ /**
9
+ * AppCommandPalette — the ⌘K palette with three scopes:
10
+ * Navigation, Actions, Settings.
11
+ *
12
+ * The underlying `cmdk` primitive filters items by typed value; we don't
13
+ * need to type to exercise selection, but typing "Tasks" narrows the
14
+ * list to the matching Navigation item.
15
+ *
16
+ * The Dialog mounts a portal; @testing-library queries reach into the
17
+ * portal transparently.
18
+ */
19
+
20
+ function PaletteHarness(props: {
21
+ open: boolean;
22
+ onOpenChange: (open: boolean) => void;
23
+ onNavigate: (id: string) => void;
24
+ }): JSX.Element {
25
+ return (
26
+ <ThemeProvider defaultMode="light">
27
+ <DensityProvider>
28
+ <AppCommandPalette
29
+ open={props.open}
30
+ onOpenChange={props.onOpenChange}
31
+ onNavigate={props.onNavigate}
32
+ />
33
+ </DensityProvider>
34
+ </ThemeProvider>
35
+ );
36
+ }
37
+
38
+ // `cmdk` calls `scrollIntoView` on the highlighted item whenever the user
39
+ // types. jsdom doesn't implement it natively, so we stub a no-op on the
40
+ // prototype before every test. The real implementation behaves no
41
+ // differently for the assertions we make here.
42
+ beforeEach(() => {
43
+ if (!Element.prototype.scrollIntoView) {
44
+ Element.prototype.scrollIntoView = vi.fn();
45
+ }
46
+ });
47
+
48
+ describe('AppCommandPalette', () => {
49
+ it('renders the three scope headings when open', () => {
50
+ const onNavigate = vi.fn();
51
+ render(
52
+ <PaletteHarness
53
+ open
54
+ onOpenChange={() => undefined}
55
+ onNavigate={onNavigate}
56
+ />,
57
+ );
58
+ // Scope to the dialog portal — the sidebar also renders
59
+ // "Navigation" as a section heading outside the palette.
60
+ const dialog = screen.getByRole('dialog');
61
+ expect(dialog).toBeInTheDocument();
62
+ const headings = Array.from(dialog.querySelectorAll('[cmdk-group-heading]')).map(
63
+ (node) => node.textContent,
64
+ );
65
+ expect(headings).toEqual(['Navigation', 'Actions', 'Agents', 'Tasks', 'Settings']);
66
+ });
67
+
68
+ it('typing Tasks narrows to the Tasks nav item and Enter calls onNavigate("tasks")', async () => {
69
+ const onNavigate = vi.fn();
70
+ const onOpenChange = vi.fn();
71
+ const user = userEvent.setup();
72
+ render(
73
+ <PaletteHarness
74
+ open
75
+ onOpenChange={onOpenChange}
76
+ onNavigate={onNavigate}
77
+ />,
78
+ );
79
+ await user.type(screen.getByPlaceholderText(/Type a command/i), 'Tasks');
80
+ await user.keyboard('{Enter}');
81
+ expect(onNavigate).toHaveBeenCalledWith('tasks');
82
+ expect(onOpenChange).toHaveBeenCalledWith(false);
83
+ });
84
+
85
+ it('Toggle theme calls onNavigate("__theme")', async () => {
86
+ const onNavigate = vi.fn();
87
+ const user = userEvent.setup();
88
+ render(
89
+ <PaletteHarness
90
+ open
91
+ onOpenChange={() => undefined}
92
+ onNavigate={onNavigate}
93
+ />,
94
+ );
95
+ await user.type(screen.getByPlaceholderText(/Type a command/i), 'Toggle theme');
96
+ await user.keyboard('{Enter}');
97
+ expect(onNavigate).toHaveBeenCalledWith('__theme');
98
+ });
99
+
100
+ it('Selecting a Settings item routes to settings + scrolls to section', async () => {
101
+ const onNavigate = vi.fn();
102
+ const onOpenChange = vi.fn();
103
+ const scrollSpy = vi.fn();
104
+ const user = userEvent.setup();
105
+ // Stub scrollIntoView on the prototype so the rAF callback finds it.
106
+ Element.prototype.scrollIntoView = scrollSpy;
107
+ // Provide a section element for the palette to find after mount.
108
+ const section = document.createElement('section');
109
+ section.id = 'density';
110
+ document.body.appendChild(section);
111
+
112
+ render(
113
+ <PaletteHarness
114
+ open
115
+ onOpenChange={onOpenChange}
116
+ onNavigate={onNavigate}
117
+ />,
118
+ );
119
+ await user.type(screen.getByPlaceholderText(/Type a command/i), 'Settings · Density');
120
+ await user.keyboard('{Enter}');
121
+ // Setting navigation triggers onNavigate('settings') and closes palette.
122
+ expect(onNavigate).toHaveBeenCalledWith('settings');
123
+ expect(onOpenChange).toHaveBeenCalledWith(false);
124
+
125
+ // Flush the rAF scheduled by handleSelect.
126
+ await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
127
+ expect(scrollSpy).toHaveBeenCalled();
128
+
129
+ document.body.removeChild(section);
130
+ });
131
+
132
+ it('renders the ⌘, shortcut hint on the Settings nav item', () => {
133
+ render(
134
+ <PaletteHarness
135
+ open
136
+ onOpenChange={() => undefined}
137
+ onNavigate={() => undefined}
138
+ />,
139
+ );
140
+ expect(screen.getByText('⌘,')).toBeInTheDocument();
141
+ });
142
+ });
@@ -0,0 +1,247 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { Dialog, DialogContent } from '../../ui/feedback/Dialog.js';
3
+ import {
4
+ CommandPalette,
5
+ CommandPaletteGroup,
6
+ CommandPaletteItem,
7
+ } from '../../ui/navigation/CommandPalette.js';
8
+ import { Kbd } from '../../ui/data/Kbd.js';
9
+ import { fetchJson } from '../../data/fetcher.js';
10
+ import type { BizarAgent } from '../../data/types.js';
11
+
12
+ /**
13
+ * AppCommandPalette — Sprint S10/S13. ⌘K palette wired with the v8
14
+ * navigation map plus the control plane.
15
+ *
16
+ * Scopes per DESIGN.md §9.4 + S13:
17
+ * - Navigation — top-level views
18
+ * - Actions — quick toggles (theme, density)
19
+ * - Settings — drill into a Settings section
20
+ * - Agents — spawn common agent types (calls POST /api/agents)
21
+ * - Tasks — dispatch a new task (calls POST /api/tasks/submit)
22
+ * - Projects — switch active project (calls POST /api/projects/active)
23
+ * - System — reuse theme/density/settings shortcuts
24
+ */
25
+
26
+ export interface AppCommandPaletteProps {
27
+ open: boolean;
28
+ onOpenChange: (open: boolean) => void;
29
+ onNavigate: (id: string) => void;
30
+ onToast?: (msg: { kind: 'success' | 'error'; text: string }) => void;
31
+ }
32
+
33
+ interface NavItem {
34
+ id: string;
35
+ label: string;
36
+ shortcut?: string;
37
+ }
38
+
39
+ const NAV: NavItem[] = [
40
+ { id: 'overview', label: 'Go to Overview' },
41
+ { id: 'tasks', label: 'Go to Tasks' },
42
+ { id: 'goals', label: 'Go to Goals' },
43
+ { id: 'agents', label: 'Go to Agents' },
44
+ { id: 'activity', label: 'Go to Activity' },
45
+ { id: 'memory', label: 'Go to Memory' },
46
+ { id: 'skills', label: 'Go to Skills' },
47
+ { id: 'mcps', label: 'Go to MCPs' },
48
+ { id: 'hooks', label: 'Go to Hooks' },
49
+ { id: 'settings', label: 'Go to Settings', shortcut: '⌘,' },
50
+ ];
51
+
52
+ const ACTIONS: NavItem[] = [
53
+ { id: '__theme', label: 'Toggle theme' },
54
+ { id: '__density', label: 'Toggle density' },
55
+ ];
56
+
57
+ const SETTINGS: NavItem[] = [
58
+ { id: 'section:general', label: 'Settings · General' },
59
+ { id: 'section:theme', label: 'Settings · Theme' },
60
+ { id: 'section:density', label: 'Settings · Density' },
61
+ { id: 'section:density-rules', label: 'Settings · Density rules' },
62
+ { id: 'section:palette', label: 'Settings · Command palette' },
63
+ { id: 'section:keyboard', label: 'Settings · Keyboard' },
64
+ { id: 'section:notifications', label: 'Settings · Notifications' },
65
+ { id: 'section:storage', label: 'Settings · Storage' },
66
+ { id: 'section:plugins', label: 'Settings · Plugins' },
67
+ { id: 'section:mcps', label: 'Settings · MCP servers' },
68
+ { id: 'section:skills', label: 'Settings · Skills' },
69
+ { id: 'section:hooks', label: 'Settings · Hooks' },
70
+ { id: 'section:activity', label: 'Settings · Activity' },
71
+ { id: 'section:memory', label: 'Settings · Memory' },
72
+ { id: 'section:privacy', label: 'Settings · Privacy' },
73
+ { id: 'section:advanced', label: 'Settings · Advanced' },
74
+ ];
75
+
76
+ const SPAWN: NavItem[] = [
77
+ { id: 'spawn:coder', label: 'Spawn · Coder agent' },
78
+ { id: 'spawn:researcher', label: 'Spawn · Researcher agent' },
79
+ { id: 'spawn:planner', label: 'Spawn · Planner agent' },
80
+ { id: 'spawn:reviewer', label: 'Spawn · Reviewer agent' },
81
+ ];
82
+
83
+ const TASK_OPS: NavItem[] = [
84
+ { id: 'task:new', label: 'New task…' },
85
+ { id: 'tasks:open', label: 'Go to tasks board' },
86
+ ];
87
+
88
+ function useSettingsNavigation(
89
+ onNavigate: (id: string) => void,
90
+ onOpenChange: (open: boolean) => void,
91
+ ): (id: string) => void {
92
+ return (id: string): void => {
93
+ if (id.startsWith('section:')) {
94
+ const sectionId = id.slice('section:'.length);
95
+ onNavigate('settings');
96
+ requestAnimationFrame(() => {
97
+ document.getElementById(sectionId)?.scrollIntoView({ behavior: 'smooth', block: 'start' });
98
+ });
99
+ onOpenChange(false);
100
+ return;
101
+ }
102
+ onNavigate(id);
103
+ onOpenChange(false);
104
+ };
105
+ }
106
+
107
+ interface Project {
108
+ id: string;
109
+ name?: string;
110
+ cwd?: string;
111
+ }
112
+
113
+ async function spawnAgent(kind: string, onToast?: AppCommandPaletteProps['onToast']): Promise<void> {
114
+ try {
115
+ const res = await fetchJson<{ agent?: BizarAgent; ok?: boolean; error?: string }>(`/api/agents`, {
116
+ method: 'POST',
117
+ body: { kind, prompt: 'Spawned via command palette' },
118
+ });
119
+ if (res.error) onToast?.({ kind: 'error', text: res.error });
120
+ else onToast?.({ kind: 'success', text: `Spawned ${kind} agent` });
121
+ } catch (err) {
122
+ onToast?.({ kind: 'error', text: err instanceof Error ? err.message : String(err) });
123
+ }
124
+ }
125
+
126
+ async function switchProject(id: string, onToast?: AppCommandPaletteProps['onToast']): Promise<void> {
127
+ try {
128
+ await fetchJson<{ ok?: boolean }>(`/api/projects/${encodeURIComponent(id)}/activate`, { method: 'POST' });
129
+ onToast?.({ kind: 'success', text: `Switched to ${id}` });
130
+ } catch (err) {
131
+ onToast?.({ kind: 'error', text: err instanceof Error ? err.message : String(err) });
132
+ }
133
+ }
134
+
135
+ async function newTask(title: string, onToast?: AppCommandPaletteProps['onToast']): Promise<void> {
136
+ try {
137
+ await fetchJson<{ ok?: boolean; task?: { id: string }; error?: string }>(`/api/tasks/submit`, {
138
+ method: 'POST',
139
+ body: { title, priority: 'medium' },
140
+ });
141
+ onToast?.({ kind: 'success', text: `Dispatched task "${title.slice(0, 30)}"` });
142
+ } catch (err) {
143
+ onToast?.({ kind: 'error', text: err instanceof Error ? err.message : String(err) });
144
+ }
145
+ }
146
+
147
+ export function AppCommandPalette(props: AppCommandPaletteProps): JSX.Element {
148
+ const { open, onOpenChange, onNavigate, onToast } = props;
149
+ const handleSelect = useSettingsNavigation(onNavigate, onOpenChange);
150
+ const [projects, setProjects] = useState<Project[]>([]);
151
+
152
+ useEffect(() => {
153
+ if (!open) return;
154
+ let cancel = false;
155
+ (async () => {
156
+ try {
157
+ const res = await fetchJson<{ projects?: Project[] }>(`/api/projects`);
158
+ if (!cancel && res.projects) setProjects(res.projects);
159
+ } catch {
160
+ // ignore — group just won't appear.
161
+ }
162
+ })();
163
+ return () => { cancel = true; };
164
+ }, [open]);
165
+
166
+ const onSpawn = (id: string): void => {
167
+ const kind = id.slice('spawn:'.length);
168
+ onOpenChange(false);
169
+ void spawnAgent(kind, onToast);
170
+ };
171
+
172
+ const onSwitchProject = (id: string): void => {
173
+ const pid = id.slice('project:'.length);
174
+ onOpenChange(false);
175
+ void switchProject(pid, onToast);
176
+ };
177
+
178
+ const onTaskNew = (): void => {
179
+ const title = window.prompt('New task title') || '';
180
+ if (!title.trim()) return;
181
+ onOpenChange(false);
182
+ void newTask(title, onToast);
183
+ };
184
+
185
+ const projectItems: NavItem[] = projects.map((p) => ({
186
+ id: `project:${p.id}`,
187
+ label: `Switch to ${p.name || p.id}`,
188
+ }));
189
+
190
+ return (
191
+ <Dialog open={open} onOpenChange={onOpenChange}>
192
+ <DialogContent title="Command palette" size="md">
193
+ <CommandPalette placeholder="Type a command, page, or setting…">
194
+ <CommandPaletteGroup heading="Navigation">
195
+ {NAV.map((item) => (
196
+ <CommandPaletteItem key={item.id} value={item.label} onSelect={() => handleSelect(item.id)}>
197
+ <span>{item.label}</span>
198
+ {item.shortcut !== undefined && <Kbd>{item.shortcut}</Kbd>}
199
+ </CommandPaletteItem>
200
+ ))}
201
+ </CommandPaletteGroup>
202
+ <CommandPaletteGroup heading="Actions">
203
+ {ACTIONS.map((item) => (
204
+ <CommandPaletteItem key={item.id} value={item.label} onSelect={() => handleSelect(item.id)}>
205
+ <span>{item.label}</span>
206
+ </CommandPaletteItem>
207
+ ))}
208
+ </CommandPaletteGroup>
209
+ <CommandPaletteGroup heading="Agents">
210
+ {SPAWN.map((item) => (
211
+ <CommandPaletteItem key={item.id} value={item.label} onSelect={() => onSpawn(item.id)}>
212
+ <span>{item.label}</span>
213
+ </CommandPaletteItem>
214
+ ))}
215
+ </CommandPaletteGroup>
216
+ <CommandPaletteGroup heading="Tasks">
217
+ {TASK_OPS.map((item) => (
218
+ <CommandPaletteItem
219
+ key={item.id}
220
+ value={item.label}
221
+ onSelect={() => (item.id === 'task:new' ? onTaskNew() : handleSelect('tasks'))}
222
+ >
223
+ <span>{item.label}</span>
224
+ </CommandPaletteItem>
225
+ ))}
226
+ </CommandPaletteGroup>
227
+ {projectItems.length > 0 && (
228
+ <CommandPaletteGroup heading="Projects">
229
+ {projectItems.map((item) => (
230
+ <CommandPaletteItem key={item.id} value={item.label} onSelect={() => onSwitchProject(item.id)}>
231
+ <span>{item.label}</span>
232
+ </CommandPaletteItem>
233
+ ))}
234
+ </CommandPaletteGroup>
235
+ )}
236
+ <CommandPaletteGroup heading="Settings">
237
+ {SETTINGS.map((item) => (
238
+ <CommandPaletteItem key={item.id} value={item.label} onSelect={() => handleSelect(item.id)}>
239
+ <span>{item.label}</span>
240
+ </CommandPaletteItem>
241
+ ))}
242
+ </CommandPaletteGroup>
243
+ </CommandPalette>
244
+ </DialogContent>
245
+ </Dialog>
246
+ );
247
+ }
@@ -0,0 +1,193 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { Plus } from 'lucide-react';
3
+ import { Stack } from '../../ui/primitives/Stack.js';
4
+ import { Grid } from '../../ui/primitives/Grid.js';
5
+ import { Inline } from '../../ui/primitives/Inline.js';
6
+ import { ViewHeader } from '../../ui/data/ViewHeader.js';
7
+ import { GoalCard, type GoalCardProps, type GoalStatus } from '../../ui/goals/GoalCard.js';
8
+ import { GoalDetail } from '../../ui/goals/GoalDetail.js';
9
+ import { Card, CardBody } from '../../ui/data/Card.js';
10
+ import { Skeleton } from '../../ui/feedback/Skeleton.js';
11
+ import { Button } from '../../ui/controls/Button.js';
12
+ import { useFetch } from '../../data/useFetch.js';
13
+ import { useWsMessage } from '../../data/useWebSocket.js';
14
+ import { fetchJson } from '../../data/fetcher.js';
15
+ import type { Goal, WsMessage } from '../../data/types.js';
16
+
17
+ /**
18
+ * GoalsView — Sprint S10/S12. Pulls `/api/goals` (parsed PROGRESS.md).
19
+ * Card click → `GoalDetail` Drawer (editable title / status / due /
20
+ * owner / KR add/toggle/remove). "+ New goal" button creates a fresh
21
+ * goal via `POST /api/goals`. Live updates via `goals:change`.
22
+ */
23
+
24
+ function goalToCard(g: Goal): GoalCardProps {
25
+ return {
26
+ id: g.id,
27
+ title: g.title,
28
+ description: g.description || '',
29
+ status: g.status as GoalStatus,
30
+ progress: g.progress,
31
+ due: g.due,
32
+ ownerName: g.owner,
33
+ keyResultsDone: g.keyResults.filter((k) => k.done).length,
34
+ keyResultsTotal: g.keyResults.length,
35
+ };
36
+ }
37
+
38
+ export function GoalsView(): JSX.Element {
39
+ const goals = useFetch<{ goals?: Goal[]; count?: number }>('/api/goals');
40
+ const [local, setLocal] = useState<Goal[]>([]);
41
+ const [initialized, setInitialized] = useState(false);
42
+ const [openGoalId, setOpenGoalId] = useState<string | null>(null);
43
+ const [creating, setCreating] = useState<boolean>(false);
44
+ const [decomposing, setDecomposing] = useState<string | null>(null);
45
+ const [decomposeError, setDecomposeError] = useState<string | null>(null);
46
+
47
+ useEffect(() => {
48
+ if (goals.data?.goals && !initialized) {
49
+ setInitialized(true);
50
+ setLocal(goals.data.goals);
51
+ }
52
+ }, [goals.data, initialized]);
53
+
54
+ const onChange = useCallback((msg: WsMessage) => {
55
+ if (msg.type !== 'goals:change') return;
56
+ const g = (msg as Extract<WsMessage, { type: 'goals:change' }>).goal;
57
+ if (!g) return;
58
+ setLocal((prev) => {
59
+ const idx = prev.findIndex((x) => x.id === g.id);
60
+ if (idx === -1) return [...prev, g];
61
+ const copy = prev.slice();
62
+ copy[idx] = g;
63
+ return copy;
64
+ });
65
+ }, []);
66
+ useWsMessage('goals:change', onChange);
67
+
68
+ const createGoal = useCallback(async () => {
69
+ setCreating(true);
70
+ try {
71
+ const res = await fetchJson<{ goal?: Goal; id?: string }>('/api/goals', {
72
+ method: 'POST',
73
+ body: { title: 'New goal' },
74
+ });
75
+ if (res.goal) setLocal((prev) => [...prev, res.goal as Goal]);
76
+ if (res.id) setOpenGoalId(res.id);
77
+ } catch {
78
+ // server will broadcast the canonical state via WS on the next reload
79
+ } finally {
80
+ setCreating(false);
81
+ }
82
+ }, []);
83
+
84
+ const openGoal = openGoalId ? local.find((g) => g.id === openGoalId) ?? null : null;
85
+
86
+ const decompose = useCallback(async (goalId: string) => {
87
+ setDecomposing(goalId);
88
+ setDecomposeError(null);
89
+ try {
90
+ const res = await fetchJson<{ goalId: string; created: { kr: string; task: string }[] }>(
91
+ `/api/goals/${encodeURIComponent(goalId)}/decompose`,
92
+ { method: 'POST' },
93
+ );
94
+ // Patch local state with the new taskIds so the button reflects
95
+ // "Decomposed" without waiting for the WS roundtrip.
96
+ if (Array.isArray(res.created) && res.created.length > 0) {
97
+ setLocal((prev) => prev.map((g) => {
98
+ if (g.id !== goalId) return g;
99
+ const krs = (g.keyResults ?? []).map((kr) => {
100
+ const link = res.created.find((c) => c.kr === kr.id);
101
+ return link ? { ...kr, taskId: link.task } : kr;
102
+ });
103
+ return { ...g, keyResults: krs };
104
+ }));
105
+ }
106
+ } catch (err) {
107
+ setDecomposeError(err instanceof Error ? err.message : String(err));
108
+ } finally {
109
+ setDecomposing(null);
110
+ }
111
+ }, []);
112
+
113
+ return (
114
+ <Stack gap={5}>
115
+ <ViewHeader
116
+ title="Goals"
117
+ description="Long-horizon commitments parsed from .bizar/PROGRESS.md."
118
+ actions={
119
+ <Button variant="primary" onClick={() => { void createGoal(); }} disabled={creating}>
120
+ <Plus size={14} aria-hidden /> New goal
121
+ </Button>
122
+ }
123
+ />
124
+ {decomposeError !== null && (
125
+ <div role="alert" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>
126
+ Decompose failed: {decomposeError}
127
+ </div>
128
+ )}
129
+ {goals.loading && local.length === 0 ? (
130
+ <Stack gap={3}>
131
+ <Skeleton style={{ height: 160 }} />
132
+ <Skeleton style={{ height: 160 }} />
133
+ </Stack>
134
+ ) : local.length === 0 ? (
135
+ <Card>
136
+ <CardBody>
137
+ <Stack gap={2}>
138
+ <strong>No goals yet.</strong>
139
+ <span style={{ color: 'var(--fg-muted)' }}>
140
+ Create one with the dashboard or via CC's <code>/goal &lt;text&gt;</code>.
141
+ </span>
142
+ </Stack>
143
+ </CardBody>
144
+ </Card>
145
+ ) : (
146
+ <Grid cols={2}>
147
+ {local.map((g) => {
148
+ const krCount = g.keyResults?.length ?? 0;
149
+ const decomposed = (g.keyResults ?? []).every((kr) => Boolean(kr.taskId));
150
+ return (
151
+ <div
152
+ key={g.id}
153
+ role="button"
154
+ tabIndex={0}
155
+ onClick={() => setOpenGoalId(g.id)}
156
+ onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenGoalId(g.id); } }}
157
+ style={{ cursor: 'pointer', outline: 'none' }}
158
+ data-testid={`goal-card-${g.id}`}
159
+ >
160
+ <Stack gap={2}>
161
+ <GoalCard {...goalToCard(g)} />
162
+ {krCount > 0 && (
163
+ <Inline align="center" justify="flex-end" gap={2}>
164
+ <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>
165
+ {decomposed ? 'Decomposed' : `${krCount} key result${krCount === 1 ? '' : 's'} · not yet linked`}
166
+ </span>
167
+ <Button
168
+ variant="secondary"
169
+ onClick={(e) => { e.stopPropagation(); void decompose(g.id); }}
170
+ disabled={decomposing === g.id}
171
+ title={decomposed ? 'Re-create missing task links' : 'Create one task per key result'}
172
+ >
173
+ <Plus size={12} aria-hidden /> {decomposed ? 'Re-link tasks' : 'Decompose → Tasks'}
174
+ </Button>
175
+ </Inline>
176
+ )}
177
+ </Stack>
178
+ </div>
179
+ );
180
+ })}
181
+ </Grid>
182
+ )}
183
+
184
+ {openGoal && (
185
+ <GoalDetail
186
+ goal={openGoal}
187
+ open={openGoalId !== null}
188
+ onOpenChange={(o) => { if (!o) setOpenGoalId(null); }}
189
+ />
190
+ )}
191
+ </Stack>
192
+ );
193
+ }
@@ -0,0 +1,108 @@
1
+ import { useEffect, useState, useCallback } from 'react';
2
+ import { Stack } from '../../ui/primitives/Stack.js';
3
+ import { ViewHeader } from '../../ui/data/ViewHeader.js';
4
+ import { LibraryGrid, LibraryItem, type LibraryItemProps, type LibraryStatus } from '../../ui/index.js';
5
+ import { Skeleton } from '../../ui/feedback/Skeleton.js';
6
+ import { EmptyState } from '../../ui/feedback/EmptyState.js';
7
+ import { useFetch } from '../../data/useFetch.js';
8
+ import { useWsMessage } from '../../data/useWebSocket.js';
9
+ import type { LibraryItem as LibItem } from '../../data/types.js';
10
+
11
+ /**
12
+ * LibrariesView — Sprint S10. Generic Skills / MCPs / Hooks surface.
13
+ *
14
+ * The parent (`Router.tsx`) picks the data source per kind. This
15
+ * view pulls live data from `/api/skills`, `/api/mcps`,
16
+ * `/api/hooks` instead of seeded arrays.
17
+ */
18
+
19
+ export type LibraryKind = 'skills' | 'mcps' | 'hooks';
20
+
21
+ const KIND_LABEL: Record<LibraryKind, string> = {
22
+ skills: 'Skills',
23
+ mcps: 'MCPs',
24
+ hooks: 'Hooks',
25
+ };
26
+
27
+ const KIND_DESCRIPTION: Record<LibraryKind, string> = {
28
+ skills: 'Bizar skill packs. Auto-loaded by name or dispatched via the Skill tool.',
29
+ mcps: 'MCP server registrations under `.claude/settings.json` → `mcpServers`.',
30
+ hooks: 'Executable hook scripts (PreToolUse / PostToolUse / SessionStart / SessionEnd).',
31
+ };
32
+
33
+ const ENDPOINT: Record<LibraryKind, string> = {
34
+ skills: '/api/skills',
35
+ mcps: '/api/skills?kind=mcps',
36
+ hooks: '/api/skills?kind=hooks',
37
+ };
38
+
39
+ const CHANGE_EVENTS: Record<LibraryKind, readonly string[]> = {
40
+ skills: ['skills:change', 'agents:change'] as const,
41
+ mcps: ['mcps:change', 'agents:change'] as const,
42
+ hooks: ['agents:change', 'agents:change'] as const,
43
+ };
44
+ // Stable hook count: always register listeners for all possible events,
45
+ // filter inside the handler so kind navigation never changes hook order.
46
+ const ALL_EVENTS = ['skills:change', 'mcps:change', 'agents:change'] as const;
47
+
48
+ function mapItem(it: LibItem): LibraryItemProps {
49
+ const status: LibraryStatus =
50
+ it.status === 'enabled' || it.status === 'disabled' || it.status === 'error'
51
+ ? it.status
52
+ : 'disabled';
53
+ return {
54
+ id: it.id,
55
+ name: it.name,
56
+ slug: it.slug ?? it.id,
57
+ status,
58
+ description: it.description,
59
+ meta: it.meta,
60
+ };
61
+ }
62
+
63
+ export interface LibrariesViewProps {
64
+ kind: LibraryKind;
65
+ }
66
+
67
+ export function LibrariesView(props: LibrariesViewProps): JSX.Element {
68
+ const { kind } = props;
69
+ const url = ENDPOINT[kind];
70
+ const res = useFetch<{ skills?: LibItem[]; items?: LibItem[]; count?: number }>(url);
71
+ const [bust, setBust] = useState(0);
72
+
73
+ // Force a re-fetch when the matching change event fires. Hook count
74
+ // is fixed (ALL_EVENTS.length) so navigating between kinds can't trip
75
+ // React's "Rendered fewer hooks than expected" runtime guard.
76
+ const events = CHANGE_EVENTS[kind];
77
+ const handler = useCallback((): void => setBust((n) => n + 1), []);
78
+ for (const evt of ALL_EVENTS) {
79
+ useWsMessage(evt, events.includes(evt) ? handler : () => {});
80
+ }
81
+
82
+ useEffect(() => {
83
+ if (bust > 0) res.refetch();
84
+ }, [bust, res]);
85
+
86
+ const items: LibraryItemProps[] = (res.data?.skills || res.data?.items || []).map(mapItem);
87
+
88
+ return (
89
+ <Stack gap={5}>
90
+ <ViewHeader title={KIND_LABEL[kind]} description={KIND_DESCRIPTION[kind]} />
91
+ {res.loading ? (
92
+ <Skeleton style={{ height: 240 }} />
93
+ ) : items.length === 0 ? (
94
+ <EmptyState
95
+ icon={<span>📚</span>}
96
+ title={`No ${KIND_LABEL[kind].toLowerCase()} installed`}
97
+ description={`${KIND_LABEL[kind]} appear here as soon as they are registered.`}
98
+ />
99
+ ) : (
100
+ <LibraryGrid>
101
+ {items.map((item) => (
102
+ <LibraryItem key={item.id} {...item} />
103
+ ))}
104
+ </LibraryGrid>
105
+ )}
106
+ </Stack>
107
+ );
108
+ }