@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,172 +0,0 @@
1
- // src/mobile/views/MobileSearchModal.tsx — fullscreen search modal for mobile.
2
- import { useEffect, useRef, useState } from 'react';
3
- import { Search, X, FileText, Bot, CheckSquare, Folder, Sliders } from 'lucide-react';
4
- import { api } from '../../lib/api';
5
- import type { SearchResult } from '../../lib/types';
6
- import { MobileModal } from '../components/MobileModal';
7
-
8
- type Props = {
9
- open: boolean;
10
- onClose: () => void;
11
- onNavigate: (type: string, id: string) => void;
12
- };
13
-
14
- const SCOPES = ['all', 'tasks', 'agents', 'artifacts', 'projects', 'settings'] as const;
15
- type Scope = typeof SCOPES[number];
16
-
17
- const SCOPE_ICONS: Record<string, typeof FileText> = {
18
- tasks: CheckSquare,
19
- agents: Bot,
20
- plans: FileText,
21
- projects: Folder,
22
- settings: Sliders,
23
- };
24
-
25
- export function MobileSearchModal({ open, onClose, onNavigate }: Props) {
26
- const [query, setQuery] = useState('');
27
- const [scope, setScope] = useState<Scope>('all');
28
- const [results, setResults] = useState<SearchResult[]>([]);
29
- const [loading, setLoading] = useState(false);
30
- const inputRef = useRef<HTMLInputElement>(null);
31
-
32
- useEffect(() => {
33
- if (open) {
34
- setQuery('');
35
- setResults([]);
36
- requestAnimationFrame(() => inputRef.current?.focus());
37
- }
38
- }, [open]);
39
-
40
- useEffect(() => {
41
- if (!query.trim()) {
42
- setResults([]);
43
- return;
44
- }
45
- const timer = setTimeout(async () => {
46
- setLoading(true);
47
- try {
48
- const data = await api.get<{ results: SearchResult[] }>(
49
- `/search?q=${encodeURIComponent(query)}&scope=${scope}`,
50
- );
51
- setResults(data.results || []);
52
- } catch {
53
- setResults([]);
54
- } finally {
55
- setLoading(false);
56
- }
57
- }, 250);
58
- return () => clearTimeout(timer);
59
- }, [query, scope]);
60
-
61
- const handleResultClick = (r: SearchResult) => {
62
- const item = r.item as Record<string, string>;
63
- const id = item.id || item.slug || item.name || '';
64
- onNavigate(r.type, id);
65
- onClose();
66
- };
67
-
68
- const grouped = results.reduce<Record<string, SearchResult[]>>((acc, r) => {
69
- if (!acc[r.type]) acc[r.type] = [];
70
- acc[r.type].push(r);
71
- return acc;
72
- }, {});
73
-
74
- return (
75
- <MobileModal open={open} onClose={onClose} title="Search">
76
- <div className="mobile-search-container">
77
- {/* Search input */}
78
- <div className="mobile-search-input-row">
79
- <Search size={16} style={{ color: 'var(--text-muted)', flexShrink: 0 }} />
80
- <input
81
- ref={inputRef}
82
- className="mobile-search-field"
83
- type="text"
84
- placeholder="Search…"
85
- value={query}
86
- onChange={(e) => setQuery(e.target.value)}
87
- enterKeyHint="search"
88
- onKeyDown={(e) => {
89
- if (e.key === 'Escape') onClose();
90
- if (e.key === 'Enter' && results.length > 0) {
91
- handleResultClick(results[0]);
92
- }
93
- }}
94
- />
95
- {query && (
96
- <button
97
- type="button"
98
- className="mobile-icon-btn"
99
- onClick={() => setQuery('')}
100
- aria-label="Clear"
101
- >
102
- <X size={16} />
103
- </button>
104
- )}
105
- </div>
106
-
107
- {/* Scope chips */}
108
- <div className="mobile-search-scopes">
109
- {SCOPES.map((s) => (
110
- <button
111
- key={s}
112
- type="button"
113
- className={`mobile-scope-chip ${scope === s ? 'active' : ''}`}
114
- onClick={() => setScope(s)}
115
- >
116
- {s === 'all' ? 'All' : s.charAt(0).toUpperCase() + s.slice(1)}
117
- </button>
118
- ))}
119
- </div>
120
-
121
- {/* Results */}
122
- <div className="mobile-search-results">
123
- {loading && <div className="mobile-search-loading">Searching…</div>}
124
-
125
- {!loading && query && results.length === 0 && (
126
- <div className="mobile-empty">
127
- <Search size={32} />
128
- <p>No results found</p>
129
- </div>
130
- )}
131
-
132
- {!loading && !query && (
133
- <div className="mobile-empty">
134
- <p>Type to search across tasks, agents, plans, and more.</p>
135
- </div>
136
- )}
137
-
138
- {Object.entries(grouped).map(([type, items]) => {
139
- const Icon = SCOPE_ICONS[type] || FileText;
140
- return (
141
- <div key={type} className="mobile-search-group">
142
- <h4 className="mobile-search-group-title">
143
- <Icon size={12} /> {type.charAt(0).toUpperCase() + type.slice(1)} ({items.length})
144
- </h4>
145
- {items.map((r, i) => {
146
- const item = r.item as Record<string, string>;
147
- return (
148
- <button
149
- key={i}
150
- type="button"
151
- className="mobile-search-result-item"
152
- onClick={() => handleResultClick(r)}
153
- >
154
- <span className="mobile-search-result-title">
155
- {item.title || item.name || item.slug || '(unnamed)'}
156
- </span>
157
- {item.description && (
158
- <span className="mobile-search-result-meta">
159
- {item.description.slice(0, 80)}
160
- </span>
161
- )}
162
- </button>
163
- );
164
- })}
165
- </div>
166
- );
167
- })}
168
- </div>
169
- </div>
170
- </MobileModal>
171
- );
172
- }
@@ -1,363 +0,0 @@
1
- // src/mobile/views/MobileSettings.tsx — mobile settings with full desktop parity.
2
- import { useEffect, useState } from 'react';
3
- import { Smartphone, Sun, Moon, Monitor, Save } from 'lucide-react';
4
- import { api } from '../../lib/api';
5
- import { applyTheme, applyThemeTokens, type Settings, type Snapshot, type ThemeName } from '../../lib/types';
6
- import { QrCodePanel } from './QrCodePanel';
7
-
8
- type Props = {
9
- settings: Settings;
10
- snapshot: Snapshot | null;
11
- onRefresh: () => Promise<void>;
12
- };
13
-
14
- type PairSession = { token: string; qrPayload: string; publicUrl: string; expiresAt: number };
15
-
16
- const THEMES: { id: ThemeName; label: string; Icon: typeof Sun }[] = [
17
- { id: 'dark', label: 'Dark', Icon: Moon },
18
- { id: 'light', label: 'Light', Icon: Sun },
19
- { id: 'system', label: 'System', Icon: Monitor },
20
- ];
21
-
22
- const PRESET_ACCENTS = [
23
- { name: 'Purple', accent: '#8b5cf6' },
24
- { name: 'Blue', accent: '#3b82f6' },
25
- { name: 'Green', accent: '#10b981' },
26
- { name: 'Orange', accent: '#f97316' },
27
- { name: 'Red', accent: '#ef4444' },
28
- { name: 'Pink', accent: '#ec4899' },
29
- { name: 'Cyan', accent: '#06b6d4' },
30
- { name: 'Mono', accent: '#6b7280' },
31
- ];
32
-
33
- export function MobileSettings({ settings: initial, snapshot, onRefresh }: Props) {
34
- const [settings, setSettings] = useState<Settings>(initial);
35
- const [dirty, setDirty] = useState(false);
36
- const [saving, setSaving] = useState(false);
37
- const [pair, setPair] = useState<PairSession | null>(null);
38
- const [pairing, setPairing] = useState(false);
39
-
40
- useEffect(() => {
41
- setSettings(initial);
42
- setDirty(false);
43
- if (initial.theme) applyThemeTokens(initial.theme);
44
- }, [initial]);
45
-
46
- const patchTheme = (patch: Partial<Settings['theme']>) => {
47
- setSettings((cur) => {
48
- const next = { ...cur, theme: { ...cur.theme, ...patch } };
49
- applyTheme(next.theme);
50
- applyThemeTokens(next.theme);
51
- return next;
52
- });
53
- setDirty(true);
54
- };
55
-
56
- const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {
57
- setSettings((cur) => ({ ...cur, [key]: value }));
58
- setDirty(true);
59
- };
60
-
61
- const onSave = async () => {
62
- setSaving(true);
63
- try {
64
- const r = await api.put<{ data: Settings }>('/settings', settings);
65
- setSettings(r.data);
66
- setDirty(false);
67
- applyTheme(r.data.theme);
68
- applyThemeTokens(r.data.theme);
69
- onRefresh();
70
- } catch {
71
- // best-effort
72
- } finally {
73
- setSaving(false);
74
- }
75
- };
76
-
77
- const startPair = async () => {
78
- setPairing(true);
79
- try {
80
- const res = await api.post<PairSession>('/pair/start');
81
- setPair(res);
82
- } catch {
83
- // best-effort
84
- } finally {
85
- setPairing(false);
86
- }
87
- };
88
-
89
- // remaining/expired are now managed inside QrCodePanel to keep
90
- // qrcode.react out of the main mobile bundle chunk.
91
-
92
- return (
93
- <div className="mobile-view">
94
- {/* Save bar */}
95
- {dirty && (
96
- <div className="mobile-settings-save-bar">
97
- <span>Unsaved changes</span>
98
- <button type="button" className="mobile-btn" disabled={saving} onClick={onSave}>
99
- <Save size={14} /> {saving ? 'Saving…' : 'Save'}
100
- </button>
101
- </div>
102
- )}
103
-
104
- {/* Theme */}
105
- <section className="mobile-section">
106
- <h3 className="mobile-section-title">Appearance</h3>
107
- <div className="mobile-card">
108
- {/* Theme mode */}
109
- <div className="mobile-setting-row">
110
- <span className="mobile-setting-label">Theme</span>
111
- <div className="mobile-theme-btns">
112
- {THEMES.map(({ id, label, Icon }) => (
113
- <button
114
- key={id}
115
- type="button"
116
- className={`mobile-theme-btn ${settings.theme.mode === id ? 'active' : ''}`}
117
- onClick={() => patchTheme({ mode: id })}
118
- >
119
- <Icon size={14} /> {label}
120
- </button>
121
- ))}
122
- </div>
123
- </div>
124
-
125
- {/* Accent swatches */}
126
- <div className="mobile-setting-row" style={{ flexDirection: 'column', alignItems: 'flex-start', gap: 8 }}>
127
- <span className="mobile-setting-label">Accent color</span>
128
- <div className="mobile-accent-swatches">
129
- {PRESET_ACCENTS.map((p) => (
130
- <button
131
- key={p.name}
132
- type="button"
133
- className={`mobile-accent-swatch ${settings.theme.accent === p.accent ? 'active' : ''}`}
134
- style={{ background: p.accent }}
135
- onClick={() => patchTheme({ accent: p.accent })}
136
- title={p.name}
137
- />
138
- ))}
139
- </div>
140
- </div>
141
-
142
- {/* Font size slider */}
143
- <div className="mobile-setting-row" style={{ flexDirection: 'column', alignItems: 'flex-start', gap: 8 }}>
144
- <span className="mobile-setting-label">Font size: {settings.theme.fontSize}px</span>
145
- <input
146
- type="range"
147
- min={12}
148
- max={20}
149
- value={settings.theme.fontSize}
150
- onChange={(e) => patchTheme({ fontSize: Number(e.target.value) })}
151
- style={{ width: '100%' }}
152
- />
153
- </div>
154
-
155
- {/* Toggles */}
156
- <div className="mobile-setting-row">
157
- <span className="mobile-setting-label">Compact mode</span>
158
- <label className="mobile-toggle">
159
- <input
160
- type="checkbox"
161
- checked={settings.theme.compactMode}
162
- onChange={(e) => patchTheme({ compactMode: e.target.checked })}
163
- />
164
- <span className="mobile-toggle-slider" />
165
- </label>
166
- </div>
167
- <div className="mobile-setting-row">
168
- <span className="mobile-setting-label">Animations</span>
169
- <label className="mobile-toggle">
170
- <input
171
- type="checkbox"
172
- checked={settings.theme.animations}
173
- onChange={(e) => patchTheme({ animations: e.target.checked })}
174
- />
175
- <span className="mobile-toggle-slider" />
176
- </label>
177
- </div>
178
- </div>
179
- </section>
180
-
181
- {/* Chat defaults */}
182
- <section className="mobile-section">
183
- <h3 className="mobile-section-title">Chat Defaults</h3>
184
- <div className="mobile-card">
185
- <label className="mobile-field-label">Default Agent</label>
186
- <select
187
- className="mobile-input"
188
- value={settings.defaultAgent || 'odin'}
189
- onChange={(e) => patchTop('defaultAgent', e.target.value)}
190
- >
191
- {(snapshot?.agents || []).map((a) => (
192
- <option key={a.name} value={a.name}>@{a.name}</option>
193
- ))}
194
- </select>
195
- <label className="mobile-field-label" style={{ marginTop: 8 }}>Default Model</label>
196
- <input
197
- className="mobile-input"
198
- type="text"
199
- placeholder="(auto)"
200
- value={settings.defaultModel || ''}
201
- onChange={(e) => patchTop('defaultModel', e.target.value)}
202
- />
203
- </div>
204
- </section>
205
-
206
- {/* Notifications */}
207
- <section className="mobile-section">
208
- <h3 className="mobile-section-title">Notifications</h3>
209
- <div className="mobile-card">
210
- <div className="mobile-setting-row">
211
- <span className="mobile-setting-label">Agent completion</span>
212
- <label className="mobile-toggle">
213
- <input
214
- type="checkbox"
215
- checked={!!settings.notifications.onAgentComplete}
216
- onChange={(e) => {
217
- setSettings((cur) => ({
218
- ...cur,
219
- notifications: { ...cur.notifications, onAgentComplete: e.target.checked },
220
- }));
221
- setDirty(true);
222
- }}
223
- />
224
- <span className="mobile-toggle-slider" />
225
- </label>
226
- </div>
227
- <div className="mobile-setting-row">
228
- <span className="mobile-setting-label">Plan approval</span>
229
- <label className="mobile-toggle">
230
- <input
231
- type="checkbox"
232
- checked={!!settings.notifications.onPlanApproval}
233
- onChange={(e) => {
234
- setSettings((cur) => ({
235
- ...cur,
236
- notifications: { ...cur.notifications, onPlanApproval: e.target.checked },
237
- }));
238
- setDirty(true);
239
- }}
240
- />
241
- <span className="mobile-toggle-slider" />
242
- </label>
243
- </div>
244
- </div>
245
- </section>
246
-
247
- {/* Agent behavior */}
248
- <section className="mobile-section">
249
- <h3 className="mobile-section-title">Agent Behavior</h3>
250
- <div className="mobile-card">
251
- <label className="mobile-field-label">Max parallel agents</label>
252
- <input
253
- className="mobile-input"
254
- type="number"
255
- inputMode="numeric"
256
- min={1}
257
- max={20}
258
- value={settings.agents?.maxParallel ?? 6}
259
- onChange={(e) => {
260
- setSettings((cur) => ({
261
- ...cur,
262
- agents: { ...cur.agents, maxParallel: Math.max(1, Math.min(20, parseInt(e.target.value, 10) || 6)) },
263
- }));
264
- setDirty(true);
265
- }}
266
- />
267
- <label className="mobile-field-label" style={{ marginTop: 8 }}>Stuck threshold (ms)</label>
268
- <input
269
- className="mobile-input"
270
- type="number"
271
- inputMode="numeric"
272
- min={60000}
273
- max={3600000}
274
- step={60000}
275
- value={settings.agents?.stuckThresholdMs ?? 600000}
276
- onChange={(e) => {
277
- setSettings((cur) => ({
278
- ...cur,
279
- agents: { ...cur.agents, stuckThresholdMs: Math.max(60000, parseInt(e.target.value, 10) || 600000) },
280
- }));
281
- setDirty(true);
282
- }}
283
- />
284
- <div className="mobile-setting-row" style={{ marginTop: 8 }}>
285
- <span className="mobile-setting-label">Auto-restart stuck agents</span>
286
- <label className="mobile-toggle">
287
- <input
288
- type="checkbox"
289
- checked={!!settings.agents?.autoRestart}
290
- onChange={(e) => {
291
- setSettings((cur) => ({
292
- ...cur,
293
- agents: { ...cur.agents, autoRestart: e.target.checked },
294
- }));
295
- setDirty(true);
296
- }}
297
- />
298
- <span className="mobile-toggle-slider" />
299
- </label>
300
- </div>
301
- </div>
302
- </section>
303
-
304
- {/* Tailscale serve */}
305
- <section className="mobile-section">
306
- <h3 className="mobile-section-title">Tailscale Serve</h3>
307
- <div className="mobile-card">
308
- <p className="muted" style={{ fontSize: 13 }}>
309
- Use <code>bizar service</code> commands in the terminal to configure Tailscale serve.
310
- </p>
311
- </div>
312
- </section>
313
-
314
- {/* Companion App */}
315
- <section className="mobile-section">
316
- <h3 className="mobile-section-title"><Smartphone size={14} /> Companion App</h3>
317
- <div className="mobile-card">
318
- {!pair && (
319
- <button type="button" className="mobile-btn" onClick={startPair} disabled={pairing} style={{ width: '100%' }}>
320
- <Smartphone size={14} /> {pairing ? 'Generating…' : 'Generate QR Code'}
321
- </button>
322
- )}
323
- {pair && (
324
- <QrCodePanel
325
- pair={pair}
326
- onStart={startPair}
327
- />
328
- )}
329
- </div>
330
- </section>
331
-
332
- {/* About */}
333
- <section className="mobile-section">
334
- <h3 className="mobile-section-title">About</h3>
335
- <div className="mobile-card">
336
- <div className="mobile-setting-row">
337
- <span className="mobile-setting-label">Version</span>
338
- <span className="mobile-setting-value mono">{settings.about?.version || '—'}</span>
339
- </div>
340
- <div className="mobile-setting-row">
341
- <span className="mobile-setting-label">Agents</span>
342
- <span className="mobile-setting-value">{snapshot?.agents?.length || 0}</span>
343
- </div>
344
- <div className="mobile-setting-row">
345
- <span className="mobile-setting-label">Tasks</span>
346
- <span className="mobile-setting-value">{snapshot?.tasks?.length || 0}</span>
347
- </div>
348
- <div className="mobile-setting-row">
349
- <span className="mobile-setting-label">Plans</span>
350
- <span className="mobile-setting-value">{snapshot?.artifacts.length || 0}</span>
351
- </div>
352
- </div>
353
- </section>
354
-
355
- {/* Switch to desktop */}
356
- <div className="mobile-view-footer">
357
- <a href="/?desktop=1" className="mobile-btn mobile-btn-secondary">
358
- Switch to Desktop
359
- </a>
360
- </div>
361
- </div>
362
- );
363
- }
@@ -1,153 +0,0 @@
1
- // src/mobile/views/MobileSkills.tsx — skills list with detail sheet.
2
- import { useEffect, useState } from 'react';
3
- import { Sparkles, RefreshCw, Power } from 'lucide-react';
4
- import { api } from '../../lib/api';
5
- import type { Snapshot } from '../../lib/types';
6
- import { MobileBottomSheet } from '../components/MobileBottomSheet';
7
-
8
- type Skill = {
9
- id: string;
10
- name: string;
11
- description: string;
12
- category: string;
13
- tags: string[];
14
- version: string;
15
- source: string;
16
- enabled?: boolean;
17
- };
18
-
19
- type Props = {
20
- snapshot: Snapshot;
21
- onBack: () => void;
22
- };
23
-
24
- const CATEGORIES = ['languages', 'framework', 'design', 'testing', 'devops', 'data', 'security', 'integration'];
25
-
26
- export function MobileSkills({ snapshot, onBack }: Props) {
27
- const [skills, setSkills] = useState<Skill[]>([]);
28
- const [loading, setLoading] = useState(true);
29
- const [filter, setFilter] = useState('');
30
- const [categoryFilter, setCategoryFilter] = useState('');
31
- const [detailSkill, setDetailSkill] = useState<Skill | null>(null);
32
-
33
- const load = async () => {
34
- try {
35
- const data = await api.get<{ skills: Skill[] }>('/skills');
36
- setSkills(data.skills || []);
37
- } catch {
38
- // best-effort
39
- } finally {
40
- setLoading(false);
41
- }
42
- };
43
-
44
- useEffect(() => { load(); }, []);
45
-
46
- const toggleSkill = async (id: string, enabled: boolean) => {
47
- try {
48
- await api.patch(`/skills/${encodeURIComponent(id)}`, { enabled });
49
- setSkills((cur) => cur.map((s) => (s.id === id ? { ...s, enabled } : s)));
50
- if (detailSkill?.id === id) setDetailSkill((s) => s ? { ...s, enabled } : s);
51
- } catch {
52
- // best-effort
53
- }
54
- };
55
-
56
- const filtered = skills.filter((s) => {
57
- if (categoryFilter && s.category !== categoryFilter) return false;
58
- if (filter) {
59
- const q = filter.toLowerCase();
60
- return s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q);
61
- }
62
- return true;
63
- });
64
-
65
- return (
66
- <div className="mobile-view">
67
- <div className="mobile-tasks-toolbar">
68
- <input
69
- className="mobile-search-input"
70
- type="text"
71
- placeholder="Search skills…"
72
- value={filter}
73
- onChange={(e) => setFilter(e.target.value)}
74
- style={{ flex: 1 }}
75
- />
76
- <button type="button" className="mobile-icon-btn" onClick={() => load()} aria-label="Refresh">
77
- <RefreshCw size={16} />
78
- </button>
79
- </div>
80
-
81
- <div className="mobile-search-scopes">
82
- <button type="button" className={`mobile-scope-chip ${!categoryFilter ? 'active' : ''}`} onClick={() => setCategoryFilter('')}>All</button>
83
- {CATEGORIES.map((c) => (
84
- <button key={c} type="button" className={`mobile-scope-chip ${categoryFilter === c ? 'active' : ''}`} onClick={() => setCategoryFilter(c)}>
85
- {c}
86
- </button>
87
- ))}
88
- </div>
89
-
90
- {loading ? (
91
- <div className="mobile-loading"><p>Loading…</p></div>
92
- ) : filtered.length === 0 ? (
93
- <div className="mobile-empty">
94
- <Sparkles size={40} />
95
- <p>No skills found.</p>
96
- </div>
97
- ) : (
98
- <div className="mobile-card-list">
99
- {filtered.map((s) => (
100
- <button
101
- key={s.id}
102
- type="button"
103
- className="mobile-list-item mobile-list-item-interactive"
104
- onClick={() => setDetailSkill(s)}
105
- >
106
- <div className="mobile-list-icon"><Sparkles size={16} /></div>
107
- <div className="mobile-list-content">
108
- <span className="mobile-list-title">{s.name}</span>
109
- <span className="mobile-list-meta">{s.category} · v{s.version}</span>
110
- </div>
111
- <span className={`mobile-list-badge ${s.enabled ? 'badge-on' : 'badge-off'}`}>
112
- {s.enabled ? 'on' : 'off'}
113
- </span>
114
- </button>
115
- ))}
116
- </div>
117
- )}
118
-
119
- {detailSkill && (
120
- <MobileBottomSheet
121
- open={true}
122
- onClose={() => setDetailSkill(null)}
123
- title={detailSkill.name}
124
- actions={
125
- <button
126
- type="button"
127
- className={`mobile-btn ${detailSkill.enabled ? 'mobile-btn-secondary' : ''}`}
128
- style={{ width: '100%' }}
129
- onClick={() => { if (detailSkill) toggleSkill(detailSkill.id, !detailSkill.enabled); }}
130
- >
131
- <Power size={14} /> {detailSkill.enabled ? 'Disable' : 'Enable'}
132
- </button>
133
- }
134
- >
135
- <div className="mobile-agent-detail">
136
- <p className="mobile-agent-detail-desc">{detailSkill.description || 'No description.'}</p>
137
- <div className="mobile-agent-detail-meta">
138
- <div className="mobile-task-detail-row"><span>Category</span><span>{detailSkill.category}</span></div>
139
- <div className="mobile-task-detail-row"><span>Version</span><span className="mono">{detailSkill.version}</span></div>
140
- <div className="mobile-task-detail-row"><span>Source</span><span>{detailSkill.source}</span></div>
141
- {detailSkill.tags.length > 0 && (
142
- <div className="mobile-task-detail-row">
143
- <span>Tags</span>
144
- <span>{detailSkill.tags.join(', ')}</span>
145
- </div>
146
- )}
147
- </div>
148
- </div>
149
- </MobileBottomSheet>
150
- )}
151
- </div>
152
- );
153
- }