@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,336 +0,0 @@
1
- // src/web/views/memory/MemoryGraphView.tsx — Interactive SVG knowledge graph.
2
- //
3
- // No external graph library. Hand-rolled force-directed layout + SVG rendering.
4
- // Pan: drag on canvas. Zoom: scroll wheel. Click node: onNodeClick callback.
5
-
6
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
- import { cn } from '../../lib/utils';
8
-
9
- export type GraphNode = {
10
- id: string;
11
- label: string;
12
- type: string;
13
- size: number;
14
- group: string;
15
- };
16
-
17
- export type GraphEdge = {
18
- source: string;
19
- target: string;
20
- type: string;
21
- weight: number;
22
- };
23
-
24
- export type GraphData = {
25
- nodes: GraphNode[];
26
- edges: GraphEdge[];
27
- };
28
-
29
- type Props = {
30
- data: GraphData;
31
- onNodeClick?: (node: GraphNode) => void;
32
- className?: string;
33
- };
34
-
35
- type LayoutNode = GraphNode & {
36
- x: number;
37
- y: number;
38
- vx: number;
39
- vy: number;
40
- };
41
-
42
- const CANVAS_SIZE = 800;
43
- const ITERATIONS = 60;
44
-
45
- const GROUP_COLORS: Record<string, string> = {
46
- default: '#8b5cf6',
47
- note: '#8b5cf6',
48
- entity: '#34d399',
49
- concept: '#fbbf24',
50
- root: '#f87171',
51
- };
52
-
53
- function getGroupColor(group: string, type: string): string {
54
- return GROUP_COLORS[group] || GROUP_COLORS[type] || GROUP_COLORS.default;
55
- }
56
-
57
- function nodeRadius(node: GraphNode): number {
58
- return 6 + Math.min(node.size * 2, 10);
59
- }
60
-
61
- /**
62
- * Simple force-directed layout.
63
- * - Repulsion between all node pairs
64
- * - Spring attraction along edges
65
- * - Center gravity
66
- */
67
- function layoutNodes(nodes: GraphNode[], edges: GraphEdge[]): LayoutNode[] {
68
- if (nodes.length === 0) return [];
69
-
70
- // Build adjacency list.
71
- const adj = new Map<string, Set<string>>();
72
- for (const n of nodes) adj.set(n.id, new Set());
73
- for (const e of edges) {
74
- adj.get(e.source)?.add(e.target);
75
- adj.get(e.target)?.add(e.source);
76
- }
77
-
78
- // Initialise positions in a circle.
79
- const layout: LayoutNode[] = nodes.map((n, i) => {
80
- const angle = (i / nodes.length) * Math.PI * 2;
81
- const r = CANVAS_SIZE * 0.28;
82
- return {
83
- ...n,
84
- x: CANVAS_SIZE / 2 + r * Math.cos(angle) + (Math.random() - 0.5) * 40,
85
- y: CANVAS_SIZE / 2 + r * Math.sin(angle) + (Math.random() - 0.5) * 40,
86
- vx: 0,
87
- vy: 0,
88
- };
89
- });
90
-
91
- const pos = new Map<string, LayoutNode>();
92
- for (const l of layout) pos.set(l.id, l);
93
-
94
- for (let iter = 0; iter < ITERATIONS; iter++) {
95
- const t = 1 - iter / ITERATIONS; // cooling
96
-
97
- // Repulsion (Coulomb's law).
98
- for (let i = 0; i < layout.length; i++) {
99
- for (let j = i + 1; j < layout.length; j++) {
100
- const a = layout[i];
101
- const b = layout[j];
102
- const dx = b.x - a.x;
103
- const dy = b.y - a.y;
104
- const dist = Math.sqrt(dx * dx + dy * dy) || 1;
105
- const force = (400 * t) / (dist * dist);
106
- const fx = (dx / dist) * force;
107
- const fy = (dy / dist) * force;
108
- a.vx -= fx;
109
- a.vy -= fy;
110
- b.vx += fx;
111
- b.vy += fy;
112
- }
113
- }
114
-
115
- // Spring attraction along edges.
116
- for (const e of edges) {
117
- const a = pos.get(e.source);
118
- const b = pos.get(e.target);
119
- if (!a || !b) continue;
120
- const dx = b.x - a.x;
121
- const dy = b.y - a.y;
122
- const dist = Math.sqrt(dx * dx + dy * dy) || 1;
123
- const ideal = 80;
124
- const force = (dist - ideal) * 0.08 * t;
125
- const fx = (dx / dist) * force;
126
- const fy = (dy / dist) * force;
127
- a.vx += fx;
128
- a.vy += fy;
129
- b.vx -= fx;
130
- b.vy -= fy;
131
- }
132
-
133
- // Center gravity.
134
- const cx = CANVAS_SIZE / 2;
135
- const cy = CANVAS_SIZE / 2;
136
- for (const l of layout) {
137
- l.vx += (cx - l.x) * 0.01 * t;
138
- l.vy += (cy - l.y) * 0.01 * t;
139
- }
140
-
141
- // Apply velocity with damping.
142
- for (const l of layout) {
143
- l.vx *= 0.85;
144
- l.vy *= 0.85;
145
- l.x += l.vx;
146
- l.y += l.vy;
147
- // Clamp to canvas.
148
- l.x = Math.max(20, Math.min(CANVAS_SIZE - 20, l.x));
149
- l.y = Math.max(20, Math.min(CANVAS_SIZE - 20, l.y));
150
- }
151
- }
152
-
153
- return layout;
154
- }
155
-
156
- export function MemoryGraphView({ data, onNodeClick, className }: Props) {
157
- const svgRef = useRef<SVGSVGElement>(null);
158
-
159
- // Pan/zoom state.
160
- const [transform, setTransform] = useState({ x: 0, y: 0, scale: 1 });
161
- const dragging = useRef(false);
162
- const dragStart = useRef({ x: 0, y: 0, tx: 0, ty: 0 });
163
- const lastTouchDist = useRef<number | null>(null);
164
-
165
- const [selectedId, setSelectedId] = useState<string | null>(null);
166
- const [hoveredId, setHoveredId] = useState<string | null>(null);
167
-
168
- // Compute layout once.
169
- const layout = useMemo(() => layoutNodes(data.nodes, data.edges), [data.nodes, data.edges]);
170
-
171
- const nodeMap = useMemo(() => {
172
- const m = new Map<string, LayoutNode>();
173
- for (const l of layout) m.set(l.id, l);
174
- return m;
175
- }, [layout]);
176
-
177
- // Pan handlers.
178
- const onMouseDown = useCallback((e: React.MouseEvent<SVGSVGElement>) => {
179
- if ((e.target as Element).closest('.memory-graph-node')) return;
180
- dragging.current = true;
181
- dragStart.current = { x: e.clientX, y: e.clientY, tx: transform.x, ty: transform.y };
182
- }, [transform]);
183
-
184
- const onMouseMove = useCallback((e: React.MouseEvent<SVGSVGElement>) => {
185
- if (!dragging.current) return;
186
- const dx = e.clientX - dragStart.current.x;
187
- const dy = e.clientY - dragStart.current.y;
188
- setTransform((t) => ({ ...t, x: dragStart.current.tx + dx, y: dragStart.current.ty + dy }));
189
- }, []);
190
-
191
- const onMouseUp = useCallback(() => {
192
- dragging.current = false;
193
- }, []);
194
-
195
- // Zoom handlers.
196
- const onWheel = useCallback((e: React.WheelEvent<SVGSVGElement>) => {
197
- e.preventDefault();
198
- const factor = e.deltaY < 0 ? 1.1 : 0.9;
199
- const svg = svgRef.current;
200
- if (!svg) return;
201
- const rect = svg.getBoundingClientRect();
202
- const mx = e.clientX - rect.left;
203
- const my = e.clientY - rect.top;
204
- setTransform((t) => {
205
- const newScale = Math.max(0.2, Math.min(4, t.scale * factor));
206
- const scaleChange = newScale / t.scale;
207
- return {
208
- x: mx - (mx - t.x) * scaleChange,
209
- y: my - (my - t.y) * scaleChange,
210
- scale: newScale,
211
- };
212
- });
213
- }, []);
214
-
215
- // Touch zoom.
216
- const onTouchStart = useCallback((e: React.TouchEvent<SVGSVGElement>) => {
217
- const touches = Array.from(e.touches);
218
- if (touches.length === 2) {
219
- const [t0, t1] = touches;
220
- lastTouchDist.current = Math.hypot(t1.clientX - t0.clientX, t1.clientY - t0.clientY);
221
- } else if (touches.length === 1) {
222
- dragging.current = true;
223
- dragStart.current = { x: touches[0].clientX, y: touches[0].clientY, tx: transform.x, ty: transform.y };
224
- }
225
- }, [transform]);
226
-
227
- const onTouchMove = useCallback((e: React.TouchEvent<SVGSVGElement>) => {
228
- const touches = Array.from(e.touches);
229
- if (touches.length === 2 && lastTouchDist.current !== null) {
230
- const [t0, t1] = touches;
231
- const dist = Math.hypot(t1.clientX - t0.clientX, t1.clientY - t0.clientY);
232
- const factor = dist / lastTouchDist.current;
233
- lastTouchDist.current = dist;
234
- setTransform((t) => ({ ...t, scale: Math.max(0.2, Math.min(4, t.scale * factor)) }));
235
- } else if (touches.length === 1 && dragging.current) {
236
- const dx = touches[0].clientX - dragStart.current.x;
237
- const dy = touches[0].clientY - dragStart.current.y;
238
- setTransform((t) => ({ ...t, x: dragStart.current.tx + dx, y: dragStart.current.ty + dy }));
239
- }
240
- }, []);
241
-
242
- const onTouchEnd = useCallback(() => {
243
- dragging.current = false;
244
- lastTouchDist.current = null;
245
- }, []);
246
-
247
- const handleNodeClick = useCallback((node: LayoutNode) => {
248
- setSelectedId(node.id === selectedId ? null : node.id);
249
- onNodeClick?.(node);
250
- }, [selectedId, onNodeClick]);
251
-
252
- const strokeWidth = Math.max(0.5, 1 / Math.log2(transform.scale + 1));
253
-
254
- return (
255
- <svg
256
- ref={svgRef}
257
- className={cn('memory-graph-canvas', className)}
258
- viewBox={`0 0 ${CANVAS_SIZE} ${CANVAS_SIZE}`}
259
- style={{ width: '100%', height: '100%', minHeight: 400, cursor: dragging.current ? 'grabbing' : 'grab' }}
260
- onMouseDown={onMouseDown}
261
- onMouseMove={onMouseMove}
262
- onMouseUp={onMouseUp}
263
- onMouseLeave={onMouseUp}
264
- onWheel={onWheel}
265
- onTouchStart={onTouchStart}
266
- onTouchMove={onTouchMove}
267
- onTouchEnd={onTouchEnd}
268
- >
269
- <g transform={`translate(${transform.x},${transform.y}) scale(${transform.scale})`}>
270
- {/* Edges */}
271
- {data.edges.map((edge, i) => {
272
- const src = nodeMap.get(edge.source);
273
- const tgt = nodeMap.get(edge.target);
274
- if (!src || !tgt) return null;
275
- const isHighlighted = hoveredId === edge.source || hoveredId === edge.target || selectedId === edge.source || selectedId === edge.target;
276
- return (
277
- <line
278
- key={`e-${i}`}
279
- x1={src.x} y1={src.y}
280
- x2={tgt.x} y2={tgt.y}
281
- stroke={isHighlighted ? '#8b5cf6' : '#2d3648'}
282
- strokeWidth={isHighlighted ? strokeWidth * 2 : strokeWidth}
283
- strokeOpacity={isHighlighted ? 0.9 : 0.5}
284
- />
285
- );
286
- })}
287
-
288
- {/* Nodes */}
289
- {layout.map((node) => {
290
- const r = nodeRadius(node);
291
- const color = getGroupColor(node.group, node.type);
292
- const isSelected = selectedId === node.id;
293
- const isHovered = hoveredId === node.id;
294
- return (
295
- <g
296
- key={node.id}
297
- className="memory-graph-node"
298
- transform={`translate(${node.x},${node.y})`}
299
- onClick={() => handleNodeClick(node)}
300
- onMouseEnter={() => setHoveredId(node.id)}
301
- onMouseLeave={() => setHoveredId(null)}
302
- style={{ cursor: 'pointer' }}
303
- >
304
- {/* Hit area */}
305
- <circle r={r + 6} fill="transparent" />
306
- {/* Glow when selected/hovered */}
307
- {(isSelected || isHovered) && (
308
- <circle r={r + 4} fill={color} fillOpacity={0.2} />
309
- )}
310
- {/* Main circle */}
311
- <circle
312
- r={r}
313
- fill={color}
314
- fillOpacity={isSelected ? 1 : 0.75}
315
- stroke={isSelected ? '#fff' : color}
316
- strokeWidth={isSelected ? 2 : 1}
317
- />
318
- {/* Label */}
319
- {transform.scale > 0.5 && (
320
- <text
321
- y={r + 12}
322
- textAnchor="middle"
323
- fontSize={Math.max(8, Math.min(11, 10 / Math.sqrt(transform.scale)))}
324
- fill="var(--text-dim, #b4bcd0)"
325
- style={{ pointerEvents: 'none', userSelect: 'none' }}
326
- >
327
- {node.label.length > 20 ? node.label.slice(0, 18) + '…' : node.label}
328
- </text>
329
- )}
330
- </g>
331
- );
332
- })}
333
- </g>
334
- </svg>
335
- );
336
- }
@@ -1,367 +0,0 @@
1
- // src/web/views/memory/MemoryOverview.tsx — Memory tab overview panel (KPIs + sub-system pills).
2
- import { useEffect, useState } from 'react';
3
- import {
4
- Activity,
5
- Brain,
6
- CheckCircle2,
7
- Database,
8
- FileText,
9
- GitBranch,
10
- RefreshCw,
11
- Search,
12
- ShieldCheck,
13
- Sparkles,
14
- XCircle,
15
- AlertTriangle,
16
- } from 'lucide-react';
17
- import { Button } from '../../components/Button';
18
- import { Card, CardMeta, CardTitle } from '../../components/Card';
19
- import { Spinner } from '../../components/Spinner';
20
- import { useToast } from '../../components/Toast';
21
- import { api } from '../../lib/api';
22
- import { formatTime, cn } from '../../lib/utils';
23
-
24
- export type HealthResponse = {
25
- score: number;
26
- status: 'healthy' | 'degraded' | 'unhealthy' | 'unconfigured';
27
- checks: Array<{ name: string; pass: boolean; detail: string }>;
28
- message: string;
29
- };
30
-
31
- export type VaultStats = {
32
- exists: boolean;
33
- vaultRoot: string;
34
- mode: string;
35
- noteCount: number;
36
- totalSize: number;
37
- folderCount: number;
38
- folders: string[];
39
- lastModified: number | null;
40
- gitClean: boolean | null;
41
- gitBranch: string | null;
42
- };
43
-
44
- type MemoryStatus = {
45
- initialized: boolean;
46
- mode?: string;
47
- projectId?: string;
48
- vaultRoot?: string;
49
- branch?: string;
50
- gitClean?: boolean | null;
51
- noteCount?: number;
52
- lastSecretScan?: string | null;
53
- };
54
-
55
- type LightragStats = {
56
- running: boolean;
57
- pid: number | null;
58
- host: string;
59
- port: number;
60
- indexedApprox: number;
61
- queryCountLast24h: number;
62
- lastReindexAt: string | null;
63
- avgResponseMs?: number | null;
64
- noteCount?: number;
65
- };
66
-
67
- type StorageStats = {
68
- total: number;
69
- breakdown: Array<{ name: string; path: string; size: number }>;
70
- };
71
-
72
- export type MemoryOverviewData = {
73
- health: HealthResponse;
74
- vault: VaultStats;
75
- lightrag: {
76
- running: boolean;
77
- pid: number | null;
78
- host: string;
79
- port: number;
80
- indexedApprox: number;
81
- queryCountLast24h: number;
82
- lastReindexAt: string | null;
83
- };
84
- storage: {
85
- total: number;
86
- breakdown: Array<{ name: string; path: string; size: number }>;
87
- };
88
- };
89
-
90
- type Props = {
91
- refreshKey: number;
92
- onRefresh: () => void;
93
- setActiveSubPanel: (panel: 'overview' | 'lightrag' | 'obsidian' | 'git' | 'semantic' | 'config') => void;
94
- };
95
-
96
- export function MemoryOverview({ refreshKey, onRefresh, setActiveSubPanel }: Props) {
97
- const toast = useToast();
98
- const [data, setData] = useState<MemoryOverviewData | null>(null);
99
- const [vaultPath, setVaultPath] = useState<string>('');
100
- const [loading, setLoading] = useState(true);
101
-
102
- const reload = async (signal?: AbortSignal) => {
103
- setLoading(true);
104
- try {
105
- const [health, status, lightrag, storage] = await Promise.all([
106
- api.get<HealthResponse>('/memory/health', signal).catch(() => null),
107
- api.get<MemoryStatus>('/memory/status', signal).catch(() => null),
108
- api.get<LightragStats>('/memory/lightrag/stats', signal).catch(() => null),
109
- api.get<StorageStats>('/memory/storage', signal).catch(() => null),
110
- ]);
111
- // v6.x — Surface the resolved vault path as a top-level piece of state
112
- // so the section header can display it instead of relying on
113
- // derived fields. Resolves the "(loading…)" UI bug in the Config panel.
114
- setVaultPath(status?.vaultRoot || '');
115
- setData({
116
- health: health || {
117
- score: 0,
118
- status: 'unconfigured',
119
- checks: [],
120
- message: 'memory not initialised',
121
- },
122
- vault: {
123
- exists: !!status?.initialized,
124
- vaultRoot: status?.vaultRoot || '',
125
- mode: status?.mode || 'local-only',
126
- noteCount: status?.noteCount || 0,
127
- totalSize: storage?.total || 0,
128
- folderCount: 0,
129
- folders: [],
130
- lastModified: null,
131
- gitClean: status?.gitClean ?? null,
132
- gitBranch: status?.branch || null,
133
- },
134
- lightrag: lightrag || {
135
- running: false,
136
- pid: null,
137
- host: '127.0.0.1',
138
- port: 9621,
139
- indexedApprox: 0,
140
- queryCountLast24h: 0,
141
- lastReindexAt: null,
142
- },
143
- storage: storage || { total: 0, breakdown: [] },
144
- });
145
- } catch (err) {
146
- toast.error(`Memory overview failed: ${(err as Error).message}`);
147
- } finally {
148
- setLoading(false);
149
- }
150
- };
151
-
152
- useEffect(() => {
153
- const ctrl = new AbortController();
154
- void reload(ctrl.signal);
155
- return () => ctrl.abort();
156
- // eslint-disable-next-line react-hooks/exhaustive-deps
157
- }, [refreshKey]);
158
-
159
- if (loading && !data) {
160
- return (
161
- <div className="view-loading">
162
- <Spinner size="lg" />
163
- <p>Loading memory overview…</p>
164
- </div>
165
- );
166
- }
167
- if (!data) {
168
- return <div className="muted">No memory data available.</div>;
169
- }
170
-
171
- const { health, vault, lightrag, storage } = data;
172
- const scoreColor =
173
- health.score >= 80 ? 'var(--success)' :
174
- health.score >= 50 ? 'var(--warning)' :
175
- 'var(--error)';
176
-
177
- return (
178
- <div className="memory-overview">
179
- {/* ── Health score hero ─────────────────────────────────────────── */}
180
- <Card variant="elevated" className="memory-health-hero">
181
- <div className="memory-health-score" style={{ borderColor: scoreColor }}>
182
- <span className="memory-health-score-value" style={{ color: scoreColor }}>
183
- {health.score}
184
- </span>
185
- <span className="memory-health-score-label">/ 100</span>
186
- </div>
187
- <div className="memory-health-meta">
188
- <h3 className="memory-health-title">
189
- <Activity size={16} />
190
- Memory health ·{' '}
191
- <span style={{ color: scoreColor }}>{health.status}</span>
192
- </h3>
193
- <p className="memory-health-message">{health.message}</p>
194
- {/* v6.x — Vault path surfaced as a top-level piece of context.
195
- Resolves the "(loading…)" stuck-state in the Config panel. */}
196
- <p className="memory-health-vault mono muted" data-testid="memory-overview-vault-path">
197
- <span className="memory-health-vault-label">Vault:</span>{' '}
198
- {vaultPath || <em>not initialised</em>}
199
- </p>
200
- <Button variant="ghost" size="sm" onClick={onRefresh}>
201
- <RefreshCw size={12} /> Refresh
202
- </Button>
203
- </div>
204
- </Card>
205
-
206
- {/* ── Source pills ─────────────────────────────────────────────── */}
207
- <div className="memory-source-pills">
208
- <button
209
- type="button"
210
- className="memory-source-pill"
211
- onClick={() => setActiveSubPanel('lightrag')}
212
- >
213
- <Brain size={14} />
214
- <span>LightRAG</span>
215
- <span className={cn('memory-source-pill-status', lightrag.running ? 'on' : 'off')}>
216
- {lightrag.running ? 'running' : 'stopped'}
217
- </span>
218
- </button>
219
- <button
220
- type="button"
221
- className="memory-source-pill"
222
- onClick={() => setActiveSubPanel('obsidian')}
223
- >
224
- <FileText size={14} />
225
- <span>Obsidian Vault</span>
226
- <span className={cn('memory-source-pill-status', vault.exists ? 'on' : 'off')}>
227
- {vault.noteCount} notes
228
- </span>
229
- </button>
230
- <button
231
- type="button"
232
- className="memory-source-pill"
233
- onClick={() => setActiveSubPanel('git')}
234
- >
235
- <GitBranch size={14} />
236
- <span>Git Sync</span>
237
- <span className={cn(
238
- 'memory-source-pill-status',
239
- vault.gitClean === null ? 'na' : vault.gitClean ? 'on' : 'warn',
240
- )}>
241
- {vault.gitClean === null ? '—' : vault.gitClean ? 'clean' : 'dirty'}
242
- </span>
243
- </button>
244
- <button
245
- type="button"
246
- className="memory-source-pill"
247
- onClick={() => setActiveSubPanel('semantic')}
248
- >
249
- <Search size={14} />
250
- <span>Semantic Search</span>
251
- <span className="memory-source-pill-status na">cross-source</span>
252
- </button>
253
- </div>
254
-
255
- {/* ── KPI grid ─────────────────────────────────────────────────── */}
256
- <div className="memory-stat-grid">
257
- <StatCard
258
- icon={<Brain size={16} />}
259
- label="LightRAG"
260
- value={lightrag.running ? `running · ${lightrag.queryCountLast24h} q/24h` : 'stopped'}
261
- sub={lightrag.running ? `${lightrag.indexedApprox} indexed chunks` : 'start from the LightRAG panel'}
262
- onClick={() => setActiveSubPanel('lightrag')}
263
- />
264
- <StatCard
265
- icon={<FileText size={16} />}
266
- label="Obsidian"
267
- value={`${vault.noteCount} notes`}
268
- sub={vault.folderCount > 0 ? `${vault.folderCount} folders` : 'no folders yet'}
269
- onClick={() => setActiveSubPanel('obsidian')}
270
- />
271
- <StatCard
272
- icon={<GitBranch size={16} />}
273
- label="Git"
274
- value={vault.gitBranch ? `branch ${vault.gitBranch}` : 'local-only'}
275
- sub={
276
- vault.gitClean === null ? 'not configured' :
277
- vault.gitClean ? 'clean working tree' :
278
- 'dirty — commit or pull'
279
- }
280
- onClick={() => setActiveSubPanel('git')}
281
- />
282
- <StatCard
283
- icon={<Database size={16} />}
284
- label="Storage"
285
- value={formatBytes(storage.total)}
286
- sub={storage.breakdown.length > 0
287
- ? `${storage.breakdown.length} dirs tracked`
288
- : 'no memory data on disk'}
289
- />
290
- <StatCard
291
- icon={<Sparkles size={16} />}
292
- label="Last reindex"
293
- value={lightrag.lastReindexAt ? formatTime(lightrag.lastReindexAt) : 'never'}
294
- sub="lightrag ingest"
295
- onClick={() => setActiveSubPanel('lightrag')}
296
- />
297
- <StatCard
298
- icon={<ShieldCheck size={16} />}
299
- label="Health"
300
- value={`${health.score}/100`}
301
- sub={health.status}
302
- onClick={() => setActiveSubPanel('config')}
303
- />
304
- </div>
305
-
306
- {/* ── Health checks detail ─────────────────────────────────────── */}
307
- {health.checks.length > 0 && (
308
- <Card>
309
- <CardTitle>Health checks</CardTitle>
310
- <CardMeta>Composite score across all memory subsystems</CardMeta>
311
- <ul className="memory-check-list">
312
- {health.checks.map((c) => (
313
- <li key={c.name} className="memory-check-row">
314
- <span className="memory-check-icon">
315
- {c.pass
316
- ? <CheckCircle2 size={14} style={{ color: 'var(--success)' }} />
317
- : c.name.includes('secrets') || c.name.includes('schema')
318
- ? <AlertTriangle size={14} style={{ color: 'var(--warning)' }} />
319
- : <XCircle size={14} style={{ color: 'var(--error)' }} />}
320
- </span>
321
- <span className="memory-check-name">{c.name}</span>
322
- <span className="memory-check-detail muted">{c.detail}</span>
323
- </li>
324
- ))}
325
- </ul>
326
- </Card>
327
- )}
328
- </div>
329
- );
330
- }
331
-
332
- function StatCard({
333
- icon,
334
- label,
335
- value,
336
- sub,
337
- onClick,
338
- }: {
339
- icon: React.ReactNode;
340
- label: string;
341
- value: string;
342
- sub: string;
343
- onClick?: () => void;
344
- }) {
345
- const Comp = onClick ? 'button' : 'div';
346
- return (
347
- <Comp
348
- type={onClick ? 'button' : undefined}
349
- onClick={onClick}
350
- className={cn('memory-stat-card', onClick && 'memory-stat-card-clickable')}
351
- >
352
- <div className="memory-stat-icon">{icon}</div>
353
- <div className="memory-stat-body">
354
- <div className="memory-stat-label">{label}</div>
355
- <div className="memory-stat-value">{value}</div>
356
- <div className="memory-stat-sub muted">{sub}</div>
357
- </div>
358
- </Comp>
359
- );
360
- }
361
-
362
- function formatBytes(n: number): string {
363
- if (n < 1024) return `${n} B`;
364
- if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
365
- if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;
366
- return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;
367
- }