@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,105 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { GoalCard } from '../ui/goals/GoalCard';
5
+ import { KeyResult } from '../ui/goals/KeyResult';
6
+
7
+ describe('GoalCard', () => {
8
+ it('renders title, description, status, and progress', () => {
9
+ render(
10
+ <GoalCard
11
+ id="g1"
12
+ title="Ship v8 dashboard"
13
+ description="Rewrite the dashboard from scratch with a real component library."
14
+ status="on-track"
15
+ progress={0.42}
16
+ />,
17
+ );
18
+ expect(screen.getByText(/Ship v8 dashboard/i)).toBeInTheDocument();
19
+ expect(
20
+ screen.getByText(/Rewrite the dashboard from scratch with a real component library\./i),
21
+ ).toBeInTheDocument();
22
+ expect(screen.getByText(/on track/i)).toBeInTheDocument();
23
+ expect(screen.getByText(/42% complete/i)).toBeInTheDocument();
24
+ });
25
+
26
+ it('shows key results counter when provided', () => {
27
+ render(
28
+ <GoalCard
29
+ id="g1"
30
+ title="g"
31
+ status="at-risk"
32
+ progress={0.2}
33
+ keyResultsDone={2}
34
+ keyResultsTotal={5}
35
+ />,
36
+ );
37
+ expect(screen.getByText(/2 \/ 5 key results/i)).toBeInTheDocument();
38
+ });
39
+
40
+ it('shows due + owner labels', () => {
41
+ render(
42
+ <GoalCard
43
+ id="g1"
44
+ title="g"
45
+ status="on-track"
46
+ progress={0.1}
47
+ due="Q3 2026"
48
+ ownerName="alex"
49
+ />,
50
+ );
51
+ expect(screen.getByText(/Q3 2026/i)).toBeInTheDocument();
52
+ expect(screen.getByText(/alex/i)).toBeInTheDocument();
53
+ });
54
+
55
+ it('invokes onOpen when clicked', async () => {
56
+ const onOpen = vi.fn();
57
+ render(<GoalCard id="g1" title="g" status="on-track" progress={0} onOpen={onOpen} />);
58
+ await userEvent.click(screen.getByRole('button', { name: /g/i }));
59
+ expect(onOpen).toHaveBeenCalledTimes(1);
60
+ });
61
+
62
+ it('renders done status without progress display errors', () => {
63
+ render(<GoalCard id="g1" title="Shipped" status="done" progress={1} />);
64
+ expect(screen.getByText(/100% complete/i)).toBeInTheDocument();
65
+ });
66
+ });
67
+
68
+ describe('KeyResult', () => {
69
+ it('renders title with status icon and toggles on click', async () => {
70
+ const onToggle = vi.fn();
71
+ render(
72
+ <KeyResult id="kr1" title="Publish RFC" status="in-progress" progress={0.5} onToggle={onToggle} />,
73
+ );
74
+ expect(screen.getByText(/publish rfc/i)).toBeInTheDocument();
75
+ await userEvent.click(screen.getByRole('button', { name: /mark as done/i }));
76
+ expect(onToggle).toHaveBeenCalledTimes(1);
77
+ });
78
+
79
+ it('renders the "mark as not done" label when status is done', () => {
80
+ render(<KeyResult id="kr1" title="Done thing" status="done" progress={1} onToggle={() => {}} />);
81
+ expect(screen.getByRole('button', { name: /mark as not done/i })).toBeInTheDocument();
82
+ });
83
+
84
+ it('hides the progress bar when not-started', () => {
85
+ const { container } = render(
86
+ <KeyResult id="kr1" title="Plan ahead" status="not-started" progress={0} />,
87
+ );
88
+ expect(container.querySelector('.v8-progress')).toBeNull();
89
+ });
90
+
91
+ it('shows metric and assignee captions', () => {
92
+ render(
93
+ <KeyResult
94
+ id="kr1"
95
+ title="metric kr"
96
+ status="in-progress"
97
+ progress={0.47}
98
+ metric="47 / 100"
99
+ assignee="sam"
100
+ />,
101
+ );
102
+ expect(screen.getByText(/47 \/ 100/i)).toBeInTheDocument();
103
+ expect(screen.getByText(/@sam/i)).toBeInTheDocument();
104
+ });
105
+ });
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Kanban layer tests — KanbanCard, KanbanColumn, KanbanBoard, KanbanQuickAdd,
3
+ * KanbanContextMenu. Covers rendering, priority/compact variants, quick-add
4
+ * keyboard behavior, and the right-click menu.
5
+ */
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { render, screen, fireEvent } from '@testing-library/react';
8
+ import userEvent from '@testing-library/user-event';
9
+ import {
10
+ KanbanCard,
11
+ KanbanColumn,
12
+ KanbanBoard,
13
+ KanbanQuickAdd,
14
+ KanbanContextMenu,
15
+ } from '../ui/index.js';
16
+
17
+ describe('KanbanCard', () => {
18
+ it('renders title and optional metadata', () => {
19
+ render(<KanbanCard card={{ id: 'a', title: 'Ship S5', priority: 'high', comments: 3, due: 'Mon' }} />);
20
+ expect(screen.getByText('Ship S5')).toBeInTheDocument();
21
+ expect(screen.getByText('3')).toBeInTheDocument();
22
+ expect(screen.getByText('Mon')).toBeInTheDocument();
23
+ });
24
+
25
+ it('hides metadata row in compact variant', () => {
26
+ render(
27
+ <KanbanCard
28
+ variant="compact"
29
+ card={{ id: 'a', title: 'Compact card', comments: 5 }}
30
+ />,
31
+ );
32
+ expect(screen.getByText('Compact card')).toBeInTheDocument();
33
+ expect(screen.queryByText('5')).not.toBeInTheDocument();
34
+ });
35
+
36
+ it('renders priority dot with aria-label', () => {
37
+ render(<KanbanCard card={{ id: 'a', title: 'Urgent!', priority: 'urgent' }} />);
38
+ expect(screen.getByLabelText(/priority: urgent/i)).toBeInTheDocument();
39
+ });
40
+
41
+ it('applies data-kanban-card-id for keyboard nav', () => {
42
+ const { container } = render(<KanbanCard card={{ id: 'k-42', title: 'Task' }} />);
43
+ expect(container.querySelector('[data-kanban-card-id="k-42"]')).toBeInTheDocument();
44
+ });
45
+ });
46
+
47
+ describe('KanbanColumn', () => {
48
+ it('renders title and count', () => {
49
+ render(
50
+ <KanbanColumn column={{ id: 'todo', title: 'To Do', count: 5 }}>
51
+ <span>card</span>
52
+ </KanbanColumn>,
53
+ );
54
+ expect(screen.getByText('To Do')).toBeInTheDocument();
55
+ expect(screen.getByText('5')).toBeInTheDocument();
56
+ });
57
+
58
+ it('shows wip limit', () => {
59
+ render(
60
+ <KanbanColumn column={{ id: 'in-progress', title: 'In Progress', count: 7, wipLimit: 5 }} />,
61
+ );
62
+ expect(screen.getByText('7 / 5')).toBeInTheDocument();
63
+ });
64
+
65
+ it('renders overflow and add buttons when handlers provided', () => {
66
+ render(
67
+ <KanbanColumn
68
+ column={{ id: 'x', title: 'X' }}
69
+ onAdd={() => {}}
70
+ onOverflow={() => {}}
71
+ />,
72
+ );
73
+ expect(screen.getByRole('button', { name: /add card/i })).toBeInTheDocument();
74
+ expect(screen.getByRole('button', { name: /column options/i })).toBeInTheDocument();
75
+ });
76
+ });
77
+
78
+ describe('KanbanBoard', () => {
79
+ it('renders region landmark with accessible label', () => {
80
+ render(
81
+ <KanbanBoard columns={[{ id: 'todo' }, { id: 'done' }]}>
82
+ <KanbanColumn column={{ id: 'todo', title: 'To Do' }} />
83
+ <KanbanColumn column={{ id: 'done', title: 'Done' }} />
84
+ </KanbanBoard>,
85
+ );
86
+ expect(screen.getByRole('region', { name: /kanban board/i })).toBeInTheDocument();
87
+ });
88
+ });
89
+
90
+ describe('KanbanQuickAdd', () => {
91
+ it('starts idle and reveals editor on click', async () => {
92
+ render(<KanbanQuickAdd onAdd={() => {}} />);
93
+ await userEvent.click(screen.getByRole('button', { name: /add task/i }));
94
+ expect(screen.getByPlaceholderText(/task title/i)).toBeInTheDocument();
95
+ });
96
+
97
+ it('submits via Enter and clears value', async () => {
98
+ const onAdd = vi.fn();
99
+ render(<KanbanQuickAdd onAdd={onAdd} />);
100
+ await userEvent.click(screen.getByRole('button', { name: /add task/i }));
101
+ const ta = screen.getByPlaceholderText(/task title/i);
102
+ await userEvent.type(ta, 'New card title{Enter}');
103
+ expect(onAdd).toHaveBeenCalledWith('New card title');
104
+ });
105
+
106
+ it('does not submit empty titles', async () => {
107
+ const onAdd = vi.fn();
108
+ render(<KanbanQuickAdd onAdd={onAdd} />);
109
+ await userEvent.click(screen.getByRole('button', { name: /add task/i }));
110
+ const ta = screen.getByPlaceholderText(/task title/i);
111
+ await userEvent.type(ta, ' {Enter}');
112
+ expect(onAdd).not.toHaveBeenCalled();
113
+ });
114
+
115
+ it('cancels on Escape', async () => {
116
+ render(<KanbanQuickAdd onAdd={() => {}} />);
117
+ await userEvent.click(screen.getByRole('button', { name: /add task/i }));
118
+ const ta = screen.getByPlaceholderText(/task title/i);
119
+ await userEvent.type(ta, 'draft');
120
+ fireEvent.keyDown(ta, { key: 'Escape' });
121
+ expect(screen.queryByPlaceholderText(/task title/i)).not.toBeInTheDocument();
122
+ });
123
+ });
124
+
125
+ describe('KanbanContextMenu', () => {
126
+ it('renders card content inside trigger', () => {
127
+ render(
128
+ <KanbanContextMenu>
129
+ <div>Card body</div>
130
+ </KanbanContextMenu>,
131
+ );
132
+ expect(screen.getByText('Card body')).toBeInTheDocument();
133
+ });
134
+
135
+ it('shows menu items on contextmenu event', async () => {
136
+ render(
137
+ <KanbanContextMenu>
138
+ <div>Right-click me</div>
139
+ </KanbanContextMenu>,
140
+ );
141
+ fireEvent.contextMenu(screen.getByText('Right-click me'));
142
+ expect(await screen.findByText('Open detail')).toBeInTheDocument();
143
+ expect(screen.getByText('Rename')).toBeInTheDocument();
144
+ expect(screen.getByText('Duplicate')).toBeInTheDocument();
145
+ expect(screen.getByText('Move to previous column')).toBeInTheDocument();
146
+ expect(screen.getByText('Move to next column')).toBeInTheDocument();
147
+ expect(screen.getByText('Assign…')).toBeInTheDocument();
148
+ expect(screen.getByText('Archive')).toBeInTheDocument();
149
+ expect(screen.getByText('Delete')).toBeInTheDocument();
150
+ });
151
+
152
+ it('disables move arrows based on canMoveLeft/canMoveRight', async () => {
153
+ render(
154
+ <KanbanContextMenu canMoveLeft={false} canMoveRight>
155
+ <div>x</div>
156
+ </KanbanContextMenu>,
157
+ );
158
+ fireEvent.contextMenu(screen.getByText('x'));
159
+ const prevItem = await screen.findByText('Move to previous column');
160
+ expect(prevItem.closest('[data-disabled]')).not.toBeNull();
161
+ const nextItem = screen.getByText('Move to next column');
162
+ expect(nextItem.closest('[data-disabled]')).toBeNull();
163
+ });
164
+
165
+ it('invokes onDelete when Delete is selected', async () => {
166
+ const onDelete = vi.fn();
167
+ render(
168
+ <KanbanContextMenu onDelete={onDelete}>
169
+ <div>x</div>
170
+ </KanbanContextMenu>,
171
+ );
172
+ fireEvent.contextMenu(screen.getByText('x'));
173
+ await userEvent.click(await screen.findByText('Delete'));
174
+ expect(onDelete).toHaveBeenCalled();
175
+ });
176
+ });
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { LibraryItem } from '../ui/libraries/LibraryItem';
5
+ import { LibraryGrid } from '../ui/libraries/LibraryGrid';
6
+
7
+ describe('LibraryItem', () => {
8
+ it('renders name, slug, status, description, meta', () => {
9
+ const { container } = render(
10
+ <LibraryItem
11
+ id="s1"
12
+ name="Frigg"
13
+ slug="frigg"
14
+ status="enabled"
15
+ description="Read-only codebase Q&A."
16
+ meta="v1.2.0 · used 14× today"
17
+ />,
18
+ );
19
+ expect(container.textContent).toContain('Frigg');
20
+ expect(container.textContent).toContain('Read-only codebase Q&A.');
21
+ expect(container.textContent).toContain('v1.2.0 · used 14× today');
22
+ expect(container.querySelector('code')?.textContent).toBe('frigg');
23
+ });
24
+
25
+ it('shows the disabled status badge', () => {
26
+ render(<LibraryItem id="s1" name="x" slug="x" status="disabled" />);
27
+ expect(screen.getByText(/disabled/i)).toBeInTheDocument();
28
+ });
29
+
30
+ it('shows the error status badge', () => {
31
+ render(<LibraryItem id="s1" name="x" slug="x" status="error" />);
32
+ expect(screen.getByText(/error/i)).toBeInTheDocument();
33
+ });
34
+
35
+ it('invokes onOpen when clicked', async () => {
36
+ const onOpen = vi.fn();
37
+ render(<LibraryItem id="s1" name="x" slug="x" status="enabled" onOpen={onOpen} />);
38
+ await userEvent.click(screen.getByRole('button', { name: /x/i }));
39
+ expect(onOpen).toHaveBeenCalledTimes(1);
40
+ });
41
+
42
+ it('renders actions slot', () => {
43
+ const { container } = render(
44
+ <LibraryItem
45
+ id="s1"
46
+ name="Semble"
47
+ slug="semble"
48
+ status="enabled"
49
+ actions={<button type="button">Toggle</button>}
50
+ />,
51
+ );
52
+ expect(container.querySelectorAll('button').length).toBeGreaterThanOrEqual(2);
53
+ expect(container.textContent).toContain('Toggle');
54
+ });
55
+ });
56
+
57
+ describe('LibraryGrid', () => {
58
+ it('renders children inside a grid container', () => {
59
+ const { container } = render(
60
+ <LibraryGrid>
61
+ <div>a</div>
62
+ <div>b</div>
63
+ <div>c</div>
64
+ </LibraryGrid>,
65
+ );
66
+ const grid = container.firstChild as HTMLElement;
67
+ expect(grid.style.display).toBe('grid');
68
+ expect(grid.children).toHaveLength(3);
69
+ });
70
+ });
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { MemoryVault, type MemoryEntry } from '../ui/memory/MemoryVault';
5
+
6
+ const entries: MemoryEntry[] = [
7
+ {
8
+ id: 'm1',
9
+ content: 'The dashboard rewrite runs on the v8 component tree under `bizar-dash/src/web/v8/`.',
10
+ tags: ['dashboard', 'rewrite'],
11
+ scope: 'project',
12
+ updatedAt: 'Just now',
13
+ },
14
+ {
15
+ id: 'm2',
16
+ content: 'User prefers OKLch colors and minimal visual flair. Token-driven styling only.',
17
+ tags: ['preferences'],
18
+ scope: 'global',
19
+ updatedAt: '3 days ago',
20
+ },
21
+ ];
22
+
23
+ describe('MemoryVault', () => {
24
+ it('renders every entry with content and updatedAt', () => {
25
+ render(<MemoryVault entries={entries} />);
26
+ expect(
27
+ screen.getByText(/The dashboard rewrite runs on the v8 component tree/i),
28
+ ).toBeInTheDocument();
29
+ expect(
30
+ screen.getByText(/User prefers OKLch colors and minimal visual flair/i),
31
+ ).toBeInTheDocument();
32
+ expect(screen.getByText(/just now/i)).toBeInTheDocument();
33
+ expect(screen.getByText(/3 days ago/i)).toBeInTheDocument();
34
+ });
35
+
36
+ it('shows scope badges (Project / Global)', () => {
37
+ render(<MemoryVault entries={entries} />);
38
+ expect(screen.getByText(/^Project$/i)).toBeInTheDocument();
39
+ expect(screen.getByText(/^Global$/i)).toBeInTheDocument();
40
+ });
41
+
42
+ it('renders tags when provided', () => {
43
+ render(<MemoryVault entries={entries} />);
44
+ expect(screen.getByText(/^dashboard$/i)).toBeInTheDocument();
45
+ expect(screen.getByText(/^preferences$/i)).toBeInTheDocument();
46
+ });
47
+
48
+ it('invokes onOpen with the clicked entry', async () => {
49
+ const onOpen = vi.fn();
50
+ render(<MemoryVault entries={entries} onOpen={onOpen} />);
51
+ await userEvent.click(screen.getByRole('button', { name: /The dashboard rewrite/i }));
52
+ expect(onOpen).toHaveBeenCalledTimes(1);
53
+ expect(onOpen).toHaveBeenCalledWith(entries[0]);
54
+ });
55
+
56
+ it('renders the empty node when no entries', () => {
57
+ render(<MemoryVault entries={[]} empty={<div>No memos yet.</div>} />);
58
+ expect(screen.getByText(/No memos yet\./i)).toBeInTheDocument();
59
+ });
60
+ });
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Navigation layer tests — Tabs, NavLink, Pagination, CommandPalette.
3
+ */
4
+ import { describe, it, expect, vi, beforeAll } from 'vitest';
5
+ import { render, screen, fireEvent } from '@testing-library/react';
6
+ import userEvent from '@testing-library/user-event';
7
+ import {
8
+ Tabs,
9
+ TabsList,
10
+ TabsTrigger,
11
+ TabsContent,
12
+ NavLink,
13
+ Pagination,
14
+ Dialog,
15
+ DialogContent,
16
+ CommandPalette,
17
+ CommandPaletteGroup,
18
+ CommandPaletteItem,
19
+ } from '../ui/index.js';
20
+
21
+ // cmdk uses scrollIntoView for keyboard navigation; jsdom doesn't implement it.
22
+ beforeAll(() => {
23
+ if (!Element.prototype.scrollIntoView) {
24
+ Element.prototype.scrollIntoView = function () {
25
+ // noop for tests
26
+ };
27
+ }
28
+ });
29
+
30
+ describe('Tabs', () => {
31
+ it('switches content on trigger click', async () => {
32
+ render(
33
+ <Tabs defaultValue="a">
34
+ <TabsList>
35
+ <TabsTrigger value="a">Alpha</TabsTrigger>
36
+ <TabsTrigger value="b">Beta</TabsTrigger>
37
+ </TabsList>
38
+ <TabsContent value="a">Content A</TabsContent>
39
+ <TabsContent value="b">Content B</TabsContent>
40
+ </Tabs>,
41
+ );
42
+ expect(screen.getByText('Content A')).toBeInTheDocument();
43
+ expect(screen.queryByText('Content B')).not.toBeInTheDocument();
44
+ await userEvent.click(screen.getByRole('tab', { name: /beta/i }));
45
+ expect(await screen.findByText('Content B')).toBeInTheDocument();
46
+ });
47
+
48
+ it('marks active trigger with data-state="active"', () => {
49
+ render(
50
+ <Tabs defaultValue="one">
51
+ <TabsList>
52
+ <TabsTrigger value="one">One</TabsTrigger>
53
+ <TabsTrigger value="two">Two</TabsTrigger>
54
+ </TabsList>
55
+ <TabsContent value="one">x</TabsContent>
56
+ <TabsContent value="two">y</TabsContent>
57
+ </Tabs>,
58
+ );
59
+ expect(screen.getByRole('tab', { name: /one/i })).toHaveAttribute('data-state', 'active');
60
+ });
61
+ });
62
+
63
+ describe('NavLink', () => {
64
+ it('renders link with active state via aria-current', () => {
65
+ render(<NavLink href="/tasks" aria-current="page">Tasks</NavLink>);
66
+ const link = screen.getByRole('link', { name: /tasks/i });
67
+ expect(link).toHaveAttribute('aria-current', 'page');
68
+ });
69
+
70
+ it('renders without active state by default', () => {
71
+ render(<NavLink href="/about">About</NavLink>);
72
+ const link = screen.getByRole('link', { name: /about/i });
73
+ expect(link).not.toHaveAttribute('aria-current');
74
+ });
75
+ });
76
+
77
+ describe('Pagination', () => {
78
+ it('invokes onChange when clicking a visible page button', async () => {
79
+ const onChange = vi.fn();
80
+ render(<Pagination page={2} totalPages={10} onChange={onChange} />);
81
+ await userEvent.click(screen.getByRole('button', { name: /page 3/i }));
82
+ expect(onChange).toHaveBeenCalledWith(3);
83
+ });
84
+
85
+ it('disables prev/next at edges', () => {
86
+ render(<Pagination page={1} totalPages={5} onChange={() => {}} />);
87
+ expect(screen.getByRole('button', { name: /first page/i })).toBeDisabled();
88
+ expect(screen.getByRole('button', { name: /previous page/i })).toBeDisabled();
89
+ });
90
+
91
+ it('renders ellipsis when total pages > 7', () => {
92
+ render(<Pagination page={5} totalPages={20} onChange={() => {}} />);
93
+ expect(screen.getAllByText('…').length).toBeGreaterThanOrEqual(1);
94
+ });
95
+ });
96
+
97
+ describe('CommandPalette', () => {
98
+ it('renders items and filters by query', async () => {
99
+ render(
100
+ <Dialog defaultOpen>
101
+ <DialogContent title="cmdk">
102
+ <CommandPalette placeholder="Search…">
103
+ <CommandPaletteGroup heading="Navigation">
104
+ <CommandPaletteItem value="go:tasks">Go to Tasks</CommandPaletteItem>
105
+ <CommandPaletteItem value="go:goals">Go to Goals</CommandPaletteItem>
106
+ <CommandPaletteItem value="go:agents">Go to Agents</CommandPaletteItem>
107
+ </CommandPaletteGroup>
108
+ </CommandPalette>
109
+ </DialogContent>
110
+ </Dialog>,
111
+ );
112
+ expect(screen.getByText('Go to Tasks')).toBeInTheDocument();
113
+ const input = screen.getByPlaceholderText(/search/i);
114
+ fireEvent.change(input, { target: { value: 'goals' } });
115
+ expect(await screen.findByText('Go to Goals')).toBeInTheDocument();
116
+ expect(screen.queryByText('Go to Tasks')).not.toBeInTheDocument();
117
+ });
118
+
119
+ it('invokes onSelect when an item is selected', async () => {
120
+ const onSelect = vi.fn();
121
+ render(
122
+ <Dialog defaultOpen>
123
+ <DialogContent title="cmdk">
124
+ <CommandPalette>
125
+ <CommandPaletteGroup>
126
+ <CommandPaletteItem value="act:ping" onSelect={onSelect}>
127
+ Ping
128
+ </CommandPaletteItem>
129
+ </CommandPaletteGroup>
130
+ </CommandPalette>
131
+ </DialogContent>
132
+ </Dialog>,
133
+ );
134
+ await userEvent.click(screen.getByText('Ping'));
135
+ expect(onSelect).toHaveBeenCalled();
136
+ });
137
+ });
@@ -0,0 +1,104 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { Palette } from 'lucide-react';
5
+ import { SettingsSection } from '../ui/settings/SettingsSection';
6
+ import { SettingsRow } from '../ui/settings/SettingsRow';
7
+ import { SettingsNav } from '../ui/settings/SettingsNav';
8
+
9
+ describe('SettingsSection', () => {
10
+ it('renders title, description, and body content', () => {
11
+ render(
12
+ <SettingsSection id="theme" title="Theme" description="Light or dark mode.">
13
+ <div>Body content</div>
14
+ </SettingsSection>,
15
+ );
16
+ expect(screen.getByRole('heading', { level: 2, name: /Theme/i })).toBeInTheDocument();
17
+ expect(screen.getByText(/Light or dark mode\./i)).toBeInTheDocument();
18
+ expect(screen.getByText(/Body content/i)).toBeInTheDocument();
19
+ });
20
+
21
+ it('wires aria-labelledby to the title id', () => {
22
+ const { container } = render(
23
+ <SettingsSection id="density" title="Density">
24
+ <div>x</div>
25
+ </SettingsSection>,
26
+ );
27
+ const section = container.querySelector('section#density');
28
+ expect(section?.getAttribute('aria-labelledby')).toBe('density-title');
29
+ expect(container.querySelector('#density-title')).not.toBeNull();
30
+ });
31
+
32
+ it('renders the icon and headerActions when provided', () => {
33
+ render(
34
+ <SettingsSection
35
+ id="theme"
36
+ title="Theme"
37
+ icon={<Palette size={14} aria-hidden="true" />}
38
+ headerActions={<button type="button">Reset</button>}
39
+ >
40
+ <div>body</div>
41
+ </SettingsSection>,
42
+ );
43
+ expect(screen.getByRole('button', { name: /reset/i })).toBeInTheDocument();
44
+ });
45
+ });
46
+
47
+ describe('SettingsRow', () => {
48
+ it('renders label, description, and control', () => {
49
+ const { container } = render(
50
+ <SettingsRow
51
+ id="theme-mode"
52
+ label="Mode"
53
+ description="Light or dark."
54
+ control={<select aria-label="Theme mode"><option>Light</option></select>}
55
+ />,
56
+ );
57
+ // Label is associated with the control group via aria-labelledby
58
+ // (WAI-ARIA pattern for generic controls without a native label).
59
+ const labelEl = container.querySelector('#theme-mode-label');
60
+ expect(labelEl).not.toBeNull();
61
+ expect(labelEl?.textContent).toContain('Mode');
62
+ const group = container.querySelector('[role="group"]');
63
+ expect(group?.getAttribute('aria-labelledby')).toBe('theme-mode-label');
64
+ expect(container.textContent).toContain('Mode');
65
+ expect(container.textContent).toContain('Light or dark.');
66
+ });
67
+
68
+ it('marks the row as disabled when disabled=true', () => {
69
+ const { container } = render(
70
+ <SettingsRow id="r" label="L" disabled control={<button>x</button>} />,
71
+ );
72
+ const row = container.querySelector('.v8-settings-row');
73
+ expect(row?.getAttribute('aria-disabled')).toBe('true');
74
+ expect(row?.getAttribute('data-disabled')).not.toBeNull();
75
+ });
76
+ });
77
+
78
+ describe('SettingsNav', () => {
79
+ const items = [
80
+ { id: 'general', title: 'General' },
81
+ { id: 'theme', title: 'Theme', icon: <Palette size={14} aria-hidden="true" /> },
82
+ { id: 'plugins', title: 'Plugins' },
83
+ ];
84
+
85
+ it('renders every nav item', () => {
86
+ render(<SettingsNav items={items} />);
87
+ expect(screen.getByText(/general/i)).toBeInTheDocument();
88
+ expect(screen.getByText(/theme/i)).toBeInTheDocument();
89
+ expect(screen.getByText(/plugins/i)).toBeInTheDocument();
90
+ });
91
+
92
+ it('marks the active item with aria-current', () => {
93
+ render(<SettingsNav items={items} activeId="theme" />);
94
+ const active = screen.getByRole('button', { name: /theme/i });
95
+ expect(active.getAttribute('aria-current')).toBe('true');
96
+ });
97
+
98
+ it('invokes onSelect with the item id', async () => {
99
+ const onSelect = vi.fn();
100
+ render(<SettingsNav items={items} onSelect={onSelect} />);
101
+ await userEvent.click(screen.getByText(/plugins/i));
102
+ expect(onSelect).toHaveBeenCalledWith('plugins');
103
+ });
104
+ });