flowent 0.0.5 → 0.0.7

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 (265) hide show
  1. package/README.md +1 -1
  2. package/backend/README.md +1 -1
  3. package/backend/pyproject.toml +1 -1
  4. package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
  5. package/backend/src/flowent/__pycache__/_version.cpython-313.pyc +0 -0
  6. package/backend/src/flowent/__pycache__/access.cpython-313.pyc +0 -0
  7. package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
  8. package/backend/src/flowent/__pycache__/assistant_commands.cpython-313.pyc +0 -0
  9. package/backend/src/flowent/__pycache__/cli.cpython-313.pyc +0 -0
  10. package/backend/src/flowent/__pycache__/config.cpython-313.pyc +0 -0
  11. package/backend/src/flowent/__pycache__/events.cpython-313.pyc +0 -0
  12. package/backend/src/flowent/__pycache__/graph_runtime.cpython-313.pyc +0 -0
  13. package/backend/src/flowent/__pycache__/graph_service.cpython-313.pyc +0 -0
  14. package/backend/src/flowent/__pycache__/image_assets.cpython-313.pyc +0 -0
  15. package/backend/src/flowent/__pycache__/logging.cpython-313.pyc +0 -0
  16. package/backend/src/flowent/__pycache__/main.cpython-313.pyc +0 -0
  17. package/backend/src/flowent/__pycache__/model_metadata.cpython-313.pyc +0 -0
  18. package/backend/src/flowent/__pycache__/network.cpython-313.pyc +0 -0
  19. package/backend/src/flowent/__pycache__/observability_service.cpython-313.pyc +0 -0
  20. package/backend/src/flowent/__pycache__/registry.cpython-313.pyc +0 -0
  21. package/backend/src/flowent/__pycache__/role_management.cpython-313.pyc +0 -0
  22. package/backend/src/flowent/__pycache__/runtime.cpython-313.pyc +0 -0
  23. package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
  24. package/backend/src/flowent/__pycache__/security.cpython-313.pyc +0 -0
  25. package/backend/src/flowent/__pycache__/settings.cpython-313.pyc +0 -0
  26. package/backend/src/flowent/__pycache__/settings_management.cpython-313.pyc +0 -0
  27. package/backend/src/flowent/__pycache__/state_db.cpython-313.pyc +0 -0
  28. package/backend/src/flowent/__pycache__/workspace_store.cpython-313.pyc +0 -0
  29. package/backend/src/flowent/agent.py +91 -8
  30. package/backend/src/flowent/channels/__pycache__/__init__.cpython-313.pyc +0 -0
  31. package/backend/src/flowent/channels/__pycache__/telegram.cpython-313.pyc +0 -0
  32. package/backend/src/flowent/graph_service.py +3 -110
  33. package/backend/src/flowent/models/__pycache__/__init__.cpython-313.pyc +0 -0
  34. package/backend/src/flowent/models/__pycache__/agent.cpython-313.pyc +0 -0
  35. package/backend/src/flowent/models/__pycache__/base.cpython-313.pyc +0 -0
  36. package/backend/src/flowent/models/__pycache__/blueprint.cpython-313.pyc +0 -0
  37. package/backend/src/flowent/models/__pycache__/content.cpython-313.pyc +0 -0
  38. package/backend/src/flowent/models/__pycache__/delta.cpython-313.pyc +0 -0
  39. package/backend/src/flowent/models/__pycache__/event.cpython-313.pyc +0 -0
  40. package/backend/src/flowent/models/__pycache__/graph.cpython-313.pyc +0 -0
  41. package/backend/src/flowent/models/__pycache__/history.cpython-313.pyc +0 -0
  42. package/backend/src/flowent/models/__pycache__/llm.cpython-313.pyc +0 -0
  43. package/backend/src/flowent/models/__pycache__/message.cpython-313.pyc +0 -0
  44. package/backend/src/flowent/models/__pycache__/tab.cpython-313.pyc +0 -0
  45. package/backend/src/flowent/models/__pycache__/todo.cpython-313.pyc +0 -0
  46. package/backend/src/flowent/prompts/__pycache__/__init__.cpython-313.pyc +0 -0
  47. package/backend/src/flowent/prompts/__pycache__/common.cpython-313.pyc +0 -0
  48. package/backend/src/flowent/prompts/__pycache__/steward.cpython-313.pyc +0 -0
  49. package/backend/src/flowent/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  50. package/backend/src/flowent/providers/__pycache__/anthropic.cpython-313.pyc +0 -0
  51. package/backend/src/flowent/providers/__pycache__/base_url.cpython-313.pyc +0 -0
  52. package/backend/src/flowent/providers/__pycache__/configuration.cpython-313.pyc +0 -0
  53. package/backend/src/flowent/providers/__pycache__/content.cpython-313.pyc +0 -0
  54. package/backend/src/flowent/providers/__pycache__/errors.cpython-313.pyc +0 -0
  55. package/backend/src/flowent/providers/__pycache__/gateway.cpython-313.pyc +0 -0
  56. package/backend/src/flowent/providers/__pycache__/headers.cpython-313.pyc +0 -0
  57. package/backend/src/flowent/providers/__pycache__/management.cpython-313.pyc +0 -0
  58. package/backend/src/flowent/providers/__pycache__/openai.cpython-313.pyc +0 -0
  59. package/backend/src/flowent/providers/__pycache__/openai_responses.cpython-313.pyc +0 -0
  60. package/backend/src/flowent/providers/__pycache__/registry.cpython-313.pyc +0 -0
  61. package/backend/src/flowent/providers/__pycache__/sse.cpython-313.pyc +0 -0
  62. package/backend/src/flowent/providers/__pycache__/thinking.cpython-313.pyc +0 -0
  63. package/backend/src/flowent/role_management.py +9 -6
  64. package/backend/src/flowent/routes/__init__.py +0 -2
  65. package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
  66. package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
  67. package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
  68. package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
  69. package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
  70. package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
  71. package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
  72. package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
  73. package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
  74. package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
  75. package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
  76. package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
  77. package/backend/src/flowent/routes/assistant.py +3 -0
  78. package/backend/src/flowent/routes/nodes.py +11 -1
  79. package/backend/src/flowent/routes/settings.py +169 -118
  80. package/backend/src/flowent/routes/tabs.py +0 -12
  81. package/backend/src/flowent/runtime.py +0 -5
  82. package/backend/src/flowent/security.py +1 -21
  83. package/backend/src/flowent/settings.py +15 -421
  84. package/backend/src/flowent/settings_management.py +260 -164
  85. package/backend/src/flowent/state_db.py +2 -14
  86. package/backend/src/flowent/static/assets/AssistantPage-BW7XAd9I.js +1 -0
  87. package/backend/src/flowent/static/assets/ChannelsPage-tCJHgt6m.js +1 -0
  88. package/backend/src/flowent/static/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
  89. package/backend/src/flowent/static/assets/PromptsPage-C3Sxn2D7.js +1 -0
  90. package/backend/src/flowent/static/assets/ProvidersPage-BfmdXmNt.js +3 -0
  91. package/backend/src/flowent/static/assets/RolesPage-DET8wO4r.js +1 -0
  92. package/backend/src/flowent/static/assets/SettingsPage-D-g3deMm.js +3 -0
  93. package/backend/src/flowent/static/assets/ToolsPage-CDmtE2g4.js +1 -0
  94. package/backend/src/flowent/static/assets/WorkspacePage-AZsJ0sD0.js +3 -0
  95. package/backend/src/flowent/static/assets/WorkspacePanels-CteCjolX.js +1 -0
  96. package/backend/src/flowent/static/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
  97. package/backend/src/flowent/static/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
  98. package/backend/src/flowent/static/assets/index--o_0fv0N.css +1 -0
  99. package/backend/src/flowent/static/assets/index-C9HuekJm.js +10 -0
  100. package/backend/src/flowent/static/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
  101. package/backend/src/flowent/static/assets/providerTypes-DT3Ahwl_.js +1 -0
  102. package/backend/src/flowent/static/assets/roles-CuRT_chR.js +1 -0
  103. package/{dist/frontend/assets/select-D9SwnlXF.js → backend/src/flowent/static/assets/select-DCfeNu-F.js} +1 -1
  104. package/backend/src/flowent/static/assets/surface-pWwG5ogx.js +1 -0
  105. package/backend/src/flowent/static/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
  106. package/backend/src/flowent/static/assets/useAppRoute-FgSHBKhV.js +1 -0
  107. package/backend/src/flowent/static/index.html +3 -3
  108. package/backend/src/flowent/tools/__init__.py +2 -101
  109. package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  110. package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
  111. package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
  112. package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
  113. package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
  114. package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
  115. package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
  116. package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
  117. package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
  118. package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
  119. package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
  120. package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
  121. package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
  122. package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
  123. package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
  124. package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
  125. package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
  126. package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
  127. package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
  128. package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
  129. package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
  130. package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
  131. package/backend/src/flowent/tools/list_roles.py +2 -9
  132. package/backend/src/flowent/tools/manage_settings.py +134 -172
  133. package/backend/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  134. package/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  135. package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  136. package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
  137. package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
  138. package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
  139. package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
  140. package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
  141. package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
  142. package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
  143. package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
  144. package/backend/tests/integration/api/test_assistant_api.py +68 -0
  145. package/backend/tests/integration/api/test_meta_api.py +0 -1
  146. package/backend/tests/integration/api/test_nodes_api.py +73 -8
  147. package/backend/tests/integration/api/test_tabs_api.py +0 -114
  148. package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
  149. package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
  150. package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  151. package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
  152. package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
  153. package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
  154. package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
  155. package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  156. package/backend/tests/unit/agent/test_agent_public_api.py +0 -15
  157. package/backend/tests/unit/agent/test_agent_runtime.py +148 -2
  158. package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
  159. package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
  160. package/backend/tests/unit/prompts/__pycache__/test_prompts.cpython-313-pytest-9.0.3.pyc +0 -0
  161. package/backend/tests/unit/providers/__pycache__/test_anthropic_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  162. package/backend/tests/unit/providers/__pycache__/test_errors.cpython-313-pytest-9.0.3.pyc +0 -0
  163. package/backend/tests/unit/providers/__pycache__/test_extract_delta_parts.cpython-313-pytest-9.0.3.pyc +0 -0
  164. package/backend/tests/unit/providers/__pycache__/test_openai_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  165. package/backend/tests/unit/providers/__pycache__/test_openai_responses.cpython-313-pytest-9.0.3.pyc +0 -0
  166. package/backend/tests/unit/providers/__pycache__/test_provider_gateway.cpython-313-pytest-9.0.3.pyc +0 -0
  167. package/backend/tests/unit/providers/__pycache__/test_think_tag_parser.cpython-313-pytest-9.0.3.pyc +0 -0
  168. package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  169. package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
  170. package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  171. package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  172. package/backend/tests/unit/routes/test_prompts_routes.py +0 -22
  173. package/backend/tests/unit/routes/test_roles_routes.py +6 -2
  174. package/backend/tests/unit/routes/test_settings_routes.py +0 -19
  175. package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  176. package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
  177. package/backend/tests/unit/security/__pycache__/test_security.cpython-313-pytest-9.0.3.pyc +0 -0
  178. package/backend/tests/unit/settings/__pycache__/test_settings_roles.cpython-313-pytest-9.0.3.pyc +0 -0
  179. package/backend/tests/unit/settings/test_settings_roles.py +3 -51
  180. package/backend/tests/unit/test_cli.py +0 -22
  181. package/backend/tests/unit/test_state_sqlite_storage.py +27 -99
  182. package/backend/tests/unit/test_workspace_store.py +0 -3
  183. package/backend/tests/unit/tools/__pycache__/test_connect_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  184. package/backend/tests/unit/tools/__pycache__/test_create_agent_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  185. package/backend/tests/unit/tools/__pycache__/test_delete_tab_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  186. package/backend/tests/unit/tools/__pycache__/test_edit_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  187. package/backend/tests/unit/tools/__pycache__/test_exec_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  188. package/backend/tests/unit/tools/__pycache__/test_fetch_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  189. package/backend/tests/unit/tools/__pycache__/test_manage_prompts_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  190. package/backend/tests/unit/tools/__pycache__/test_manage_providers_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  191. package/backend/tests/unit/tools/__pycache__/test_manage_roles_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  192. package/backend/tests/unit/tools/__pycache__/test_manage_settings_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  193. package/backend/tests/unit/tools/__pycache__/test_read_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  194. package/backend/tests/unit/tools/__pycache__/test_set_permissions_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  195. package/backend/tests/unit/tools/__pycache__/test_todo_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  196. package/backend/tests/unit/tools/__pycache__/test_tool_registry.cpython-313-pytest-9.0.3.pyc +0 -0
  197. package/backend/tests/unit/tools/test_create_agent_tool.py +0 -32
  198. package/backend/tests/unit/tools/test_manage_prompts_tool.py +5 -30
  199. package/backend/tests/unit/tools/test_tool_registry.py +45 -40
  200. package/backend/uv.lock +1 -1
  201. package/dist/frontend/assets/AssistantPage-BW7XAd9I.js +1 -0
  202. package/dist/frontend/assets/ChannelsPage-tCJHgt6m.js +1 -0
  203. package/dist/frontend/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
  204. package/dist/frontend/assets/PromptsPage-C3Sxn2D7.js +1 -0
  205. package/dist/frontend/assets/ProvidersPage-BfmdXmNt.js +3 -0
  206. package/dist/frontend/assets/RolesPage-DET8wO4r.js +1 -0
  207. package/dist/frontend/assets/SettingsPage-D-g3deMm.js +3 -0
  208. package/dist/frontend/assets/ToolsPage-CDmtE2g4.js +1 -0
  209. package/dist/frontend/assets/WorkspacePage-AZsJ0sD0.js +3 -0
  210. package/dist/frontend/assets/WorkspacePanels-CteCjolX.js +1 -0
  211. package/dist/frontend/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
  212. package/dist/frontend/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
  213. package/dist/frontend/assets/index--o_0fv0N.css +1 -0
  214. package/dist/frontend/assets/index-C9HuekJm.js +10 -0
  215. package/dist/frontend/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
  216. package/dist/frontend/assets/providerTypes-DT3Ahwl_.js +1 -0
  217. package/dist/frontend/assets/roles-CuRT_chR.js +1 -0
  218. package/{backend/src/flowent/static/assets/select-D9SwnlXF.js → dist/frontend/assets/select-DCfeNu-F.js} +1 -1
  219. package/dist/frontend/assets/surface-pWwG5ogx.js +1 -0
  220. package/dist/frontend/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
  221. package/dist/frontend/assets/useAppRoute-FgSHBKhV.js +1 -0
  222. package/dist/frontend/index.html +3 -3
  223. package/package.json +1 -1
  224. package/backend/src/flowent/__pycache__/mcp_service.cpython-313.pyc +0 -0
  225. package/backend/src/flowent/mcp_service.py +0 -1918
  226. package/backend/src/flowent/routes/__pycache__/mcp.cpython-313.pyc +0 -0
  227. package/backend/src/flowent/routes/mcp.py +0 -125
  228. package/backend/src/flowent/static/assets/AssistantPage-VBohhz4d.js +0 -1
  229. package/backend/src/flowent/static/assets/ChannelsPage-CIydPZA_.js +0 -1
  230. package/backend/src/flowent/static/assets/McpPage-CHPm2TPY.js +0 -7
  231. package/backend/src/flowent/static/assets/PromptsPage-CSmJ3sZg.js +0 -1
  232. package/backend/src/flowent/static/assets/ProvidersPage-sl2jeG4e.js +0 -3
  233. package/backend/src/flowent/static/assets/RolesPage-DCe7W6Km.js +0 -1
  234. package/backend/src/flowent/static/assets/SettingsPage-Bix9e63E.js +0 -3
  235. package/backend/src/flowent/static/assets/ToolsPage-favNkj5C.js +0 -1
  236. package/backend/src/flowent/static/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  237. package/backend/src/flowent/static/assets/WorkspacePage-KuaDjt_D.js +0 -3
  238. package/backend/src/flowent/static/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  239. package/backend/src/flowent/static/assets/datetime-eJqd0V2S.js +0 -1
  240. package/backend/src/flowent/static/assets/index-Biio-CoI.js +0 -10
  241. package/backend/src/flowent/static/assets/index-CmQvO7sl.css +0 -1
  242. package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +0 -1
  243. package/backend/src/flowent/static/assets/surface-Bzr1FRG4.js +0 -1
  244. package/backend/src/flowent/static/assets/triState-DgLlKdRR.js +0 -1
  245. package/backend/src/flowent/tools/__pycache__/mcp.cpython-313.pyc +0 -0
  246. package/backend/src/flowent/tools/mcp.py +0 -199
  247. package/backend/tests/integration/api/__pycache__/test_mcp_api.cpython-313-pytest-9.0.3.pyc +0 -0
  248. package/backend/tests/integration/api/test_mcp_api.py +0 -116
  249. package/dist/frontend/assets/AssistantPage-VBohhz4d.js +0 -1
  250. package/dist/frontend/assets/ChannelsPage-CIydPZA_.js +0 -1
  251. package/dist/frontend/assets/McpPage-CHPm2TPY.js +0 -7
  252. package/dist/frontend/assets/PromptsPage-CSmJ3sZg.js +0 -1
  253. package/dist/frontend/assets/ProvidersPage-sl2jeG4e.js +0 -3
  254. package/dist/frontend/assets/RolesPage-DCe7W6Km.js +0 -1
  255. package/dist/frontend/assets/SettingsPage-Bix9e63E.js +0 -3
  256. package/dist/frontend/assets/ToolsPage-favNkj5C.js +0 -1
  257. package/dist/frontend/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  258. package/dist/frontend/assets/WorkspacePage-KuaDjt_D.js +0 -3
  259. package/dist/frontend/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  260. package/dist/frontend/assets/datetime-eJqd0V2S.js +0 -1
  261. package/dist/frontend/assets/index-Biio-CoI.js +0 -10
  262. package/dist/frontend/assets/index-CmQvO7sl.css +0 -1
  263. package/dist/frontend/assets/roles-BbIEIMeG.js +0 -1
  264. package/dist/frontend/assets/surface-Bzr1FRG4.js +0 -1
  265. package/dist/frontend/assets/triState-DgLlKdRR.js +0 -1
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  from dataclasses import dataclass
4
5
  from typing import Final
