@polderlabs/bizar 7.0.2 → 8.0.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 (490) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/bizar-dash/DESIGN.md +729 -969
  3. package/bizar-dash/GLYPH.md +418 -0
  4. package/bizar-dash/PLAN.md +1135 -0
  5. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js +6 -0
  6. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js.map +1 -0
  7. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js +1 -0
  8. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js.map +1 -0
  9. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js +1 -0
  10. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js.map +1 -0
  11. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js +8 -0
  12. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js.map +1 -0
  13. package/bizar-dash/dist/assets/Badge-Cd61wsBa.js +1 -0
  14. package/bizar-dash/dist/assets/Badge-Cd61wsBa.js.map +1 -0
  15. package/bizar-dash/dist/assets/Card-C_bvqXdQ.js +1 -0
  16. package/bizar-dash/dist/assets/Card-C_bvqXdQ.js.map +1 -0
  17. package/bizar-dash/dist/assets/EmptyState-BWQuKnk9.js +1 -0
  18. package/bizar-dash/dist/assets/EmptyState-BWQuKnk9.js.map +1 -0
  19. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js +11 -0
  20. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js.map +1 -0
  21. package/bizar-dash/dist/assets/Grid-C62gCPqt.js +1 -0
  22. package/bizar-dash/dist/assets/Grid-C62gCPqt.js.map +1 -0
  23. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js +21 -0
  24. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js.map +1 -0
  25. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js +67 -0
  26. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js.map +1 -0
  27. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js +13 -0
  28. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js.map +1 -0
  29. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js +1 -0
  30. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js.map +1 -0
  31. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js +1 -0
  32. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js.map +1 -0
  33. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js +30 -0
  34. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js.map +1 -0
  35. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js +48 -0
  36. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js.map +1 -0
  37. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js +11 -0
  38. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js.map +1 -0
  39. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js +1 -0
  40. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js.map +1 -0
  41. package/bizar-dash/dist/assets/ViewHeader-D6c2cw1b.js +6 -0
  42. package/bizar-dash/dist/assets/ViewHeader-D6c2cw1b.js.map +1 -0
  43. package/bizar-dash/dist/assets/brain-DeoXNDE2.js +6 -0
  44. package/bizar-dash/dist/assets/brain-DeoXNDE2.js.map +1 -0
  45. package/bizar-dash/dist/assets/calendar-DRlQkGJc.js +6 -0
  46. package/bizar-dash/dist/assets/calendar-DRlQkGJc.js.map +1 -0
  47. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js +6 -0
  48. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js.map +1 -0
  49. package/bizar-dash/dist/assets/cmdk-BwN8hcKQ.js +80 -0
  50. package/bizar-dash/dist/assets/cmdk-BwN8hcKQ.js.map +1 -0
  51. package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js +5 -0
  52. package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js.map +1 -0
  53. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js +6 -0
  54. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js.map +1 -0
  55. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js +6 -0
  56. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js.map +1 -0
  57. package/bizar-dash/dist/assets/main-COdgjqbZ.css +1 -0
  58. package/bizar-dash/dist/assets/main-Cw6gybzS.js +109 -0
  59. package/bizar-dash/dist/assets/main-Cw6gybzS.js.map +1 -0
  60. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js +6 -0
  61. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js.map +1 -0
  62. package/bizar-dash/dist/assets/minus-CrStJTZ7.js +6 -0
  63. package/bizar-dash/dist/assets/minus-CrStJTZ7.js.map +1 -0
  64. package/bizar-dash/dist/assets/wrench-BJ1WIC4u.js +6 -0
  65. package/bizar-dash/dist/assets/wrench-BJ1WIC4u.js.map +1 -0
  66. package/bizar-dash/dist/{mobile.html → v8.html} +6 -9
  67. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  68. package/bizar-dash/src/server/server.mjs +1 -57
  69. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  70. package/bizar-dash/src/web/v8/App.tsx +188 -0
  71. package/bizar-dash/src/web/v8/__tests__/App.test.tsx +102 -0
  72. package/bizar-dash/src/web/v8/__tests__/AppShell.test.tsx +79 -0
  73. package/bizar-dash/src/web/v8/__tests__/PageSkeleton.test.tsx +12 -0
  74. package/bizar-dash/src/web/v8/__tests__/SettingsView.test.tsx +84 -0
  75. package/bizar-dash/src/web/v8/__tests__/Sidebar.test.tsx +95 -0
  76. package/bizar-dash/src/web/v8/__tests__/activity.test.tsx +63 -0
  77. package/bizar-dash/src/web/v8/__tests__/agents.test.tsx +90 -0
  78. package/bizar-dash/src/web/v8/__tests__/controls.test.tsx +135 -0
  79. package/bizar-dash/src/web/v8/__tests__/cx.test.ts +25 -0
  80. package/bizar-dash/src/web/v8/__tests__/data.test.tsx +293 -0
  81. package/bizar-dash/src/web/v8/__tests__/feedback.test.tsx +213 -0
  82. package/bizar-dash/src/web/v8/__tests__/goals.test.tsx +105 -0
  83. package/bizar-dash/src/web/v8/__tests__/kanban.test.tsx +176 -0
  84. package/bizar-dash/src/web/v8/__tests__/libraries.test.tsx +70 -0
  85. package/bizar-dash/src/web/v8/__tests__/memory.test.tsx +60 -0
  86. package/bizar-dash/src/web/v8/__tests__/navigation.test.tsx +137 -0
  87. package/bizar-dash/src/web/v8/__tests__/settings.test.tsx +104 -0
  88. package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +98 -0
  89. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +112 -0
  90. package/bizar-dash/src/web/v8/main.tsx +28 -0
  91. package/bizar-dash/src/web/v8/shell/AppShell.tsx +90 -0
  92. package/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +29 -0
  93. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +361 -0
  94. package/bizar-dash/src/web/v8/shell/StatusBar.tsx +63 -0
  95. package/bizar-dash/src/web/v8/shell/Topbar.tsx +113 -0
  96. package/bizar-dash/src/web/v8/shell/index.ts +15 -0
  97. package/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +137 -0
  98. package/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +101 -0
  99. package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +158 -0
  100. package/bizar-dash/src/web/v8/ui/controls/Button.tsx +141 -0
  101. package/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +32 -0
  102. package/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +49 -0
  103. package/bizar-dash/src/web/v8/ui/controls/Field.tsx +78 -0
  104. package/bizar-dash/src/web/v8/ui/controls/Form.tsx +23 -0
  105. package/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +112 -0
  106. package/bizar-dash/src/web/v8/ui/controls/Input.tsx +94 -0
  107. package/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +74 -0
  108. package/bizar-dash/src/web/v8/ui/controls/Select.tsx +171 -0
  109. package/bizar-dash/src/web/v8/ui/controls/Slider.tsx +68 -0
  110. package/bizar-dash/src/web/v8/ui/controls/Switch.tsx +56 -0
  111. package/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +64 -0
  112. package/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +36 -0
  113. package/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +85 -0
  114. package/bizar-dash/src/web/v8/ui/data/Accordion.tsx +134 -0
  115. package/bizar-dash/src/web/v8/ui/data/Avatar.tsx +175 -0
  116. package/bizar-dash/src/web/v8/ui/data/Badge.tsx +93 -0
  117. package/bizar-dash/src/web/v8/ui/data/BarList.tsx +101 -0
  118. package/bizar-dash/src/web/v8/ui/data/Card.tsx +140 -0
  119. package/bizar-dash/src/web/v8/ui/data/Chip.tsx +96 -0
  120. package/bizar-dash/src/web/v8/ui/data/Kbd.tsx +42 -0
  121. package/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +93 -0
  122. package/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +98 -0
  123. package/bizar-dash/src/web/v8/ui/data/StatTile.tsx +150 -0
  124. package/bizar-dash/src/web/v8/ui/data/Table.tsx +170 -0
  125. package/bizar-dash/src/web/v8/ui/data/Timeline.tsx +130 -0
  126. package/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +122 -0
  127. package/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +95 -0
  128. package/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +39 -0
  129. package/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +143 -0
  130. package/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +149 -0
  131. package/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +8 -0
  132. package/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +231 -0
  133. package/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +48 -0
  134. package/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +56 -0
  135. package/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +103 -0
  136. package/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +67 -0
  137. package/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +30 -0
  138. package/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +66 -0
  139. package/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +89 -0
  140. package/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +176 -0
  141. package/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +115 -0
  142. package/bizar-dash/src/web/v8/ui/index.ts +322 -0
  143. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +80 -0
  144. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +247 -0
  145. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +181 -0
  146. package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +122 -0
  147. package/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +141 -0
  148. package/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +30 -0
  149. package/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +161 -0
  150. package/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +144 -0
  151. package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +224 -0
  152. package/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +81 -0
  153. package/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +164 -0
  154. package/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +128 -0
  155. package/bizar-dash/src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts +79 -0
  156. package/bizar-dash/src/web/v8/ui/primitives/Box.tsx +144 -0
  157. package/bizar-dash/src/web/v8/ui/primitives/Center.tsx +40 -0
  158. package/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +67 -0
  159. package/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +104 -0
  160. package/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +77 -0
  161. package/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +33 -0
  162. package/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +62 -0
  163. package/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +42 -0
  164. package/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +73 -0
  165. package/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +49 -0
  166. package/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +91 -0
  167. package/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +88 -0
  168. package/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +109 -0
  169. package/bizar-dash/src/web/v8/ui/styles/globals.css +220 -0
  170. package/bizar-dash/src/web/v8/ui/styles/reset.css +57 -0
  171. package/bizar-dash/src/web/v8/ui/styles/tokens.css +217 -0
  172. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.test.tsx +74 -0
  173. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +66 -0
  174. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.test.tsx +86 -0
  175. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +94 -0
  176. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +88 -0
  177. package/bizar-dash/src/web/v8/ui/theme/useDensity.ts +15 -0
  178. package/bizar-dash/src/web/v8/ui/theme/useTheme.ts +16 -0
  179. package/bizar-dash/src/web/v8/ui/utils/cx.ts +19 -0
  180. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +33 -0
  181. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +108 -0
  182. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +142 -0
  183. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +144 -0
  184. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +84 -0
  185. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +41 -0
  186. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +61 -0
  187. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +92 -0
  188. package/bizar-dash/src/web/v8/views/Router.tsx +96 -0
  189. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +305 -0
  190. package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +106 -0
  191. package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +62 -0
  192. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +74 -0
  193. package/bizar-dash/src/web/v8/vite-env.d.ts +15 -0
  194. package/bizar-dash/src/web/{mobile.html → v8.html} +4 -7
  195. package/bizar-dash/tests/settings-layout.test.tsx +2 -2
  196. package/bizar-dash/tests/settings-nav.test.tsx +6 -6
  197. package/bizar-dash/tests/setup.ts +26 -0
  198. package/bizar-dash/vite.config.ts +26 -2
  199. package/bizar-dash/vitest.config.ts +5 -3
  200. package/cli/provision-claude.mjs +108 -5
  201. package/package.json +36 -3
  202. package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js +0 -114
  203. package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js.map +0 -1
  204. package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js +0 -1
  205. package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js.map +0 -1
  206. package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js +0 -1
  207. package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js.map +0 -1
  208. package/bizar-dash/dist/assets/Toast-ATSAmbdi.js +0 -26
  209. package/bizar-dash/dist/assets/Toast-ATSAmbdi.js.map +0 -1
  210. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  211. package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +0 -1
  212. package/bizar-dash/dist/assets/main-306CZfn6.js +0 -430
  213. package/bizar-dash/dist/assets/main-306CZfn6.js.map +0 -1
  214. package/bizar-dash/dist/assets/main-G3bNDpY3.css +0 -1
  215. package/bizar-dash/dist/assets/mobile-C_naUN91.js +0 -1
  216. package/bizar-dash/dist/assets/mobile-C_naUN91.js.map +0 -1
  217. package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +0 -1
  218. package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js +0 -211
  219. package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js.map +0 -1
  220. package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js +0 -65
  221. package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js.map +0 -1
  222. package/bizar-dash/dist/index.html +0 -43
  223. package/bizar-dash/src/web/App.tsx +0 -915
  224. package/bizar-dash/src/web/MobileApp.tsx +0 -414
  225. package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +0 -95
  226. package/bizar-dash/src/web/components/ArtifactListDialog.tsx +0 -55
  227. package/bizar-dash/src/web/components/ArtifactViewer.tsx +0 -144
  228. package/bizar-dash/src/web/components/AuditDialog.tsx +0 -79
  229. package/bizar-dash/src/web/components/AutosaveField.tsx +0 -50
  230. package/bizar-dash/src/web/components/BackupRestore.tsx +0 -330
  231. package/bizar-dash/src/web/components/BgStatusBadge.tsx +0 -32
  232. package/bizar-dash/src/web/components/Button.tsx +0 -56
  233. package/bizar-dash/src/web/components/CanvasContextMenu.tsx +0 -68
  234. package/bizar-dash/src/web/components/Card.tsx +0 -40
  235. package/bizar-dash/src/web/components/CollapsibleSection.tsx +0 -72
  236. package/bizar-dash/src/web/components/CommandDialog.tsx +0 -66
  237. package/bizar-dash/src/web/components/DoctorPanel.tsx +0 -160
  238. package/bizar-dash/src/web/components/EmptyState.tsx +0 -30
  239. package/bizar-dash/src/web/components/EnvVarManager.tsx +0 -430
  240. package/bizar-dash/src/web/components/EvalDiff.tsx +0 -157
  241. package/bizar-dash/src/web/components/EvalExportButton.tsx +0 -27
  242. package/bizar-dash/src/web/components/EvalRunCard.tsx +0 -78
  243. package/bizar-dash/src/web/components/FileBrowser.tsx +0 -633
  244. package/bizar-dash/src/web/components/HeadroomSettings.tsx +0 -418
  245. package/bizar-dash/src/web/components/HeadroomStatus.tsx +0 -158
  246. package/bizar-dash/src/web/components/HelpDialog.tsx +0 -55
  247. package/bizar-dash/src/web/components/InviteDialog.tsx +0 -205
  248. package/bizar-dash/src/web/components/KillConfirmDialog.tsx +0 -88
  249. package/bizar-dash/src/web/components/MobileBottomNav.tsx +0 -38
  250. package/bizar-dash/src/web/components/MobileDrawer.tsx +0 -68
  251. package/bizar-dash/src/web/components/MobileHeader.tsx +0 -50
  252. package/bizar-dash/src/web/components/MobileLayout.tsx +0 -63
  253. package/bizar-dash/src/web/components/Modal.tsx +0 -215
  254. package/bizar-dash/src/web/components/Notifications.tsx +0 -242
  255. package/bizar-dash/src/web/components/ScheduleTemplateCard.tsx +0 -72
  256. package/bizar-dash/src/web/components/ScreenshotCapture.tsx +0 -138
  257. package/bizar-dash/src/web/components/ScreenshotOCR.tsx +0 -42
  258. package/bizar-dash/src/web/components/SearchModal.tsx +0 -227
  259. package/bizar-dash/src/web/components/SettingsNav.tsx +0 -112
  260. package/bizar-dash/src/web/components/SettingsSearch.tsx +0 -328
  261. package/bizar-dash/src/web/components/Sidebar.tsx +0 -89
  262. package/bizar-dash/src/web/components/Spinner.tsx +0 -19
  263. package/bizar-dash/src/web/components/StatusBadge.tsx +0 -56
  264. package/bizar-dash/src/web/components/Tag.tsx +0 -41
  265. package/bizar-dash/src/web/components/TailscaleSettings.tsx +0 -161
  266. package/bizar-dash/src/web/components/TaskCard.tsx +0 -69
  267. package/bizar-dash/src/web/components/TaskCreateSheet.tsx +0 -76
  268. package/bizar-dash/src/web/components/Toast.tsx +0 -150
  269. package/bizar-dash/src/web/components/Toggle.tsx +0 -31
  270. package/bizar-dash/src/web/components/Topbar.tsx +0 -410
  271. package/bizar-dash/src/web/components/UsageChart.tsx +0 -250
  272. package/bizar-dash/src/web/components/UsageTable.tsx +0 -90
  273. package/bizar-dash/src/web/components/VirtualList.tsx +0 -53
  274. package/bizar-dash/src/web/components/VisualPlanDialog.tsx +0 -58
  275. package/bizar-dash/src/web/components/VoiceNotesPanel.tsx +0 -211
  276. package/bizar-dash/src/web/components/VoiceRecorder.tsx +0 -105
  277. package/bizar-dash/src/web/components/WorkspaceSelector.tsx +0 -158
  278. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +0 -126
  279. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +0 -163
  280. package/bizar-dash/src/web/components/agents/QualityGates.tsx +0 -123
  281. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +0 -127
  282. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +0 -148
  283. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +0 -160
  284. package/bizar-dash/src/web/components/background/AttachButton.tsx +0 -96
  285. package/bizar-dash/src/web/components/background/TmuxAttachCard.tsx +0 -122
  286. package/bizar-dash/src/web/components/chat/AgentChip.tsx +0 -68
  287. package/bizar-dash/src/web/components/chat/AgentNode.tsx +0 -127
  288. package/bizar-dash/src/web/components/chat/AgentTree.tsx +0 -80
  289. package/bizar-dash/src/web/components/chat/ChatBubble.tsx +0 -60
  290. package/bizar-dash/src/web/components/chat/ChatComposer.tsx +0 -72
  291. package/bizar-dash/src/web/components/chat/ChatInfoPanel.tsx +0 -370
  292. package/bizar-dash/src/web/components/chat/ChatRail.tsx +0 -387
  293. package/bizar-dash/src/web/components/chat/ChatThread.tsx +0 -127
  294. package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +0 -50
  295. package/bizar-dash/src/web/components/chat/Composer.tsx +0 -166
  296. package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +0 -54
  297. package/bizar-dash/src/web/components/chat/EmptyState.tsx +0 -21
  298. package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +0 -18
  299. package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +0 -38
  300. package/bizar-dash/src/web/components/chat/InfoPanel.tsx +0 -184
  301. package/bizar-dash/src/web/components/chat/JumpToLatest.tsx +0 -58
  302. package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +0 -19
  303. package/bizar-dash/src/web/components/chat/MessageBlock.tsx +0 -260
  304. package/bizar-dash/src/web/components/chat/MessageBubble.tsx +0 -60
  305. package/bizar-dash/src/web/components/chat/SessionList.tsx +0 -163
  306. package/bizar-dash/src/web/components/chat/SessionRowMenu.tsx +0 -206
  307. package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +0 -37
  308. package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +0 -55
  309. package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +0 -36
  310. package/bizar-dash/src/web/components/chat/_legacy.ts +0 -30
  311. package/bizar-dash/src/web/components/chat/index.ts +0 -31
  312. package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +0 -18
  313. package/bizar-dash/src/web/components/chat/useChat.ts +0 -1190
  314. package/bizar-dash/src/web/components/chat/useSlashCommands.ts +0 -47
  315. package/bizar-dash/src/web/components/goals/GoalInput.tsx +0 -86
  316. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +0 -111
  317. package/bizar-dash/src/web/components/tasks/BacklogPanel.css +0 -109
  318. package/bizar-dash/src/web/components/tasks/BacklogPanel.tsx +0 -209
  319. package/bizar-dash/src/web/hooks/useAutosave.ts +0 -107
  320. package/bizar-dash/src/web/hooks/useI18n.ts +0 -13
  321. package/bizar-dash/src/web/index.html +0 -37
  322. package/bizar-dash/src/web/lib/api.ts +0 -237
  323. package/bizar-dash/src/web/lib/goapPlanner.ts +0 -614
  324. package/bizar-dash/src/web/lib/i18n.ts +0 -25
  325. package/bizar-dash/src/web/lib/logger.ts +0 -30
  326. package/bizar-dash/src/web/lib/markdown.tsx +0 -59
  327. package/bizar-dash/src/web/lib/search.ts +0 -115
  328. package/bizar-dash/src/web/lib/types.ts +0 -894
  329. package/bizar-dash/src/web/lib/utils.ts +0 -114
  330. package/bizar-dash/src/web/lib/ws.ts +0 -177
  331. package/bizar-dash/src/web/locales/en.json +0 -52
  332. package/bizar-dash/src/web/main.tsx +0 -43
  333. package/bizar-dash/src/web/mobile/MobileApp.tsx +0 -309
  334. package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +0 -38
  335. package/bizar-dash/src/web/mobile/MobileChat.tsx +0 -138
  336. package/bizar-dash/src/web/mobile/MobileDoctor.tsx +0 -80
  337. package/bizar-dash/src/web/mobile/MobileEval.tsx +0 -167
  338. package/bizar-dash/src/web/mobile/MobileMemory.tsx +0 -108
  339. package/bizar-dash/src/web/mobile/MobileOverview.tsx +0 -213
  340. package/bizar-dash/src/web/mobile/MobileSettings.tsx +0 -251
  341. package/bizar-dash/src/web/mobile/MobileTasks.tsx +0 -94
  342. package/bizar-dash/src/web/mobile/MobileTopbar.tsx +0 -115
  343. package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +0 -182
  344. package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +0 -64
  345. package/bizar-dash/src/web/mobile/components/MobileModal.tsx +0 -123
  346. package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +0 -273
  347. package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +0 -374
  348. package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +0 -439
  349. package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +0 -143
  350. package/bizar-dash/src/web/mobile/views/MobileChat.tsx +0 -257
  351. package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +0 -175
  352. package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +0 -191
  353. package/bizar-dash/src/web/mobile/views/MobileMods.tsx +0 -149
  354. package/bizar-dash/src/web/mobile/views/MobileMore.tsx +0 -121
  355. package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +0 -137
  356. package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +0 -26
  357. package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +0 -685
  358. package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +0 -172
  359. package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +0 -363
  360. package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +0 -153
  361. package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +0 -564
  362. package/bizar-dash/src/web/mobile/views/QrCodePanel.tsx +0 -69
  363. package/bizar-dash/src/web/mobile.tsx +0 -14
  364. package/bizar-dash/src/web/styles/agents-redesign.css +0 -311
  365. package/bizar-dash/src/web/styles/chat.css +0 -1740
  366. package/bizar-dash/src/web/styles/glyphs.css +0 -960
  367. package/bizar-dash/src/web/styles/main.css +0 -10391
  368. package/bizar-dash/src/web/styles/memory.css +0 -1182
  369. package/bizar-dash/src/web/styles/minimax-usage.css +0 -842
  370. package/bizar-dash/src/web/styles/mobile-chat.css +0 -5
  371. package/bizar-dash/src/web/styles/mobile-layout.css +0 -233
  372. package/bizar-dash/src/web/styles/mobile.css +0 -2181
  373. package/bizar-dash/src/web/styles/settings.css +0 -795
  374. package/bizar-dash/src/web/styles/skills.css +0 -302
  375. package/bizar-dash/src/web/styles/tasks-redesign.css +0 -253
  376. package/bizar-dash/src/web/styles/tasks.css +0 -605
  377. package/bizar-dash/src/web/ui/controls/Button.tsx +0 -77
  378. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +0 -95
  379. package/bizar-dash/src/web/ui/controls/IconButton.tsx +0 -66
  380. package/bizar-dash/src/web/ui/controls/Kbd.tsx +0 -24
  381. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +0 -77
  382. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +0 -109
  383. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +0 -91
  384. package/bizar-dash/src/web/ui/controls/Select.tsx +0 -92
  385. package/bizar-dash/src/web/ui/controls/Slider.tsx +0 -70
  386. package/bizar-dash/src/web/ui/controls/TextInput.tsx +0 -67
  387. package/bizar-dash/src/web/ui/controls/Textarea.tsx +0 -56
  388. package/bizar-dash/src/web/ui/controls/Toggle.tsx +0 -79
  389. package/bizar-dash/src/web/ui/controls/controls.css +0 -476
  390. package/bizar-dash/src/web/ui/controls/index.ts +0 -35
  391. package/bizar-dash/src/web/ui/data/BarChart.tsx +0 -60
  392. package/bizar-dash/src/web/ui/data/DataTable.tsx +0 -216
  393. package/bizar-dash/src/web/ui/data/EmptyState.tsx +0 -60
  394. package/bizar-dash/src/web/ui/data/ErrorState.tsx +0 -56
  395. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +0 -106
  396. package/bizar-dash/src/web/ui/data/LoadingState.tsx +0 -65
  397. package/bizar-dash/src/web/ui/data/Sparkline.tsx +0 -87
  398. package/bizar-dash/src/web/ui/data/StatTile.tsx +0 -87
  399. package/bizar-dash/src/web/ui/data/data.css +0 -535
  400. package/bizar-dash/src/web/ui/data/index.ts +0 -31
  401. package/bizar-dash/src/web/ui/feedback/Badge.tsx +0 -49
  402. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +0 -209
  403. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +0 -69
  404. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +0 -50
  405. package/bizar-dash/src/web/ui/feedback/Toast.tsx +0 -200
  406. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +0 -126
  407. package/bizar-dash/src/web/ui/feedback/feedback.css +0 -314
  408. package/bizar-dash/src/web/ui/feedback/index.ts +0 -43
  409. package/bizar-dash/src/web/ui/index.ts +0 -56
  410. package/bizar-dash/src/web/ui/layout/AppShell.tsx +0 -51
  411. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +0 -97
  412. package/bizar-dash/src/web/ui/layout/Panel.tsx +0 -73
  413. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +0 -39
  414. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +0 -131
  415. package/bizar-dash/src/web/ui/layout/Tabs.tsx +0 -133
  416. package/bizar-dash/src/web/ui/layout/Topbar.tsx +0 -42
  417. package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +0 -48
  418. package/bizar-dash/src/web/ui/layout/index.ts +0 -34
  419. package/bizar-dash/src/web/ui/layout/layout.css +0 -464
  420. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +0 -199
  421. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +0 -95
  422. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +0 -93
  423. package/bizar-dash/src/web/ui/navigation/index.ts +0 -17
  424. package/bizar-dash/src/web/ui/navigation/navigation.css +0 -343
  425. package/bizar-dash/src/web/ui/primitives/Box.tsx +0 -91
  426. package/bizar-dash/src/web/ui/primitives/Grid.tsx +0 -49
  427. package/bizar-dash/src/web/ui/primitives/Inline.tsx +0 -55
  428. package/bizar-dash/src/web/ui/primitives/Separator.tsx +0 -46
  429. package/bizar-dash/src/web/ui/primitives/Stack.tsx +0 -54
  430. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +0 -26
  431. package/bizar-dash/src/web/ui/primitives/index.ts +0 -23
  432. package/bizar-dash/src/web/ui/primitives/primitives.css +0 -183
  433. package/bizar-dash/src/web/ui/styles/globals.css +0 -86
  434. package/bizar-dash/src/web/ui/styles/reset.css +0 -125
  435. package/bizar-dash/src/web/ui/styles/tokens.css +0 -208
  436. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +0 -142
  437. package/bizar-dash/src/web/ui/theme/tokens.ts +0 -131
  438. package/bizar-dash/src/web/ui/theme/useTheme.ts +0 -22
  439. package/bizar-dash/src/web/ui/utils/cx.ts +0 -42
  440. package/bizar-dash/src/web/views/Activity.tsx +0 -1221
  441. package/bizar-dash/src/web/views/Agents.tsx +0 -964
  442. package/bizar-dash/src/web/views/Artifacts.tsx +0 -1494
  443. package/bizar-dash/src/web/views/BackgroundAgents.tsx +0 -822
  444. package/bizar-dash/src/web/views/Chat.tsx +0 -532
  445. package/bizar-dash/src/web/views/Config.tsx +0 -3
  446. package/bizar-dash/src/web/views/Doctor.tsx +0 -317
  447. package/bizar-dash/src/web/views/Eval.tsx +0 -372
  448. package/bizar-dash/src/web/views/EvalReport.tsx +0 -353
  449. package/bizar-dash/src/web/views/GoalPlanner.tsx +0 -158
  450. package/bizar-dash/src/web/views/Harness.tsx +0 -306
  451. package/bizar-dash/src/web/views/History.tsx +0 -353
  452. package/bizar-dash/src/web/views/Memory.tsx +0 -161
  453. package/bizar-dash/src/web/views/MiniMaxUsage.tsx +0 -942
  454. package/bizar-dash/src/web/views/ModView.tsx +0 -207
  455. package/bizar-dash/src/web/views/Mods.tsx +0 -706
  456. package/bizar-dash/src/web/views/Overview.tsx +0 -1364
  457. package/bizar-dash/src/web/views/Providers.tsx +0 -302
  458. package/bizar-dash/src/web/views/Schedules.tsx +0 -902
  459. package/bizar-dash/src/web/views/Settings.tsx +0 -308
  460. package/bizar-dash/src/web/views/Skills.tsx +0 -383
  461. package/bizar-dash/src/web/views/SpawnAgentModal.tsx +0 -221
  462. package/bizar-dash/src/web/views/Tasks.tsx +0 -789
  463. package/bizar-dash/src/web/views/Workspace.tsx +0 -294
  464. package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +0 -844
  465. package/bizar-dash/src/web/views/glyphs/components.tsx +0 -1098
  466. package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +0 -426
  467. package/bizar-dash/src/web/views/memory/FromScreenshotPanel.tsx +0 -23
  468. package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +0 -220
  469. package/bizar-dash/src/web/views/memory/LightragPanel.tsx +0 -310
  470. package/bizar-dash/src/web/views/memory/MemoryGraphLegend.tsx +0 -29
  471. package/bizar-dash/src/web/views/memory/MemoryGraphPanel.tsx +0 -192
  472. package/bizar-dash/src/web/views/memory/MemoryGraphView.tsx +0 -336
  473. package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +0 -367
  474. package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +0 -160
  475. package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +0 -650
  476. package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +0 -197
  477. package/bizar-dash/src/web/views/memory/VaultFromClipboardPanel.tsx +0 -101
  478. package/bizar-dash/src/web/views/settings/ActivitySection.tsx +0 -205
  479. package/bizar-dash/src/web/views/settings/AgentSection.tsx +0 -305
  480. package/bizar-dash/src/web/views/settings/AuthSection.tsx +0 -159
  481. package/bizar-dash/src/web/views/settings/EnvVarsSection.tsx +0 -15
  482. package/bizar-dash/src/web/views/settings/GeneralSection.tsx +0 -128
  483. package/bizar-dash/src/web/views/settings/HeadroomSection.tsx +0 -39
  484. package/bizar-dash/src/web/views/settings/MemorySection.tsx +0 -154
  485. package/bizar-dash/src/web/views/settings/NetworkSection.tsx +0 -87
  486. package/bizar-dash/src/web/views/settings/NotificationsSection.tsx +0 -34
  487. package/bizar-dash/src/web/views/settings/SystemLlmSection.tsx +0 -81
  488. package/bizar-dash/src/web/views/settings/ThemeSection.tsx +0 -168
  489. package/bizar-dash/src/web/views/settings/UpdatesSection.tsx +0 -256
  490. package/bizar-dash/src/web/views/settings/WorkspacesSection.tsx +0 -189
