@polderlabs/bizar 6.3.0 → 7.0.1

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 (264) hide show
  1. package/.claude/hooks/sessionend-recall.mjs +3 -3
  2. package/.claude/hooks/worker-suggest.mjs +110 -0
  3. package/.claude/settings.json +9 -0
  4. package/README.md +125 -47
  5. package/bizar-dash/dist/assets/{EnvVarsSection-B58aiJiE.js → EnvVarsSection-weVnLz3Z.js} +3 -3
  6. package/bizar-dash/dist/assets/EnvVarsSection-weVnLz3Z.js.map +1 -0
  7. package/bizar-dash/dist/assets/MobileChat-BRFjer8p.js +1 -0
  8. package/bizar-dash/dist/assets/{MobileChat-BJrqwVDd.js.map → MobileChat-BRFjer8p.js.map} +1 -1
  9. package/bizar-dash/dist/assets/MobileSettings-Dw5jyJWi.js +1 -0
  10. package/bizar-dash/dist/assets/MobileSettings-Dw5jyJWi.js.map +1 -0
  11. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js → Toast-WTxc3m2g.js} +1 -1
  12. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js.map → Toast-WTxc3m2g.js.map} +1 -1
  13. package/bizar-dash/dist/assets/flow-BpU0-gK2.js +1 -0
  14. package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +1 -0
  15. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +1 -0
  16. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +1 -0
  17. package/bizar-dash/dist/assets/{icons-Do5N2jmX.js → icons-B0AKnYI3.js} +98 -103
  18. package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +1 -0
  19. package/bizar-dash/dist/assets/main-BE4Uh9im.css +1 -0
  20. package/bizar-dash/dist/assets/main-DqC58FEZ.js +18 -0
  21. package/bizar-dash/dist/assets/main-DqC58FEZ.js.map +1 -0
  22. package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +1 -0
  23. package/bizar-dash/dist/assets/markdown-w2bDDkAH.js.map +1 -0
  24. package/bizar-dash/dist/assets/mobile-DRZsK3ic.js +1 -0
  25. package/bizar-dash/dist/assets/{mobile-DYCHcUpq.js.map → mobile-DRZsK3ic.js.map} +1 -1
  26. package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +1 -0
  27. package/bizar-dash/dist/assets/mobile-layout-Ckru3HKJ.js +2 -0
  28. package/bizar-dash/dist/assets/mobile-layout-Ckru3HKJ.js.map +1 -0
  29. package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +1 -0
  30. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +46 -0
  31. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +1 -0
  32. package/bizar-dash/dist/assets/useSlashCommands-BAxVOU_a.js +2 -0
  33. package/bizar-dash/dist/assets/useSlashCommands-BAxVOU_a.js.map +1 -0
  34. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +45 -0
  35. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +1 -0
  36. package/bizar-dash/dist/index.html +13 -11
  37. package/bizar-dash/dist/mobile.html +8 -5
  38. package/bizar-dash/src/server/api.mjs +11 -0
  39. package/bizar-dash/src/server/memory-consolidator.mjs +225 -0
  40. package/bizar-dash/src/server/memory-distillation.mjs +296 -0
  41. package/bizar-dash/src/server/routes/distill.mjs +129 -0
  42. package/bizar-dash/src/server/routes/goal-planner.mjs +236 -0
  43. package/bizar-dash/src/web/App.tsx +4 -0
  44. package/bizar-dash/src/web/components/Tag.tsx +18 -5
  45. package/bizar-dash/src/web/components/Topbar.tsx +3 -0
  46. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +126 -0
  47. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +163 -0
  48. package/bizar-dash/src/web/components/agents/QualityGates.tsx +123 -0
  49. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +127 -0
  50. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +148 -0
  51. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +160 -0
  52. package/bizar-dash/src/web/components/goals/GoalInput.tsx +86 -0
  53. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +111 -0
  54. package/bizar-dash/src/web/lib/goapPlanner.ts +614 -0
  55. package/bizar-dash/src/web/lib/types.ts +25 -0
  56. package/bizar-dash/src/web/mobile/MobileApp.tsx +33 -2
  57. package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +2 -2
  58. package/bizar-dash/src/web/mobile/MobileEval.tsx +4 -4
  59. package/bizar-dash/src/web/mobile/MobileMemory.tsx +2 -2
  60. package/bizar-dash/src/web/mobile/MobileSettings.tsx +3 -3
  61. package/bizar-dash/src/web/mobile/MobileTasks.tsx +2 -2
  62. package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +3 -3
  63. package/bizar-dash/src/web/styles/agents-redesign.css +311 -0
  64. package/bizar-dash/src/web/styles/main.css +251 -0
  65. package/bizar-dash/src/web/styles/mobile.css +41 -0
  66. package/bizar-dash/src/web/styles/tasks-redesign.css +253 -0
  67. package/bizar-dash/src/web/ui/controls/Button.tsx +77 -0
  68. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +95 -0
  69. package/bizar-dash/src/web/ui/controls/IconButton.tsx +66 -0
  70. package/bizar-dash/src/web/ui/controls/Kbd.tsx +24 -0
  71. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +77 -0
  72. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +109 -0
  73. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +91 -0
  74. package/bizar-dash/src/web/ui/controls/Select.tsx +92 -0
  75. package/bizar-dash/src/web/ui/controls/Slider.tsx +70 -0
  76. package/bizar-dash/src/web/ui/controls/TextInput.tsx +67 -0
  77. package/bizar-dash/src/web/ui/controls/Textarea.tsx +56 -0
  78. package/bizar-dash/src/web/ui/controls/Toggle.tsx +79 -0
  79. package/bizar-dash/src/web/ui/controls/controls.css +476 -0
  80. package/bizar-dash/src/web/ui/controls/index.ts +35 -0
  81. package/bizar-dash/src/web/ui/data/BarChart.tsx +60 -0
  82. package/bizar-dash/src/web/ui/data/DataTable.tsx +216 -0
  83. package/bizar-dash/src/web/ui/data/EmptyState.tsx +60 -0
  84. package/bizar-dash/src/web/ui/data/ErrorState.tsx +56 -0
  85. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +106 -0
  86. package/bizar-dash/src/web/ui/data/LoadingState.tsx +65 -0
  87. package/bizar-dash/src/web/ui/data/Sparkline.tsx +87 -0
  88. package/bizar-dash/src/web/ui/data/StatTile.tsx +87 -0
  89. package/bizar-dash/src/web/ui/data/data.css +535 -0
  90. package/bizar-dash/src/web/ui/data/index.ts +31 -0
  91. package/bizar-dash/src/web/ui/feedback/Badge.tsx +49 -0
  92. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +209 -0
  93. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +69 -0
  94. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +50 -0
  95. package/bizar-dash/src/web/ui/feedback/Toast.tsx +200 -0
  96. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +126 -0
  97. package/bizar-dash/src/web/ui/feedback/feedback.css +314 -0
  98. package/bizar-dash/src/web/ui/feedback/index.ts +43 -0
  99. package/bizar-dash/src/web/ui/index.ts +56 -0
  100. package/bizar-dash/src/web/ui/layout/AppShell.tsx +51 -0
  101. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +97 -0
  102. package/bizar-dash/src/web/ui/layout/Panel.tsx +73 -0
  103. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +39 -0
  104. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +131 -0
  105. package/bizar-dash/src/web/ui/layout/Tabs.tsx +133 -0
  106. package/bizar-dash/src/web/ui/layout/Topbar.tsx +42 -0
  107. package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +48 -0
  108. package/bizar-dash/src/web/ui/layout/index.ts +34 -0
  109. package/bizar-dash/src/web/ui/layout/layout.css +464 -0
  110. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +199 -0
  111. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +95 -0
  112. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +93 -0
  113. package/bizar-dash/src/web/ui/navigation/index.ts +17 -0
  114. package/bizar-dash/src/web/ui/navigation/navigation.css +343 -0
  115. package/bizar-dash/src/web/ui/primitives/Box.tsx +91 -0
  116. package/bizar-dash/src/web/ui/primitives/Grid.tsx +49 -0
  117. package/bizar-dash/src/web/ui/primitives/Inline.tsx +55 -0
  118. package/bizar-dash/src/web/ui/primitives/Separator.tsx +46 -0
  119. package/bizar-dash/src/web/ui/primitives/Stack.tsx +54 -0
  120. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +26 -0
  121. package/bizar-dash/src/web/ui/primitives/index.ts +23 -0
  122. package/bizar-dash/src/web/ui/primitives/primitives.css +183 -0
  123. package/bizar-dash/src/web/ui/styles/globals.css +86 -0
  124. package/bizar-dash/src/web/ui/styles/reset.css +125 -0
  125. package/bizar-dash/src/web/ui/styles/tokens.css +208 -0
  126. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +142 -0
  127. package/bizar-dash/src/web/ui/theme/tokens.ts +131 -0
  128. package/bizar-dash/src/web/ui/theme/useTheme.ts +22 -0
  129. package/bizar-dash/src/web/ui/utils/cx.ts +42 -0
  130. package/bizar-dash/src/web/views/Agents.tsx +516 -268
  131. package/bizar-dash/src/web/views/GoalPlanner.tsx +158 -0
  132. package/bizar-dash/src/web/views/Overview.tsx +985 -448
  133. package/bizar-dash/src/web/views/Tasks.tsx +271 -273
  134. package/bizar-dash/tests/communication-log.test.tsx +67 -0
  135. package/bizar-dash/tests/dep-graph.test.tsx +40 -0
  136. package/bizar-dash/tests/event-log.test.tsx +61 -0
  137. package/bizar-dash/tests/goal-input.test.tsx +72 -0
  138. package/bizar-dash/tests/goap-planner.test.ts +68 -0
  139. package/bizar-dash/tests/quality-gates.test.tsx +59 -0
  140. package/bizar-dash/tests/setup.ts +31 -1
  141. package/bizar-dash/tests/ui/controls/Button.test.tsx +50 -0
  142. package/bizar-dash/tests/ui/controls/Checkbox.test.tsx +44 -0
  143. package/bizar-dash/tests/ui/controls/IconButton.test.tsx +37 -0
  144. package/bizar-dash/tests/ui/controls/Kbd.test.tsx +39 -0
  145. package/bizar-dash/tests/ui/controls/NumberInput.test.tsx +56 -0
  146. package/bizar-dash/tests/ui/controls/RadioGroup.test.tsx +58 -0
  147. package/bizar-dash/tests/ui/controls/SearchInput.test.tsx +52 -0
  148. package/bizar-dash/tests/ui/controls/Select.test.tsx +66 -0
  149. package/bizar-dash/tests/ui/controls/Slider.test.tsx +41 -0
  150. package/bizar-dash/tests/ui/controls/TextInput.test.tsx +44 -0
  151. package/bizar-dash/tests/ui/controls/Textarea.test.tsx +56 -0
  152. package/bizar-dash/tests/ui/controls/Toggle.test.tsx +39 -0
  153. package/bizar-dash/tests/ui/data/BarChart.test.tsx +55 -0
  154. package/bizar-dash/tests/ui/data/DataTable.test.tsx +112 -0
  155. package/bizar-dash/tests/ui/data/EmptyState.test.tsx +57 -0
  156. package/bizar-dash/tests/ui/data/ErrorState.test.tsx +47 -0
  157. package/bizar-dash/tests/ui/data/KeyValueList.test.tsx +59 -0
  158. package/bizar-dash/tests/ui/data/LoadingState.test.tsx +37 -0
  159. package/bizar-dash/tests/ui/data/Sparkline.test.tsx +56 -0
  160. package/bizar-dash/tests/ui/data/StatTile.test.tsx +69 -0
  161. package/bizar-dash/tests/ui/feedback/Badge.test.tsx +41 -0
  162. package/bizar-dash/tests/ui/feedback/Dialog.test.tsx +99 -0
  163. package/bizar-dash/tests/ui/feedback/ProgressBar.test.tsx +66 -0
  164. package/bizar-dash/tests/ui/feedback/StatusDot.test.tsx +41 -0
  165. package/bizar-dash/tests/ui/feedback/Toast.test.tsx +124 -0
  166. package/bizar-dash/tests/ui/feedback/Tooltip.test.tsx +102 -0
  167. package/bizar-dash/tests/ui/layout/AppShell.test.tsx +50 -0
  168. package/bizar-dash/tests/ui/layout/Breadcrumbs.test.tsx +85 -0
  169. package/bizar-dash/tests/ui/layout/Panel.test.tsx +52 -0
  170. package/bizar-dash/tests/ui/layout/PanelHeader.test.tsx +32 -0
  171. package/bizar-dash/tests/ui/layout/Sidebar.test.tsx +95 -0
  172. package/bizar-dash/tests/ui/layout/Tabs.test.tsx +87 -0
  173. package/bizar-dash/tests/ui/layout/Topbar.test.tsx +41 -0
  174. package/bizar-dash/tests/ui/layout/ViewHeader.test.tsx +47 -0
  175. package/bizar-dash/tests/ui/navigation/CommandPalette.test.tsx +105 -0
  176. package/bizar-dash/tests/ui/navigation/NavGroup.test.tsx +55 -0
  177. package/bizar-dash/tests/ui/navigation/NavLink.test.tsx +61 -0
  178. package/bizar-dash/tests/ui/primitives/Box.test.tsx +49 -0
  179. package/bizar-dash/tests/ui/primitives/Grid.test.tsx +37 -0
  180. package/bizar-dash/tests/ui/primitives/Inline.test.tsx +33 -0
  181. package/bizar-dash/tests/ui/primitives/Separator.test.tsx +34 -0
  182. package/bizar-dash/tests/ui/primitives/Stack.test.tsx +45 -0
  183. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +27 -0
  184. package/bizar-dash/tests/views/Agents.test.tsx +359 -0
  185. package/bizar-dash/tests/views/Overview.test.tsx +413 -0
  186. package/bizar-dash/tests/views/Tasks.test.tsx +250 -0
  187. package/bizar-dash/vitest.config.ts +3 -1
  188. package/cli/__tests__/cost-gate.test.mjs +301 -0
  189. package/cli/__tests__/feature-list-bridge.test.mjs +371 -0
  190. package/cli/bin.mjs +38 -0
  191. package/cli/commands/claim.mjs +282 -0
  192. package/cli/commands/cost.mjs +279 -0
  193. package/cli/cost-gate.mjs +501 -0
  194. package/cli/feature-list-bridge.mjs +400 -0
  195. package/cli/memory-constants.mjs +17 -0
  196. package/cli/provision-claude.mjs +94 -0
  197. package/cli/worker-dispatcher.mjs +259 -0
  198. package/cli/worker-dispatcher.test.mjs +204 -0
  199. package/config/trigger-patterns.json +186 -0
  200. package/package.json +2 -2
  201. package/packages/sdk/package.json +1 -1
  202. package/packages/sdk/src/agent-registry.ts +304 -0
  203. package/packages/sdk/src/consensus/byzantine.ts +587 -0
  204. package/packages/sdk/src/consensus/index.ts +147 -0
  205. package/packages/sdk/src/consensus/queen.ts +173 -0
  206. package/packages/sdk/src/consensus/types.ts +199 -0
  207. package/packages/sdk/src/federation/audit.ts +156 -0
  208. package/packages/sdk/src/federation/budget.ts +269 -0
  209. package/packages/sdk/src/federation/envelope.ts +144 -0
  210. package/packages/sdk/src/federation/hmac.ts +160 -0
  211. package/packages/sdk/src/federation/index.ts +443 -0
  212. package/packages/sdk/src/federation/pii.ts +241 -0
  213. package/packages/sdk/src/federation/policy.ts +112 -0
  214. package/packages/sdk/src/federation/trust.ts +146 -0
  215. package/packages/sdk/src/index.ts +67 -0
  216. package/packages/sdk/src/mcp/server.ts +351 -1
  217. package/packages/sdk/src/router/codemod-intent.ts +125 -0
  218. package/packages/sdk/src/router/index.ts +247 -0
  219. package/packages/sdk/src/router/memory-distillation-shim.mjs +18 -0
  220. package/packages/sdk/src/router/memory-distillation.ts +249 -0
  221. package/packages/sdk/src/router/model-router.ts +235 -0
  222. package/packages/sdk/src/router/q-learning-router.ts +304 -0
  223. package/packages/sdk/src/swarm-topology.ts +279 -0
  224. package/packages/sdk/tests/agent-registry.test.ts +285 -0
  225. package/packages/sdk/tests/consensus.test.ts +376 -0
  226. package/packages/sdk/tests/federation/audit.test.ts +164 -0
  227. package/packages/sdk/tests/federation/budget.test.ts +189 -0
  228. package/packages/sdk/tests/federation/envelope.test.ts +120 -0
  229. package/packages/sdk/tests/federation/hmac.test.ts +194 -0
  230. package/packages/sdk/tests/federation/orchestrator.test.ts +176 -0
  231. package/packages/sdk/tests/federation/pii.test.ts +106 -0
  232. package/packages/sdk/tests/federation/policy.test.ts +140 -0
  233. package/packages/sdk/tests/federation/trust.test.ts +124 -0
  234. package/packages/sdk/tests/mcp-tools.test.ts +204 -0
  235. package/packages/sdk/tests/memory-distillation.test.mjs +186 -0
  236. package/packages/sdk/tests/model-router.test.mjs +108 -0
  237. package/packages/sdk/tests/q-learning-router.test.mjs +100 -0
  238. package/packages/sdk/tests/router-orchestrator.test.mjs +172 -0
  239. package/packages/sdk/tests/router.test.mjs +91 -0
  240. package/packages/sdk/tests/sdk.test.mjs +26 -2
  241. package/packages/sdk/tests/swarm-topology.test.ts +258 -0
  242. package/scripts/bh-full-e2e.mjs +11 -15
  243. package/bizar-dash/dist/assets/EnvVarsSection-B58aiJiE.js.map +0 -1
  244. package/bizar-dash/dist/assets/MobileChat-BJrqwVDd.js +0 -1
  245. package/bizar-dash/dist/assets/MobileSettings-CEQNJNLJ.js +0 -1
  246. package/bizar-dash/dist/assets/MobileSettings-CEQNJNLJ.js.map +0 -1
  247. package/bizar-dash/dist/assets/icons-Do5N2jmX.js.map +0 -1
  248. package/bizar-dash/dist/assets/main-IvfQAOfy.js +0 -18
  249. package/bizar-dash/dist/assets/main-IvfQAOfy.js.map +0 -1
  250. package/bizar-dash/dist/assets/main-ietCEg_R.css +0 -1
  251. package/bizar-dash/dist/assets/markdown-tOLaD6nm.js +0 -1
  252. package/bizar-dash/dist/assets/markdown-tOLaD6nm.js.map +0 -1
  253. package/bizar-dash/dist/assets/mobile-DYCHcUpq.js +0 -1
  254. package/bizar-dash/dist/assets/mobile-layout-CBHjpwsb.js +0 -2
  255. package/bizar-dash/dist/assets/mobile-layout-CBHjpwsb.js.map +0 -1
  256. package/bizar-dash/dist/assets/mobile-layout-CJnZNLy3.css +0 -1
  257. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js +0 -40
  258. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js.map +0 -1
  259. package/bizar-dash/dist/assets/useSlashCommands-Bd7_FA6U.js +0 -2
  260. package/bizar-dash/dist/assets/useSlashCommands-Bd7_FA6U.js.map +0 -1
  261. package/bizar-dash/dist/assets/vendor-C843201K.js +0 -29
  262. package/bizar-dash/dist/assets/vendor-C843201K.js.map +0 -1
  263. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  264. package/packages/sdk/package-lock.json +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"MobileChat-BJrqwVDd.js","sources":["../../src/web/components/chat/FloatingComposer.tsx","../../src/web/mobile/MobileChat.tsx"],"sourcesContent":["// src/components/chat/FloatingComposer.tsx — sticky bottom wrapper for the composer pill.\n\nimport { Composer } from './Composer';\n\ninterface Props {\n agent: string;\n setAgent: (a: string) => void;\n model: string;\n setModel: (m: string) => void;\n text: string;\n setText: (t: string) => void;\n sending: boolean;\n onSend: () => void;\n attachments: string[];\n setAttachments: (a: string[] | ((prev: string[]) => string[])) => void;\n suggestions: Array<{ cmd: string; desc: string }>;\n onPickSuggestion: (cmd: string) => void;\n agents: Array<{ name: string }>;\n onAttach: () => void;\n sessionsOpen: boolean;\n infoOpen: boolean;\n /** Which stream will receive the next message — propagates the\n * pill border color and a small \"→ cline\" hint. */\n activeSource?: 'bizar' | 'cline' | null;\n}\n\nexport function FloatingComposer(props: Props) {\n const { activeSource } = props;\n return (\n <div\n className={`chat-composer-wrap chat-composer-source-${activeSource ?? 'none'} legacy`}\n >\n <div className=\"chat-composer-pill\">\n <Composer {...props} />\n </div>\n </div>\n );\n}","// src/web/mobile/MobileChat.tsx — mobile chat UI without info/sessions sidebars.\n// No OCR capture, no clipper, no sessions panel — pure chat thread.\nimport { useEffect, useRef, useState } from 'react';\nimport { ChatTopBar } from '../components/chat/ChatTopBar';\nimport { ChatThread } from '../components/chat/ChatThread';\nimport { FloatingComposer } from '../components/chat/FloatingComposer';\nimport { useChat } from '../components/chat/useChat';\nimport { useSlashCommands } from '../components/chat/useSlashCommands';\nimport { useToast } from '../components/Toast';\nimport type { Snapshot, Settings } from '../lib/types';\n\ninterface Props {\n snapshot: Snapshot;\n settings: Settings;\n setActiveTab?: (id: string) => void;\n initialTaskId?: string | null;\n onClearTaskId?: () => void;\n}\n\nexport function MobileChat({\n snapshot,\n settings,\n setActiveTab,\n initialTaskId,\n onClearTaskId,\n}: Props) {\n const toast = useToast();\n const chat = useChat(snapshot, settings, initialTaskId ?? '');\n useEffect(() => {\n chat.setToast({\n error: (msg: string) => toast.error(msg),\n success: (msg: string) => toast.success(msg),\n info: (msg: string) => toast.info(msg),\n warning: (msg: string) => toast.warning(msg),\n });\n }, [chat, toast]);\n\n const [text, setText] = useState('');\n const [agent, setAgent] = useState(settings.defaultAgent || 'odin');\n const [model, setModel] = useState(settings.defaultModel || '');\n const [attachments, setAttachments] = useState<string[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { suggestions, setQuery } = useSlashCommands(snapshot);\n useEffect(() => {\n setQuery(text);\n }, [text, setQuery]);\n\n const onAttach = () => fileInputRef.current?.click();\n const onFiles = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const next: string[] = [];\n for (let i = 0; i < files.length; i++) next.push(files[i].name);\n setAttachments((cur) => {\n const newNames = next.filter((n) => !cur.includes(n));\n return [...cur, ...newNames];\n });\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleSend = async () => {\n const msg = text.trim();\n if (!msg) return;\n setText('');\n setQuery('');\n const result = await chat.onSend(msg, agent, model, attachments);\n if (result.ok) chat.jumpToLatest();\n };\n\n return (\n <div className=\"chat-shell\">\n <ChatTopBar\n activeProject={snapshot.activeProject}\n sessionCount={chat.sessions.length}\n sessionsOpen={false}\n infoOpen={false}\n onToggleSessions={() => undefined}\n onToggleInfo={() => undefined}\n onOpenOverview={() => setActiveTab?.('overview')}\n />\n <div className=\"chat-body\">\n <main className=\"chat-main\">\n <ChatThread\n messages={\n chat.activeSource === 'cline'\n ? chat.clineMessages\n : chat.bizarMessages\n }\n loading={chat.loading}\n activeProject={snapshot.activeProject}\n sessionId={\n chat.activeSource === 'cline'\n ? chat.activeClineSessionId ?? chat.sessionId\n : chat.sessionId\n }\n pinned={chat.pinned}\n activeSource={chat.activeSource}\n onPickSuggestion={(t) => setText(t)}\n onCopy={(m) =>\n chat.copyMessage(m as Parameters<typeof chat.copyMessage>[0])\n }\n onDelete={() => undefined}\n onTogglePin={chat.togglePin}\n onRegenerate={chat.onRegenerate}\n />\n <FloatingComposer\n agent={agent}\n setAgent={setAgent}\n model={model}\n setModel={setModel}\n text={text}\n setText={setText}\n sending={chat.sending}\n activeSource={chat.activeSource}\n onSend={handleSend}\n attachments={attachments}\n setAttachments={setAttachments}\n suggestions={suggestions}\n onPickSuggestion={(cmd) => setText(`${cmd.split(' ')[0]} `)}\n agents={snapshot.agents || []}\n onAttach={onAttach}\n sessionsOpen={false}\n infoOpen={false}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n onChange={onFiles}\n />\n </main>\n </div>\n </div>\n );\n}\n"],"names":["FloatingComposer","props","activeSource","jsx","Composer","MobileChat","snapshot","settings","setActiveTab","initialTaskId","onClearTaskId","toast","useToast","chat","useChat","useEffect","msg","text","setText","useState","agent","setAgent","model","setModel","attachments","setAttachments","fileInputRef","useRef","suggestions","setQuery","useSlashCommands","onAttach","_a","onFiles","files","next","i","cur","newNames","n","handleSend","jsxs","ChatTopBar","ChatThread","t","m","cmd"],"mappings":"ySA0BO,SAASA,EAAiBC,EAAc,CAC7C,KAAM,CAAE,aAAAC,GAAiBD,EACzB,OACEE,EAAAA,IAAC,MAAA,CACC,UAAW,2CAA2CD,GAAgB,MAAM,UAE5E,SAAAC,EAAAA,IAAC,OAAI,UAAU,qBACb,eAACC,EAAA,CAAU,GAAGH,EAAO,CAAA,CACvB,CAAA,CAAA,CAGN,CClBO,SAASI,EAAW,CACzB,SAAAC,EACA,SAAAC,EACA,aAAAC,EACA,cAAAC,EACA,cAAAC,CACF,EAAU,CACR,MAAMC,EAAQC,EAAA,EACRC,EAAOC,EAAQR,EAAUC,EAAUE,GAAiB,EAAE,EAC5DM,EAAAA,UAAU,IAAM,CACdF,EAAK,SAAS,CACZ,MAAQG,GAAgBL,EAAM,MAAMK,CAAG,EACvC,QAAUA,GAAgBL,EAAM,QAAQK,CAAG,EAC3C,KAAOA,GAAgBL,EAAM,KAAKK,CAAG,EACrC,QAAUA,GAAgBL,EAAM,QAAQK,CAAG,CAAA,CAC5C,CACH,EAAG,CAACH,EAAMF,CAAK,CAAC,EAEhB,KAAM,CAACM,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAE,EAC7B,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAASZ,EAAS,cAAgB,MAAM,EAC5D,CAACe,EAAOC,CAAQ,EAAIJ,EAAAA,SAASZ,EAAS,cAAgB,EAAE,EACxD,CAACiB,EAAaC,CAAc,EAAIN,EAAAA,SAAmB,CAAA,CAAE,EAErDO,EAAeC,EAAAA,OAAyB,IAAI,EAE5C,CAAE,YAAAC,EAAa,SAAAC,GAAaC,EAAiBxB,CAAQ,EAC3DS,EAAAA,UAAU,IAAM,CACdc,EAASZ,CAAI,CACf,EAAG,CAACA,EAAMY,CAAQ,CAAC,EAEnB,MAAME,EAAW,IAAA,OAAM,OAAAC,EAAAN,EAAa,UAAb,YAAAM,EAAsB,SACvCC,EAAW,GAA2C,CAC1D,MAAMC,EAAQ,EAAE,OAAO,MACvB,GAAI,CAACA,EAAO,OACZ,MAAMC,EAAiB,CAAA,EACvB,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAKD,EAAK,KAAKD,EAAME,CAAC,EAAE,IAAI,EAC9DX,EAAgBY,GAAQ,CACtB,MAAMC,EAAWH,EAAK,OAAQI,GAAM,CAACF,EAAI,SAASE,CAAC,CAAC,EACpD,MAAO,CAAC,GAAGF,EAAK,GAAGC,CAAQ,CAC7B,CAAC,EACGZ,EAAa,UAASA,EAAa,QAAQ,MAAQ,GACzD,EAEMc,EAAa,SAAY,CAC7B,MAAMxB,EAAMC,EAAK,KAAA,EACjB,GAAI,CAACD,EAAK,OACVE,EAAQ,EAAE,EACVW,EAAS,EAAE,GACI,MAAMhB,EAAK,OAAOG,EAAKI,EAAOE,EAAOE,CAAW,GACpD,IAAIX,EAAK,aAAA,CACtB,EAEA,OACE4B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAtC,EAAAA,IAACuC,EAAA,CACC,cAAepC,EAAS,cACxB,aAAcO,EAAK,SAAS,OAC5B,aAAc,GACd,SAAU,GACV,iBAAkB,IAAA,GAClB,aAAc,IAAA,GACd,eAAgB,IAAML,GAAA,YAAAA,EAAe,WAAU,CAAA,QAEhD,MAAA,CAAI,UAAU,YACb,SAAAiC,EAAAA,KAAC,OAAA,CAAK,UAAU,YACd,SAAA,CAAAtC,EAAAA,IAACwC,EAAA,CACC,SACE9B,EAAK,eAAiB,QAClBA,EAAK,cACLA,EAAK,cAEX,QAASA,EAAK,QACd,cAAeP,EAAS,cACxB,UACEO,EAAK,eAAiB,QAClBA,EAAK,sBAAwBA,EAAK,UAClCA,EAAK,UAEX,OAAQA,EAAK,OACb,aAAcA,EAAK,aACnB,iBAAmB+B,GAAM1B,EAAQ0B,CAAC,EAClC,OAASC,GACPhC,EAAK,YAAYgC,CAA2C,EAE9D,SAAU,IAAA,GACV,YAAahC,EAAK,UAClB,aAAcA,EAAK,YAAA,CAAA,EAErBV,EAAAA,IAACH,EAAA,CACC,MAAAoB,EACA,SAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAN,EACA,QAAAC,EACA,QAASL,EAAK,QACd,aAAcA,EAAK,aACnB,OAAQ2B,EACR,YAAAhB,EACA,eAAAC,EACA,YAAAG,EACA,iBAAmBkB,GAAQ5B,EAAQ,GAAG4B,EAAI,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,EAC1D,OAAQxC,EAAS,QAAU,CAAA,EAC3B,SAAAyB,EACA,aAAc,GACd,SAAU,EAAA,CAAA,EAEZ5B,EAAAA,IAAC,QAAA,CACC,IAAKuB,EACL,KAAK,OACL,SAAQ,GACR,MAAO,CAAE,QAAS,MAAA,EAClB,SAAUO,CAAA,CAAA,CACZ,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"MobileChat-BRFjer8p.js","sources":["../../src/web/components/chat/FloatingComposer.tsx","../../src/web/mobile/MobileChat.tsx"],"sourcesContent":["// src/components/chat/FloatingComposer.tsx — sticky bottom wrapper for the composer pill.\n\nimport { Composer } from './Composer';\n\ninterface Props {\n agent: string;\n setAgent: (a: string) => void;\n model: string;\n setModel: (m: string) => void;\n text: string;\n setText: (t: string) => void;\n sending: boolean;\n onSend: () => void;\n attachments: string[];\n setAttachments: (a: string[] | ((prev: string[]) => string[])) => void;\n suggestions: Array<{ cmd: string; desc: string }>;\n onPickSuggestion: (cmd: string) => void;\n agents: Array<{ name: string }>;\n onAttach: () => void;\n sessionsOpen: boolean;\n infoOpen: boolean;\n /** Which stream will receive the next message — propagates the\n * pill border color and a small \"→ cline\" hint. */\n activeSource?: 'bizar' | 'cline' | null;\n}\n\nexport function FloatingComposer(props: Props) {\n const { activeSource } = props;\n return (\n <div\n className={`chat-composer-wrap chat-composer-source-${activeSource ?? 'none'} legacy`}\n >\n <div className=\"chat-composer-pill\">\n <Composer {...props} />\n </div>\n </div>\n );\n}","// src/web/mobile/MobileChat.tsx — mobile chat UI without info/sessions sidebars.\n// No OCR capture, no clipper, no sessions panel — pure chat thread.\nimport { useEffect, useRef, useState } from 'react';\nimport { ChatTopBar } from '../components/chat/ChatTopBar';\nimport { ChatThread } from '../components/chat/ChatThread';\nimport { FloatingComposer } from '../components/chat/FloatingComposer';\nimport { useChat } from '../components/chat/useChat';\nimport { useSlashCommands } from '../components/chat/useSlashCommands';\nimport { useToast } from '../components/Toast';\nimport type { Snapshot, Settings } from '../lib/types';\n\ninterface Props {\n snapshot: Snapshot;\n settings: Settings;\n setActiveTab?: (id: string) => void;\n initialTaskId?: string | null;\n onClearTaskId?: () => void;\n}\n\nexport function MobileChat({\n snapshot,\n settings,\n setActiveTab,\n initialTaskId,\n onClearTaskId,\n}: Props) {\n const toast = useToast();\n const chat = useChat(snapshot, settings, initialTaskId ?? '');\n useEffect(() => {\n chat.setToast({\n error: (msg: string) => toast.error(msg),\n success: (msg: string) => toast.success(msg),\n info: (msg: string) => toast.info(msg),\n warning: (msg: string) => toast.warning(msg),\n });\n }, [chat, toast]);\n\n const [text, setText] = useState('');\n const [agent, setAgent] = useState(settings.defaultAgent || 'odin');\n const [model, setModel] = useState(settings.defaultModel || '');\n const [attachments, setAttachments] = useState<string[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { suggestions, setQuery } = useSlashCommands(snapshot);\n useEffect(() => {\n setQuery(text);\n }, [text, setQuery]);\n\n const onAttach = () => fileInputRef.current?.click();\n const onFiles = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const next: string[] = [];\n for (let i = 0; i < files.length; i++) next.push(files[i].name);\n setAttachments((cur) => {\n const newNames = next.filter((n) => !cur.includes(n));\n return [...cur, ...newNames];\n });\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleSend = async () => {\n const msg = text.trim();\n if (!msg) return;\n setText('');\n setQuery('');\n const result = await chat.onSend(msg, agent, model, attachments);\n if (result.ok) chat.jumpToLatest();\n };\n\n return (\n <div className=\"chat-shell\">\n <ChatTopBar\n activeProject={snapshot.activeProject}\n sessionCount={chat.sessions.length}\n sessionsOpen={false}\n infoOpen={false}\n onToggleSessions={() => undefined}\n onToggleInfo={() => undefined}\n onOpenOverview={() => setActiveTab?.('overview')}\n />\n <div className=\"chat-body\">\n <main className=\"chat-main\">\n <ChatThread\n messages={\n chat.activeSource === 'cline'\n ? chat.clineMessages\n : chat.bizarMessages\n }\n loading={chat.loading}\n activeProject={snapshot.activeProject}\n sessionId={\n chat.activeSource === 'cline'\n ? chat.activeClineSessionId ?? chat.sessionId\n : chat.sessionId\n }\n pinned={chat.pinned}\n activeSource={chat.activeSource}\n onPickSuggestion={(t) => setText(t)}\n onCopy={(m) =>\n chat.copyMessage(m as Parameters<typeof chat.copyMessage>[0])\n }\n onDelete={() => undefined}\n onTogglePin={chat.togglePin}\n onRegenerate={chat.onRegenerate}\n />\n <FloatingComposer\n agent={agent}\n setAgent={setAgent}\n model={model}\n setModel={setModel}\n text={text}\n setText={setText}\n sending={chat.sending}\n activeSource={chat.activeSource}\n onSend={handleSend}\n attachments={attachments}\n setAttachments={setAttachments}\n suggestions={suggestions}\n onPickSuggestion={(cmd) => setText(`${cmd.split(' ')[0]} `)}\n agents={snapshot.agents || []}\n onAttach={onAttach}\n sessionsOpen={false}\n infoOpen={false}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n onChange={onFiles}\n />\n </main>\n </div>\n </div>\n );\n}\n"],"names":["FloatingComposer","props","activeSource","jsx","Composer","MobileChat","snapshot","settings","setActiveTab","initialTaskId","onClearTaskId","toast","useToast","chat","useChat","useEffect","msg","text","setText","useState","agent","setAgent","model","setModel","attachments","setAttachments","fileInputRef","useRef","suggestions","setQuery","useSlashCommands","onAttach","_a","onFiles","files","next","cur","newNames","n","handleSend","jsxs","ChatTopBar","ChatThread","t","m","cmd"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{r,j as e}from"./react-vendor-D3pra6w-.js";import{C as w,a as M,b as U,B as R,c as k,G as B,E as G,S as V,U as P,H as $,T as A,d as C}from"./EnvVarsSection-weVnLz3Z.js";import{a as y,S as H}from"./mobile-layout-Ckru3HKJ.js";import{u as D}from"./Toast-WTxc3m2g.js";import{j as N,aX as I,aQ as T,$ as K,af as F,s as O,aC as J,y as E,R as Q,aE as W,J as X,e as q}from"./icons-B0AKnYI3.js";import"./vendor-Di7Cp-rw.js";import"./flow-BpU0-gK2.js";function Y(){const s=D(),[i,t]=r.useState(!0),[c,a]=r.useState(!1),[o,d]=r.useState(!1),[p,g]=r.useState(""),[u,x]=r.useState(""),[f,h]=r.useState(!1),[j,n]=r.useState(0);r.useEffect(()=>{let l=!1;return(async()=>{var S,L;try{const[z,v]=await Promise.all([y.get("/memory/config/global").catch(()=>null),y.get("/memory/status").catch(()=>null)]);if(l)return;z&&g(((L=(S=z.config)==null?void 0:S.git)==null?void 0:L.remoteUrl)||""),v&&(x(v.vaultRoot||""),h(!!v.initialized))}finally{l||t(!1)}})(),()=>{l=!0}},[j]);const b=async()=>{a(!0);try{await y.put("/memory/config/global",{git:{remoteUrl:p}}),s.success("Memory config saved."),n(l=>l+1)}catch(l){s.error(`Save failed: ${l.message}`)}finally{a(!1)}},m=async()=>{d(!0);try{await y.post("/memory/init",{}),s.success("Vault initialised."),n(l=>l+1)}catch(l){s.error(`Initialise failed: ${l.message}`)}finally{d(!1)}};return e.jsxs(w,{id:"settings-memory","data-section":"memory",children:[e.jsxs(M,{children:[e.jsx(N,{size:14})," Memory vault"]}),e.jsx(U,{children:"The vault lives at a default location on disk. Only the git remote URL needs to be configured to enable sync across machines."}),i?e.jsx("div",{className:"flex-center",style:{padding:24},children:e.jsx(H,{size:"sm"})}):e.jsxs("div",{className:"settings-fields",children:[e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",children:[e.jsx(I,{size:12,style:{display:"inline",marginRight:4}}),"Vault path"]}),e.jsxs("div",{className:"field-readonly mono","data-testid":"settings-memory-vault-path",style:{fontSize:12,padding:"6px 0"},children:[u||e.jsx("span",{className:"muted",children:"not initialised"}),f?null:e.jsxs(R,{variant:"ghost",size:"sm",onClick:m,disabled:o,style:{marginLeft:12},children:[o?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(I,{size:12}),"Initialise"]})]})]}),e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",htmlFor:"set-memory-git-remote",children:[e.jsx(K,{size:12,style:{display:"inline",marginRight:4}}),"Git remote URL"]}),e.jsx("input",{id:"set-memory-git-remote",className:"input mono",type:"text",value:p,onChange:l=>g(l.target.value),placeholder:"git@github.com:org/repo.git"}),e.jsx("span",{className:"field-hint",children:"Leave empty to use local-only mode (no git sync)."})]}),e.jsx("div",{style:{marginTop:12},children:e.jsxs(R,{variant:"primary",size:"sm",onClick:b,disabled:c,children:[c?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(F,{size:12}),"Save memory config"]})})]})]})}function Z({settings:s,onSettingsChange:i,autoSave:t}){const c=(o,d)=>{i==null||i(o,d),t==null||t(o,d)},a=o=>{i==null||i("ui",{...s.ui,...o}),t==null||t("ui",{...s.ui,...o})};return e.jsx(B,{settings:s,patchUi:a,patchTop:c,autoSave:t})}function _({settings:s,onSettingsChange:i,autoSave:t}){return e.jsxs("div",{style:{fontSize:13,color:"var(--text-dim)",padding:"8px 0"},children:[e.jsx("p",{style:{marginBottom:8},children:"Provider management is available on desktop."}),e.jsx("a",{href:"/?desktop=1#settings-providers",className:"mobile-btn mobile-btn-secondary",style:{display:"inline-block",fontSize:12,padding:"6px 12px"},children:"Open desktop to manage providers"})]})}function ee(){return e.jsx(G,{})}function se(){return e.jsx(Y,{})}function ie({settings:s,onSettingsChange:i,autoSave:t}){const c=(a,o)=>{i==null||i(a,o),t==null||t(a,o)};return e.jsx(V,{settings:s,patchTop:c})}function te(){return e.jsx(P,{})}function ne({settings:s}){const[i,t]=r.useState(s),[c,a]=r.useState(!1);return e.jsx($,{settings:i,setSettings:t,setDirty:a})}function ae(){return e.jsx(A,{})}function oe({settings:s}){const i=s.about||{version:"—",homepage:"https://github.com/DrB0rk/BizarHarness",license:"MIT"};return e.jsx(C,{about:i})}function fe({settings:s,onSettingsChange:i,autoSave:t,snapshot:c}){var x,f,h,j;const[a,o]=r.useState(""),[d,p]=r.useState(null),u=[{id:"general",title:"General",icon:O,description:"Theme, accent, layout",component:e.jsx(Z,{settings:s,onSettingsChange:i,autoSave:t})},{id:"providers",title:"AI Providers",icon:N,description:`${((x=c==null?void 0:c.providers)==null?void 0:x.length)??0} configured`,component:e.jsx(_,{settings:s,onSettingsChange:i,autoSave:t})},{id:"env-vars",title:"Environment Variables",icon:J,description:"API keys, secrets",component:e.jsx(ee,{})},{id:"memory",title:"Memory Vault",icon:N,description:"Git remote, LightRAG config",component:e.jsx(se,{})},{id:"system-llm",title:"System LLM",icon:E,description:((f=s.systemLlm)==null?void 0:f.model)||"not set",component:e.jsx(ie,{settings:s,onSettingsChange:i,autoSave:t})},{id:"updates",title:"Updates",icon:Q,description:"Check for updates",component:e.jsx(te,{})},{id:"headroom",title:"Headroom",icon:E,description:(h=s.headroom)!=null&&h.enabled?"Enabled":"Disabled",component:e.jsx(ne,{settings:s})},{id:"tailscale",title:"Tailscale",icon:W,description:"Tailscale serve & auth",component:e.jsx(ae,{})},{id:"about",title:"About",icon:X,description:`Bizar v${((j=s.about)==null?void 0:j.version)||"—"}`,component:e.jsx(oe,{settings:s})}].filter(n=>!a||n.title.toLowerCase().includes(a.toLowerCase())||n.description.toLowerCase().includes(a.toLowerCase()));return e.jsxs("div",{className:"mobile-settings",children:[e.jsxs("div",{className:"mobile-settings-search",children:[e.jsx(le,{}),e.jsx("input",{value:a,onChange:n=>o(n.target.value),placeholder:"Search settings...","aria-label":"Search settings"})]}),e.jsxs("div",{className:"mobile-settings-list",children:[u.map(n=>{const b=n.icon,m=d===n.id;return e.jsxs("div",{className:k("mobile-settings-item",m&&"is-expanded"),children:[e.jsxs("button",{className:"mobile-settings-item-head",onClick:()=>p(m?null:n.id),"aria-expanded":m,"aria-controls":`mobile-settings-body-${n.id}`,children:[e.jsx("div",{className:"mobile-settings-item-icon",children:e.jsx(b,{size:18})}),e.jsxs("div",{className:"mobile-settings-item-text",children:[e.jsx("div",{className:"mobile-settings-item-title",children:n.title}),e.jsx("div",{className:"mobile-settings-item-desc",children:n.description})]}),e.jsx(q,{size:16,className:k("mobile-settings-item-chevron",m&&"is-rotated")})]}),m&&e.jsx("div",{id:`mobile-settings-body-${n.id}`,className:"mobile-settings-item-body",children:n.component})]},n.id)}),u.length===0&&e.jsxs("div",{className:"mobile-settings-empty",children:['No settings match "',a,'"']})]})]})}function le(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("path",{d:"m21 21-4.35-4.35"})]})}export{fe as MobileSettings};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileSettings-Dw5jyJWi.js","sources":["../../src/web/views/settings/MemorySection.tsx","../../src/web/mobile/MobileSettings.tsx"],"sourcesContent":["// src/web/views/settings/MemorySection.tsx — memory vault + git config for Settings.\n// v6.x — Vault path now loads from /api/memory/status (was hardcoded to '').\n// We also surface a small \"Initialise\" button when the vault does not exist.\nimport React, { useEffect, useState } from 'react';\nimport { Brain, GitBranch, Loader2, Save, FolderInput } from 'lucide-react';\nimport { Button } from '../../components/Button';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Spinner } from '../../components/Spinner';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\n\ntype GitConfig = {\n remoteUrl?: string;\n};\n\ntype GlobalConfig = {\n git?: GitConfig;\n};\n\ntype MemoryStatus = {\n initialized: boolean;\n vaultRoot?: string | null;\n mode?: string | null;\n};\n\nexport function MemorySection() {\n const toast = useToast();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [initialising, setInitialising] = useState(false);\n const [remoteUrl, setRemoteUrl] = useState('');\n const [vaultPath, setVaultPath] = useState<string>('');\n const [vaultInitialised, setVaultInitialised] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [cfgRes, statusRes] = await Promise.all([\n api.get<{ config: GlobalConfig; path?: string }>('/memory/config/global').catch(() => null),\n api.get<MemoryStatus>('/memory/status').catch(() => null),\n ]);\n if (cancelled) return;\n if (cfgRes) setRemoteUrl(cfgRes.config?.git?.remoteUrl || '');\n if (statusRes) {\n setVaultPath(statusRes.vaultRoot || '');\n setVaultInitialised(!!statusRes.initialized);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [refreshKey]);\n\n const onSave = async () => {\n setSaving(true);\n try {\n await api.put('/memory/config/global', { git: { remoteUrl } });\n toast.success('Memory config saved.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Save failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const onInitialise = async () => {\n setInitialising(true);\n try {\n await api.post('/memory/init', {});\n toast.success('Vault initialised.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Initialise failed: ${(err as Error).message}`);\n } finally {\n setInitialising(false);\n }\n };\n\n return (\n <Card id=\"settings-memory\" data-section=\"memory\">\n <CardTitle><Brain size={14} /> Memory vault</CardTitle>\n <CardMeta>\n The vault lives at a default location on disk. Only the git remote URL\n needs to be configured to enable sync across machines.\n </CardMeta>\n\n {loading ? (\n <div className=\"flex-center\" style={{ padding: 24 }}>\n <Spinner size=\"sm\" />\n </div>\n ) : (\n <div className=\"settings-fields\">\n <div className=\"field\">\n <label className=\"field-label\">\n <FolderInput size={12} style={{ display: 'inline', marginRight: 4 }} />\n Vault path\n </label>\n <div\n className=\"field-readonly mono\"\n data-testid=\"settings-memory-vault-path\"\n style={{ fontSize: 12, padding: '6px 0' }}\n >\n {vaultPath || <span className=\"muted\">not initialised</span>}\n {vaultInitialised ? null : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onInitialise}\n disabled={initialising}\n style={{ marginLeft: 12 }}\n >\n {initialising ? <Loader2 size={12} className=\"memory-spin\" /> : <FolderInput size={12} />}\n Initialise\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"field\">\n <label className=\"field-label\" htmlFor=\"set-memory-git-remote\">\n <GitBranch size={12} style={{ display: 'inline', marginRight: 4 }} />\n Git remote URL\n </label>\n <input\n id=\"set-memory-git-remote\"\n className=\"input mono\"\n type=\"text\"\n value={remoteUrl}\n onChange={(e) => setRemoteUrl(e.target.value)}\n placeholder=\"git@github.com:org/repo.git\"\n />\n <span className=\"field-hint\">Leave empty to use local-only mode (no git sync).</span>\n </div>\n\n <div style={{ marginTop: 12 }}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving}\n >\n {saving ? <Loader2 size={12} className=\"memory-spin\" /> : <Save size={12} />}\n Save memory config\n </Button>\n </div>\n </div>\n )}\n </Card>\n );\n}\n","// src/web/mobile/MobileSettings.tsx — v5.4 mobile settings with full desktop parity.\n// All 9 sections in an accordion layout with search.\nimport { useState } from 'react';\nimport {\n Settings2, Brain, KeyRound, Cpu, RefreshCw, Globe, Info, ChevronRight,\n} from 'lucide-react';\nimport { cx } from '../ui/utils/cx';\nimport type { Settings, Snapshot } from '../lib/types';\n\n// Sub-section components — each renders its section content inline.\nimport { GeneralSection } from '../views/settings/GeneralSection';\nimport { EnvVarsSection } from '../views/settings/EnvVarsSection';\nimport { MemorySection } from '../views/settings/MemorySection';\nimport { SystemLlmSection } from '../views/settings/SystemLlmSection';\nimport { UpdatesSection } from '../views/settings/UpdatesSection';\nimport { HeadroomSection } from '../views/settings/HeadroomSection';\nimport { TailscaleSettings } from '../components/TailscaleSettings';\nimport { ActivitySection } from '../views/settings/ActivitySection';\n\n// Lazy-load heavy sections that pull in large dependencies.\nimport React from 'react';\n\ntype Props = {\n settings: Settings;\n /** Called when the user changes any top-level setting */\n onSettingsChange?: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n /** Debounced auto-save to API (key, value) */\n autoSave?: (key: keyof Settings, value: Settings[keyof Settings]) => void;\n /** Optional snapshot for counts / agent list */\n snapshot?: Snapshot | null;\n /** v5.3 compatibility — called after settings are saved (MobileApp.tsx passes refreshSnapshot) */\n onRefresh?: () => Promise<void>;\n};\n\n// ─── Section definitions ─────────────────────────────────────────────────────\n\nfunction GeneralSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n const patchUi = (patch: Partial<Settings['ui']>) => {\n onSettingsChange?.('ui', { ...settings.ui, ...patch });\n autoSave?.('ui', { ...settings.ui, ...patch });\n };\n return (\n <GeneralSection\n settings={settings}\n patchUi={patchUi}\n patchTop={patchTop}\n autoSave={autoSave}\n />\n );\n}\n\nfunction ProvidersSettings({ settings, onSettingsChange, autoSave }: Props) {\n // Providers are managed server-side; show a link to the desktop providers view.\n // Mobile can't add/edit providers without more complex auth flow.\n void settings; void onSettingsChange; void autoSave;\n return (\n <div style={{ fontSize: 13, color: 'var(--text-dim)', padding: '8px 0' }}>\n <p style={{ marginBottom: 8 }}>\n Provider management is available on desktop.\n </p>\n <a href=\"/?desktop=1#settings-providers\" className=\"mobile-btn mobile-btn-secondary\" style={{ display: 'inline-block', fontSize: 12, padding: '6px 12px' }}>\n Open desktop to manage providers\n </a>\n </div>\n );\n}\n\nfunction EnvVarsSettings() {\n return <EnvVarsSection />;\n}\n\nfunction MemorySettings() {\n return <MemorySection />;\n}\n\nfunction SystemLlmSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n return <SystemLlmSection settings={settings} patchTop={patchTop} />;\n}\n\nfunction UpdatesSettings() {\n return <UpdatesSection />;\n}\n\nfunction HeadroomSettingsSection({ settings }: { settings: Settings }) {\n const [localSettings, setLocalSettings] = useState(settings);\n const [dirty, setDirty] = useState(false);\n return (\n <HeadroomSection\n settings={localSettings}\n setSettings={setLocalSettings as React.Dispatch<React.SetStateAction<Settings>>}\n setDirty={setDirty}\n />\n );\n}\n\nfunction TailscaleSettingsMobile() {\n return <TailscaleSettings />;\n}\n\nfunction AboutSection({ settings }: { settings: Settings }) {\n const about = settings.about || { version: '—', homepage: 'https://github.com/DrB0rk/BizarHarness', license: 'MIT' };\n return <ActivitySection about={about} />;\n}\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function MobileSettings({ settings, onSettingsChange, autoSave, snapshot }: Props) {\n const [search, setSearch] = useState('');\n const [expandedSection, setExpandedSection] = useState<string | null>(null);\n\n const sections = [\n {\n id: 'general',\n title: 'General',\n icon: Settings2,\n description: 'Theme, accent, layout',\n component: <GeneralSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'providers',\n title: 'AI Providers',\n icon: Brain,\n description: `${snapshot?.providers?.length ?? 0} configured`,\n component: <ProvidersSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'env-vars',\n title: 'Environment Variables',\n icon: KeyRound,\n description: 'API keys, secrets',\n component: <EnvVarsSettings />,\n },\n {\n id: 'memory',\n title: 'Memory Vault',\n icon: Brain,\n description: 'Git remote, LightRAG config',\n component: <MemorySettings />,\n },\n {\n id: 'system-llm',\n title: 'System LLM',\n icon: Cpu,\n description: settings.systemLlm?.model || 'not set',\n component: <SystemLlmSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'updates',\n title: 'Updates',\n icon: RefreshCw,\n description: 'Check for updates',\n component: <UpdatesSettings />,\n },\n {\n id: 'headroom',\n title: 'Headroom',\n icon: Cpu,\n description: settings.headroom?.enabled ? 'Enabled' : 'Disabled',\n component: <HeadroomSettingsSection settings={settings} />,\n },\n {\n id: 'tailscale',\n title: 'Tailscale',\n icon: Globe,\n description: 'Tailscale serve & auth',\n component: <TailscaleSettingsMobile />,\n },\n {\n id: 'about',\n title: 'About',\n icon: Info,\n description: `Bizar v${settings.about?.version || '—'}`,\n component: <AboutSection settings={settings} />,\n },\n ];\n\n const filtered = sections.filter(\n (s) =>\n !search ||\n s.title.toLowerCase().includes(search.toLowerCase()) ||\n s.description.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div className=\"mobile-settings\">\n <div className=\"mobile-settings-search\">\n <SearchIcon />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search settings...\"\n aria-label=\"Search settings\"\n />\n </div>\n\n <div className=\"mobile-settings-list\">\n {filtered.map((s) => {\n const Icon = s.icon;\n const isExpanded = expandedSection === s.id;\n return (\n <div key={s.id} className={cx('mobile-settings-item', isExpanded && 'is-expanded')}>\n <button\n className=\"mobile-settings-item-head\"\n onClick={() => setExpandedSection(isExpanded ? null : s.id)}\n aria-expanded={isExpanded}\n aria-controls={`mobile-settings-body-${s.id}`}\n >\n <div className=\"mobile-settings-item-icon\">\n <Icon size={18} />\n </div>\n <div className=\"mobile-settings-item-text\">\n <div className=\"mobile-settings-item-title\">{s.title}</div>\n <div className=\"mobile-settings-item-desc\">{s.description}</div>\n </div>\n <ChevronRight\n size={16}\n className={cx('mobile-settings-item-chevron', isExpanded && 'is-rotated')}\n />\n </button>\n {isExpanded && (\n <div id={`mobile-settings-body-${s.id}`} className=\"mobile-settings-item-body\">\n {s.component}\n </div>\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"mobile-settings-empty\">No settings match \"{search}\"</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" />\n </svg>\n );\n}\n"],"names":["MemorySection","toast","useToast","loading","setLoading","useState","saving","setSaving","initialising","setInitialising","remoteUrl","setRemoteUrl","vaultPath","setVaultPath","vaultInitialised","setVaultInitialised","refreshKey","setRefreshKey","useEffect","cancelled","cfgRes","statusRes","api","_b","_a","onSave","k","err","onInitialise","jsxs","Card","CardTitle","jsx","Brain","CardMeta","Spinner","FolderInput","Button","Loader2","GitBranch","e","Save","GeneralSettings","settings","onSettingsChange","autoSave","patchTop","key","value","patchUi","patch","GeneralSection","ProvidersSettings","EnvVarsSettings","EnvVarsSection","MemorySettings","SystemLlmSettings","SystemLlmSection","UpdatesSettings","UpdatesSection","HeadroomSettingsSection","localSettings","setLocalSettings","dirty","setDirty","HeadroomSection","TailscaleSettingsMobile","TailscaleSettings","AboutSection","about","ActivitySection","MobileSettings","snapshot","search","setSearch","expandedSection","setExpandedSection","filtered","Settings2","KeyRound","Cpu","RefreshCw","_c","Globe","Info","_d","s","SearchIcon","Icon","isExpanded","cx","ChevronRight"],"mappings":"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"}