5
6
 
@@ -42,6 +43,26 @@ class ResolvedSettingsUpdate:
42
43
  event_log: EventLogSettings
43
44
 
44
45
 
46
+ @dataclass(frozen=True, slots=True)
47
+ class SettingsUpdateFieldNames:
48
+ assistant_role: str = "assistant.role_name"
49
+ assistant_allow_network: str = "assistant.allow_network"
50
+ assistant_write_dirs: str = "assistant.write_dirs"
51
+ leader_role: str = "leader.role_name"
52
+ working_dir: str = "working_dir"
53
+ retry_policy: str = "model.retry_policy"
54
+ timeout_ms: str = "model.timeout_ms"
55
+ max_retries: str = "model.max_retries"
56
+ retry_initial_delay_seconds: str = "model.retry_initial_delay_seconds"
57
+ retry_max_delay_seconds: str = "model.retry_max_delay_seconds"
58
+ retry_backoff_cap_retries: str = "model.retry_backoff_cap_retries"
59
+ input_image: str = "model.input_image"
60
+ output_image: str = "model.output_image"
61
+ structured_output: str = "model.structured_output"
62
+ context_window_tokens: str = "model.context_window_tokens"
63
+ auto_compact_token_limit: str = "model.auto_compact_token_limit"
64
+
65
+
45
66
  def serialize_manage_settings(settings: Settings) -> dict[str, object]:
46
67
  serialized = serialize_settings(settings)