@@ -1,126 +0,0 @@
1
- // src/web/components/agents/CommunicationLog.tsx — inter-agent message bus trace.
2
- //
3
- // v6.4.0 — F-036 (Goal Planner UI). Subscribes to ws.ts for any
4
- // event whose type starts with `agent:` and renders the last 200
5
- // messages with color coding by type. Bounded virtual-list window
6
- // so a runaway stream can't blow up the page.
7
- import { useEffect, useState } from 'react';
8
- import { MessageSquare, ArrowRight } from 'lucide-react';
9
- import { Ws } from '../../lib/ws';
10
- import { Card, CardTitle, CardMeta } from '../Card';
11
- import { Tag } from '../Tag';
12
-
13
- const MAX_ROWS = 200;
14
-
15
- type Entry = {
16
- id: string;
17
- ts: number;
18
- from: string;
19
- to: string;
20
- message: string;
21
- kind: 'info' | 'request' | 'success' | 'warning' | 'error' | 'status' | 'restarted' | 'stuck' | 'message';
22
- raw: unknown;
23
- };
24
-
25
- function classify(t: string): Entry['kind'] {
26
- if (t === 'agent:status') return 'status';
27
- if (t === 'agent:restarted') return 'restarted';
28
- if (t === 'agent:stuck') return 'stuck';
29
- if (t === 'agent:message') return 'message';
30
- return 'info';
31
- }
32
-
33
- function deriveEntry(t: string, payload: Record<string, unknown> | undefined, ts: number): Entry {
34
- const kind = classify(t);
35
- const id = `${ts}-${Math.random().toString(36).slice(2, 7)}`;
36
- if (t === 'agent:message') {
37
- const m = (payload?.message || payload) as Record<string, unknown>;
38
- return {
39
- id,
40
- ts,
41
- from: String(m?.from || 'unknown'),
42
- to: String(m?.to || 'unknown'),
43
- message: String(m?.text || m?.message || JSON.stringify(m).slice(0, 160)),
44
- kind,
45
- raw: payload,
46
- };
47
- }
48
- const agent = (payload?.agent || payload) as Record<string, unknown>;
49
- const name = String(agent?.name || 'agent');
50
- return {
51
- id,
52
- ts,
53
- from: name,
54
- to: kind === 'stuck' ? 'orchestrator' : 'broadcast',
55
- message: `${t} ${agent?.status ? `→ ${agent.status}` : ''}`.trim(),
56
- kind,
57
- raw: payload,
58
- };
59
- }
60
-
61
- interface Props {
62
- /** Override the max row count (default 200). */
63
- maxRows?: number;
64
- }
65
-
66
- export function CommunicationLog({ maxRows = MAX_ROWS }: Props) {
67
- const [rows, setRows] = useState<Entry[]>([]);
68
-
69
- useEffect(() => {
70
- const ws = new Ws();
71
- const off = ws.on((msg) => {
72
- const t = (msg as { type?: string }).type;
73
- if (!t || !t.startsWith('agent:')) return;
74
- const m = msg as { type: string; ts?: number } & Record<string, unknown>;
75
- const ts = Number(m.ts) || Date.now();
76
- setRows((prev) => {
77
- const next = [...prev, deriveEntry(t, m as Record<string, unknown>, ts)];
78
- return next.length > maxRows ? next.slice(next.length - maxRows) : next;
79
- });
80
- });
81
- return () => {
82
- off();
83
- ws.close();
84
- };
85
- }, [maxRows]);
86
-
87
- return (
88
- <Card className="comm-log" data-testid="communication-log">
89
- <div className="comm-log-header">
90
- <CardTitle>
91
- <MessageSquare size={14} aria-hidden /> Communication log
92
- </CardTitle>
93
- <Tag variant="neutral" data-testid="communication-log-count">{rows.length}</Tag>
94
- </div>
95
- <CardMeta>Inter-agent message bus trace · bounded to {maxRows} rows</CardMeta>
96
- <ul className="comm-log-list" data-testid="communication-log-list">
97
- {rows.length === 0 && (
98
- <li className="comm-log-empty" data-testid="communication-log-empty">
99
- No agent messages yet. Stream will appear here live.
100
- </li>
101
- )}
102
- {rows.slice().reverse().map((row) => (
103
- <li
104
- key={row.id}
105
- className={`comm-log-row is-${row.kind}`}
106
- data-testid="communication-log-row"
107
- data-kind={row.kind}
108
- >
109
- <div className="comm-log-row-meta">
110
- <span className="comm-log-from">{row.from}</span>
111
- <ArrowRight size={12} aria-hidden />
112
- <span className="comm-log-to">{row.to}</span>
113
- <Tag variant="neutral" className={`comm-log-kind is-${row.kind}`}>{row.kind}</Tag>
114
- <time className="comm-log-time" dateTime={new Date(row.ts).toISOString()}>
115
- {new Date(row.ts).toLocaleTimeString()}
116
- </time>
117
- </div>
118
- <div className="comm-log-message">{row.message}</div>
119
- </li>
120
- ))}
121
- </ul>
122
- </Card>
123
- );
124
- }
125
-
126
- export default CommunicationLog;
@@ -1,163 +0,0 @@
1
- // src/web/components/agents/DependencyGraph.tsx — DAG of plan step dependencies.
2
- //
3
- // v6.4.0 — F-036 (Goal Planner UI). Uses @xyflow/react (already in
4
- // Bizar deps) to render the plan's step graph. Falls back to a
5
- // hand-rolled table when no plan is supplied.
6
- import { useMemo } from 'react';
7
- import {
8
- ReactFlow,
9
- Background,
10
- Controls,
11
- MiniMap,
12
- type Node,
13
- type Edge,
14
- type NodeProps,
15
- Handle,
16
- Position,
17
- } from '@xyflow/react';
18
- import '@xyflow/react/dist/style.css';
19
- import { GitBranch } from 'lucide-react';
20
- import { Card, CardTitle, CardMeta } from '../Card';
21
- import { Tag } from '../Tag';
22
- import type { Plan } from '../../lib/goapPlanner';
23
-
24
- interface Props {
25
- plan: Plan | null;
26
- }
27
-
28
- function StepNode({ data }: NodeProps<Node<{ label: string; action: string; agent: string }>>) {
29
- return (
30
- <div className={`dep-node is-${(data as { action?: string }).action || 'research'}`}>
31
- <Handle type="target" position={Position.Left} className="dep-handle" />
32
- <div className="dep-node-action">{(data as { action?: string }).action}</div>
33
- <div className="dep-node-label">{(data as { label?: string }).label}</div>
34
- <div className="dep-node-agent">@{(data as { agent?: string }).agent}</div>
35
- <Handle type="source" position={Position.Right} className="dep-handle" />
36
- </div>
37
- );
38
- }
39
-
40
- const nodeTypes = { step: StepNode };
41
-
42
- export function DependencyGraph({ plan }: Props) {
43
- const nodes: Node[] = useMemo(() => {
44
- if (!plan) return [];
45
- const n = plan.steps.length;
46
- // Lay out nodes in a horizontal flow based on dep depth.
47
- const depths = new Map<string, number>();
48
- const computeDepth = (id: string, stack = new Set<string>()): number => {
49
- const cached = depths.get(id);
50
- if (cached !== undefined) return cached;
51
- if (stack.has(id)) return 0;
52
- stack.add(id);
53
- const step = plan.steps.find((s) => s.id === id);
54
- if (!step || step.deps.length === 0) {
55
- depths.set(id, 0);
56
- stack.delete(id);
57
- return 0;
58
- }
59
- let max = 0;
60
- for (const dep of step.deps) {
61
- const d = computeDepth(dep, stack);
62
- if (d > max) max = d;
63
- }
64
- depths.set(id, max + 1);
65
- stack.delete(id);
66
- return max + 1;
67
- };
68
- for (const s of plan.steps) computeDepth(s.id);
69
-
70
- const byDepth = new Map<number, string[]>();
71
- for (const s of plan.steps) {
72
- const d = depths.get(s.id) ?? 0;
73
- const arr = byDepth.get(d) || [];
74
- arr.push(s.id);
75
- byDepth.set(d, arr);
76
- }
77
- const nodesOut: Node[] = [];
78
- for (const [depth, ids] of byDepth) {
79
- const total = ids.length;
80
- ids.forEach((id, i) => {
81
- const step = plan.steps.find((s) => s.id === id);
82
- if (!step) return;
83
- const xOffset = 60 + depth * 220;
84
- const yOffset = 40 + (i - (total - 1) / 2) * 90;
85
- nodesOut.push({
86
- id: step.id,
87
- type: 'step',
88
- position: { x: xOffset, y: yOffset },
89
- data: {
90
- label: step.title,
91
- action: step.action,
92
- agent: step.agent,
93
- },
94
- });
95
- });
96
- }
97
- void n;
98
- return nodesOut;
99
- }, [plan]);
100
-
101
- const edges: Edge[] = useMemo(() => {
102
- if (!plan) return [];
103
- return plan.steps.flatMap((step) =>
104
- step.deps.map((dep) => ({
105
- id: `${dep}->${step.id}`,
106
- source: dep,
107
- target: step.id,
108
- animated: true,
109
- })),
110
- );
111
- }, [plan]);
112
-
113
- if (!plan) {
114
- return (
115
- <Card className="dep-graph" data-testid="dep-graph">
116
- <CardTitle>
117
- <GitBranch size={14} aria-hidden /> Dependency graph
118
- </CardTitle>
119
- <CardMeta>Submit a goal to render the dependency DAG.</CardMeta>
120
- </Card>
121
- );
122
- }
123
-
124
- if (plan.steps.length === 0) {
125
- return (
126
- <Card className="dep-graph" data-testid="dep-graph">
127
- <CardTitle>
128
- <GitBranch size={14} aria-hidden /> Dependency graph
129
- </CardTitle>
130
- <CardMeta>Empty plan — nothing to render.</CardMeta>
131
- </Card>
132
- );
133
- }
134
-
135
- return (
136
- <Card className="dep-graph" data-testid="dep-graph">
137
- <div className="dep-graph-header">
138
- <CardTitle>
139
- <GitBranch size={14} aria-hidden /> Dependency graph
140
- </CardTitle>
141
- <Tag variant="info">{plan.steps.length} nodes</Tag>
142
- <Tag variant="accent">{edges.length} edges</Tag>
143
- </div>
144
- <CardMeta>Plan step DAG · {plan.goal.slice(0, 80)}</CardMeta>
145
- <div className="dep-graph-canvas" data-testid="dep-graph-canvas">
146
- <ReactFlow
147
- nodes={nodes}
148
- edges={edges}
149
- nodeTypes={nodeTypes}
150
- fitView
151
- fitViewOptions={{ padding: 0.15 }}
152
- proOptions={{ hideAttribution: true }}
153
- >
154
- <Background gap={16} size={1} />
155
- <Controls showInteractive={false} />
156
- <MiniMap pannable zoomable />
157
- </ReactFlow>
158
- </div>
159
- </Card>
160
- );
161
- }
162
-
163
- export default DependencyGraph;
@@ -1,123 +0,0 @@
1
- // src/web/components/agents/QualityGates.tsx — pass/fail rubric display.
2
- //
3
- // v6.4.0 — F-036 (Goal Planner UI). Scores the four L09 rubric
4
- // dimensions (Correctness / Arch compliance / Test coverage /
5
- // Verification evidence) against the live plan. Each gate turns
6
- // green when the supplied metric meets the threshold documented in
7
- // `templates/evaluator-rubric.md`.
8
- import { Shield, CheckCircle2, XCircle, AlertTriangle } from 'lucide-react';
9
- import { Card, CardTitle, CardMeta } from '../Card';
10
- import { Tag } from '../Tag';
11
- import type { Plan } from '../../lib/goapPlanner';
12
-
13
- interface Metrics {
14
- /** 0 or 1 — whether `make check` is green. */
15
- compileCheck: boolean;
16
- /** Percentage of touched tests passing. */
17
- testCoverage: number;
18
- /** Percentage of arch-rules passing. */
19
- archScore: number;
20
- /** Verification evidence (commit hash or test output) present. */
21
- evidencePresent: boolean;
22
- }
23
-
24
- interface GateRow {
25
- name: string;
26
- status: 'passed' | 'warning' | 'failed';
27
- value?: number | boolean;
28
- threshold?: number | boolean;
29
- detail: string;
30
- }
31
-
32
- interface Props {
33
- plan: Plan | null;
34
- metrics: Metrics;
35
- }
36
-
37
- function evaluate(metrics: Metrics): GateRow[] {
38
- const compile: GateRow = metrics.compileCheck
39
- ? { name: 'Compile check', status: 'passed', value: true, threshold: true, detail: 'make check is green.' }
40
- : { name: 'Compile check', status: 'failed', value: false, threshold: true, detail: 'Typecheck error — fix before marking passing.' };
41
-
42
- const coverage: GateRow = metrics.testCoverage >= 80
43
- ? { name: 'Test coverage', status: 'passed', value: metrics.testCoverage, threshold: 80, detail: 'Coverage meets the B-grade threshold.' }
44
- : metrics.testCoverage >= 60
45
- ? { name: 'Test coverage', status: 'warning', value: metrics.testCoverage, threshold: 80, detail: 'Coverage is below the B-grade threshold.' }
46
- : { name: 'Test coverage', status: 'failed', value: metrics.testCoverage, threshold: 80, detail: 'Coverage is critical.' };
47
-
48
- const arch: GateRow = metrics.archScore >= 90
49
- ? { name: 'Arch compliance', status: 'passed', value: metrics.archScore, threshold: 90, detail: 'All non-trivial arch-rules satisfied.' }
50
- : metrics.archScore >= 70
51
- ? { name: 'Arch compliance', status: 'warning', value: metrics.archScore, threshold: 90, detail: 'Minor arch-rule violations.' }
52
- : { name: 'Arch compliance', status: 'failed', value: metrics.archScore, threshold: 90, detail: 'Multiple arch-rule violations.' };
53
-
54
- const evidence: GateRow = metrics.evidencePresent
55
- ? { name: 'Verification evidence', status: 'passed', value: true, threshold: true, detail: 'Test output + commit hash captured.' }
56
- : { name: 'Verification evidence', status: 'failed', value: false, threshold: true, detail: 'No evidence recorded yet.' };
57
-
58
- return [compile, coverage, arch, evidence];
59
- }
60
-
61
- function GateIcon({ status }: { status: GateRow['status'] }) {
62
- if (status === 'passed') return <CheckCircle2 size={14} className="qg-icon is-pass" />;
63
- if (status === 'warning') return <AlertTriangle size={14} className="qg-icon is-warn" />;
64
- return <XCircle size={14} className="qg-icon is-fail" />;
65
- }
66
-
67
- function GateTag({ status }: { status: GateRow['status'] }) {
68
- if (status === 'passed') return <Tag variant="success">passed</Tag>;
69
- if (status === 'warning') return <Tag variant="warning">warning</Tag>;
70
- return <Tag variant="error">failed</Tag>;
71
- }
72
-
73
- export function QualityGates({ plan, metrics }: Props) {
74
- const gates = evaluate(metrics);
75
- const passing = gates.filter((g) => g.status === 'passed').length;
76
- return (
77
- <Card className="qg-panel" data-testid="quality-gates">
78
- <div className="qg-header">
79
- <CardTitle>
80
- <Shield size={14} aria-hidden /> Quality gates
81
- </CardTitle>
82
- <Tag variant={passing === gates.length ? 'success' : passing > 0 ? 'warning' : 'error'}>
83
- {passing}/{gates.length} passing
84
- </Tag>
85
- </div>
86
- <CardMeta>
87
- L09 rubric (Correctness / Arch compliance / Test coverage / Verification evidence) —{' '}
88
- {plan ? `evaluating against plan with ${plan.steps.length} steps.` : 'awaiting plan.'}
89
- </CardMeta>
90
- <ul className="qg-list" data-testid="quality-gates-list">
91
- {gates.map((gate) => (
92
- <li
93
- key={gate.name}
94
- className={`qg-row is-${gate.status}`}
95
- data-testid="quality-gates-row"
96
- data-status={gate.status}
97
- >
98
- <div className="qg-row-head">
99
- <GateIcon status={gate.status} />
100
- <span className="qg-name">{gate.name}</span>
101
- <GateTag status={gate.status} />
102
- </div>
103
- <div className="qg-row-body">
104
- <span className="qg-detail">{gate.detail}</span>
105
- {typeof gate.value === 'number' && (
106
- <span className="qg-threshold">
107
- current: {gate.value}% · threshold: {gate.threshold}%
108
- </span>
109
- )}
110
- {typeof gate.value === 'boolean' && (
111
- <span className="qg-threshold">
112
- current: {String(gate.value)} · threshold: {String(gate.threshold)}
113
- </span>
114
- )}
115
- </div>
116
- </li>
117
- ))}
118
- </ul>
119
- </Card>
120
- );
121
- }
122
-
123
- export default QualityGates;
@@ -1,127 +0,0 @@
1
- // src/web/components/agents/RealTimeEventLog.tsx — streaming event ticker.
2
- //
3
- // v6.4.0 — F-036 (Goal Planner UI). Subscribes to ws.ts for ALL
4
- // events and renders a color-coded ticker. Bounded ring buffer so
5
- // a runaway server can't fill memory.
6
- import { useEffect, useMemo, useState } from 'react';
7
- import { Activity } from 'lucide-react';
8
- import { Ws } from '../../lib/ws';
9
- import { Card, CardTitle, CardMeta } from '../Card';
10
- import { Tag } from '../Tag';
11
-
12
- const MAX_ROWS = 500;
13
-
14
- type EventRow = {
15
- id: string;
16
- ts: number;
17
- type: string;
18
- severity: 'info' | 'success' | 'warning' | 'error' | 'control';
19
- preview: string;
20
- };
21
-
22
- function severityFor(type: string): EventRow['severity'] {
23
- if (type.startsWith('goal:')) return 'success';
24
- if (type.startsWith('task:')) return 'info';
25
- if (type.includes('error') || type.includes('fail')) return 'error';
26
- if (type.includes('stuck') || type.includes('blocked') || type.includes('warn')) return 'warning';
27
- if (type === 'ping' || type === 'pong' || type === 'refresh') return 'control';
28
- return 'info';
29
- }
30
-
31
- function previewOf(type: string, payload: Record<string, unknown> | undefined): string {
32
- if (!payload) return type;
33
- const keys = Object.keys(payload).slice(0, 3);
34
- return keys.map((k) => `${k}=${shortVal(payload[k])}`).join(' ') || type;
35
- }
36
-
37
- function shortVal(v: unknown): string {
38
- if (v == null) return 'null';
39
- if (typeof v === 'string') return v.length > 20 ? `"${v.slice(0, 20)}…"` : `"${v}"`;
40
- if (typeof v === 'number' || typeof v === 'boolean') return String(v);
41
- if (Array.isArray(v)) return `[${v.length}]`;
42
- if (typeof v === 'object') return `{${Object.keys(v).length}}`;
43
- return String(v);
44
- }
45
-
46
- export function RealTimeEventLog() {
47
- const [rows, setRows] = useState<EventRow[]>([]);
48
-
49
- useEffect(() => {
50
- const ws = new Ws();
51
- const off = ws.on((msg) => {
52
- const m = msg as { type?: string; ts?: number } & Record<string, unknown>;
53
- const t = m.type;
54
- if (!t) return;
55
- const ts = Number(m.ts) || Date.now();
56
- const row: EventRow = {
57
- id: `${ts}-${Math.random().toString(36).slice(2, 7)}`,
58
- ts,
59
- type: t,
60
- severity: severityFor(t),
61
- preview: previewOf(t, m as Record<string, unknown>),
62
- };
63
- setRows((prev) => {
64
- const next = [...prev, row];
65
- return next.length > MAX_ROWS ? next.slice(next.length - MAX_ROWS) : next;
66
- });
67
- });
68
- return () => {
69
- off();
70
- ws.close();
71
- };
72
- }, []);
73
-
74
- const summary = useMemo(() => {
75
- const counts: Record<EventRow['severity'], number> = {
76
- info: 0,
77
- success: 0,
78
- warning: 0,
79
- error: 0,
80
- control: 0,
81
- };
82
- for (const r of rows) counts[r.severity] += 1;
83
- return counts;
84
- }, [rows]);
85
-
86
- return (
87
- <Card className="event-log" data-testid="event-log">
88
- <div className="event-log-header">
89
- <CardTitle>
90
- <Activity size={14} aria-hidden /> Real-time events
91
- </CardTitle>
92
- <Tag variant="neutral" data-testid="event-log-count">{rows.length}</Tag>
93
- </div>
94
- <CardMeta>Live WebSocket event ticker · bounded to {MAX_ROWS} rows</CardMeta>
95
- <div className="event-log-summary" data-testid="event-log-summary">
96
- <Tag variant="info">info {summary.info}</Tag>
97
- <Tag variant="success">success {summary.success}</Tag>
98
- <Tag variant="warning">warning {summary.warning}</Tag>
99
- <Tag variant="error">error {summary.error}</Tag>
100
- <Tag variant="neutral">control {summary.control}</Tag>
101
- </div>
102
- <ul className="event-log-list" data-testid="event-log-list">
103
- {rows.length === 0 && (
104
- <li className="event-log-empty" data-testid="event-log-empty">
105
- No events yet. Events will stream here as the server emits them.
106
- </li>
107
- )}
108
- {rows.slice().reverse().map((row) => (
109
- <li
110
- key={row.id}
111
- className={`event-log-row is-${row.severity}`}
112
- data-testid="event-log-row"
113
- data-severity={row.severity}
114
- >
115
- <time className="event-log-time" dateTime={new Date(row.ts).toISOString()}>
116
- {new Date(row.ts).toLocaleTimeString()}
117
- </time>
118
- <code className="event-log-type">{row.type}</code>
119
- <span className="event-log-preview">{row.preview}</span>
120
- </li>
121
- ))}
122
- </ul>
123
- </Card>
124
- );
125
- }
126
-
127
- export default RealTimeEventLog;
@@ -1,148 +0,0 @@
1
- /**
2
- * src/web/components/agents/RoutingDecisions.test.tsx
3
- *
4
- * F-035 — vitest tests for the routing-decisions panel.
5
- * 3 tests required by the F-035 layers[] spec:
6
- * 1. renders the empty state when no decisions have been emitted
7
- * 2. renders a single decision via the `initial` prop
8
- * 3. renders multiple decisions via the WS subscription path
9
- *
10
- * The `subscribe` prop receives a `(msg: WsMessage) => void` handler
11
- * and returns an unsubscribe function. We capture the handler and
12
- * drive it directly — no real WebSocket needed.
13
- */
14
-
15
- import { describe, it, expect, vi } from 'vitest';
16
- import { render, screen, fireEvent, act, waitFor } from '@testing-library/react';
17
- import React from 'react';
18
- import { RoutingDecisions } from './RoutingDecisions';
19
- import type { RoutingDecision, WsMessage } from '../../lib/types';
20
-
21
- const dec = (id: string, tier: RoutingDecision['tier'], model: string, extras: Partial<RoutingDecision> = {}): RoutingDecision => ({
22
- id,
23
- ts: 1_700_000_000_000 + Number(id.replace(/\D/g, '') || 0) * 1000,
24
- tier,
25
- model,
26
- task: `task-${id}`,
27
- costUsd: tier === 'CODEMOD' ? 0 : 0.01,
28
- latencyMs: 250,
29
- ...extras,
30
- });
31
-
32
- describe('RoutingDecisions', () => {
33
- it('renders the empty state when no decisions have been emitted', () => {
34
- render(<RoutingDecisions />);
35
- const empty = screen.getByTestId('routing-decisions-empty');
36
- expect(empty).toBeTruthy();
37
- expect(empty.textContent).toMatch(/No routing decisions yet/i);
38
- // Confirm table is NOT rendered in empty state.
39
- expect(screen.queryByRole('table')).toBeNull();
40
- });
41
-
42
- it('renders a single decision via the initial prop', () => {
43
- const one = dec('1', 'CODEMOD', 'codemod:var-to-const');
44
- render(<RoutingDecisions initial={[one]} />);
45
-
46
- // Tier badge with the right class
47
- const row = screen.getByTestId(`routing-row-${one.id}`);
48
- expect(row).toBeTruthy();
49
- const badge = row.querySelector('.routing-tier-codemod');
50
- expect(badge).toBeTruthy();
51
- expect(badge?.textContent).toBe('CODEMOD');
52
-
53
- // Model + task + cost columns
54
- expect(row.querySelector('.routing-model')?.textContent).toBe('codemod:var-to-const');
55
- expect(row.querySelector('.routing-task')?.textContent).toBe('task-1');
56
- expect(row.querySelector('.routing-cost')?.textContent).toBe('$0');
57
- // latency = 250ms → "250ms"
58
- expect(row.querySelector('.routing-latency')?.textContent).toBe('250ms');
59
- });
60
-
61
- it('renders multiple decisions and filters by tier', () => {
62
- const list: RoutingDecision[] = [
63
- dec('1', 'CODEMOD', 'codemod:remove-console', { costUsd: 0 }),
64
- dec('2', 'TIER1', 'haiku', { costUsd: 0.0008 }),
65
- dec('3', 'TIER2', 'sonnet', { costUsd: 0.012 }),
66
- dec('4', 'TIER3', 'opus', { costUsd: 0.05 }),
67
- ];
68
-
69
- const { rerender } = render(<RoutingDecisions initial={list} />);
70
- // All four rows present
71
- for (const d of list) {
72
- expect(screen.getByTestId(`routing-row-${d.id}`)).toBeTruthy();
73
- }
74
-
75
- // Tier filter — only TIER2 row survives
76
- rerender(<RoutingDecisions initial={list} filterTier="TIER2" />);
77
- expect(screen.getByTestId('routing-row-3')).toBeTruthy();
78
- expect(screen.queryByTestId('routing-row-1')).toBeNull();
79
- expect(screen.queryByTestId('routing-row-2')).toBeNull();
80
- expect(screen.queryByTestId('routing-row-4')).toBeNull();
81
-
82
- // Subscribed WS append test — drive a `routing:decision` through
83
- // the captured handler.
84
- let capturedHandler: ((msg: WsMessage) => void) | null = null;
85
- const subscribe = (handler: (msg: WsMessage) => void) => {
86
- capturedHandler = handler;
87
- return () => { capturedHandler = null; };
88
- };
89
- const appended: RoutingDecision[] = [];
90
- const onAppend = (d: RoutingDecision) => appended.push(d);
91
-
92
- rerender(
93
- <RoutingDecisions
94
- initial={list}
95
- subscribe={subscribe}
96
- onAppend={onAppend}
97
- filterTier="ALL"
98
- />,
99
- );
100
- expect(capturedHandler).toBeTruthy();
101
- const fresh = dec('5', 'TIER3', 'opus-2', { costUsd: 0.07, latencyMs: 1200 });
102
- // Drive the handler inside act() so React commits the setDecisions.
103
- act(() => {
104
- capturedHandler!({ type: 'routing:decision', decision: fresh });
105
- });
106
- expect(screen.getByTestId('routing-row-5')).toBeTruthy();
107
- expect(appended).toHaveLength(1);
108
- expect(appended[0].id).toBe('5');
109
-
110
- // Malformed message should be ignored (no `routing:decision` type).
111
- capturedHandler!({ type: 'tasks:change', task: {} as never });
112
- expect(screen.queryByTestId('routing-row-')).toBeNull();
113
-
114
- // Empty filterTier = 'ALL' shows everything
115
- rerender(<RoutingDecisions initial={list} filterTier="ALL" />);
116
- for (const d of list) {
117
- expect(screen.getByTestId(`routing-row-${d.id}`)).toBeTruthy();
118
- }
119
- });
120
-
121
- it('respects maxRows by pruning oldest decisions', () => {
122
- // The component treats `initial` as most-recent-first (same
123
- // convention as the WS stream). Build the list newest-first so
124
- // maxRows=3 keeps the last 3 items from the array (the newest).
125
- const list: RoutingDecision[] = [
126
- dec('5', 'TIER1', 'haiku'),
127
- dec('4', 'TIER1', 'haiku'),
128
- dec('3', 'TIER1', 'haiku'),
129
- dec('2', 'TIER1', 'haiku'),
130
- dec('1', 'TIER1', 'haiku'),
131
- ];
132
- render(<RoutingDecisions initial={list} maxRows={3} />);
133
- // Only 3 of 5 should be visible (most-recent first)
134
- expect(screen.getByTestId('routing-row-5')).toBeTruthy();
135
- expect(screen.getByTestId('routing-row-4')).toBeTruthy();
136
- expect(screen.getByTestId('routing-row-3')).toBeTruthy();
137
- expect(screen.queryByTestId('routing-row-2')).toBeNull();
138
- expect(screen.queryByTestId('routing-row-1')).toBeNull();
139
- });
140
-
141
- it('compact prop toggles a different class', () => {
142
- const one = dec('1', 'CODEMOD', 'codemod:add-logging');
143
- const { container, rerender } = render(<RoutingDecisions initial={[one]} />);
144
- expect(container.querySelector('.routing-decisions-compact')).toBeNull();
145
- rerender(<RoutingDecisions initial={[one]} compact />);
146
- expect(container.querySelector('.routing-decisions-compact')).toBeTruthy();
147
- });
148
- });