flowent 0.0.0 → 0.0.4

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 (494) hide show
  1. package/README.md +70 -10
  2. package/assets/flowent-banner.png +0 -0
  3. package/backend/.python-version +1 -0
  4. package/backend/pyproject.toml +57 -0
  5. package/backend/src/flowent/__init__.py +3 -0
  6. package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
  7. package/backend/src/flowent/__pycache__/_version.cpython-313.pyc +0 -0
  8. package/backend/src/flowent/__pycache__/access.cpython-313.pyc +0 -0
  9. package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
  10. package/backend/src/flowent/__pycache__/assistant_commands.cpython-313.pyc +0 -0
  11. package/backend/src/flowent/__pycache__/cli.cpython-313.pyc +0 -0
  12. package/backend/src/flowent/__pycache__/config.cpython-313.pyc +0 -0
  13. package/backend/src/flowent/__pycache__/events.cpython-313.pyc +0 -0
  14. package/backend/src/flowent/__pycache__/graph_runtime.cpython-313.pyc +0 -0
  15. package/backend/src/flowent/__pycache__/graph_service.cpython-313.pyc +0 -0
  16. package/backend/src/flowent/__pycache__/image_assets.cpython-313.pyc +0 -0
  17. package/backend/src/flowent/__pycache__/logging.cpython-313.pyc +0 -0
  18. package/backend/src/flowent/__pycache__/main.cpython-313.pyc +0 -0
  19. package/backend/src/flowent/__pycache__/mcp_service.cpython-313.pyc +0 -0
  20. package/backend/src/flowent/__pycache__/model_metadata.cpython-313.pyc +0 -0
  21. package/backend/src/flowent/__pycache__/network.cpython-313.pyc +0 -0
  22. package/backend/src/flowent/__pycache__/registry.cpython-313.pyc +0 -0
  23. package/backend/src/flowent/__pycache__/role_management.cpython-313.pyc +0 -0
  24. package/backend/src/flowent/__pycache__/runtime.cpython-313.pyc +0 -0
  25. package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
  26. package/backend/src/flowent/__pycache__/security.cpython-313.pyc +0 -0
  27. package/backend/src/flowent/__pycache__/settings.cpython-313.pyc +0 -0
  28. package/backend/src/flowent/__pycache__/settings_management.cpython-313.pyc +0 -0
  29. package/backend/src/flowent/__pycache__/state_db.cpython-313.pyc +0 -0
  30. package/backend/src/flowent/__pycache__/stats_service.cpython-313.pyc +0 -0
  31. package/backend/src/flowent/__pycache__/workspace_store.cpython-313.pyc +0 -0
  32. package/backend/src/flowent/_version.py +7 -0
  33. package/backend/src/flowent/access.py +247 -0
  34. package/backend/src/flowent/agent.py +2808 -0
  35. package/backend/src/flowent/assistant_commands.py +106 -0
  36. package/backend/src/flowent/channels/__init__.py +3 -0
  37. package/backend/src/flowent/channels/__pycache__/__init__.cpython-313.pyc +0 -0
  38. package/backend/src/flowent/channels/__pycache__/telegram.cpython-313.pyc +0 -0
  39. package/backend/src/flowent/channels/telegram.py +615 -0
  40. package/backend/src/flowent/cli.py +85 -0
  41. package/backend/src/flowent/config.py +14 -0
  42. package/backend/src/flowent/dev.py +3 -0
  43. package/backend/src/flowent/events.py +157 -0
  44. package/backend/src/flowent/graph_runtime.py +60 -0
  45. package/backend/src/flowent/graph_service.py +1346 -0
  46. package/backend/src/flowent/image_assets.py +356 -0
  47. package/backend/src/flowent/logging.py +155 -0
  48. package/backend/src/flowent/main.py +124 -0
  49. package/backend/src/flowent/mcp_service.py +1904 -0
  50. package/backend/src/flowent/model_metadata.py +98 -0
  51. package/backend/src/flowent/models/__init__.py +121 -0
  52. package/backend/src/flowent/models/__pycache__/__init__.cpython-313.pyc +0 -0
  53. package/backend/src/flowent/models/__pycache__/agent.cpython-313.pyc +0 -0
  54. package/backend/src/flowent/models/__pycache__/base.cpython-313.pyc +0 -0
  55. package/backend/src/flowent/models/__pycache__/blueprint.cpython-313.pyc +0 -0
  56. package/backend/src/flowent/models/__pycache__/content.cpython-313.pyc +0 -0
  57. package/backend/src/flowent/models/__pycache__/delta.cpython-313.pyc +0 -0
  58. package/backend/src/flowent/models/__pycache__/event.cpython-313.pyc +0 -0
  59. package/backend/src/flowent/models/__pycache__/graph.cpython-313.pyc +0 -0
  60. package/backend/src/flowent/models/__pycache__/history.cpython-313.pyc +0 -0
  61. package/backend/src/flowent/models/__pycache__/llm.cpython-313.pyc +0 -0
  62. package/backend/src/flowent/models/__pycache__/message.cpython-313.pyc +0 -0
  63. package/backend/src/flowent/models/__pycache__/tab.cpython-313.pyc +0 -0
  64. package/backend/src/flowent/models/__pycache__/todo.cpython-313.pyc +0 -0
  65. package/backend/src/flowent/models/agent.py +33 -0
  66. package/backend/src/flowent/models/base.py +24 -0
  67. package/backend/src/flowent/models/blueprint.py +176 -0
  68. package/backend/src/flowent/models/content.py +164 -0
  69. package/backend/src/flowent/models/delta.py +44 -0
  70. package/backend/src/flowent/models/event.py +51 -0
  71. package/backend/src/flowent/models/graph.py +437 -0
  72. package/backend/src/flowent/models/history.py +214 -0
  73. package/backend/src/flowent/models/llm.py +61 -0
  74. package/backend/src/flowent/models/message.py +27 -0
  75. package/backend/src/flowent/models/tab.py +48 -0
  76. package/backend/src/flowent/models/todo.py +10 -0
  77. package/backend/src/flowent/network.py +146 -0
  78. package/backend/src/flowent/prompts/__init__.py +67 -0
  79. package/backend/src/flowent/prompts/__pycache__/__init__.cpython-313.pyc +0 -0
  80. package/backend/src/flowent/prompts/__pycache__/common.cpython-313.pyc +0 -0
  81. package/backend/src/flowent/prompts/__pycache__/steward.cpython-313.pyc +0 -0
  82. package/backend/src/flowent/prompts/common.py +250 -0
  83. package/backend/src/flowent/prompts/steward.py +64 -0
  84. package/backend/src/flowent/providers/__init__.py +23 -0
  85. package/backend/src/flowent/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  86. package/backend/src/flowent/providers/__pycache__/anthropic.cpython-313.pyc +0 -0
  87. package/backend/src/flowent/providers/__pycache__/base_url.cpython-313.pyc +0 -0
  88. package/backend/src/flowent/providers/__pycache__/configuration.cpython-313.pyc +0 -0
  89. package/backend/src/flowent/providers/__pycache__/content.cpython-313.pyc +0 -0
  90. package/backend/src/flowent/providers/__pycache__/errors.cpython-313.pyc +0 -0
  91. package/backend/src/flowent/providers/__pycache__/gateway.cpython-313.pyc +0 -0
  92. package/backend/src/flowent/providers/__pycache__/headers.cpython-313.pyc +0 -0
  93. package/backend/src/flowent/providers/__pycache__/management.cpython-313.pyc +0 -0
  94. package/backend/src/flowent/providers/__pycache__/openai.cpython-313.pyc +0 -0
  95. package/backend/src/flowent/providers/__pycache__/openai_responses.cpython-313.pyc +0 -0
  96. package/backend/src/flowent/providers/__pycache__/registry.cpython-313.pyc +0 -0
  97. package/backend/src/flowent/providers/__pycache__/sse.cpython-313.pyc +0 -0
  98. package/backend/src/flowent/providers/__pycache__/thinking.cpython-313.pyc +0 -0
  99. package/backend/src/flowent/providers/anthropic.py +468 -0
  100. package/backend/src/flowent/providers/base_url.py +60 -0
  101. package/backend/src/flowent/providers/configuration.py +182 -0
  102. package/backend/src/flowent/providers/content.py +122 -0
  103. package/backend/src/flowent/providers/errors.py +223 -0
  104. package/backend/src/flowent/providers/gateway.py +169 -0
  105. package/backend/src/flowent/providers/gemini.py +447 -0
  106. package/backend/src/flowent/providers/headers.py +20 -0
  107. package/backend/src/flowent/providers/management.py +96 -0
  108. package/backend/src/flowent/providers/ollama.py +293 -0
  109. package/backend/src/flowent/providers/openai.py +422 -0
  110. package/backend/src/flowent/providers/openai_responses.py +655 -0
  111. package/backend/src/flowent/providers/registry.py +144 -0
  112. package/backend/src/flowent/providers/sse.py +31 -0
  113. package/backend/src/flowent/providers/thinking.py +79 -0
  114. package/backend/src/flowent/registry.py +73 -0
  115. package/backend/src/flowent/role_management.py +255 -0
  116. package/backend/src/flowent/routes/__init__.py +30 -0
  117. package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
  118. package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
  119. package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
  120. package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
  121. package/backend/src/flowent/routes/__pycache__/mcp.cpython-313.pyc +0 -0
  122. package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
  123. package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
  124. package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
  125. package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
  126. package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
  127. package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
  128. package/backend/src/flowent/routes/__pycache__/stats.cpython-313.pyc +0 -0
  129. package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
  130. package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
  131. package/backend/src/flowent/routes/access.py +48 -0
  132. package/backend/src/flowent/routes/assistant.py +155 -0
  133. package/backend/src/flowent/routes/image_assets.py +33 -0
  134. package/backend/src/flowent/routes/mcp.py +125 -0
  135. package/backend/src/flowent/routes/meta.py +28 -0
  136. package/backend/src/flowent/routes/nodes.py +365 -0
  137. package/backend/src/flowent/routes/prompts.py +46 -0
  138. package/backend/src/flowent/routes/providers_route.py +364 -0
  139. package/backend/src/flowent/routes/roles.py +207 -0
  140. package/backend/src/flowent/routes/settings.py +324 -0
  141. package/backend/src/flowent/routes/stats.py +229 -0
  142. package/backend/src/flowent/routes/tabs.py +292 -0
  143. package/backend/src/flowent/routes/ws.py +33 -0
  144. package/backend/src/flowent/runtime.py +188 -0
  145. package/backend/src/flowent/sandbox.py +45 -0
  146. package/backend/src/flowent/security.py +42 -0
  147. package/backend/src/flowent/settings.py +2467 -0
  148. package/backend/src/flowent/settings_management.py +286 -0
  149. package/backend/src/flowent/state_db.py +120 -0
  150. package/backend/src/flowent/static/assets/AssistantPage-B3Xc08AS.js +1 -0
  151. package/backend/src/flowent/static/assets/ChannelsPage-ByLd28xk.js +1 -0
  152. package/backend/src/flowent/static/assets/HomePage-C0hAx9_l.js +3 -0
  153. package/backend/src/flowent/static/assets/McpPage-DkrYLvBv.js +7 -0
  154. package/backend/src/flowent/static/assets/PageScaffold-D4jO9ooX.js +1 -0
  155. package/backend/src/flowent/static/assets/PromptsPage-DWA7rRJd.js +1 -0
  156. package/backend/src/flowent/static/assets/ProvidersPage-PUWT8seJ.js +3 -0
  157. package/backend/src/flowent/static/assets/RolesPage-CqcclGRw.js +1 -0
  158. package/backend/src/flowent/static/assets/SettingsPage-8tS2cJgX.js +3 -0
  159. package/backend/src/flowent/static/assets/StatsPage-BX9khYzu.js +1 -0
  160. package/backend/src/flowent/static/assets/ToolsPage-9Tl9FdeD.js +1 -0
  161. package/backend/src/flowent/static/assets/WorkspaceCommandDialog-CCXxjDL8.js +1 -0
  162. package/backend/src/flowent/static/assets/WorkspacePanels-aMdJ7ZH7.js +1 -0
  163. package/backend/src/flowent/static/assets/alert-dialog-kFYVQ7oX.js +1 -0
  164. package/backend/src/flowent/static/assets/badge-74-3jsCg.js +1 -0
  165. package/backend/src/flowent/static/assets/constants-XUzFf6i1.js +1 -0
  166. package/backend/src/flowent/static/assets/datetime-m6_O_Ci9.js +1 -0
  167. package/backend/src/flowent/static/assets/dialog-BeGSweF6.js +1 -0
  168. package/backend/src/flowent/static/assets/elk-worker.min-C9JGDOE-.js +6312 -0
  169. package/backend/src/flowent/static/assets/graph-vendor-CHpVij2M.css +1 -0
  170. package/backend/src/flowent/static/assets/graph-vendor-DRq_-6fV.js +7 -0
  171. package/backend/src/flowent/static/assets/index-BHC1Vhy8.css +1 -0
  172. package/backend/src/flowent/static/assets/index-CL1ALZ3r.js +10 -0
  173. package/backend/src/flowent/static/assets/layout.worker-jMHqAFbP.js +24 -0
  174. package/backend/src/flowent/static/assets/markdown-vendor-DVdy_w12.js +29 -0
  175. package/backend/src/flowent/static/assets/modelParams-CaHd0903.js +1 -0
  176. package/backend/src/flowent/static/assets/react-vendor-mEs_JJxa.js +9 -0
  177. package/backend/src/flowent/static/assets/roles-2OLDeTc5.js +1 -0
  178. package/backend/src/flowent/static/assets/rolldown-runtime-BYbx6iT9.js +1 -0
  179. package/backend/src/flowent/static/assets/select-DL_LPeDj.js +1 -0
  180. package/backend/src/flowent/static/assets/shared-CMxbpLeQ.js +1 -0
  181. package/backend/src/flowent/static/assets/triState-DEr3NkXV.js +1 -0
  182. package/backend/src/flowent/static/assets/ui-vendor-Dg9NNnWX.js +51 -0
  183. package/backend/src/flowent/static/index.html +36 -0
  184. package/backend/src/flowent/stats_service.py +218 -0
  185. package/backend/src/flowent/tools/__init__.py +201 -0
  186. package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  187. package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
  188. package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
  189. package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
  190. package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
  191. package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
  192. package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
  193. package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
  194. package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
  195. package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
  196. package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
  197. package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
  198. package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
  199. package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
  200. package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
  201. package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
  202. package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
  203. package/backend/src/flowent/tools/__pycache__/mcp.cpython-313.pyc +0 -0
  204. package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
  205. package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
  206. package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
  207. package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
  208. package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
  209. package/backend/src/flowent/tools/connect.py +156 -0
  210. package/backend/src/flowent/tools/contacts.py +22 -0
  211. package/backend/src/flowent/tools/create_agent.py +270 -0
  212. package/backend/src/flowent/tools/create_tab.py +59 -0
  213. package/backend/src/flowent/tools/delete_tab.py +39 -0
  214. package/backend/src/flowent/tools/edit.py +142 -0
  215. package/backend/src/flowent/tools/exec.py +117 -0
  216. package/backend/src/flowent/tools/fetch.py +85 -0
  217. package/backend/src/flowent/tools/idle.py +27 -0
  218. package/backend/src/flowent/tools/list_roles.py +50 -0
  219. package/backend/src/flowent/tools/list_tabs.py +96 -0
  220. package/backend/src/flowent/tools/list_tools.py +24 -0
  221. package/backend/src/flowent/tools/manage_prompts.py +102 -0
  222. package/backend/src/flowent/tools/manage_providers.py +220 -0
  223. package/backend/src/flowent/tools/manage_roles.py +275 -0
  224. package/backend/src/flowent/tools/manage_settings.py +346 -0
  225. package/backend/src/flowent/tools/mcp.py +199 -0
  226. package/backend/src/flowent/tools/read.py +152 -0
  227. package/backend/src/flowent/tools/send.py +50 -0
  228. package/backend/src/flowent/tools/set_permissions.py +84 -0
  229. package/backend/src/flowent/tools/sleep.py +41 -0
  230. package/backend/src/flowent/tools/todo.py +51 -0
  231. package/backend/src/flowent/workspace_store.py +479 -0
  232. package/backend/tests/__init__.py +0 -0
  233. package/backend/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  234. package/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  235. package/backend/tests/conftest.py +6 -0
  236. package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  237. package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
  238. package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
  239. package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
  240. package/backend/tests/integration/api/__pycache__/test_mcp_api.cpython-313-pytest-9.0.3.pyc +0 -0
  241. package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
  242. package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
  243. package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
  244. package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
  245. package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
  246. package/backend/tests/integration/api/conftest.py +29 -0
  247. package/backend/tests/integration/api/test_access_api.py +182 -0
  248. package/backend/tests/integration/api/test_assistant_api.py +354 -0
  249. package/backend/tests/integration/api/test_frontend_mounting.py +61 -0
  250. package/backend/tests/integration/api/test_mcp_api.py +116 -0
  251. package/backend/tests/integration/api/test_meta_api.py +33 -0
  252. package/backend/tests/integration/api/test_nodes_api.py +486 -0
  253. package/backend/tests/integration/api/test_prompts_api.py +47 -0
  254. package/backend/tests/integration/api/test_roles_api.py +227 -0
  255. package/backend/tests/integration/api/test_tabs_api.py +501 -0
  256. package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
  257. package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
  258. package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  259. package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
  260. package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
  261. package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
  262. package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
  263. package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  264. package/backend/tests/unit/agent/test_agent_public_api.py +746 -0
  265. package/backend/tests/unit/agent/test_agent_runtime.py +2726 -0
  266. package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
  267. package/backend/tests/unit/channels/test_telegram_channel.py +552 -0
  268. package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
  269. package/backend/tests/unit/logging/test_logging.py +132 -0
  270. package/backend/tests/unit/prompts/__pycache__/test_prompts.cpython-313-pytest-9.0.3.pyc +0 -0
  271. package/backend/tests/unit/prompts/test_prompts.py +569 -0
  272. package/backend/tests/unit/providers/__pycache__/test_anthropic_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  273. package/backend/tests/unit/providers/__pycache__/test_errors.cpython-313-pytest-9.0.3.pyc +0 -0
  274. package/backend/tests/unit/providers/__pycache__/test_extract_delta_parts.cpython-313-pytest-9.0.3.pyc +0 -0
  275. package/backend/tests/unit/providers/__pycache__/test_openai_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  276. package/backend/tests/unit/providers/__pycache__/test_openai_responses.cpython-313-pytest-9.0.3.pyc +0 -0
  277. package/backend/tests/unit/providers/__pycache__/test_provider_gateway.cpython-313-pytest-9.0.3.pyc +0 -0
  278. package/backend/tests/unit/providers/__pycache__/test_think_tag_parser.cpython-313-pytest-9.0.3.pyc +0 -0
  279. package/backend/tests/unit/providers/test_anthropic_provider.py +185 -0
  280. package/backend/tests/unit/providers/test_errors.py +68 -0
  281. package/backend/tests/unit/providers/test_extract_delta_parts.py +22 -0
  282. package/backend/tests/unit/providers/test_openai_provider.py +139 -0
  283. package/backend/tests/unit/providers/test_openai_responses.py +402 -0
  284. package/backend/tests/unit/providers/test_provider_gateway.py +359 -0
  285. package/backend/tests/unit/providers/test_think_tag_parser.py +36 -0
  286. package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  287. package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
  288. package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  289. package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  290. package/backend/tests/unit/routes/__pycache__/test_stats_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  291. package/backend/tests/unit/routes/test_prompts_routes.py +104 -0
  292. package/backend/tests/unit/routes/test_providers_route.py +368 -0
  293. package/backend/tests/unit/routes/test_roles_routes.py +426 -0
  294. package/backend/tests/unit/routes/test_settings_routes.py +1138 -0
  295. package/backend/tests/unit/routes/test_stats_routes.py +149 -0
  296. package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  297. package/backend/tests/unit/runtime/test_bootstrap_runtime.py +1012 -0
  298. package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
  299. package/backend/tests/unit/sandbox/test_sandbox_tools.py +78 -0
  300. package/backend/tests/unit/security/__pycache__/test_security.cpython-313-pytest-9.0.3.pyc +0 -0
  301. package/backend/tests/unit/security/test_security.py +110 -0
  302. package/backend/tests/unit/settings/__pycache__/test_settings_roles.cpython-313-pytest-9.0.3.pyc +0 -0
  303. package/backend/tests/unit/settings/test_settings_roles.py +711 -0
  304. package/backend/tests/unit/test_access.py +45 -0
  305. package/backend/tests/unit/test_cli.py +124 -0
  306. package/backend/tests/unit/test_graph_runtime.py +72 -0
  307. package/backend/tests/unit/test_network.py +51 -0
  308. package/backend/tests/unit/test_state_sqlite_storage.py +93 -0
  309. package/backend/tests/unit/test_workspace_store.py +231 -0
  310. package/backend/tests/unit/tools/__pycache__/test_connect_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  311. package/backend/tests/unit/tools/__pycache__/test_create_agent_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  312. package/backend/tests/unit/tools/__pycache__/test_delete_tab_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  313. package/backend/tests/unit/tools/__pycache__/test_edit_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  314. package/backend/tests/unit/tools/__pycache__/test_exec_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  315. package/backend/tests/unit/tools/__pycache__/test_fetch_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  316. package/backend/tests/unit/tools/__pycache__/test_manage_prompts_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  317. package/backend/tests/unit/tools/__pycache__/test_manage_providers_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  318. package/backend/tests/unit/tools/__pycache__/test_manage_roles_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  319. package/backend/tests/unit/tools/__pycache__/test_manage_settings_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  320. package/backend/tests/unit/tools/__pycache__/test_read_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  321. package/backend/tests/unit/tools/__pycache__/test_set_permissions_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  322. package/backend/tests/unit/tools/__pycache__/test_todo_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  323. package/backend/tests/unit/tools/__pycache__/test_tool_registry.cpython-313-pytest-9.0.3.pyc +0 -0
  324. package/backend/tests/unit/tools/test_connect_tool.py +229 -0
  325. package/backend/tests/unit/tools/test_create_agent_tool.py +524 -0
  326. package/backend/tests/unit/tools/test_delete_tab_tool.py +83 -0
  327. package/backend/tests/unit/tools/test_edit_tool.py +115 -0
  328. package/backend/tests/unit/tools/test_exec_tool.py +81 -0
  329. package/backend/tests/unit/tools/test_fetch_tool.py +65 -0
  330. package/backend/tests/unit/tools/test_manage_prompts_tool.py +117 -0
  331. package/backend/tests/unit/tools/test_manage_providers_tool.py +458 -0
  332. package/backend/tests/unit/tools/test_manage_roles_tool.py +411 -0
  333. package/backend/tests/unit/tools/test_manage_settings_tool.py +608 -0
  334. package/backend/tests/unit/tools/test_read_tool.py +33 -0
  335. package/backend/tests/unit/tools/test_set_permissions_tool.py +391 -0
  336. package/backend/tests/unit/tools/test_todo_tool.py +37 -0
  337. package/backend/tests/unit/tools/test_tool_registry.py +91 -0
  338. package/backend/uv.lock +1144 -0
  339. package/bin/flowent.mjs +62 -35
  340. package/dist/frontend/assets/AssistantPage-B3Xc08AS.js +1 -0
  341. package/dist/frontend/assets/ChannelsPage-ByLd28xk.js +1 -0
  342. package/dist/frontend/assets/HomePage-C0hAx9_l.js +3 -0
  343. package/dist/frontend/assets/McpPage-DkrYLvBv.js +7 -0
  344. package/dist/frontend/assets/PageScaffold-D4jO9ooX.js +1 -0
  345. package/dist/frontend/assets/PromptsPage-DWA7rRJd.js +1 -0
  346. package/dist/frontend/assets/ProvidersPage-PUWT8seJ.js +3 -0
  347. package/dist/frontend/assets/RolesPage-CqcclGRw.js +1 -0
  348. package/dist/frontend/assets/SettingsPage-8tS2cJgX.js +3 -0
  349. package/dist/frontend/assets/StatsPage-BX9khYzu.js +1 -0
  350. package/dist/frontend/assets/ToolsPage-9Tl9FdeD.js +1 -0
  351. package/dist/frontend/assets/WorkspaceCommandDialog-CCXxjDL8.js +1 -0
  352. package/dist/frontend/assets/WorkspacePanels-aMdJ7ZH7.js +1 -0
  353. package/dist/frontend/assets/alert-dialog-kFYVQ7oX.js +1 -0
  354. package/dist/frontend/assets/badge-74-3jsCg.js +1 -0
  355. package/dist/frontend/assets/constants-XUzFf6i1.js +1 -0
  356. package/dist/frontend/assets/datetime-m6_O_Ci9.js +1 -0
  357. package/dist/frontend/assets/dialog-BeGSweF6.js +1 -0
  358. package/dist/frontend/assets/elk-worker.min-C9JGDOE-.js +6312 -0
  359. package/dist/frontend/assets/graph-vendor-CHpVij2M.css +1 -0
  360. package/dist/frontend/assets/graph-vendor-DRq_-6fV.js +7 -0
  361. package/dist/frontend/assets/index-BHC1Vhy8.css +1 -0
  362. package/dist/frontend/assets/index-CL1ALZ3r.js +10 -0
  363. package/dist/frontend/assets/layout.worker-jMHqAFbP.js +24 -0
  364. package/dist/frontend/assets/markdown-vendor-DVdy_w12.js +29 -0
  365. package/dist/frontend/assets/modelParams-CaHd0903.js +1 -0
  366. package/dist/frontend/assets/react-vendor-mEs_JJxa.js +9 -0
  367. package/dist/frontend/assets/roles-2OLDeTc5.js +1 -0
  368. package/dist/frontend/assets/rolldown-runtime-BYbx6iT9.js +1 -0
  369. package/dist/frontend/assets/select-DL_LPeDj.js +1 -0
  370. package/dist/frontend/assets/shared-CMxbpLeQ.js +1 -0
  371. package/dist/frontend/assets/triState-DEr3NkXV.js +1 -0
  372. package/dist/frontend/assets/ui-vendor-Dg9NNnWX.js +51 -0
  373. package/dist/frontend/index.html +36 -0
  374. package/package.json +28 -41
  375. package/dist/.next/BUILD_ID +0 -1
  376. package/dist/.next/app-path-routes-manifest.json +0 -6
  377. package/dist/.next/build-manifest.json +0 -20
  378. package/dist/.next/package.json +0 -1
  379. package/dist/.next/prerender-manifest.json +0 -114
  380. package/dist/.next/required-server-files.json +0 -333
  381. package/dist/.next/routes-manifest.json +0 -69
  382. package/dist/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
  383. package/dist/.next/server/app/_global-error/page/build-manifest.json +0 -16
  384. package/dist/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
  385. package/dist/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
  386. package/dist/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
  387. package/dist/.next/server/app/_global-error/page.js +0 -9
  388. package/dist/.next/server/app/_global-error/page.js.map +0 -5
  389. package/dist/.next/server/app/_global-error/page.js.nft.json +0 -1
  390. package/dist/.next/server/app/_global-error/page_client-reference-manifest.js +0 -3
  391. package/dist/.next/server/app/_global-error.html +0 -1
  392. package/dist/.next/server/app/_global-error.meta +0 -15
  393. package/dist/.next/server/app/_global-error.rsc +0 -14
  394. package/dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +0 -5
  395. package/dist/.next/server/app/_global-error.segments/_full.segment.rsc +0 -14
  396. package/dist/.next/server/app/_global-error.segments/_head.segment.rsc +0 -5
  397. package/dist/.next/server/app/_global-error.segments/_index.segment.rsc +0 -5
  398. package/dist/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
  399. package/dist/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
  400. package/dist/.next/server/app/_not-found/page/build-manifest.json +0 -16
  401. package/dist/.next/server/app/_not-found/page/next-font-manifest.json +0 -10
  402. package/dist/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
  403. package/dist/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
  404. package/dist/.next/server/app/_not-found/page.js +0 -13
  405. package/dist/.next/server/app/_not-found/page.js.map +0 -5
  406. package/dist/.next/server/app/_not-found/page.js.nft.json +0 -1
  407. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +0 -3
  408. package/dist/.next/server/app/_not-found.html +0 -1
  409. package/dist/.next/server/app/_not-found.meta +0 -16
  410. package/dist/.next/server/app/_not-found.rsc +0 -16
  411. package/dist/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
  412. package/dist/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  413. package/dist/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  414. package/dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  415. package/dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  416. package/dist/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
  417. package/dist/.next/server/app/icon.svg/route/app-paths-manifest.json +0 -3
  418. package/dist/.next/server/app/icon.svg/route/build-manifest.json +0 -9
  419. package/dist/.next/server/app/icon.svg/route.js +0 -6
  420. package/dist/.next/server/app/icon.svg/route.js.map +0 -5
  421. package/dist/.next/server/app/icon.svg/route.js.nft.json +0 -1
  422. package/dist/.next/server/app/icon.svg.meta +0 -1
  423. package/dist/.next/server/app/index.html +0 -1
  424. package/dist/.next/server/app/index.meta +0 -14
  425. package/dist/.next/server/app/index.rsc +0 -15
  426. package/dist/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -5
  427. package/dist/.next/server/app/index.segments/_full.segment.rsc +0 -15
  428. package/dist/.next/server/app/index.segments/_head.segment.rsc +0 -6
  429. package/dist/.next/server/app/index.segments/_index.segment.rsc +0 -5
  430. package/dist/.next/server/app/index.segments/_tree.segment.rsc +0 -3
  431. package/dist/.next/server/app/page/app-paths-manifest.json +0 -3
  432. package/dist/.next/server/app/page/build-manifest.json +0 -16
  433. package/dist/.next/server/app/page/next-font-manifest.json +0 -10
  434. package/dist/.next/server/app/page/react-loadable-manifest.json +0 -1
  435. package/dist/.next/server/app/page/server-reference-manifest.json +0 -4
  436. package/dist/.next/server/app/page.js +0 -14
  437. package/dist/.next/server/app/page.js.map +0 -5
  438. package/dist/.next/server/app/page.js.nft.json +0 -1
  439. package/dist/.next/server/app/page_client-reference-manifest.js +0 -3
  440. package/dist/.next/server/app-paths-manifest.json +0 -6
  441. package/dist/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +0 -3
  442. package/dist/.next/server/chunks/[root-of-the-server]__0vcj1q1._.js +0 -13
  443. package/dist/.next/server/chunks/[turbopack]_runtime.js +0 -903
  444. package/dist/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_0-0ehc~.js +0 -3
  445. package/dist/.next/server/chunks/ssr/05w9_next_dist_0ihu0u9._.js +0 -6
  446. package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_12u3mib._.js +0 -3
  447. package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_forbidden_04fbe_..js +0 -3
  448. package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_global-error_0brpl_..js +0 -3
  449. package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_unauthorized_0~2g66g.js +0 -3
  450. package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0~cyr1_.js +0 -4
  451. package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_1105emf.js +0 -4
  452. package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_11uhyqv.js +0 -4
  453. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0.t9_75._.js +0 -33
  454. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0c0ud_z._.js +0 -3
  455. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0f9_8d4._.js +0 -3
  456. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0l5ko41._.js +0 -19
  457. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0mn6z7i._.js +0 -3
  458. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0npxxst._.js +0 -33
  459. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0qjhaca._.js +0 -3
  460. package/dist/.next/server/chunks/ssr/[root-of-the-server]__0rwgw3s._.js +0 -3
  461. package/dist/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -903
  462. package/dist/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
  463. package/dist/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +0 -3
  464. package/dist/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +0 -3
  465. package/dist/.next/server/chunks/ssr/node_modules__pnpm_056~6.6._.js +0 -3
  466. package/dist/.next/server/chunks/ssr/node_modules__pnpm_0~j0k.e._.js +0 -33
  467. package/dist/.next/server/functions-config-manifest.json +0 -4
  468. package/dist/.next/server/middleware-build-manifest.js +0 -20
  469. package/dist/.next/server/middleware-manifest.json +0 -6
  470. package/dist/.next/server/next-font-manifest.js +0 -1
  471. package/dist/.next/server/next-font-manifest.json +0 -13
  472. package/dist/.next/server/pages/404.html +0 -1
  473. package/dist/.next/server/pages/500.html +0 -1
  474. package/dist/.next/server/pages-manifest.json +0 -4
  475. package/dist/.next/server/prefetch-hints.json +0 -1
  476. package/dist/.next/server/server-reference-manifest.js +0 -1
  477. package/dist/.next/server/server-reference-manifest.json +0 -5
  478. package/dist/.next/static/7FFlzRe2eS-D0Lw5oEpmC/_buildManifest.js +0 -11
  479. package/dist/.next/static/7FFlzRe2eS-D0Lw5oEpmC/_clientMiddlewareManifest.js +0 -1
  480. package/dist/.next/static/7FFlzRe2eS-D0Lw5oEpmC/_ssgManifest.js +0 -1
  481. package/dist/.next/static/chunks/01qk2~bgf76vu.js +0 -1
  482. package/dist/.next/static/chunks/03~yq9q893hmn.js +0 -1
  483. package/dist/.next/static/chunks/080queev.r2uy.js +0 -31
  484. package/dist/.next/static/chunks/0v3lyuj75aq50.js +0 -1
  485. package/dist/.next/static/chunks/10b~xdx5c-i7s.js +0 -5
  486. package/dist/.next/static/chunks/15~9l5n.~r-.4.css +0 -2
  487. package/dist/.next/static/chunks/turbopack-0m-970~qvs7sc.js +0 -1
  488. package/dist/.next/static/media/7178b3e590c64307-s.11.cyxs5p-0z~.woff2 +0 -0
  489. package/dist/.next/static/media/8a480f0b521d4e75-s.06d3mdzz5bre_.woff2 +0 -0
  490. package/dist/.next/static/media/caa3a2e1cccd8315-s.p.16t1db8_9y2o~.woff2 +0 -0
  491. package/dist/package.json +0 -87
  492. package/dist/server.js +0 -38
  493. /package/{dist/.next/server/app/icon.svg.body → backend/src/flowent/static/favicon.svg} +0 -0
  494. /package/dist/{.next/static/media/icon.0.r~afrtrocz9.svg → frontend/favicon.svg} +0 -0