47
68
  return {
@@ -71,6 +92,193 @@ def _resolve_role_name(
71
92
  return normalized_role_name
72
93
 
73
94
 
95
+ def _resolve_value[T](
96
+ current_value: T,
97
+ raw_value: object,
98
+ builder: Callable[..., T],
99
+ *,
100
+ field_name: str,
101
+ ) -> T:
102
+ if raw_value is MISSING:
103
+ return current_value
104
+ return builder(raw_value, field_name=field_name)
105
+
106
+
107
+ def _resolve_assistant_settings(
108
+ settings: Settings,
109
+ *,
110
+ next_working_dir: str,
111
+ assistant_role_name: str | None,
112
+ assistant_allow_network: object,
113
+ assistant_write_dirs: object,
114
+ field_names: SettingsUpdateFieldNames,
115
+ ) -> AssistantSettings:
116
+ return AssistantSettings(
117
+ role_name=_resolve_role_name(
118
+ settings,
119
+ current_role_name=settings.assistant.role_name,
120
+ next_role_name=assistant_role_name,
121
+ field_name=field_names.assistant_role,
122
+ ),
123
+ allow_network=_resolve_value(
124
+ settings.assistant.allow_network,
125
+ assistant_allow_network,
126
+ build_assistant_allow_network,
127
+ field_name=field_names.assistant_allow_network,
128
+ ),
129
+ write_dirs=(
130
+ list(settings.assistant.write_dirs)
131
+ if assistant_write_dirs is MISSING
132
+ else build_assistant_write_dirs(
133
+ assistant_write_dirs,
134
+ field_name=field_names.assistant_write_dirs,
135
+ base_dir=next_working_dir,
136
+ )
137
+ ),
138
+ )
139
+
140
+
141
+ def _resolve_leader_settings(
142
+ settings: Settings,
143
+ *,
144
+ leader_role_name: str | None,
145
+ field_names: SettingsUpdateFieldNames,
146
+ ) -> LeaderSettings:
147
+ return LeaderSettings(
148
+ role_name=_resolve_role_name(
149
+ settings,
150
+ current_role_name=settings.leader.role_name,
151
+ next_role_name=leader_role_name,
152
+ field_name=field_names.leader_role,
153
+ )
154
+ )
155
+
156
+
157
+ def _resolve_model_params(settings: Settings, model_params: object):
158
+ if model_params is MISSING:
159
+ return settings.model.params
160
+ return build_model_params_from_mapping(model_params) or build_default_model_params()
161
+
162
+
163
+ def _resolve_model_settings(
164
+ settings: Settings,
165
+ *,
166
+ active_provider_id: str | None,
167
+ active_model: str | None,
168
+ context_window_tokens: object,
169
+ input_image: object,
170
+ output_image: object,
171
+ structured_output: object,
172
+ max_retries: object,
173
+ retry_policy: object,
174
+ timeout_ms: object,
175
+ retry_initial_delay_seconds: object,
176
+ retry_max_delay_seconds: object,
177
+ retry_backoff_cap_retries: object,
178
+ auto_compact_token_limit: object,
179
+ model_params: object,
180
+ field_names: SettingsUpdateFieldNames,
181
+ ) -> ModelSettings:
182
+ retry_initial_delay = _resolve_value(
183
+ settings.model.retry_initial_delay_seconds,
184
+ retry_initial_delay_seconds,
185
+ build_model_retry_initial_delay_seconds,
186
+ field_name=field_names.retry_initial_delay_seconds,
187
+ )
188
+ retry_max_delay = _resolve_value(
189
+ settings.model.retry_max_delay_seconds,
190
+ retry_max_delay_seconds,
191
+ build_model_retry_max_delay_seconds,
192
+ field_name=field_names.retry_max_delay_seconds,
193
+ )
194
+ validate_model_retry_backoff_settings(
195
+ retry_initial_delay_seconds=retry_initial_delay,
196
+ retry_max_delay_seconds=retry_max_delay,
197
+ )
198
+
199
+ return ModelSettings(
200
+ active_provider_id=(
201
+ settings.model.active_provider_id
202
+ if active_provider_id is None
203
+ else active_provider_id
204
+ ),
205
+ active_model=(
206
+ settings.model.active_model if active_model is None else active_model
207
+ ),
208
+ input_image=_resolve_value(
209
+ settings.model.input_image,
210
+ input_image,
211
+ build_model_input_image,
212
+ field_name=field_names.input_image,
213
+ ),
214
+ output_image=_resolve_value(
215
+ settings.model.output_image,
216
+ output_image,
217
+ build_model_output_image,
218
+ field_name=field_names.output_image,
219
+ ),
220
+ structured_output=_resolve_value(
221
+ settings.model.structured_output,
222
+ structured_output,
223
+ build_model_structured_output,
224
+ field_name=field_names.structured_output,
225
+ ),
226
+ context_window_tokens=_resolve_value(
227
+ settings.model.context_window_tokens,
228
+ context_window_tokens,
229
+ build_model_context_window_tokens,
230
+ field_name=field_names.context_window_tokens,
231
+ ),
232
+ params=_resolve_model_params(settings, model_params),
233
+ timeout_ms=_resolve_value(
234
+ settings.model.timeout_ms,
235
+ timeout_ms,
236
+ build_model_timeout_ms,
237
+ field_name=field_names.timeout_ms,
238
+ ),
239
+ retry_policy=_resolve_value(
240
+ settings.model.retry_policy,
241
+ retry_policy,
242
+ build_model_retry_policy,
243
+ field_name=field_names.retry_policy,
244
+ ),
245
+ max_retries=_resolve_value(
246
+ settings.model.max_retries,
247
+ max_retries,
248
+ build_model_max_retries,
249
+ field_name=field_names.max_retries,
250
+ ),
251
+ retry_initial_delay_seconds=retry_initial_delay,
252
+ retry_max_delay_seconds=retry_max_delay,
253
+ retry_backoff_cap_retries=_resolve_value(
254
+ settings.model.retry_backoff_cap_retries,
255
+ retry_backoff_cap_retries,
256
+ build_model_retry_backoff_cap_retries,
257
+ field_name=field_names.retry_backoff_cap_retries,
258
+ ),
259
+ auto_compact_token_limit=_resolve_value(
260
+ settings.model.auto_compact_token_limit,
261
+ auto_compact_token_limit,
262
+ build_model_auto_compact_token_limit,
263
+ field_name=field_names.auto_compact_token_limit,
264
+ ),
265
+ )
266
+
267
+
268
+ def _resolve_event_log_settings(
269
+ settings: Settings,
270
+ *,
271
+ timestamp_format: str | None,
272
+ ) -> EventLogSettings:
273
+ return EventLogSettings(
274
+ timestamp_format=(
275
+ settings.event_log.timestamp_format
276
+ if timestamp_format is None
277
+ else timestamp_format
278
+ )
279
+ )
280
+
281
+
74
282
  def resolve_settings_update(
75
283
  settings: Settings,
76
284
  *,
@@ -111,179 +319,67 @@ def resolve_settings_update(
111
319
  context_window_tokens_field_name: str = "model.context_window_tokens",
112
320
  auto_compact_token_limit_field_name: str = "model.auto_compact_token_limit",
113
321
  ) -> ResolvedSettingsUpdate:
322
+ field_names = SettingsUpdateFieldNames(
323
+ assistant_role=assistant_role_field_name,
324
+ assistant_allow_network=assistant_allow_network_field_name,
325
+ assistant_write_dirs=assistant_write_dirs_field_name,
326
+ leader_role=leader_role_field_name,
327
+ working_dir=working_dir_field_name,
328
+ retry_policy=retry_policy_field_name,
329
+ timeout_ms=timeout_ms_field_name,
330
+ max_retries=max_retries_field_name,
331
+ retry_initial_delay_seconds=retry_initial_delay_seconds_field_name,
332
+ retry_max_delay_seconds=retry_max_delay_seconds_field_name,
333
+ retry_backoff_cap_retries=retry_backoff_cap_retries_field_name,
334
+ input_image=input_image_field_name,
335
+ output_image=output_image_field_name,
336
+ structured_output=structured_output_field_name,
337
+ context_window_tokens=context_window_tokens_field_name,
338
+ auto_compact_token_limit=auto_compact_token_limit_field_name,
339
+ )
114
340
  next_working_dir = (
115
341
  settings.working_dir
116
342
  if working_dir is None
117
- else build_working_dir(working_dir, field_name=working_dir_field_name)
118
- )
119
- next_assistant_role_name = _resolve_role_name(
120
- settings,
121
- current_role_name=settings.assistant.role_name,
122
- next_role_name=assistant_role_name,
123
- field_name=assistant_role_field_name,
124
- )
125
- next_assistant_allow_network = (
126
- settings.assistant.allow_network
127
- if assistant_allow_network is MISSING
128
- else build_assistant_allow_network(
129
- assistant_allow_network,
130
- field_name=assistant_allow_network_field_name,
131
- )
132
- )
133
- next_assistant_write_dirs = (
134
- list(settings.assistant.write_dirs)
135
- if assistant_write_dirs is MISSING
136
- else build_assistant_write_dirs(
137
- assistant_write_dirs,
138
- field_name=assistant_write_dirs_field_name,
139
- base_dir=next_working_dir,
140
- )
141
- )
142
-
143
- next_leader_role_name = _resolve_role_name(
144
- settings,
145
- current_role_name=settings.leader.role_name,
146
- next_role_name=leader_role_name,
147
- field_name=leader_role_field_name,
148
- )
149
-
150
- next_active_provider_id = (
151
- settings.model.active_provider_id
152
- if active_provider_id is None
153
- else active_provider_id
154
- )
155
- next_active_model = (
156
- settings.model.active_model if active_model is None else active_model
157
- )
158
- next_context_window_tokens = (
159
- settings.model.context_window_tokens
160
- if context_window_tokens is MISSING
161
- else build_model_context_window_tokens(
162
- context_window_tokens,
163
- field_name=context_window_tokens_field_name,
164
- )
165
- )
166
- next_input_image = (
167
- settings.model.input_image
168
- if input_image is MISSING
169
- else build_model_input_image(
170
- input_image,
171
- field_name=input_image_field_name,
172
- )
173
- )
174
- next_output_image = (
175
- settings.model.output_image
176
- if output_image is MISSING
177
- else build_model_output_image(
178
- output_image,
179
- field_name=output_image_field_name,
180
- )
181
- )
182
- next_structured_output = (
183
- settings.model.structured_output
184
- if structured_output is MISSING
185
- else build_model_structured_output(
186
- structured_output,
187
- field_name=structured_output_field_name,
188
- )
189
- )
190
- next_retry_policy = (
191
- settings.model.retry_policy
192
- if retry_policy is MISSING
193
- else build_model_retry_policy(
194
- retry_policy,
195
- field_name=retry_policy_field_name,
196
- )
197
- )
198
- next_timeout_ms = (
199
- settings.model.timeout_ms
200
- if timeout_ms is MISSING
201
- else build_model_timeout_ms(
202
- timeout_ms,
203
- field_name=timeout_ms_field_name,
204
- )
205
- )
206
- next_max_retries = (
207
- settings.model.max_retries
208
- if max_retries is MISSING
209
- else build_model_max_retries(
210
- max_retries,
211
- field_name=max_retries_field_name,
212
- )
213
- )
214
- next_retry_initial_delay_seconds = (
215
- settings.model.retry_initial_delay_seconds
216
- if retry_initial_delay_seconds is MISSING
217
- else build_model_retry_initial_delay_seconds(
218
- retry_initial_delay_seconds,
219
- field_name=retry_initial_delay_seconds_field_name,
220
- )
221
- )
222
- next_retry_max_delay_seconds = (
223
- settings.model.retry_max_delay_seconds
224
- if retry_max_delay_seconds is MISSING
225
- else build_model_retry_max_delay_seconds(
226
- retry_max_delay_seconds,
227
- field_name=retry_max_delay_seconds_field_name,
228
- )
229
- )
230
- next_retry_backoff_cap_retries = (
231
- settings.model.retry_backoff_cap_retries
232
- if retry_backoff_cap_retries is MISSING
233
- else build_model_retry_backoff_cap_retries(
234
- retry_backoff_cap_retries,
235
- field_name=retry_backoff_cap_retries_field_name,
236
- )
237
- )
238
- next_auto_compact_token_limit = (
239
- settings.model.auto_compact_token_limit
240
- if auto_compact_token_limit is MISSING
241
- else build_model_auto_compact_token_limit(
242
- auto_compact_token_limit,
243
- field_name=auto_compact_token_limit_field_name,
244
- )
245
- )
246
- validate_model_retry_backoff_settings(
247
- retry_initial_delay_seconds=next_retry_initial_delay_seconds,
248
- retry_max_delay_seconds=next_retry_max_delay_seconds,
249
- )
250
- next_model_params = (
251
- settings.model.params
252
- if model_params is MISSING
253
- else build_model_params_from_mapping(model_params)
254
- or build_default_model_params()
255
- )
256
- next_timestamp_format = (
257
- settings.event_log.timestamp_format
258
- if timestamp_format is None
259
- else timestamp_format
343
+ else build_working_dir(working_dir, field_name=field_names.working_dir)
260
344
  )
261
345
 
262
346
  return ResolvedSettingsUpdate(
263
347
  working_dir=next_working_dir,
264
- assistant=AssistantSettings(
265
- role_name=next_assistant_role_name,
266
- allow_network=next_assistant_allow_network,
267
- write_dirs=next_assistant_write_dirs,
348
+ assistant=_resolve_assistant_settings(
349
+ settings,
350
+ next_working_dir=next_working_dir,
351
+ assistant_role_name=assistant_role_name,
352
+ assistant_allow_network=assistant_allow_network,
353
+ assistant_write_dirs=assistant_write_dirs,
354
+ field_names=field_names,
355
+ ),
356
+ leader=_resolve_leader_settings(
357
+ settings,
358
+ leader_role_name=leader_role_name,
359
+ field_names=field_names,
360
+ ),
361
+ model=_resolve_model_settings(
362
+ settings,
363
+ active_provider_id=active_provider_id,
364
+ active_model=active_model,
365
+ context_window_tokens=context_window_tokens,
366
+ input_image=input_image,
367
+ output_image=output_image,
368
+ structured_output=structured_output,
369
+ max_retries=max_retries,
370
+ retry_policy=retry_policy,
371
+ timeout_ms=timeout_ms,
372
+ retry_initial_delay_seconds=retry_initial_delay_seconds,
373
+ retry_max_delay_seconds=retry_max_delay_seconds,
374
+ retry_backoff_cap_retries=retry_backoff_cap_retries,
375
+ auto_compact_token_limit=auto_compact_token_limit,
376
+ model_params=model_params,
377
+ field_names=field_names,
268
378
  ),
269
- leader=LeaderSettings(role_name=next_leader_role_name),
270
- model=ModelSettings(
271
- active_provider_id=next_active_provider_id,
272
- active_model=next_active_model,
273
- input_image=next_input_image,
274
- output_image=next_output_image,
275
- structured_output=next_structured_output,
276
- context_window_tokens=next_context_window_tokens,
277
- params=next_model_params,
278
- timeout_ms=next_timeout_ms,
279
- retry_policy=next_retry_policy,
280
- max_retries=next_max_retries,
281
- retry_initial_delay_seconds=next_retry_initial_delay_seconds,
282
- retry_max_delay_seconds=next_retry_max_delay_seconds,
283
- retry_backoff_cap_retries=next_retry_backoff_cap_retries,
284
- auto_compact_token_limit=next_auto_compact_token_limit,
379
+ event_log=_resolve_event_log_settings(
380
+ settings,
381
+ timestamp_format=timestamp_format,
285
382
  ),
286
- event_log=EventLogSettings(timestamp_format=next_timestamp_format),
287
383
  )
288
384
 
289
385
 
@@ -56,6 +56,8 @@ def open_state_db(*, create: bool) -> sqlite3.Connection | None:
56
56
  def _ensure_schema(connection: sqlite3.Connection) -> None:
57
57
  connection.executescript(
58
58
  """
59
+ DROP TABLE IF EXISTS mcp_snapshots;
60
+ DROP TABLE IF EXISTS mcp_activities;
59
61
  CREATE TABLE IF NOT EXISTS tabs (
60
62
  id TEXT PRIMARY KEY,
61
63
  payload TEXT NOT NULL,
@@ -102,19 +104,5 @@ def _ensure_schema(connection: sqlite3.Connection) -> None:
102
104
  );
103
105
  CREATE INDEX IF NOT EXISTS idx_compact_records_ended_at
104
106
  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
107
  """
120
108
  )
@@ -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{q as r}from"./ui-vendor-C5pJa8N7.js";import{A as i,C as a,D as o,E as s,M as c,N as l,O as u,S as d,T as ee,_ as te,b as ne,g as re,h as ie,j as ae,k as oe,m as f,t as p,v as se,w as ce,x as m,y as le}from"./WorkspacePanels-CteCjolX.js";import{A as h,K as g,M as ue,U as de,Y as _,ft as v,g as y,h as fe,j as b,m as pe,p as me,q as he,ut as x}from"./index-C9HuekJm.js";async function ge(e){return _(`/api/assistant/message`,{method:`POST`,body:e,errorMessage:`Failed to send Assistant message`})}async function _e(e){return _(`/api/assistant/messages/${e}/retry`,{method:`POST`,errorMessage:`Failed to retry Assistant message`})}var S=e(t(),1);function C(e){for(let t of e.values())if(t.node_type===`assistant`)return t;return null}function ve(e){return C(e)?.id??null}var w=`assistant`;function ye(){return s(w)}function be(e){return o(w,e)}function xe(e){ee(w,e)}function T(e={}){let{bottomInset:t=0}=e,{agents:n}=y(),{connected:i}=pe(),{agentHistories:o,clearAgentHistory:s,clearHistorySnapshot:c,historyInvalidatedAt:ee,historyClearedAt:ae,historySnapshots:p,streamingDeltas:_}=fe(),{activeToolCalls:v}=me(),[x,C]=(0,S.useState)(null),[w,T]=(0,S.useState)(0),[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)([]),[A,j]=(0,S.useState)(null),[Se,Ce]=(0,S.useState)(!1),[we,Te]=(0,S.useState)(null),[M,Ee]=(0,S.useState)(!1),[N,P]=(0,S.useState)([]),[F,I]=(0,S.useState)(null),De=(0,S.useRef)(null),Oe=(0,S.useRef)(!0),ke=(0,S.useRef)([]),L=(0,S.useRef)(null),R=(0,S.useRef)(!1),z=(0,S.useMemo)(()=>ve(n),[n]),B=(0,S.useMemo)(()=>z?n.get(z)??null:null,[n,z]),V=B?.capabilities?.input_image??!1,H=z?ae.get(z)??0:0,U=z?ee.get(z)??0:0,W=z?p.get(z)??null:null,Ae=O.some(e=>e.status===`uploading`),je=O.filter(le),G=(0,S.useSyncExternalStore)(be,ye,ye),K=A===null?null:G[A]??null,q=K!==null&&E===K.text&&se(O,K),J=B?.state??x?.state??null,Y=(0,S.useCallback)(async e=>{let t=e.pendingMessageTimestamp??Date.now(),n=ie(e.content,e.parts,t);Ee(!0),P(e=>[...e,n]);try{let n=await ge({content:e.content,parts:e.parts});return n.status===`command_executed`?P(n=>h(n,{content:e.content,timestamp:t})):n.message_id&&P(r=>r.map(r=>r.timestamp===t&&r.content===e.content?{...r,message_id:n.message_id}:r)),xe(e.history),e.restoreDraft&&d(e.restoreDraft.images),!0}catch(n){return P(n=>h(n,{content:e.content,timestamp:t})),e.restoreDraft&&(D(e.restoreDraft.input),k(e.restoreDraft.images),j(e.restoreDraft.historyCursor)),r.error(n instanceof Error?n.message:`Failed to send message`),!1}finally{Ee(!1)}},[]),X=(0,S.useCallback)((e,t)=>{j(t),D(e?.text??``),k(e?a(e):[])},[]),Me=(0,S.useCallback)(e=>{j(null),D(e)},[]);(0,S.useEffect)(()=>{ke.current=O},[O]),(0,S.useEffect)(()=>{L.current=F},[F]),(0,S.useEffect)(()=>()=>{d(ke.current)},[]),(0,S.useEffect)(()=>{H&&(P([]),I(null),C(e=>e&&{...e,history:u(e.history)}),T(Date.now()))},[H]),(0,S.useEffect)(()=>{U&&(P([]),W&&(C(e=>e&&{...e,history:W}),T(Date.now())))},[U,W]),(0,S.useEffect)(()=>{let e=L.current;!e||e.send_failed||e.target_id!==z||J!==e.target_state&&I({...e,target_state:J})},[z,J]),(0,S.useEffect)(()=>{let e=L.current;!e||e.send_failed||!z||e.target_id!==z||J!==`idle`||M||R.current||(R.current=!0,I(null),Y({content:e.content,parts:e.parts??[],history:e.history_entry,pendingMessageTimestamp:e.timestamp}).then(t=>{R.current=!1,t||I({...e,send_failed:!0,target_state:`error`})}).catch(()=>{R.current=!1,I({...e,send_failed:!0,target_state:`error`})}))},[z,J,M,Y]),(0,S.useEffect)(()=>{if(!i||!z){C(null);return}let e=new AbortController,t=!1;return(async()=>{s(z);try{let n=await g(z,e.signal);if(t||!n)return;C(n),T(Date.now()),c(z)}catch{!t&&!e.signal.aborted&&r.error(`Failed to load Assistant history`)}})(),()=>{t=!0,e.abort()}},[H,U,z,s,c,i]);let Z=(0,S.useMemo)(()=>z?oe({history:W??x?.history??[],incremental:o.get(z),deltas:_.get(z),fetchedAt:w||Date.now()}):[],[o,W,x,w,_,z]);(0,S.useEffect)(()=>{if(!z||N.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&&P(t=>e.reduce((e,t)=>h(e,{content:t.content??b(t.parts,t.content),messageId:t.message_id}),t))},[z,Z,N.length]);let Q=(0,S.useMemo)(()=>[...Z,...F?[{...F}]:[],...N.map(e=>({...e}))],[Z,N,F]),$=(0,S.useMemo)(()=>{let e=N.length+ +!!F,t=z?_.get(z)??[]:[],n=i&&(e>0||B?.state===`running`||B?.state===`sleeping`||v.has(z??``)||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=(z?v.get(z)??null:null)??s?.tool_name??null;return{running:n,runningHint:n&&r!==void 0&&!o?{label:c?`Running tools...`:`Thinking...`,toolName:c}:null}},[v,z,B?.state,i,N.length,F,_,Q]);(0,S.useLayoutEffect)(()=>{let e=De.current;!e||!Oe.current||(e.scrollTop=e.scrollHeight)},[t,$.runningHint?`${$.runningHint.label}:${$.runningHint.toolName??``}`:``,Q]),(0,S.useLayoutEffect)(()=>{let e=De.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>{Oe.current&&(e.scrollTop=e.scrollHeight)});return t.observe(e),()=>{t.disconnect()}},[]);let Ne=e=>{Oe.current=ne(e.currentTarget)},Pe=async(e={})=>{let t=E.trim();if(!t&&je.length===0||Ae||M)return;let n=f(t,je),i=E,a=O,o=A,s=Date.now(),c=t||b(n),l={text:i,images:ce(a),timestamp:s},u=e.deferWhenBusy&&z&&L.current?.target_id===z&&(J===`error`||J===`terminated`);if(e.deferWhenBusy&&z&&(J===`running`||J===`sleeping`||u)){I(re({content:c,historyEntry:l,historyScope:`assistant`,parts:n,targetId:z,targetState:J,timestamp:s})),j(null),D(``),k([]),d(a);return}if(J===`terminated`){r.error(`Resolve the current chat before sending`);return}j(null),D(``),k([]),await Y({content:c,parts:n,history:l,pendingMessageTimestamp:s,restoreDraft:{input:i,images:a,historyCursor:o}})},Fe=(0,S.useCallback)(async e=>{if(j(null),!V){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 te(t);k(e=>[...e,...n]),await Promise.all(n.map(async(e,n)=>{let i=t[n];if(i)try{let t=await l(i);k(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){m(e),k(t=>t.filter(t=>t.id!==e.id)),r.error(t instanceof Error?t.message:`Failed to upload image`)}}))},[V]),Ie=(0,S.useCallback)(e=>{j(null),k(t=>{let n=t.find(t=>t.id===e);return n&&m(n),t.filter(t=>t.id!==e)})},[]),Le=(0,S.useCallback)((e,t)=>{if(G.length===0)return!1;let n=t.start,r=t.end,i=E.length===0&&O.length===0,a=typeof n==`number`&&typeof r==`number`&&n===r&&(n===0||n===E.length);if(!i&&!(K!==null&&q&&a))return!1;if(A===null){if(e!==-1)return!1;let t=G.length-1;return X(G[t]??null,t),!0}if(e===-1){let e=Math.max(A-1,0);return X(G[e]??null,e),!0}if(A>=G.length-1)return X(null,null),!0;let o=A+1;return X(G[o]??null,o),!0},[K,O,A,E,G,q,X]),Re=async()=>{if(!(!z||Se)){Ce(!0);try{await de(z),P([]),I(null),s(z),C(await g(z)),T(Date.now()),c(z)}catch(e){r.error(e instanceof Error?e.message:`Failed to clear assistant chat`)}finally{Ce(!1)}}},ze=(0,S.useCallback)(async()=>{if(z&&!(B?.state!==`running`&&B?.state!==`sleeping`)){await he(z);for(let e=0;e<25;e+=1){let e=await g(z);if(!e)break;if(C(e),T(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`)}},[z,B?.state]),Be=async e=>{if(!(!z||!e||we)){Te(e);try{try{await ze(),await _e(e)}catch(e){r.error(e instanceof Error?e.message:`Failed to retry Assistant message`);return}s(z);try{let e=await g(z);e&&(C(e),T(Date.now()),c(z))}catch{return}}finally{Te(null)}}},Ve=(0,S.useCallback)(async()=>{if(!z)return;await he(z),P([]),s(z);let e=await g(z);e&&(C(e),T(Date.now()),c(z))},[z,s,c]);return{addImages:Fe,connected:i,draftImages:O,handleKeyDown:e=>{if(e.key===`Tab`&&!e.shiftKey){(E.trim()||je.length>0)&&(e.preventDefault(),Pe({deferWhenBusy:!0}));return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Pe())},hasUploadingImages:Ae,input:E,isBrowsingInputHistory:q,navigateInputHistory:Le,onMessagesScroll:Ne,removeImage:Ie,retryMessage:Be,retryingMessageId:we,scrollRef:De,clearing:Se,sending:M,clearChat:Re,cancelPendingSend:(0,S.useCallback)(e=>{I(t=>t?.id===e?null:t)},[]),sendPendingSend:(0,S.useCallback)(async e=>{let t=L.current;!t||t.id!==e||!z||t.target_id!==z||M||R.current||J===`terminated`||(I(null),await Y({content:t.content,parts:t.parts??[],history:t.history_entry,pendingMessageTimestamp:t.timestamp})||I({...t,send_failed:!0,target_state:`error`}))},[z,J,M,Y]),sendMessage:Pe,setInput:Me,stopAssistant:Ve,supportsInputImage:V,timelineItems:Q,assistantActivity:$}}var E=n();function D({onOpenDetails:e}){let{agents:t}=y(),[n,a]=(0,S.useState)(!1),{height:o,ref:s}=i(),{addImages:l=async()=>{},assistantActivity:u={running:!1,runningHint:null},clearChat:d,cancelPendingSend:ee,clearing:te=!1,connected:ne,draftImages:re=[],handleKeyDown:ie,hasUploadingImages:oe=!1,input:f,isBrowsingInputHistory:p,navigateInputHistory:se,onMessagesScroll:ce,removeImage:m=()=>{},retryMessage:le,retryingMessageId:h,scrollRef:g,sending:ue,sendMessage:de,sendPendingSend:_,setInput:fe,stopAssistant:b,supportsInputImage:pe=!1,timelineItems:me}=T({bottomInset:o}),he=Array.from(t.values()).find(e=>e.node_type===`assistant`)?.role_name??null;return(0,E.jsxs)(`div`,{className:v(`relative flex h-full flex-col overflow-hidden bg-surface-overlay text-foreground`),children:[(0,E.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,E.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,E.jsx)(`div`,{"aria-hidden":`true`,className:v(`pointer-events-none absolute inset-0 z-20 border transition-[opacity,border-color,box-shadow] duration-300`,u.running?`animate-pulse shadow-lg shadow-ring/5`:`opacity-0`,u.running&&`border-ring/25 opacity-100 shadow-ring/10`)}),(0,E.jsx)(O,{connected:ne,onClearChat:()=>void d(),onOpenDetails:e,roleName:he,clearing:te}),(0,E.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,E.jsx)(ae,{allowHumanMessageRetry:!0,bottomInset:o,items:me,nodes:t,onRetryHumanMessage:e=>void le(e),onCancelPendingSend:ee,onSendPendingSend:e=>void _(e),onScroll:ce,retryImageInputEnabled:pe,retryingMessageId:h,runningHint:u.runningHint,scrollRef:g}),(0,E.jsx)(`div`,{ref:s,style:{paddingBottom:`calc(10px + env(safe-area-inset-bottom, 0px))`},className:`pointer-events-none absolute inset-x-0 bottom-0 z-10 bg-gradient-to-b from-transparent via-background/70 to-background/95 px-2.5 pt-8`,children:(0,E.jsx)(`div`,{className:`mx-auto w-full max-w-3xl`,children:(0,E.jsx)(c,{busy:u.running,disabled:!f.trim()&&re.length===0||oe||ue,commandsEnabled:!0,images:re,imageInputEnabled:pe,input:f,onAddImages:e=>void l(e),onChange:fe,onNavigateHistory:se,onKeyDown:ie,onRemoveImage:m,onSend:()=>void de(),onStop:()=>{a(!0),b().catch(e=>{r.error(e instanceof Error?e.message:`Failed to stop Assistant`)}).finally(()=>{a(!1)})},overlay:!0,stopping:n,suppressCommandNavigation:p,targetLabel:`Assistant`})})})]})]})}function O({clearing:e,connected:t,onClearChat:n,onOpenDetails:r,roleName:i}){return(0,E.jsxs)(`div`,{className:`relative z-10 flex flex-wrap items-center gap-2.5 border-b border-border px-3.5 py-2.5`,children:[(0,E.jsxs)(`div`,{className:`flex min-w-[220px] flex-1 items-center gap-2`,children:[(0,E.jsx)(`div`,{className:`shrink-0 text-[14px] font-semibold leading-6 text-foreground`,children:`Assistant`}),i?(0,E.jsxs)(`span`,{className:`min-w-0 truncate rounded-full border border-border bg-accent/35 px-2 py-0.5 text-[10px] font-medium leading-4 text-muted-foreground/78`,children:[`Role: `,i]}):null,(0,E.jsx)(k,{connected:t})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,E.jsx)(x,{type:`button`,size:`sm`,variant:`outline`,disabled:e,onClick:n,children:e?`Clearing...`:`Clear Chat`}),(0,E.jsx)(x,{type:`button`,size:`sm`,variant:`outline`,disabled:!r,onClick:r,children:`Assistant Details`})]})]})}function k({connected:e}){return(0,E.jsx)(`span`,{className:v(`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 A(){let{agents:e}=y(),t=C(e),[n,r]=(0,S.useState)(!1);return(0,E.jsx)(`div`,{className:`flex h-full flex-col min-h-0`,children:n&&t?(0,E.jsx)(`div`,{className:`h-full overflow-hidden p-6`,children:(0,E.jsx)(`div`,{className:`h-full overflow-hidden rounded-xl border border-border bg-surface-overlay/90 shadow-md`,children:(0,E.jsx)(p,{agent:t,onClose:()=>r(!1)})})}):(0,E.jsx)(D,{onOpenDetails:t?()=>r(!0):void 0})})}export{A 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{en as r,et as i,q as a,ut as o}from"./ui-vendor-C5pJa8N7.js";import{Y as s,r as c,rt as l,ut as u}from"./index-C9HuekJm.js";import{a as d,o as f}from"./surface-pWwG5ogx.js";import{c as p,n as m,r as h,s as g}from"./PageScaffold-f6g2l7XN.js";async function _(){return s(`/api/settings/telegram`,{errorMessage:`Failed to fetch Telegram settings`})}async function v(e){return s(`/api/settings/telegram`,{method:`PATCH`,body:e,errorMessage:`Failed to save Telegram settings`})}async function y(e){return s(`/api/settings/telegram/approve/${e}`,{method:`POST`,errorMessage:`Failed to approve Telegram chat`})}async function b(e){return s(`/api/settings/telegram/pending/${e}`,{method:`DELETE`,errorMessage:`Failed to remove pending Telegram chat`})}async function x(e){return s(`/api/settings/telegram/chat/${e}`,{method:`DELETE`,errorMessage:`Failed to remove Telegram chat`})}var S=e(t(),1);function C(e,t=`auto`){return typeof e!=`number`||!Number.isFinite(e)?null:t===`milliseconds`?e:t===`seconds`?e*1e3:e>0xe8d4a51000?e:e*1e3}function w(e,t={}){let{fallback:n=`Unknown`,format:r,unit:i=`auto`}=t,a=C(e,i);if(a===null)return n;let o=new Date(a);return r?new Intl.DateTimeFormat(void 0,r).format(o):o.toLocaleString()}var T=n();function E(e){return e?w(e,{fallback:`—`,unit:`seconds`}):`—`}function D(e){return e.display_name.trim()?e.display_name.trim():e.username?.trim()?`@${e.username.trim()}`:`Unknown chat`}function O(){let{data:e,isLoading:t,mutate:n}=p(`telegramSettings`,_),[s,C]=(0,S.useState)(!1),[w,O]=(0,S.useState)(``),[k,A]=(0,S.useState)(!1),j=(0,S.useMemo)(()=>!!e?.bot_token,[e?.bot_token]),M=async()=>{if(e){C(!0);try{let e={};k&&(e.bot_token=w.trim()),n((await v(e)).telegram,!1),O(``),A(!1),a.success(`Telegram settings saved`)}catch{a.error(`Failed to save Telegram settings`)}finally{C(!1)}}},N=async e=>{try{n((await y(e)).telegram,!1),a.success(`Telegram chat approved`)}catch{a.error(`Failed to approve Telegram chat`)}},P=async e=>{try{n((await b(e)).telegram,!1),a.success(`Pending Telegram chat removed`)}catch{a.error(`Failed to remove pending Telegram chat`)}},F=async e=>{try{n((await x(e)).telegram,!1),a.success(`Approved Telegram chat removed`)}catch{a.error(`Failed to remove approved Telegram chat`)}};return t||!e?(0,T.jsx)(c,{label:`Loading channels...`,textClassName:`text-[13px]`}):(0,T.jsx)(m,{children:(0,T.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto pr-2 scrollbar-none pt-6`,children:(0,T.jsxs)(`div`,{className:`mx-auto max-w-[680px] pb-10`,children:[(0,T.jsx)(h,{title:`Channels`}),(0,T.jsxs)(g,{className:`mt-6 space-y-8`,children:[(0,T.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,T.jsx)(`div`,{children:(0,T.jsx)(`h2`,{className:`text-lg font-medium text-foreground`,children:`Telegram`})}),(0,T.jsx)(f,{tone:j?`running`:`idle`,children:j?`Configured`:`Not configured`})]}),(0,T.jsxs)(`section`,{children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Bot Token`}),(0,T.jsx)(f,{tone:j?`running`:`idle`,children:j?`Saved`:`Missing`})]}),(0,T.jsxs)(`div`,{className:`mt-3`,children:[(0,T.jsx)(l,{value:w,onChange:e=>{O(e.target.value),A(!0)},placeholder:e.bot_token||`Enter Telegram bot token`,mono:!0,showLabel:`Show Telegram bot token`,hideLabel:`Hide Telegram bot token`}),j&&!k?(0,T.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Leave empty to keep the current token.`}):null]})]}),(0,T.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Pending Private Chats`}),(0,T.jsxs)(f,{tone:`muted`,className:`px-2 py-0.5`,children:[e.pending_chats.length,` waiting`]})]}),e.pending_chats.length===0?(0,T.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No pending chats.`}):(0,T.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.pending_chats.map(e=>(0,T.jsx)(d,{as:`div`,padding:`sm`,className:`px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:D(e)}),(0,T.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,T.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,T.jsxs)(`span`,{children:[`First seen: `,E(e.first_seen_at)]})]})]}),(0,T.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,T.jsxs)(u,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>void N(e.chat_id),children:[(0,T.jsx)(r,{className:`size-3.5`}),`Approve`]}),(0,T.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void P(e.chat_id),className:`text-muted-foreground hover:bg-destructive/10 hover:text-destructive`,children:(0,T.jsx)(i,{className:`size-3.5`})})]})]})},e.chat_id))})]}),(0,T.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Approved Private Chats`}),(0,T.jsxs)(f,{tone:`muted`,className:`px-2 py-0.5`,children:[e.approved_chats.length,` active`]})]}),e.approved_chats.length===0?(0,T.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No approved chats yet.`}):(0,T.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.approved_chats.map(e=>(0,T.jsx)(d,{as:`div`,padding:`sm`,className:`group px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:D(e)}),(0,T.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,T.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,T.jsxs)(`span`,{children:[`Approved: `,E(e.approved_at)]})]})]}),(0,T.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void F(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,T.jsx)(i,{className:`size-3.5`})})]})},e.chat_id))})]}),(0,T.jsx)(`div`,{className:`flex justify-end border-t border-border pt-6`,children:(0,T.jsxs)(u,{type:`button`,size:`sm`,onClick:()=>void M(),disabled:s,className:`text-[13px]`,children:[(0,T.jsx)(o,{className:`size-4`}),s?`Saving...`:`Save Changes`]})})]})]})})})}export{O as ChannelsPage};
@@ -1 +1 @@
1
- import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{c as t,d as n,l as r}from"./graph-vendor-DRq_-6fV.js";import{Lt as i}from"./ui-vendor-UazN8rcv.js";import{a,i as o,n as s,r as c,rt as l,tt as u}from"./index-Biio-CoI.js";import{s as d}from"./surface-Bzr1FRG4.js";var f=e(n(),1),p=t(),m=Object.prototype.hasOwnProperty;function h(e,t){var n,r;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((r=e.length)===t.length)for(;r--&&h(e[r],t[r]););return r===-1}if(!n||typeof e==`object`){for(n in r=0,e)if(m.call(e,n)&&++r&&!m.call(t,n)||!(n in t)||!h(e[n],t[n]))return!1;return Object.keys(t).length===r}}return e!==e&&t!==t}var g=new WeakMap,_=()=>{},v=void 0,y=Object,b=e=>e===v,x=e=>typeof e==`function`,S=(e,t)=>({...e,...t}),ee=e=>x(e.then),C={},w={},T=`undefined`,E=typeof window!=T,D=typeof document!=T,O=E&&`Deno`in window,k=()=>E&&typeof window.requestAnimationFrame!=T,te=(e,t)=>{let n=g.get(e);return[()=>!b(t)&&e.get(t)||C,r=>{if(!b(t)){let i=e.get(t);t in w||(w[t]=i),n[5](t,S(i,r),i||C)}},n[6],()=>!b(t)&&t in w?w[t]:!b(t)&&e.get(t)||C]},A=!0,j=()=>A,[M,N]=E&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[_,_],P=()=>{let e=D&&document.visibilityState;return b(e)||e!==`hidden`},ne=e=>(D&&document.addEventListener(`visibilitychange`,e),M(`focus`,e),()=>{D&&document.removeEventListener(`visibilitychange`,e),N(`focus`,e)}),re=e=>{let t=()=>{A=!0,e()},n=()=>{A=!1};return M(`online`,t),M(`offline`,n),()=>{N(`online`,t),N(`offline`,n)}},ie={isOnline:j,isVisible:P},F={initFocus:ne,initReconnect:re},ae=!f.useId,I=!E||O,oe=e=>k()?window.requestAnimationFrame(e):setTimeout(e,1),L=I?f.useEffect:f.useLayoutEffect,R=typeof navigator<`u`&&navigator.connection,z=!I&&R&&([`slow-2g`,`2g`].includes(R.effectiveType)||R.saveData),B=new WeakMap,se=e=>y.prototype.toString.call(e),V=(e,t)=>e===`[object ${t}]`,ce=0,H=e=>{let t=typeof e,n=se(e),r=V(n,`Date`),i=V(n,`RegExp`),a=V(n,`Object`),o,s;if(y(e)===e&&!r&&!i){if(o=B.get(e),o)return o;if(o=++ce+`~`,B.set(e,o),Array.isArray(e)){for(o=`@`,s=0;s<e.length;s++)o+=H(e[s])+`,`;B.set(e,o)}if(a){o=`#`;let t=y.keys(e).sort();for(;!b(s=t.pop());)b(e[s])||(o+=s+`:`+H(e[s])+`,`);B.set(e,o)}}else o=r?e.toJSON():t==`symbol`?e.toString():t==`string`?JSON.stringify(e):``+e;return o},le=e=>{if(x(e))try{e=e()}catch{e=``}let t=e;return e=typeof e==`string`?e:(Array.isArray(e)?e.length:e)?H(e):``,[e,t]},U=0,ue=()=>++U;async function de(...e){let[t,n,r,i]=e,a=S({populateCache:!0,throwOnError:!0},typeof i==`boolean`?{revalidate:i}:i||{}),o=a.populateCache,s=a.rollbackOnError,c=a.optimisticData,l=e=>typeof s==`function`?s(e):s!==!1,u=a.throwOnError;if(x(n)){let e=n,r=[],i=t.keys();for(let n of i)!/^\$(inf|sub)\$/.test(n)&&e(t.get(n)._k)&&r.push(n);return Promise.all(r.map(d))}return d(n);async function d(n){let[i]=le(n);if(!i)return;let[s,d]=te(t,i),[f,p,m,h]=g.get(t),_=()=>{let e=f[i];return(x(a.revalidate)?a.revalidate(s().data,n):a.revalidate!==!1)&&(delete m[i],delete h[i],e&&e[0])?e[0](2).then(()=>s().data):s().data};if(e.length<3)return _();let y=r,S,C=!1,w=ue();p[i]=[w,0];let T=!b(c),E=s(),D=E.data,O=E._c,k=b(O)?D:O;if(T&&(c=x(c)?c(k,D):c,d({data:c,_c:k})),x(y))try{y=y(k)}catch(e){S=e,C=!0}if(y&&ee(y))if(y=await y.catch(e=>{S=e,C=!0}),w!==p[i][0]){if(C)throw S;return y}else C&&T&&l(S)&&(o=!0,d({data:k,_c:v}));if(o&&(C||(x(o)?d({data:o(y,k),error:v,_c:v}):d({data:y,error:v,_c:v}))),p[i][1]=ue(),Promise.resolve(_()).then(()=>{d({_c:v})}),C){if(u)throw S;return}return y}}var W=(e,t)=>{for(let n in e)e[n][0]&&e[n][0](t)},G=(e,t)=>{if(!g.has(e)){let n=S(F,t),r=Object.create(null),i=de.bind(v,e),a=_,o=Object.create(null),s=(e,t)=>{let n=o[e]||[];return o[e]=n,n.push(t),()=>n.splice(n.indexOf(t),1)},c=(t,n,r)=>{e.set(t,n);let i=o[t];if(i)for(let e of i)e(n,r)},l=()=>{if(!g.has(e)&&(g.set(e,[r,Object.create(null),Object.create(null),Object.create(null),i,c,s]),!I)){let t=n.initFocus(setTimeout.bind(v,W.bind(v,r,0))),i=n.initReconnect(setTimeout.bind(v,W.bind(v,r,1)));a=()=>{t&&t(),i&&i(),g.delete(e)}}};return l(),[e,i,l,a]}return[e,g.get(e)[4]]},K=(e,t,n,r,i)=>{let a=n.errorRetryCount,o=i.retryCount,s=~~((Math.random()+.5)*(1<<(o<8?o:8)))*n.errorRetryInterval;!b(a)&&o>a||setTimeout(r,s,i)},q=h,[J,fe]=G(new Map),Y=S({onLoadingSlow:_,onSuccess:_,onError:_,onErrorRetry:K,onDiscarded:_,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:z?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:z?5e3:3e3,compare:q,isPaused:()=>!1,cache:J,mutate:fe,fallback:{}},ie),X=(e,t)=>{let n=S(e,t);if(t){let{use:r,fallback:i}=e,{use:a,fallback:o}=t;r&&a&&(n.use=r.concat(a)),i&&o&&(n.fallback=S(i,o))}return n},Z=(0,f.createContext)({}),pe=e=>{let{value:t}=e,n=(0,f.useContext)(Z),r=x(t),i=(0,f.useMemo)(()=>r?t(n):t,[r,n,t]),a=(0,f.useMemo)(()=>r?i:X(n,i),[r,n,i]),o=i&&i.provider,s=(0,f.useRef)(v);o&&!s.current&&(s.current=G(o(a.cache||J),i));let c=s.current;return c&&(a.cache=c[0],a.mutate=c[1]),L(()=>{if(c)return c[2]&&c[2](),c[3]},[]),(0,f.createElement)(Z.Provider,S(e,{value:a}))},Q=E&&window.__SWR_DEVTOOLS_USE__,me=Q?window.__SWR_DEVTOOLS_USE__:[],he=()=>{Q&&(window.__SWR_DEVTOOLS_REACT__=f.default)},ge=e=>x(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],_e=()=>{let e=(0,f.useContext)(Z);return(0,f.useMemo)(()=>S(Y,e),[e])},ve=me.concat(e=>(t,n,r)=>e(t,n&&((...e)=>{let[r]=le(t),[,,,i]=g.get(J);if(r.startsWith(`$inf$`))return n(...e);let a=i[r];return b(a)?n(...e):(delete i[r],a)}),r)),ye=e=>function(...t){let n=_e(),[r,i,a]=ge(t),o=X(n,a),s=e,{use:c}=o,l=(c||[]).concat(ve);for(let e=l.length;e--;)s=l[e](s);return s(r,i||o.fetcher||null,o)},be=(e,t,n)=>{let r=t[e]||(t[e]=[]);return r.push(n),()=>{let e=r.indexOf(n);e>=0&&(r[e]=r[r.length-1],r.pop())}};he();var xe=f.use||(e=>{switch(e.status){case`pending`:throw e;case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:throw e.status=`pending`,e.then(t=>{e.status=`fulfilled`,e.value=t},t=>{e.status=`rejected`,e.reason=t}),e}}),Se={dedupe:!0},Ce=Promise.resolve(v),we=()=>_,Te=(e,t,n)=>{let{cache:r,compare:i,suspense:a,fallbackData:o,revalidateOnMount:s,revalidateIfStale:c,refreshInterval:l,refreshWhenHidden:u,refreshWhenOffline:d,keepPreviousData:m,strictServerPrefetchWarning:h}=n,[_,y,C,w]=g.get(r),[T,E]=le(e),D=(0,f.useRef)(!1),O=(0,f.useRef)(!1),k=(0,f.useRef)(T),A=(0,f.useRef)(t),j=(0,f.useRef)(n),M=()=>j.current,N=()=>M().isVisible()&&M().isOnline(),[P,ne,re,ie]=te(r,T),F=(0,f.useRef)({}).current,R=b(o)?b(n.fallback)?v:n.fallback[T]:o,z=(e,t)=>{for(let n in F){let r=n;if(r===`data`){if(!i(e[r],t[r])&&(!b(e[r])||!i(K,t[r])))return!1}else if(t[r]!==e[r])return!1}return!0},B=!D.current,se=(0,f.useMemo)(()=>{let e=P(),n=ie(),r=e=>{let n=S(e);return delete n._k,!(!T||!t||M().isPaused())&&(B&&!b(s)?s:b(b(R)?n.data:R)||c)?{isValidating:!0,isLoading:!0,...n}:n},i=r(e),a=e===n?i:r(n),o=i;return[()=>{let e=r(P());return z(e,o)?(o.data=e.data,o.isLoading=e.isLoading,o.isValidating=e.isValidating,o.error=e.error,o):(o=e,e)},()=>a]},[r,T]),V=(0,p.useSyncExternalStore)((0,f.useCallback)(e=>re(T,(t,n)=>{z(n,t)||e()}),[r,T]),se[0],se[1]),ce=_[T]&&_[T].length>0,H=V.data,U=b(H)?R&&ee(R)?xe(R):R:H,W=V.error,G=(0,f.useRef)(U),K=m?b(H)?b(G.current)?U:G.current:H:U,q=T&&b(U),J=(0,f.useRef)(null);!I&&(0,p.useSyncExternalStore)(we,()=>(J.current=!1,J),()=>(J.current=!0,J));let fe=J.current;h&&fe&&!a&&q&&console.warn(`Missing pre-initiated data for serialized key "${T}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let Y=!T||!t||M().isPaused()||ce&&!b(W)?!1:B&&!b(s)?s:a?b(U)?!1:c:b(U)||c,X=B&&Y,Z=b(V.isValidating)?X:V.isValidating,pe=b(V.isLoading)?X:V.isLoading,Q=(0,f.useCallback)(async e=>{let t=A.current;if(!T||!t||O.current||M().isPaused())return!1;let r,a,o=!0,s=e||{},c=!C[T]||!s.dedupe,l=()=>ae?!O.current&&T===k.current&&D.current:T===k.current,u={isValidating:!1,isLoading:!1},d=()=>{ne(u)},f=()=>{let e=C[T];e&&e[1]===a&&delete C[T]},p={isValidating:!0};b(P().data)&&(p.isLoading=!0);try{if(c&&(ne(p),n.loadingTimeout&&b(P().data)&&setTimeout(()=>{o&&l()&&M().onLoadingSlow(T,n)},n.loadingTimeout),C[T]=[t(E),ue()]),[r,a]=C[T],r=await r,c&&setTimeout(f,n.dedupingInterval),!C[T]||C[T][1]!==a)return c&&l()&&M().onDiscarded(T),!1;u.error=v;let e=y[T];if(!b(e)&&(a<=e[0]||a<=e[1]||e[1]===0))return d(),c&&l()&&M().onDiscarded(T),!1;let s=P().data;u.data=i(s,r)?s:r,c&&l()&&M().onSuccess(r,T,n)}catch(e){f();let t=M(),{shouldRetryOnError:n}=t;t.isPaused()||(u.error=e,c&&l()&&(t.onError(e,T,t),(n===!0||x(n)&&n(e))&&(!M().revalidateOnFocus||!M().revalidateOnReconnect||N())&&t.onErrorRetry(e,T,t,e=>{let t=_[T];t&&t[0]&&t[0](3,e)},{retryCount:(s.retryCount||0)+1,dedupe:!0})))}return o=!1,d(),!0},[T,r]),me=(0,f.useCallback)((...e)=>de(r,k.current,...e),[]);if(L(()=>{A.current=t,j.current=n,b(H)||(G.current=H)}),L(()=>{if(!T)return;let e=Q.bind(v,Se),t=0;M().revalidateOnFocus&&(t=Date.now()+M().focusThrottleInterval);let n=be(T,_,(n,r={})=>{if(n==0){let n=Date.now();M().revalidateOnFocus&&n>t&&N()&&(t=n+M().focusThrottleInterval,e())}else if(n==1)M().revalidateOnReconnect&&N()&&e();else if(n==2)return Q();else if(n==3)return Q(r)});return O.current=!1,k.current=T,D.current=!0,ne({_k:E}),Y&&(C[T]||(b(U)||I?e():oe(e))),()=>{O.current=!0,n()}},[T]),L(()=>{let e;function t(){let t=x(l)?l(P().data):l;t&&e!==-1&&(e=setTimeout(n,t))}function n(){!P().error&&(u||M().isVisible())&&(d||M().isOnline())?Q(Se).then(t):t()}return t(),()=>{e&&=(clearTimeout(e),-1)}},[l,u,d,T]),(0,f.useDebugValue)(K),a){if(!ae&&I&&q)throw Error(`Fallback data is required when using Suspense in SSR.`);q&&(A.current=t,j.current=n,O.current=!1);let e=w[T];if(xe(!b(e)&&q?me(e):Ce),!b(W)&&q)throw W;let r=q?Q(Se):Ce;!b(K)&&q&&(r.status=`fulfilled`,r.value=!0),xe(r)}return{mutate:me,get data(){return F.data=!0,K},get error(){return F.error=!0,W},get isValidating(){return F.isValidating=!0,Z},get isLoading(){return F.isLoading=!0,pe}}};y.defineProperty(pe,`defaultValue`,{value:Y});var Ee=ye(Te),$=r();function De({children:e,className:t}){return(0,$.jsx)(`div`,{className:l(`flex h-full flex-col min-h-0 overflow-hidden`,t),children:e})}function Oe({children:e,className:t}){return(0,$.jsx)(d,{as:`section`,padding:`md`,className:l(`border-transparent bg-card/[0.18] ring-1 ring-white/[0.04]`,t),children:e})}function ke({actions:e,className:t,hint:n,title:r}){return(0,$.jsx)(`div`,{className:l(`border-b border-border/70 pb-4`,t),children:(0,$.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,$.jsx)(`h1`,{className:`text-[28px] font-medium tracking-[-0.04em] text-foreground`,children:r}),n?(0,$.jsx)(o,{delayDuration:150,children:(0,$.jsxs)(s,{children:[(0,$.jsx)(a,{asChild:!0,children:(0,$.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`inline-flex size-7 items-center justify-center rounded-full border border-border/70 bg-card/20 text-muted-foreground transition-colors hover:bg-accent/35 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50`,"aria-label":`${r} details`,children:(0,$.jsx)(i,{className:`size-3.5`})})}),(0,$.jsx)(c,{side:`right`,className:`max-w-xs px-3 py-2`,children:n})]})}):null]}),e?(0,$.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:e}):null]})})}function Ae({title:e}){return(0,$.jsx)(`div`,{className:`mb-4`,children:(0,$.jsx)(`h2`,{className:`text-[14px] font-medium tracking-tight text-foreground/90`,children:e})})}function je({children:e,className:t,contentClassName:n,separated:r=!1,title:i}){return(0,$.jsxs)(`section`,{className:l(r?`border-t border-border pt-8`:`mb-10`,t),children:[(0,$.jsx)(Ae,{title:i}),(0,$.jsx)(`div`,{className:l(`rounded-xl border border-white/[0.04] bg-card/[0.03] shadow-sm px-5 transition-colors`,n),children:e})]})}function Me({label:e,description:t,children:n,valueClassName:r}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 border-b border-border/40 py-5 last:border-b-0 md:flex-row md:items-start md:justify-between md:gap-8 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 shrink-0 md:w-[35%] pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1 text-[12px] text-muted-foreground/70 leading-relaxed pr-4`,children:t})]}),(0,$.jsx)(`div`,{className:l(`w-full min-w-0 flex-1 md:w-[65%] flex md:justify-end`,r),children:(0,$.jsx)(`div`,{className:`w-full md:max-w-md space-y-3`,children:n})})]})}function Ne({label:e,description:t,children:n}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-3 border-b border-border/40 py-5 last:border-b-0 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1.5 text-[12px] text-muted-foreground/70 leading-relaxed max-w-2xl`,children:t})]}),(0,$.jsx)(`div`,{className:`w-full mt-1`,children:n})]})}function Pe({children:e,className:t}){return(0,$.jsx)(`div`,{className:l(`mt-3 flex flex-col gap-3 rounded-lg border border-border/40 bg-background/30 p-4`,t),children:e})}export{Me as a,Ee as c,Pe as i,De as n,Ne as o,ke as r,Oe as s,je as t};
1
+ import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{c as t,d as n,l as r}from"./graph-vendor-DRq_-6fV.js";import{Ft as i}from"./ui-vendor-C5pJa8N7.js";import{a,ft as o,i as s,o as c,s as l,ut as u}from"./index-C9HuekJm.js";import{a as d}from"./surface-pWwG5ogx.js";var f=e(n(),1),p=t(),m=Object.prototype.hasOwnProperty;function h(e,t){var n,r;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((r=e.length)===t.length)for(;r--&&h(e[r],t[r]););return r===-1}if(!n||typeof e==`object`){for(n in r=0,e)if(m.call(e,n)&&++r&&!m.call(t,n)||!(n in t)||!h(e[n],t[n]))return!1;return Object.keys(t).length===r}}return e!==e&&t!==t}var g=new WeakMap,_=()=>{},v=void 0,y=Object,b=e=>e===v,x=e=>typeof e==`function`,S=(e,t)=>({...e,...t}),ee=e=>x(e.then),C={},w={},T=`undefined`,E=typeof window!=T,D=typeof document!=T,O=E&&`Deno`in window,k=()=>E&&typeof window.requestAnimationFrame!=T,te=(e,t)=>{let n=g.get(e);return[()=>!b(t)&&e.get(t)||C,r=>{if(!b(t)){let i=e.get(t);t in w||(w[t]=i),n[5](t,S(i,r),i||C)}},n[6],()=>!b(t)&&t in w?w[t]:!b(t)&&e.get(t)||C]},A=!0,j=()=>A,[M,N]=E&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[_,_],P=()=>{let e=D&&document.visibilityState;return b(e)||e!==`hidden`},ne=e=>(D&&document.addEventListener(`visibilitychange`,e),M(`focus`,e),()=>{D&&document.removeEventListener(`visibilitychange`,e),N(`focus`,e)}),re=e=>{let t=()=>{A=!0,e()},n=()=>{A=!1};return M(`online`,t),M(`offline`,n),()=>{N(`online`,t),N(`offline`,n)}},ie={isOnline:j,isVisible:P},F={initFocus:ne,initReconnect:re},ae=!f.useId,I=!E||O,oe=e=>k()?window.requestAnimationFrame(e):setTimeout(e,1),L=I?f.useEffect:f.useLayoutEffect,R=typeof navigator<`u`&&navigator.connection,z=!I&&R&&([`slow-2g`,`2g`].includes(R.effectiveType)||R.saveData),B=new WeakMap,se=e=>y.prototype.toString.call(e),V=(e,t)=>e===`[object ${t}]`,ce=0,H=e=>{let t=typeof e,n=se(e),r=V(n,`Date`),i=V(n,`RegExp`),a=V(n,`Object`),o,s;if(y(e)===e&&!r&&!i){if(o=B.get(e),o)return o;if(o=++ce+`~`,B.set(e,o),Array.isArray(e)){for(o=`@`,s=0;s<e.length;s++)o+=H(e[s])+`,`;B.set(e,o)}if(a){o=`#`;let t=y.keys(e).sort();for(;!b(s=t.pop());)b(e[s])||(o+=s+`:`+H(e[s])+`,`);B.set(e,o)}}else o=r?e.toJSON():t==`symbol`?e.toString():t==`string`?JSON.stringify(e):``+e;return o},le=e=>{if(x(e))try{e=e()}catch{e=``}let t=e;return e=typeof e==`string`?e:(Array.isArray(e)?e.length:e)?H(e):``,[e,t]},U=0,ue=()=>++U;async function de(...e){let[t,n,r,i]=e,a=S({populateCache:!0,throwOnError:!0},typeof i==`boolean`?{revalidate:i}:i||{}),o=a.populateCache,s=a.rollbackOnError,c=a.optimisticData,l=e=>typeof s==`function`?s(e):s!==!1,u=a.throwOnError;if(x(n)){let e=n,r=[],i=t.keys();for(let n of i)!/^\$(inf|sub)\$/.test(n)&&e(t.get(n)._k)&&r.push(n);return Promise.all(r.map(d))}return d(n);async function d(n){let[i]=le(n);if(!i)return;let[s,d]=te(t,i),[f,p,m,h]=g.get(t),_=()=>{let e=f[i];return(x(a.revalidate)?a.revalidate(s().data,n):a.revalidate!==!1)&&(delete m[i],delete h[i],e&&e[0])?e[0](2).then(()=>s().data):s().data};if(e.length<3)return _();let y=r,S,C=!1,w=ue();p[i]=[w,0];let T=!b(c),E=s(),D=E.data,O=E._c,k=b(O)?D:O;if(T&&(c=x(c)?c(k,D):c,d({data:c,_c:k})),x(y))try{y=y(k)}catch(e){S=e,C=!0}if(y&&ee(y))if(y=await y.catch(e=>{S=e,C=!0}),w!==p[i][0]){if(C)throw S;return y}else C&&T&&l(S)&&(o=!0,d({data:k,_c:v}));if(o&&(C||(x(o)?d({data:o(y,k),error:v,_c:v}):d({data:y,error:v,_c:v}))),p[i][1]=ue(),Promise.resolve(_()).then(()=>{d({_c:v})}),C){if(u)throw S;return}return y}}var W=(e,t)=>{for(let n in e)e[n][0]&&e[n][0](t)},G=(e,t)=>{if(!g.has(e)){let n=S(F,t),r=Object.create(null),i=de.bind(v,e),a=_,o=Object.create(null),s=(e,t)=>{let n=o[e]||[];return o[e]=n,n.push(t),()=>n.splice(n.indexOf(t),1)},c=(t,n,r)=>{e.set(t,n);let i=o[t];if(i)for(let e of i)e(n,r)},l=()=>{if(!g.has(e)&&(g.set(e,[r,Object.create(null),Object.create(null),Object.create(null),i,c,s]),!I)){let t=n.initFocus(setTimeout.bind(v,W.bind(v,r,0))),i=n.initReconnect(setTimeout.bind(v,W.bind(v,r,1)));a=()=>{t&&t(),i&&i(),g.delete(e)}}};return l(),[e,i,l,a]}return[e,g.get(e)[4]]},K=(e,t,n,r,i)=>{let a=n.errorRetryCount,o=i.retryCount,s=~~((Math.random()+.5)*(1<<(o<8?o:8)))*n.errorRetryInterval;!b(a)&&o>a||setTimeout(r,s,i)},q=h,[J,fe]=G(new Map),Y=S({onLoadingSlow:_,onSuccess:_,onError:_,onErrorRetry:K,onDiscarded:_,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:z?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:z?5e3:3e3,compare:q,isPaused:()=>!1,cache:J,mutate:fe,fallback:{}},ie),X=(e,t)=>{let n=S(e,t);if(t){let{use:r,fallback:i}=e,{use:a,fallback:o}=t;r&&a&&(n.use=r.concat(a)),i&&o&&(n.fallback=S(i,o))}return n},Z=(0,f.createContext)({}),pe=e=>{let{value:t}=e,n=(0,f.useContext)(Z),r=x(t),i=(0,f.useMemo)(()=>r?t(n):t,[r,n,t]),a=(0,f.useMemo)(()=>r?i:X(n,i),[r,n,i]),o=i&&i.provider,s=(0,f.useRef)(v);o&&!s.current&&(s.current=G(o(a.cache||J),i));let c=s.current;return c&&(a.cache=c[0],a.mutate=c[1]),L(()=>{if(c)return c[2]&&c[2](),c[3]},[]),(0,f.createElement)(Z.Provider,S(e,{value:a}))},Q=E&&window.__SWR_DEVTOOLS_USE__,me=Q?window.__SWR_DEVTOOLS_USE__:[],he=()=>{Q&&(window.__SWR_DEVTOOLS_REACT__=f.default)},ge=e=>x(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],_e=()=>{let e=(0,f.useContext)(Z);return(0,f.useMemo)(()=>S(Y,e),[e])},ve=me.concat(e=>(t,n,r)=>e(t,n&&((...e)=>{let[r]=le(t),[,,,i]=g.get(J);if(r.startsWith(`$inf$`))return n(...e);let a=i[r];return b(a)?n(...e):(delete i[r],a)}),r)),ye=e=>function(...t){let n=_e(),[r,i,a]=ge(t),o=X(n,a),s=e,{use:c}=o,l=(c||[]).concat(ve);for(let e=l.length;e--;)s=l[e](s);return s(r,i||o.fetcher||null,o)},be=(e,t,n)=>{let r=t[e]||(t[e]=[]);return r.push(n),()=>{let e=r.indexOf(n);e>=0&&(r[e]=r[r.length-1],r.pop())}};he();var xe=f.use||(e=>{switch(e.status){case`pending`:throw e;case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:throw e.status=`pending`,e.then(t=>{e.status=`fulfilled`,e.value=t},t=>{e.status=`rejected`,e.reason=t}),e}}),Se={dedupe:!0},Ce=Promise.resolve(v),we=()=>_,Te=(e,t,n)=>{let{cache:r,compare:i,suspense:a,fallbackData:o,revalidateOnMount:s,revalidateIfStale:c,refreshInterval:l,refreshWhenHidden:u,refreshWhenOffline:d,keepPreviousData:m,strictServerPrefetchWarning:h}=n,[_,y,C,w]=g.get(r),[T,E]=le(e),D=(0,f.useRef)(!1),O=(0,f.useRef)(!1),k=(0,f.useRef)(T),A=(0,f.useRef)(t),j=(0,f.useRef)(n),M=()=>j.current,N=()=>M().isVisible()&&M().isOnline(),[P,ne,re,ie]=te(r,T),F=(0,f.useRef)({}).current,R=b(o)?b(n.fallback)?v:n.fallback[T]:o,z=(e,t)=>{for(let n in F){let r=n;if(r===`data`){if(!i(e[r],t[r])&&(!b(e[r])||!i(K,t[r])))return!1}else if(t[r]!==e[r])return!1}return!0},B=!D.current,se=(0,f.useMemo)(()=>{let e=P(),n=ie(),r=e=>{let n=S(e);return delete n._k,!(!T||!t||M().isPaused())&&(B&&!b(s)?s:b(b(R)?n.data:R)||c)?{isValidating:!0,isLoading:!0,...n}:n},i=r(e),a=e===n?i:r(n),o=i;return[()=>{let e=r(P());return z(e,o)?(o.data=e.data,o.isLoading=e.isLoading,o.isValidating=e.isValidating,o.error=e.error,o):(o=e,e)},()=>a]},[r,T]),V=(0,p.useSyncExternalStore)((0,f.useCallback)(e=>re(T,(t,n)=>{z(n,t)||e()}),[r,T]),se[0],se[1]),ce=_[T]&&_[T].length>0,H=V.data,U=b(H)?R&&ee(R)?xe(R):R:H,W=V.error,G=(0,f.useRef)(U),K=m?b(H)?b(G.current)?U:G.current:H:U,q=T&&b(U),J=(0,f.useRef)(null);!I&&(0,p.useSyncExternalStore)(we,()=>(J.current=!1,J),()=>(J.current=!0,J));let fe=J.current;h&&fe&&!a&&q&&console.warn(`Missing pre-initiated data for serialized key "${T}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let Y=!T||!t||M().isPaused()||ce&&!b(W)?!1:B&&!b(s)?s:a?b(U)?!1:c:b(U)||c,X=B&&Y,Z=b(V.isValidating)?X:V.isValidating,pe=b(V.isLoading)?X:V.isLoading,Q=(0,f.useCallback)(async e=>{let t=A.current;if(!T||!t||O.current||M().isPaused())return!1;let r,a,o=!0,s=e||{},c=!C[T]||!s.dedupe,l=()=>ae?!O.current&&T===k.current&&D.current:T===k.current,u={isValidating:!1,isLoading:!1},d=()=>{ne(u)},f=()=>{let e=C[T];e&&e[1]===a&&delete C[T]},p={isValidating:!0};b(P().data)&&(p.isLoading=!0);try{if(c&&(ne(p),n.loadingTimeout&&b(P().data)&&setTimeout(()=>{o&&l()&&M().onLoadingSlow(T,n)},n.loadingTimeout),C[T]=[t(E),ue()]),[r,a]=C[T],r=await r,c&&setTimeout(f,n.dedupingInterval),!C[T]||C[T][1]!==a)return c&&l()&&M().onDiscarded(T),!1;u.error=v;let e=y[T];if(!b(e)&&(a<=e[0]||a<=e[1]||e[1]===0))return d(),c&&l()&&M().onDiscarded(T),!1;let s=P().data;u.data=i(s,r)?s:r,c&&l()&&M().onSuccess(r,T,n)}catch(e){f();let t=M(),{shouldRetryOnError:n}=t;t.isPaused()||(u.error=e,c&&l()&&(t.onError(e,T,t),(n===!0||x(n)&&n(e))&&(!M().revalidateOnFocus||!M().revalidateOnReconnect||N())&&t.onErrorRetry(e,T,t,e=>{let t=_[T];t&&t[0]&&t[0](3,e)},{retryCount:(s.retryCount||0)+1,dedupe:!0})))}return o=!1,d(),!0},[T,r]),me=(0,f.useCallback)((...e)=>de(r,k.current,...e),[]);if(L(()=>{A.current=t,j.current=n,b(H)||(G.current=H)}),L(()=>{if(!T)return;let e=Q.bind(v,Se),t=0;M().revalidateOnFocus&&(t=Date.now()+M().focusThrottleInterval);let n=be(T,_,(n,r={})=>{if(n==0){let n=Date.now();M().revalidateOnFocus&&n>t&&N()&&(t=n+M().focusThrottleInterval,e())}else if(n==1)M().revalidateOnReconnect&&N()&&e();else if(n==2)return Q();else if(n==3)return Q(r)});return O.current=!1,k.current=T,D.current=!0,ne({_k:E}),Y&&(C[T]||(b(U)||I?e():oe(e))),()=>{O.current=!0,n()}},[T]),L(()=>{let e;function t(){let t=x(l)?l(P().data):l;t&&e!==-1&&(e=setTimeout(n,t))}function n(){!P().error&&(u||M().isVisible())&&(d||M().isOnline())?Q(Se).then(t):t()}return t(),()=>{e&&=(clearTimeout(e),-1)}},[l,u,d,T]),(0,f.useDebugValue)(K),a){if(!ae&&I&&q)throw Error(`Fallback data is required when using Suspense in SSR.`);q&&(A.current=t,j.current=n,O.current=!1);let e=w[T];if(xe(!b(e)&&q?me(e):Ce),!b(W)&&q)throw W;let r=q?Q(Se):Ce;!b(K)&&q&&(r.status=`fulfilled`,r.value=!0),xe(r)}return{mutate:me,get data(){return F.data=!0,K},get error(){return F.error=!0,W},get isValidating(){return F.isValidating=!0,Z},get isLoading(){return F.isLoading=!0,pe}}};y.defineProperty(pe,`defaultValue`,{value:Y});var Ee=ye(Te),$=r();function De({children:e,className:t}){return(0,$.jsx)(`div`,{className:o(`flex h-full flex-col min-h-0 overflow-hidden`,t),children:e})}function Oe({children:e,className:t}){return(0,$.jsx)(d,{as:`section`,padding:`md`,className:o(`border-transparent bg-card/[0.18] ring-1 ring-white/[0.04]`,t),children:e})}function ke({actions:e,className:t,hint:n,title:r}){return(0,$.jsx)(`div`,{className:o(`border-b border-border/70 pb-4`,t),children:(0,$.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,$.jsx)(`h1`,{className:`text-[28px] font-medium tracking-[-0.04em] text-foreground`,children:r}),n?(0,$.jsx)(c,{delayDuration:150,children:(0,$.jsxs)(s,{children:[(0,$.jsx)(l,{asChild:!0,children:(0,$.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`inline-flex size-7 items-center justify-center rounded-full border border-border/70 bg-card/20 text-muted-foreground transition-colors hover:bg-accent/35 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50`,"aria-label":`${r} details`,children:(0,$.jsx)(i,{className:`size-3.5`})})}),(0,$.jsx)(a,{side:`right`,className:`max-w-xs px-3 py-2`,children:n})]})}):null]}),e?(0,$.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:e}):null]})})}function Ae({title:e}){return(0,$.jsx)(`div`,{className:`mb-4`,children:(0,$.jsx)(`h2`,{className:`text-[14px] font-medium tracking-tight text-foreground/90`,children:e})})}function je({children:e,className:t,contentClassName:n,separated:r=!1,title:i}){return(0,$.jsxs)(`section`,{className:o(r?`border-t border-border pt-8`:`mb-10`,t),children:[(0,$.jsx)(Ae,{title:i}),(0,$.jsx)(`div`,{className:o(`rounded-xl border border-white/[0.04] bg-card/[0.03] shadow-sm px-5 transition-colors`,n),children:e})]})}function Me({label:e,description:t,children:n,valueClassName:r}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 border-b border-border/40 py-5 last:border-b-0 md:flex-row md:items-start md:justify-between md:gap-8 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 shrink-0 md:w-[35%] pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1 text-[12px] text-muted-foreground/70 leading-relaxed pr-4`,children:t})]}),(0,$.jsx)(`div`,{className:o(`w-full min-w-0 flex-1 md:w-[65%] flex md:justify-end`,r),children:(0,$.jsx)(`div`,{className:`w-full md:max-w-md space-y-3`,children:n})})]})}function Ne({label:e,description:t,children:n}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-3 border-b border-border/40 py-5 last:border-b-0 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1.5 text-[12px] text-muted-foreground/70 leading-relaxed max-w-2xl`,children:t})]}),(0,$.jsx)(`div`,{className:`w-full mt-1`,children:n})]})}function Pe({children:e,className:t}){return(0,$.jsx)(`div`,{className:o(`mt-3 flex flex-col gap-3 rounded-lg border border-border/40 bg-background/30 p-4`,t),children:e})}export{Me as a,Ee as c,Pe as i,De as n,Ne as o,ke as r,Oe as s,je as t};
@@ -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{Ft as r,q as i,ut as a}from"./ui-vendor-C5pJa8N7.js";import{Y as o,a as s,i as c,nt as l,o as u,r as d,s as f,ut as p}from"./index-C9HuekJm.js";import{a as m,o as h}from"./surface-pWwG5ogx.js";import{c as g,n as _,r as v}from"./PageScaffold-f6g2l7XN.js";async function y(){return o(`/api/prompts`,{errorMessage:`Failed to fetch prompts`})}async function b(e){return o(`/api/prompts`,{method:`PUT`,body:e,errorMessage:`Failed to save prompts`})}var x=e(t(),1),S=n(),C=`min-h-0 w-full flex-1 resize-none select-text rounded-md bg-transparent p-3 font-mono text-[13px] leading-relaxed text-foreground placeholder:text-muted-foreground transition-colors focus:bg-background/35 focus:outline-none scrollbar-none`;function w(){let{data:e,isLoading:t,mutate:n}=g(`promptSettings`,y),[r,o]=(0,x.useState)(``),[s,c]=(0,x.useState)(``),[u,f]=(0,x.useState)(!1);(0,x.useEffect)(()=>{e&&(o(e.custom_prompt),c(e.custom_post_prompt))},[e]);let w=async()=>{f(!0);try{n(await b({custom_prompt:r,custom_post_prompt:s}),!1),i.success(`Prompts saved`)}catch{i.error(`Failed to save prompts`)}finally{f(!1)}};return t?(0,S.jsx)(d,{label:`Loading prompts...`,textClassName:`text-[13px]`}):(0,S.jsx)(_,{children:(0,S.jsxs)(`div`,{className:`mx-auto flex h-full w-full max-w-[800px] flex-col px-4 pb-10 pt-6`,children:[(0,S.jsx)(v,{title:`Prompts`,hint:`Custom Prompt is appended to the global system prompt layer. Custom Post Prompt is appended after the built-in runtime post prompt.`,actions:(0,S.jsxs)(p,{type:`button`,onClick:()=>void w(),disabled:u,size:`sm`,className:`text-[13px]`,children:[(0,S.jsx)(a,{className:`size-4`}),u?`Saving...`:`Save Changes`]})}),(0,S.jsxs)(`div`,{className:`grid min-h-0 flex-1 gap-8 pt-6`,children:[(0,S.jsxs)(`div`,{className:`flex min-h-0 flex-col`,children:[(0,S.jsx)(`div`,{className:`mb-3 flex items-center justify-between px-1`,children:(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{className:`text-[15px] font-medium text-foreground`,children:`Custom Prompt`}),T(`Custom Prompt details`,`Appended to every node's system prompt.`),(0,S.jsxs)(h,{tone:`neutral`,className:`px-2 py-0.5`,children:[r.length,` chars`]})]})}),(0,S.jsx)(m,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(l,{"aria-label":`Custom Prompt`,value:r,onChange:e=>o(e.target.value),placeholder:`Appended to every node's system prompt...`,className:C,mono:!0})})]}),(0,S.jsxs)(`div`,{className:`flex min-h-0 flex-col`,children:[(0,S.jsx)(`div`,{className:`mb-3 flex items-center justify-between px-1`,children:(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{className:`text-[15px] font-medium text-foreground`,children:`Custom Post Prompt`}),T(`Custom Post Prompt details`,`Appended after the built-in runtime post prompt.`),(0,S.jsxs)(h,{tone:`neutral`,className:`px-2 py-0.5`,children:[s.length,` chars`]})]})}),(0,S.jsx)(m,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(l,{"aria-label":`Custom Post Prompt`,value:s,onChange:e=>c(e.target.value),placeholder:`Appended after the built-in runtime post prompt...`,className:C,mono:!0})})]})]})]})})}var T=(e,t)=>(0,S.jsx)(u,{delayDuration:150,children:(0,S.jsxs)(c,{children:[(0,S.jsx)(f,{asChild:!0,children:(0,S.jsx)(p,{type:`button`,variant:`ghost`,size:`icon-xs`,"aria-label":e,className:`rounded-full text-muted-foreground hover:bg-accent/35 hover:text-foreground`,children:(0,S.jsx)(r,{className:`size-3.5`})})}),(0,S.jsx)(s,{className:`max-w-xs`,children:t})]})});export{w as PromptsPage};