@polderlabs/bizar 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/.claude/agents/agent-browser.md +1 -1
  2. package/.claude/agents/baldr.md +1 -1
  3. package/.claude/agents/forseti.md +1 -1
  4. package/.claude/agents/frigg.md +1 -1
  5. package/.claude/agents/heimdall.md +1 -1
  6. package/.claude/agents/hermod.md +1 -1
  7. package/.claude/agents/mimir.md +1 -1
  8. package/.claude/agents/odin.md +1 -1
  9. package/.claude/agents/quick.md +1 -1
  10. package/.claude/agents/semble-search.md +1 -1
  11. package/.claude/agents/thor.md +1 -1
  12. package/.claude/agents/tyr.md +1 -1
  13. package/.claude/agents/vidarr.md +1 -1
  14. package/.claude/agents/vor.md +1 -1
  15. package/.claude/commands/goal.md +98 -0
  16. package/.claude/settings.local.json +1 -2
  17. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +6 -0
  18. package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +1 -0
  19. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +1 -0
  20. package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +1 -0
  21. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +28 -0
  22. package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +1 -0
  23. package/bizar-dash/dist/assets/{Badge-Cd61wsBa.js → Badge-BH4C3aUF.js} +1 -1
  24. package/bizar-dash/dist/assets/{Badge-Cd61wsBa.js.map → Badge-BH4C3aUF.js.map} +1 -1
  25. package/bizar-dash/dist/assets/Button-RmN1RKhE.js +6 -0
  26. package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +1 -0
  27. package/bizar-dash/dist/assets/{Card-C_bvqXdQ.js → Card-BzJeYR2D.js} +1 -1
  28. package/bizar-dash/dist/assets/{Card-C_bvqXdQ.js.map → Card-BzJeYR2D.js.map} +1 -1
  29. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js +1 -0
  30. package/bizar-dash/dist/assets/Chip-CN2bvm7a.js.map +1 -0
  31. package/bizar-dash/dist/assets/{EmptyState-BWQuKnk9.js → EmptyState-DEiBv4-r.js} +1 -1
  32. package/bizar-dash/dist/assets/{EmptyState-BWQuKnk9.js.map → EmptyState-DEiBv4-r.js.map} +1 -1
  33. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +6 -0
  34. package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +1 -0
  35. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js +21 -0
  36. package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +1 -0
  37. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +67 -0
  38. package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +1 -0
  39. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +13 -0
  40. package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +1 -0
  41. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +1 -0
  42. package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +1 -0
  43. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +16 -0
  44. package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +1 -0
  45. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +10 -0
  46. package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +1 -0
  47. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +43 -0
  48. package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +1 -0
  49. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +1 -0
  50. package/bizar-dash/dist/assets/Sheet-C_sIEw35.js.map +1 -0
  51. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +1 -0
  52. package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +1 -0
  53. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +16 -0
  54. package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +1 -0
  55. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +1 -0
  56. package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +1 -0
  57. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js +1 -0
  58. package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js.map +1 -0
  59. package/bizar-dash/dist/assets/{ViewHeader-D6c2cw1b.js → ViewHeader-dPd4zAyj.js} +1 -1
  60. package/bizar-dash/dist/assets/{ViewHeader-D6c2cw1b.js.map → ViewHeader-dPd4zAyj.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{brain-DeoXNDE2.js → brain-BajPVibR.js} +1 -1
  62. package/bizar-dash/dist/assets/{brain-DeoXNDE2.js.map → brain-BajPVibR.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{calendar-DRlQkGJc.js → calendar-CaP_Bbgc.js} +2 -2
  64. package/bizar-dash/dist/assets/{calendar-DRlQkGJc.js.map → calendar-CaP_Bbgc.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{cmdk-BwN8hcKQ.js → cmdk-BLWIhKrV.js} +1 -1
  66. package/bizar-dash/dist/assets/{cmdk-BwN8hcKQ.js.map → cmdk-BLWIhKrV.js.map} +1 -1
  67. package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js +5 -0
  68. package/bizar-dash/dist/assets/{dnd-kit-DR2Qzzxk.js.map → dnd-kit-DU8GZk7s.js.map} +1 -1
  69. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js +11 -0
  70. package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js.map +1 -0
  71. package/bizar-dash/dist/assets/index-AL3OLUfz.js +1 -0
  72. package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +1 -0
  73. package/bizar-dash/dist/assets/{main-COdgjqbZ.css → main-CcQfRfIJ.css} +1 -1
  74. package/bizar-dash/dist/assets/main-LxX9zTRk.js +109 -0
  75. package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +1 -0
  76. package/bizar-dash/dist/assets/{minus-CrStJTZ7.js → plus-CVH1JB04.js} +2 -2
  77. package/bizar-dash/dist/assets/plus-CVH1JB04.js.map +1 -0
  78. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +11 -0
  79. package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +1 -0
  80. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js +6 -0
  81. package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js.map +1 -0
  82. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js +6 -0
  83. package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js.map +1 -0
  84. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +1 -0
  85. package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +1 -0
  86. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +1 -0
  87. package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +1 -0
  88. package/bizar-dash/dist/assets/{wrench-BJ1WIC4u.js → wrench-B7go551L.js} +1 -1
  89. package/bizar-dash/dist/assets/{wrench-BJ1WIC4u.js.map → wrench-B7go551L.js.map} +1 -1
  90. package/bizar-dash/dist/v8.html +3 -3
  91. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  92. package/bizar-dash/src/server/api.mjs +10 -0
  93. package/bizar-dash/src/server/bg-poller.mjs +81 -1
  94. package/bizar-dash/src/server/bg-poller.test.mjs +28 -0
  95. package/bizar-dash/src/server/progress-parser.mjs +221 -0
  96. package/bizar-dash/src/server/progress-parser.test.mjs +105 -0
  97. package/bizar-dash/src/server/routes/agents-cc.mjs +381 -0
  98. package/bizar-dash/src/server/routes/agents-cc.test.mjs +35 -0
  99. package/bizar-dash/src/server/routes/goals.mjs +307 -0
  100. package/bizar-dash/src/server/routes/tasks.mjs +11 -0
  101. package/bizar-dash/src/web/v8/__tests__/App.test.tsx +2 -2
  102. package/bizar-dash/src/web/v8/__tests__/control-plane.test.tsx +104 -0
  103. package/bizar-dash/src/web/v8/__tests__/useFetch.test.ts +92 -0
  104. package/bizar-dash/src/web/v8/__tests__/useWebSocket.test.ts +87 -0
  105. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +110 -40
  106. package/bizar-dash/src/web/v8/data/fetcher.ts +59 -0
  107. package/bizar-dash/src/web/v8/data/types.ts +154 -0
  108. package/bizar-dash/src/web/v8/data/useFetch.ts +62 -0
  109. package/bizar-dash/src/web/v8/data/useWebSocket.ts +153 -0
  110. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +252 -0
  111. package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +371 -0
  112. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +245 -0
  113. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +6 -3
  114. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +3 -3
  115. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +10 -5
  116. package/bizar-dash/src/web/v8/ui/styles/globals.css +5 -0
  117. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +53 -15
  118. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +151 -87
  119. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +1 -1
  120. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +133 -30
  121. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +176 -67
  122. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +78 -11
  123. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +58 -42
  124. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +112 -52
  125. package/bizar-dash/src/web/v8/views/Router.tsx +13 -37
  126. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +635 -210
  127. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +140 -49
  128. package/bizar-dash/tests/components/Button.test.tsx +51 -14
  129. package/bizar-dash/tests/components/Card.test.tsx +37 -20
  130. package/bizar-dash/tests/components/Dialog.test.tsx +80 -0
  131. package/bizar-dash/tests/components/Toast.test.tsx +48 -95
  132. package/bizar-dash/tests/goals-decompose.test.mjs +177 -0
  133. package/bizar-dash/tests/setup.ts +21 -0
  134. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +30 -15
  135. package/bizar-dash/vite.config.ts +15 -0
  136. package/bizar-dash/vitest.config.ts +4 -1
  137. package/cli/bin.mjs +32 -0
  138. package/cli/install.mjs +26 -1
  139. package/cli/provision-claude.mjs +86 -0
  140. package/package.json +1 -1
  141. package/scripts/run-dev.mjs +84 -0
  142. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js +0 -6
  143. package/bizar-dash/dist/assets/ActivityFeed-BRBtQOHB.js.map +0 -1
  144. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js +0 -1
  145. package/bizar-dash/dist/assets/ActivityView-CwqhxBfh.js.map +0 -1
  146. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js +0 -1
  147. package/bizar-dash/dist/assets/AgentActivity-6MxU-a9F.js.map +0 -1
  148. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js +0 -8
  149. package/bizar-dash/dist/assets/AgentsView-BYrOFdwl.js.map +0 -1
  150. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js +0 -11
  151. package/bizar-dash/dist/assets/GoalsView-Dok0yt9S.js.map +0 -1
  152. package/bizar-dash/dist/assets/Grid-C62gCPqt.js +0 -1
  153. package/bizar-dash/dist/assets/Grid-C62gCPqt.js.map +0 -1
  154. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js +0 -21
  155. package/bizar-dash/dist/assets/KanbanCard-CtTKP6ZX.js.map +0 -1
  156. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js +0 -67
  157. package/bizar-dash/dist/assets/LibrariesView-BcyBQXiY.js.map +0 -1
  158. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js +0 -13
  159. package/bizar-dash/dist/assets/MemoryView-49wR4u-y.js.map +0 -1
  160. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js +0 -1
  161. package/bizar-dash/dist/assets/OverviewView-BtQ_UWYj.js.map +0 -1
  162. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js +0 -1
  163. package/bizar-dash/dist/assets/ProgressBar-CpvDeq9F.js.map +0 -1
  164. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js +0 -30
  165. package/bizar-dash/dist/assets/SettingsRow-DmIe5OUu.js.map +0 -1
  166. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js +0 -48
  167. package/bizar-dash/dist/assets/SettingsView-D1KmGWbi.js.map +0 -1
  168. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js +0 -11
  169. package/bizar-dash/dist/assets/StatTile-BkIP32gG.js.map +0 -1
  170. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js +0 -1
  171. package/bizar-dash/dist/assets/TasksView-Cba3GJ42.js.map +0 -1
  172. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js +0 -6
  173. package/bizar-dash/dist/assets/circle-check-DmYQ3vGp.js.map +0 -1
  174. package/bizar-dash/dist/assets/dnd-kit-DR2Qzzxk.js +0 -5
  175. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js +0 -6
  176. package/bizar-dash/dist/assets/git-merge-OoqBKQer.js.map +0 -1
  177. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js +0 -6
  178. package/bizar-dash/dist/assets/git-pull-request-CXBQTR2f.js.map +0 -1
  179. package/bizar-dash/dist/assets/main-Cw6gybzS.js +0 -109
  180. package/bizar-dash/dist/assets/main-Cw6gybzS.js.map +0 -1
  181. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js +0 -6
  182. package/bizar-dash/dist/assets/message-square-DUTeIQAR.js.map +0 -1
  183. package/bizar-dash/dist/assets/minus-CrStJTZ7.js.map +0 -1
  184. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  185. /package/bizar-dash/tests/{BackgroundAgents.test.tsx → v7-archive/BackgroundAgents.test.tsx} +0 -0
  186. /package/bizar-dash/tests/{a11y → v7-archive/a11y}/forms.test.tsx +0 -0
  187. /package/bizar-dash/tests/{a11y.test.tsx → v7-archive/a11y.test.tsx} +0 -0
  188. /package/bizar-dash/tests/{autosave.test.tsx → v7-archive/autosave.test.tsx} +0 -0
  189. /package/bizar-dash/tests/{backup-restore.test.tsx → v7-archive/backup-restore.test.tsx} +0 -0
  190. /package/bizar-dash/tests/{chat-composer.test.tsx → v7-archive/chat-composer.test.tsx} +0 -0
  191. /package/bizar-dash/tests/{communication-log.test.tsx → v7-archive/communication-log.test.tsx} +0 -0
  192. /package/bizar-dash/tests/{components → v7-archive/components}/Modal.test.tsx +0 -0
  193. /package/bizar-dash/tests/{components → v7-archive/components}/Spinner.test.tsx +0 -0
  194. /package/bizar-dash/tests/{components → v7-archive/components}/StatusBadge.test.tsx +0 -0
  195. /package/bizar-dash/tests/{components → v7-archive/components}/doctor-panel.test.tsx +0 -0
  196. /package/bizar-dash/tests/{components → v7-archive/components}/screenshot-ocr.test.tsx +0 -0
  197. /package/bizar-dash/tests/{components → v7-archive/components}/settings-search.test.tsx +0 -0
  198. /package/bizar-dash/tests/{components → v7-archive/components}/workspace-selector.test.tsx +0 -0
  199. /package/bizar-dash/tests/{ui → v7-archive}/controls/Button.test.tsx +0 -0
  200. /package/bizar-dash/tests/{ui → v7-archive}/controls/Checkbox.test.tsx +0 -0
  201. /package/bizar-dash/tests/{ui → v7-archive}/controls/IconButton.test.tsx +0 -0
  202. /package/bizar-dash/tests/{ui → v7-archive}/controls/Kbd.test.tsx +0 -0
  203. /package/bizar-dash/tests/{ui → v7-archive}/controls/NumberInput.test.tsx +0 -0
  204. /package/bizar-dash/tests/{ui → v7-archive}/controls/RadioGroup.test.tsx +0 -0
  205. /package/bizar-dash/tests/{ui → v7-archive}/controls/SearchInput.test.tsx +0 -0
  206. /package/bizar-dash/tests/{ui → v7-archive}/controls/Select.test.tsx +0 -0
  207. /package/bizar-dash/tests/{ui → v7-archive}/controls/Slider.test.tsx +0 -0
  208. /package/bizar-dash/tests/{ui → v7-archive}/controls/TextInput.test.tsx +0 -0
  209. /package/bizar-dash/tests/{ui → v7-archive}/controls/Textarea.test.tsx +0 -0
  210. /package/bizar-dash/tests/{ui → v7-archive}/controls/Toggle.test.tsx +0 -0
  211. /package/bizar-dash/tests/{ui → v7-archive}/data/BarChart.test.tsx +0 -0
  212. /package/bizar-dash/tests/{ui → v7-archive}/data/DataTable.test.tsx +0 -0
  213. /package/bizar-dash/tests/{ui → v7-archive}/data/EmptyState.test.tsx +0 -0
  214. /package/bizar-dash/tests/{ui → v7-archive}/data/ErrorState.test.tsx +0 -0
  215. /package/bizar-dash/tests/{ui → v7-archive}/data/KeyValueList.test.tsx +0 -0
  216. /package/bizar-dash/tests/{ui → v7-archive}/data/LoadingState.test.tsx +0 -0
  217. /package/bizar-dash/tests/{ui → v7-archive}/data/Sparkline.test.tsx +0 -0
  218. /package/bizar-dash/tests/{ui → v7-archive}/data/StatTile.test.tsx +0 -0
  219. /package/bizar-dash/tests/{dep-graph.test.tsx → v7-archive/dep-graph.test.tsx} +0 -0
  220. /package/bizar-dash/tests/{eval-web-ui.test.tsx → v7-archive/eval-web-ui.test.tsx} +0 -0
  221. /package/bizar-dash/tests/{event-log.test.tsx → v7-archive/event-log.test.tsx} +0 -0
  222. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Badge.test.tsx +0 -0
  223. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Dialog.test.tsx +0 -0
  224. /package/bizar-dash/tests/{ui → v7-archive}/feedback/ProgressBar.test.tsx +0 -0
  225. /package/bizar-dash/tests/{ui → v7-archive}/feedback/StatusDot.test.tsx +0 -0
  226. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Toast.test.tsx +0 -0
  227. /package/bizar-dash/tests/{ui → v7-archive}/feedback/Tooltip.test.tsx +0 -0
  228. /package/bizar-dash/tests/{goal-input.test.tsx → v7-archive/goal-input.test.tsx} +0 -0
  229. /package/bizar-dash/tests/{goap-planner.test.ts → v7-archive/goap-planner.test.ts} +0 -0
  230. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useModal.test.tsx +0 -0
  231. /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useToast.test.tsx +0 -0
  232. /package/bizar-dash/tests/{ui → v7-archive}/layout/AppShell.test.tsx +0 -0
  233. /package/bizar-dash/tests/{ui → v7-archive}/layout/Breadcrumbs.test.tsx +0 -0
  234. /package/bizar-dash/tests/{ui → v7-archive}/layout/Panel.test.tsx +0 -0
  235. /package/bizar-dash/tests/{ui → v7-archive}/layout/PanelHeader.test.tsx +0 -0
  236. /package/bizar-dash/tests/{ui → v7-archive}/layout/Sidebar.test.tsx +0 -0
  237. /package/bizar-dash/tests/{ui → v7-archive}/layout/Tabs.test.tsx +0 -0
  238. /package/bizar-dash/tests/{ui → v7-archive}/layout/Topbar.test.tsx +0 -0
  239. /package/bizar-dash/tests/{ui → v7-archive}/layout/ViewHeader.test.tsx +0 -0
  240. /package/bizar-dash/tests/{lib → v7-archive/lib}/i18n.test.ts +0 -0
  241. /package/bizar-dash/tests/{lib → v7-archive/lib}/search-fuzzy.test.ts +0 -0
  242. /package/bizar-dash/tests/{lib → v7-archive/lib}/utils.test.ts +0 -0
  243. /package/bizar-dash/tests/{memory-graph-view.test.tsx → v7-archive/memory-graph-view.test.tsx} +0 -0
  244. /package/bizar-dash/tests/{mobile-chat.test.tsx → v7-archive/mobile-chat.test.tsx} +0 -0
  245. /package/bizar-dash/tests/{mobile-layout.test.tsx → v7-archive/mobile-layout.test.tsx} +0 -0
  246. /package/bizar-dash/tests/{mobile-overview.test.tsx → v7-archive/mobile-overview.test.tsx} +0 -0
  247. /package/bizar-dash/tests/{mobile-settings.test.tsx → v7-archive/mobile-settings.test.tsx} +0 -0
  248. /package/bizar-dash/tests/{mobile-tasks.test.tsx → v7-archive/mobile-tasks.test.tsx} +0 -0
  249. /package/bizar-dash/tests/{ui → v7-archive}/navigation/CommandPalette.test.tsx +0 -0
  250. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavGroup.test.tsx +0 -0
  251. /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavLink.test.tsx +0 -0
  252. /package/bizar-dash/tests/{quality-gates.test.tsx → v7-archive/quality-gates.test.tsx} +0 -0
  253. /package/bizar-dash/tests/{settings-layout.test.tsx → v7-archive/settings-layout.test.tsx} +0 -0
  254. /package/bizar-dash/tests/{settings-mode-wiring.test.tsx → v7-archive/settings-mode-wiring.test.tsx} +0 -0
  255. /package/bizar-dash/tests/{settings-nav.test.tsx → v7-archive/settings-nav.test.tsx} +0 -0
  256. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Box.test.tsx +0 -0
  257. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Grid.test.tsx +0 -0
  258. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Inline.test.tsx +0 -0
  259. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Separator.test.tsx +0 -0
  260. /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Stack.test.tsx +0 -0
  261. /package/bizar-dash/tests/{views → v7-archive/views}/Agents.test.tsx +0 -0
  262. /package/bizar-dash/tests/{views → v7-archive/views}/Memory.test.tsx +0 -0
  263. /package/bizar-dash/tests/{views → v7-archive/views}/Overview.test.tsx +0 -0
  264. /package/bizar-dash/tests/{views → v7-archive/views}/Tasks.test.tsx +0 -0
  265. /package/bizar-dash/tests/{views → v7-archive/views}/sidebar.test.tsx +0 -0
  266. /package/bizar-dash/tests/{views → v7-archive/views}/topbar.test.tsx +0 -0
  267. /package/bizar-dash/tests/{voice-recorder.test.tsx → v7-archive/voice-recorder.test.tsx} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sparkline-D664vGWW.js","sources":["../../src/web/v8/ui/data/Avatar.tsx","../../src/web/v8/ui/data/Sparkline.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Avatar — user/agent representation. Falls back to initials when no image.\n *\n * Sizes: xs (20) | sm (24) | md (32) | lg (40) | xl (56).\n * Renders a <span> by default; use `asChild` to swap for a button/link.\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n /** Override the generated initials. */\n initials?: string;\n /** Optional status dot (online/offline/busy). */\n status?: 'online' | 'offline' | 'busy' | 'away';\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = { xs: 20, sm: 24, md: 32, lg: 40, xl: 56 };\nconst SIZE_FS: Record<AvatarSize, string> = {\n xs: 'var(--fs-12)',\n sm: 'var(--fs-12)',\n md: 'var(--fs-13)',\n lg: 'var(--fs-14)',\n xl: 'var(--fs-18)',\n};\n\nconst STATUS_FG = {\n online: 'var(--success)',\n offline: 'var(--fg-subtle)',\n busy: 'var(--danger)',\n away: 'var(--warning)',\n} as const;\n\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || parts[0] === undefined) return '?';\n if (parts.length === 1) {\n const first = parts[0] ?? '';\n return first.slice(0, 2).toUpperCase();\n }\n const first = parts[0]?.[0] ?? '';\n const last = parts[parts.length - 1]?.[0] ?? '';\n return `${first}${last}`.toUpperCase();\n}\n\n// Deterministic color from name — used as fallback when no image.\nfunction hashName(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nconst FALLBACK_PALETTE = [\n 'oklch(0.65 0.15 240)',\n 'oklch(0.65 0.15 30)',\n 'oklch(0.65 0.15 140)',\n 'oklch(0.65 0.15 320)',\n 'oklch(0.65 0.15 80)',\n 'oklch(0.65 0.15 200)',\n];\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(props, ref) {\n const { name, src, size = 'md', initials, status, className, style, ...rest } = props;\n const px = SIZE_PX[size];\n const init = initials ?? deriveInitials(name);\n const fallbackBg = FALLBACK_PALETTE[hashName(name) % FALLBACK_PALETTE.length];\n\n return (\n <span\n ref={ref}\n className={cx('v8-avatar', `v8-avatar--${size}`, className)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: px,\n height: px,\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n background: fallbackBg,\n color: 'white',\n fontSize: SIZE_FS[size],\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...style,\n }}\n aria-label={name}\n {...rest}\n >\n {src !== undefined ? (\n <img\n src={src}\n alt=\"\"\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n init\n )}\n {status !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: Math.max(6, Math.floor(px * 0.28)),\n height: Math.max(6, Math.floor(px * 0.28)),\n borderRadius: 'var(--radius-pill)',\n background: STATUS_FG[status],\n border: '2px solid var(--surface-0)',\n }}\n />\n )}\n </span>\n );\n});\n\n/**\n * AvatarStack — overlapping avatars. Use for \"assigned to N people\" lists.\n */\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: AvatarSize;\n max?: number;\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n props,\n ref,\n) {\n const { children, size = 'sm', className, style, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-avatar-stack', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n {...rest}\n >\n <StackedChildren size={size}>{children}</StackedChildren>\n </div>\n );\n});\n\nfunction StackedChildren({ children, size }: { children: ReactNode; size: AvatarSize }) {\n const px = SIZE_PX[size];\n return (\n <>\n {Array.isArray(children)\n ? children.map((child, i) => (\n <span\n key={i}\n style={{\n marginLeft: i === 0 ? 0 : -Math.floor(px * 0.3),\n border: '2px solid var(--surface-0)',\n borderRadius: 'var(--radius-pill)',\n display: 'inline-flex',\n }}\n >\n {child}\n </span>\n ))\n : <span style={{ border: '2px solid var(--surface-0)', borderRadius: 'var(--radius-pill)' }}>{children}</span>}\n </>\n );\n}","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Sparkline — tiny inline line chart.\n *\n * Pure SVG so it composes inside StatTile, Table cells, Card headers\n * without bringing in a chart library dependency.\n */\nexport interface SparklineProps extends Omit<HTMLAttributes<SVGSVGElement>, 'children'> {\n data: readonly number[];\n width?: number;\n height?: number;\n /** Stroke color (defaults to --accent). */\n stroke?: string;\n /** Optional fill color (defaults to a 14% mix of stroke). */\n fill?: string;\n /** Show the area under the line. */\n area?: boolean;\n /** Goal/expected value rendered as a dashed horizontal line. */\n goal?: number;\n}\n\nexport const Sparkline = forwardRef<SVGSVGElement, SparklineProps>(function Sparkline(props, ref) {\n const {\n data,\n width = 120,\n height = 32,\n stroke = 'var(--accent)',\n fill,\n area = true,\n goal,\n className,\n style,\n ...rest\n } = props;\n\n if (data.length < 2) {\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('v8-sparkline', className)}\n style={style}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n const pad = 2;\n const stepX = (width - pad * 2) / (data.length - 1);\n\n const points = data.map((v, i) => {\n const x = pad + stepX * i;\n const y = pad + (height - pad * 2) * (1 - (v - min) / range);\n return { x, y };\n });\n\n const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');\n const areaPath = area\n ? `${linePath} L${points[points.length - 1]?.x.toFixed(1) ?? '0'},${(height - pad).toFixed(1)} L${points[0]?.x.toFixed(1) ?? '0'},${(height - pad).toFixed(1)} Z`\n : '';\n\n const fillColor = fill ?? `color-mix(in oklch, ${stroke} 14%, transparent)`;\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('v8-sparkline', className)}\n style={style}\n aria-hidden=\"true\"\n {...rest}\n >\n {area === true && <path d={areaPath} fill={fillColor} stroke=\"none\" />}\n <path d={linePath} fill=\"none\" stroke={stroke} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n {goal !== undefined && (\n <line\n x1={pad}\n x2={width - pad}\n y1={pad + (height - pad * 2) * (1 - (goal - min) / range)}\n y2={pad + (height - pad * 2) * (1 - (goal - min) / range)}\n stroke=\"var(--fg-subtle)\"\n strokeWidth={1}\n strokeDasharray=\"2 2\"\n />\n )}\n </svg>\n );\n});"],"names":["SIZE_PX","SIZE_FS","STATUS_FG","deriveInitials","name","parts","first","_a","last","_b","hashName","h","i","FALLBACK_PALETTE","Avatar","forwardRef","props","ref","src","size","initials","status","className","style","rest","px","init","fallbackBg","jsxs","cx","jsx","children","StackedChildren","Fragment","child","Sparkline","data","width","height","stroke","fill","area","goal","min","range","pad","stepX","points","v","x","y","linePath","p","areaPath","fillColor"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import{r as v,j as e}from"./cmdk-BLWIhKrV.js";import{b as p,c as f}from"./main-LxX9zTRk.js";/**
2
+ * @license lucide-react v0.460.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const h=p("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/**
7
+ * @license lucide-react v0.460.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const j=p("TrendingDown",[["polyline",{points:"22 17 13.5 8.5 8.5 13.5 2 7",key:"1r2t7k"}],["polyline",{points:"16 17 22 17 22 11",key:"11uiuu"}]]);/**
12
+ * @license lucide-react v0.460.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const b=p("TrendingUp",[["polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17",key:"126l90"}],["polyline",{points:"16 7 22 7 22 13",key:"kwv8wd"}]]),T={up:"var(--success)",down:"var(--danger)",flat:"var(--fg-muted)"},k={up:b,down:j,flat:h},S=v.forwardRef(function(l,o){const{label:d,value:a,delta:t,trend:s,hint:i,icon:n,sparkline:r,loading:g,className:m,style:y,...x}=l,c=s!==void 0?k[s]:null;return e.jsxs("div",{ref:o,className:f("v8-stat-tile",m),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",padding:"var(--space-5)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",...y},...x,children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",fontWeight:500},children:d}),n!==void 0&&e.jsx("span",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:n})]}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--space-2)"},children:[e.jsx("div",{style:{fontSize:"var(--fs-24)",fontWeight:600,color:"var(--fg)",fontVariantNumeric:"tabular-nums",lineHeight:"var(--lh-tight)"},children:g===!0?"—":a}),(t!==void 0||c!==null)&&e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:2,fontSize:"var(--fs-12)",fontWeight:500,color:s!==void 0?T[s]:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[c!==null&&e.jsx(c,{size:12,"aria-hidden":"true"}),t]})]}),i!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i}),r!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-1)"},children:r})]})}),I=v.forwardRef(function(l,o){const{children:d,cols:a,minWidth:t=200,className:s,style:i,...n}=l,r=a!==void 0?`repeat(${a}, minmax(0, 1fr))`:`repeat(auto-fit, minmax(${t}px, 1fr))`;return e.jsx("div",{ref:o,className:f("v8-stat-grid",s),style:{display:"grid",gridTemplateColumns:r,gap:"var(--space-3)",...i},...n,children:d})});export{h as M,I as S,S as a};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatTile-BRsUIA6P.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../../node_modules/lucide-react/dist/esm/icons/trending-up.js","../../src/web/v8/ui/data/StatTile.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TrendingDown = createLucideIcon(\"TrendingDown\", [\n [\"polyline\", { points: \"22 17 13.5 8.5 8.5 13.5 2 7\", key: \"1r2t7k\" }],\n [\"polyline\", { points: \"16 17 22 17 22 11\", key: \"11uiuu\" }]\n]);\n\nexport { TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TrendingUp = createLucideIcon(\"TrendingUp\", [\n [\"polyline\", { points: \"22 7 13.5 15.5 8.5 10.5 2 17\", key: \"126l90\" }],\n [\"polyline\", { points: \"16 7 22 7 22 13\", key: \"kwv8wd\" }]\n]);\n\nexport { TrendingUp as default };\n//# sourceMappingURL=trending-up.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { TrendingDown, TrendingUp, Minus } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * StatTile — a single KPI tile for the overview.\n *\n * Pattern: `[label] [trend-icon delta]`\n * `[BIG value]`\n * `[sparkline?]`\n *\n * Use cases: Overview dashboard, agent detail, goal detail.\n */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatTileProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n /** Optional delta with trend direction (e.g. \"+12%\" vs last week). */\n delta?: ReactNode;\n trend?: StatTrend;\n /** Optional helper text under the value. */\n hint?: ReactNode;\n /** Optional icon for the top-right corner. */\n icon?: ReactNode;\n /** Inline sparkline rendered beneath the value (use the Sparkline component). */\n sparkline?: ReactNode;\n /** Loading state — replaces value with skeleton. */\n loading?: boolean;\n}\n\nconst TREND_FG: Record<StatTrend, string> = {\n up: 'var(--success)',\n down: 'var(--danger)',\n flat: 'var(--fg-muted)',\n};\n\nconst TREND_ICON: Record<StatTrend, typeof TrendingUp> = {\n up: TrendingUp,\n down: TrendingDown,\n flat: Minus,\n};\n\nexport const StatTile = forwardRef<HTMLDivElement, StatTileProps>(function StatTile(props, ref) {\n const {\n label,\n value,\n delta,\n trend,\n hint,\n icon,\n sparkline,\n loading,\n className,\n style,\n ...rest\n } = props;\n const TrendIcon = trend !== undefined ? TREND_ICON[trend] : null;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-tile', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-5)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n ...style,\n }}\n {...rest}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', fontWeight: 500 }}>\n {label}\n </div>\n {icon !== undefined && (\n <span style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 'var(--space-2)' }}>\n <div\n style={{\n fontSize: 'var(--fs-24)',\n fontWeight: 600,\n color: 'var(--fg)',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: 'var(--lh-tight)',\n }}\n >\n {loading === true ? '—' : value}\n </div>\n {(delta !== undefined || TrendIcon !== null) && (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: trend !== undefined ? TREND_FG[trend] : 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {TrendIcon !== null && <TrendIcon size={12} aria-hidden=\"true\" />}\n {delta}\n </div>\n )}\n </div>\n {hint !== undefined && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{hint}</div>\n )}\n {sparkline !== undefined && <div style={{ marginTop: 'var(--space-1)' }}>{sparkline}</div>}\n </div>\n );\n});\n\n/**\n * StatGrid — responsive grid for StatTiles. Auto-fits 1..4 columns.\n */\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Min tile width (default 200px). */\n minWidth?: number;\n cols?: 2 | 3 | 4;\n}\n\nexport const StatGrid = forwardRef<HTMLDivElement, StatGridProps>(function StatGrid(props, ref) {\n const { children, cols, minWidth = 200, className, style, ...rest } = props;\n const gridTemplate = cols !== undefined\n ? `repeat(${cols}, minmax(0, 1fr))`\n : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;\n return (\n <div\n ref={ref}\n className={cx('v8-stat-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns: gridTemplate,\n gap: 'var(--space-3)',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n});"],"names":["Minus","createLucideIcon","TrendingDown","TrendingUp","TREND_FG","TREND_ICON","StatTile","forwardRef","props","ref","label","value","delta","trend","hint","icon","sparkline","loading","className","style","rest","TrendIcon","jsxs","cx","jsx","StatGrid","children","cols","minWidth","gridTemplate"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -0,0 +1 @@
1
+ import{r as g,j as o}from"./cmdk-BLWIhKrV.js";import{c as T,f as D,S,a as v}from"./main-LxX9zTRk.js";import{V as K}from"./ViewHeader-dPd4zAyj.js";import{u as A,a as y,D as E,c as P,s as R,K as q,P as H}from"./dnd-kit-DU8GZk7s.js";import{K as M,u as N,a as V}from"./KanbanCard-DZEaAiEr.js";import{u as z}from"./useFetch-CoVWwbml.js";import{u as B}from"./useWebSocket-CVIQB8yG.js";import"./plus-CVH1JB04.js";import"./calendar-CaP_Bbgc.js";function F({columns:t,onCardMove:e,children:u,className:h}){const k=A(y(H,{activationConstraint:{distance:4}}),y(q,{coordinateGetter:R})),[,f]=g.useState(null),b=p=>{var i;f(null);const{active:x,over:l}=p;if(l===null)return;const m=String(x.id),s=String(l.id),r=((i=t.find(c=>c.id===s))==null?void 0:i.id)??m.split("::")[0];if(r===void 0)return;const n=m.split("::")[0]??"";n!==r&&e!==void 0&&e(m,n,r)};return o.jsx(E,{sensors:k,collisionDetection:P,onDragStart:p=>f(String(p.active.id)),onDragEnd:b,children:o.jsx("div",{className:T("v8-kanban-board",h),style:{display:"grid",gridAutoFlow:"column",gridAutoColumns:"minmax(320px, 1fr)",gap:"var(--space-4)",padding:"var(--space-4) var(--space-5)",overflowX:"auto",overflowY:"hidden",height:"100%",width:"100%",alignItems:"stretch"},role:"region","aria-label":"Kanban board",children:u})})}const j=[{id:"queued",title:"Backlog",accentTone:"neutral"},{id:"doing",title:"In progress",accentTone:"accent",wipLimit:5},{id:"blocked",title:"In review",accentTone:"warning"},{id:"done",title:"Done",accentTone:"success"},{id:"archived",title:"Archived",accentTone:"neutral"}],L={low:"low",medium:"medium",high:"high",urgent:"urgent"};function w(t){return{id:t.id,taskId:t.id,columnId:I(t.status),title:t.title,priority:L[t.priority||"medium"]||"medium",branch:t.branch,due:t.due,comments:t.comments,attachments:t.attachments}}function I(t){switch(t){case"queued":case"doing":case"blocked":case"done":case"archived":return t;default:return"queued"}}function O({card:t}){const e=N(t.id);return o.jsx(V,{card:t,isDragging:e.isDragging,dragHandleProps:{...e.attributes,...e.listeners,ref:e.setNodeRef,style:e.style}})}function Z(){var m;const t=z("/api/tasks"),[e,u]=g.useState([]),[h,k]=g.useState(!1),[f,b]=g.useState(null);(m=t.data)!=null&&m.tasks&&!h&&(k(!0),u(t.data.tasks.map(w)));const p=g.useCallback(s=>{if(s.type!=="tasks:change")return;const r=s.task;r&&u(n=>{const i=n.findIndex(d=>d.taskId===r.id),c=w({...r,status:I(r.status)});if(i===-1)return[...n,c];const a=n.slice();return a[i]={...a[i],...c},a})},[]);B("tasks:change",p);const x=g.useCallback(async(s,r,n)=>{const i=e.find(a=>a.taskId===s||a.id===s);if(!i)return;const c=I(n);u(a=>a.map(d=>d.taskId===s?{...d,columnId:c}:d));try{await D(`/api/tasks/${encodeURIComponent(i.taskId)}/status`,{method:"PATCH",body:{status:c}})}catch(a){b(a instanceof Error?a.message:String(a)),u(d=>d.map(C=>C.taskId===s?{...C,columnId:i.columnId}:C))}},[e]),l={};for(const s of e)l[s.columnId]=(l[s.columnId]||0)+1;return o.jsxs(S,{gap:4,children:[o.jsx(K,{title:"Tasks",description:"Drag cards across columns. Right-click for actions.",actions:f?o.jsx("span",{style:{color:"var(--danger)"},children:f}):null}),t.loading&&e.length===0?o.jsxs(S,{gap:3,children:[o.jsx(v,{style:{height:120}}),o.jsx(v,{style:{height:120}})]}):o.jsx(F,{columns:j,onCardMove:x,children:j.map(s=>{const r=e.filter(n=>n.columnId===s.id);return o.jsx(M,{column:{...s,count:l[s.id]||0},children:r.map(n=>o.jsx(O,{card:n},n.id))},s.id)})})]})}export{Z as TasksView};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TasksView-DVyX5-DY.js","sources":["../../src/web/v8/ui/kanban/KanbanBoard.tsx","../../src/web/v8/views/Tasks/TasksView.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport {\n DndContext,\n closestCorners,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport { cx } from '../utils/cx.js';\n\n/**\n * KanbanBoard — horizontal-scrolling board hosting multiple columns.\n *\n * The board owns drag state. It receives:\n * - columns: definition + droppable ids\n * - renderColumn: function that takes column data + isOver flag + children\n * - onCardMove: invoked when a card moves between columns (or reorders within)\n *\n * For most cases, prefer using the higher-level `KanbanBoardSimple` wrapper\n * which handles the dnd-kit boilerplate for you.\n */\n\nexport interface KanbanBoardProps {\n columns: readonly { id: string }[];\n onCardMove?: (cardId: string, fromColumnId: string, toColumnId: string) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport function KanbanBoard({ columns, onCardMove, children, className }: KanbanBoardProps) {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n const [, setActiveId] = useState<string | null>(null);\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = event;\n if (over === null) return;\n const cardId = String(active.id);\n const targetId = String(over.id);\n // The \"over\" can be a column id (drop on empty) or another card id.\n const toColumn = columns.find((c) => c.id === targetId)?.id ?? cardId.split('::')[0];\n if (toColumn === undefined) return;\n const fromColumn = cardId.split('::')[0] ?? '';\n if (fromColumn !== toColumn && onCardMove !== undefined) {\n onCardMove(cardId, fromColumn, toColumn);\n }\n };\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragStart={(e) => setActiveId(String(e.active.id))}\n onDragEnd={handleDragEnd}\n >\n <div\n className={cx('v8-kanban-board', className)}\n style={{\n display: 'grid',\n gridAutoFlow: 'column',\n gridAutoColumns: 'minmax(320px, 1fr)',\n gap: 'var(--space-4)',\n padding: 'var(--space-4) var(--space-5)',\n overflowX: 'auto',\n overflowY: 'hidden',\n height: '100%',\n width: '100%',\n alignItems: 'stretch',\n }}\n role=\"region\"\n aria-label=\"Kanban board\"\n >\n {children}\n </div>\n </DndContext>\n );\n}","import { useCallback, useState } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { KanbanBoard } from '../../ui/kanban/KanbanBoard.js';\nimport { KanbanColumn, type KanbanColumnData } from '../../ui/kanban/KanbanColumn.js';\nimport { KanbanCard, useKanbanCardSortable, type KanbanCardData } from '../../ui/kanban/KanbanCard.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Task, WsMessage } from '../../data/types.js';\n\ntype TaskStatus = 'queued' | 'doing' | 'blocked' | 'done' | 'archived';\n\n/**\n * TasksView — Sprint S10. Pulls `/api/tasks` and maps server statuses\n * to v8 kanban columns. Drag a card between columns → PATCH\n * /api/tasks/:id/status. Live updates via `tasks:change`.\n */\n\nconst COLUMNS: KanbanColumnData[] = [\n { id: 'queued', title: 'Backlog', accentTone: 'neutral' },\n { id: 'doing', title: 'In progress', accentTone: 'accent', wipLimit: 5 },\n { id: 'blocked', title: 'In review', accentTone: 'warning' },\n { id: 'done', title: 'Done', accentTone: 'success' },\n { id: 'archived', title: 'Archived', accentTone: 'neutral' },\n];\n\nconst PRIORITY_MAP: Record<string, KanbanCardData['priority']> = {\n low: 'low',\n medium: 'medium',\n high: 'high',\n urgent: 'urgent',\n};\n\ninterface Card extends KanbanCardData {\n taskId: string;\n columnId: TaskStatus;\n}\n\nfunction taskToCard(t: Task): Card {\n return {\n id: t.id,\n taskId: t.id,\n columnId: statusToColumn(t.status),\n title: t.title,\n priority: PRIORITY_MAP[t.priority || 'medium'] || 'medium',\n branch: t.branch,\n due: t.due,\n comments: t.comments,\n attachments: t.attachments,\n };\n}\n\nfunction statusToColumn(status?: TaskStatus): TaskStatus {\n switch (status) {\n case 'queued':\n case 'doing':\n case 'blocked':\n case 'done':\n case 'archived':\n return status;\n default:\n return 'queued';\n }\n}\n\n/**\n * SortableCard — wraps a single KanbanCard with dnd-kit's useSortable\n * so KanbanBoard.onDragEnd can fire.\n */\nfunction SortableCard({ card }: { card: Card }): JSX.Element {\n const sortable = useKanbanCardSortable(card.id);\n return (\n <KanbanCard\n card={card}\n isDragging={sortable.isDragging}\n dragHandleProps={{ ...sortable.attributes, ...sortable.listeners, ref: sortable.setNodeRef, style: sortable.style }}\n />\n );\n}\n\nexport function TasksView(): JSX.Element {\n const tasks = useFetch<{ tasks?: Task[]; count?: number }>('/api/tasks');\n const [cards, setCards] = useState<Card[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Sync fetched list → local state.\n if (tasks.data?.tasks && !initialized) {\n setInitialized(true);\n setCards(tasks.data.tasks.map(taskToCard));\n }\n\n const onWsChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'tasks:change') return;\n const t = msg.task as Task | undefined;\n if (!t) return;\n setCards((prev) => {\n const idx = prev.findIndex((c) => c.taskId === t.id);\n const card = taskToCard({ ...t, status: statusToColumn(t.status) });\n if (idx === -1) return [...prev, card];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...card };\n return copy;\n });\n }, []);\n useWsMessage('tasks:change', onWsChange);\n\n const onCardMove = useCallback(async (cardId: string, _from: string, to: string) => {\n const card = cards.find((c) => c.taskId === cardId || c.id === cardId);\n if (!card) return;\n const nextStatus = statusToColumn(to as TaskStatus);\n setCards((prev) =>\n prev.map((c) => (c.taskId === cardId ? { ...c, columnId: nextStatus } : c)),\n );\n try {\n await fetchJson(`/api/tasks/${encodeURIComponent(card.taskId)}/status`, {\n method: 'PATCH',\n body: { status: nextStatus },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n // Roll back on failure.\n setCards((prev) =>\n prev.map((c) => (c.taskId === cardId ? { ...c, columnId: card.columnId } : c)),\n );\n }\n }, [cards]);\n\n const counts: Record<string, number> = {};\n for (const c of cards) counts[c.columnId] = (counts[c.columnId] || 0) + 1;\n\n return (\n <Stack gap={4}>\n <ViewHeader\n title=\"Tasks\"\n description=\"Drag cards across columns. Right-click for actions.\"\n actions={error ? <span style={{ color: 'var(--danger)' }}>{error}</span> : null}\n />\n {tasks.loading && cards.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 120 }} />\n <Skeleton style={{ height: 120 }} />\n </Stack>\n ) : (\n <KanbanBoard columns={COLUMNS} onCardMove={onCardMove}>\n {COLUMNS.map((col) => {\n const inColumn = cards.filter((c) => c.columnId === col.id);\n return (\n <KanbanColumn\n key={col.id}\n column={{ ...col, count: counts[col.id] || 0 }}\n >\n {inColumn.map((card) => (\n <SortableCard key={card.id} card={card} />\n ))}\n </KanbanColumn>\n );\n })}\n </KanbanBoard>\n )}\n </Stack>\n );\n}"],"names":["KanbanBoard","columns","onCardMove","children","className","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","setActiveId","useState","handleDragEnd","event","active","over","cardId","targetId","toColumn","_a","fromColumn","jsx","DndContext","closestCorners","e","cx","COLUMNS","PRIORITY_MAP","taskToCard","statusToColumn","status","SortableCard","card","sortable","useKanbanCardSortable","KanbanCard","TasksView","tasks","useFetch","cards","setCards","initialized","setInitialized","error","setError","onWsChange","useCallback","msg","t","prev","idx","c","copy","useWsMessage","_from","to","nextStatus","fetchJson","err","counts","jsxs","Stack","ViewHeader","Skeleton","col","inColumn","KanbanColumn"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r as p,j as x}from"./cmdk-BLWIhKrV.js";import{c as g}from"./main-LxX9zTRk.js";const b=p.forwardRef(function(s,n){const{invalid:t,autoResize:a,disabled:i,rows:l=4,className:d,style:c,onInput:r,...u}=s,v={width:"100%",minHeight:64,padding:"var(--space-3)",fontSize:"var(--fs-13)",lineHeight:"var(--lh-base)",color:"var(--fg)",background:"var(--input-bg)",border:"1px solid",borderColor:t===!0?"var(--danger)":"var(--border)",borderRadius:"var(--radius-sm)",outline:0,resize:a===!0?"none":"vertical",opacity:i===!0?.55:1,fontFamily:"inherit",...c};return x.jsx("textarea",{ref:n,rows:l,disabled:i,"aria-invalid":t===!0?"true":void 0,className:g("v8-textarea",d),style:v,onInput:o=>{if(a===!0){const e=o.currentTarget;e.style.height="auto",e.style.height=`${e.scrollHeight}px`}r==null||r(o)},...u})});export{b as T};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea-Dk97nmjO.js","sources":["../../src/web/v8/ui/controls/Textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Textarea — multi-line input.\n *\n * Use for: descriptions, comments, chat input.\n * Pair with <Field> for label + hint + error.\n */\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n invalid?: boolean;\n autoResize?: boolean;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(props, ref) {\n const {\n invalid,\n autoResize,\n disabled,\n rows = 4,\n className,\n style,\n onInput,\n ...rest\n } = props;\n\n const computedStyle = {\n width: '100%',\n minHeight: 64,\n padding: 'var(--space-3)',\n fontSize: 'var(--fs-13)',\n lineHeight: 'var(--lh-base)',\n color: 'var(--fg)',\n background: 'var(--input-bg)',\n border: '1px solid',\n borderColor: invalid === true ? 'var(--danger)' : 'var(--border)',\n borderRadius: 'var(--radius-sm)',\n outline: 0,\n resize: autoResize === true ? 'none' : 'vertical',\n opacity: disabled === true ? 0.55 : 1,\n fontFamily: 'inherit',\n ...style,\n } as const;\n\n return (\n <textarea\n ref={ref}\n rows={rows}\n disabled={disabled}\n aria-invalid={invalid === true ? 'true' : undefined}\n className={cx('v8-textarea', className)}\n style={computedStyle}\n onInput={(e) => {\n if (autoResize === true) {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }\n onInput?.(e);\n }}\n {...rest}\n />\n );\n});"],"names":["Textarea","forwardRef","props","ref","invalid","autoResize","disabled","rows","className","style","onInput","rest","computedStyle","jsx","cx","e","el"],"mappings":"qFAcO,MAAMA,EAAWC,EAAAA,WAA+C,SAAkBC,EAAOC,EAAK,CACnG,KAAM,CACJ,QAAAC,EACA,WAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,EACP,UAAAC,EACA,MAAAC,EACA,QAAAC,EACA,GAAGC,CAAA,EACDT,EAEEU,EAAgB,CACpB,MAAO,OACP,UAAW,GACX,QAAS,iBACT,SAAU,eACV,WAAY,iBACZ,MAAO,YACP,WAAY,kBACZ,OAAQ,YACR,YAAaR,IAAY,GAAO,gBAAkB,gBAClD,aAAc,mBACd,QAAS,EACT,OAAQC,IAAe,GAAO,OAAS,WACvC,QAASC,IAAa,GAAO,IAAO,EACpC,WAAY,UACZ,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAAC,WAAA,CACC,IAAAV,EACA,KAAAI,EACA,SAAAD,EACA,eAAcF,IAAY,GAAO,OAAS,OAC1C,UAAWU,EAAG,cAAeN,CAAS,EACtC,MAAOI,EACP,QAAUG,GAAM,CACd,GAAIV,IAAe,GAAM,CACvB,MAAMW,EAAKD,EAAE,cACbC,EAAG,MAAM,OAAS,OAClBA,EAAG,MAAM,OAAS,GAAGA,EAAG,YAAY,IACtC,CACAN,GAAA,MAAAA,EAAUK,EACZ,EACC,GAAGJ,CAAA,CAAA,CAGV,CAAC"}
@@ -1,4 +1,4 @@
1
- import{r as g,j as e}from"./cmdk-BwN8hcKQ.js";import{a as x,c as m}from"./main-Cw6gybzS.js";/**
1
+ import{r as g,j as e}from"./cmdk-BLWIhKrV.js";import{b as x,c as m}from"./main-LxX9zTRk.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- {"version":3,"file":"ViewHeader-D6c2cw1b.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../src/web/v8/ui/data/ViewHeader.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ViewHeader — page-level header pattern (title, description, breadcrumb, actions).\n *\n * Layout:\n * [Breadcrumb]\n * [Title] [Primary action]\n * [Description] [Secondary actions...]\n *\n * Use at the top of every view: Overview, Tasks, Goals, Agents, etc.\n */\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface ViewHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n /** Optional breadcrumb trail rendered above the title. */\n breadcrumb?: readonly BreadcrumbItem[];\n /** Primary action (e.g. \"New task\"). */\n action?: ReactNode;\n /** Secondary actions (e.g. filter, export). */\n actions?: ReactNode;\n /** Optional metadata row below the description (e.g. status pills, counts). */\n meta?: ReactNode;\n}\n\nexport const ViewHeader = forwardRef<HTMLDivElement, ViewHeaderProps>(function ViewHeader(\n props,\n ref,\n) {\n const { title, description, breadcrumb, action, actions, meta, className, style, ...rest } = props;\n return (\n <header\n ref={ref}\n className={cx('v8-view-header', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-4) 0 var(--space-5)',\n borderBottom: '1px solid var(--border)',\n marginBottom: 'var(--space-5)',\n ...style,\n }}\n {...rest}\n >\n {breadcrumb !== undefined && breadcrumb.length > 0 && (\n <nav\n aria-label=\"Breadcrumb\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n marginBottom: 'var(--space-1)',\n }}\n >\n {breadcrumb.map((item, i) => {\n const isLast = i === breadcrumb.length - 1;\n return (\n <span\n key={i}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}\n >\n {item.onClick !== undefined ? (\n <button\n onClick={item.onClick}\n style={{\n background: 'transparent',\n border: 0,\n padding: 0,\n font: 'inherit',\n color: 'inherit',\n cursor: 'pointer',\n }}\n >\n {item.label}\n </button>\n ) : (\n <span style={{ color: isLast ? 'var(--fg)' : 'inherit' }}>{item.label}</span>\n )}\n {!isLast && (\n <ChevronRight size={12} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n )}\n </span>\n );\n })}\n </nav>\n )}\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-4)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h1 style={{ fontSize: 'var(--fs-24)', lineHeight: 'var(--lh-tight)', fontWeight: 600, margin: 0, color: 'var(--fg)' }}>\n {title}\n </h1>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 4 }}>\n {description}\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexShrink: 0 }}>\n {actions}\n {action}\n </div>\n </div>\n {meta !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexWrap: 'wrap' }}>\n {meta}\n </div>\n )}\n </header>\n );\n});"],"names":["ChevronRight","createLucideIcon","ViewHeader","forwardRef","props","ref","title","description","breadcrumb","action","actions","meta","className","style","rest","jsxs","cx","jsx","item","isLast"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC,ECuBYC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAC,EAAO,YAAAC,EAAa,WAAAC,EAAY,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,EAAM,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASV,EAC7F,OACEW,EAAAA,KAAC,SAAA,CACC,IAAAV,EACA,UAAWW,EAAG,iBAAkBJ,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,iBACL,QAAS,kCACT,aAAc,0BACd,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAN,IAAe,QAAaA,EAAW,OAAS,GAC/CS,EAAAA,IAAC,MAAA,CACC,aAAW,aACX,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,SAAU,eACV,MAAO,mBACP,aAAc,gBAAA,EAGf,SAAAT,EAAW,IAAI,CAACU,EAAM,IAAM,CAC3B,MAAMC,EAAS,IAAMX,EAAW,OAAS,EACzC,OACEO,EAAAA,KAAC,OAAA,CAEC,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAA,EAE3D,SAAA,CAAAG,EAAK,UAAY,OAChBD,EAAAA,IAAC,SAAA,CACC,QAASC,EAAK,QACd,MAAO,CACL,WAAY,cACZ,OAAQ,EACR,QAAS,EACT,KAAM,UACN,MAAO,UACP,OAAQ,SAAA,EAGT,SAAAA,EAAK,KAAA,CAAA,EAGRD,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOE,EAAS,YAAc,SAAA,EAAc,SAAAD,EAAK,KAAA,CAAM,EAEvE,CAACC,GACAF,EAAAA,IAACjB,EAAA,CAAa,KAAM,GAAI,cAAY,OAAO,MAAO,CAAE,MAAO,kBAAA,CAAmB,CAAG,CAAA,CAAA,EArB9E,CAAA,CAyBX,CAAC,CAAA,CAAA,EAGLe,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,aAAc,eAAgB,gBAAiB,IAAK,gBAAA,EAC7F,SAAA,CAAAA,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,SAAU,eAAgB,WAAY,kBAAmB,WAAY,IAAK,OAAQ,EAAG,MAAO,aACtG,SAAAX,EACH,EACCC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAV,CAAA,CACH,CAAA,EAEJ,EACAQ,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,WAAY,CAAA,EACrF,SAAA,CAAAL,EACAD,CAAA,CAAA,CACH,CAAA,EACF,EACCE,IAAS,QACRM,MAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,SAAU,MAAA,EACnF,SAAAN,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ViewHeader-dPd4zAyj.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../src/web/v8/ui/data/ViewHeader.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ViewHeader — page-level header pattern (title, description, breadcrumb, actions).\n *\n * Layout:\n * [Breadcrumb]\n * [Title] [Primary action]\n * [Description] [Secondary actions...]\n *\n * Use at the top of every view: Overview, Tasks, Goals, Agents, etc.\n */\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface ViewHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n /** Optional breadcrumb trail rendered above the title. */\n breadcrumb?: readonly BreadcrumbItem[];\n /** Primary action (e.g. \"New task\"). */\n action?: ReactNode;\n /** Secondary actions (e.g. filter, export). */\n actions?: ReactNode;\n /** Optional metadata row below the description (e.g. status pills, counts). */\n meta?: ReactNode;\n}\n\nexport const ViewHeader = forwardRef<HTMLDivElement, ViewHeaderProps>(function ViewHeader(\n props,\n ref,\n) {\n const { title, description, breadcrumb, action, actions, meta, className, style, ...rest } = props;\n return (\n <header\n ref={ref}\n className={cx('v8-view-header', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-4) 0 var(--space-5)',\n borderBottom: '1px solid var(--border)',\n marginBottom: 'var(--space-5)',\n ...style,\n }}\n {...rest}\n >\n {breadcrumb !== undefined && breadcrumb.length > 0 && (\n <nav\n aria-label=\"Breadcrumb\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n marginBottom: 'var(--space-1)',\n }}\n >\n {breadcrumb.map((item, i) => {\n const isLast = i === breadcrumb.length - 1;\n return (\n <span\n key={i}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}\n >\n {item.onClick !== undefined ? (\n <button\n onClick={item.onClick}\n style={{\n background: 'transparent',\n border: 0,\n padding: 0,\n font: 'inherit',\n color: 'inherit',\n cursor: 'pointer',\n }}\n >\n {item.label}\n </button>\n ) : (\n <span style={{ color: isLast ? 'var(--fg)' : 'inherit' }}>{item.label}</span>\n )}\n {!isLast && (\n <ChevronRight size={12} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n )}\n </span>\n );\n })}\n </nav>\n )}\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-4)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h1 style={{ fontSize: 'var(--fs-24)', lineHeight: 'var(--lh-tight)', fontWeight: 600, margin: 0, color: 'var(--fg)' }}>\n {title}\n </h1>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 4 }}>\n {description}\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexShrink: 0 }}>\n {actions}\n {action}\n </div>\n </div>\n {meta !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexWrap: 'wrap' }}>\n {meta}\n </div>\n )}\n </header>\n );\n});"],"names":["ChevronRight","createLucideIcon","ViewHeader","forwardRef","props","ref","title","description","breadcrumb","action","actions","meta","className","style","rest","jsxs","cx","jsx","item","isLast"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC,ECuBYC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAC,EAAO,YAAAC,EAAa,WAAAC,EAAY,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,EAAM,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASV,EAC7F,OACEW,EAAAA,KAAC,SAAA,CACC,IAAAV,EACA,UAAWW,EAAG,iBAAkBJ,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,iBACL,QAAS,kCACT,aAAc,0BACd,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAN,IAAe,QAAaA,EAAW,OAAS,GAC/CS,EAAAA,IAAC,MAAA,CACC,aAAW,aACX,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,SAAU,eACV,MAAO,mBACP,aAAc,gBAAA,EAGf,SAAAT,EAAW,IAAI,CAACU,EAAM,IAAM,CAC3B,MAAMC,EAAS,IAAMX,EAAW,OAAS,EACzC,OACEO,EAAAA,KAAC,OAAA,CAEC,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAA,EAE3D,SAAA,CAAAG,EAAK,UAAY,OAChBD,EAAAA,IAAC,SAAA,CACC,QAASC,EAAK,QACd,MAAO,CACL,WAAY,cACZ,OAAQ,EACR,QAAS,EACT,KAAM,UACN,MAAO,UACP,OAAQ,SAAA,EAGT,SAAAA,EAAK,KAAA,CAAA,EAGRD,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOE,EAAS,YAAc,SAAA,EAAc,SAAAD,EAAK,KAAA,CAAM,EAEvE,CAACC,GACAF,EAAAA,IAACjB,EAAA,CAAa,KAAM,GAAI,cAAY,OAAO,MAAO,CAAE,MAAO,kBAAA,CAAmB,CAAG,CAAA,CAAA,EArB9E,CAAA,CAyBX,CAAC,CAAA,CAAA,EAGLe,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,aAAc,eAAgB,gBAAiB,IAAK,gBAAA,EAC7F,SAAA,CAAAA,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,SAAU,eAAgB,WAAY,kBAAmB,WAAY,IAAK,OAAQ,EAAG,MAAO,aACtG,SAAAX,EACH,EACCC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAV,CAAA,CACH,CAAA,EAEJ,EACAQ,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,WAAY,CAAA,EACrF,SAAA,CAAAL,EACAD,CAAA,CAAA,CACH,CAAA,EACF,EACCE,IAAS,QACRM,MAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,SAAU,MAAA,EACnF,SAAAN,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,CAAC","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{a}from"./main-Cw6gybzS.js";/**
1
+ import{b as a}from"./main-LxX9zTRk.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- {"version":3,"file":"brain-DeoXNDE2.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/brain.js"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"kCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"brain-BajPVibR.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/brain.js"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +1,6 @@
1
- import{a as e}from"./main-Cw6gybzS.js";/**
1
+ import{b as e}from"./main-LxX9zTRk.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const t=e("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);export{t as C};
6
+ */const a=e("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);export{a as C};
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-DRlQkGJc.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/calendar.js"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Calendar = createLucideIcon(\"Calendar\", [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n]);\n\nexport { Calendar as default };\n//# sourceMappingURL=calendar.js.map\n"],"names":["Calendar","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAQ,CAAE,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC9E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"calendar-CaP_Bbgc.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/calendar.js"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Calendar = createLucideIcon(\"Calendar\", [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n]);\n\nexport { Calendar as default };\n//# sourceMappingURL=calendar.js.map\n"],"names":["Calendar","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAQ,CAAE,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC9E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}