@@ -0,0 +1,286 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Final
5
+
6
+ from flowent.settings import (
7
+ AssistantSettings,
8
+ EventLogSettings,
9
+ LeaderSettings,
10
+ ModelSettings,
11
+ Settings,
12
+ build_assistant_allow_network,
13
+ build_assistant_write_dirs,
14
+ build_default_model_params,
15
+ build_model_auto_compact_token_limit,
16
+ build_model_context_window_tokens,
17
+ build_model_input_image,
18
+ build_model_max_retries,
19
+ build_model_output_image,
20
+ build_model_params_from_mapping,
21
+ build_model_retry_backoff_cap_retries,
22
+ build_model_retry_initial_delay_seconds,
23
+ build_model_retry_max_delay_seconds,
24
+ build_model_retry_policy,
25
+ build_model_timeout_ms,
26
+ build_working_dir,
27
+ find_role,
28
+ serialize_settings,
29
+ validate_model_retry_backoff_settings,
30
+ )
31
+
32
+ MISSING: Final = object()
33
+
34
+
35
+ @dataclass(frozen=True, slots=True)
36
+ class ResolvedSettingsUpdate:
37
+ working_dir: str
38
+ assistant: AssistantSettings
39
+ leader: LeaderSettings
40
+ model: ModelSettings
41
+ event_log: EventLogSettings
42
+
43
+
44
+ def serialize_manage_settings(settings: Settings) -> dict[str, object]:
45
+ serialized = serialize_settings(settings)
46
+ return {
47
+ "app_data_dir": serialized["app_data_dir"],
48
+ "working_dir": serialized["working_dir"],
49
+ "assistant": serialized["assistant"],
50
+ "leader": serialized["leader"],
51
+ "model": serialized["model"],
52
+ "event_log": serialized["event_log"],
53
+ }
54
+
55
+
56
+ def _resolve_role_name(
57
+ settings: Settings,
58
+ *,
59
+ current_role_name: str,
60
+ next_role_name: str | None,
61
+ field_name: str,
62
+ ) -> str:
63
+ if next_role_name is None:
64
+ return current_role_name
65
+ normalized_role_name = next_role_name.strip()
66
+ if not normalized_role_name:
67
+ raise ValueError(f"{field_name} must not be empty")
68
+ if find_role(settings, normalized_role_name) is None:
69
+ raise ValueError(f"Role '{normalized_role_name}' not found")
70
+ return normalized_role_name
71
+
72
+
73
+ def resolve_settings_update(
74
+ settings: Settings,
75
+ *,
76
+ working_dir: str | None = None,
77
+ assistant_role_name: str | None = None,
78
+ assistant_allow_network: object = MISSING,
79
+ assistant_write_dirs: object = MISSING,
80
+ leader_role_name: str | None = None,
81
+ active_provider_id: str | None = None,
82
+ active_model: str | None = None,
83
+ context_window_tokens: object = MISSING,
84
+ input_image: object = MISSING,
85
+ output_image: object = MISSING,
86
+ max_retries: object = MISSING,
87
+ retry_policy: object = MISSING,
88
+ timeout_ms: object = MISSING,
89
+ retry_initial_delay_seconds: object = MISSING,
90
+ retry_max_delay_seconds: object = MISSING,
91
+ retry_backoff_cap_retries: object = MISSING,
92
+ auto_compact_token_limit: object = MISSING,
93
+ model_params: object = MISSING,
94
+ timestamp_format: str | None = None,
95
+ assistant_role_field_name: str = "assistant.role_name",
96
+ assistant_allow_network_field_name: str = "assistant.allow_network",
97
+ assistant_write_dirs_field_name: str = "assistant.write_dirs",
98
+ leader_role_field_name: str = "leader.role_name",
99
+ working_dir_field_name: str = "working_dir",
100
+ retry_policy_field_name: str = "model.retry_policy",
101
+ timeout_ms_field_name: str = "model.timeout_ms",
102
+ max_retries_field_name: str = "model.max_retries",
103
+ retry_initial_delay_seconds_field_name: str = "model.retry_initial_delay_seconds",
104
+ retry_max_delay_seconds_field_name: str = "model.retry_max_delay_seconds",
105
+ retry_backoff_cap_retries_field_name: str = "model.retry_backoff_cap_retries",
106
+ input_image_field_name: str = "model.input_image",
107
+ output_image_field_name: str = "model.output_image",
108
+ context_window_tokens_field_name: str = "model.context_window_tokens",
109
+ auto_compact_token_limit_field_name: str = "model.auto_compact_token_limit",
110
+ ) -> ResolvedSettingsUpdate:
111
+ next_working_dir = (
112
+ settings.working_dir
113
+ if working_dir is None
114
+ else build_working_dir(working_dir, field_name=working_dir_field_name)
115
+ )
116
+ next_assistant_role_name = _resolve_role_name(
117
+ settings,
118
+ current_role_name=settings.assistant.role_name,
119
+ next_role_name=assistant_role_name,
120
+ field_name=assistant_role_field_name,
121
+ )
122
+ next_assistant_allow_network = (
123
+ settings.assistant.allow_network
124
+ if assistant_allow_network is MISSING
125
+ else build_assistant_allow_network(
126
+ assistant_allow_network,
127
+ field_name=assistant_allow_network_field_name,
128
+ )
129
+ )
130
+ next_assistant_write_dirs = (
131
+ list(settings.assistant.write_dirs)
132
+ if assistant_write_dirs is MISSING
133
+ else build_assistant_write_dirs(
134
+ assistant_write_dirs,
135
+ field_name=assistant_write_dirs_field_name,
136
+ base_dir=next_working_dir,
137
+ )
138
+ )
139
+
140
+ next_leader_role_name = _resolve_role_name(
141
+ settings,
142
+ current_role_name=settings.leader.role_name,
143
+ next_role_name=leader_role_name,
144
+ field_name=leader_role_field_name,
145
+ )
146
+
147
+ next_active_provider_id = (
148
+ settings.model.active_provider_id
149
+ if active_provider_id is None
150
+ else active_provider_id
151
+ )
152
+ next_active_model = (
153
+ settings.model.active_model if active_model is None else active_model
154
+ )
155
+ next_context_window_tokens = (
156
+ settings.model.context_window_tokens
157
+ if context_window_tokens is MISSING
158
+ else build_model_context_window_tokens(
159
+ context_window_tokens,
160
+ field_name=context_window_tokens_field_name,
161
+ )
162
+ )
163
+ next_input_image = (
164
+ settings.model.input_image
165
+ if input_image is MISSING
166
+ else build_model_input_image(
167
+ input_image,
168
+ field_name=input_image_field_name,
169
+ )
170
+ )
171
+ next_output_image = (
172
+ settings.model.output_image
173
+ if output_image is MISSING
174
+ else build_model_output_image(
175
+ output_image,
176
+ field_name=output_image_field_name,
177
+ )
178
+ )
179
+ next_retry_policy = (
180
+ settings.model.retry_policy
181
+ if retry_policy is MISSING
182
+ else build_model_retry_policy(
183
+ retry_policy,
184
+ field_name=retry_policy_field_name,
185
+ )
186
+ )
187
+ next_timeout_ms = (
188
+ settings.model.timeout_ms
189
+ if timeout_ms is MISSING
190
+ else build_model_timeout_ms(
191
+ timeout_ms,
192
+ field_name=timeout_ms_field_name,
193
+ )
194
+ )
195
+ next_max_retries = (
196
+ settings.model.max_retries
197
+ if max_retries is MISSING
198
+ else build_model_max_retries(
199
+ max_retries,
200
+ field_name=max_retries_field_name,
201
+ )
202
+ )
203
+ next_retry_initial_delay_seconds = (
204
+ settings.model.retry_initial_delay_seconds
205
+ if retry_initial_delay_seconds is MISSING
206
+ else build_model_retry_initial_delay_seconds(
207
+ retry_initial_delay_seconds,
208
+ field_name=retry_initial_delay_seconds_field_name,
209
+ )
210
+ )
211
+ next_retry_max_delay_seconds = (
212
+ settings.model.retry_max_delay_seconds
213
+ if retry_max_delay_seconds is MISSING
214
+ else build_model_retry_max_delay_seconds(
215
+ retry_max_delay_seconds,
216
+ field_name=retry_max_delay_seconds_field_name,
217
+ )
218
+ )
219
+ next_retry_backoff_cap_retries = (
220
+ settings.model.retry_backoff_cap_retries
221
+ if retry_backoff_cap_retries is MISSING
222
+ else build_model_retry_backoff_cap_retries(
223
+ retry_backoff_cap_retries,
224
+ field_name=retry_backoff_cap_retries_field_name,
225
+ )
226
+ )
227
+ next_auto_compact_token_limit = (
228
+ settings.model.auto_compact_token_limit
229
+ if auto_compact_token_limit is MISSING
230
+ else build_model_auto_compact_token_limit(
231
+ auto_compact_token_limit,
232
+ field_name=auto_compact_token_limit_field_name,
233
+ )
234
+ )
235
+ validate_model_retry_backoff_settings(
236
+ retry_initial_delay_seconds=next_retry_initial_delay_seconds,
237
+ retry_max_delay_seconds=next_retry_max_delay_seconds,
238
+ )
239
+ next_model_params = (
240
+ settings.model.params
241
+ if model_params is MISSING
242
+ else build_model_params_from_mapping(model_params)
243
+ or build_default_model_params()
244
+ )
245
+ next_timestamp_format = (
246
+ settings.event_log.timestamp_format
247
+ if timestamp_format is None
248
+ else timestamp_format
249
+ )
250
+
251
+ return ResolvedSettingsUpdate(
252
+ working_dir=next_working_dir,
253
+ assistant=AssistantSettings(
254
+ role_name=next_assistant_role_name,
255
+ allow_network=next_assistant_allow_network,
256
+ write_dirs=next_assistant_write_dirs,
257
+ ),
258
+ leader=LeaderSettings(role_name=next_leader_role_name),
259
+ model=ModelSettings(
260
+ active_provider_id=next_active_provider_id,
261
+ active_model=next_active_model,
262
+ input_image=next_input_image,
263
+ output_image=next_output_image,
264
+ context_window_tokens=next_context_window_tokens,
265
+ params=next_model_params,
266
+ timeout_ms=next_timeout_ms,
267
+ retry_policy=next_retry_policy,
268
+ max_retries=next_max_retries,
269
+ retry_initial_delay_seconds=next_retry_initial_delay_seconds,
270
+ retry_max_delay_seconds=next_retry_max_delay_seconds,
271
+ retry_backoff_cap_retries=next_retry_backoff_cap_retries,
272
+ auto_compact_token_limit=next_auto_compact_token_limit,
273
+ ),
274
+ event_log=EventLogSettings(timestamp_format=next_timestamp_format),
275
+ )
276
+
277
+
278
+ def apply_resolved_settings_update(
279
+ settings: Settings,
280
+ resolved: ResolvedSettingsUpdate,
281
+ ) -> None:
282
+ settings.working_dir = resolved.working_dir
283
+ settings.assistant = resolved.assistant
284
+ settings.leader = resolved.leader
285
+ settings.model = resolved.model
286
+ settings.event_log = resolved.event_log
@@ -0,0 +1,120 @@
1
+ from __future__ import annotations
2
+
3
+ import sqlite3
4
+ from pathlib import Path
5
+
6
+ STATE_DB_FILENAME = "state.sqlite"
7
+
8
+
9
+ def get_state_db_path() -> Path:
10
+ from flowent import settings as settings_module
11
+
12
+ return settings_module.get_app_data_dir_path() / STATE_DB_FILENAME
13
+
14
+
15
+ def get_images_dir() -> Path:
16
+ from flowent import settings as settings_module
17
+
18
+ return settings_module.get_app_data_dir_path() / "assets" / "images"
19
+
20
+
21
+ def get_legacy_workspace_file_path() -> Path:
22
+ from flowent import settings as settings_module
23
+
24
+ return settings_module.get_app_data_dir_path() / "workspace.json"
25
+
26
+
27
+ def get_legacy_image_assets_dir() -> Path:
28
+ from flowent import settings as settings_module
29
+
30
+ return settings_module.get_app_data_dir_path() / "image-assets"
31
+
32
+
33
+ def open_state_db(*, create: bool) -> sqlite3.Connection | None:
34
+ db_path = get_state_db_path()
35
+ if not create and not db_path.exists():
36
+ return None
37
+ if create:
38
+ db_path.parent.mkdir(parents=True, exist_ok=True)
39
+ try:
40
+ connection = sqlite3.connect(db_path, timeout=30.0)
41
+ except sqlite3.Error as exc:
42
+ raise RuntimeError(f"Failed to open state store `{db_path}`: {exc}") from exc
43
+ connection.row_factory = sqlite3.Row
44
+ try:
45
+ connection.execute("PRAGMA foreign_keys = ON")
46
+ connection.execute("PRAGMA journal_mode = WAL")
47
+ _ensure_schema(connection)
48
+ except sqlite3.Error as exc:
49
+ connection.close()
50
+ raise RuntimeError(
51
+ f"Failed to initialize state store `{db_path}`: {exc}"
52
+ ) from exc
53
+ return connection
54
+
55
+
56
+ def _ensure_schema(connection: sqlite3.Connection) -> None:
57
+ connection.executescript(
58
+ """
59
+ CREATE TABLE IF NOT EXISTS tabs (
60
+ id TEXT PRIMARY KEY,
61
+ payload TEXT NOT NULL,
62
+ updated_at REAL NOT NULL
63
+ );
64
+ CREATE TABLE IF NOT EXISTS nodes (
65
+ id TEXT PRIMARY KEY,
66
+ payload TEXT NOT NULL,
67
+ tab_id TEXT,
68
+ node_type TEXT NOT NULL,
69
+ updated_at REAL NOT NULL
70
+ );
71
+ CREATE INDEX IF NOT EXISTS idx_nodes_tab_id ON nodes(tab_id);
72
+ CREATE TABLE IF NOT EXISTS edges (
73
+ id TEXT PRIMARY KEY,
74
+ payload TEXT NOT NULL,
75
+ tab_id TEXT NOT NULL
76
+ );
77
+ CREATE INDEX IF NOT EXISTS idx_edges_tab_id ON edges(tab_id);
78
+ CREATE TABLE IF NOT EXISTS blueprints (
79
+ id TEXT PRIMARY KEY,
80
+ payload TEXT NOT NULL,
81
+ updated_at REAL NOT NULL
82
+ );
83
+ CREATE TABLE IF NOT EXISTS image_assets (
84
+ id TEXT PRIMARY KEY,
85
+ stored_name TEXT NOT NULL,
86
+ mime_type TEXT NOT NULL,
87
+ width INTEGER,
88
+ height INTEGER,
89
+ original_name TEXT
90
+ );
91
+ CREATE TABLE IF NOT EXISTS llm_request_records (
92
+ id TEXT PRIMARY KEY,
93
+ ended_at REAL NOT NULL,
94
+ payload TEXT NOT NULL
95
+ );
96
+ CREATE INDEX IF NOT EXISTS idx_llm_request_records_ended_at
97
+ ON llm_request_records(ended_at);
98
+ CREATE TABLE IF NOT EXISTS compact_records (
99
+ id TEXT PRIMARY KEY,
100
+ ended_at REAL NOT NULL,
101
+ payload TEXT NOT NULL
102
+ );
103
+ CREATE INDEX IF NOT EXISTS idx_compact_records_ended_at
104
+ ON compact_records(ended_at);
105
+ CREATE TABLE IF NOT EXISTS mcp_snapshots (
106
+ server_name TEXT PRIMARY KEY,
107
+ payload TEXT NOT NULL
108
+ );
109
+ CREATE TABLE IF NOT EXISTS mcp_activities (
110
+ id TEXT PRIMARY KEY,
111
+ server_name TEXT NOT NULL,
112
+ ended_at REAL NOT NULL,
113
+ payload TEXT NOT NULL
114
+ );
115
+ CREATE INDEX IF NOT EXISTS idx_mcp_activities_server_name
116
+ ON mcp_activities(server_name);
117
+ CREATE INDEX IF NOT EXISTS idx_mcp_activities_ended_at
118
+ ON mcp_activities(ended_at);
119
+ """
120
+ )
@@ -0,0 +1 @@
1
+ import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{R as r}from"./ui-vendor-Dg9NNnWX.js";import{a as i,t as a}from"./shared-CMxbpLeQ.js";import{C as o,D as s,E as c,S as ee,T as l,_ as te,b as u,d,f as ne,g as f,h as p,l as re,m as ie,p as ae,t as m,u as oe,v as se,w as ce,x as h,y as g}from"./WorkspacePanels-aMdJ7ZH7.js";import{J as _,N as v,P as y,b,g as x,h as S,j as C,m as w,p as le,x as ue,y as T}from"./index-CL1ALZ3r.js";async function de(e){return a(`/api/assistant/message`,{method:`POST`,body:e,errorMessage:`Failed to send Assistant message`})}async function fe(e){return a(`/api/assistant/messages/${e}/retry`,{method:`POST`,errorMessage:`Failed to retry Assistant message`})}var E=e(t(),1);function D(e){for(let t of e.values())if(t.node_type===`assistant`)return t;return null}function pe(e){return D(e)?.id??null}var O=`assistant`;function me(){return u(O)}function he(e){return h(O,e)}function ge(e){g(O,e)}function k(e={}){let{bottomInset:t=0}=e,{agents:n}=x(),{connected:i}=w(),{agentHistories:a,clearAgentHistory:c,clearHistorySnapshot:l,historyInvalidatedAt:u,historyClearedAt:m,historySnapshots:ce,streamingDeltas:h}=S(),{activeToolCalls:g}=le(),[_,D]=(0,E.useState)(null),[O,k]=(0,E.useState)(0),[A,j]=(0,E.useState)(``),[M,N]=(0,E.useState)([]),[P,F]=(0,E.useState)(null),[I,_e]=(0,E.useState)(!1),[ve,ye]=(0,E.useState)(null),[be,xe]=(0,E.useState)(!1),[L,R]=(0,E.useState)([]),z=(0,E.useRef)(null),B=(0,E.useRef)(!0),Se=(0,E.useRef)([]),V=(0,E.useMemo)(()=>pe(n),[n]),H=(0,E.useMemo)(()=>V?n.get(V)??null:null,[n,V]),U=H?.capabilities?.input_image??!1,W=V?m.get(V)??0:0,G=V?u.get(V)??0:0,K=V?ce.get(V)??null:null,Ce=M.some(e=>e.status===`uploading`),we=M.filter(ae),q=(0,E.useSyncExternalStore)(he,me,me),J=P===null?null:q[P]??null,Y=J!==null&&A===J.text&&ne(M,J),X=(0,E.useCallback)((e,t)=>{F(t),j(e?.text??``),N(e?te(e):[])},[]),Te=(0,E.useCallback)(e=>{F(null),j(e)},[]);(0,E.useEffect)(()=>{Se.current=M},[M]),(0,E.useEffect)(()=>()=>{f(Se.current)},[]),(0,E.useEffect)(()=>{W&&(R([]),D(e=>e&&{...e,history:ee(e.history)}),k(Date.now()))},[W]),(0,E.useEffect)(()=>{G&&(R([]),K&&(D(e=>e&&{...e,history:K}),k(Date.now())))},[G,K]),(0,E.useEffect)(()=>{if(!i||!V){D(null);return}let e=new AbortController,t=!1;return(async()=>{c(V);try{let n=await v(V,e.signal);if(t||!n)return;D(n),k(Date.now()),l(V)}catch{!t&&!e.signal.aborted&&r.error(`Failed to load Assistant history`)}})(),()=>{t=!0,e.abort()}},[W,G,V,c,l,i]);let Z=(0,E.useMemo)(()=>V?o({history:K??_?.history??[],incremental:a.get(V),deltas:h.get(V),fetchedAt:O||Date.now()}):[],[a,K,_,O,h,V]);(0,E.useEffect)(()=>{if(!V||L.length===0)return;let e=Z.filter(e=>e.type===`ReceivedMessage`&&e.from_id===`human`&&(!!e.content||!!e.message_id||!!e.parts?.length));e.length!==0&&R(t=>e.reduce((e,t)=>T(e,{content:t.content??b(t.parts,t.content),messageId:t.message_id}),t))},[V,Z,L.length]);let Q=(0,E.useMemo)(()=>[...Z,...L.map(e=>({...e}))],[Z,L]),$=(0,E.useMemo)(()=>{let e=L.length,t=V?h.get(V)??[]:[],n=i&&(e>0||H?.state===`running`||H?.state===`sleeping`||g.has(V??``)||t.length>0),r=[...Q].map((e,t)=>({item:e,index:t})).reverse().find(({item:e})=>e.type===`PendingHumanMessage`?!0:e.type===`ReceivedMessage`&&e.from_id===`human`&&ue(e.parts,e.content).length>0)?.index,a=r===void 0?[]:Q.slice(r+1),o=a.some(e=>e.type===`AssistantText`&&ue(e.parts,e.content).length>0),s=[...a].reverse().find(e=>e.type===`ToolCall`&&e.streaming===!0),c=(V?g.get(V)??null:null)??s?.tool_name??null;return{running:n,runningHint:n&&r!==void 0&&!o?{label:c?`Running tools...`:`Thinking...`,toolName:c}:null}},[g,V,H?.state,i,L.length,h,Q]);(0,E.useLayoutEffect)(()=>{let e=z.current;!e||!B.current||(e.scrollTop=e.scrollHeight)},[t,$.runningHint?`${$.runningHint.label}:${$.runningHint.toolName??``}`:``,Q]),(0,E.useLayoutEffect)(()=>{let e=z.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>{B.current&&(e.scrollTop=e.scrollHeight)});return t.observe(e),()=>{t.disconnect()}},[]);let Ee=e=>{B.current=ie(e.currentTarget)},De=async()=>{let e=A.trim();if(!e&&we.length===0||Ce||be)return;let t=re(e,we),n=A,i=M,a=P,o=Date.now(),s=e||b(t),c=oe(s,t,o);xe(!0),F(null),j(``),N([]),R(e=>[...e,c]);try{let e=await de({content:s,parts:t});e.status===`command_executed`?R(e=>T(e,{content:s,timestamp:o})):e.message_id&&R(t=>t.map(t=>t.timestamp===o&&t.content===s?{...t,message_id:e.message_id}:t)),ge({text:n,images:se(i),timestamp:o}),f(i)}catch(e){R(e=>T(e,{content:s,timestamp:o})),j(n),N(i),F(a),r.error(e instanceof Error?e.message:`Failed to send message`)}finally{xe(!1)}},Oe=(0,E.useCallback)(async e=>{if(F(null),!U){r.error(`Current model does not support image input`);return}let t=Array.from(e).filter(e=>e.type.startsWith(`image/`));if(t.length===0)return;let n=await d(t);N(e=>[...e,...n]),await Promise.all(n.map(async(e,n)=>{let i=t[n];if(i)try{let t=await s(i);N(n=>n.map(n=>n.id===e.id?{...n,assetId:t.id,mimeType:t.mime_type,width:typeof t.width==`number`?t.width:n.width,height:typeof t.height==`number`?t.height:n.height,status:`ready`}:n))}catch(t){p(e),N(t=>t.filter(t=>t.id!==e.id)),r.error(t instanceof Error?t.message:`Failed to upload image`)}}))},[U]),ke=(0,E.useCallback)(e=>{F(null),N(t=>{let n=t.find(t=>t.id===e);return n&&p(n),t.filter(t=>t.id!==e)})},[]),Ae=(0,E.useCallback)((e,t)=>{if(q.length===0)return!1;let n=t.start,r=t.end,i=A.length===0&&M.length===0,a=typeof n==`number`&&typeof r==`number`&&n===r&&(n===0||n===A.length);if(!i&&!(J!==null&&Y&&a))return!1;if(P===null){if(e!==-1)return!1;let t=q.length-1;return X(q[t]??null,t),!0}if(e===-1){let e=Math.max(P-1,0);return X(q[e]??null,e),!0}if(P>=q.length-1)return X(null,null),!0;let o=P+1;return X(q[o]??null,o),!0},[J,M,P,A,q,Y,X]),je=async()=>{if(!(!V||I)){_e(!0);try{await C(V),R([]),c(V),D(await v(V)),k(Date.now()),l(V)}catch(e){r.error(e instanceof Error?e.message:`Failed to clear assistant chat`)}finally{_e(!1)}}},Me=(0,E.useCallback)(async()=>{if(V&&!(H?.state!==`running`&&H?.state!==`sleeping`)){await y(V);for(let e=0;e<25;e+=1){let e=await v(V);if(!e)break;if(D(e),k(Date.now()),e.state!==`running`&&e.state!==`sleeping`)return;await new Promise(e=>window.setTimeout(e,120))}throw Error(`Assistant did not stop in time`)}},[V,H?.state]);return{addImages:Oe,connected:i,draftImages:M,handleKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),De())},hasUploadingImages:Ce,input:A,isBrowsingInputHistory:Y,navigateInputHistory:Ae,onMessagesScroll:Ee,removeImage:ke,retryMessage:async e=>{if(!(!V||!e||ve)){ye(e);try{try{await Me(),await fe(e)}catch(e){r.error(e instanceof Error?e.message:`Failed to retry Assistant message`);return}c(V);try{let e=await v(V);e&&(D(e),k(Date.now()),l(V))}catch{return}}finally{ye(null)}}},retryingMessageId:ve,scrollRef:z,clearing:I,sending:be,clearChat:je,sendMessage:De,setInput:Te,supportsInputImage:U,timelineItems:Q,assistantActivity:$}}var A=n();function j({onOpenDetails:e,variant:t=`page`}){let{agents:n}=x(),{height:r,ref:a}=ce(),{addImages:o=async()=>{},assistantActivity:s={running:!1},clearChat:ee,clearing:te=!1,connected:u,draftImages:d=[],handleKeyDown:ne,hasUploadingImages:f=!1,input:p,isBrowsingInputHistory:re,navigateInputHistory:ie,onMessagesScroll:ae,removeImage:m=()=>{},retryMessage:oe,retryingMessageId:se,scrollRef:h,sending:g,sendMessage:_,setInput:v,supportsInputImage:y=!1,timelineItems:b}=k({bottomInset:r}),S=t===`floating`,C=t===`page`,w=t,le=Array.from(n.values()).find(e=>e.node_type===`assistant`)?.role_name??null;return(0,A.jsxs)(`div`,{className:i(`relative flex h-full flex-col overflow-hidden text-foreground`,S?`overflow-hidden rounded-xl border border-border bg-surface-2 text-foreground shadow-md`:C?`bg-transparent`:`border-l border-border bg-surface-overlay/94 shadow-sm`),children:[(0,A.jsx)(`div`,{"aria-hidden":`true`,className:i(`pointer-events-none absolute inset-0 transition-[opacity,border-color,box-shadow] duration-300`,s.running?`animate-pulse shadow-lg shadow-ring/5`:`opacity-0`,!C&&`border`,s.running&&!C&&`border-ring/25 opacity-100 shadow-ring/10`)}),(0,A.jsx)(M,{connected:u,floating:S,page:C,onClearChat:()=>void ee(),onOpenDetails:e,roleName:le,clearing:te}),(0,A.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,A.jsx)(l,{allowHumanMessageRetry:!0,bottomInset:r,items:b,nodes:n,onRetryHumanMessage:e=>void oe(e),onScroll:ae,retryImageInputEnabled:y,retryingMessageId:se,scrollRef:h,runningHint:s.running?{label:`Assistant is working...`,toolName:null}:null,variant:w}),(0,A.jsx)(`div`,{ref:a,style:{paddingBottom:`calc(14px + env(safe-area-inset-bottom, 0px))`},className:i(`absolute inset-x-0 bottom-0 z-10 px-4`,C?`mx-auto w-full max-w-3xl`:``,S?`bg-gradient-to-b from-transparent via-background/70 to-background/95 pt-8 pointer-events-none`:C?`bg-gradient-to-b from-transparent via-background/90 to-background pt-12 pointer-events-none`:`bg-gradient-to-b from-transparent via-background/80 to-background pt-10 pointer-events-none`),children:(0,A.jsx)(`div`,{className:`pointer-events-auto`,children:(0,A.jsx)(c,{disabled:!p.trim()&&d.length===0||f||g,commandsEnabled:!0,images:d,imageInputEnabled:y,input:p,onAddImages:e=>void o(e),onChange:v,onNavigateHistory:ie,onKeyDown:ne,onRemoveImage:m,onSend:()=>void _(),overlay:!0,suppressCommandNavigation:re,targetLabel:`Assistant`,variant:w})})})]})]})}function M({clearing:e,connected:t,floating:n,page:r,onClearChat:a,onOpenDetails:o,roleName:s}){return(0,A.jsxs)(`div`,{className:i(`relative z-10 flex items-center justify-between px-4 py-3`,n?`border-b border-border bg-accent/20`:r?`bg-transparent`:`border-b border-border bg-background/20`),children:[(0,A.jsxs)(`div`,{className:i(`min-w-0`,r&&`opacity-0 select-none pointer-events-none`),children:[(0,A.jsx)(`div`,{className:`text-[13px] font-medium tracking-wide text-foreground`,children:`Assistant`}),(0,A.jsxs)(`div`,{className:`mt-1 flex min-w-0 flex-wrap items-center gap-2 text-[11px] text-muted-foreground/78`,children:[s?(0,A.jsxs)(`span`,{className:`rounded-full border border-border bg-accent/35 px-2 py-0.5 text-[10px] font-medium text-muted-foreground/78`,children:[`Role: `,s]}):null,(0,A.jsx)(N,{connected:t})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,A.jsx)(_,{type:`button`,size:`sm`,variant:r?`ghost`:`outline`,disabled:e,onClick:a,children:e?`Clearing...`:`Clear Chat`}),(0,A.jsx)(_,{type:`button`,size:`sm`,variant:r?`ghost`:`outline`,disabled:!o,onClick:o,children:`Assistant Details`})]})]})}function N({connected:e}){return(0,A.jsx)(`span`,{className:i(`rounded-full border px-2.5 py-0.5 text-[9px] font-medium transition-colors`,e?`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`:`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`),children:e?`Online`:`Connecting...`})}function P(){let{agents:e}=x(),t=D(e),[n,r]=(0,E.useState)(!1);return(0,A.jsx)(`div`,{className:`flex h-full flex-col min-h-0`,children:n&&t?(0,A.jsx)(`div`,{className:`h-full overflow-hidden p-6`,children:(0,A.jsx)(`div`,{className:`h-full overflow-hidden rounded-xl border border-border bg-surface-overlay/90 shadow-md`,children:(0,A.jsx)(m,{agent:t,onClose:()=>r(!1)})})}):(0,A.jsx)(j,{onOpenDetails:t?()=>r(!0):void 0,variant:`page`})})}export{P as AssistantPage};
@@ -0,0 +1 @@
1
+ import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{R as r,Xt as i,nt as a,q as o}from"./ui-vendor-Dg9NNnWX.js";import{a as s,t as c}from"./shared-CMxbpLeQ.js";import{J as l,V as u,o as d}from"./index-CL1ALZ3r.js";import{a as f,n as p,o as m,t as h}from"./PageScaffold-D4jO9ooX.js";import{t as g}from"./datetime-m6_O_Ci9.js";async function _(){return c(`/api/settings/telegram`,{errorMessage:`Failed to fetch Telegram settings`})}async function v(e){return c(`/api/settings/telegram`,{method:`PATCH`,body:e,errorMessage:`Failed to save Telegram settings`})}async function y(e){return c(`/api/settings/telegram/approve/${e}`,{method:`POST`,errorMessage:`Failed to approve Telegram chat`})}async function b(e){return c(`/api/settings/telegram/pending/${e}`,{method:`DELETE`,errorMessage:`Failed to remove pending Telegram chat`})}async function x(e){return c(`/api/settings/telegram/chat/${e}`,{method:`DELETE`,errorMessage:`Failed to remove Telegram chat`})}var S=e(t(),1),C=n();function w(e){return e?g(e,{fallback:`—`,unit:`seconds`}):`—`}function T(e){return e.display_name.trim()?e.display_name.trim():e.username?.trim()?`@${e.username.trim()}`:`Unknown chat`}function E(){let{data:e,isLoading:t,mutate:n}=m(`telegramSettings`,_),[c,g]=(0,S.useState)(!1),[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)(!1),A=(0,S.useMemo)(()=>!!e?.bot_token,[e?.bot_token]),j=async()=>{if(e){g(!0);try{let e={};O&&(e.bot_token=E.trim()),n((await v(e)).telegram,!1),D(``),k(!1),r.success(`Telegram settings saved`)}catch{r.error(`Failed to save Telegram settings`)}finally{g(!1)}}},M=async e=>{try{n((await y(e)).telegram,!1),r.success(`Telegram chat approved`)}catch{r.error(`Failed to approve Telegram chat`)}},N=async e=>{try{n((await b(e)).telegram,!1),r.success(`Pending Telegram chat removed`)}catch{r.error(`Failed to remove pending Telegram chat`)}},P=async e=>{try{n((await x(e)).telegram,!1),r.success(`Approved Telegram chat removed`)}catch{r.error(`Failed to remove approved Telegram chat`)}};return t||!e?(0,C.jsx)(d,{label:`Loading channels...`,textClassName:`text-[13px]`}):(0,C.jsx)(h,{children:(0,C.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto pr-2 scrollbar-none pt-6`,children:(0,C.jsxs)(`div`,{className:`mx-auto max-w-[680px] pb-10`,children:[(0,C.jsx)(p,{title:`Channels`}),(0,C.jsxs)(f,{className:`mt-6 space-y-8`,children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,C.jsx)(`div`,{children:(0,C.jsx)(`h2`,{className:`text-lg font-medium text-foreground`,children:`Telegram`})}),(0,C.jsx)(`div`,{className:s(`rounded-full border px-2.5 py-0.5 text-[10px] font-medium`,A?`border-graph-status-running/20 bg-graph-status-running/[0.12] text-graph-status-running`:`border-graph-status-idle/20 bg-graph-status-idle/[0.12] text-graph-status-idle`),children:A?`Configured`:`Not configured`})]}),(0,C.jsxs)(`section`,{children:[(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,C.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Bot Token`}),(0,C.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:`Leave empty to keep the current token`})]}),(0,C.jsx)(`div`,{className:`mt-3`,children:(0,C.jsx)(u,{value:E,onChange:e=>{D(e.target.value),k(!0)},placeholder:e.bot_token||`Enter Telegram bot token`,mono:!0,showLabel:`Show Telegram bot token`,hideLabel:`Hide Telegram bot token`})})]}),(0,C.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,C.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Pending Private Chats`}),(0,C.jsxs)(`span`,{className:`rounded-full border border-border bg-accent/25 px-2 py-0.5 text-[10px] font-medium text-muted-foreground`,children:[e.pending_chats.length,` waiting`]})]}),e.pending_chats.length===0?(0,C.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No pending chats.`}):(0,C.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.pending_chats.map(e=>(0,C.jsx)(`div`,{className:`rounded-xl border border-border bg-card/30 px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:T(e)}),(0,C.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,C.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,C.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,C.jsxs)(`span`,{children:[`First seen: `,w(e.first_seen_at)]})]})]}),(0,C.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,C.jsxs)(l,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>void M(e.chat_id),className:`border-border bg-accent/20 text-foreground hover:bg-accent/35`,children:[(0,C.jsx)(i,{className:`size-3.5`}),`Approve`]}),(0,C.jsx)(l,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void N(e.chat_id),className:`text-muted-foreground hover:bg-destructive/10 hover:text-destructive`,children:(0,C.jsx)(o,{className:`size-3.5`})})]})]})},e.chat_id))})]}),(0,C.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,C.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Approved Private Chats`}),(0,C.jsxs)(`span`,{className:`rounded-full border border-border bg-accent/25 px-2 py-0.5 text-[10px] font-medium text-muted-foreground`,children:[e.approved_chats.length,` active`]})]}),e.approved_chats.length===0?(0,C.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No approved chats yet.`}):(0,C.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.approved_chats.map(e=>(0,C.jsx)(`div`,{className:`group rounded-xl border border-border bg-card/30 px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:T(e)}),(0,C.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,C.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,C.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,C.jsxs)(`span`,{children:[`Approved: `,w(e.approved_at)]})]})]}),(0,C.jsx)(l,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void P(e.chat_id),className:`shrink-0 text-muted-foreground opacity-0 transition-all hover:bg-destructive/10 hover:text-destructive group-hover:opacity-100 focus:opacity-100`,children:(0,C.jsx)(o,{className:`size-3.5`})})]})},e.chat_id))})]}),(0,C.jsx)(`div`,{className:`flex justify-end border-t border-border pt-6`,children:(0,C.jsxs)(l,{type:`button`,size:`sm`,onClick:()=>void j(),disabled:c,className:`text-[13px]`,children:[(0,C.jsx)(a,{className:`size-4`}),c?`Saving...`:`Save Changes`]})})]})]})})})}export{E as ChannelsPage};
@@ -0,0 +1,3 @@
1
+ import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{a as t,d as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./graph-vendor-DRq_-6fV.js";import{At as d,G as f,Ht as p,R as m,Rt as h,_t as g,at as _,nt as v,ot as y,q as b,rn as x,st as S,wt as ee,z as C}from"./ui-vendor-Dg9NNnWX.js";import{a as w,o as T}from"./shared-CMxbpLeQ.js";import{r as te}from"./roles-2OLDeTc5.js";import{a as E,c as D,i as ne,n as re,o as O,r as k,s as A,t as j}from"./WorkspacePanels-aMdJ7ZH7.js";import{A as ie,C as M,D as N,E as P,J as F,K as I,O as ae,S as oe,T as se,Z as L,_ as ce,c as le,d as ue,g as de,h as fe,k as R,l as pe,m as me,p as he,q as z,t as B,u as ge,v as _e,w as V,z as H}from"./index-CL1ALZ3r.js";import{t as ve}from"./badge-74-3jsCg.js";import{a as U,i as ye,n as be,t as xe}from"./constants-XUzFf6i1.js";import{a as Se,i as W,n as G,r as K,t as q}from"./select-DL_LPeDj.js";import{a as Ce,c as we,i as Te,n as Ee,o as De,r as Oe,s as ke,t as J}from"./alert-dialog-kFYVQ7oX.js";import{n as Y,r as X,t as Ae}from"./WorkspaceCommandDialog-CCXxjDL8.js";var Z=i(),Q=`bg-background/40 text-foreground shadow-xs placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50`,je=`rounded-xl border border-border bg-card/40 px-4 py-3`,Me=`max-h-56 space-y-2 overflow-y-auto rounded-xl border border-border bg-background/40 p-2 scrollbar-none`,Ne=`w-full rounded-md border px-3 py-2.5 text-left transition-colors`;function Pe({allowNetwork:e,onAllowNetworkChange:t,onOpenChange:n,onSubmit:r,onTitleChange:i,onWriteDirsChange:a,open:o,pending:s,title:c,writeDirs:l}){return(0,Z.jsxs)(Ae,{open:o,onOpenChange:n,title:`Create Workflow`,footer:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(F,{variant:`outline`,onClick:()=>n(!1),disabled:s,children:`Cancel`}),(0,Z.jsx)(F,{onClick:r,disabled:!c.trim()||s,children:s?`Creating...`:`Create Workflow`})]}),children:[(0,Z.jsx)(Y,{label:`Title`,hint:`Shown in the workflow strip`,children:(0,Z.jsx)(z,{autoFocus:!0,"aria-label":`Workflow title`,value:c,onChange:e=>i(e.target.value),placeholder:`Release checklist`,className:w(`h-10 rounded-md`,Q)})}),(0,Z.jsx)(X,{children:`New workflows always start with an empty definition and a bound Leader. MCP servers are provided globally after they connect.`}),(0,Z.jsx)(Y,{label:`Network Access`,hint:`Allow the leader to connect to the internet`,children:(0,Z.jsx)(H,{checked:e,label:`Network Access`,onCheckedChange:t})}),(0,Z.jsx)(Y,{label:`Write Dirs`,hint:`One absolute path per line`,children:(0,Z.jsx)(I,{value:l,"aria-label":`Write directories`,onChange:e=>a(e.target.value),placeholder:`/workspace/output
2
+ /workspace/cache`,className:w(`min-h-[80px] rounded-md font-mono text-[13px]`,Q)})})]})}var Fe={agent:`Agent`,trigger:`Trigger`,code:`Code`,if:`If`,merge:`Merge`};function Ie({activeTabTitle:e,nodeName:t,nodeType:n,roles:r,loadingRoles:i,onNodeNameChange:a,onNodeTypeChange:o,onOpenChange:s,onRoleNameChange:c,onSubmit:l,open:u,pending:d,selectedRole:f,selectedRoleName:p,submitDisabled:m}){return(0,Z.jsxs)(Ae,{open:u,onOpenChange:s,title:`Add Node`,footer:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(F,{variant:`outline`,onClick:()=>s(!1),disabled:d,children:`Cancel`}),(0,Z.jsx)(F,{onClick:l,disabled:m,children:d?`Adding...`:`Add Node`})]}),children:[(0,Z.jsxs)(X,{children:[`Adding a node to`,` `,(0,Z.jsx)(`span`,{className:`font-semibold text-foreground`,children:e??`No active workflow`})]}),(0,Z.jsx)(Y,{label:`Node Type`,hint:`Required`,children:(0,Z.jsxs)(q,{value:n,onValueChange:e=>o(e),children:[(0,Z.jsx)(W,{"aria-label":`Node Type`,className:w(`h-10 rounded-md data-[placeholder]:text-muted-foreground`,Q),children:(0,Z.jsx)(Se,{placeholder:`Choose node type`})}),(0,Z.jsx)(G,{className:`rounded-md border-border bg-popover text-popover-foreground`,children:Object.entries(Fe).map(([e,t])=>(0,Z.jsx)(K,{value:e,children:t},e))})]})}),n===`agent`?(0,Z.jsx)(Y,{label:`Role`,hint:`Required · Leader is managed by the workflow`,children:(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[f?(0,Z.jsxs)(`div`,{className:je,children:[(0,Z.jsx)(`div`,{className:`text-[13px] font-medium text-foreground`,children:f.name}),(0,Z.jsx)(`p`,{className:`mt-1 text-[12px] leading-relaxed text-muted-foreground`,children:f.description})]}):null,(0,Z.jsx)(`div`,{className:Me,children:i?(0,Z.jsx)(`p`,{className:`px-2 py-3 text-[12px] text-muted-foreground`,children:`Loading roles...`}):r.length===0?(0,Z.jsx)(`p`,{className:`px-2 py-3 text-[12px] text-muted-foreground`,children:`No roles available.`}):r.map(e=>(0,Z.jsxs)(F,{type:`button`,variant:`ghost`,onClick:()=>c(e.name),className:w(Ne,p===e.name?`border-border bg-accent/70`:`border-transparent bg-transparent hover:border-border hover:bg-accent/45`),children:[(0,Z.jsx)(`div`,{className:`text-[13px] font-medium text-foreground`,children:e.name}),(0,Z.jsx)(`p`,{className:`mt-1 text-[12px] leading-relaxed text-muted-foreground`,children:e.description})]},e.name))})]})}):null,(0,Z.jsx)(Y,{label:`Display Name`,hint:`Optional`,children:(0,Z.jsx)(z,{value:t,"aria-label":`Node display name`,onChange:e=>a(e.target.value),placeholder:n===`agent`?`Docs Worker`:`${Fe[n]} Node`,className:w(`h-10 rounded-md`,Q)})})]})}function Le({activeTabTitle:e,nodeOptions:t,onFromNodeChange:n,onFromPortChange:r,onOpenChange:i,onSubmit:a,onToNodeChange:o,onToPortChange:s,open:c,pending:l,fromNodeId:u,fromPortKey:d,toNodeId:f,toPortKey:p,fromPortOptions:m,toPortOptions:h}){return(0,Z.jsxs)(Ae,{open:c,onOpenChange:i,title:`Connect Ports`,footer:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(F,{variant:`outline`,onClick:()=>i(!1),disabled:l,children:`Cancel`}),(0,Z.jsx)(F,{onClick:a,disabled:!u||!d||!f||!p||l,children:l?`Connecting...`:`Create Edge`})]}),children:[(0,Z.jsx)(X,{children:e?(0,Z.jsxs)(Z.Fragment,{children:[`Workflow`,` `,(0,Z.jsx)(`span`,{className:`font-semibold text-foreground`,children:e}),` `,`· `,t.length,` nodes available`]}):`No active workflow`}),(0,Z.jsx)(Y,{label:`From Node`,hint:`Source node`,children:(0,Z.jsxs)(q,{value:u,onValueChange:n,children:[(0,Z.jsx)(W,{"aria-label":`From Node`,className:w(`h-10 rounded-md data-[placeholder]:text-muted-foreground`,Q),children:(0,Z.jsx)(Se,{placeholder:`Choose source node`})}),(0,Z.jsx)(G,{className:`rounded-md border-border bg-popover text-popover-foreground`,children:t.map(e=>(0,Z.jsx)(K,{value:e.id,children:e.label},e.id))})]})}),(0,Z.jsx)(Y,{label:`From Port`,hint:`Output port`,children:(0,Z.jsxs)(q,{value:d,onValueChange:r,children:[(0,Z.jsx)(W,{"aria-label":`From Port`,className:w(`h-10 rounded-md data-[placeholder]:text-muted-foreground`,Q),children:(0,Z.jsx)(Se,{placeholder:`Choose output port`})}),(0,Z.jsx)(G,{className:`rounded-md border-border bg-popover text-popover-foreground`,children:m.map(e=>(0,Z.jsx)(K,{value:e.key,children:e.label},e.key))})]})}),(0,Z.jsx)(Y,{label:`To Node`,hint:`Target node`,children:(0,Z.jsxs)(q,{value:f,onValueChange:o,children:[(0,Z.jsx)(W,{"aria-label":`To Node`,className:w(`h-10 rounded-md data-[placeholder]:text-muted-foreground`,Q),children:(0,Z.jsx)(Se,{placeholder:`Choose target node`})}),(0,Z.jsx)(G,{className:`rounded-md border-border bg-popover text-popover-foreground`,children:t.filter(e=>e.id!==u).map(e=>(0,Z.jsx)(K,{value:e.id,children:e.label},e.id))})]})}),(0,Z.jsx)(Y,{label:`To Port`,hint:`Input port`,children:(0,Z.jsxs)(q,{value:p,onValueChange:s,children:[(0,Z.jsx)(W,{"aria-label":`To Port`,className:w(`h-10 rounded-md data-[placeholder]:text-muted-foreground`,Q),children:(0,Z.jsx)(Se,{placeholder:`Choose input port`})}),(0,Z.jsx)(G,{className:`rounded-md border-border bg-popover text-popover-foreground`,children:h.map(e=>(0,Z.jsx)(K,{value:e.key,children:e.label},e.key))})]})})]})}function Re({onDelete:e,onOpenChange:t,open:n,pending:r,target:i}){return(0,Z.jsx)(J,{open:n,onOpenChange:t,children:(0,Z.jsxs)(Te,{className:`max-w-[30rem]`,children:[(0,Z.jsxs)(ke,{className:`gap-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Z.jsx)(`div`,{className:`flex size-11 items-center justify-center rounded-xl border border-border bg-accent/45 text-foreground shadow-xs`,children:(0,Z.jsx)(b,{className:`size-5`})}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-[10px] font-semibold text-muted-foreground`,children:`Destructive Action`}),(0,Z.jsx)(we,{className:`mt-1 text-foreground`,children:`Delete workflow?`})]})]}),(0,Z.jsx)(Ce,{className:`text-muted-foreground`,children:i?(0,Z.jsxs)(Z.Fragment,{children:[`Remove`,` `,(0,Z.jsx)(`span`,{className:`font-semibold text-foreground`,children:i.title}),` `,`and clean up its persisted workflow graph.`,typeof i.nodeCount==`number`?` ${i.nodeCount} node${i.nodeCount===1?``:`s`} will be removed with it.`:``]}):`This action cannot be undone.`})]}),(0,Z.jsxs)(De,{children:[(0,Z.jsx)(Oe,{asChild:!0,children:(0,Z.jsx)(F,{variant:`outline`,children:`Cancel`})}),(0,Z.jsx)(Ee,{asChild:!0,children:(0,Z.jsx)(F,{variant:`destructive`,onClick:e,disabled:r,children:r?`Deleting...`:`Delete Workflow`})})]})]})})}var $=e(n(),1),ze=(0,$.memo)(function(e){let{sourceX:t,sourceY:n,targetX:r,targetY:i,sourcePosition:o,targetPosition:s,id:l,data:u}=e,[d]=c({sourceX:t,sourceY:n,sourcePosition:o,targetX:r,targetY:i,targetPosition:s}),f=u??{},p=!!f.active,m=!!f.leaving,h=f.flowDirection===`reverse`?-1:1,g=f.selected===!0,_=h===1?`48`:`0`,v=h===1?`0`:`48`;return(0,Z.jsxs)(x.g,{className:`agent-graph-edge-shell`,initial:{opacity:0},animate:{opacity:+!m},transition:{duration:m?.2:.3,ease:`easeInOut`},children:[(0,Z.jsx)(a,{id:l,path:d,style:{stroke:p?`var(--graph-edge-active)`:g?`var(--graph-selection)`:`var(--graph-edge)`,strokeWidth:p?2.5:g?2.4:1.5,transition:`stroke 300ms ease, stroke-width 300ms ease, opacity 300ms ease`}}),g&&!p?(0,Z.jsx)(x.path,{d,fill:`none`,stroke:`var(--graph-selection)`,strokeWidth:`7`,strokeLinecap:`round`,filter:`url(#agent-graph-edge-glow)`,initial:{opacity:0},animate:{opacity:.16},transition:{duration:.18}}):null,p&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(x.path,{d,fill:`none`,stroke:`var(--graph-edge-active)`,strokeWidth:`8`,strokeLinecap:`round`,filter:`url(#agent-graph-edge-glow)`,initial:{opacity:0},animate:{opacity:[.1,.3,.1]},transition:{duration:2,repeat:1/0,ease:`easeInOut`}}),(0,Z.jsx)(x.path,{d,fill:`none`,stroke:`url(#agent-graph-edge-flow)`,strokeWidth:`3.5`,strokeLinecap:`round`,strokeDasharray:`12 12`,opacity:`0.8`,filter:`url(#agent-graph-edge-glow)`,initial:{opacity:0},animate:{opacity:.8},transition:{duration:.4},children:(0,Z.jsx)(`animate`,{attributeName:`stroke-dashoffset`,from:_,to:v,dur:`0.8s`,repeatCount:`indefinite`})}),(0,Z.jsx)(x.path,{d,fill:`none`,stroke:`var(--graph-edge-active)`,strokeWidth:`5`,strokeLinecap:`round`,filter:`url(#agent-graph-edge-glow)`,initial:{pathLength:.15,pathOffset:h===1?-.2:1.2,opacity:0},animate:{pathOffset:h===1?1.2:-.2,opacity:[0,1,1,0]},transition:{duration:1.5,ease:`easeInOut`,repeat:1/0,repeatType:`loop`,times:[0,.1,.9,1]}}),(0,Z.jsx)(x.path,{d,fill:`none`,stroke:`var(--graph-attention)`,strokeWidth:`2.5`,strokeLinecap:`round`,filter:`url(#agent-graph-edge-glow)`,initial:{pathLength:.08,pathOffset:h===1?-.23:1.23,opacity:0},animate:{pathOffset:h===1?1.17:-.17,opacity:[0,.9,.9,0]},transition:{duration:1.5,ease:`easeInOut`,repeat:1/0,repeatType:`loop`,times:[0,.1,.9,1],delay:.03}})]})]})}),Be={running:`border-graph-status-running/28`,idle:`border-graph-node-border`,sleeping:`border-graph-status-sleeping/26`,initializing:`border-border border-dashed`,error:`border-graph-status-error/28 border-double`,terminated:`border-border/70`};function Ve(e,t=!1){return e===`assistant`?`rounded-sm border-graph-node-border bg-accent/60 text-foreground`:w(`rounded-sm border-graph-node-border bg-surface-3`,t?`text-primary`:`text-foreground/80`)}var He=(0,$.memo)(function({data:e}){let{label:t,node_type:n,is_leader:r,state:i,latestTodo:a,selected:c,toolCall:l,canConnect:u,showConnectionEntryHint:d,connectionState:f,inputPorts:p,outputPorts:m}=e,h=!!e.leaving,g=be[n],_=(0,$.useRef)(null),v=(e,t)=>{if(!_.current)return;let n=_.current.getBoundingClientRect(),r=n.left+n.width/2,i=n.top+n.height/2,a=e-r,o=t-i,s=Math.sqrt(a*a+o*o),c=Math.max(0,1-s/240),l=Math.atan2(o,a)*180/Math.PI+90;_.current.style.setProperty(`--mouse-angle`,`${l}deg`),_.current.style.setProperty(`--mouse-intensity`,c.toString())},y=()=>{_.current&&(_.current.style.setProperty(`--mouse-angle`,`135deg`),_.current.style.setProperty(`--mouse-intensity`,`0`))},b=!!l,S=i===`running`,ee=b?`border-graph-attention/70`:Be[i],C=c?`ring-1 ring-graph-selection/25 border-graph-selection/80`:w(ee,`hover:border-graph-node-border-hover`),T=f===`source`?`ring-2 ring-graph-selection/35 border-graph-selection/90`:f===`valid-target`?`border-graph-selection/55 shadow-[0_0_0_1px_var(--graph-glow)]`:f===`invalid-target`?`opacity-45`:``,te=d||f===`source`,E=f===`source`?`border-graph-selection/75 bg-graph-selection/14 shadow-[0_0_0_1px_var(--graph-glow),0_0_24px_var(--graph-glow)]`:f===`valid-target`?`border-graph-selection/45 bg-graph-selection/10 shadow-[0_0_0_1px_var(--graph-glow),0_0_18px_var(--graph-glow)]`:f===`invalid-target`?`border-graph-node-border bg-graph-node-bg/50`:`border-graph-node-border bg-graph-node-bg/72`;return(0,Z.jsxs)(x.div,{ref:_,initial:{opacity:0,scale:.92,filter:`blur(6px) grayscale(0%)`},animate:{opacity:h?0:i===`terminated`?.4:1,scale:h?.9:1,y:h?8:0,filter:h?`blur(8px) grayscale(100%)`:i===`terminated`?`blur(0px) grayscale(100%)`:`blur(0px) grayscale(0%)`},transition:{duration:h?.28:.35,ease:[.23,1,.32,1]},onMouseEnter:e=>v(e.clientX,e.clientY),onMouseMove:e=>v(e.clientX,e.clientY),onMouseLeave:y,className:w(`relative isolate flex h-14 w-max min-w-[100px] max-w-[300px] items-center gap-2 overflow-visible rounded-[10px] border px-2.5 py-2.5`,`shadow-[0_10px_24px_var(--shell-scrim)]`,`bg-graph-node-bg`,`transition-[border-color] duration-300`,h&&`pointer-events-none`,C,T),style:{"--mouse-angle":`135deg`,"--mouse-intensity":`0`},children:[(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:w(`agent-state-ring`,U[i])}),(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:w(`agent-loading-border`,S&&`agent-loading-border-active`)}),p.map((e,t)=>(0,Z.jsx)(s,{id:e.key,type:`target`,position:o.Left,isConnectable:u,isConnectableEnd:u,className:w(`!z-10 !h-[72%] !w-5 !-translate-y-1/2 !border-0 !bg-transparent !opacity-0 after:absolute after:-inset-3 after:content-['']`),style:{top:`${(t+1)*100/(p.length+1)}%`}},`input-${e.key}`)),m.map((e,t)=>(0,Z.jsx)(s,{id:e.key,type:`source`,position:o.Right,isConnectable:u,isConnectableStart:u,className:w(`!z-10 !h-[72%] !w-5 !-translate-y-1/2 !border-0 !bg-transparent !opacity-0 after:absolute after:-inset-3 after:content-['']`),style:{top:`${(t+1)*100/(m.length+1)}%`}},`output-${e.key}`)),te?[(0,Z.jsx)(`div`,{"aria-hidden":`true`,"data-testid":`connection-entry-left`,className:w(`pointer-events-none absolute top-1/2 z-10 h-[72%] w-2.5 -translate-y-1/2 rounded-full border transition-[opacity,transform,box-shadow] duration-150`,`-left-1.5`,E)},`left-entry`),(0,Z.jsx)(`div`,{"aria-hidden":`true`,"data-testid":`connection-entry-right`,className:w(`pointer-events-none absolute top-1/2 z-10 h-[72%] w-2.5 -translate-y-1/2 rounded-full border transition-[opacity,transform,box-shadow] duration-150`,`-right-1.5`,E)},`right-entry`)]:null,(0,Z.jsx)(`div`,{className:w(`relative z-10 flex size-8 shrink-0 items-center justify-center border`,Ve(n,r)),children:(0,Z.jsx)(g,{className:`size-4.5`})}),(0,Z.jsxs)(`div`,{className:`relative z-10 flex min-w-0 flex-1 items-center justify-between gap-2`,children:[(0,Z.jsx)(`span`,{className:`truncate text-[13px] font-semibold text-foreground -translate-y-[0.7px]`,title:a??void 0,children:t}),(0,Z.jsx)(`div`,{className:`relative flex items-center pr-0.5`,title:b?`Active`:i,children:(0,Z.jsxs)(`span`,{className:`relative flex size-2.5`,children:[(S||b)&&(0,Z.jsx)(`span`,{className:w(`absolute inline-flex size-full animate-ping rounded-full opacity-40`,b?`bg-graph-attention`:ye[i])}),(0,Z.jsx)(`span`,{className:w(`relative inline-flex size-2.5 rounded-full border border-card shadow-sm`,b?`bg-graph-attention`:ye[i])})]})})]}),b&&(0,Z.jsx)(x.div,{initial:{opacity:0,y:5},animate:{opacity:1,y:0},className:`absolute -bottom-6 left-1/2 z-20 -translate-x-1/2 whitespace-nowrap`,children:(0,Z.jsx)(`span`,{className:`rounded-sm border border-graph-attention/24 bg-surface-2/92 px-1.5 py-0.5 text-[9px] font-mono text-graph-attention-text shadow-lg backdrop-blur-sm`,children:l})})]})}),Ue=.3,We=.05,Ge=`rounded-md border border-border bg-popover px-3 py-1 text-[11px] font-medium text-popover-foreground shadow-sm`,Ke=`h-8 w-full rounded-md border border-input bg-background/55 px-3 text-[13px] text-foreground shadow-xs placeholder:text-muted-foreground transition-[border-color,box-shadow] focus:border-ring focus:outline-none focus:ring-[3px] focus:ring-ring/50`,qe=`max-h-56 space-y-2 overflow-y-auto rounded-md border border-border bg-background/40 p-2 scrollbar-none`,Je=`w-full rounded-md border px-3 py-2 text-left transition-colors`;function Ye(e){return e.kind===`standalone`?`Add Agent`:e.kind===`between`?`Insert Agent Between`:`Add Agent After`}var Xe=e(u(),1);function Ze({children:e}){return typeof document>`u`||!document.body?null:(0,Xe.createPortal)(e,document.body)}function Qe({x:e,y:t,items:n,onClose:r}){let i=(0,$.useRef)(null),[a,o]=(0,$.useState)(()=>({left:e,top:t}));return(0,$.useEffect)(()=>{let n=i.current;if(!n)return;let r=requestAnimationFrame(()=>{let r=n.getBoundingClientRect(),i=window.innerWidth-8-r.width,a=window.innerHeight-8-r.height,s=Math.max(8,Math.min(e,i)),c=Math.max(8,Math.min(t,a));o(e=>e.left===s&&e.top===c?e:{left:s,top:c})});return()=>cancelAnimationFrame(r)},[e,t,n.length]),(0,$.useEffect)(()=>{let e=e=>{i.current&&!i.current.contains(e.target)&&r()};return document.addEventListener(`mousedown`,e,!0),()=>document.removeEventListener(`mousedown`,e,!0)},[r]),(0,$.useEffect)(()=>{let e=e=>{e.key===`Escape`&&r()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[r]),n.length===0?null:(0,Z.jsx)(Ze,{children:(0,Z.jsx)(x.div,{ref:i,initial:{opacity:0,scale:.96,y:-4},animate:{opacity:1,scale:1,y:0},transition:{duration:.12,ease:`easeOut`},className:`fixed z-[200] min-w-[160px] rounded-md border border-border bg-popover py-1 shadow-md`,style:{left:a.left,top:a.top},children:n.map((e,t)=>e===`divider`?(0,Z.jsx)(`div`,{className:`my-1 border-t border-border`},t):(0,Z.jsx)(F,{type:`button`,variant:`ghost`,disabled:e.disabled,onClick:()=>{e.disabled||(e.onClick(),r())},className:`h-auto w-full justify-start rounded-none px-3 py-1.5 text-left text-[11px] hover:text-inherit disabled:opacity-40 ${e.danger?`text-graph-status-error/90 hover:bg-destructive/10 hover:text-graph-status-error`:`text-popover-foreground/90 hover:bg-accent/30 hover:text-popover-foreground`}`,children:e.label},t))})})}var $e=/^[il1.,!|:;]$/,et=/^[fjrt\-[\]()]$/,tt=/^[wmMWOQ@]$/,nt=/^[A-Z]$/;function rt(e){let t=Array.from(e).reduce((e,t)=>t===` `?e+4:t.charCodeAt(0)>255?e+13:$e.test(t)?e+4:et.test(t)?e+5.5:tt.test(t)?e+10.5:nt.test(t)?e+8.5:e+7,0);return Math.max(100,Math.min(300,t+76))}function it(e,t){let[n,r]=(0,$.useState)(e),[i,a]=(0,$.useState)(t),o=(0,$.useRef)(new Map),s=(0,$.useRef)(new Map);return(0,$.useEffect)(()=>{r(t=>{let n=new Set(e.map(e=>e.id)),i=new Map(t.map(e=>[e.id,e])),a=e.map(e=>{let t=o.current.get(e.id);t&&(clearTimeout(t),o.current.delete(e.id));let n=i.get(e.id);return{...n,...e,className:w(e.className,`agent-graph-node-present`),data:{...n?.data??{},...e.data??{},leaving:!1}}});for(let e of t)if(!n.has(e.id)){if(!o.current.has(e.id)){let t=setTimeout(()=>{r(t=>t.filter(t=>t.id!==e.id)),o.current.delete(e.id)},320);o.current.set(e.id,t)}a.push({...e,className:w(e.className,`agent-graph-node-leaving`),data:{...e.data??{},leaving:!0}})}return a})},[e]),(0,$.useEffect)(()=>{a(e=>{let n=new Set;for(let e=0;e<t.length;e++)n.add(t[e].id);let r=new Map;for(let t=0;t<e.length;t++)r.set(e[t].id,e[t]);let i=t.map(e=>{let t=s.current.get(e.id);t&&(clearTimeout(t),s.current.delete(e.id));let n=r.get(e.id);return{...n,...e,data:{...n?.data??{},...e.data??{},leaving:!1}}});for(let t of e)if(!n.has(t.id)){if(!s.current.has(t.id)){let e=setTimeout(()=>{a(e=>e.filter(e=>e.id!==t.id)),s.current.delete(t.id)},220);s.current.set(t.id,e)}i.push({...t,data:{...t.data??{},leaving:!0}})}return i})},[t]),(0,$.useEffect)(()=>{let e=o.current,t=s.current;return()=>{for(let t of e.values())clearTimeout(t);for(let e of t.values())clearTimeout(e)}},[]),{nodes:n,edges:i}}function at({roles:e=[],loadingRoles:t=!1,onConnectModeChange:n,onCreateConnection:r=async()=>void 0,onDeleteConnection:i=async()=>void 0,onCreateStandaloneAgent:a=async()=>void 0,onCreateLinkedAgent:o=async()=>void 0,onDeleteAgent:s=async()=>void 0,onInsertAgentBetween:c=async()=>void 0,onOpenConnectDialog:l=()=>void 0}){let{agents:u}=de(),{tabs:d}=ce(),{activeToolCalls:f}=he(),{activeTabId:p,selectedAgentId:h,selectAgent:g}=_e(),[_,v]=(0,$.useState)(null),[y,b]=(0,$.useState)(null),[x,S]=(0,$.useState)(null),[ee,C]=(0,$.useState)(``),[w,T]=(0,$.useState)(``),[te,E]=(0,$.useState)(!1),[D,ne]=(0,$.useState)(null),[re,O]=(0,$.useState)(1),[k,A]=(0,$.useState)(null),[j,ie]=(0,$.useState)(!1),[M,N]=(0,$.useState)(null),P=(0,$.useRef)(null),F=(0,$.useRef)(``),I=(0,$.useRef)(new Map),[ae,oe]=(0,$.useState)(0),[se,L]=(0,$.useState)({key:``,positions:new Map}),le=(0,$.useRef)(null),ue=(0,$.useRef)(null),fe=(0,$.useRef)(null),[R,pe]=(0,$.useState)(null),me=p?d.get(p)??null:null,z=(0,$.useMemo)(()=>me?.definition.nodes??[],[me?.definition.nodes]),B=(0,$.useMemo)(()=>me?.definition.edges??[],[me?.definition.edges]),ge=(0,$.useMemo)(()=>new Map(z.map(e=>[e.id,e])),[z]),V=(0,$.useCallback)((e,t,n)=>{F.current=``,console.error(t,n);let r=I.current.get(e)??0;r>=1||(I.current.set(e,r+1),oe(e=>e+1))},[]);(0,$.useEffect)(()=>{let e=new Worker(new URL(`/assets/layout.worker-jMHqAFbP.js`,``+import.meta.url),{type:`module`}),t=I.current;return e.onerror=e=>{let t=F.current;t&&V(t,`AgentGraph layout worker error`,e)},e.onmessageerror=e=>{let t=F.current;t&&V(t,`AgentGraph layout worker message error`,e)},e.onmessage=e=>{let{positions:t,key:n,error:r}=e.data;if(n!==F.current)return;if(r||!t){V(n,`AgentGraph layout worker rejected request`,r);return}I.current.delete(n);let i=new Map;for(let e of t)i.set(e.id,e.position);L({key:n,positions:i})},P.current=e,()=>{F.current=``,t.clear(),P.current=null,e.terminate()}},[V]),(0,$.useEffect)(()=>{n?.(j)},[j,n]);let H=(0,$.useCallback)(e=>{!Number.isFinite(e)||e<=0||O(e)},[]),ve=(0,$.useCallback)(e=>{e&&H(e.getZoom())},[H]),U=(0,$.useCallback)(async e=>{if(!D)return!1;try{let t=await D.fitView(e);return ve(D),t}catch{return!1}},[D,ve]),ye=(0,$.useCallback)(e=>{ne(e),ve(e)},[ve]),be=(0,$.useCallback)((e,t)=>{H(t.zoom)},[H]),Se=(0,$.useCallback)(()=>{ie(e=>!e)},[]),W=(0,$.useMemo)(()=>new Map(Array.from(u.entries())),[u]),G=(0,$.useCallback)(e=>{let t=ge.get(e);return!t||t.type!==`agent`?null:{id:t.id,node_type:`agent`,tab_id:p,is_leader:!1,state:`idle`,connections:B.filter(e=>e.from_node_id===t.id).map(e=>e.to_node_id),name:typeof t.config.name==`string`?t.config.name:null,todos:[],role_name:typeof t.config.role_name==`string`?t.config.role_name:null}},[p,B,ge]),K=(0,$.useCallback)(e=>W.get(e)??G(e),[G,W]),q=(0,$.useMemo)(()=>z.flatMap(e=>{let t=W.get(e.id);if(t)return[t];let n=G(e.id);return n?[n]:[]}),[G,W,z]),Ce=(0,$.useCallback)((e,t)=>{let n=ge.get(e),r=ge.get(t),i=n?.outputs.find(e=>r?.inputs.some(t=>t.kind===e.kind))??n?.outputs[0],a=i&&r?r.inputs.find(e=>e.kind===i.kind)??r.inputs[0]:null;return!i||!a?null:{sourcePortKey:i.key,targetPortKey:a.key}},[ge]),we=(0,$.useCallback)((e,t)=>{if(e===t)return!1;let n=Ce(e,t);return n?!B.some(r=>r.from_node_id===e&&r.from_port_key===n.sourcePortKey&&r.to_node_id===t&&r.to_port_key===n.targetPortKey):!1},[Ce,B]),Te=(0,$.useMemo)(()=>{let e=new Map;for(let t of z){let n=W.get(t.id)??null,r=xe({name:typeof t.config.name==`string`?t.config.name:null,roleName:typeof t.config.role_name==`string`?t.config.role_name:null,nodeType:t.type,isLeader:!1});e.set(t.id,{label:r,width:rt(r),node_type:t.type,is_leader:!1,state:n?.state??`idle`,shortId:t.id.slice(0,8),name:typeof t.config.name==`string`?t.config.name:null,role_name:typeof t.config.role_name==`string`?t.config.role_name:null,latestTodo:n?.todos[n.todos.length-1]?.text??null,selected:t.id===h&&k===null,toolCall:n?f.get(t.id)??null:null,leaving:!1,canConnect:!!p,showConnectionEntryHint:j||!!M,connectionState:M===t.id?`source`:M?we(M,t.id)?`valid-target`:`invalid-target`:null,inputPorts:t.inputs,outputPorts:t.outputs})}return e},[p,f,j,we,W,h,k,M,z]),{rawNodes:Ee,baseEdges:De,structureKey:Oe}=(0,$.useMemo)(()=>({rawNodes:z.flatMap(e=>{let t=Te.get(e.id);return t?[{id:e.id,type:`agent`,position:{x:0,y:0},width:t.width,height:56,data:t,className:`agent-graph-node-shell`}]:[]}),baseEdges:B.map(e=>({id:e.id,source:e.from_node_id,sourceHandle:e.from_port_key,target:e.to_node_id,targetHandle:e.to_port_key,type:`animated`,data:{kind:e.kind}})),structureKey:`${p??`unassigned`}:${z.map(e=>`${e.id}:${e.type}:${JSON.stringify(e.config)}`).sort().join(`|`)}:${B.map(e=>`${e.id}:${e.from_node_id}:${e.from_port_key}:${e.to_node_id}:${e.to_port_key}:${e.kind}`).sort().join(`|`)}`}),[p,Te,B,z]);(0,$.useEffect)(()=>{if(Ee.length===0){F.current=``,I.current.clear();return}if(se.key===Oe||F.current===Oe)return;let e=P.current;e&&(e.postMessage({nodes:Ee,edges:De,key:Oe}),F.current=Oe)},[De,ae,se.key,Ee,Oe]);let ke=(0,$.useMemo)(()=>{let e=se.positions;return{nodes:Ee.map(t=>({...t,position:e.get(t.id)??{x:0,y:0}})),edges:De.map(e=>({...e,data:{active:!1,flowDirection:null,leaving:!1,selected:e.id===k},animated:!1})),structureKey:Oe}},[De,se.positions,Ee,k,Oe]),{nodes:J,edges:Y}=it(ke.nodes,ke.edges),X=(0,$.useCallback)(()=>{S(null),C(``),T(``),E(!1)},[]),Ae=(0,$.useCallback)(e=>{S(e),C(``),T(``),E(!1),b(null),v(null)},[]),Z=(0,$.useCallback)((e,t)=>{if(M&&p){if(t.id===M)return;if(!we(M,t.id)){m.error(`This connection is not available`);return}let e=Ce(M,t.id);if(!e){m.error(`This connection is not available`);return}r(p,M,t.id,e.sourcePortKey,e.targetPortKey).then(()=>{N(null),ie(!1),A(null)}).catch(e=>{m.error(e instanceof Error?e.message:`Failed to connect nodes`)});return}A(null),K(t.id)?g(t.id):g(null)},[p,Ce,we,r,K,g,M]),Q=(0,$.useCallback)((e,t)=>{if(!W.has(t.id))return;let n=e;v({agentId:t.id,x:n.clientX,y:n.clientY})},[W]),je=(0,$.useCallback)((e,t)=>{if(!W.has(t.id))return;let n=e;v({agentId:t.id,x:n.clientX,y:n.clientY})},[W]),Me=(0,$.useCallback)(()=>{v(null)},[]),Ne=(0,$.useCallback)(()=>{A(null),v(null),b(null),N(null),X(),g(null)},[X,g]),Pe=(0,$.useCallback)(e=>{e.preventDefault();let t=e;A(null),v(null),N(null),X(),g(null),b({kind:`pane`,x:t.clientX,y:t.clientY})},[X,g]),Fe=(0,$.useCallback)((e,t)=>{let n=K(t.id),r=e;if(r.preventDefault(),r.stopPropagation(),!n||!p){b(null);return}g(t.id),A(null),N(null),v(null),X(),b({kind:`node`,x:r.clientX,y:r.clientY,agentId:t.id})},[p,X,K,g]),Ie=(0,$.useCallback)(e=>{!p||!e.source||!e.target||r(p,e.source,e.target,e.sourceHandle??`out`,e.targetHandle??`in`).then(()=>{ie(!1),N(null),A(null)}).catch(e=>{m.error(e instanceof Error?e.message:`Failed to connect nodes`)})},[p,r]),Le=(0,$.useCallback)(()=>{},[]),Re=(0,$.useCallback)(()=>{j||ie(!1)},[j]),ze=(0,$.useCallback)((e,t)=>{A(t.id),v(null),b(null),N(null),X(),g(null)},[X,g]),Be=(0,$.useCallback)((e,t)=>{let n=e;n.preventDefault(),n.stopPropagation(),A(t.id),v(null),N(null),X(),g(null),b({kind:`edge`,x:n.clientX,y:n.clientY,sourceId:t.source,targetId:t.target,sourcePortKey:t.sourceHandle,targetPortKey:t.targetHandle})},[X,g]),Ve=(0,$.useCallback)(()=>{b(null)},[]),He=(0,$.useMemo)(()=>{if(!y)return[];if(y.kind===`node`){let e=K(y.agentId);return!e||!p?[]:[{label:`Add Agent After`,onClick:()=>{Ae({kind:`linked`,x:y.x,y:y.y,anchorNodeId:e.id})}},{label:`Connect to...`,onClick:()=>{S(null),C(``),T(``),ie(!1),N(e.id),A(null),g(e.id)}},`divider`,{label:`Delete Agent`,danger:!0,onClick:()=>{s({tabId:p,node:e,tabAgents:q}).catch(e=>{m.error(e instanceof Error?e.message:`Failed to delete agent`)})}}]}return y.kind===`edge`?p?[{label:`Insert Agent Between`,onClick:()=>{Ae({kind:`between`,x:y.x,y:y.y,sourceNodeId:y.sourceId,targetNodeId:y.targetId})}},{label:`Delete Edge`,danger:!0,onClick:()=>{i(p,y.sourceId,y.targetId,y.sourcePortKey??void 0,y.targetPortKey??void 0).catch(e=>{m.error(e instanceof Error?e.message:`Failed to delete edge`)})}}]:[]:[{label:`Add Agent`,disabled:!p,onClick:()=>{Ae({kind:`standalone`,x:y.x,y:y.y})}},{label:`Connect Ports`,disabled:!p||q.length<2,onClick:l},`divider`,{label:`Fit View`,disabled:!D,onClick:()=>{U({padding:Ue,maxZoom:1,duration:350})}},{label:`Clear Selection`,onClick:()=>{A(null),N(null),g(null)}}]},[p,y,U,D,s,i,l,Ae,K,g,q]),We=(0,$.useCallback)(()=>{if(!p||!x||!w||te)return;let e=ee.trim()||void 0;E(!0),(x.kind===`standalone`?a({tabId:p,roleName:w,name:e}):x.kind===`linked`?o({tabId:p,anchorNodeId:x.anchorNodeId,roleName:w,name:e}):c({tabId:p,sourceNodeId:x.sourceNodeId,targetNodeId:x.targetNodeId,roleName:w,name:e})).then(()=>{X(),A(null),N(null)}).catch(e=>{E(!1),m.error(e instanceof Error?e.message:`Failed to add agent`)})},[p,X,o,a,c,x,ee,w,te]),Ge=_?W.get(_.agentId)??null:null,Ke=_&&_.agentId?f.get(_.agentId)??null:null;(0,$.useEffect)(()=>{if(!_||!Ge)return;let e=requestAnimationFrame(()=>{let e=le.current;if(!e)return;let t=e.getBoundingClientRect();pe(e=>e&&Math.abs(e.width-t.width)<.5&&Math.abs(e.height-t.height)<.5?e:{width:t.width,height:t.height})});return()=>cancelAnimationFrame(e)},[_,Ge]),(0,$.useEffect)(()=>{if(!D||J.length===0||fe.current===ke.structureKey)return;let e=fe.current===null;fe.current=ke.structureKey;let t=requestAnimationFrame(()=>{U({padding:Ue,maxZoom:1,duration:e?0:250})});return()=>cancelAnimationFrame(t)},[J.length,U,D,ke.structureKey]),(0,$.useEffect)(()=>{if(!D||!ue.current||J.length===0)return;let e=0,t=new ResizeObserver(()=>{cancelAnimationFrame(e),e=requestAnimationFrame(()=>{U({padding:Ue,maxZoom:1,duration:250})})});return t.observe(ue.current),()=>{cancelAnimationFrame(e),t.disconnect()}},[J.length,U,D]);let qe=(0,$.useMemo)(()=>{if(!_||typeof window>`u`)return;let e=R?.width??280,t=R?.height??120,n=window.innerWidth-8-e,r=window.innerHeight-8-t;return{left:Math.max(8,Math.min(_.x+12,n)),top:Math.max(8,Math.min(_.y+12,r))}},[_,R]),Je=(0,$.useMemo)(()=>d.size===0?{title:`No workflows yet`}:p?{title:`This workflow is ready for its first node`}:{title:`Select a workflow`},[p,d.size]);return{activeTabId:p,animatedEdges:Y,animatedNodes:J,availableRoles:e,closeContextMenu:Ve,closeQuickCreate:X,connectHintLabel:M?`Choose target Agent`:j?`Connect Ports`:null,containerRef:ue,contextMenu:y,contextMenuItems:He,emptyState:Je,enterConnectMode:Se,handleFlowInit:ye,handleViewportMove:be,isValidConnection:(0,$.useCallback)(e=>!e.source||!e.target||!e.sourceHandle||!e.targetHandle||e.source===e.target?!1:!B.some(t=>t.from_node_id===e.source&&t.from_port_key===e.sourceHandle&&t.to_node_id===e.target&&t.to_port_key===e.targetHandle),[B]),loadingRoles:t,onConnect:Ie,onConnectEnd:Re,onConnectStart:Le,onEdgeClick:ze,onEdgeContextMenu:Be,onNodeClick:Z,onNodeContextMenu:Fe,onNodeMouseEnter:Q,onNodeMouseLeave:Me,onNodeMouseMove:je,onPaneClick:Ne,onPaneContextMenu:Pe,quickCreate:x,quickCreateName:ee,quickCreateRoleName:w,setQuickCreateName:C,setQuickCreateRoleName:T,submitQuickCreate:We,submittingQuickCreate:te,tooltip:_,tooltipAgent:Ge,tooltipRef:le,tooltipStyle:qe,tooltipToolCall:Ke,viewportZoom:re}}var ot={running:`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`,idle:`border-graph-status-idle/12 bg-graph-status-idle/[0.06] text-graph-status-idle/78`,sleeping:`border-graph-status-sleeping/18 bg-graph-status-sleeping/[0.12] text-graph-status-sleeping`,initializing:`border-graph-status-initializing/16 bg-graph-status-initializing/[0.08] text-graph-status-initializing/84`,error:`border-graph-status-error/20 bg-graph-status-error/[0.09] text-graph-status-error`,terminated:`border-border bg-accent/35 text-muted-foreground`};function st({agent:e,agentId:t,activeToolCall:n,style:r,tooltipRef:i}){let a=e?xe({name:e.name,roleName:e.role_name,nodeType:e.node_type,isLeader:e.is_leader}):null;return(0,Z.jsx)(Ze,{children:(0,Z.jsx)(L,{children:e&&t&&a?(0,Z.jsxs)(x.div,{ref:i,initial:{opacity:0,y:4,scale:.98},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:2,scale:.98},transition:{duration:.15},className:`pointer-events-none fixed z-[100] max-w-[320px] rounded-md border border-border bg-popover px-2 py-1 text-popover-foreground shadow-md`,style:r,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-[11px] font-medium`,children:a}),(0,Z.jsx)(ve,{variant:`outline`,className:`text-[10px] ${ot[e.state]}`,children:e.state.toUpperCase()}),e.role_name?(0,Z.jsx)(ve,{variant:`outline`,className:`text-[10px]`,children:e.role_name}):null,e.is_leader?(0,Z.jsx)(ve,{variant:`outline`,className:`border-accent bg-accent/45 text-[10px] text-accent-foreground`,children:`Leader`}):null]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 grid grid-cols-[auto_1fr] gap-x-2 gap-y-1 text-[10px] text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:`ID`}),(0,Z.jsx)(`span`,{className:`font-mono text-foreground/80`,children:t.slice(0,8)}),(0,Z.jsx)(`span`,{children:`Connections`}),(0,Z.jsx)(`span`,{className:`text-foreground/80`,children:e.connections.length}),(0,Z.jsx)(`span`,{children:`Workflow`}),(0,Z.jsx)(`span`,{className:`font-mono text-foreground/80`,children:e.tab_id?.slice(0,8)??`—`}),n?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{children:`Tool`}),(0,Z.jsx)(`span`,{className:`font-mono text-foreground/80`,children:n})]}):null]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 space-y-1`,children:[(0,Z.jsx)(`div`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Todos`}),e.todos.length===0?(0,Z.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`No todos`}):(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[e.todos.slice(Math.max(e.todos.length-3,0)).reverse().map(e=>(0,Z.jsx)(`div`,{className:`text-[11px] leading-relaxed text-foreground/85`,children:e.text},`${t}-${e.text}`)),e.todos.length>3?(0,Z.jsxs)(`div`,{className:`text-[10px] text-muted-foreground`,children:[`+`,e.todos.length-3,` more`]}):null]})]})]}):null})})}var ct={agent:He},lt={animated:ze},ut=(0,$.forwardRef)(function(e,n){let{activeTabId:i,animatedEdges:a,animatedNodes:o,availableRoles:s,closeContextMenu:c,closeQuickCreate:u,connectHintLabel:d,containerRef:f,contextMenu:p,contextMenuItems:m,emptyState:h,enterConnectMode:_,handleFlowInit:v,handleViewportMove:y,isValidConnection:b,loadingRoles:x,onConnect:S,onConnectEnd:ee,onConnectStart:C,onEdgeClick:w,onEdgeContextMenu:te,onNodeClick:E,onNodeContextMenu:D,onNodeMouseEnter:ne,onNodeMouseLeave:re,onNodeMouseMove:O,onPaneClick:k,onPaneContextMenu:A,quickCreate:j,quickCreateName:ie,quickCreateRoleName:M,setQuickCreateName:N,setQuickCreateRoleName:P,submitQuickCreate:F,submittingQuickCreate:I,tooltip:ae,tooltipAgent:oe,tooltipRef:se,tooltipStyle:L,tooltipToolCall:ce,viewportZoom:le}=at(e);return(0,$.useImperativeHandle)(n,()=>({enterConnectMode:_}),[_]),(0,Z.jsxs)(`div`,{ref:f,className:`relative flex h-full flex-col`,children:[(0,Z.jsx)(`div`,{className:`relative flex-1 overflow-hidden`,children:o.length===0?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center px-5 py-8`,children:(0,Z.jsxs)(`div`,{className:`w-full max-w-[22rem] rounded-xl border border-border bg-surface-overlay/60 px-5 py-5 text-center shadow-md backdrop-blur-sm`,children:[(0,Z.jsx)(`div`,{className:`mx-auto flex size-10 items-center justify-center rounded-lg border border-border bg-accent/35 text-muted-foreground`,children:(0,Z.jsx)(g,{className:`size-4.5`})}),(0,Z.jsx)(`p`,{className:`mt-3.5 text-[18px] font-semibold leading-tight text-foreground`,children:h.title})]})}):(0,Z.jsxs)(r,{nodes:o,edges:a,nodeTypes:ct,edgeTypes:lt,colorMode:`dark`,onInit:v,onNodeClick:E,onNodeMouseEnter:ne,onNodeMouseMove:O,onNodeMouseLeave:re,onPaneClick:k,onPaneContextMenu:A,onNodeContextMenu:D,onEdgeClick:w,onEdgeContextMenu:te,onConnect:S,onConnectStart:C,onConnectEnd:ee,onMove:y,isValidConnection:b,connectionMode:t.Strict,connectOnClick:!1,proOptions:{hideAttribution:!0},nodesDraggable:!1,nodesConnectable:!!i,panOnDrag:!0,zoomOnScroll:!0,zoomOnPinch:!0,minZoom:We,maxZoom:6,className:`bg-graph-bg`,children:[(0,Z.jsx)(l,{color:`var(--graph-grid)`,gap:28,size:.72}),(0,Z.jsx)(`svg`,{"aria-hidden":`true`,focusable:`false`,children:(0,Z.jsxs)(`defs`,{children:[(0,Z.jsxs)(`linearGradient`,{id:`agent-graph-edge-flow`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,Z.jsx)(`stop`,{offset:`0%`,stopColor:`var(--graph-edge)`,stopOpacity:`0.2`}),(0,Z.jsx)(`stop`,{offset:`50%`,stopColor:`var(--graph-edge-active)`,stopOpacity:`0.94`}),(0,Z.jsx)(`stop`,{offset:`100%`,stopColor:`var(--graph-edge)`,stopOpacity:`0.2`})]}),(0,Z.jsxs)(`radialGradient`,{id:`agent-graph-edge-pulse`,cx:`50%`,cy:`50%`,r:`50%`,children:[(0,Z.jsx)(`stop`,{offset:`0%`,stopColor:`var(--graph-edge-active)`,stopOpacity:`1`}),(0,Z.jsx)(`stop`,{offset:`100%`,stopColor:`var(--graph-edge-active)`,stopOpacity:`0.2`})]}),(0,Z.jsx)(`filter`,{id:`agent-graph-edge-glow`,x:`-50%`,y:`-50%`,width:`200%`,height:`200%`,children:(0,Z.jsx)(`feGaussianBlur`,{stdDeviation:`2.6`})})]})})]})}),o.length>0?(0,Z.jsx)(`div`,{className:`pointer-events-none absolute bottom-4 left-4 z-30`,children:(0,Z.jsx)(`div`,{className:Ge,"data-testid":`agent-graph-zoom-indicator`,children:T(le)})}):null,d?(0,Z.jsx)(`div`,{className:`pointer-events-none absolute right-4 top-4 z-30`,children:(0,Z.jsx)(`div`,{className:Ge,children:d})}):null,(0,Z.jsx)(st,{agent:oe,agentId:ae?.agentId??null,activeToolCall:ce,style:L,tooltipRef:se}),p?(0,Z.jsx)(Qe,{x:p.x,y:p.y,items:m,onClose:c}):null,j?(0,Z.jsx)(dt,{displayName:ie,roles:s,loadingRoles:x,onClose:u,onDisplayNameChange:N,onSelectRole:P,onSubmit:F,selectedRoleName:M,submitting:I,title:Ye(j),x:j.x,y:j.y}):null]})});function dt({x:e,y:t,title:n,selectedRoleName:r,displayName:i,roles:a,loadingRoles:o,submitting:s,onSelectRole:c,onDisplayNameChange:l,onSubmit:u,onClose:d}){let f=(0,$.useRef)(null),[p,m]=(0,$.useState)(()=>({left:e,top:t}));return(0,$.useEffect)(()=>{let n=f.current;if(!n)return;let r=requestAnimationFrame(()=>{let r=n.getBoundingClientRect(),i=window.innerWidth-12-r.width,a=window.innerHeight-12-r.height;m({left:Math.max(12,Math.min(e,i)),top:Math.max(12,Math.min(t,a))})});return()=>cancelAnimationFrame(r)},[o,a.length,n,e,t]),(0,$.useEffect)(()=>{let e=e=>{f.current&&!f.current.contains(e.target)&&d()};return document.addEventListener(`mousedown`,e,!0),()=>document.removeEventListener(`mousedown`,e,!0)},[d]),(0,Z.jsx)(Ze,{children:(0,Z.jsxs)(`div`,{ref:f,className:`fixed z-[210] w-[min(24rem,calc(100vw-1.5rem))] rounded-xl border border-border bg-popover p-4 text-popover-foreground shadow-md`,style:{left:p.left,top:p.top},children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:n}),(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:`Choose a role and optionally set a display name.`})]}),(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`sm`,onClick:d,className:`flex h-8 items-center rounded-md px-2.5 text-[11px] text-muted-foreground transition-colors hover:bg-accent/35 hover:text-foreground`,children:`Close`})]}),(0,Z.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[(0,Z.jsx)(`div`,{className:qe,children:o?(0,Z.jsx)(`p`,{className:`px-2 py-3 text-[12px] text-muted-foreground`,children:`Loading roles...`}):a.length===0?(0,Z.jsx)(`p`,{className:`px-2 py-3 text-[12px] text-muted-foreground`,children:`No roles available.`}):a.map(e=>(0,Z.jsxs)(F,{type:`button`,variant:`ghost`,onClick:()=>c(e.name),className:w(Je,r===e.name?`border-border bg-accent/70`:`border-transparent bg-transparent hover:border-border hover:bg-accent/45`),children:[(0,Z.jsx)(`div`,{className:`text-[13px] font-medium text-foreground`,children:e.name}),(0,Z.jsx)(`div`,{className:`mt-1 text-[11px] leading-relaxed text-muted-foreground`,children:e.description})]},e.name))}),(0,Z.jsx)(z,{"aria-label":`Display Name`,value:i,onChange:e=>l(e.target.value),placeholder:`Optional display name`,className:Ke})]}),(0,Z.jsxs)(`div`,{className:`mt-4 flex items-center justify-end gap-2`,children:[(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`sm`,onClick:d,className:`flex h-8 items-center rounded-md px-3 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/35 hover:text-foreground`,children:`Cancel`}),(0,Z.jsx)(F,{type:`button`,size:`sm`,disabled:!r||s,onClick:u,className:`flex h-8 items-center rounded-md bg-primary px-3.5 text-[12px] font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50`,children:s?`Saving...`:n})]})]})})}function ft({activeTabId:e,connected:t,definitionDraft:n,editorMode:r,graphConnectMode:i,graphHistory:a,graphRef:o,isCompactWorkspace:s,isDragging:c,leaderDetailVisible:l,leaderNode:u,leaderPanelRunning:m,loadingRoles:g,onCloseLeaderDetails:b,onConnectModeChange:T,onCreateNode:te,onCreateTab:D,onDefinitionDraftChange:ie,onDeleteTab:M,onDuplicateTab:N,onEditorModeChange:P,onOpenLeaderDetails:I,onOpenConnectDialog:ae,onSaveDefinition:oe,panelVisible:se,pendingAction:ce,resolvedPanelWidth:ue,roles:de,selectAgent:fe,selectedAgent:R,setActiveTabId:pe,startDrag:me,tabs:he,togglePanel:z,workflowNodeOptions:B,workspaceRef:ge}){let _e=()=>l&&u?(0,Z.jsx)(j,{agent:u,onClose:b}):e?(0,Z.jsx)(k,{onOpenDetails:I}):(0,Z.jsx)(A,{}),V=e?he.get(e)??null:null;return(0,Z.jsxs)(`div`,{ref:ge,className:`relative isolate flex h-full overflow-hidden rounded-xl border border-border bg-surface-overlay shadow-md [contain:paint]`,children:[(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,Z.jsxs)(`div`,{className:`relative flex min-w-0 flex-1 flex-col`,children:[(0,Z.jsx)(`div`,{className:`relative z-30 border-b border-border bg-background/45 backdrop-blur-md`,children:(0,Z.jsxs)(`div`,{className:`pointer-events-auto relative z-10 flex items-center gap-1.5 overflow-x-auto px-3 py-2.5 pr-14 scrollbar-none`,children:[Array.from(he.values()).map(t=>(0,Z.jsxs)(`div`,{className:`group relative min-w-[120px] max-w-[220px] shrink-0`,children:[(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>pe(t.id),onAuxClick:e=>{e.button===1&&(e.preventDefault(),M(t.id,t.title,t.node_count))},className:w(`relative h-8 w-full justify-start rounded-md border-b-2 px-3 pr-12 text-left text-[13px] font-medium transition-[color,border-color,background-color] duration-200`,e===t.id?`border-primary text-foreground`:`border-transparent text-muted-foreground hover:bg-accent/25 hover:text-foreground`),children:(0,Z.jsx)(`div`,{className:`truncate leading-tight`,children:t.title})}),e===t.id?(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`icon-xs`,title:`Duplicate workflow`,"aria-label":`Duplicate ${t.title}`,onClick:e=>{e.stopPropagation(),N()},className:`absolute right-6 top-1/2 z-20 size-5 -translate-y-1/2 rounded-sm p-1 text-foreground/70 transition-all duration-200 hover:bg-accent/45 hover:text-foreground`,children:(0,Z.jsx)(p,{className:`size-3`})}):null,(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`icon-xs`,title:`Delete workflow`,"aria-label":`Delete ${t.title}`,onClick:e=>{e.stopPropagation(),M(t.id,t.title,t.node_count)},className:w(`absolute right-1.5 top-1/2 z-20 size-5 -translate-y-1/2 rounded-sm p-1 transition-all duration-200 hover:bg-accent/45 hover:text-foreground`,e===t.id?`text-foreground/70 opacity-100`:`text-muted-foreground/60 opacity-0 group-hover:opacity-100`),children:(0,Z.jsx)(C,{className:`size-3`})})]},t.id)),(0,Z.jsx)(F,{type:`button`,variant:`ghost`,size:`icon-sm`,"aria-label":`Create workflow`,onClick:D,className:`shrink-0 rounded-md text-muted-foreground transition-all duration-200 hover:bg-accent/45 hover:text-foreground`,children:(0,Z.jsx)(S,{className:`size-4`})})]})}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-0 z-0`,style:{background:`radial-gradient(circle at 14% 10%, var(--shell-spotlight-primary), transparent 24%), linear-gradient(180deg, color-mix(in srgb, var(--foreground) 1%, transparent), transparent 22%)`}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-y-0 right-0 z-10 w-12 bg-gradient-to-l from-background/28 to-transparent`}),(0,Z.jsxs)(`div`,{className:`relative flex-1`,children:[r===`graph`?(0,Z.jsx)(ut,{ref:o,loadingRoles:g,onConnectModeChange:T,onCreateConnection:a.createConnection,onCreateLinkedAgent:a.createLinkedAgent,onCreateStandaloneAgent:a.createStandaloneAgent,onDeleteAgent:a.deleteAgent,onDeleteConnection:a.deleteConnection,onInsertAgentBetween:a.insertAgentBetween,onOpenConnectDialog:ae,roles:de}):(0,Z.jsxs)(`div`,{className:`flex h-full flex-col p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-[11px] font-semibold text-muted-foreground`,children:`Workflow JSON`}),(0,Z.jsx)(`p`,{className:`mt-1 text-[13px] text-muted-foreground`,children:`Edit the formal definition shared by the graph view.`})]}),(0,Z.jsxs)(F,{onClick:oe,disabled:!e||ce===`save-definition`,children:[(0,Z.jsx)(v,{className:`mr-1 size-4`}),ce===`save-definition`?`Saving...`:`Save JSON`]})]}),(0,Z.jsx)(`textarea`,{value:n,onChange:e=>ie(e.target.value),className:`h-full min-h-0 w-full resize-none rounded-xl border border-border bg-background/40 p-4 font-mono text-[12px] leading-6 text-foreground outline-none transition-[border-color,box-shadow] focus:border-ring focus:ring-[3px] focus:ring-ring/50`,spellCheck:!1})]}),(0,Z.jsxs)(`div`,{className:w(`absolute top-4 z-40 flex max-w-[calc(100%-2.5rem)] flex-wrap items-center gap-1.5`,s?`left-14`:`left-4`),children:[(0,Z.jsxs)(re,{tone:`primary`,children:[(0,Z.jsx)(y,{className:w(`size-3.5 shrink-0`,t?`text-graph-status-idle/88`:`text-graph-status-initializing/38`)}),(0,Z.jsx)(`span`,{className:`whitespace-nowrap`,children:t?`Live`:`Reconnecting`})]}),V?(0,Z.jsxs)(re,{children:[V.node_count??V.definition.nodes.length,` `,`nodes`]}):null]}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-x-3 bottom-4 z-40 flex justify-center`,children:(0,Z.jsxs)(`div`,{"data-testid":`workspace-toolbar`,className:`pointer-events-auto inline-flex max-w-full items-center overflow-x-auto rounded-xl border border-border bg-surface-overlay/92 p-0.5 shadow-sm scrollbar-none`,children:[(0,Z.jsxs)(E,{disabled:!e||!a.canUndo(e),onClick:()=>{a.undo(e)},children:[(0,Z.jsx)(f,{className:`size-4 opacity-70`}),`Undo`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e||!a.canRedo(e),onClick:()=>{a.redo(e)},children:[(0,Z.jsx)(_,{className:`size-4 opacity-70`}),`Redo`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e,active:r===`graph`,onClick:()=>P(`graph`),children:[(0,Z.jsx)(d,{className:`size-4 opacity-70`}),`Graph`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e,active:r===`json`,onClick:()=>P(`json`),children:[(0,Z.jsx)(h,{className:`size-4 opacity-70`}),`JSON`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e,onClick:te,children:[(0,Z.jsx)(S,{className:`size-4 opacity-70`}),`Add Node`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e||B.length<2,active:i,onClick:ae,children:[(0,Z.jsx)(ee,{className:`size-4 opacity-70`}),`Connect Ports`]}),(0,Z.jsx)(O,{}),(0,Z.jsxs)(E,{disabled:!e,onClick:N,children:[(0,Z.jsx)(p,{className:`size-4 opacity-70`}),`Duplicate`]})]})})]}),(0,Z.jsx)(`div`,{className:`absolute bottom-4 right-4 z-30 sm:bottom-5 sm:right-5`,children:(0,Z.jsx)(ne,{expanded:se,onClick:z})})]}),(0,Z.jsx)(L,{initial:!1,children:se?s?[(0,Z.jsx)(x.button,{type:`button`,"aria-label":`Close workspace panel`,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.18},className:`absolute inset-0 z-10 bg-background/40 backdrop-blur-[1px]`,onClick:z},`workspace-panel-backdrop`),(0,Z.jsxs)(x.aside,{initial:{opacity:0,x:18},animate:{opacity:1,x:0},exit:{opacity:0,x:18},transition:{duration:.22,ease:[.16,1,.3,1]},className:`absolute inset-y-2.5 right-2.5 z-20 shrink-0 overflow-hidden rounded-xl border border-border bg-surface-overlay shadow-md`,style:{width:`${ue}px`},children:[(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:w(`pointer-events-none absolute inset-0 z-20 border transition-[opacity,border-color,box-shadow] duration-300`,!R&&m?`animate-pulse border-ring/25 opacity-100 shadow-lg shadow-ring/10`:`border-transparent opacity-0`)}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,Z.jsx)(`div`,{className:`flex h-full flex-col overflow-hidden`,children:(0,Z.jsxs)(`div`,{className:`relative flex-1 overflow-hidden`,children:[(0,Z.jsx)(x.div,{animate:{opacity:+!R,x:R?-8:0},transition:{duration:.15},className:w(`absolute inset-0 flex h-full flex-col`,R&&`pointer-events-none`),"aria-hidden":R?!0:void 0,children:_e()}),(0,Z.jsx)(L,{children:R?(0,Z.jsx)(x.div,{initial:{opacity:0,x:10},animate:{opacity:1,x:0},exit:{opacity:0,x:10},transition:{duration:.15},className:`absolute inset-0 flex h-full flex-col bg-background/42`,children:(0,Z.jsx)(j,{agent:R,onClose:()=>fe(null)})},R.id):null})]})})]},`workspace-panel-sheet`)]:(0,Z.jsxs)(x.aside,{initial:{width:0,opacity:0},animate:{width:ue,opacity:1},exit:{width:0,opacity:0},transition:{duration:.25,ease:[.16,1,.3,1]},className:`relative z-20 shrink-0 border-l border-border bg-surface-overlay shadow-md`,children:[(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:w(`pointer-events-none absolute inset-0 z-20 border transition-[opacity,border-color,box-shadow] duration-300`,!R&&m?`animate-pulse border-ring/25 opacity-100 shadow-lg shadow-ring/10`:`border-transparent opacity-0`)}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,Z.jsx)(le,{position:`left`,isDragging:c,onMouseDown:me}),(0,Z.jsx)(`div`,{className:`flex h-full flex-col overflow-hidden`,style:{width:`${ue}px`},children:(0,Z.jsxs)(`div`,{className:`relative flex-1 overflow-hidden`,children:[(0,Z.jsx)(x.div,{animate:{opacity:+!R,x:R?-8:0},transition:{duration:.15},className:w(`absolute inset-0 flex h-full flex-col`,R&&`pointer-events-none`),"aria-hidden":R?!0:void 0,children:_e()}),(0,Z.jsx)(L,{children:R?(0,Z.jsx)(x.div,{initial:{opacity:0,x:10},animate:{opacity:1,x:0},exit:{opacity:0,x:10},transition:{duration:.15},className:`absolute inset-0 flex h-full flex-col bg-background/42`,children:(0,Z.jsx)(j,{agent:R,onClose:()=>fe(null)})},R.id):null})]})})]},`workspace-panel-docked`):null})]})}function pt(e){return{undo:[...e?.undo??[]],redo:[...e?.redo??[]]}}function mt(e){let t=e?.trim()??``;return t.length>0?t:void 0}function ht(){let e=(0,$.useRef)(new Map),[t,n]=(0,$.useState)(0),r=(0,$.useCallback)(()=>{n(e=>e+1)},[]),i=(0,$.useCallback)((t,n)=>{let i=pt(e.current.get(t));i.undo.push(n),i.redo=[],e.current.set(t,i),r()},[r]),a=(0,$.useCallback)(async({tabId:e,nodeType:t=`agent`,roleName:n,name:r})=>{let a=mt(r),o=(await V(e,{node_type:t,role_name:n,name:a})).id;return i(e,{undo:async()=>{await N(e,o)},redo:async()=>{o=(await V(e,{node_type:t,role_name:n,name:a})).id}}),o},[i]),o=(0,$.useCallback)(async({tabId:e,anchorNodeId:t,roleName:n,name:r})=>{let a=mt(r),o=(await V(e,{node_type:`agent`,role_name:n,name:a})).id;try{await M(e,{fromNodeId:t,toNodeId:o})}catch(t){throw await N(e,o).catch(()=>void 0),t}return i(e,{undo:async()=>{await N(e,o)},redo:async()=>{o=(await V(e,{node_type:`agent`,role_name:n,name:a})).id,await M(e,{fromNodeId:t,toNodeId:o})}}),o},[i]),s=(0,$.useCallback)(async(e,t,n,r=`out`,a=`in`)=>{let o=await M(e,{fromNodeId:t,fromPortKey:r,toNodeId:n,toPortKey:a});i(e,{undo:async()=>{await P(e,{edgeId:o.id})},redo:async()=>{await M(e,{fromNodeId:t,fromPortKey:r,toNodeId:n,toPortKey:a})}})},[i]),c=(0,$.useCallback)(async(e,t,n,r=`out`,a=`in`)=>{await P(e,{fromNodeId:t,fromPortKey:r,toNodeId:n,toPortKey:a}),i(e,{undo:async()=>{await M(e,{fromNodeId:t,fromPortKey:r,toNodeId:n,toPortKey:a})},redo:async()=>{await P(e,{fromNodeId:t,fromPortKey:r,toNodeId:n,toPortKey:a})}})},[i]),l=(0,$.useCallback)(async({tabId:e,node:t,tabAgents:n})=>{let r=Array.from(new Set([...t.connections].filter(e=>n.some(t=>t.id===e)))),a=mt(t.name),o=t.role_name?.trim()??``,s=t.id;await N(e,s),i(e,{undo:async()=>{s=(await V(e,{node_type:t.node_type,role_name:o||void 0,name:a})).id;for(let t of r)await M(e,{fromNodeId:t,toNodeId:s})},redo:async()=>{await N(e,s)}})},[i]),u=(0,$.useCallback)(async({tabId:e,sourceNodeId:t,targetNodeId:n,roleName:r,name:a})=>{let o=mt(a),s=null;await P(e,{fromNodeId:t,toNodeId:n});try{s=(await V(e,{node_type:`agent`,role_name:r,name:o})).id,await M(e,{fromNodeId:t,toNodeId:s}),await M(e,{fromNodeId:s,toNodeId:n})}catch(r){throw s&&await N(e,s).catch(()=>void 0),await M(e,{fromNodeId:t,toNodeId:n}).catch(()=>void 0),r}return i(e,{undo:async()=>{s&&(await N(e,s),await M(e,{fromNodeId:t,toNodeId:n}))},redo:async()=>{await P(e,{fromNodeId:t,toNodeId:n}),s=(await V(e,{node_type:`agent`,role_name:r,name:o})).id,await M(e,{fromNodeId:t,toNodeId:s}),await M(e,{fromNodeId:s,toNodeId:n})}}),s},[i]),d=(0,$.useCallback)(t=>!!(t&&(e.current.get(t)?.undo.length??0)>0),[]),f=(0,$.useCallback)(t=>!!(t&&(e.current.get(t)?.redo.length??0)>0),[]),p=(0,$.useCallback)(async t=>{if(!t)return!1;let n=pt(e.current.get(t)),i=n.undo.pop();return i?(await i.undo(),n.redo.push(i),e.current.set(t,n),r(),!0):!1},[r]),m=(0,$.useCallback)(async t=>{if(!t)return!1;let n=pt(e.current.get(t)),i=n.redo.pop();return i?(await i.redo(),n.undo.push(i),e.current.set(t,n),r(),!0):!1},[r]);return(0,$.useMemo)(()=>({canRedo:f,canUndo:d,createConnection:s,createLinkedAgent:o,createStandaloneAgent:e=>a({tabId:e.tabId,nodeType:`agent`,roleName:e.roleName,name:e.name}),createStandaloneNode:a,deleteAgent:l,deleteConnection:c,insertAgentBetween:u,redo:m,revision:t,undo:p}),[f,d,s,o,a,c,l,u,m,t,p])}var gt=`workspace-panel-width`,_t=296,vt=300,yt=960,bt=.34,xt=448,St=300;function Ct(e){return`${e.key} · ${e.kind}`}function wt(){let{agents:e}=de(),{tabs:t}=ce(),{connected:n}=me(),{activeToolCalls:r}=he(),{streamingDeltas:i}=fe(),{activeTabId:a,selectedAgentId:o,selectAgent:s,setActiveTabId:c}=_e(),[l,u]=(0,$.useState)(!0),[d,f]=(0,$.useState)(`chat`),[p,h]=(0,$.useState)(`graph`),g=B(`(max-width: 1180px)`),[_,v]=(0,$.useState)(null),[y,b]=(0,$.useState)(null),[x,S]=(0,$.useState)(``),[ee,C]=(0,$.useState)(!1),[w,T]=(0,$.useState)(``),[E,ne]=(0,$.useState)([]),[re,O]=(0,$.useState)(!1),[k,A]=(0,$.useState)(`agent`),[j,M]=(0,$.useState)(`Worker`),[N,P]=(0,$.useState)(``),[F,I]=(0,$.useState)(``),[L,le]=(0,$.useState)(``),[z,V]=(0,$.useState)(``),[H,ve]=(0,$.useState)(``),[U,ye]=(0,$.useState)(null),[be,Se]=(0,$.useState)(JSON.stringify(oe,null,2)),W=(0,$.useRef)(null),G=(0,$.useRef)(null),K=(0,$.useRef)(null),q=ht(),[Ce,we]=(0,$.useState)(!1),[Te,Ee]=ue(gt,xt,_t,yt),De=(0,$.useCallback)(e=>{let t=K.current?.clientWidth??(typeof window>`u`?e:window.innerWidth),n=Math.max(_t,t-vt);Ee(Math.min(e,n))},[Ee]),{isDragging:Oe,startDrag:ke}=ge(Te,De,`left`);(0,$.useLayoutEffect)(()=>{if(pe(gt))return;let e=K.current?.clientWidth;e&&De(e*bt)},[De]),(0,$.useEffect)(()=>{let e=K.current;if(!e)return;let t=new ResizeObserver(()=>{De(Te)});return t.observe(e),()=>{t.disconnect()}},[Te,De]),(0,$.useEffect)(()=>{let e=W.current;W.current=g,e!==null&&!e&&g&&u(!1)},[g]),(0,$.useEffect)(()=>{let e=!1;return O(!0),te().then(t=>{e||ne(t)}).catch(()=>{e||m.error(`Failed to load roles`)}).finally(()=>{e||O(!1)}),()=>{e=!0}},[]);let J=o?e.get(o)??null:null,Y=a?t.get(a)??null:null,X=(0,$.useMemo)(()=>Array.from(e.values()).filter(e=>e.node_type!==`assistant`&&e.tab_id===a),[a,e]),Ae=(0,$.useMemo)(()=>X.filter(e=>!e.is_leader),[X]),Z=(0,$.useMemo)(()=>Y?.definition.nodes??[],[Y?.definition.nodes]),Q=(0,$.useMemo)(()=>Z.map(e=>({id:e.id,label:xe({name:typeof e.config.name==`string`?e.config.name:null,roleName:typeof e.config.role_name==`string`?e.config.role_name:null,nodeType:e.type,isLeader:!1})})),[Z]),je=(0,$.useMemo)(()=>Z.find(e=>e.id===F)??null,[F,Z]),Me=(0,$.useMemo)(()=>Z.find(e=>e.id===z)??null,[z,Z]),Ne=(0,$.useMemo)(()=>(je?.outputs??[]).map(e=>({key:e.key,label:Ct(e)})),[je]),Pe=(0,$.useMemo)(()=>(Me?.inputs??[]).map(e=>({key:e.key,label:Ct(e)})),[Me]),Fe=(0,$.useMemo)(()=>E.find(e=>e.name===j)??null,[j,E]),Ie=l||!!J,Le=(0,$.useMemo)(()=>{if(!g)return Te;let e=K.current?.clientWidth??(typeof window>`u`?Te:window.innerWidth);return Math.min(Te,Math.max(St,e-24))},[g,Te]),Re=(0,$.useMemo)(()=>D(e,Y),[Y,e]),ze=Re?.id??Y?.leader_id??null,Be=d===`detail`&&Re!==null,Ve=(0,$.useMemo)(()=>{let e=ze?i.get(ze)??[]:[];return n&&!!(ze&&(Re?.state===`running`||Re?.state===`sleeping`||r.has(ze)||e.length>0))},[r,n,ze,Re,i]);(0,$.useEffect)(()=>{J&&J.tab_id!==null&&J.tab_id!==a&&s(null)},[a,s,J]),(0,$.useEffect)(()=>{Se(JSON.stringify(Y?.definition??oe,null,2))},[Y?.definition]),(0,$.useEffect)(()=>{Ne.some(e=>e.key===L)||le(Ne[0]?.key??``)},[L,Ne]),(0,$.useEffect)(()=>{Pe.some(e=>e.key===H)||ve(Pe[0]?.key??``)},[H,Pe]),(0,$.useEffect)(()=>{let e=e=>{if(!(e.metaKey||e.ctrlKey)||e.key.toLowerCase()!==`z`)return;let t=e.target;if(!(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement||t?.isContentEditable||_!==null)){if(e.preventDefault(),e.shiftKey){q.redo(a).catch(()=>void 0);return}q.undo(a).catch(()=>void 0)}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_,a,q]);let He=(0,$.useCallback)(()=>{u(!0),f(`detail`)},[]),Ue=(0,$.useCallback)(()=>{f(`chat`)},[]),We=(0,$.useCallback)(()=>{if(Ie){o&&s(null),u(!1);return}u(!0)},[Ie,s,o]),Ge=(0,$.useCallback)(()=>{S(``),C(!1),T(``),v(`create-tab`)},[]),Ke=(0,$.useCallback)(async()=>{let e=x.trim();if(e){b(`create-tab`);try{c((await se(e,ee,w.split(`
3
+ `).map(e=>e.trim()).filter(Boolean))).id),v(null),S(``),C(!1),T(``)}catch(e){m.error(e instanceof Error?e.message:`Failed to create workflow`)}finally{b(null)}}},[ee,x,w,c]),qe=(0,$.useCallback)(async()=>{if(!a){m.error(`Create or select a workflow first`);return}b(`duplicate-tab`);try{c((await R(a)).id)}catch(e){m.error(e instanceof Error?e.message:`Failed to duplicate workflow`)}finally{b(null)}},[a,c]),Je=(0,$.useCallback)(()=>{if(!a){m.error(`Create or select a workflow first`);return}A(`agent`),M(`Worker`),P(``),v(`create-node`)},[a]),Ye=(0,$.useCallback)(async()=>{if(!a)return;let e=N.trim()||void 0;b(`create-node`);try{if(k===`agent`){let t=Fe?.name??``;if(!t)return;await q.createStandaloneNode({tabId:a,nodeType:`agent`,roleName:t,name:e})}else await q.createStandaloneNode({tabId:a,nodeType:k,name:e});v(null),A(`agent`),M(`Worker`),P(``)}catch(e){m.error(e instanceof Error?e.message:`Failed to create node`)}finally{b(null)}},[a,N,k,q,Fe?.name]),Xe=(0,$.useCallback)((e,t,n)=>{ye({id:e,title:t,nodeCount:n})},[]),Ze=(0,$.useCallback)(async()=>{if(U){b(`delete-tab`);try{await ae(U.id),ye(null)}catch(e){m.error(e instanceof Error?e.message:`Failed to delete workflow`)}finally{b(null)}}},[U]),Qe=(0,$.useCallback)(()=>{if(!a){m.error(`Create or select a workflow first`);return}if(Q.length<2){m.error(`Add at least two nodes before creating an edge`);return}let e=Q[0]?.id??``,t=Q.find(t=>t.id!==e)?.id??``;!e||!t||(I(e),V(t),v(`connect-ports`))},[a,Q]);return{activeDialog:_,activeTab:Y,activeTabId:a,connected:n,connectSourceId:F,connectSourcePortKey:L,connectTargetId:z,connectTargetPortKey:H,createNodeName:N,createNodeRoleName:j,createNodeType:k,createTabAllowNetwork:ee,createTabTitle:x,createTabWriteDirs:w,definitionDraft:be,deleteTabTarget:U,editorMode:p,graphConnectMode:Ce,graphHistory:q,graphRef:G,handleCloseLeaderDetails:Ue,handleConnectPorts:(0,$.useCallback)(async()=>{if(!(!a||!F||!L||!z||!H)){b(`connect-ports`);try{await q.createConnection(a,F,z,L,H),v(null)}catch(e){m.error(e instanceof Error?e.message:`Failed to connect ports`)}finally{b(null)}}},[a,F,L,z,H,q]),handleCreateNode:Ye,handleCreateTab:Ke,handleDeleteTab:Ze,handleDuplicateTab:qe,handleOpenLeaderDetails:He,handleSaveDefinition:(0,$.useCallback)(async()=>{if(!a)return;let e;try{e=JSON.parse(be)}catch{m.error(`Workflow JSON is invalid`);return}if(!e||typeof e!=`object`){m.error(`Workflow JSON must be an object`);return}b(`save-definition`);try{await ie(a,e),m.success(`Workflow JSON saved`)}catch(e){m.error(e instanceof Error?e.message:`Failed to save workflow definition`)}finally{b(null)}},[a,be]),isCompactWorkspace:g,isDragging:Oe,leaderDetailVisible:Be,leaderNode:Re,leaderPanelRunning:Ve,loadingRoles:re,openConnectDialog:Qe,openCreateNodeDialog:Je,openCreateTabDialog:Ge,panelVisible:Ie,pendingAction:y,regularTabAgents:Ae,requestDeleteTab:Xe,resolvedPanelWidth:Le,roles:E,selectAgent:s,selectedAgent:J,selectedCreateNodeRole:Fe,setActiveDialog:v,setActiveTabId:c,setConnectSourceId:I,setConnectSourcePortKey:le,setConnectTargetId:V,setConnectTargetPortKey:ve,setCreateNodeName:P,setCreateNodeRoleName:M,setCreateNodeType:A,setCreateTabAllowNetwork:C,setCreateTabTitle:S,setCreateTabWriteDirs:T,setDefinitionDraft:Se,setDeleteTabTarget:ye,setEditorMode:h,setGraphConnectMode:we,sourcePortOptions:Ne,startDrag:ke,tabs:t,targetPortOptions:Pe,togglePanel:We,workflowNodeOptions:Q,workspaceRef:K}}function Tt(){let{activeDialog:e,activeTab:t,activeTabId:n,connected:r,connectSourceId:i,connectSourcePortKey:a,connectTargetId:o,connectTargetPortKey:s,createNodeName:c,createNodeRoleName:l,createNodeType:u,createTabAllowNetwork:d,createTabTitle:f,createTabWriteDirs:p,definitionDraft:m,deleteTabTarget:h,editorMode:g,graphConnectMode:_,graphHistory:v,graphRef:y,handleCloseLeaderDetails:b,handleConnectPorts:x,handleCreateNode:S,handleCreateTab:ee,handleDeleteTab:C,handleDuplicateTab:w,handleOpenLeaderDetails:T,handleSaveDefinition:te,isCompactWorkspace:E,isDragging:D,leaderDetailVisible:ne,leaderNode:re,leaderPanelRunning:O,loadingRoles:k,openConnectDialog:A,openCreateNodeDialog:j,openCreateTabDialog:ie,panelVisible:M,pendingAction:N,regularTabAgents:P,requestDeleteTab:F,resolvedPanelWidth:I,roles:ae,selectAgent:oe,selectedAgent:se,selectedCreateNodeRole:L,setActiveDialog:ce,setActiveTabId:le,setConnectSourceId:ue,setConnectSourcePortKey:de,setConnectTargetId:fe,setConnectTargetPortKey:R,setCreateNodeName:pe,setCreateNodeRoleName:me,setCreateNodeType:he,setCreateTabAllowNetwork:z,setCreateTabTitle:B,setCreateTabWriteDirs:ge,setDefinitionDraft:_e,setDeleteTabTarget:V,setEditorMode:H,setGraphConnectMode:ve,sourcePortOptions:U,startDrag:ye,tabs:be,targetPortOptions:xe,togglePanel:Se,workflowNodeOptions:W,workspaceRef:G}=wt();return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(ft,{activeTabId:n,connected:r,definitionDraft:m,editorMode:g,graphConnectMode:_,graphHistory:v,graphRef:y,isCompactWorkspace:E,isDragging:D,leaderDetailVisible:ne,leaderNode:re,leaderPanelRunning:O,loadingRoles:k,onCloseLeaderDetails:b,onConnectModeChange:ve,onCreateNode:j,onCreateTab:ie,onDefinitionDraftChange:_e,onDeleteTab:F,onDuplicateTab:w,onEditorModeChange:H,onOpenLeaderDetails:T,onOpenConnectDialog:A,onSaveDefinition:te,panelVisible:M,pendingAction:N,regularTabAgents:P,resolvedPanelWidth:I,roles:ae,selectAgent:oe,selectedAgent:se,setActiveTabId:le,startDrag:ye,tabs:be,togglePanel:Se,workflowNodeOptions:W,sourcePortOptions:U,targetPortOptions:xe,workspaceRef:G}),(0,Z.jsx)(Pe,{open:e===`create-tab`,onOpenChange:e=>{e||ce(null)},pending:N===`create-tab`,title:f,onTitleChange:B,allowNetwork:d,onAllowNetworkChange:z,writeDirs:p,onWriteDirsChange:ge,onSubmit:()=>void ee()}),(0,Z.jsx)(Ie,{open:e===`create-node`,onOpenChange:e=>{e||ce(null)},pending:N===`create-node`,activeTabTitle:t?.title??null,nodeType:u,onNodeTypeChange:he,selectedRole:L,selectedRoleName:l,onRoleNameChange:me,roles:ae,loadingRoles:k,nodeName:c,onNodeNameChange:pe,onSubmit:()=>void S(),submitDisabled:!n||N===`create-node`||u===`agent`&&!L}),(0,Z.jsx)(Le,{open:e===`connect-ports`,onOpenChange:e=>{e||ce(null)},pending:N===`connect-ports`,activeTabTitle:t?.title??null,nodeOptions:W,fromNodeId:i,fromPortKey:a,toNodeId:o,toPortKey:s,fromPortOptions:U,toPortOptions:xe,onFromNodeChange:ue,onFromPortChange:de,onToNodeChange:fe,onToPortChange:R,onSubmit:()=>void x()}),(0,Z.jsx)(Re,{open:!!h,onOpenChange:e=>{e||V(null)},pending:N===`delete-tab`,target:h,onDelete:()=>void C()})]})}export{Tt as HomePage};