@@ -1 +1 @@
1
- import{r,j as o}from"./react-vendor-Dn4wqh4Z.js";import{D as C,C as j,E as p,I as T,X as g}from"./icons-Do5N2jmX.js";const d=r.createContext(null);function I(){const t=r.useContext(d);return t||{show:()=>{},info:()=>{},success:()=>{},error:()=>{},warning:()=>{},dismiss:()=>{},toasts:[]}}const h={info:T,success:p,error:j,warning:C};function R({children:t}){const[i,n]=r.useState([]),x=r.useRef(1),c=r.useRef(new Map),u=r.useCallback(s=>{n(m=>m.filter(l=>l.id!==s));const e=c.current.get(s);e&&(clearTimeout(e),c.current.delete(s))},[]),a=r.useCallback((s,e="info",m=4e3)=>{const l=x.current++;if(n(f=>[...f,{id:l,kind:e,message:s}]),m>0){const f=setTimeout(()=>u(l),m);c.current.set(l,f)}},[u]);r.useEffect(()=>()=>{for(const s of c.current.values())clearTimeout(s);c.current.clear()},[]);const v=r.useMemo(()=>({show:a,info:(s,e)=>a(s,"info",e),success:(s,e)=>a(s,"success",e),error:(s,e)=>a(s,"error",e),warning:(s,e)=>a(s,"warning",e),dismiss:u,toasts:i}),[a,u,i]);return o.jsxs(d.Provider,{value:v,children:[t,o.jsx(k,{toasts:i,onDismiss:u})]})}function k({toasts:t,onDismiss:i}){return o.jsx("div",{className:"toast-stack","aria-live":"polite",children:t.map(n=>o.jsx(w,{toast:n,onDismiss:i},n.id))})}function w({toast:t,onDismiss:i}){const n=h[t.kind];return o.jsxs("div",{className:`toast toast-${t.kind}`,role:"alert","aria-live":"assertive","aria-atomic":"true",children:[o.jsx(n,{size:16,className:"toast-icon"}),o.jsx("span",{className:"toast-message",children:t.message}),o.jsx("button",{type:"button",className:"toast-close","aria-label":"Dismiss",onClick:()=>i(t.id),children:o.jsx(g,{size:14})})]})}export{R as T,I as u};
1
+ import{r,j as o}from"./react-vendor-D3pra6w-.js";import{E as C,C as j,I as p,J as T,X as g}from"./icons-B0AKnYI3.js";const d=r.createContext(null);function I(){const t=r.useContext(d);return t||{show:()=>{},info:()=>{},success:()=>{},error:()=>{},warning:()=>{},dismiss:()=>{},toasts:[]}}const h={info:T,success:p,error:j,warning:C};function R({children:t}){const[i,n]=r.useState([]),x=r.useRef(1),c=r.useRef(new Map),u=r.useCallback(s=>{n(m=>m.filter(l=>l.id!==s));const e=c.current.get(s);e&&(clearTimeout(e),c.current.delete(s))},[]),a=r.useCallback((s,e="info",m=4e3)=>{const l=x.current++;if(n(f=>[...f,{id:l,kind:e,message:s}]),m>0){const f=setTimeout(()=>u(l),m);c.current.set(l,f)}},[u]);r.useEffect(()=>()=>{for(const s of c.current.values())clearTimeout(s);c.current.clear()},[]);const v=r.useMemo(()=>({show:a,info:(s,e)=>a(s,"info",e),success:(s,e)=>a(s,"success",e),error:(s,e)=>a(s,"error",e),warning:(s,e)=>a(s,"warning",e),dismiss:u,toasts:i}),[a,u,i]);return o.jsxs(d.Provider,{value:v,children:[t,o.jsx(k,{toasts:i,onDismiss:u})]})}function k({toasts:t,onDismiss:i}){return o.jsx("div",{className:"toast-stack","aria-live":"polite",children:t.map(n=>o.jsx(w,{toast:n,onDismiss:i},n.id))})}function w({toast:t,onDismiss:i}){const n=h[t.kind];return o.jsxs("div",{className:`toast toast-${t.kind}`,role:"alert","aria-live":"assertive","aria-atomic":"true",children:[o.jsx(n,{size:16,className:"toast-icon"}),o.jsx("span",{className:"toast-message",children:t.message}),o.jsx("button",{type:"button",className:"toast-close","aria-label":"Dismiss",onClick:()=>i(t.id),children:o.jsx(g,{size:14})})]})}export{R as T,I as u};
@@ -1 +1 @@
1
- {"version":3,"file":"Toast-Cpl6-E63.js","sources":["../../src/web/components/Toast.tsx"],"sourcesContent":["// src/components/Toast.tsx — toast context, provider hook, container.\n\nimport {\n createContext,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { CheckCircle2, AlertTriangle, AlertCircle, Info, X } from 'lucide-react';\n\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning';\n\nexport type Toast = {\n id: number;\n kind: ToastKind;\n message: string;\n};\n\nexport type ToastApi = {\n show: (message: string, kind?: ToastKind, durationMs?: number) => void;\n info: (message: string, durationMs?: number) => void;\n success: (message: string, durationMs?: number) => void;\n error: (message: string, durationMs?: number) => void;\n warning: (message: string, durationMs?: number) => void;\n dismiss: (id: number) => void;\n toasts: Toast[];\n};\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport function useToast(): ToastApi {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n // Fallback no-op so tests/Storybook don't crash\n return {\n show: () => undefined,\n info: () => undefined,\n success: () => undefined,\n error: () => undefined,\n warning: () => undefined,\n dismiss: () => undefined,\n toasts: [],\n };\n }\n return ctx;\n}\n\nconst ICONS: Record<ToastKind, typeof Info> = {\n info: Info,\n success: CheckCircle2,\n error: AlertCircle,\n warning: AlertTriangle,\n};\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const idRef = useRef(1);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n\n const dismiss = useCallback((id: number) => {\n setToasts((cur) => cur.filter((t) => t.id !== id));\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n }, []);\n\n const show = useCallback<ToastApi['show']>(\n (message, kind = 'info', durationMs = 4000) => {\n const id = idRef.current++;\n setToasts((cur) => [...cur, { id, kind, message }]);\n if (durationMs > 0) {\n const timer = setTimeout(() => dismiss(id), durationMs);\n timersRef.current.set(id, timer);\n }\n },\n [dismiss],\n );\n\n useEffect(() => {\n return () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer);\n timersRef.current.clear();\n };\n }, []);\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n info: (m, d) => show(m, 'info', d),\n success: (m, d) => show(m, 'success', d),\n error: (m, d) => show(m, 'error', d),\n warning: (m, d) => show(m, 'warning', d),\n dismiss,\n toasts,\n }),\n [show, dismiss, toasts],\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n}\n\nexport function ToastContainer({\n toasts,\n onDismiss,\n}: {\n toasts: Toast[];\n onDismiss: (id: number) => void;\n}) {\n return (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction ToastItem({\n toast,\n onDismiss,\n}: {\n toast: Toast;\n onDismiss: (id: number) => void;\n}) {\n const Icon = ICONS[toast.kind];\n return (\n <div className={`toast toast-${toast.kind}`} role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <Icon size={16} className=\"toast-icon\" />\n <span className=\"toast-message\">{toast.message}</span>\n <button\n type=\"button\"\n className=\"toast-close\"\n aria-label=\"Dismiss\"\n onClick={() => onDismiss(toast.id)}\n >\n <X size={14} />\n </button>\n </div>\n );\n}\n"],"names":["ToastContext","createContext","useToast","ctx","useContext","ICONS","Info","CheckCircle2","AlertCircle","AlertTriangle","ToastProvider","children","toasts","setToasts","useState","idRef","useRef","timersRef","dismiss","useCallback","id","cur","t","timer","show","message","kind","durationMs","useEffect","api","useMemo","m","d","jsxs","jsx","ToastContainer","onDismiss","ToastItem","toast","Icon","X"],"mappings":"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"}
1
+ {"version":3,"file":"Toast-WTxc3m2g.js","sources":["../../src/web/components/Toast.tsx"],"sourcesContent":["// src/components/Toast.tsx — toast context, provider hook, container.\n\nimport {\n createContext,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { CheckCircle2, AlertTriangle, AlertCircle, Info, X } from 'lucide-react';\n\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning';\n\nexport type Toast = {\n id: number;\n kind: ToastKind;\n message: string;\n};\n\nexport type ToastApi = {\n show: (message: string, kind?: ToastKind, durationMs?: number) => void;\n info: (message: string, durationMs?: number) => void;\n success: (message: string, durationMs?: number) => void;\n error: (message: string, durationMs?: number) => void;\n warning: (message: string, durationMs?: number) => void;\n dismiss: (id: number) => void;\n toasts: Toast[];\n};\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport function useToast(): ToastApi {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n // Fallback no-op so tests/Storybook don't crash\n return {\n show: () => undefined,\n info: () => undefined,\n success: () => undefined,\n error: () => undefined,\n warning: () => undefined,\n dismiss: () => undefined,\n toasts: [],\n };\n }\n return ctx;\n}\n\nconst ICONS: Record<ToastKind, typeof Info> = {\n info: Info,\n success: CheckCircle2,\n error: AlertCircle,\n warning: AlertTriangle,\n};\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const idRef = useRef(1);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n\n const dismiss = useCallback((id: number) => {\n setToasts((cur) => cur.filter((t) => t.id !== id));\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n }, []);\n\n const show = useCallback<ToastApi['show']>(\n (message, kind = 'info', durationMs = 4000) => {\n const id = idRef.current++;\n setToasts((cur) => [...cur, { id, kind, message }]);\n if (durationMs > 0) {\n const timer = setTimeout(() => dismiss(id), durationMs);\n timersRef.current.set(id, timer);\n }\n },\n [dismiss],\n );\n\n useEffect(() => {\n return () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer);\n timersRef.current.clear();\n };\n }, []);\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n info: (m, d) => show(m, 'info', d),\n success: (m, d) => show(m, 'success', d),\n error: (m, d) => show(m, 'error', d),\n warning: (m, d) => show(m, 'warning', d),\n dismiss,\n toasts,\n }),\n [show, dismiss, toasts],\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n}\n\nexport function ToastContainer({\n toasts,\n onDismiss,\n}: {\n toasts: Toast[];\n onDismiss: (id: number) => void;\n}) {\n return (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction ToastItem({\n toast,\n onDismiss,\n}: {\n toast: Toast;\n onDismiss: (id: number) => void;\n}) {\n const Icon = ICONS[toast.kind];\n return (\n <div className={`toast toast-${toast.kind}`} role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <Icon size={16} className=\"toast-icon\" />\n <span className=\"toast-message\">{toast.message}</span>\n <button\n type=\"button\"\n className=\"toast-close\"\n aria-label=\"Dismiss\"\n onClick={() => onDismiss(toast.id)}\n >\n <X size={14} />\n </button>\n </div>\n );\n}\n"],"names":["ToastContext","createContext","useToast","ctx","useContext","ICONS","Info","CheckCircle2","AlertCircle","AlertTriangle","ToastProvider","children","toasts","setToasts","useState","idRef","useRef","timersRef","dismiss","useCallback","id","cur","t","timer","show","message","kind","durationMs","useEffect","api","useMemo","m","d","jsxs","jsx","ToastContainer","onDismiss","ToastItem","toast","Icon","X"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{k as Mt,p as se,z as oe,l as re,m as Ce,n as $t,o as Ct,q as Ae}from"./vendor-Di7Cp-rw.js";const pt={error001:(t="react")=>`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:i,targetHandle:s})=>`Couldn't create edge for ${t} handle id: "${t==="source"?i:s}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},ve=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],bn=["Enter"," ","Escape"],Ie={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:i})=>`Moved selected node ${t}. New position, x: ${e}, y: ${i}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var mt;(function(t){t.Strict="strict",t.Loose="loose"})(mt||(mt={}));var dt;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(dt||(dt={}));var Lt;(function(t){t.Partial="partial",t.Full="full"})(Lt||(Lt={}));const En={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Rt;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(Rt||(Rt={}));var Ft;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(Ft||(Ft={}));var z;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(z||(z={}));const Gt={[z.Left]:z.Right,[z.Right]:z.Left,[z.Top]:z.Bottom,[z.Bottom]:z.Top};function Hn(t){return t===null?null:t?"valid":"invalid"}const Ne=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,Tn=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),Bt=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),yt=(t,e=[0,0])=>{const{width:i,height:s}=st(t),n=t.origin??e,r=i*n[0],o=s*n[1];return{x:t.position.x-r,y:t.position.y-o}},$n=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const i=t.reduce((s,n)=>{const r=typeof n=="string";let o=!e.nodeLookup&&!r?n:void 0;e.nodeLookup&&(o=r?e.nodeLookup.get(n):Bt(n)?n:e.nodeLookup.get(n.id));const a=o?wt(o,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return bt(s,a)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Et(i)},ae=(t,e={})=>{let i={x:1/0,y:1/0,x2:-1/0,y2:-1/0},s=!1;return t.forEach(n=>{(e.filter===void 0||e.filter(n))&&(i=bt(i,wt(n)),s=!0)}),s?Et(i):{x:0,y:0,width:0,height:0}},Cn=(t,e,[i,s,n]=[0,0,1],r=!1,o=!1)=>{const a=(e.x-i)/n,c=(e.y-s)/n,l=e.width/n,u=e.height/n,h=[];for(const f of t.values()){const{measured:y,selectable:d=!0,hidden:p=!1}=f;if(o&&!d||p)continue;const b=y.width??f.width??f.initialWidth??0,M=y.height??f.height??f.initialHeight??0,{x:I,y:g}=f.internals.positionAbsolute,T=ue(a,c,l,u,I,g,b,M),X=b*M,C=r&&T>0;(!f.internals.handleBounds||C||T>=X||f.dragging)&&h.push(f)}return h},Pe=(t,e)=>{const i=new Set;return t.forEach(s=>{i.add(s.id)}),e.filter(s=>i.has(s.source)||i.has(s.target))};function Be(t,e){const i=new Map,s=e!=null&&e.nodes?new Set(e.nodes.map(n=>n.id)):null;return t.forEach(n=>{let r;if(e!=null&&e.includeHiddenNodes){const{width:o,height:a}=st(n);r=o>0&&a>0}else r=!!(n.measured.width&&n.measured.height&&!n.hidden);r&&(!s||s.has(n.id))&&i.set(n.id,n)}),i}async function An({nodes:t,width:e,height:i,panZoom:s,minZoom:n,maxZoom:r},o){if(t.size===0)return!0;const a=Be(t,o),c=ae(a),l=Ve(c,e,i,(o==null?void 0:o.minZoom)??n,(o==null?void 0:o.maxZoom)??r,(o==null?void 0:o.padding)??.1);return await s.setViewport(l,{duration:o==null?void 0:o.duration,ease:o==null?void 0:o.ease,interpolate:o==null?void 0:o.interpolate}),!0}function Ye({nodeId:t,nextPosition:e,nodeLookup:i,nodeOrigin:s=[0,0],nodeExtent:n,onError:r}){const o=i.get(t),a=o.parentId?i.get(o.parentId):void 0,{x:c,y:l}=a?a.internals.positionAbsolute:{x:0,y:0},u=o.origin??s;let h=o.extent||n;if(o.extent==="parent"&&!o.expandParent)if(!a)r==null||r("005",pt.error005());else{const y=a.measured.width,d=a.measured.height;y&&d&&(h=[[c,l],[c+y,l+d]])}else a&&at(o.extent)&&(h=[[o.extent[0][0]+c,o.extent[0][1]+l],[o.extent[1][0]+c,o.extent[1][1]+l]]);const f=at(h)?rt(e,h,o.measured):e;return(o.measured.width===void 0||o.measured.height===void 0)&&(r==null||r("015",pt.error015())),{position:{x:f.x-c+(o.measured.width??0)*u[0],y:f.y-l+(o.measured.height??0)*u[1]},positionAbsolute:f}}async function vn({nodesToRemove:t=[],edgesToRemove:e=[],nodes:i,edges:s,onBeforeDelete:n}){const r=new Set(t.map(f=>f.id)),o=[];for(const f of i){if(f.deletable===!1)continue;const y=r.has(f.id),d=!y&&f.parentId&&o.find(p=>p.id===f.parentId);(y||d)&&o.push(f)}const a=new Set(e.map(f=>f.id)),c=s.filter(f=>f.deletable!==!1),u=Pe(o,c);for(const f of c)a.has(f.id)&&!u.find(d=>d.id===f.id)&&u.push(f);if(!n)return{edges:u,nodes:o};const h=await n({nodes:o,edges:u});return typeof h=="boolean"?h?{edges:u,nodes:o}:{edges:[],nodes:[]}:h}const ut=(t,e=0,i=1)=>Math.min(Math.max(t,e),i),rt=(t={x:0,y:0},e,i)=>({x:ut(t.x,e[0][0],e[1][0]-((i==null?void 0:i.width)??0)),y:ut(t.y,e[0][1],e[1][1]-((i==null?void 0:i.height)??0))});function ce(t,e,i){const{width:s,height:n}=st(i),{x:r,y:o}=i.internals.positionAbsolute;return rt(t,[[r,o],[r+s,o+n]],e)}const St=(t,e,i)=>t<e?ut(Math.abs(t-e),1,e)/e:t>i?-ut(Math.abs(t-i),1,e)/e:0,le=(t,e,i=15,s=40)=>{const n=St(t.x,s,e.width-s)*i,r=St(t.y,s,e.height-s)*i;return[n,r]},bt=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),Nt=({x:t,y:e,width:i,height:s})=>({x:t,y:e,x2:t+i,y2:e+s}),Et=({x:t,y:e,x2:i,y2:s})=>({x:t,y:e,width:i-t,height:s-e}),Yt=(t,e=[0,0])=>{var n,r;const{x:i,y:s}=Bt(t)?t.internals.positionAbsolute:yt(t,e);return{x:i,y:s,width:((n=t.measured)==null?void 0:n.width)??t.width??t.initialWidth??0,height:((r=t.measured)==null?void 0:r.height)??t.height??t.initialHeight??0}},wt=(t,e=[0,0])=>{var n,r;const{x:i,y:s}=Bt(t)?t.internals.positionAbsolute:yt(t,e);return{x:i,y:s,x2:i+(((n=t.measured)==null?void 0:n.width)??t.width??t.initialWidth??0),y2:s+(((r=t.measured)==null?void 0:r.height)??t.height??t.initialHeight??0)}},ze=(t,e)=>Et(bt(Nt(t),Nt(e))),ue=(t,e,i,s,n,r,o,a)=>{const c=Math.max(0,Math.min(t+i,n+o)-Math.max(t,n)),l=Math.max(0,Math.min(e+s,r+a)-Math.max(e,r));return Math.ceil(c*l)},fe=(t,e)=>ue(t.x,t.y,t.width,t.height,e.x,e.y,e.width,e.height),In=t=>ot(t.width)&&ot(t.height)&&ot(t.x)&&ot(t.y),ot=t=>!isNaN(t)&&isFinite(t),Nn=(t,e)=>(i,s)=>{},Ht=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),de=({x:t,y:e},[i,s,n],r=!1,o=[1,1])=>{const a={x:(t-i)/n,y:(e-s)/n};return r?Ht(a,o):a},Pt=({x:t,y:e},[i,s,n])=>({x:t*n+i,y:e*n+s});function ct(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(i)}if(typeof t=="string"&&t.endsWith("%")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(e*i*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Xe(t,e,i){if(typeof t=="string"||typeof t=="number"){const s=ct(t,i),n=ct(t,e);return{top:s,right:n,bottom:s,left:n,x:n*2,y:s*2}}if(typeof t=="object"){const s=ct(t.top??t.y??0,i),n=ct(t.bottom??t.y??0,i),r=ct(t.left??t.x??0,e),o=ct(t.right??t.x??0,e);return{top:s,right:o,bottom:n,left:r,x:r+o,y:s+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function De(t,e,i,s,n,r){const{x:o,y:a}=Pt(t,[e,i,s]),{x:c,y:l}=Pt({x:t.x+t.width,y:t.y+t.height},[e,i,s]),u=n-c,h=r-l;return{left:Math.floor(o),top:Math.floor(a),right:Math.floor(u),bottom:Math.floor(h)}}const Ve=(t,e,i,s,n,r)=>{const o=Xe(r,e,i),a=(e-o.x)/t.width,c=(i-o.y)/t.height,l=Math.min(a,c),u=ut(l,s,n),h=t.x+t.width/2,f=t.y+t.height/2,y=e/2-h*u,d=i/2-f*u,p=De(t,y,d,u,e,i),b={left:Math.min(p.left-o.left,0),top:Math.min(p.top-o.top,0),right:Math.min(p.right-o.right,0),bottom:Math.min(p.bottom-o.bottom,0)};return{x:y-b.left+b.right,y:d-b.top+b.bottom,zoom:u}},zt=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function at(t){return t!=null&&t!=="parent"}function st(t){var e,i;return{width:((e=t.measured)==null?void 0:e.width)??t.width??t.initialWidth??0,height:((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight??0}}function Pn(t){var e,i;return(((e=t.measured)==null?void 0:e.width)??t.width??t.initialWidth)!==void 0&&(((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight)!==void 0}function Bn(t,e={width:0,height:0},i,s,n){const r={...t},o=s.get(i);if(o){const a=o.origin||n;r.x+=o.internals.positionAbsolute.x-(e.width??0)*a[0],r.y+=o.internals.positionAbsolute.y-(e.height??0)*a[1]}return r}function Yn(t,e){if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0}function zn(){let t,e;return{promise:new Promise((s,n)=>{t=s,e=n}),resolve:t,reject:e}}function Xn(t){return{...Ie,...t||{}}}function ht(t,{snapGrid:e=[0,0],snapToGrid:i=!1,transform:s,containerBounds:n}){const{x:r,y:o}=tt(t),a=de({x:r-((n==null?void 0:n.left)??0),y:o-((n==null?void 0:n.top)??0)},s),{x:c,y:l}=i?Ht(a,e):a;return{xSnapped:c,ySnapped:l,...a}}const he=t=>({width:t.offsetWidth,height:t.offsetHeight}),Oe=t=>{var e;return((e=t==null?void 0:t.getRootNode)==null?void 0:e.call(t))||(window==null?void 0:window.document)},We=["INPUT","SELECT","TEXTAREA"];function Dn(t){var s,n;const e=((n=(s=t.composedPath)==null?void 0:s.call(t))==null?void 0:n[0])||t.target;return(e==null?void 0:e.nodeType)!==1?!1:We.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const _e=t=>"clientX"in t,tt=(t,e)=>{var r,o;const i=_e(t),s=i?t.clientX:(r=t.touches)==null?void 0:r[0].clientX,n=i?t.clientY:(o=t.touches)==null?void 0:o[0].clientY;return{x:s-((e==null?void 0:e.left)??0),y:n-((e==null?void 0:e.top)??0)}},qt=(t,e,i,s,n)=>{const r=e.querySelectorAll(`.${t}`);return!r||!r.length?null:Array.from(r).map(o=>{const a=o.getBoundingClientRect();return{id:o.getAttribute("data-handleid"),type:t,nodeId:n,position:o.getAttribute("data-handlepos"),x:(a.left-i.left)/s,y:(a.top-i.top)/s,...he(o)}})};function Le({sourceX:t,sourceY:e,targetX:i,targetY:s,sourceControlX:n,sourceControlY:r,targetControlX:o,targetControlY:a}){const c=t*.125+n*.375+o*.375+i*.125,l=e*.125+r*.375+a*.375+s*.125,u=Math.abs(c-t),h=Math.abs(l-e);return[c,l,u,h]}function xt(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function kt({pos:t,x1:e,y1:i,x2:s,y2:n,c:r}){switch(t){case z.Left:return[e-xt(e-s,r),i];case z.Right:return[e+xt(s-e,r),i];case z.Top:return[e,i-xt(i-n,r)];case z.Bottom:return[e,i+xt(n-i,r)]}}function Vn({sourceX:t,sourceY:e,sourcePosition:i=z.Bottom,targetX:s,targetY:n,targetPosition:r=z.Top,curvature:o=.25}){const[a,c]=kt({pos:i,x1:t,y1:e,x2:s,y2:n,c:o}),[l,u]=kt({pos:r,x1:s,y1:n,x2:t,y2:e,c:o}),[h,f,y,d]=Le({sourceX:t,sourceY:e,targetX:s,targetY:n,sourceControlX:a,sourceControlY:c,targetControlX:l,targetControlY:u});return[`M${t},${e} C${a},${c} ${l},${u} ${s},${n}`,h,f,y,d]}function ye({sourceX:t,sourceY:e,targetX:i,targetY:s}){const n=Math.abs(i-t)/2,r=i<t?i+n:i-n,o=Math.abs(s-e)/2,a=s<e?s+o:s-o;return[r,a,n,o]}function On({sourceNode:t,targetNode:e,selected:i=!1,zIndex:s=0,elevateOnSelect:n=!1,zIndexMode:r="basic"}){if(r==="manual")return s;const o=n&&i?s+1e3:s,a=Math.max(t.parentId||n&&t.selected?t.internals.z:0,e.parentId||n&&e.selected?e.internals.z:0);return o+a}function Wn({sourceNode:t,targetNode:e,width:i,height:s,transform:n}){const r=bt(wt(t),wt(e));r.x===r.x2&&(r.x2+=1),r.y===r.y2&&(r.y2+=1);const o={x:-n[0]/n[2],y:-n[1]/n[2],width:i/n[2],height:s/n[2]};return fe(o,Et(r))>0}const Re=({source:t,sourceHandle:e,target:i,targetHandle:s})=>`xy-edge__${t}${e||""}-${i}${s||""}`,Fe=(t,e)=>e.some(i=>i.source===t.source&&i.target===t.target&&(i.sourceHandle===t.sourceHandle||!i.sourceHandle&&!t.sourceHandle)&&(i.targetHandle===t.targetHandle||!i.targetHandle&&!t.targetHandle)),_n=(t,e,i={})=>{var r;if(!t.source||!t.target)return(r=i.onError)==null||r.call(i,"006",pt.error006()),e;const s=i.getEdgeId||Re;let n;return Ne(t)?n={...t}:n={...t,id:s(t)},Fe(n,e)?e:(n.sourceHandle===null&&delete n.sourceHandle,n.targetHandle===null&&delete n.targetHandle,e.concat(n))};function Ln({sourceX:t,sourceY:e,targetX:i,targetY:s}){const[n,r,o,a]=ye({sourceX:t,sourceY:e,targetX:i,targetY:s});return[`M ${t},${e}L ${i},${s}`,n,r,o,a]}const Ut={[z.Left]:{x:-1,y:0},[z.Right]:{x:1,y:0},[z.Top]:{x:0,y:-1},[z.Bottom]:{x:0,y:1}},Ge=({source:t,sourcePosition:e=z.Bottom,target:i})=>e===z.Left||e===z.Right?t.x<i.x?{x:1,y:0}:{x:-1,y:0}:t.y<i.y?{x:0,y:1}:{x:0,y:-1},jt=(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function Se({source:t,sourcePosition:e=z.Bottom,target:i,targetPosition:s=z.Top,center:n,offset:r,stepPosition:o}){const a=Ut[e],c=Ut[s],l={x:t.x+a.x*r,y:t.y+a.y*r},u={x:i.x+c.x*r,y:i.y+c.y*r},h=Ge({source:l,sourcePosition:e,target:u}),f=h.x!==0?"x":"y",y=h[f];let d=[],p,b;const M={x:0,y:0},I={x:0,y:0},[,,g,T]=ye({sourceX:t.x,sourceY:t.y,targetX:i.x,targetY:i.y});if(a[f]*c[f]===-1){f==="x"?(p=n.x??l.x+(u.x-l.x)*o,b=n.y??(l.y+u.y)/2):(p=n.x??(l.x+u.x)/2,b=n.y??l.y+(u.y-l.y)*o);const H=[{x:p,y:l.y},{x:p,y:u.y}],E=[{x:l.x,y:b},{x:u.x,y:b}];a[f]===y?d=f==="x"?H:E:d=f==="x"?E:H}else{const H=[{x:l.x,y:u.y}],E=[{x:u.x,y:l.y}];if(f==="x"?d=a.x===y?E:H:d=a.y===y?H:E,e===s){const x=Math.abs(t[f]-i[f]);if(x<=r){const m=Math.min(r-1,r-x);a[f]===y?M[f]=(l[f]>t[f]?-1:1)*m:I[f]=(u[f]>i[f]?-1:1)*m}}if(e!==s){const x=f==="x"?"y":"x",m=a[f]===c[x],Y=l[x]>u[x],P=l[x]<u[x];(a[f]===1&&(!m&&Y||m&&P)||a[f]!==1&&(!m&&P||m&&Y))&&(d=f==="x"?H:E)}const L={x:l.x+M.x,y:l.y+M.y},D={x:u.x+I.x,y:u.y+I.y},$=Math.max(Math.abs(L.x-d[0].x),Math.abs(D.x-d[0].x)),w=Math.max(Math.abs(L.y-d[0].y),Math.abs(D.y-d[0].y));$>=w?(p=(L.x+D.x)/2,b=d[0].y):(p=d[0].x,b=(L.y+D.y)/2)}const X={x:l.x+M.x,y:l.y+M.y},C={x:u.x+I.x,y:u.y+I.y};return[[t,...X.x!==d[0].x||X.y!==d[0].y?[X]:[],...d,...C.x!==d[d.length-1].x||C.y!==d[d.length-1].y?[C]:[],i],p,b,g,T]}function qe(t,e,i,s){const n=Math.min(jt(t,e)/2,jt(e,i)/2,s),{x:r,y:o}=e;if(t.x===r&&r===i.x||t.y===o&&o===i.y)return`L${r} ${o}`;if(t.y===o){const l=t.x<i.x?-1:1,u=t.y<i.y?1:-1;return`L ${r+n*l},${o}Q ${r},${o} ${r},${o+n*u}`}const a=t.x<i.x?1:-1,c=t.y<i.y?-1:1;return`L ${r},${o+n*c}Q ${r},${o} ${r+n*a},${o}`}function Rn({sourceX:t,sourceY:e,sourcePosition:i=z.Bottom,targetX:s,targetY:n,targetPosition:r=z.Top,borderRadius:o=5,centerX:a,centerY:c,offset:l=20,stepPosition:u=.5}){const[h,f,y,d,p]=Se({source:{x:t,y:e},sourcePosition:i,target:{x:s,y:n},targetPosition:r,center:{x:a,y:c},offset:l,stepPosition:u});let b=`M${h[0].x} ${h[0].y}`;for(let M=1;M<h.length-1;M++)b+=qe(h[M-1],h[M],h[M+1],o);return b+=`L${h[h.length-1].x} ${h[h.length-1].y}`,[b,f,y,d,p]}function Kt(t){var e;return t&&!!(t.internals.handleBounds||(e=t.handles)!=null&&e.length)&&!!(t.measured.width||t.width||t.initialWidth)}function Fn(t){var h;const{sourceNode:e,targetNode:i}=t;if(!Kt(e)||!Kt(i))return null;const s=e.internals.handleBounds||Qt(e.handles),n=i.internals.handleBounds||Qt(i.handles),r=Jt((s==null?void 0:s.source)??[],t.sourceHandle),o=Jt(t.connectionMode===mt.Strict?(n==null?void 0:n.target)??[]:((n==null?void 0:n.target)??[]).concat((n==null?void 0:n.source)??[]),t.targetHandle);if(!r||!o)return(h=t.onError)==null||h.call(t,"008",pt.error008(r?"target":"source",{id:t.id,sourceHandle:t.sourceHandle,targetHandle:t.targetHandle})),null;const a=(r==null?void 0:r.position)||z.Bottom,c=(o==null?void 0:o.position)||z.Top,l=ft(e,r,a),u=ft(i,o,c);return{sourceX:l.x,sourceY:l.y,targetX:u.x,targetY:u.y,sourcePosition:a,targetPosition:c}}function Qt(t){if(!t)return null;const e=[],i=[];for(const s of t)s.width=s.width??1,s.height=s.height??1,s.type==="source"?e.push(s):s.type==="target"&&i.push(s);return{source:e,target:i}}function ft(t,e,i=z.Left,s=!1){const n=((e==null?void 0:e.x)??0)+t.internals.positionAbsolute.x,r=((e==null?void 0:e.y)??0)+t.internals.positionAbsolute.y,{width:o,height:a}=e??st(t);if(s)return{x:n+o/2,y:r+a/2};switch((e==null?void 0:e.position)??i){case z.Top:return{x:n+o/2,y:r};case z.Right:return{x:n+o,y:r+a/2};case z.Bottom:return{x:n+o/2,y:r+a};case z.Left:return{x:n,y:r+a/2}}}function Jt(t,e){return t&&(e?t.find(i=>i.id===e):t[0])||null}function ke(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(s=>`${s}=${t[s]}`).join("&")}`:""}function Gn(t,{id:e,defaultColor:i,defaultMarkerStart:s,defaultMarkerEnd:n}){const r=new Set;return t.reduce((o,a)=>([a.markerStart||s,a.markerEnd||n].forEach(c=>{if(c&&typeof c=="object"){const l=ke(c,e);r.has(l)||(o.push({id:l,color:c.color||i,...c}),r.add(l))}}),o),[]).sort((o,a)=>o.id.localeCompare(a.id))}const xe=1e3,Ue=10,Xt={nodeOrigin:[0,0],nodeExtent:ve,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},je={...Xt,checkEquality:!0};function Dt(t,e){const i={...t};for(const s in e)e[s]!==void 0&&(i[s]=e[s]);return i}function Sn(t,e,i){const s=Dt(Xt,i);for(const n of t.values())if(n.parentId)Ot(n,t,e,s);else{const r=yt(n,s.nodeOrigin),o=at(n.extent)?n.extent:s.nodeExtent,a=rt(r,o,st(n));n.internals.positionAbsolute=a}}function Ke(t,e){if(!t.handles)return t.measured?e==null?void 0:e.internals.handleBounds:void 0;const i=[],s=[];for(const n of t.handles){const r={id:n.id,width:n.width??1,height:n.height??1,nodeId:t.id,x:n.x,y:n.y,position:n.position,type:n.type};n.type==="source"?i.push(r):n.type==="target"&&s.push(r)}return{source:i,target:s}}function Vt(t){return t==="manual"}function qn(t,e,i,s={}){var u,h;const n=Dt(je,s),r={i:0},o=new Map(e),a=n!=null&&n.elevateNodesOnSelect&&!Vt(n.zIndexMode)?xe:0;let c=t.length>0,l=!1;e.clear(),i.clear();for(const f of t){let y=o.get(f.id);if(n.checkEquality&&f===(y==null?void 0:y.internals.userNode))e.set(f.id,y);else{const d=yt(f,n.nodeOrigin),p=at(f.extent)?f.extent:n.nodeExtent,b=rt(d,p,st(f));y={...n.defaults,...f,measured:{width:(u=f.measured)==null?void 0:u.width,height:(h=f.measured)==null?void 0:h.height},internals:{positionAbsolute:b,handleBounds:Ke(f,y),z:ge(f,a,n.zIndexMode),userNode:f}},e.set(f.id,y)}(y.measured===void 0||y.measured.width===void 0||y.measured.height===void 0)&&!y.hidden&&(c=!1),f.parentId&&Ot(y,e,i,s,r),l||(l=f.selected??!1)}return{nodesInitialized:c,hasSelectedNodes:l}}function Qe(t,e){if(!t.parentId)return;const i=e.get(t.parentId);i?i.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function Ot(t,e,i,s,n){const{elevateNodesOnSelect:r,nodeOrigin:o,nodeExtent:a,zIndexMode:c}=Dt(Xt,s),l=t.parentId,u=e.get(l);if(!u){console.warn(`Parent node ${l} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Qe(t,i),n&&!u.parentId&&u.internals.rootParentIndex===void 0&&c==="auto"&&(u.internals.rootParentIndex=++n.i,u.internals.z=u.internals.z+n.i*Ue),n&&u.internals.rootParentIndex!==void 0&&(n.i=u.internals.rootParentIndex);const h=r&&!Vt(c)?xe:0,{x:f,y,z:d}=Je(t,u,o,a,h,c),{positionAbsolute:p}=t.internals,b=f!==p.x||y!==p.y;(b||d!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:b?{x:f,y}:p,z:d}})}function ge(t,e,i){const s=ot(t.zIndex)?t.zIndex:0;return Vt(i)?s:s+(t.selected?e:0)}function Je(t,e,i,s,n,r){const{x:o,y:a}=e.internals.positionAbsolute,c=st(t),l=yt(t,i),u=at(t.extent)?rt(l,t.extent,c):l;let h=rt({x:o+u.x,y:a+u.y},s,c);t.extent==="parent"&&(h=ce(h,c,e));const f=ge(t,n,r),y=e.internals.z??0;return{x:h.x,y:h.y,z:y>=f?y+1:f}}function Ze(t,e,i,s=[0,0]){var o;const n=[],r=new Map;for(const a of t){const c=e.get(a.parentId);if(!c)continue;const l=((o=r.get(a.parentId))==null?void 0:o.expandedRect)??Yt(c),u=ze(l,a.rect);r.set(a.parentId,{expandedRect:u,parent:c})}return r.size>0&&r.forEach(({expandedRect:a,parent:c},l)=>{var g;const u=c.internals.positionAbsolute,h=st(c),f=c.origin??s,y=a.x<u.x?Math.round(Math.abs(u.x-a.x)):0,d=a.y<u.y?Math.round(Math.abs(u.y-a.y)):0,p=Math.max(h.width,Math.round(a.width)),b=Math.max(h.height,Math.round(a.height)),M=(p-h.width)*f[0],I=(b-h.height)*f[1];(y>0||d>0||M||I)&&(n.push({id:l,type:"position",position:{x:c.position.x-y+M,y:c.position.y-d+I}}),(g=i.get(l))==null||g.forEach(T=>{t.some(X=>X.id===T.id)||n.push({id:T.id,type:"position",position:{x:T.position.x+y,y:T.position.y+d}})})),(h.width<a.width||h.height<a.height||y||d)&&n.push({id:l,type:"dimensions",setAttributes:!0,dimensions:{width:p+(y?f[0]*y-M:0),height:b+(d?f[1]*d-I:0)}})}),n}function kn(t,e,i,s,n,r,o){const a=s==null?void 0:s.querySelector(".xyflow__viewport");let c=!1;if(!a)return{changes:[],updatedInternals:c};const l=[],u=window.getComputedStyle(a),{m22:h}=new window.DOMMatrixReadOnly(u.transform),f=[];for(const y of t.values()){const d=e.get(y.id);if(!d)continue;if(d.hidden){e.set(d.id,{...d,internals:{...d.internals,handleBounds:void 0}}),c=!0;continue}const p=he(y.nodeElement),b=d.measured.width!==p.width||d.measured.height!==p.height;if(!!(p.width&&p.height&&(b||!d.internals.handleBounds||y.force))){const I=y.nodeElement.getBoundingClientRect(),g=at(d.extent)?d.extent:r;let{positionAbsolute:T}=d.internals;if(d.parentId&&d.extent==="parent"){const C=e.get(d.parentId);C&&(T=ce(T,p,C))}else g&&(T=rt(T,g,p));const X={...d,measured:p,internals:{...d.internals,positionAbsolute:T,handleBounds:{source:qt("source",y.nodeElement,I,h,d.id),target:qt("target",y.nodeElement,I,h,d.id)}}};e.set(d.id,X),d.parentId&&Ot(X,e,i,{nodeOrigin:n,zIndexMode:o}),c=!0,b&&(l.push({id:d.id,type:"dimensions",dimensions:p}),d.expandParent&&d.parentId&&f.push({id:d.id,parentId:d.parentId,rect:Yt(X,n)}))}}if(f.length>0){const y=Ze(f,e,i,n);l.push(...y)}return{changes:l,updatedInternals:c}}async function Un({delta:t,panZoom:e,transform:i,translateExtent:s,width:n,height:r}){if(!e||!t.x&&!t.y)return!1;const o=await e.setViewportConstrained({x:i[0]+t.x,y:i[1]+t.y,zoom:i[2]},[[0,0],[n,r]],s);return!!o&&(o.x!==i[0]||o.y!==i[1]||o.k!==i[2])}function Zt(t,e,i,s,n,r){let o=n;const a=s.get(o)||new Map;s.set(o,a.set(i,e)),o=`${n}-${t}`;const c=s.get(o)||new Map;if(s.set(o,c.set(i,e)),r){o=`${n}-${t}-${r}`;const l=s.get(o)||new Map;s.set(o,l.set(i,e))}}function jn(t,e,i){t.clear(),e.clear();for(const s of i){const{source:n,target:r,sourceHandle:o=null,targetHandle:a=null}=s,c={edgeId:s.id,source:n,target:r,sourceHandle:o,targetHandle:a},l=`${n}-${o}--${r}-${a}`,u=`${r}-${a}--${n}-${o}`;Zt("source",c,u,t,n,o),Zt("target",c,l,t,r,a),e.set(s.id,s)}}function pe(t,e){if(!t.parentId)return!1;const i=e.get(t.parentId);return i?i.selected?!0:pe(i,e):!1}function te(t,e,i){var n;let s=t;do{if((n=s==null?void 0:s.matches)!=null&&n.call(s,e))return!0;if(s===i)return!1;s=s==null?void 0:s.parentElement}while(s);return!1}function tn(t,e,i,s){const n=new Map;for(const[r,o]of t)if((o.selected||o.id===s)&&(!o.parentId||!pe(o,t))&&(o.draggable||e&&typeof o.draggable>"u")){const a=t.get(r);a&&n.set(r,{id:r,position:a.position||{x:0,y:0},distance:{x:i.x-a.internals.positionAbsolute.x,y:i.y-a.internals.positionAbsolute.y},extent:a.extent,parentId:a.parentId,origin:a.origin,expandParent:a.expandParent,internals:{positionAbsolute:a.internals.positionAbsolute||{x:0,y:0}},measured:{width:a.measured.width??0,height:a.measured.height??0}})}return n}function At({nodeId:t,dragItems:e,nodeLookup:i,dragging:s=!0}){var o,a,c;const n=[];for(const[l,u]of e){const h=(o=i.get(l))==null?void 0:o.internals.userNode;h&&n.push({...h,position:u.position,dragging:s})}if(!t)return[n[0],n];const r=(a=i.get(t))==null?void 0:a.internals.userNode;return[r?{...r,position:((c=e.get(t))==null?void 0:c.position)||r.position,dragging:s}:n[0],n]}function en({dragItems:t,snapGrid:e,x:i,y:s}){const n=t.values().next().value;if(!n)return null;const r={x:i-n.distance.x,y:s-n.distance.y},o=Ht(r,e);return{x:o.x-r.x,y:o.y-r.y}}function Kn({onNodeMouseDown:t,getStoreItems:e,onDragStart:i,onDrag:s,onDragStop:n}){let r={x:null,y:null},o=0,a=new Map,c=!1,l={x:0,y:0},u=null,h=!1,f=null,y=!1,d=!1,p=null;function b({noDragClassName:I,handleSelector:g,domNode:T,isSelectable:X,nodeId:C,nodeClickDistance:A=0}){f=Mt(T);function H({x:$,y:w}){const{nodeLookup:x,nodeExtent:m,snapGrid:Y,snapToGrid:P,nodeOrigin:N,onNodeDrag:v,onSelectionDrag:O,onError:V,updateNodePositions:B}=e();r={x:$,y:w};let F=!1;const R=a.size>1,k=R&&m?Nt(ae(a)):null,j=R&&P?en({dragItems:a,snapGrid:Y,x:$,y:w}):null;for(const[S,W]of a){if(!x.has(S))continue;let q={x:$-W.distance.x,y:w-W.distance.y};P&&(q=j?{x:Math.round(q.x+j.x),y:Math.round(q.y+j.y)}:Ht(q,Y));let U=null;if(R&&m&&!W.extent&&k){const{positionAbsolute:_}=W.internals,Z=_.x-k.x+m[0][0],J=_.x+W.measured.width-k.x2+m[1][0],K=_.y-k.y+m[0][1],et=_.y+W.measured.height-k.y2+m[1][1];U=[[Z,K],[J,et]]}const{position:G,positionAbsolute:Q}=Ye({nodeId:S,nextPosition:q,nodeLookup:x,nodeExtent:U||m,nodeOrigin:N,onError:V});F=F||W.position.x!==G.x||W.position.y!==G.y,W.position=G,W.internals.positionAbsolute=Q}if(d=d||F,!!F&&(B(a,!0),p&&(s||v||!C&&O))){const[S,W]=At({nodeId:C,dragItems:a,nodeLookup:x});s==null||s(p,a,S,W),v==null||v(p,S,W),C||O==null||O(p,W)}}async function E(){if(!u)return;const{transform:$,panBy:w,autoPanSpeed:x,autoPanOnNodeDrag:m}=e();if(!m){c=!1,cancelAnimationFrame(o);return}const[Y,P]=le(l,u,x);(Y!==0||P!==0)&&(r.x=(r.x??0)-Y/$[2],r.y=(r.y??0)-P/$[2],await w({x:Y,y:P})&&H(r)),o=requestAnimationFrame(E)}function L($){var R;const{nodeLookup:w,multiSelectionActive:x,nodesDraggable:m,transform:Y,snapGrid:P,snapToGrid:N,selectNodesOnDrag:v,onNodeDragStart:O,onSelectionDragStart:V,unselectNodesAndEdges:B}=e();h=!0,(!v||!X)&&!x&&C&&((R=w.get(C))!=null&&R.selected||B()),X&&v&&C&&(t==null||t(C));const F=ht($.sourceEvent,{transform:Y,snapGrid:P,snapToGrid:N,containerBounds:u});if(r=F,a=tn(w,m,F,C),a.size>0&&(i||O||!C&&V)){const[k,j]=At({nodeId:C,dragItems:a,nodeLookup:w});i==null||i($.sourceEvent,a,k,j),O==null||O($.sourceEvent,k,j),C||V==null||V($.sourceEvent,j)}}const D=re().clickDistance(A).on("start",$=>{const{domNode:w,nodeDragThreshold:x,transform:m,snapGrid:Y,snapToGrid:P}=e();u=(w==null?void 0:w.getBoundingClientRect())||null,y=!1,d=!1,p=$.sourceEvent,x===0&&L($),r=ht($.sourceEvent,{transform:m,snapGrid:Y,snapToGrid:P,containerBounds:u}),l=tt($.sourceEvent,u)}).on("drag",$=>{const{autoPanOnNodeDrag:w,transform:x,snapGrid:m,snapToGrid:Y,nodeDragThreshold:P,nodeLookup:N}=e(),v=ht($.sourceEvent,{transform:x,snapGrid:m,snapToGrid:Y,containerBounds:u});if(p=$.sourceEvent,($.sourceEvent.type==="touchmove"&&$.sourceEvent.touches.length>1||C&&!N.has(C))&&(y=!0),!y){if(!c&&w&&h&&(c=!0,E()),!h){const O=tt($.sourceEvent,u),V=O.x-l.x,B=O.y-l.y;Math.sqrt(V*V+B*B)>P&&L($)}(r.x!==v.xSnapped||r.y!==v.ySnapped)&&a&&h&&(l=tt($.sourceEvent,u),H(v))}}).on("end",$=>{if(!h||y){y&&a.size>0&&e().updateNodePositions(a,!1);return}if(c=!1,h=!1,cancelAnimationFrame(o),a.size>0){const{nodeLookup:w,updateNodePositions:x,onNodeDragStop:m,onSelectionDragStop:Y}=e();if(d&&(x(a,!1),d=!1),n||m||!C&&Y){const[P,N]=At({nodeId:C,dragItems:a,nodeLookup:w,dragging:!1});n==null||n($.sourceEvent,a,P,N),m==null||m($.sourceEvent,P,N),C||Y==null||Y($.sourceEvent,N)}}}).filter($=>{const w=$.target;return!$.button&&(!I||!te(w,`.${I}`,T))&&(!g||te(w,g,T))});f.call(D)}function M(){f==null||f.on(".drag",null)}return{update:b,destroy:M}}function nn(t,e,i){const s=[],n={x:t.x-i,y:t.y-i,width:i*2,height:i*2};for(const r of e.values())fe(n,Yt(r))>0&&s.push(r);return s}const sn=250;function on(t,e,i,s){var a,c;let n=[],r=1/0;const o=nn(t,i,e+sn);for(const l of o){const u=[...((a=l.internals.handleBounds)==null?void 0:a.source)??[],...((c=l.internals.handleBounds)==null?void 0:c.target)??[]];for(const h of u){if(s.nodeId===h.nodeId&&s.type===h.type&&s.id===h.id)continue;const{x:f,y}=ft(l,h,h.position,!0),d=Math.sqrt(Math.pow(f-t.x,2)+Math.pow(y-t.y,2));d>e||(d<r?(n=[{...h,x:f,y}],r=d):d===r&&n.push({...h,x:f,y}))}}if(!n.length)return null;if(n.length>1){const l=s.type==="source"?"target":"source";return n.find(u=>u.type===l)??n[0]}return n[0]}function me(t,e,i,s,n,r=!1){var l,u,h;const o=s.get(t);if(!o)return null;const a=n==="strict"?(l=o.internals.handleBounds)==null?void 0:l[e]:[...((u=o.internals.handleBounds)==null?void 0:u.source)??[],...((h=o.internals.handleBounds)==null?void 0:h.target)??[]],c=(i?a==null?void 0:a.find(f=>f.id===i):a==null?void 0:a[0])??null;return c&&r?{...c,...ft(o,c,c.position,!0)}:c}function we(t,e){return t||(e!=null&&e.classList.contains("target")?"target":e!=null&&e.classList.contains("source")?"source":null)}function rn(t,e){let i=null;return e?i=!0:t&&!e&&(i=!1),i}const Me=()=>!0;function an(t,{connectionMode:e,connectionRadius:i,handleId:s,nodeId:n,edgeUpdaterType:r,isTarget:o,domNode:a,nodeLookup:c,lib:l,autoPanOnConnect:u,flowId:h,panBy:f,cancelConnection:y,onConnectStart:d,onConnect:p,onConnectEnd:b,isValidConnection:M=Me,onReconnectEnd:I,updateConnection:g,getTransform:T,getFromHandle:X,autoPanSpeed:C,dragThreshold:A=1,handleDomNode:H}){const E=Oe(t.target);let L=0,D;const{x:$,y:w}=tt(t),x=we(r,H),m=a==null?void 0:a.getBoundingClientRect();let Y=!1;if(!m||!x)return;const P=me(n,x,s,c,e);if(!P)return;let N=tt(t,m),v=!1,O=null,V=!1,B=null;function F(){if(!u||!m)return;const[G,Q]=le(N,m,C);f({x:G,y:Q}),L=requestAnimationFrame(F)}const R={...P,nodeId:n,type:x,position:P.position},k=c.get(n);let S={inProgress:!0,isValid:null,from:ft(k,R,z.Left,!0),fromHandle:R,fromPosition:R.position,fromNode:k,to:N,toHandle:null,toPosition:Gt[R.position],toNode:null,pointer:N};function W(){Y=!0,g(S),d==null||d(t,{nodeId:n,handleId:s,handleType:x})}A===0&&W();function q(G){if(!Y){const{x:et,y:$e}=tt(G),Wt=et-$,_t=$e-w;if(!(Wt*Wt+_t*_t>A*A))return;W()}if(!X()||!R){U(G);return}const Q=T();N=tt(G,m),D=on(de(N,Q,!1,[1,1]),i,c,R),v||(F(),v=!0);const _=be(G,{handle:D,connectionMode:e,fromNodeId:n,fromHandleId:s,fromType:o?"target":"source",isValidConnection:M,doc:E,lib:l,flowId:h,nodeLookup:c});B=_.handleDomNode,O=_.connection,V=rn(!!D,_.isValid);const Z=c.get(n),J=Z?ft(Z,R,z.Left,!0):S.from,K={...S,from:J,isValid:V,to:_.toHandle&&V?Pt({x:_.toHandle.x,y:_.toHandle.y},Q):N,toHandle:_.toHandle,toPosition:V&&_.toHandle?_.toHandle.position:Gt[R.position],toNode:_.toHandle?c.get(_.toHandle.nodeId):null,pointer:N};g(K),S=K}function U(G){if(!("touches"in G&&G.touches.length>0)){if(Y){(D||B)&&O&&V&&(p==null||p(O));const{inProgress:Q,..._}=S,Z={..._,toPosition:S.toHandle?S.toPosition:null};b==null||b(G,Z),r&&(I==null||I(G,Z))}y(),cancelAnimationFrame(L),v=!1,V=!1,O=null,B=null,E.removeEventListener("mousemove",q),E.removeEventListener("mouseup",U),E.removeEventListener("touchmove",q),E.removeEventListener("touchend",U)}}E.addEventListener("mousemove",q),E.addEventListener("mouseup",U),E.addEventListener("touchmove",q),E.addEventListener("touchend",U)}function be(t,{handle:e,connectionMode:i,fromNodeId:s,fromHandleId:n,fromType:r,doc:o,lib:a,flowId:c,isValidConnection:l=Me,nodeLookup:u}){const h=r==="target",f=e?o.querySelector(`.${a}-flow__handle[data-id="${c}-${e==null?void 0:e.nodeId}-${e==null?void 0:e.id}-${e==null?void 0:e.type}"]`):null,{x:y,y:d}=tt(t),p=o.elementFromPoint(y,d),b=p!=null&&p.classList.contains(`${a}-flow__handle`)?p:f,M={handleDomNode:b,isValid:!1,connection:null,toHandle:null};if(b){const I=we(void 0,b),g=b.getAttribute("data-nodeid"),T=b.getAttribute("data-handleid"),X=b.classList.contains("connectable"),C=b.classList.contains("connectableend");if(!g||!I)return M;const A={source:h?g:s,sourceHandle:h?T:n,target:h?s:g,targetHandle:h?n:T};M.connection=A;const E=X&&C&&(i===mt.Strict?h&&I==="source"||!h&&I==="target":g!==s||T!==n);M.isValid=E&&l(A),M.toHandle=me(g,I,T,u,i,!0)}return M}const Qn={onPointerDown:an,isValid:be};function Jn({domNode:t,panZoom:e,getTransform:i,getViewScale:s}){const n=Mt(t);function r({translateExtent:a,width:c,height:l,zoomStep:u=1,pannable:h=!0,zoomable:f=!0,inversePan:y=!1}){const d=g=>{if(g.sourceEvent.type!=="wheel"||!e)return;const T=i(),X=g.sourceEvent.ctrlKey&&zt()?10:1,C=-g.sourceEvent.deltaY*(g.sourceEvent.deltaMode===1?.05:g.sourceEvent.deltaMode?1:.002)*u,A=T[2]*Math.pow(2,C*X);e.scaleTo(A)};let p=[0,0];const b=g=>{(g.sourceEvent.type==="mousedown"||g.sourceEvent.type==="touchstart")&&(p=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY])},M=g=>{const T=i();if(g.sourceEvent.type!=="mousemove"&&g.sourceEvent.type!=="touchmove"||!e)return;const X=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY],C=[X[0]-p[0],X[1]-p[1]];p=X;const A=s()*Math.max(T[2],Math.log(T[2]))*(y?-1:1),H={x:T[0]-C[0]*A,y:T[1]-C[1]*A},E=[[0,0],[c,l]];e.setViewportConstrained({x:H.x,y:H.y,zoom:T[2]},E,a)},I=oe().on("start",b).on("zoom",h?M:null).on("zoom.wheel",f?d:null);n.call(I,{})}function o(){n.on("zoom",null)}return{update:r,destroy:o,pointer:se}}const Tt=t=>({x:t.x,y:t.y,zoom:t.k}),vt=({x:t,y:e,zoom:i})=>Ce.translate(t,e).scale(i),lt=(t,e)=>t.target.closest(`.${e}`),Ee=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),cn=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,It=(t,e=0,i=cn,s=()=>{})=>{const n=typeof e=="number"&&e>0;return n||s(),n?t.transition().duration(e).ease(i).on("end",s):t},He=t=>{const e=t.ctrlKey&&zt()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function ln({zoomPanValues:t,noWheelClassName:e,d3Selection:i,d3Zoom:s,panOnScrollMode:n,panOnScrollSpeed:r,zoomOnPinch:o,onPanZoomStart:a,onPanZoom:c,onPanZoomEnd:l}){return u=>{if(lt(u,e))return u.ctrlKey&&u.preventDefault(),!1;u.preventDefault(),u.stopImmediatePropagation();const h=i.property("__zoom").k||1;if(u.ctrlKey&&o){const b=se(u),M=He(u),I=h*Math.pow(2,M);s.scaleTo(i,I,b,u);return}const f=u.deltaMode===1?20:1;let y=n===dt.Vertical?0:u.deltaX*f,d=n===dt.Horizontal?0:u.deltaY*f;!zt()&&u.shiftKey&&n!==dt.Vertical&&(y=u.deltaY*f,d=0),s.translateBy(i,-(y/h)*r,-(d/h)*r,{internal:!0});const p=Tt(i.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?c==null||c(u,p):(t.isPanScrolling=!0,a==null||a(u,p)),t.panScrollTimeout=setTimeout(()=>{l==null||l(u,p),t.isPanScrolling=!1},150)}}function un({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:i}){return function(s,n){const r=s.type==="wheel",o=!e&&r&&!s.ctrlKey,a=lt(s,t);if(s.ctrlKey&&r&&a&&s.preventDefault(),o||a)return null;s.preventDefault(),i.call(this,s,n)}}function fn({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:i}){return s=>{var r,o,a;if((r=s.sourceEvent)!=null&&r.internal)return;const n=Tt(s.transform);t.mouseButton=((o=s.sourceEvent)==null?void 0:o.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=n,((a=s.sourceEvent)==null?void 0:a.type)==="mousedown"&&e(!0),i&&(i==null||i(s.sourceEvent,n))}}function dn({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:i,onTransformChange:s,onPanZoom:n}){return r=>{var o,a;t.usedRightMouseButton=!!(i&&Ee(e,t.mouseButton??0)),(o=r.sourceEvent)!=null&&o.sync||s([r.transform.x,r.transform.y,r.transform.k]),n&&!((a=r.sourceEvent)!=null&&a.internal)&&(n==null||n(r.sourceEvent,Tt(r.transform)))}}function hn({zoomPanValues:t,panOnDrag:e,panOnScroll:i,onDraggingChange:s,onPanZoomEnd:n,onPaneContextMenu:r}){return o=>{var a;if(!((a=o.sourceEvent)!=null&&a.internal)&&(t.isZoomingOrPanning=!1,r&&Ee(e,t.mouseButton??0)&&!t.usedRightMouseButton&&o.sourceEvent&&r(o.sourceEvent),t.usedRightMouseButton=!1,s(!1),n)){const c=Tt(o.transform);t.prevViewport=c,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{n==null||n(o.sourceEvent,c)},i?150:0)}}}function yn({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:i,panOnDrag:s,panOnScroll:n,zoomOnDoubleClick:r,userSelectionActive:o,noWheelClassName:a,noPanClassName:c,lib:l,connectionInProgress:u}){return h=>{var b;const f=t||e,y=i&&h.ctrlKey,d=h.type==="wheel";if(h.button===1&&h.type==="mousedown"&&(lt(h,`${l}-flow__node`)||lt(h,`${l}-flow__edge`)))return!0;if(!s&&!f&&!n&&!r&&!i||o||u&&!d||lt(h,a)&&d||lt(h,c)&&(!d||n&&d&&!t)||!i&&h.ctrlKey&&d)return!1;if(!i&&h.type==="touchstart"&&((b=h.touches)==null?void 0:b.length)>1)return h.preventDefault(),!1;if(!f&&!n&&!y&&d||!s&&(h.type==="mousedown"||h.type==="touchstart")||Array.isArray(s)&&!s.includes(h.button)&&h.type==="mousedown")return!1;const p=Array.isArray(s)&&s.includes(h.button)||!h.button||h.button<=1;return(!h.ctrlKey||d)&&p}}function Zn({domNode:t,minZoom:e,maxZoom:i,translateExtent:s,viewport:n,onPanZoom:r,onPanZoomStart:o,onPanZoomEnd:a,onDraggingChange:c}){const l={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},u=t.getBoundingClientRect();let h=[[0,0],[u.width,u.height]];const f=typeof ResizeObserver<"u"?new ResizeObserver(w=>{const x=w[0];x&&(h=[[0,0],[x.contentRect.width,x.contentRect.height]])}):null;f==null||f.observe(t);const y=oe().extent(()=>h).scaleExtent([e,i]).translateExtent(s),d=Mt(t).call(y);T({x:n.x,y:n.y,zoom:ut(n.zoom,e,i)},[[0,0],[u.width,u.height]],s);const p=d.on("wheel.zoom"),b=d.on("dblclick.zoom");y.wheelDelta(He);async function M(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).transform(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}function I({noWheelClassName:w,noPanClassName:x,onPaneContextMenu:m,userSelectionActive:Y,panOnScroll:P,panOnDrag:N,panOnScrollMode:v,panOnScrollSpeed:O,preventScrolling:V,zoomOnPinch:B,zoomOnScroll:F,zoomOnDoubleClick:R,zoomActivationKeyPressed:k,lib:j,onTransformChange:S,connectionInProgress:W,paneClickDistance:q,selectionOnDrag:U}){Y&&!l.isZoomingOrPanning&&g();const G=P&&!k&&!Y;y.clickDistance(U?1/0:!ot(q)||q<0?0:q);const Q=G?ln({zoomPanValues:l,noWheelClassName:w,d3Selection:d,d3Zoom:y,panOnScrollMode:v,panOnScrollSpeed:O,zoomOnPinch:B,onPanZoomStart:o,onPanZoom:r,onPanZoomEnd:a}):un({noWheelClassName:w,preventScrolling:V,d3ZoomHandler:p});d.on("wheel.zoom",Q,{passive:!1});const _=fn({zoomPanValues:l,onDraggingChange:c,onPanZoomStart:o});y.on("start",_);const Z=dn({zoomPanValues:l,panOnDrag:N,onPaneContextMenu:!!m,onPanZoom:r,onTransformChange:S});y.on("zoom",Z);const J=hn({zoomPanValues:l,panOnDrag:N,panOnScroll:P,onPaneContextMenu:m,onPanZoomEnd:a,onDraggingChange:c});y.on("end",J);const K=yn({zoomActivationKeyPressed:k,panOnDrag:N,zoomOnScroll:F,panOnScroll:P,zoomOnDoubleClick:R,zoomOnPinch:B,userSelectionActive:Y,noPanClassName:x,noWheelClassName:w,lib:j,connectionInProgress:W});y.filter(K),R?d.on("dblclick.zoom",b):d.on("dblclick.zoom",null)}function g(){y.on("zoom",null)}async function T(w,x,m){const Y=vt(w),P=y==null?void 0:y.constrain()(Y,x,m);return P&&await M(P),P}async function X(w,x){const m=vt(w);return await M(m,x),m}function C(w){if(d){const x=vt(w),m=d.property("__zoom");(m.k!==w.zoom||m.x!==w.x||m.y!==w.y)&&(y==null||y.transform(d,x,null,{sync:!0}))}}function A(){const w=d?Ae(d.node()):{x:0,y:0,k:1};return{x:w.x,y:w.y,zoom:w.k}}async function H(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).scaleTo(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}async function E(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).scaleBy(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}function L(w){y==null||y.scaleExtent(w)}function D(w){y==null||y.translateExtent(w)}function $(w){const x=!ot(w)||w<0?0:w;y==null||y.clickDistance(x)}return{update:I,destroy:g,setViewport:X,setViewportConstrained:T,getViewport:A,scaleTo:H,scaleBy:E,setScaleExtent:L,setTranslateExtent:D,syncViewport:C,setClickDistance:$}}var ee;(function(t){t.Line="line",t.Handle="handle"})(ee||(ee={}));function xn({width:t,prevWidth:e,height:i,prevHeight:s,affectsX:n,affectsY:r}){const o=t-e,a=i-s,c=[o>0?1:o<0?-1:0,a>0?1:a<0?-1:0];return o&&n&&(c[0]=c[0]*-1),a&&r&&(c[1]=c[1]*-1),c}function ne(t){const e=t.includes("right")||t.includes("left"),i=t.includes("bottom")||t.includes("top"),s=t.includes("left"),n=t.includes("top");return{isHorizontal:e,isVertical:i,affectsX:s,affectsY:n}}function nt(t,e){return Math.max(0,e-t)}function it(t,e){return Math.max(0,t-e)}function gt(t,e,i){return Math.max(0,e-t,t-i)}function ie(t,e){return t?!e:e}function gn(t,e,i,s,n,r,o,a){let{affectsX:c,affectsY:l}=e;const{isHorizontal:u,isVertical:h}=e,f=u&&h,{xSnapped:y,ySnapped:d}=i,{minWidth:p,maxWidth:b,minHeight:M,maxHeight:I}=s,{x:g,y:T,width:X,height:C,aspectRatio:A}=t;let H=Math.floor(u?y-t.pointerX:0),E=Math.floor(h?d-t.pointerY:0);const L=X+(c?-H:H),D=C+(l?-E:E),$=-r[0]*X,w=-r[1]*C;let x=gt(L,p,b),m=gt(D,M,I);if(o){let N=0,v=0;c&&H<0?N=nt(g+H+$,o[0][0]):!c&&H>0&&(N=it(g+L+$,o[1][0])),l&&E<0?v=nt(T+E+w,o[0][1]):!l&&E>0&&(v=it(T+D+w,o[1][1])),x=Math.max(x,N),m=Math.max(m,v)}if(a){let N=0,v=0;c&&H>0?N=it(g+H,a[0][0]):!c&&H<0&&(N=nt(g+L,a[1][0])),l&&E>0?v=it(T+E,a[0][1]):!l&&E<0&&(v=nt(T+D,a[1][1])),x=Math.max(x,N),m=Math.max(m,v)}if(n){if(u){const N=gt(L/A,M,I)*A;if(x=Math.max(x,N),o){let v=0;!c&&!l||c&&!l&&f?v=it(T+w+L/A,o[1][1])*A:v=nt(T+w+(c?H:-H)/A,o[0][1])*A,x=Math.max(x,v)}if(a){let v=0;!c&&!l||c&&!l&&f?v=nt(T+L/A,a[1][1])*A:v=it(T+(c?H:-H)/A,a[0][1])*A,x=Math.max(x,v)}}if(h){const N=gt(D*A,p,b)/A;if(m=Math.max(m,N),o){let v=0;!c&&!l||l&&!c&&f?v=it(g+D*A+$,o[1][0])/A:v=nt(g+(l?E:-E)*A+$,o[0][0])/A,m=Math.max(m,v)}if(a){let v=0;!c&&!l||l&&!c&&f?v=nt(g+D*A,a[1][0])/A:v=it(g+(l?E:-E)*A,a[0][0])/A,m=Math.max(m,v)}}}E=E+(E<0?m:-m),H=H+(H<0?x:-x),n&&(f?L>D*A?E=(ie(c,l)?-H:H)/A:H=(ie(c,l)?-E:E)*A:u?(E=H/A,l=c):(H=E*A,c=l));const Y=c?g+H:g,P=l?T+E:T;return{width:X+(c?-H:H),height:C+(l?-E:E),x:r[0]*H*(c?-1:1)+Y,y:r[1]*E*(l?-1:1)+P}}const Te={width:0,height:0,x:0,y:0},pn={...Te,pointerX:0,pointerY:0,aspectRatio:1};function mn(t,e,i){const s=e.position.x+t.position.x,n=e.position.y+t.position.y,r=t.measured.width??0,o=t.measured.height??0,a=i[0]*r,c=i[1]*o;return[[s-a,n-c],[s+r-a,n+o-c]]}function ti({domNode:t,nodeId:e,getStoreItems:i,onChange:s,onEnd:n}){const r=Mt(t);let o={controlDirection:ne("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function a({controlPosition:l,boundaries:u,keepAspectRatio:h,resizeDirection:f,onResizeStart:y,onResize:d,onResizeEnd:p,shouldResize:b}){let M={...Te},I={...pn};o={boundaries:u,resizeDirection:f,keepAspectRatio:h,controlDirection:ne(l)};let g,T=null,X=[],C,A,H,E=!1;const L=re().on("start",D=>{const{nodeLookup:$,transform:w,snapGrid:x,snapToGrid:m,nodeOrigin:Y,paneDomNode:P}=i();if(g=$.get(e),!g)return;T=(P==null?void 0:P.getBoundingClientRect())??null;const{xSnapped:N,ySnapped:v}=ht(D.sourceEvent,{transform:w,snapGrid:x,snapToGrid:m,containerBounds:T});M={width:g.measured.width??0,height:g.measured.height??0,x:g.position.x??0,y:g.position.y??0},I={...M,pointerX:N,pointerY:v,aspectRatio:M.width/M.height},C=void 0,A=at(g.extent)?g.extent:void 0,g.parentId&&(g.extent==="parent"||g.expandParent)&&(C=$.get(g.parentId)),C&&g.extent==="parent"&&(A=[[0,0],[C.measured.width,C.measured.height]]),X=[],H=void 0;for(const[O,V]of $)if(V.parentId===e&&(X.push({id:O,position:{...V.position},extent:V.extent}),V.extent==="parent"||V.expandParent)){const B=mn(V,g,V.origin??Y);H?H=[[Math.min(B[0][0],H[0][0]),Math.min(B[0][1],H[0][1])],[Math.max(B[1][0],H[1][0]),Math.max(B[1][1],H[1][1])]]:H=B}y==null||y(D,{...M})}).on("drag",D=>{const{transform:$,snapGrid:w,snapToGrid:x,nodeOrigin:m}=i(),Y=ht(D.sourceEvent,{transform:$,snapGrid:w,snapToGrid:x,containerBounds:T}),P=[];if(!g)return;const{x:N,y:v,width:O,height:V}=M,B={},F=g.origin??m,{width:R,height:k,x:j,y:S}=gn(I,o.controlDirection,Y,o.boundaries,o.keepAspectRatio,F,A,H),W=R!==O,q=k!==V,U=j!==N&&W,G=S!==v&&q;if(!U&&!G&&!W&&!q)return;if((U||G||F[0]===1||F[1]===1)&&(B.x=U?j:M.x,B.y=G?S:M.y,M.x=B.x,M.y=B.y,X.length>0)){const J=j-N,K=S-v;for(const et of X)et.position={x:et.position.x-J+F[0]*(R-O),y:et.position.y-K+F[1]*(k-V)},P.push(et)}if((W||q)&&(B.width=W&&(!o.resizeDirection||o.resizeDirection==="horizontal")?R:M.width,B.height=q&&(!o.resizeDirection||o.resizeDirection==="vertical")?k:M.height,M.width=B.width,M.height=B.height),C&&g.expandParent){const J=F[0]*(B.width??0);B.x&&B.x<J&&(M.x=J,I.x=I.x-(B.x-J));const K=F[1]*(B.height??0);B.y&&B.y<K&&(M.y=K,I.y=I.y-(B.y-K))}const Q=xn({width:M.width,prevWidth:O,height:M.height,prevHeight:V,affectsX:o.controlDirection.affectsX,affectsY:o.controlDirection.affectsY}),_={...M,direction:Q};(b==null?void 0:b(D,_))!==!1&&(E=!0,d==null||d(D,_),s(B,P))}).on("end",D=>{E&&(p==null||p(D,{...M}),n==null||n({...M}),E=!1)});r.call(L)}function c(){r.on(".drag",null)}return{update:a,destroy:c}}export{he as $,ve as A,dt as B,mt as C,Rt as D,zt as E,ze as F,ae as G,ti as H,Zn as I,Kn as J,Ht as K,Ye as L,Ft as M,Cn as N,Dn as O,z as P,bn as Q,ee as R,Lt as S,ot as T,Ln as U,Wn as V,Hn as W,Jn as X,Xn as Y,tt as Z,Le as _,fe as a,le as a0,Yn as a1,En as a2,Un as a3,qn as a4,ft as a5,Ze as a6,kn as a7,Sn as a8,jn as a9,An as aa,Ie as ab,vn as b,Oe as c,Qn as d,pt as e,_e as f,$n as g,Ve as h,In as i,Bn as j,Tn as k,Ne as l,_n as m,Yt as n,Pn as o,de as p,Nn as q,Pt as r,st as s,Gn as t,Rn as u,Vn as v,zn as w,Fn as x,On as y,ke as z};