@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
@@ -1,844 +0,0 @@
1
- /**
2
- * GlyphRenderer.tsx — Renders a compiled glyph (from /api/artifacts/:slug/render)
3
- * with comment pin overlay + right-click to add comments.
4
- *
5
- * Uses the agent-native.com "Visual Plans" workflow (v3.22.0):
6
- * - Compiled glyph structure: { frontmatter, blocks: [{id, type, data, childrenMarkdown?}], errors }
7
- * - Each block renders via the components from ./components
8
- * - Comment pins from comments.json overlay on top, positioned absolutely
9
- * - Right-click anywhere → context menu with "Add comment" option
10
- * - Blocks are grouped into sections by id (overview, implementation, …)
11
- *
12
- * Layout (v3.22.0 — agent-native /visual-plan inspired, dark dashboard styling):
13
- * .glyph-canvas ← outer, dotted background
14
- * .glyph-toolbar-floating ← sticky top-right pill (Send to agent, share, …)
15
- * .glyph-canvas-content ← centered blocks area
16
- * .glyph-section ← section card with optional heading
17
- * .glyph-section-heading ← "Overview" / "Implementation plan" / …
18
- * .glyph-section-blocks ← block stack inside the section
19
- *
20
- * v3.22.0 — section grouping + floating toolbar rewrite (kept all prior pin/ctx-menu logic).
21
- */
22
-
23
- import React, { useEffect, useMemo, useState, useRef } from 'react';
24
- import {
25
- MapPin,
26
- MessageSquare,
27
- Send,
28
- Share2,
29
- Undo2,
30
- Redo2,
31
- MoreHorizontal,
32
- Maximize2,
33
- X,
34
- } from 'lucide-react';
35
- import { api } from '../../lib/api';
36
- import { useToast } from '../../components/Toast';
37
- import {
38
- RichText,
39
- Callout,
40
- Checklist,
41
- Table,
42
- CodeTabs,
43
- Decision,
44
- OpenQuestions,
45
- FileTree,
46
- Diff,
47
- Stat,
48
- Workflow,
49
- Mockup,
50
- } from './components';
51
-
52
- // ---------------------------------------------------------------------------
53
- // BlockErrorBoundary — v4.4.8
54
- //
55
- // A single broken block (e.g. a FileTree whose `data.entries` ended up
56
- // not being an array because the parser silently produced a phantom
57
- // bareword entry) used to throw inside React, which propagated up and
58
- // blanked the whole canvas. The boundary catches throws per-block and
59
- // renders an inline error card instead. The boundary also exposes its
60
- // errors via a callback so we can surface them in the top-of-page
61
- // "render errors" banner.
62
- // ---------------------------------------------------------------------------
63
-
64
- interface BlockErrorBoundaryProps {
65
- blockId: string;
66
- blockType: string;
67
- children: React.ReactNode;
68
- onError: (blockId: string, blockType: string, err: Error, info: React.ErrorInfo) => void;
69
- }
70
-
71
- interface BlockErrorBoundaryState {
72
- err: Error | null;
73
- }
74
-
75
- class BlockErrorBoundary extends React.Component<BlockErrorBoundaryProps, BlockErrorBoundaryState> {
76
- state: BlockErrorBoundaryState = { err: null };
77
- static getDerivedStateFromError(err: Error): BlockErrorBoundaryState {
78
- return { err };
79
- }
80
- componentDidCatch(err: Error, info: React.ErrorInfo): void {
81
- try {
82
- this.props.onError(this.props.blockId, this.props.blockType, err, info);
83
- } catch {
84
- /* ignore — the boundary itself must not throw */
85
- }
86
- }
87
- render(): React.ReactNode {
88
- if (this.state.err) {
89
- return (
90
- <div
91
- className="glyph-block-error"
92
- role="alert"
93
- style={{
94
- border: '1px solid var(--error, #f85149)',
95
- background: 'rgba(248, 81, 73, 0.06)',
96
- borderRadius: 8,
97
- padding: '12px 14px',
98
- margin: '12px 0',
99
- color: 'var(--text)',
100
- fontFamily: 'var(--font-mono, ui-monospace, monospace)',
101
- fontSize: 12,
102
- lineHeight: 1.55,
103
- }}
104
- >
105
- <strong style={{ color: 'var(--error, #f85149)', fontFamily: 'var(--font-sans, system-ui, sans-serif)', display: 'block', marginBottom: 4 }}>
106
- {this.props.blockType} block crashed
107
- </strong>
108
- <div style={{ color: 'var(--text-muted)', marginBottom: 6 }}>
109
- block id: <code>{this.props.blockId}</code>
110
- </div>
111
- <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word', color: 'var(--text)' }}>
112
- {this.state.err.message}
113
- </pre>
114
- </div>
115
- );
116
- }
117
- return this.props.children;
118
- }
119
- }
120
-
121
- // ---------------------------------------------------------------------------
122
- // Block validation — v4.4.8
123
- //
124
- // Before handing block data to the component switch, verify that the
125
- // shape matches the prop contract. Returns `{ ok: true }` when the
126
- // block can be rendered, or `{ ok: false, error }` when a field is
127
- // missing or wrong type. The renderer uses the error to skip the
128
- // component and surface an inline message instead of throwing.
129
- // ---------------------------------------------------------------------------
130
-
131
- function validateBlock(b: Block): { ok: true } | { ok: false; error: string } {
132
- const data = (b.data ?? {}) as Record<string, unknown>;
133
- switch (b.type) {
134
- case 'RichText':
135
- return { ok: true };
136
- case 'Callout':
137
- return { ok: true };
138
- case 'Checklist':
139
- if (!Array.isArray(data.items)) return { ok: false, error: 'Checklist requires data.items to be an array' };
140
- return { ok: true };
141
- case 'Table':
142
- if (!Array.isArray(data.columns)) return { ok: false, error: 'Table requires data.columns to be an array' };
143
- if (!Array.isArray(data.rows)) return { ok: false, error: 'Table requires data.rows to be an array' };
144
- if (data.rows.length > 0 && !Array.isArray(data.rows[0])) return { ok: false, error: 'Table.data.rows[0] must be an array (cell array)' };
145
- return { ok: true };
146
- case 'CodeTabs':
147
- if (!Array.isArray(data.tabs)) return { ok: false, error: 'CodeTabs requires data.tabs to be an array' };
148
- return { ok: true };
149
- case 'Decision':
150
- if (!Array.isArray(data.options)) return { ok: false, error: 'Decision requires data.options to be an array' };
151
- return { ok: true };
152
- case 'OpenQuestions':
153
- if (!Array.isArray(data.questions)) return { ok: false, error: 'OpenQuestions requires data.questions to be an array' };
154
- return { ok: true };
155
- case 'FileTree':
156
- if (!Array.isArray(data.entries)) return { ok: false, error: 'FileTree requires data.entries to be an array' };
157
- // v4.4.8 — also catch the phantom bareword entry the parser used
158
- // to emit (the v3-to-v4-consolidation glyph crash). An entry that
159
- // is not an object means the parser miscounted braces.
160
- for (const e of data.entries) {
161
- if (e === null || typeof e !== 'object' || Array.isArray(e)) {
162
- return { ok: false, error: `FileTree contains a malformed entry: ${JSON.stringify(e)}` };
163
- }
164
- }
165
- return { ok: true };
166
- case 'Diff':
167
- if (typeof data.before !== 'string') return { ok: false, error: 'Diff requires data.before to be a string' };
168
- if (typeof data.after !== 'string') return { ok: false, error: 'Diff requires data.after to be a string' };
169
- return { ok: true };
170
- case 'Stat':
171
- if (data.label === undefined || data.label === null) return { ok: false, error: 'Stat requires data.label' };
172
- if (data.value === undefined || data.value === null) return { ok: false, error: 'Stat requires data.value' };
173
- return { ok: true };
174
- case 'Workflow':
175
- if (!Array.isArray(data.steps)) return { ok: false, error: 'Workflow requires data.steps to be an array' };
176
- return { ok: true };
177
- case 'Mockup':
178
- if (typeof data.html !== 'string') return { ok: false, error: 'Mockup requires data.html to be a string' };
179
- return { ok: true };
180
- case 'Diagram':
181
- if (typeof data.dataHtml !== 'string') return { ok: false, error: 'Diagram requires data.dataHtml to be a string' };
182
- return { ok: true };
183
- default:
184
- return { ok: false, error: `Unknown block type: ${(b as { type: string }).type}` };
185
- }
186
- }
187
-
188
- // ---------------------------------------------------------------------------
189
- // Types — match the server compiler output
190
- // ---------------------------------------------------------------------------
191
-
192
- type Block =
193
- | { id: string; type: 'RichText'; data: Record<string, unknown>; childrenMarkdown?: string }
194
- | { id: string; type: 'Callout'; data: { tone?: 'info' | 'warn' | 'success' | 'danger' }; childrenMarkdown?: string }
195
- | { id: string; type: 'Checklist'; data: { items: { id: string; label: string; checked: boolean }[] } }
196
- | { id: string; type: 'Table'; data: { columns: string[]; rows: string[][] } }
197
- | { id: string; type: 'CodeTabs'; data: { tabs: { id: string; label: string; language: string; code: string; caption?: string }[] } }
198
- | { id: string; type: 'Decision'; data: { title?: string; question?: string; options: { id: string; label: string; detail: string; recommended?: boolean }[] } }
199
- | { id: string; type: 'OpenQuestions'; data: { questions: { id: string; label: string; kind: 'choice' | 'text' | 'multi'; options?: string[] }[] } }
200
- | { id: string; type: 'FileTree'; data: { title?: string; entries: { path: string; change: 'added' | 'modified' | 'removed' | 'renamed'; note?: string }[] } }
201
- | { id: string; type: 'Diff'; data: { filename?: string; language?: string; mode?: 'split' | 'unified'; before: string; after: string } }
202
- | { id: string; type: 'Stat'; data: { label: string; value: string | number; trend?: 'up' | 'down' | 'flat'; hint?: string } }
203
- | { id: string; type: 'Workflow'; data: { steps: { id: string; label: string; type: 'task' | 'decision' | 'note' }[]; connections?: { from: string; to: string; label?: string }[] } }
204
- | { id: string; type: 'Mockup'; data: { title?: string; x?: number; y?: number; w?: number; h?: number; html: string } }
205
- | { id: string; type: 'Diagram'; data: { title?: string; dataHtml: string; dataCss?: string } };
206
-
207
- interface CompiledGlyph {
208
- slug: string;
209
- frontmatter: Record<string, unknown>;
210
- blocks: Block[];
211
- errors: Array<{ line?: number; message: string }>;
212
- compiledAt: string;
213
- }
214
-
215
- interface CommentPin {
216
- id: string;
217
- elementId?: string | null;
218
- x: number;
219
- y: number;
220
- text: string;
221
- author?: string;
222
- created?: string;
223
- }
224
-
225
- // ---------------------------------------------------------------------------
226
- // Section grouping — block ids → section headings
227
- // ---------------------------------------------------------------------------
228
-
229
- const SECTION_MAP: Record<string, string> = {
230
- overview: 'Overview',
231
- implementation: 'Implementation plan',
232
- 'implementation-plan': 'Implementation plan',
233
- questions: 'Open questions',
234
- 'open-questions': 'Open questions',
235
- 'open-questions-for-you': 'Open questions',
236
- comments: 'Comments',
237
- handoff: 'Handoff',
238
- };
239
-
240
- interface Section {
241
- heading: string | null;
242
- blocks: Block[];
243
- }
244
-
245
- function groupBlocksIntoSections(blocks: Block[]): Section[] {
246
- const sections: Section[] = [];
247
- let current: Section = { heading: null, blocks: [] };
248
-
249
- for (const b of blocks) {
250
- const heading = SECTION_MAP[b.id] ?? null;
251
- if (heading) {
252
- // Push any unheading prelude into a no-heading section so we don't lose it
253
- if (current.blocks.length > 0 || current.heading !== null) {
254
- sections.push(current);
255
- }
256
- current = { heading, blocks: [b] };
257
- } else {
258
- current.blocks.push(b);
259
- }
260
- }
261
- if (current.blocks.length > 0 || current.heading !== null) {
262
- sections.push(current);
263
- }
264
- return sections;
265
- }
266
-
267
- // ---------------------------------------------------------------------------
268
- // Props
269
- // ---------------------------------------------------------------------------
270
-
271
- interface Props {
272
- slug: string;
273
- onClose?: () => void;
274
- /** Called after a comment is added so the parent can refresh. */
275
- onCommentAdded?: () => void;
276
- }
277
-
278
- // ---------------------------------------------------------------------------
279
- // Component
280
- // ---------------------------------------------------------------------------
281
-
282
- export function GlyphRenderer({ slug, onClose, onCommentAdded }: Props) {
283
- const toast = useToast();
284
- const [compiled, setCompiled] = useState<CompiledGlyph | null>(null);
285
- const [comments, setComments] = useState<CommentPin[]>([]);
286
- const [loading, setLoading] = useState(true);
287
- const [error, setError] = useState<string | null>(null);
288
- /** Error caught during the loading phase — shown inline so the user knows why. */
289
- const [loadError, setLoadError] = useState<string | null>(null);
290
- const [submitting, setSubmitting] = useState(false);
291
- const [fullscreen, setFullscreen] = useState(false);
292
-
293
- // Context-menu state
294
- const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number; worldX: number; worldY: number } | null>(null);
295
- const [addingComment, setAddingComment] = useState<{ worldX: number; worldY: number } | null>(null);
296
- const [commentDraft, setCommentDraft] = useState('');
297
-
298
- // Active pin (expanded thread view)
299
- const [activePin, setActivePin] = useState<string | null>(null);
300
-
301
- // v4.4.8 — Per-block render errors caught by BlockErrorBoundary. The
302
- // boundary calls onError(err) which pushes into this array. We render
303
- // the array at the top of the canvas in a prominent red banner so the
304
- // user isn't left staring at a blank screen wondering what happened.
305
- const [blockErrors, setBlockErrors] = useState<
306
- Array<{ blockId: string; blockType: string; message: string }>
307
- >([]);
308
- const reportBlockError = React.useCallback(
309
- (blockId: string, blockType: string, err: Error) => {
310
- setBlockErrors((prev) => {
311
- // dedupe by blockId so the same block crashing twice doesn't
312
- // duplicate the entry
313
- if (prev.some((e) => e.blockId === blockId)) return prev;
314
- return [...prev, { blockId, blockType, message: err.message || String(err) }];
315
- });
316
- },
317
- [],
318
- );
319
-
320
- const canvasRef = useRef<HTMLDivElement>(null);
321
-
322
- // Section grouping — memoized so we don't re-walk the block array on every render
323
- const sections = useMemo(
324
- () => (compiled ? groupBlocksIntoSections(compiled.blocks) : []),
325
- [compiled],
326
- );
327
-
328
- // Load compiled glyph + comments
329
- useEffect(() => {
330
- let cancelled = false;
331
- const TIMEOUT_MS = 5000;
332
-
333
- (async () => {
334
- setLoading(true);
335
- setError(null);
336
- try {
337
- // Race the API calls against a 5-second timeout so the user
338
- // sees an error rather than a perpetual spinner if the server
339
- // hangs or the network drops.
340
- const timeoutPromise = new Promise((_, reject) =>
341
- setTimeout(() => reject(new Error('Request timed out after 5s')), TIMEOUT_MS)
342
- );
343
-
344
- const [renderData, artifactData] = await Promise.race([
345
- Promise.all([
346
- api.get<CompiledGlyph>(`/artifacts/${encodeURIComponent(slug)}/render`),
347
- api.get<{ comments?: CommentPin[]; commentsJson?: { comments?: CommentPin[] } }>(
348
- `/artifacts/${encodeURIComponent(slug)}`
349
- ),
350
- ]),
351
- timeoutPromise,
352
- ]) as [CompiledGlyph, { comments?: CommentPin[]; commentsJson?: { comments?: CommentPin[] } }];
353
-
354
- if (cancelled) return;
355
- setCompiled(renderData);
356
- const fromFile = (artifactData as any)?.comments ?? [];
357
- setComments(Array.isArray(fromFile) ? fromFile : []);
358
- } catch (err) {
359
- if (!cancelled) {
360
- const msg = (err as Error).message;
361
- setError(msg);
362
- setLoadError(msg);
363
- }
364
- } finally {
365
- if (!cancelled) setLoading(false);
366
- }
367
- })();
368
- return () => {
369
- cancelled = true;
370
- };
371
- }, [slug]);
372
-
373
- // Right-click context menu
374
- function onContainerContextMenu(e: React.MouseEvent) {
375
- if (!canvasRef.current) return;
376
- e.preventDefault();
377
- const rect = canvasRef.current.getBoundingClientRect();
378
- setCtxMenu({
379
- x: e.clientX,
380
- y: e.clientY,
381
- worldX: e.clientX - rect.left,
382
- worldY: e.clientY - rect.top,
383
- });
384
- }
385
-
386
- async function submitComment() {
387
- if (!addingComment || !commentDraft.trim()) return;
388
- try {
389
- const created = await api.post<{ id?: string }>(
390
- `/artifacts/${encodeURIComponent(slug)}/comments`,
391
- {
392
- x: addingComment.worldX,
393
- y: addingComment.worldY,
394
- text: commentDraft.trim(),
395
- author: 'drb0rk',
396
- }
397
- );
398
- setComments((prev) => [
399
- ...prev,
400
- {
401
- id: created.id ?? `cmt_${Date.now()}`,
402
- x: addingComment.worldX,
403
- y: addingComment.worldY,
404
- text: commentDraft.trim(),
405
- author: 'drb0rk',
406
- created: new Date().toISOString(),
407
- },
408
- ]);
409
- setAddingComment(null);
410
- setCommentDraft('');
411
- setCtxMenu(null);
412
- onCommentAdded?.();
413
- toast.success('Comment added');
414
- } catch (err) {
415
- toast.error(`Failed to add comment: ${(err as Error).message}`);
416
- }
417
- }
418
-
419
- // "Send to agent" — collects free-placed comments and any answers to
420
- // OpenQuestions, writes `feedback.md` on disk, and marks the artifact
421
- // `status: review` so the agent picks it up.
422
- async function submitFeedback() {
423
- if (submitting) return;
424
- setSubmitting(true);
425
- try {
426
- const result = await api.post<{ ok: boolean; commentCount?: number; questionCount?: number }>(
427
- `/artifacts/${encodeURIComponent(slug)}/submit`,
428
- { answers: [], submitter: 'drb0rk' },
429
- );
430
- if (result?.ok) {
431
- toast.success('Sent to agent — feedback.md written, status=review');
432
- onCommentAdded?.();
433
- } else {
434
- toast.error('Submit failed: server did not return ok=true');
435
- }
436
- } catch (err) {
437
- toast.error(`Submit failed: ${(err as Error).message}`);
438
- } finally {
439
- setSubmitting(false);
440
- }
441
- }
442
-
443
- function toggleFullscreen() {
444
- setFullscreen((v) => !v);
445
- }
446
-
447
- // Render a single block — wrapped in a BlockErrorBoundary so a single
448
- // broken block (e.g. wrong data shape from a parser bug) shows an inline
449
- // error card instead of blanking the whole canvas.
450
- const renderBlock = (b: Block) => {
451
- const id = b.id;
452
- const data = (b.data ?? {}) as Record<string, unknown>;
453
- // Validate data shape BEFORE handing to the component switch. A
454
- // validation failure shows an inline error card immediately, no
455
- // need for the boundary to catch it.
456
- const validation = validateBlock(b);
457
- if (!validation.ok) {
458
- return (
459
- <div
460
- key={id}
461
- id={id}
462
- className="glyph-block-error"
463
- role="alert"
464
- style={{
465
- border: '1px solid var(--error, #f85149)',
466
- background: 'rgba(248, 81, 73, 0.06)',
467
- borderRadius: 8,
468
- padding: '12px 14px',
469
- margin: '12px 0',
470
- color: 'var(--text)',
471
- fontFamily: 'var(--font-mono, ui-monospace, monospace)',
472
- fontSize: 12,
473
- lineHeight: 1.55,
474
- }}
475
- >
476
- <strong style={{ color: 'var(--error, #f85149)', fontFamily: 'var(--font-sans, system-ui, sans-serif)', display: 'block', marginBottom: 4 }}>
477
- {b.type} block invalid
478
- </strong>
479
- <div style={{ color: 'var(--text-muted)', marginBottom: 6 }}>
480
- block id: <code>{id}</code>
481
- </div>
482
- <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{validation.error}</pre>
483
- </div>
484
- );
485
- }
486
- // Wrap the actual render in an error boundary so even runtime
487
- // errors (bad component props, undefined data, etc.) don't crash
488
- // the whole canvas.
489
- return (
490
- <BlockErrorBoundary key={id} blockId={id} blockType={b.type} onError={reportBlockError}>
491
- {renderBlockInner(b, id, data)}
492
- </BlockErrorBoundary>
493
- );
494
- };
495
-
496
- // Inner renderer — split out so the outer renderBlock can validate +
497
- // wrap in an error boundary without nesting the switch in the JSX tree.
498
- const renderBlockInner = (b: Block, id: string, data: Record<string, unknown>) => {
499
- switch (b.type) {
500
- case 'RichText':
501
- return <RichText key={id} id={id}>{b.childrenMarkdown ?? ''}</RichText>;
502
- case 'Callout':
503
- return (
504
- <Callout key={id} id={id} tone={(data.tone as 'info' | 'warn' | 'success' | 'danger' | undefined) ?? 'info'}>
505
- {b.childrenMarkdown ?? ''}
506
- </Callout>
507
- );
508
- case 'Checklist':
509
- return (
510
- <Checklist key={id} id={id} items={(data.items as any) ?? []} />
511
- );
512
- case 'Table':
513
- return (
514
- <Table key={id} id={id} columns={(data.columns as string[]) ?? []} rows={(data.rows as string[][]) ?? []} />
515
- );
516
- case 'CodeTabs':
517
- return (
518
- <CodeTabs key={id} id={id} tabs={(data.tabs as any) ?? []} />
519
- );
520
- case 'Decision':
521
- return (
522
- <Decision
523
- key={id}
524
- id={id}
525
- title={data.title as string | undefined}
526
- question={data.question as string | undefined}
527
- options={(data.options as any) ?? []}
528
- />
529
- );
530
- case 'OpenQuestions':
531
- return (
532
- <OpenQuestions
533
- key={id}
534
- id={id}
535
- questions={(data.questions as any) ?? []}
536
- />
537
- );
538
- case 'FileTree':
539
- return (
540
- <FileTree
541
- key={id}
542
- id={id}
543
- title={data.title as string | undefined}
544
- entries={(data.entries as any) ?? []}
545
- />
546
- );
547
- case 'Diff':
548
- return (
549
- <Diff
550
- key={id}
551
- id={id}
552
- filename={data.filename as string | undefined}
553
- language={data.language as string | undefined}
554
- mode={(data.mode as 'split' | 'unified' | undefined) ?? 'unified'}
555
- before={(data.before as string) ?? ''}
556
- after={(data.after as string) ?? ''}
557
- />
558
- );
559
- case 'Stat':
560
- return (
561
- <Stat
562
- key={id}
563
- id={id}
564
- label={(data.label as string) ?? ''}
565
- value={data.value as string | number}
566
- trend={data.trend as 'up' | 'down' | 'flat' | undefined}
567
- hint={data.hint as string | undefined}
568
- />
569
- );
570
- case 'Workflow':
571
- return (
572
- <Workflow
573
- key={id}
574
- id={id}
575
- steps={(data.steps as any) ?? []}
576
- connections={data.connections as any}
577
- />
578
- );
579
- case 'Mockup':
580
- return (
581
- <Mockup
582
- key={id}
583
- id={id}
584
- title={data.title as string | undefined}
585
- x={data.x as number | undefined}
586
- y={data.y as number | undefined}
587
- w={data.w as number | undefined}
588
- h={data.h as number | undefined}
589
- html={(data.html as string) ?? ''}
590
- />
591
- );
592
- case 'Diagram':
593
- return (
594
- <div key={id} id={id} className="glyph-block-placeholder">
595
- <em>[Diagram] {id}</em>
596
- </div>
597
- );
598
- }
599
- };
600
-
601
- if (loading) {
602
- return (
603
- <div className="glyph-renderer glyph-renderer--loading">
604
- {loadError ? (
605
- <>
606
- <strong>Failed to load glyph.</strong>
607
- <pre>{loadError}</pre>
608
- </>
609
- ) : (
610
- <>
611
- <Spinner /> Loading glyph…
612
- </>
613
- )}
614
- </div>
615
- );
616
- }
617
-
618
- if (error || !compiled) {
619
- return (
620
- <div className="glyph-renderer glyph-renderer--error">
621
- <strong>Failed to load glyph.</strong>
622
- <pre>{error ?? 'unknown error'}</pre>
623
- </div>
624
- );
625
- }
626
-
627
- const title = (compiled.frontmatter?.title as string) ?? slug;
628
- const status = (compiled.frontmatter?.status as string) ?? 'draft';
629
- const commentCount = comments.length;
630
-
631
- return (
632
- <div
633
- className={`glyph-canvas ${fullscreen ? 'glyph-canvas--fullscreen' : ''}`}
634
- ref={canvasRef}
635
- onContextMenu={onContainerContextMenu}
636
- >
637
- {/* Floating toolbar (sticky top-right pill) */}
638
- <div className="glyph-toolbar-floating">
639
- <button
640
- className="glyph-btn glyph-btn--primary glyph-btn--send"
641
- onClick={submitFeedback}
642
- disabled={submitting}
643
- title="Send comments + question answers to the agent — writes feedback.md, status=review"
644
- >
645
- <Send size={14} />
646
- <span>Send to agent</span>
647
- <span className="glyph-btn-badge">{commentCount}</span>
648
- </button>
649
-
650
- <span className="glyph-toolbar-divider" />
651
-
652
- <button
653
- className="glyph-icon-btn"
654
- title="Share"
655
- onClick={() => {
656
- if (typeof window !== 'undefined' && navigator.clipboard) {
657
- navigator.clipboard.writeText(window.location.href).catch(() => {});
658
- toast.success('Link copied');
659
- }
660
- }}
661
- >
662
- <Share2 size={15} />
663
- </button>
664
- <button className="glyph-icon-btn" title="Undo" disabled>
665
- <Undo2 size={15} />
666
- </button>
667
- <button className="glyph-icon-btn" title="Redo" disabled>
668
- <Redo2 size={15} />
669
- </button>
670
- <button
671
- className="glyph-icon-btn"
672
- title={fullscreen ? 'Exit fullscreen' : 'Fullscreen'}
673
- onClick={toggleFullscreen}
674
- >
675
- <Maximize2 size={15} />
676
- </button>
677
- <button className="glyph-icon-btn" title="More">
678
- <MoreHorizontal size={15} />
679
- </button>
680
- <span className="glyph-toolbar-divider" />
681
- <button
682
- className="glyph-icon-btn"
683
- title="Comment count"
684
- aria-label="Comment count"
685
- >
686
- <MessageSquare size={15} />
687
- <span className="glyph-icon-btn-count">{commentCount}</span>
688
- </button>
689
- {onClose && (
690
- <button
691
- className="glyph-icon-btn glyph-icon-btn--close"
692
- title="Close"
693
- onClick={onClose}
694
- aria-label="Close"
695
- >
696
- <X size={15} />
697
- </button>
698
- )}
699
- </div>
700
-
701
- {/* Canvas content — centered column of section cards */}
702
- <div className="glyph-canvas-content">
703
- {/* Title strip (inside canvas, above sections) */}
704
- <header className="glyph-canvas-title">
705
- <h1 className="glyph-title">{title}</h1>
706
- <div className="glyph-meta">
707
- <span className={`glyph-status glyph-status--${status}`}>{status}</span>
708
- <span className="glyph-slug">{slug}</span>
709
- </div>
710
- </header>
711
-
712
- {/* v4.4.8 — Render errors banner. Two layers:
713
- 1. Compiler warnings from the MDX parser (e.g. unknown
714
- tag, unclosed block). Lightweight, yellow border.
715
- 2. Block render errors caught by BlockErrorBoundary. These
716
- are the "one block crashed but the rest still rendered"
717
- cases. Red border, prominent, listed first so the user
718
- sees them before scrolling. */}
719
- {(blockErrors.length > 0 || compiled.errors?.length > 0) && (
720
- <div
721
- className="glyph-render-errors"
722
- role="alert"
723
- style={{
724
- border: '1px solid var(--error, #f85149)',
725
- background: 'rgba(248, 81, 73, 0.08)',
726
- borderRadius: 8,
727
- padding: '12px 16px',
728
- margin: '0 0 16px 0',
729
- color: 'var(--text)',
730
- }}
731
- >
732
- <strong style={{ color: 'var(--error, #f85149)', display: 'block', marginBottom: 8 }}>
733
- {blockErrors.length > 0
734
- ? `${blockErrors.length} block${blockErrors.length === 1 ? '' : 's'} failed to render`
735
- : 'Compiler warnings'}
736
- </strong>
737
- <ul style={{ margin: 0, paddingLeft: 20, fontFamily: 'var(--font-mono, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.6 }}>
738
- {blockErrors.map((e, i) => (
739
- <li key={`be-${i}`}>
740
- <strong>{e.blockType}</strong> (<code>{e.blockId}</code>): {e.message}
741
- </li>
742
- ))}
743
- {compiled.errors?.map((e, i) => (
744
- <li key={`ce-${i}`}>
745
- {e.line ? `line ${e.line}: ` : ''}{e.message}
746
- </li>
747
- ))}
748
- </ul>
749
- </div>
750
- )}
751
-
752
- {/* Sections */}
753
- <div className="glyph-sections">
754
- {sections.map((section, i) => (
755
- <section
756
- key={`sec-${i}-${section.heading ?? 'ungrouped'}`}
757
- className={`glyph-section ${section.heading ? 'glyph-section--headed' : 'glyph-section--plain'}`}
758
- >
759
- {section.heading && (
760
- <h2 className="glyph-section-heading">{section.heading}</h2>
761
- )}
762
- <div className="glyph-section-blocks">
763
- {section.blocks.map(renderBlock)}
764
- </div>
765
- </section>
766
- ))}
767
- </div>
768
- </div>
769
-
770
- {/* Comment pin overlay */}
771
- {comments.map((c) => (
772
- <button
773
- key={c.id}
774
- className={`glyph-pin ${activePin === c.id ? 'glyph-pin--active' : ''}`}
775
- style={{ left: c.x, top: c.y }}
776
- onClick={(e) => {
777
- e.stopPropagation();
778
- setActivePin(activePin === c.id ? null : c.id);
779
- }}
780
- title={c.text}
781
- >
782
- <MapPin size={14} />
783
- {activePin === c.id && (
784
- <div className="glyph-pin-thread">
785
- <div className="glyph-pin-text">{c.text}</div>
786
- <div className="glyph-pin-meta">
787
- {c.author ?? 'anonymous'} · {c.created ? new Date(c.created).toLocaleString() : ''}
788
- </div>
789
- </div>
790
- )}
791
- </button>
792
- ))}
793
-
794
- {/* Context menu (right-click) */}
795
- {ctxMenu && (
796
- <div
797
- className="glyph-ctx-menu"
798
- style={{ left: ctxMenu.x, top: ctxMenu.y }}
799
- onClick={(e) => e.stopPropagation()}
800
- >
801
- <button
802
- className="glyph-ctx-item"
803
- onClick={() => {
804
- setAddingComment({ worldX: ctxMenu.worldX, worldY: ctxMenu.worldY });
805
- setCtxMenu(null);
806
- }}
807
- >
808
- <MapPin size={14} /> Add comment here
809
- </button>
810
- </div>
811
- )}
812
-
813
- {/* Add-comment modal */}
814
- {addingComment && (
815
- <div className="glyph-modal-overlay" onClick={() => setAddingComment(null)}>
816
- <div className="glyph-modal" onClick={(e) => e.stopPropagation()}>
817
- <h3>Add comment at ({Math.round(addingComment.worldX)}, {Math.round(addingComment.worldY)})</h3>
818
- <textarea
819
- autoFocus
820
- value={commentDraft}
821
- onChange={(e) => setCommentDraft(e.target.value)}
822
- placeholder="What should the agent know about this area?"
823
- rows={4}
824
- className="glyph-modal-textarea"
825
- />
826
- <div className="glyph-modal-actions">
827
- <button className="glyph-btn glyph-btn--ghost" onClick={() => setAddingComment(null)}>
828
- Cancel
829
- </button>
830
- <button className="glyph-btn glyph-btn--primary" onClick={submitComment} disabled={!commentDraft.trim()}>
831
- Add comment
832
- </button>
833
- </div>
834
- </div>
835
- </div>
836
- )}
837
- </div>
838
- );
839
- }
840
-
841
- // Tiny inline spinner (no extra dep)
842
- function Spinner() {
843
- return <span className="glyph-spinner" aria-label="loading">…</span>;
844
- }