flowent 0.0.6 → 0.0.10

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 (398) hide show
  1. package/README.md +1 -4
  2. package/backend/README.md +1 -4
  3. package/backend/pyproject.toml +2 -8
  4. package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
  5. package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
  6. package/backend/src/flowent/__pycache__/cli.cpython-313.pyc +0 -0
  7. package/backend/src/flowent/__pycache__/context.cpython-313.pyc +0 -0
  8. package/backend/src/flowent/__pycache__/llm.cpython-313.pyc +0 -0
  9. package/backend/src/flowent/__pycache__/logging.cpython-313.pyc +0 -0
  10. package/backend/src/flowent/__pycache__/main.cpython-313.pyc +0 -0
  11. package/backend/src/flowent/__pycache__/patch.cpython-313.pyc +0 -0
  12. package/backend/src/flowent/__pycache__/paths.cpython-313.pyc +0 -0
  13. package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
  14. package/backend/src/flowent/__pycache__/storage.cpython-313.pyc +0 -0
  15. package/backend/src/flowent/__pycache__/tools.cpython-313.pyc +0 -0
  16. package/backend/src/flowent/agent.py +217 -3094
  17. package/backend/src/flowent/cli.py +19 -24
  18. package/backend/src/flowent/context.py +127 -0
  19. package/backend/src/flowent/llm.py +256 -0
  20. package/backend/src/flowent/logging.py +170 -129
  21. package/backend/src/flowent/main.py +321 -70
  22. package/backend/src/flowent/patch.py +182 -0
  23. package/backend/src/flowent/paths.py +11 -0
  24. package/backend/src/flowent/sandbox.py +214 -40
  25. package/backend/src/flowent/static/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  26. package/backend/src/flowent/static/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  27. package/backend/src/flowent/static/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  28. package/backend/src/flowent/static/assets/index-C76K95ty.js +81 -0
  29. package/backend/src/flowent/static/assets/index-iUMNKvlU.css +2 -0
  30. package/backend/src/flowent/static/flowent.png +0 -0
  31. package/backend/src/flowent/static/index.html +5 -25
  32. package/backend/src/flowent/storage.py +302 -0
  33. package/backend/src/flowent/tools.py +364 -0
  34. package/backend/tests/__pycache__/test_agent_tools.cpython-313-pytest-9.0.3.pyc +0 -0
  35. package/backend/tests/__pycache__/test_health.cpython-313-pytest-9.0.3.pyc +0 -0
  36. package/backend/tests/__pycache__/test_llm_providers.cpython-313-pytest-9.0.3.pyc +0 -0
  37. package/backend/tests/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
  38. package/backend/tests/__pycache__/test_persistence.cpython-313-pytest-9.0.3.pyc +0 -0
  39. package/backend/tests/__pycache__/test_workspace_chat.cpython-313-pytest-9.0.3.pyc +0 -0
  40. package/backend/tests/test_agent_tools.py +449 -0
  41. package/backend/tests/test_health.py +12 -0
  42. package/backend/tests/test_llm_providers.py +113 -0
  43. package/backend/tests/test_logging.py +182 -0
  44. package/backend/tests/test_persistence.py +125 -0
  45. package/backend/tests/test_workspace_chat.py +578 -0
  46. package/backend/uv.lock +803 -99
  47. package/dist/frontend/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  48. package/dist/frontend/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  49. package/dist/frontend/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  50. package/dist/frontend/assets/index-C76K95ty.js +81 -0
  51. package/dist/frontend/assets/index-iUMNKvlU.css +2 -0
  52. package/dist/frontend/flowent.png +0 -0
  53. package/dist/frontend/index.html +5 -25
  54. package/package.json +1 -2
  55. package/backend/src/flowent/__pycache__/_version.cpython-313.pyc +0 -0
  56. package/backend/src/flowent/__pycache__/access.cpython-313.pyc +0 -0
  57. package/backend/src/flowent/__pycache__/assistant_commands.cpython-313.pyc +0 -0
  58. package/backend/src/flowent/__pycache__/config.cpython-313.pyc +0 -0
  59. package/backend/src/flowent/__pycache__/events.cpython-313.pyc +0 -0
  60. package/backend/src/flowent/__pycache__/graph_runtime.cpython-313.pyc +0 -0
  61. package/backend/src/flowent/__pycache__/graph_service.cpython-313.pyc +0 -0
  62. package/backend/src/flowent/__pycache__/image_assets.cpython-313.pyc +0 -0
  63. package/backend/src/flowent/__pycache__/mcp_service.cpython-313.pyc +0 -0
  64. package/backend/src/flowent/__pycache__/model_metadata.cpython-313.pyc +0 -0
  65. package/backend/src/flowent/__pycache__/network.cpython-313.pyc +0 -0
  66. package/backend/src/flowent/__pycache__/observability_service.cpython-313.pyc +0 -0
  67. package/backend/src/flowent/__pycache__/registry.cpython-313.pyc +0 -0
  68. package/backend/src/flowent/__pycache__/role_management.cpython-313.pyc +0 -0
  69. package/backend/src/flowent/__pycache__/runtime.cpython-313.pyc +0 -0
  70. package/backend/src/flowent/__pycache__/security.cpython-313.pyc +0 -0
  71. package/backend/src/flowent/__pycache__/settings.cpython-313.pyc +0 -0
  72. package/backend/src/flowent/__pycache__/settings_management.cpython-313.pyc +0 -0
  73. package/backend/src/flowent/__pycache__/state_db.cpython-313.pyc +0 -0
  74. package/backend/src/flowent/__pycache__/workspace_store.cpython-313.pyc +0 -0
  75. package/backend/src/flowent/access.py +0 -247
  76. package/backend/src/flowent/assistant_commands.py +0 -115
  77. package/backend/src/flowent/channels/__init__.py +0 -3
  78. package/backend/src/flowent/channels/__pycache__/__init__.cpython-313.pyc +0 -0
  79. package/backend/src/flowent/channels/__pycache__/telegram.cpython-313.pyc +0 -0
  80. package/backend/src/flowent/channels/telegram.py +0 -615
  81. package/backend/src/flowent/config.py +0 -14
  82. package/backend/src/flowent/dev.py +0 -3
  83. package/backend/src/flowent/events.py +0 -157
  84. package/backend/src/flowent/graph_runtime.py +0 -60
  85. package/backend/src/flowent/graph_service.py +0 -2508
  86. package/backend/src/flowent/image_assets.py +0 -356
  87. package/backend/src/flowent/mcp_service.py +0 -1918
  88. package/backend/src/flowent/model_metadata.py +0 -102
  89. package/backend/src/flowent/models/__init__.py +0 -125
  90. package/backend/src/flowent/models/__pycache__/__init__.cpython-313.pyc +0 -0
  91. package/backend/src/flowent/models/__pycache__/agent.cpython-313.pyc +0 -0
  92. package/backend/src/flowent/models/__pycache__/base.cpython-313.pyc +0 -0
  93. package/backend/src/flowent/models/__pycache__/blueprint.cpython-313.pyc +0 -0
  94. package/backend/src/flowent/models/__pycache__/content.cpython-313.pyc +0 -0
  95. package/backend/src/flowent/models/__pycache__/delta.cpython-313.pyc +0 -0
  96. package/backend/src/flowent/models/__pycache__/event.cpython-313.pyc +0 -0
  97. package/backend/src/flowent/models/__pycache__/graph.cpython-313.pyc +0 -0
  98. package/backend/src/flowent/models/__pycache__/history.cpython-313.pyc +0 -0
  99. package/backend/src/flowent/models/__pycache__/llm.cpython-313.pyc +0 -0
  100. package/backend/src/flowent/models/__pycache__/message.cpython-313.pyc +0 -0
  101. package/backend/src/flowent/models/__pycache__/tab.cpython-313.pyc +0 -0
  102. package/backend/src/flowent/models/__pycache__/todo.cpython-313.pyc +0 -0
  103. package/backend/src/flowent/models/agent.py +0 -34
  104. package/backend/src/flowent/models/base.py +0 -24
  105. package/backend/src/flowent/models/blueprint.py +0 -176
  106. package/backend/src/flowent/models/content.py +0 -164
  107. package/backend/src/flowent/models/delta.py +0 -44
  108. package/backend/src/flowent/models/event.py +0 -51
  109. package/backend/src/flowent/models/graph.py +0 -472
  110. package/backend/src/flowent/models/history.py +0 -272
  111. package/backend/src/flowent/models/llm.py +0 -62
  112. package/backend/src/flowent/models/message.py +0 -33
  113. package/backend/src/flowent/models/tab.py +0 -85
  114. package/backend/src/flowent/models/todo.py +0 -10
  115. package/backend/src/flowent/network.py +0 -146
  116. package/backend/src/flowent/observability_service.py +0 -218
  117. package/backend/src/flowent/prompts/__init__.py +0 -67
  118. package/backend/src/flowent/prompts/__pycache__/__init__.cpython-313.pyc +0 -0
  119. package/backend/src/flowent/prompts/__pycache__/common.cpython-313.pyc +0 -0
  120. package/backend/src/flowent/prompts/__pycache__/steward.cpython-313.pyc +0 -0
  121. package/backend/src/flowent/prompts/common.py +0 -250
  122. package/backend/src/flowent/prompts/steward.py +0 -64
  123. package/backend/src/flowent/providers/__init__.py +0 -23
  124. package/backend/src/flowent/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  125. package/backend/src/flowent/providers/__pycache__/anthropic.cpython-313.pyc +0 -0
  126. package/backend/src/flowent/providers/__pycache__/base_url.cpython-313.pyc +0 -0
  127. package/backend/src/flowent/providers/__pycache__/configuration.cpython-313.pyc +0 -0
  128. package/backend/src/flowent/providers/__pycache__/content.cpython-313.pyc +0 -0
  129. package/backend/src/flowent/providers/__pycache__/errors.cpython-313.pyc +0 -0
  130. package/backend/src/flowent/providers/__pycache__/gateway.cpython-313.pyc +0 -0
  131. package/backend/src/flowent/providers/__pycache__/headers.cpython-313.pyc +0 -0
  132. package/backend/src/flowent/providers/__pycache__/management.cpython-313.pyc +0 -0
  133. package/backend/src/flowent/providers/__pycache__/openai.cpython-313.pyc +0 -0
  134. package/backend/src/flowent/providers/__pycache__/openai_responses.cpython-313.pyc +0 -0
  135. package/backend/src/flowent/providers/__pycache__/registry.cpython-313.pyc +0 -0
  136. package/backend/src/flowent/providers/__pycache__/sse.cpython-313.pyc +0 -0
  137. package/backend/src/flowent/providers/__pycache__/thinking.cpython-313.pyc +0 -0
  138. package/backend/src/flowent/providers/anthropic.py +0 -468
  139. package/backend/src/flowent/providers/base_url.py +0 -60
  140. package/backend/src/flowent/providers/configuration.py +0 -189
  141. package/backend/src/flowent/providers/content.py +0 -122
  142. package/backend/src/flowent/providers/errors.py +0 -223
  143. package/backend/src/flowent/providers/gateway.py +0 -169
  144. package/backend/src/flowent/providers/gemini.py +0 -447
  145. package/backend/src/flowent/providers/headers.py +0 -20
  146. package/backend/src/flowent/providers/management.py +0 -96
  147. package/backend/src/flowent/providers/ollama.py +0 -293
  148. package/backend/src/flowent/providers/openai.py +0 -422
  149. package/backend/src/flowent/providers/openai_responses.py +0 -655
  150. package/backend/src/flowent/providers/registry.py +0 -144
  151. package/backend/src/flowent/providers/sse.py +0 -31
  152. package/backend/src/flowent/providers/thinking.py +0 -79
  153. package/backend/src/flowent/registry.py +0 -73
  154. package/backend/src/flowent/role_management.py +0 -267
  155. package/backend/src/flowent/routes/__init__.py +0 -28
  156. package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
  157. package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
  158. package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
  159. package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
  160. package/backend/src/flowent/routes/__pycache__/mcp.cpython-313.pyc +0 -0
  161. package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
  162. package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
  163. package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
  164. package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
  165. package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
  166. package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
  167. package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
  168. package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
  169. package/backend/src/flowent/routes/access.py +0 -48
  170. package/backend/src/flowent/routes/assistant.py +0 -155
  171. package/backend/src/flowent/routes/image_assets.py +0 -33
  172. package/backend/src/flowent/routes/mcp.py +0 -125
  173. package/backend/src/flowent/routes/meta.py +0 -28
  174. package/backend/src/flowent/routes/nodes.py +0 -413
  175. package/backend/src/flowent/routes/prompts.py +0 -46
  176. package/backend/src/flowent/routes/providers_route.py +0 -365
  177. package/backend/src/flowent/routes/roles.py +0 -207
  178. package/backend/src/flowent/routes/settings.py +0 -328
  179. package/backend/src/flowent/routes/tabs.py +0 -310
  180. package/backend/src/flowent/routes/ws.py +0 -33
  181. package/backend/src/flowent/runtime.py +0 -165
  182. package/backend/src/flowent/security.py +0 -57
  183. package/backend/src/flowent/settings.py +0 -2518
  184. package/backend/src/flowent/settings_management.py +0 -298
  185. package/backend/src/flowent/state_db.py +0 -120
  186. package/backend/src/flowent/static/assets/AssistantPage-VBohhz4d.js +0 -1
  187. package/backend/src/flowent/static/assets/ChannelsPage-CIydPZA_.js +0 -1
  188. package/backend/src/flowent/static/assets/McpPage-CHPm2TPY.js +0 -7
  189. package/backend/src/flowent/static/assets/PageScaffold-DteOA8V7.js +0 -1
  190. package/backend/src/flowent/static/assets/PromptsPage-CSmJ3sZg.js +0 -1
  191. package/backend/src/flowent/static/assets/ProvidersPage-sl2jeG4e.js +0 -3
  192. package/backend/src/flowent/static/assets/RolesPage-DCe7W6Km.js +0 -1
  193. package/backend/src/flowent/static/assets/SettingsPage-Bix9e63E.js +0 -3
  194. package/backend/src/flowent/static/assets/ToolsPage-favNkj5C.js +0 -1
  195. package/backend/src/flowent/static/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  196. package/backend/src/flowent/static/assets/WorkspacePage-KuaDjt_D.js +0 -3
  197. package/backend/src/flowent/static/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  198. package/backend/src/flowent/static/assets/alert-dialog-DIBUCmqM.js +0 -1
  199. package/backend/src/flowent/static/assets/datetime-eJqd0V2S.js +0 -1
  200. package/backend/src/flowent/static/assets/dialog-BOvHIBrg.js +0 -1
  201. package/backend/src/flowent/static/assets/elk-worker.min-C9JGDOE-.js +0 -6312
  202. package/backend/src/flowent/static/assets/graph-vendor-CHpVij2M.css +0 -1
  203. package/backend/src/flowent/static/assets/graph-vendor-DRq_-6fV.js +0 -7
  204. package/backend/src/flowent/static/assets/index-Biio-CoI.js +0 -10
  205. package/backend/src/flowent/static/assets/index-CmQvO7sl.css +0 -1
  206. package/backend/src/flowent/static/assets/layout.worker-jMHqAFbP.js +0 -24
  207. package/backend/src/flowent/static/assets/markdown-vendor-C9RtvaJh.js +0 -29
  208. package/backend/src/flowent/static/assets/modelParams-DcEhGnu0.js +0 -1
  209. package/backend/src/flowent/static/assets/react-vendor-mEs_JJxa.js +0 -9
  210. package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +0 -1
  211. package/backend/src/flowent/static/assets/rolldown-runtime-BYbx6iT9.js +0 -1
  212. package/backend/src/flowent/static/assets/select-D9SwnlXF.js +0 -1
  213. package/backend/src/flowent/static/assets/surface-Bzr1FRG4.js +0 -1
  214. package/backend/src/flowent/static/assets/triState-DgLlKdRR.js +0 -1
  215. package/backend/src/flowent/static/assets/ui-vendor-UazN8rcv.js +0 -51
  216. package/backend/src/flowent/static/favicon.svg +0 -4
  217. package/backend/src/flowent/tools/__init__.py +0 -275
  218. package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  219. package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
  220. package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
  221. package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
  222. package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
  223. package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
  224. package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
  225. package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
  226. package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
  227. package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
  228. package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
  229. package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
  230. package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
  231. package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
  232. package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
  233. package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
  234. package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
  235. package/backend/src/flowent/tools/__pycache__/mcp.cpython-313.pyc +0 -0
  236. package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
  237. package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
  238. package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
  239. package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
  240. package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
  241. package/backend/src/flowent/tools/connect.py +0 -100
  242. package/backend/src/flowent/tools/contacts.py +0 -22
  243. package/backend/src/flowent/tools/create_agent.py +0 -191
  244. package/backend/src/flowent/tools/create_tab.py +0 -61
  245. package/backend/src/flowent/tools/delete_tab.py +0 -39
  246. package/backend/src/flowent/tools/edit.py +0 -142
  247. package/backend/src/flowent/tools/exec.py +0 -118
  248. package/backend/src/flowent/tools/fetch.py +0 -85
  249. package/backend/src/flowent/tools/idle.py +0 -27
  250. package/backend/src/flowent/tools/list_roles.py +0 -75
  251. package/backend/src/flowent/tools/list_tabs.py +0 -100
  252. package/backend/src/flowent/tools/list_tools.py +0 -28
  253. package/backend/src/flowent/tools/manage_prompts.py +0 -102
  254. package/backend/src/flowent/tools/manage_providers.py +0 -220
  255. package/backend/src/flowent/tools/manage_roles.py +0 -275
  256. package/backend/src/flowent/tools/manage_settings.py +0 -364
  257. package/backend/src/flowent/tools/mcp.py +0 -199
  258. package/backend/src/flowent/tools/read.py +0 -152
  259. package/backend/src/flowent/tools/send.py +0 -68
  260. package/backend/src/flowent/tools/set_permissions.py +0 -99
  261. package/backend/src/flowent/tools/sleep.py +0 -41
  262. package/backend/src/flowent/tools/todo.py +0 -51
  263. package/backend/src/flowent/workspace_store.py +0 -479
  264. package/backend/tests/__init__.py +0 -0
  265. package/backend/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  266. package/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  267. package/backend/tests/conftest.py +0 -6
  268. package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  269. package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
  270. package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
  271. package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
  272. package/backend/tests/integration/api/__pycache__/test_mcp_api.cpython-313-pytest-9.0.3.pyc +0 -0
  273. package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
  274. package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
  275. package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
  276. package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
  277. package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
  278. package/backend/tests/integration/api/conftest.py +0 -29
  279. package/backend/tests/integration/api/test_access_api.py +0 -182
  280. package/backend/tests/integration/api/test_assistant_api.py +0 -354
  281. package/backend/tests/integration/api/test_frontend_mounting.py +0 -61
  282. package/backend/tests/integration/api/test_mcp_api.py +0 -116
  283. package/backend/tests/integration/api/test_meta_api.py +0 -33
  284. package/backend/tests/integration/api/test_nodes_api.py +0 -722
  285. package/backend/tests/integration/api/test_prompts_api.py +0 -47
  286. package/backend/tests/integration/api/test_roles_api.py +0 -228
  287. package/backend/tests/integration/api/test_tabs_api.py +0 -802
  288. package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
  289. package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
  290. package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  291. package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
  292. package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
  293. package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
  294. package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
  295. package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  296. package/backend/tests/unit/agent/test_agent_public_api.py +0 -837
  297. package/backend/tests/unit/agent/test_agent_runtime.py +0 -2942
  298. package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
  299. package/backend/tests/unit/channels/test_telegram_channel.py +0 -552
  300. package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
  301. package/backend/tests/unit/logging/test_logging.py +0 -132
  302. package/backend/tests/unit/prompts/__pycache__/test_prompts.cpython-313-pytest-9.0.3.pyc +0 -0
  303. package/backend/tests/unit/prompts/test_prompts.py +0 -570
  304. package/backend/tests/unit/providers/__pycache__/test_anthropic_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  305. package/backend/tests/unit/providers/__pycache__/test_errors.cpython-313-pytest-9.0.3.pyc +0 -0
  306. package/backend/tests/unit/providers/__pycache__/test_extract_delta_parts.cpython-313-pytest-9.0.3.pyc +0 -0
  307. package/backend/tests/unit/providers/__pycache__/test_openai_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  308. package/backend/tests/unit/providers/__pycache__/test_openai_responses.cpython-313-pytest-9.0.3.pyc +0 -0
  309. package/backend/tests/unit/providers/__pycache__/test_provider_gateway.cpython-313-pytest-9.0.3.pyc +0 -0
  310. package/backend/tests/unit/providers/__pycache__/test_think_tag_parser.cpython-313-pytest-9.0.3.pyc +0 -0
  311. package/backend/tests/unit/providers/test_anthropic_provider.py +0 -185
  312. package/backend/tests/unit/providers/test_errors.py +0 -68
  313. package/backend/tests/unit/providers/test_extract_delta_parts.py +0 -22
  314. package/backend/tests/unit/providers/test_openai_provider.py +0 -139
  315. package/backend/tests/unit/providers/test_openai_responses.py +0 -402
  316. package/backend/tests/unit/providers/test_provider_gateway.py +0 -359
  317. package/backend/tests/unit/providers/test_think_tag_parser.py +0 -36
  318. package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  319. package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
  320. package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  321. package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  322. package/backend/tests/unit/routes/test_prompts_routes.py +0 -104
  323. package/backend/tests/unit/routes/test_providers_route.py +0 -370
  324. package/backend/tests/unit/routes/test_roles_routes.py +0 -535
  325. package/backend/tests/unit/routes/test_settings_routes.py +0 -1142
  326. package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  327. package/backend/tests/unit/runtime/test_bootstrap_runtime.py +0 -1002
  328. package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
  329. package/backend/tests/unit/sandbox/test_sandbox_tools.py +0 -78
  330. package/backend/tests/unit/security/__pycache__/test_security.cpython-313-pytest-9.0.3.pyc +0 -0
  331. package/backend/tests/unit/security/test_security.py +0 -124
  332. package/backend/tests/unit/settings/__pycache__/test_settings_roles.cpython-313-pytest-9.0.3.pyc +0 -0
  333. package/backend/tests/unit/settings/test_settings_roles.py +0 -751
  334. package/backend/tests/unit/test_access.py +0 -45
  335. package/backend/tests/unit/test_cli.py +0 -124
  336. package/backend/tests/unit/test_graph_runtime.py +0 -72
  337. package/backend/tests/unit/test_network.py +0 -51
  338. package/backend/tests/unit/test_state_sqlite_storage.py +0 -159
  339. package/backend/tests/unit/test_workspace_store.py +0 -231
  340. package/backend/tests/unit/tools/__pycache__/test_connect_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  341. package/backend/tests/unit/tools/__pycache__/test_create_agent_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  342. package/backend/tests/unit/tools/__pycache__/test_delete_tab_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  343. package/backend/tests/unit/tools/__pycache__/test_edit_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  344. package/backend/tests/unit/tools/__pycache__/test_exec_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  345. package/backend/tests/unit/tools/__pycache__/test_fetch_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  346. package/backend/tests/unit/tools/__pycache__/test_manage_prompts_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  347. package/backend/tests/unit/tools/__pycache__/test_manage_providers_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  348. package/backend/tests/unit/tools/__pycache__/test_manage_roles_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  349. package/backend/tests/unit/tools/__pycache__/test_manage_settings_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  350. package/backend/tests/unit/tools/__pycache__/test_read_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  351. package/backend/tests/unit/tools/__pycache__/test_set_permissions_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  352. package/backend/tests/unit/tools/__pycache__/test_todo_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  353. package/backend/tests/unit/tools/__pycache__/test_tool_registry.cpython-313-pytest-9.0.3.pyc +0 -0
  354. package/backend/tests/unit/tools/test_connect_tool.py +0 -228
  355. package/backend/tests/unit/tools/test_create_agent_tool.py +0 -436
  356. package/backend/tests/unit/tools/test_delete_tab_tool.py +0 -116
  357. package/backend/tests/unit/tools/test_edit_tool.py +0 -115
  358. package/backend/tests/unit/tools/test_exec_tool.py +0 -81
  359. package/backend/tests/unit/tools/test_fetch_tool.py +0 -65
  360. package/backend/tests/unit/tools/test_manage_prompts_tool.py +0 -117
  361. package/backend/tests/unit/tools/test_manage_providers_tool.py +0 -460
  362. package/backend/tests/unit/tools/test_manage_roles_tool.py +0 -411
  363. package/backend/tests/unit/tools/test_manage_settings_tool.py +0 -611
  364. package/backend/tests/unit/tools/test_read_tool.py +0 -33
  365. package/backend/tests/unit/tools/test_set_permissions_tool.py +0 -595
  366. package/backend/tests/unit/tools/test_todo_tool.py +0 -37
  367. package/backend/tests/unit/tools/test_tool_registry.py +0 -194
  368. package/dist/frontend/assets/AssistantPage-VBohhz4d.js +0 -1
  369. package/dist/frontend/assets/ChannelsPage-CIydPZA_.js +0 -1
  370. package/dist/frontend/assets/McpPage-CHPm2TPY.js +0 -7
  371. package/dist/frontend/assets/PageScaffold-DteOA8V7.js +0 -1
  372. package/dist/frontend/assets/PromptsPage-CSmJ3sZg.js +0 -1
  373. package/dist/frontend/assets/ProvidersPage-sl2jeG4e.js +0 -3
  374. package/dist/frontend/assets/RolesPage-DCe7W6Km.js +0 -1
  375. package/dist/frontend/assets/SettingsPage-Bix9e63E.js +0 -3
  376. package/dist/frontend/assets/ToolsPage-favNkj5C.js +0 -1
  377. package/dist/frontend/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  378. package/dist/frontend/assets/WorkspacePage-KuaDjt_D.js +0 -3
  379. package/dist/frontend/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  380. package/dist/frontend/assets/alert-dialog-DIBUCmqM.js +0 -1
  381. package/dist/frontend/assets/datetime-eJqd0V2S.js +0 -1
  382. package/dist/frontend/assets/dialog-BOvHIBrg.js +0 -1
  383. package/dist/frontend/assets/elk-worker.min-C9JGDOE-.js +0 -6312
  384. package/dist/frontend/assets/graph-vendor-CHpVij2M.css +0 -1
  385. package/dist/frontend/assets/graph-vendor-DRq_-6fV.js +0 -7
  386. package/dist/frontend/assets/index-Biio-CoI.js +0 -10
  387. package/dist/frontend/assets/index-CmQvO7sl.css +0 -1
  388. package/dist/frontend/assets/layout.worker-jMHqAFbP.js +0 -24
  389. package/dist/frontend/assets/markdown-vendor-C9RtvaJh.js +0 -29
  390. package/dist/frontend/assets/modelParams-DcEhGnu0.js +0 -1
  391. package/dist/frontend/assets/react-vendor-mEs_JJxa.js +0 -9
  392. package/dist/frontend/assets/roles-BbIEIMeG.js +0 -1
  393. package/dist/frontend/assets/rolldown-runtime-BYbx6iT9.js +0 -1
  394. package/dist/frontend/assets/select-D9SwnlXF.js +0 -1
  395. package/dist/frontend/assets/surface-Bzr1FRG4.js +0 -1
  396. package/dist/frontend/assets/triState-DgLlKdRR.js +0 -1
  397. package/dist/frontend/assets/ui-vendor-UazN8rcv.js +0 -51
  398. package/dist/frontend/favicon.svg +0 -4
@@ -1,298 +0,0 @@
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_structured_output,
26
- build_model_timeout_ms,
27
- build_working_dir,
28
- find_role,
29
- serialize_settings,
30
- validate_model_retry_backoff_settings,
31
- )
32
-
33
- MISSING: Final = object()
34
-
35
-
36
- @dataclass(frozen=True, slots=True)
37
- class ResolvedSettingsUpdate:
38
- working_dir: str
39
- assistant: AssistantSettings
40
- leader: LeaderSettings
41
- model: ModelSettings
42
- event_log: EventLogSettings
43
-
44
-
45
- def serialize_manage_settings(settings: Settings) -> dict[str, object]:
46
- serialized = serialize_settings(settings)
47
- return {
48
- "app_data_dir": serialized["app_data_dir"],
49
- "working_dir": serialized["working_dir"],
50
- "assistant": serialized["assistant"],
51
- "leader": serialized["leader"],
52
- "model": serialized["model"],
53
- "event_log": serialized["event_log"],
54
- }
55
-
56
-
57
- def _resolve_role_name(
58
- settings: Settings,
59
- *,
60
- current_role_name: str,
61
- next_role_name: str | None,
62
- field_name: str,
63
- ) -> str:
64
- if next_role_name is None:
65
- return current_role_name
66
- normalized_role_name = next_role_name.strip()
67
- if not normalized_role_name:
68
- raise ValueError(f"{field_name} must not be empty")
69
- if find_role(settings, normalized_role_name) is None:
70
- raise ValueError(f"Role '{normalized_role_name}' not found")
71
- return normalized_role_name
72
-
73
-
74
- def resolve_settings_update(
75
- settings: Settings,
76
- *,
77
- working_dir: str | None = None,
78
- assistant_role_name: str | None = None,
79
- assistant_allow_network: object = MISSING,
80
- assistant_write_dirs: object = MISSING,
81
- leader_role_name: str | None = None,
82
- active_provider_id: str | None = None,
83
- active_model: str | None = None,
84
- context_window_tokens: object = MISSING,
85
- input_image: object = MISSING,
86
- output_image: object = MISSING,
87
- structured_output: object = MISSING,
88
- max_retries: object = MISSING,
89
- retry_policy: object = MISSING,
90
- timeout_ms: object = MISSING,
91
- retry_initial_delay_seconds: object = MISSING,
92
- retry_max_delay_seconds: object = MISSING,
93
- retry_backoff_cap_retries: object = MISSING,
94
- auto_compact_token_limit: object = MISSING,
95
- model_params: object = MISSING,
96
- timestamp_format: str | None = None,
97
- assistant_role_field_name: str = "assistant.role_name",
98
- assistant_allow_network_field_name: str = "assistant.allow_network",
99
- assistant_write_dirs_field_name: str = "assistant.write_dirs",
100
- leader_role_field_name: str = "leader.role_name",
101
- working_dir_field_name: str = "working_dir",
102
- retry_policy_field_name: str = "model.retry_policy",
103
- timeout_ms_field_name: str = "model.timeout_ms",
104
- max_retries_field_name: str = "model.max_retries",
105
- retry_initial_delay_seconds_field_name: str = "model.retry_initial_delay_seconds",
106
- retry_max_delay_seconds_field_name: str = "model.retry_max_delay_seconds",
107
- retry_backoff_cap_retries_field_name: str = "model.retry_backoff_cap_retries",
108
- input_image_field_name: str = "model.input_image",
109
- output_image_field_name: str = "model.output_image",
110
- structured_output_field_name: str = "model.structured_output",
111
- context_window_tokens_field_name: str = "model.context_window_tokens",
112
- auto_compact_token_limit_field_name: str = "model.auto_compact_token_limit",
113
- ) -> ResolvedSettingsUpdate:
114
- next_working_dir = (
115
- settings.working_dir
116
- 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
260
- )
261
-
262
- return ResolvedSettingsUpdate(
263
- 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,
268
- ),
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,
285
- ),
286
- event_log=EventLogSettings(timestamp_format=next_timestamp_format),
287
- )
288
-
289
-
290
- def apply_resolved_settings_update(
291
- settings: Settings,
292
- resolved: ResolvedSettingsUpdate,
293
- ) -> None:
294
- settings.working_dir = resolved.working_dir
295
- settings.assistant = resolved.assistant
296
- settings.leader = resolved.leader
297
- settings.model = resolved.model
298
- settings.event_log = resolved.event_log
@@ -1,120 +0,0 @@
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
- )
@@ -1 +0,0 @@
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-UazN8rcv.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-BZxBw8M5.js";import{B as h,L as g,P as ue,R as _,S as v,b as y,g as b,h as x,m as de,p as fe,rt as S,tt as C,x as pe}from"./index-Biio-CoI.js";async function me(e){return h(`/api/assistant/message`,{method:`POST`,body:e,errorMessage:`Failed to send Assistant message`})}async function he(e){return h(`/api/assistant/messages/${e}/retry`,{method:`POST`,errorMessage:`Failed to retry Assistant message`})}var w=e(t(),1);function T(e){for(let t of e.values())if(t.node_type===`assistant`)return t;return null}function ge(e){return T(e)?.id??null}var E=`assistant`;function _e(){return s(E)}function ve(e){return o(E,e)}function ye(e){ee(E,e)}function D(e={}){let{bottomInset:t=0}=e,{agents:n}=b(),{connected:i}=de(),{agentHistories:o,clearAgentHistory:s,clearHistorySnapshot:c,historyInvalidatedAt:ee,historyClearedAt:ae,historySnapshots:p,streamingDeltas:h}=x(),{activeToolCalls:S}=fe(),[C,T]=(0,w.useState)(null),[E,D]=(0,w.useState)(0),[O,k]=(0,w.useState)(``),[A,j]=(0,w.useState)([]),[M,N]=(0,w.useState)(null),[be,xe]=(0,w.useState)(!1),[Se,Ce]=(0,w.useState)(null),[P,we]=(0,w.useState)(!1),[F,I]=(0,w.useState)([]),[L,R]=(0,w.useState)(null),z=(0,w.useRef)(null),B=(0,w.useRef)(!0),Te=(0,w.useRef)([]),V=(0,w.useRef)(null),H=(0,w.useRef)(!1),U=(0,w.useMemo)(()=>ge(n),[n]),W=(0,w.useMemo)(()=>U?n.get(U)??null:null,[n,U]),Ee=W?.capabilities?.input_image??!1,De=U?ae.get(U)??0:0,Oe=U?ee.get(U)??0:0,G=U?p.get(U)??null:null,ke=A.some(e=>e.status===`uploading`),Ae=A.filter(le),K=(0,w.useSyncExternalStore)(ve,_e,_e),q=M===null?null:K[M]??null,je=q!==null&&O===q.text&&se(A,q),J=W?.state??C?.state??null,Me=(0,w.useCallback)(async e=>{let t=e.pendingMessageTimestamp??Date.now(),n=ie(e.content,e.parts,t);we(!0),I(e=>[...e,n]);try{let n=await me({content:e.content,parts:e.parts});return n.status===`command_executed`?I(n=>y(n,{content:e.content,timestamp:t})):n.message_id&&I(r=>r.map(r=>r.timestamp===t&&r.content===e.content?{...r,message_id:n.message_id}:r)),ye(e.history),e.restoreDraft&&d(e.restoreDraft.images),!0}catch(n){return I(n=>y(n,{content:e.content,timestamp:t})),e.restoreDraft&&(k(e.restoreDraft.input),j(e.restoreDraft.images),N(e.restoreDraft.historyCursor)),r.error(n instanceof Error?n.message:`Failed to send message`),!1}finally{we(!1)}},[]),Y=(0,w.useCallback)((e,t)=>{N(t),k(e?.text??``),j(e?a(e):[])},[]),Ne=(0,w.useCallback)(e=>{N(null),k(e)},[]);(0,w.useEffect)(()=>{Te.current=A},[A]),(0,w.useEffect)(()=>{V.current=L},[L]),(0,w.useEffect)(()=>()=>{d(Te.current)},[]),(0,w.useEffect)(()=>{De&&(I([]),R(null),T(e=>e&&{...e,history:u(e.history)}),D(Date.now()))},[De]),(0,w.useEffect)(()=>{Oe&&(I([]),G&&(T(e=>e&&{...e,history:G}),D(Date.now())))},[Oe,G]),(0,w.useEffect)(()=>{let e=V.current;!e||e.send_failed||e.target_id!==U||J!==e.target_state&&R({...e,target_state:J})},[U,J]),(0,w.useEffect)(()=>{let e=V.current;!e||e.send_failed||!U||e.target_id!==U||J!==`idle`||P||H.current||(H.current=!0,R(null),Me({content:e.content,parts:e.parts??[],history:e.history_entry,pendingMessageTimestamp:e.timestamp}).then(t=>{H.current=!1,t||R({...e,send_failed:!0,target_state:`error`})}).catch(()=>{H.current=!1,R({...e,send_failed:!0,target_state:`error`})}))},[U,J,P,Me]),(0,w.useEffect)(()=>{if(!i||!U){T(null);return}let e=new AbortController,t=!1;return(async()=>{s(U);try{let n=await g(U,e.signal);if(t||!n)return;T(n),D(Date.now()),c(U)}catch{!t&&!e.signal.aborted&&r.error(`Failed to load Assistant history`)}})(),()=>{t=!0,e.abort()}},[De,Oe,U,s,c,i]);let X=(0,w.useMemo)(()=>U?oe({history:G??C?.history??[],incremental:o.get(U),deltas:h.get(U),fetchedAt:E||Date.now()}):[],[o,G,C,E,h,U]);(0,w.useEffect)(()=>{if(!U||F.length===0)return;let e=X.filter(e=>e.type===`ReceivedMessage`&&e.from_id===`human`&&(!!e.content||!!e.message_id||!!e.parts?.length));e.length!==0&&I(t=>e.reduce((e,t)=>y(e,{content:t.content??pe(t.parts,t.content),messageId:t.message_id}),t))},[U,X,F.length]);let Z=(0,w.useMemo)(()=>[...X,...L?[{...L}]:[],...F.map(e=>({...e}))],[X,F,L]),Q=(0,w.useMemo)(()=>{let e=F.length+ +!!L,t=U?h.get(U)??[]:[],n=i&&(e>0||W?.state===`running`||W?.state===`sleeping`||S.has(U??``)||t.length>0),r=[...Z].map((e,t)=>({item:e,index:t})).reverse().find(({item:e})=>e.type===`PendingHumanMessage`?!0:e.type===`ReceivedMessage`&&e.from_id===`human`&&v(e.parts,e.content).length>0)?.index,a=r===void 0?[]:Z.slice(r+1),o=a.some(e=>e.type===`AssistantText`&&v(e.parts,e.content).length>0),s=[...a].reverse().find(e=>e.type===`ToolCall`&&e.streaming===!0),c=(U?S.get(U)??null:null)??s?.tool_name??null;return{running:n,runningHint:n&&r!==void 0&&!o?{label:c?`Running tools...`:`Thinking...`,toolName:c}:null}},[S,U,W?.state,i,F.length,L,h,Z]);(0,w.useLayoutEffect)(()=>{let e=z.current;!e||!B.current||(e.scrollTop=e.scrollHeight)},[t,Q.runningHint?`${Q.runningHint.label}:${Q.runningHint.toolName??``}`:``,Z]),(0,w.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 Pe=e=>{B.current=ne(e.currentTarget)},$=async(e={})=>{let t=O.trim();if(!t&&Ae.length===0||ke||P)return;let n=f(t,Ae),i=O,a=A,o=M,s=Date.now(),c=t||pe(n),l={text:i,images:ce(a),timestamp:s},u=e.deferWhenBusy&&U&&V.current?.target_id===U&&(J===`error`||J===`terminated`);if(e.deferWhenBusy&&U&&(J===`running`||J===`sleeping`||u)){R(re({content:c,historyEntry:l,historyScope:`assistant`,parts:n,targetId:U,targetState:J,timestamp:s})),N(null),k(``),j([]),d(a);return}if(J===`error`||J===`terminated`){r.error(`Resolve the current chat before sending`);return}N(null),k(``),j([]),await Me({content:c,parts:n,history:l,pendingMessageTimestamp:s,restoreDraft:{input:i,images:a,historyCursor:o}})},Fe=(0,w.useCallback)(async e=>{if(N(null),!Ee){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);j(e=>[...e,...n]),await Promise.all(n.map(async(e,n)=>{let i=t[n];if(i)try{let t=await l(i);j(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),j(t=>t.filter(t=>t.id!==e.id)),r.error(t instanceof Error?t.message:`Failed to upload image`)}}))},[Ee]),Ie=(0,w.useCallback)(e=>{N(null),j(t=>{let n=t.find(t=>t.id===e);return n&&m(n),t.filter(t=>t.id!==e)})},[]),Le=(0,w.useCallback)((e,t)=>{if(K.length===0)return!1;let n=t.start,r=t.end,i=O.length===0&&A.length===0,a=typeof n==`number`&&typeof r==`number`&&n===r&&(n===0||n===O.length);if(!i&&!(q!==null&&je&&a))return!1;if(M===null){if(e!==-1)return!1;let t=K.length-1;return Y(K[t]??null,t),!0}if(e===-1){let e=Math.max(M-1,0);return Y(K[e]??null,e),!0}if(M>=K.length-1)return Y(null,null),!0;let o=M+1;return Y(K[o]??null,o),!0},[q,A,M,O,K,je,Y]),Re=async()=>{if(!(!U||be)){xe(!0);try{await ue(U),I([]),R(null),s(U),T(await g(U)),D(Date.now()),c(U)}catch(e){r.error(e instanceof Error?e.message:`Failed to clear assistant chat`)}finally{xe(!1)}}},ze=(0,w.useCallback)(async()=>{if(U&&!(W?.state!==`running`&&W?.state!==`sleeping`)){await _(U);for(let e=0;e<25;e+=1){let e=await g(U);if(!e)break;if(T(e),D(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`)}},[U,W?.state]),Be=async e=>{if(!(!U||!e||Se)){Ce(e);try{try{await ze(),await he(e)}catch(e){r.error(e instanceof Error?e.message:`Failed to retry Assistant message`);return}s(U);try{let e=await g(U);e&&(T(e),D(Date.now()),c(U))}catch{return}}finally{Ce(null)}}},Ve=(0,w.useCallback)(async()=>{if(!U)return;await _(U),I([]),s(U);let e=await g(U);e&&(T(e),D(Date.now()),c(U))},[U,s,c]);return{addImages:Fe,connected:i,draftImages:A,handleKeyDown:e=>{if(e.key===`Tab`&&!e.shiftKey){(O.trim()||Ae.length>0)&&(e.preventDefault(),$({deferWhenBusy:!0}));return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),$())},hasUploadingImages:ke,input:O,isBrowsingInputHistory:je,navigateInputHistory:Le,onMessagesScroll:Pe,removeImage:Ie,retryMessage:Be,retryingMessageId:Se,scrollRef:z,clearing:be,sending:P,clearChat:Re,cancelPendingSend:(0,w.useCallback)(e=>{R(t=>t?.id===e?null:t)},[]),sendMessage:$,setInput:Ne,stopAssistant:Ve,supportsInputImage:Ee,timelineItems:Z,assistantActivity:Q}}var O=n();function k({onOpenDetails:e}){let{agents:t}=b(),[n,a]=(0,w.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:_,setInput:v,stopAssistant:y,supportsInputImage:x=!1,timelineItems:de}=D({bottomInset:o}),fe=Array.from(t.values()).find(e=>e.node_type===`assistant`)?.role_name??null;return(0,O.jsxs)(`div`,{className:S(`relative flex h-full flex-col overflow-hidden bg-surface-overlay text-foreground`),children:[(0,O.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,O.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,O.jsx)(`div`,{"aria-hidden":`true`,className:S(`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,O.jsx)(A,{connected:ne,onClearChat:()=>void d(),onOpenDetails:e,roleName:fe,clearing:te}),(0,O.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,O.jsx)(ae,{allowHumanMessageRetry:!0,bottomInset:o,items:de,nodes:t,onRetryHumanMessage:e=>void le(e),onCancelPendingSend:ee,onScroll:ce,retryImageInputEnabled:x,retryingMessageId:h,runningHint:u.runningHint,scrollRef:g}),(0,O.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,O.jsx)(`div`,{className:`mx-auto w-full max-w-3xl`,children:(0,O.jsx)(c,{busy:u.running,disabled:!f.trim()&&re.length===0||oe||ue,commandsEnabled:!0,images:re,imageInputEnabled:x,input:f,onAddImages:e=>void l(e),onChange:v,onNavigateHistory:se,onKeyDown:ie,onRemoveImage:m,onSend:()=>void _(),onStop:()=>{a(!0),y().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 A({clearing:e,connected:t,onClearChat:n,onOpenDetails:r,roleName:i}){return(0,O.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,O.jsxs)(`div`,{className:`flex min-w-[220px] flex-1 items-center gap-2`,children:[(0,O.jsx)(`div`,{className:`shrink-0 text-[14px] font-semibold leading-6 text-foreground`,children:`Assistant`}),i?(0,O.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,O.jsx)(j,{connected:t})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,O.jsx)(C,{type:`button`,size:`sm`,variant:`outline`,disabled:e,onClick:n,children:e?`Clearing...`:`Clear Chat`}),(0,O.jsx)(C,{type:`button`,size:`sm`,variant:`outline`,disabled:!r,onClick:r,children:`Assistant Details`})]})]})}function j({connected:e}){return(0,O.jsx)(`span`,{className:S(`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 M(){let{agents:e}=b(),t=T(e),[n,r]=(0,w.useState)(!1);return(0,O.jsx)(`div`,{className:`flex h-full flex-col min-h-0`,children:n&&t?(0,O.jsx)(`div`,{className:`h-full overflow-hidden p-6`,children:(0,O.jsx)(`div`,{className:`h-full overflow-hidden rounded-xl border border-border bg-surface-overlay/90 shadow-md`,children:(0,O.jsx)(p,{agent:t,onClose:()=>r(!1)})})}):(0,O.jsx)(k,{onOpenDetails:t?()=>r(!0):void 0})})}export{M as AssistantPage};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{dt as r,nn as i,q as a,tt as o}from"./ui-vendor-UazN8rcv.js";import{B as s,J as c,s as l,tt as u}from"./index-Biio-CoI.js";import{l as d,s as f}from"./surface-Bzr1FRG4.js";import{c as p,n as m,r as h,s as g}from"./PageScaffold-DteOA8V7.js";import{t as _}from"./datetime-eJqd0V2S.js";async function v(){return s(`/api/settings/telegram`,{errorMessage:`Failed to fetch Telegram settings`})}async function y(e){return s(`/api/settings/telegram`,{method:`PATCH`,body:e,errorMessage:`Failed to save Telegram settings`})}async function b(e){return s(`/api/settings/telegram/approve/${e}`,{method:`POST`,errorMessage:`Failed to approve Telegram chat`})}async function x(e){return s(`/api/settings/telegram/pending/${e}`,{method:`DELETE`,errorMessage:`Failed to remove pending Telegram chat`})}async function S(e){return s(`/api/settings/telegram/chat/${e}`,{method:`DELETE`,errorMessage:`Failed to remove Telegram chat`})}var C=e(t(),1),w=n();function T(e){return e?_(e,{fallback:`—`,unit:`seconds`}):`—`}function E(e){return e.display_name.trim()?e.display_name.trim():e.username?.trim()?`@${e.username.trim()}`:`Unknown chat`}function D(){let{data:e,isLoading:t,mutate:n}=p(`telegramSettings`,v),[s,_]=(0,C.useState)(!1),[D,O]=(0,C.useState)(``),[k,A]=(0,C.useState)(!1),j=(0,C.useMemo)(()=>!!e?.bot_token,[e?.bot_token]),M=async()=>{if(e){_(!0);try{let e={};k&&(e.bot_token=D.trim()),n((await y(e)).telegram,!1),O(``),A(!1),a.success(`Telegram settings saved`)}catch{a.error(`Failed to save Telegram settings`)}finally{_(!1)}}},N=async e=>{try{n((await b(e)).telegram,!1),a.success(`Telegram chat approved`)}catch{a.error(`Failed to approve Telegram chat`)}},P=async e=>{try{n((await x(e)).telegram,!1),a.success(`Pending Telegram chat removed`)}catch{a.error(`Failed to remove pending Telegram chat`)}},F=async e=>{try{n((await S(e)).telegram,!1),a.success(`Approved Telegram chat removed`)}catch{a.error(`Failed to remove approved Telegram chat`)}};return t||!e?(0,w.jsx)(l,{label:`Loading channels...`,textClassName:`text-[13px]`}):(0,w.jsx)(m,{children:(0,w.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto pr-2 scrollbar-none pt-6`,children:(0,w.jsxs)(`div`,{className:`mx-auto max-w-[680px] pb-10`,children:[(0,w.jsx)(h,{title:`Channels`}),(0,w.jsxs)(g,{className:`mt-6 space-y-8`,children:[(0,w.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,w.jsx)(`div`,{children:(0,w.jsx)(`h2`,{className:`text-lg font-medium text-foreground`,children:`Telegram`})}),(0,w.jsx)(d,{tone:j?`running`:`idle`,children:j?`Configured`:`Not configured`})]}),(0,w.jsxs)(`section`,{children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Bot Token`}),(0,w.jsx)(d,{tone:j?`running`:`idle`,children:j?`Saved`:`Missing`})]}),(0,w.jsxs)(`div`,{className:`mt-3`,children:[(0,w.jsx)(c,{value:D,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,w.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Leave empty to keep the current token.`}):null]})]}),(0,w.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Pending Private Chats`}),(0,w.jsxs)(d,{tone:`muted`,className:`px-2 py-0.5`,children:[e.pending_chats.length,` waiting`]})]}),e.pending_chats.length===0?(0,w.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No pending chats.`}):(0,w.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.pending_chats.map(e=>(0,w.jsx)(f,{as:`div`,padding:`sm`,className:`px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsxs)(`div`,{className:`min-w-0`,children:[(0,w.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:E(e)}),(0,w.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,w.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,w.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,w.jsxs)(`span`,{children:[`First seen: `,T(e.first_seen_at)]})]})]}),(0,w.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,w.jsxs)(u,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>void N(e.chat_id),children:[(0,w.jsx)(i,{className:`size-3.5`}),`Approve`]}),(0,w.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,w.jsx)(o,{className:`size-3.5`})})]})]})},e.chat_id))})]}),(0,w.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Approved Private Chats`}),(0,w.jsxs)(d,{tone:`muted`,className:`px-2 py-0.5`,children:[e.approved_chats.length,` active`]})]}),e.approved_chats.length===0?(0,w.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No approved chats yet.`}):(0,w.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.approved_chats.map(e=>(0,w.jsx)(f,{as:`div`,padding:`sm`,className:`group px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsxs)(`div`,{className:`min-w-0`,children:[(0,w.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:E(e)}),(0,w.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,w.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,w.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,w.jsxs)(`span`,{children:[`Approved: `,T(e.approved_at)]})]})]}),(0,w.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,w.jsx)(o,{className:`size-3.5`})})]})},e.chat_id))})]}),(0,w.jsx)(`div`,{className:`flex justify-end border-t border-border pt-6`,children:(0,w.jsxs)(u,{type:`button`,size:`sm`,onClick:()=>void M(),disabled:s,className:`text-[13px]`,children:[(0,w.jsx)(r,{className:`size-4`}),s?`Saving...`:`Save Changes`]})})]})]})})})}export{D as ChannelsPage};
@@ -1,7 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{$ as r,J as i,_t as a,pt as ee,q as o,ut as s}from"./ui-vendor-UazN8rcv.js";import{$ as c,B as l,K as u,V as d,et as f,rt as p,tt as m}from"./index-Biio-CoI.js";import{a as h,c as te,l as g,o as _,r as v,s as y,t as b,u as ne}from"./surface-Bzr1FRG4.js";import{c as re,n as x,r as ie,s as S}from"./PageScaffold-DteOA8V7.js";import{t as C}from"./datetime-eJqd0V2S.js";import{a as ae,i as w,n as oe,r as T,t as se}from"./select-D9SwnlXF.js";import{n as E,t as ce}from"./WorkspaceCommandDialog-DRS6wiD6.js";async function le(){return l(`/api/mcp`,{method:`GET`,errorMessage:`Failed to fetch MCP state`})}async function ue(){return l(`/api/mcp/refresh`,{method:`POST`,errorMessage:`Failed to refresh MCP servers`,fallback:[],map:e=>e?.servers??[]})}async function de(e){return l(`/api/mcp/servers`,{method:`POST`,body:e,errorMessage:`Failed to create MCP server`,map:e=>{if(!e)throw Error(`Failed to create MCP server`);return e.snapshot}})}async function fe(e,t){return l(`/api/mcp/servers/${e}`,{method:`PATCH`,body:t,errorMessage:`Failed to update MCP server`,map:e=>{if(!e)throw Error(`Failed to update MCP server`);return e.snapshot}})}async function pe(e){await d(`/api/mcp/servers/${e}`,{method:`DELETE`,errorMessage:`Failed to delete MCP server`})}async function me(e){return l(`/api/mcp/servers/${e}/refresh`,{method:`POST`,errorMessage:`Failed to refresh MCP server`,map:e=>{if(!e)throw Error(`Failed to refresh MCP server`);return e.snapshot}})}async function he(e){return l(`/api/mcp/servers/${e}/login`,{method:`POST`,errorMessage:`Failed to login MCP server`,map:e=>{if(!e)throw Error(`Failed to login MCP server`);return e.snapshot}})}async function ge(e){await d(`/api/mcp/servers/${e}/logout`,{method:`POST`,errorMessage:`Failed to logout MCP server`})}async function _e(e,t,n={}){return l(`/api/mcp/servers/${e}/prompt-preview`,{method:`POST`,body:{name:t,arguments:n},errorMessage:`Failed to preview MCP prompt`,map:e=>{if(!e)throw Error(`Failed to preview MCP prompt`);return e.preview}})}var D=n(),ve=`border-border/70 bg-background/45 hover:border-ring/35 hover:bg-accent/65`;function O(e){return e.split(`
2
- `).map(e=>e.trim()).filter(Boolean)}function k(e){return e.join(`
3
- `)}function ye(e){let t={};for(let n of e.split(`
4
- `)){let e=n.trim();if(!e)continue;let r=e.indexOf(`:`);if(r<0)continue;let i=e.slice(0,r).trim(),a=e.slice(r+1).trim();i&&(t[i]=a)}return t}function A(e){return Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`
5
- `)}function j({checked:e,disabled:t,label:n,onChange:r}){return(0,D.jsxs)(`label`,{className:`flex items-center justify-between gap-4 rounded-xl border border-border bg-card/20 px-4 py-3 text-sm${t?` opacity-50`:``}`,children:[(0,D.jsx)(`span`,{className:`text-foreground/85`,children:n}),(0,D.jsx)(u,{checked:e,disabled:t,label:n,onCheckedChange:r})]})}function be({draft:e,onChange:t,onOpenChange:n,onSubmit:r,open:i,pending:a,title:ee}){return(0,D.jsxs)(ce,{open:i,onOpenChange:n,title:ee,footer:(0,D.jsxs)(`div`,{className:`flex w-full items-center justify-end gap-3`,children:[(0,D.jsx)(m,{type:`button`,variant:`outline`,className:ve,onClick:()=>n(!1),children:`Cancel`}),(0,D.jsx)(m,{type:`button`,disabled:a,onClick:r,children:a?`Saving...`:`Save Server`})]}),className:`max-w-3xl`,children:[(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Name`,children:(0,D.jsx)(f,{value:e.name,onChange:n=>t({...e,name:n.target.value}),placeholder:`filesystem`})}),(0,D.jsx)(E,{label:`Transport`,children:(0,D.jsxs)(se,{value:e.transport,onValueChange:n=>t({...e,transport:n}),children:[(0,D.jsx)(w,{className:`h-8 w-full rounded-md bg-background/50 text-sm text-foreground`,children:(0,D.jsx)(ae,{placeholder:`Select transport`})}),(0,D.jsxs)(oe,{className:`rounded-xl bg-popover text-popover-foreground`,children:[(0,D.jsx)(T,{value:`stdio`,children:`stdio`}),(0,D.jsx)(T,{value:`streamable_http`,children:`streamable_http`})]})]})})]}),(0,D.jsx)(E,{label:`Launcher Command`,hint:`optional`,children:(0,D.jsx)(f,{value:e.launcher,onChange:n=>t({...e,launcher:n.target.value}),placeholder:e.transport===`streamable_http`?`https://mcp.example.com`:`npx @playwright/mcp@latest`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(j,{checked:e.enabled,label:`Enabled`,onChange:n=>t({...e,enabled:n})}),(0,D.jsx)(j,{checked:e.required,label:`Required`,onChange:n=>t({...e,required:n})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Startup Timeout`,hint:`seconds`,children:(0,D.jsx)(f,{type:`number`,value:String(e.startup_timeout_sec),onChange:n=>t({...e,startup_timeout_sec:Number(n.target.value)||10})})}),(0,D.jsx)(E,{label:`Tool Timeout`,hint:`seconds`,children:(0,D.jsx)(f,{type:`number`,value:String(e.tool_timeout_sec),onChange:n=>t({...e,tool_timeout_sec:Number(n.target.value)||30})})})]}),e.transport===`stdio`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(E,{label:`Command`,children:(0,D.jsx)(f,{value:e.command,onChange:n=>t({...e,command:n.target.value}),placeholder:`npx`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Args`,hint:`one per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.args),onChange:n=>t({...e,args:O(n.target.value)})})}),(0,D.jsx)(E,{label:`Env Vars`,hint:`one env var name per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.env_vars),onChange:n=>t({...e,env_vars:O(n.target.value)})})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Env`,hint:`KEY: value`,children:(0,D.jsx)(c,{rows:5,value:A(e.env),onChange:n=>t({...e,env:ye(n.target.value)})})}),(0,D.jsx)(E,{label:`Cwd`,children:(0,D.jsx)(f,{value:e.cwd,onChange:n=>t({...e,cwd:n.target.value}),placeholder:`/workspace/tools`})})]})]}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(E,{label:`URL`,children:(0,D.jsx)(f,{value:e.url,onChange:n=>t({...e,url:n.target.value}),placeholder:`https://mcp.example.com`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Bearer Token Env Var`,children:(0,D.jsx)(f,{value:e.bearer_token_env_var,onChange:n=>t({...e,bearer_token_env_var:n.target.value}),placeholder:`MCP_TOKEN`})}),(0,D.jsx)(E,{label:`OAuth Resource`,children:(0,D.jsx)(f,{value:e.oauth_resource,onChange:n=>t({...e,oauth_resource:n.target.value}),placeholder:`https://mcp.example.com`})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`HTTP Headers`,hint:`Header: value`,children:(0,D.jsx)(c,{rows:5,value:A(e.http_headers),onChange:n=>t({...e,http_headers:ye(n.target.value)})})}),(0,D.jsx)(E,{label:`Env HTTP Headers`,hint:`one env var name per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.env_http_headers),onChange:n=>t({...e,env_http_headers:O(n.target.value)})})})]}),(0,D.jsx)(E,{label:`Scopes`,hint:`one scope per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.scopes),onChange:n=>t({...e,scopes:O(n.target.value)})})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Enabled Tools`,hint:`one raw tool name per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.enabled_tools),onChange:n=>t({...e,enabled_tools:O(n.target.value)})})}),(0,D.jsx)(E,{label:`Disabled Tools`,hint:`one raw tool name per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.disabled_tools),onChange:n=>t({...e,disabled_tools:O(n.target.value)})})})]})]})}var M=e(t(),1),N=[`overview`,`capabilities`,`activity`],P=[`tools`,`resources`,`resource_templates`,`prompts`],F=[{value:`all`,label:`All`},{value:`connected`,label:`Connected`},{value:`auth_required`,label:`Auth Required`},{value:`error`,label:`Error`},{value:`disabled`,label:`Disabled`},{value:`connecting`,label:`Connecting`}],I=[{value:`all`,label:`All`},{value:`refresh`,label:`Refresh`},{value:`auth`,label:`Auth`},{value:`tool`,label:`Tool`},{value:`resource`,label:`Resource`},{value:`prompt`,label:`Prompt`}],L={name:``,transport:`stdio`,enabled:!0,required:!1,startup_timeout_sec:10,tool_timeout_sec:30,enabled_tools:[],disabled_tools:[],scopes:[],oauth_resource:``,launcher:``,command:``,args:[],env:{},env_vars:[],cwd:``,url:``,bearer_token_env_var:``,http_headers:{},env_http_headers:[]};function R(e){return C(e,{fallback:`Never`})}function z(e){return e.split(`_`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function B(e){switch(e){case`unsupported`:return`Unsupported`;case`not_logged_in`:return`Not logged in`;case`logging_in`:return`Logging in`;case`connected`:return`Connected`;case`error`:return`Error`;default:return z(e)}}function xe(e){return C(e,{fallback:`Never`,format:{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}})}function V(e){switch(e){case`disabled`:return`Disabled`;case`connecting`:return`Connecting`;case`connected`:return`Connected`;case`auth_required`:return`Auth required`;case`error`:return`Error`;default:return e}}function H(e){switch(e){case`connected`:return`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`;case`auth_required`:return`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`;case`error`:return`border-destructive/30 bg-destructive/10 text-destructive`;case`disabled`:return`border-border bg-accent/20 text-muted-foreground`;default:return`border-primary/20 bg-primary/[0.1] text-primary`}}function Se(e){switch(e){case`success`:return`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`;case`rejected`:return`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`;default:return`border-destructive/30 bg-destructive/10 text-destructive`}}function Ce(e){let t=e.snapshot.capability_counts;return`${t.tools} tools · ${t.resources} resources · ${t.prompts} prompts`}function U(e){return e.visibility.active?`Global`:null}function we(e){return e.length<2?e:e.startsWith(`"`)&&e.endsWith(`"`)||e.startsWith(`'`)&&e.endsWith(`'`)?e.slice(1,-1):e}function Te(e){return(e.match(/'[^']*'|"[^"]*"|\S+/g)??[]).map(e=>we(e))}function W(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)}function Ee(e){return W((e.startsWith(`@`)?e.replace(/@[^/@]+$/u,``):e.replace(/@[^/]+$/u,``)).split(`/`).filter(Boolean).join(`-`))}function De(e){try{let t=new URL(e);return W(t.hostname.replace(/^www\./u,``).split(`.`).filter(e=>e&&![`mcp`,`api`].includes(e))[0]??t.hostname)}catch{return``}}function Oe(e,t){if(/^https?:\/\//u.test(e))return De(e);let n=t[0]??``,r=n===`pnpm`||n===`yarn`?2:n===`npm`?3:1,i=t.slice(r).find(e=>e&&!e.startsWith(`-`));if(i){let e=Ee(i);if(e)return e}return n?W(n.split(`/`).pop()??n):``}function ke(e,t){let n=e.trim(),r=W(t);if(!n)return{draft:null,error:`Enter a launcher command or URL.`};if(!r)return{draft:null,error:`Quick Add needs a valid server name.`};if(/^https?:\/\//u.test(n))try{let e=new URL(n).toString();return{draft:{...L,name:r,transport:`streamable_http`,launcher:n,url:e},error:null}}catch{return{draft:null,error:`Quick Add URL is not valid.`}}let i=Te(n);return i.length===0?{draft:null,error:`Quick Add needs a single-line launcher command.`}:{draft:{...L,name:r,transport:`stdio`,launcher:n,command:i[0],args:i.slice(1)},error:null}}function Ae(e){return e.config.transport===`streamable_http`?e.config.url.trim()||`No URL configured`:[e.config.command,...e.config.args].filter(Boolean).join(` `)}function je(e){return{config:e,snapshot:{server_name:e.name,transport:e.transport,status:`connecting`,auth_status:e.transport===`stdio`?`unsupported`:`not_logged_in`,last_auth_result:null,last_refresh_at:null,last_refresh_result:`never`,last_error:null,tools:[],resources:[],resource_templates:[],prompts:[],capability_counts:{tools:0,resources:0,resource_templates:0,prompts:0}},visibility:{scope:`global`,active:!1},activity:[]}}function Me(e){return e.config.enabled_tools.length>0?`Enabled tools limited to ${e.config.enabled_tools.length} entries`:e.config.disabled_tools.length>0?`${e.config.disabled_tools.length} tools excluded`:`All discovered tools remain available`}function Ne(e){return e.config.transport===`stdio`?`Auth N/A`:e.snapshot.auth_status===`connected`?`Logout`:`Login`}function Pe(e){return e.config.transport===`stdio`}function G(e,t=`Not set`){return typeof e==`string`&&e.trim()||t}function K(e,t=`None`){return e.length===0?t:e.join(`
6
- `)}function Fe(e,t=`None`){let n=Object.keys(e);return n.length===0?t:n.join(`
7
- `)}function Ie(e){if(e.action===`login`||e.action===`logout`)return!0;if(e.action!==`refresh`)return!1;let t=`${e.summary} ${e.target??``}`.toLowerCase();return[`auth`,`authentication`,`oauth`,`token`,`bearer`,`login`,`logged out`,`env var`].some(e=>t.includes(e))}function Le(e){if(Ie(e))return`auth`;switch(e.action){case`refresh`:return`refresh`;case`login`:case`logout`:return`auth`;case`tool_call`:return`tool`;case`resource_read`:return`resource`;case`prompt_get`:return`prompt`;default:return`all`}}function Re(e){switch(Le(e)){case`refresh`:return`Refresh`;case`auth`:return`Auth`;case`tool`:return`Tool`;case`resource`:return`Resource`;case`prompt`:return`Prompt`;default:return z(e.action)}}function ze(e,t){return!(t!==`all`&&e.snapshot.status!==t)}function Be(e,t=`Not set`){return e.trim()?e:t}function Ve(e){return Object.fromEntries((e?.arguments??[]).map(e=>e.name).filter(e=>typeof e==`string`&&e.length>0).map(e=>[e,``]))}function He(){let{data:e,error:t,isLoading:n,mutate:r}=re(`mcp-state`,le),[i,a]=(0,M.useState)(null),[ee,s]=(0,M.useState)(`overview`),[c,l]=(0,M.useState)(`tools`),[u,d]=(0,M.useState)(!1),[f,p]=(0,M.useState)(null),[m,h]=(0,M.useState)(L),[te,g]=(0,M.useState)(!1),[_,v]=(0,M.useState)(null),[y,b]=(0,M.useState)(null),[ne,x]=(0,M.useState)(!1),[ie,S]=(0,M.useState)(`{}`),[C,ae]=(0,M.useState)(`all`),[w,oe]=(0,M.useState)(`all`),[T,se]=(0,M.useState)(``),[E,ce]=(0,M.useState)(``),[D,ve]=(0,M.useState)(!1),[O,k]=(0,M.useState)(!1),[ye,A]=(0,M.useState)(null),j=(0,M.useMemo)(()=>Te(T.trim()),[T]),be=(0,M.useMemo)(()=>Oe(T.trim(),j),[T,j]),N=D?E:be,P=(0,M.useMemo)(()=>ke(T,N),[T,N]),F=(0,M.useMemo)(()=>{let t=e?.servers??[];return!O||P.draft===null||t.some(e=>e.config.name===P.draft?.name)?t:[je(P.draft),...t]},[e,P.draft,O]),I=(0,M.useMemo)(()=>F.filter(e=>ze(e,C)),[C,F]),R=(0,M.useMemo)(()=>I.find(e=>e.config.name===i)??I[0]??null,[I,i]);(0,M.useEffect)(()=>{I.length>0&&!I.some(e=>e.config.name===i)&&a(I[0]?.config.name??null)},[I,i]),(0,M.useEffect)(()=>{v(null),b(null),x(!1),S(`{}`),oe(`all`)},[R?.config.name]),(0,M.useEffect)(()=>{D||ce(be)},[D,be]);let z=(0,M.useMemo)(()=>({configured:F.length,connected:F.filter(e=>e.snapshot.status===`connected`).length,authRequired:F.filter(e=>e.snapshot.status===`auth_required`).length,error:F.filter(e=>e.snapshot.status===`error`).length}),[F]),B=(0,M.useMemo)(()=>R?.snapshot.prompts.find(e=>e.name===_)??null,[_,R]),xe=(0,M.useMemo)(()=>R?R.activity.filter(e=>w===`all`?!0:Le(e)===w):[],[w,R]),V=()=>{p(null),h(L),d(!0)},H=e=>{p(e.config.name),h(e.config),d(!0)},Se=e=>{se(e),A(null)},Ce=e=>{ve(!0),ce(e),A(null)},U=()=>{document.getElementById(`mcp-quick-add-input`)?.focus()},we=()=>{ae(`all`)},W=async()=>{try{await ue(),await r(),o.success(`MCP servers refreshed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to refresh MCP servers`)}},Ee=async()=>{g(!0);try{f?await fe(f,m):await de(m),await r(),a(m.name.trim()),d(!1),o.success(`MCP server saved`)}catch(e){o.error(e instanceof Error?e.message:`Failed to save MCP server`)}finally{g(!1)}},De=async()=>{if(P.error||P.draft===null){A(P.error??`Quick Add is not ready yet.`);return}k(!0),A(null),a(P.draft.name);try{await de(P.draft),await r(),a(P.draft.name),se(``),ce(``),ve(!1),o.success(`MCP server added`)}catch(e){await r(),a(P.draft.name),A(e instanceof Error?e.message:`Failed to add MCP server`),o.error(e instanceof Error?e.message:`Failed to add MCP server`)}finally{k(!1)}},Ae=async e=>{try{await pe(e),await r(),o.success(`MCP server removed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to remove MCP server`)}},Me=async e=>{try{await fe(e.config.name,{...e.config,enabled:!e.config.enabled}),await r()}catch(e){o.error(e instanceof Error?e.message:`Failed to update MCP server`)}},Ne=async e=>{try{await me(e),await r(),o.success(`Server refreshed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to refresh server`)}},Pe=async e=>{try{await he(e),await r(),o.success(`Server refreshed after login`)}catch(e){o.error(e instanceof Error?e.message:`Failed to login MCP server`)}},G=async e=>{try{await ge(e),await r(),o.success(`Logout request sent`)}catch(e){o.error(e instanceof Error?e.message:`Failed to logout MCP server`)}},K=async(e,t,n={})=>{x(!0);try{b(await _e(e,t,n))}catch(e){b({error:e instanceof Error?e.message:`Failed to preview prompt`})}finally{x(!1)}};return{error:t,isLoading:n,servers:F,filteredServers:I,selectedServer:R,summaryCounts:z,filteredActivity:xe,detailTab:ee,setDetailTab:s,capabilityTab:c,setCapabilityTab:l,serverStatusFilter:C,setServerStatusFilter:ae,activityFilter:w,setActivityFilter:oe,selectedServerName:i,setSelectedServerName:a,clearServerFilters:we,focusQuickAdd:U,dialog:{draft:m,editingServerName:f,open:u,pending:te,setDraft:h,setOpen:d,openCreateDialog:V,openEditDialog:H,saveServer:Ee},quickAdd:{error:ye,input:T,nameValue:N,parse:P,pending:O,setInput:Se,setName:Ce,submit:De},promptPreviewState:{argumentsText:ie,loading:ne,preview:y,selectedPrompt:B,selectedPromptName:_,setArgumentsText:e=>{S(e)},previewCurrent:()=>{if(!(!R||!_))try{let e=JSON.parse(ie);K(R.config.name,_,e)}catch{b({error:`Arguments must be valid JSON`})}},selectPrompt:(e,t)=>{v(t);let n=Ve(R?.snapshot.prompts.find(e=>e.name===t)??null);S(JSON.stringify(n,null,2)),K(e,t,n)}},actions:{deleteServer:Ae,login:Pe,logout:G,refreshAll:W,refreshServer:Ne,toggleEnabled:Me}}}function q({label:e,value:t}){return(0,D.jsx)(h,{label:e,value:t,className:`min-h-0 px-4`})}function Ue({active:e,label:t,onClick:n,variant:r=`pill`}){return(0,D.jsx)(v,{active:e,label:t,onClick:n,variant:r})}function J({label:e,value:t,mono:n=!1}){return(0,D.jsx)(te,{label:e,value:t,mono:n})}var Y=`bg-card/20`,X=`text-[13px] text-muted-foreground`,Z=ne,Q=`border-border/70 bg-background/45 hover:border-ring/35 hover:bg-accent/65`,We=`border-graph-status-error/35 bg-graph-status-error/10 text-graph-status-error hover:bg-graph-status-error/18`,Ge=`mt-4 max-h-48 bg-background/55 p-3 text-foreground/70`,$=`mt-2 line-clamp-1 text-[13px] leading-6 text-muted-foreground`;function Ke(){return(0,D.jsxs)(`div`,{className:`grid h-full gap-5 lg:grid-cols-[320px_minmax(0,1fr)]`,children:[(0,D.jsxs)(`div`,{className:`space-y-3`,children:[Array.from({length:5}).map((e,t)=>(0,D.jsx)(`div`,{className:`h-24 rounded-xl border border-border bg-card/20 skeleton-shimmer`},t)),(0,D.jsx)(`p`,{className:`px-2 text-[13px] text-muted-foreground`,children:`Loading MCP servers...`})]}),(0,D.jsx)(`div`,{className:`rounded-xl border border-border bg-card/20 skeleton-shimmer`})]})}function qe(){return(0,D.jsx)(S,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:`Failed to load MCP state.`})}function Je({quickAdd:e,dialog:t}){return(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(Ye,{quickAdd:e,dialog:t}),(0,D.jsx)(_,{icon:r,title:`No MCP servers`,minHeightClassName:`h-full`,className:`mt-4`})]})}function Ye({dialog:e,quickAdd:t}){return(0,D.jsx)(S,{className:p(`mt-4`,Y),children:(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsx)(`div`,{children:(0,D.jsx)(`p`,{className:Z,children:`Quick Add`})}),t.parse.draft?(0,D.jsx)(g,{className:p(H(t.parse.draft.transport===`streamable_http`?`connected`:`connecting`)),children:t.parse.draft.transport===`streamable_http`?`URL`:`Launcher`}):null]}),(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1.4fr)_minmax(260px,0.6fr)]`,children:[(0,D.jsx)(E,{label:`Launcher or URL`,children:(0,D.jsx)(f,{id:`mcp-quick-add-input`,value:t.input,onChange:e=>t.setInput(e.target.value),placeholder:`npx @playwright/mcp@latest`})}),(0,D.jsx)(E,{label:`Name`,children:(0,D.jsx)(f,{value:t.nameValue,onChange:e=>t.setName(e.target.value),placeholder:`playwright-mcp`})})]}),t.parse.draft?(0,D.jsxs)(`div`,{className:`grid gap-3 xl:grid-cols-3`,children:[(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Transport`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:t.parse.draft.transport})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Parsed Name`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:t.parse.draft.name})]}),(0,D.jsxs)(S,{className:p(`xl:col-span-1`,Y),children:[(0,D.jsx)(`p`,{className:Z,children:`Parsed Result`}),(0,D.jsx)(`p`,{className:`mt-2 break-all font-mono text-[12px] text-foreground/80`,children:t.parse.draft.transport===`streamable_http`?t.parse.draft.url:[t.parse.draft.command,...t.parse.draft.args].join(` `)})]})]}):null,t.error||t.input.trim()&&t.parse.error?(0,D.jsx)(`p`,{className:`text-[13px] text-destructive`,children:t.error??t.parse.error}):null,(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,D.jsx)(m,{type:`button`,disabled:t.pending||t.parse.draft===null,onClick:()=>void t.submit(),children:t.pending?`Adding...`:`Quick Add`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.openCreateDialog,children:`Advanced Add`})]})]})})}function Xe(e){return(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(Ze,{summaryCounts:e.summaryCounts}),(0,D.jsx)(Ye,{quickAdd:e.quickAdd,dialog:e.dialog}),(0,D.jsx)(Qe,{serverStatusFilter:e.serverStatusFilter,onServerStatusFilterChange:e.onServerStatusFilterChange}),(0,D.jsx)(`div`,{className:`mt-4 min-h-0 flex-1 overflow-hidden`,children:e.filteredServers.length===0?(0,D.jsx)(_,{icon:s,title:`No matching MCP servers`,minHeightClassName:`h-full`,action:(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.clearServerFilters,children:[(0,D.jsx)(i,{className:`mr-2 size-4`}),`Show All Servers`]})}):(0,D.jsxs)(`div`,{className:`grid h-full gap-5 xl:grid-cols-[360px_minmax(0,1fr)]`,children:[(0,D.jsx)($e,{actions:e.actions,dialog:e.dialog,filteredServers:e.filteredServers,onSelectServer:e.onSelectServer,selectedServer:e.selectedServer}),(0,D.jsx)(tt,{actions:e.actions,activityFilter:e.activityFilter,capabilityTab:e.capabilityTab,dialog:e.dialog,detailTab:e.detailTab,filteredActivity:e.filteredActivity,onActivityFilterChange:e.onActivityFilterChange,onCapabilityTabChange:e.onCapabilityTabChange,onDetailTabChange:e.onDetailTabChange,onFocusQuickAdd:e.onFocusQuickAdd,promptPreviewState:e.promptPreviewState,selectedServer:e.selectedServer})]})})]})}function Ze({summaryCounts:e}){return(0,D.jsx)(S,{children:(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[(0,D.jsx)(q,{label:`Configured`,value:e.configured}),(0,D.jsx)(q,{label:`Connected`,value:e.connected}),(0,D.jsx)(q,{label:`Auth Required`,value:e.authRequired}),(0,D.jsx)(q,{label:`Error`,value:e.error})]})})}function Qe({onServerStatusFilterChange:e,serverStatusFilter:t}){return(0,D.jsx)(S,{className:`mt-4`,children:(0,D.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:F.map(n=>(0,D.jsx)(Ue,{active:t===n.value,label:n.label,onClick:()=>e(n.value)},n.value))})})}function $e({actions:e,dialog:t,filteredServers:n,onSelectServer:r,selectedServer:i}){return(0,D.jsx)(`div`,{className:`min-h-0 overflow-y-auto pr-1 scrollbar-none`,children:(0,D.jsx)(`div`,{className:`space-y-3`,children:n.map(n=>(0,D.jsx)(et,{actions:e,dialog:t,isSelected:i?.config.name===n.config.name,onSelectServer:r,serverRecord:n},n.config.name))})})}function et({actions:e,dialog:t,isSelected:n,onSelectServer:r,serverRecord:i}){let a=U(i);return(0,D.jsx)(y,{as:`div`,padding:`sm`,className:p(`p-4 transition-colors`,n?`bg-accent/20`:`bg-card/20 hover:bg-accent/20`),children:(0,D.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,D.jsxs)(m,{type:`button`,variant:`ghost`,onClick:()=>r(i.config.name),className:`h-auto min-w-0 flex-1 justify-start p-0 text-left hover:bg-transparent hover:text-inherit`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:i.config.name}),i.config.required?(0,D.jsx)(g,{tone:`idle`,className:`px-2 py-0.5`,children:`required`}):null,a?(0,D.jsx)(g,{tone:`primary`,className:`px-2 py-0.5`,children:a}):null]}),(0,D.jsxs)(`div`,{className:`mt-3 grid gap-1.5 text-[12px] text-muted-foreground`,children:[(0,D.jsxs)(`p`,{children:[`Transport `,i.config.transport]}),(0,D.jsxs)(`p`,{children:[`Status `,V(i.snapshot.status)]}),(0,D.jsxs)(`p`,{children:[`Auth `,B(i.snapshot.auth_status)]}),(0,D.jsx)(`p`,{children:Ce(i)})]}),i.snapshot.last_error?(0,D.jsx)(`p`,{className:`mt-3 line-clamp-2 text-[12px] leading-5 text-destructive`,children:i.snapshot.last_error}):null]}),(0,D.jsxs)(`div`,{className:`flex shrink-0 flex-col items-end gap-1.5`,children:[(0,D.jsx)(g,{className:p(H(i.snapshot.status)),children:V(i.snapshot.status)}),(0,D.jsx)(rt,{actions:e,buttonClassName:`h-7 px-2 text-[11px]`,dialog:t,serverRecord:i})]})]})})}function tt({actions:e,activityFilter:t,capabilityTab:n,dialog:r,detailTab:i,filteredActivity:a,onActivityFilterChange:ee,onCapabilityTabChange:o,onDetailTabChange:s,onFocusQuickAdd:c,promptPreviewState:l,selectedServer:u}){return u?(0,D.jsx)(`div`,{className:`min-h-0 overflow-hidden`,children:(0,D.jsxs)(S,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(nt,{actions:e,dialog:r,selectedServer:u}),(0,D.jsx)(`div`,{className:`mt-4 flex flex-wrap gap-4 border-b border-border`,children:N.map(e=>(0,D.jsx)(Ue,{active:i===e,label:z(e),onClick:()=>s(e),variant:`tab`},e))}),(0,D.jsxs)(`div`,{className:`mt-5 min-h-0 flex-1 overflow-y-auto pr-1 scrollbar-none`,children:[i===`overview`?(0,D.jsx)(it,{selectedServer:u}):null,i===`capabilities`?(0,D.jsx)(st,{capabilityTab:n,onCapabilityTabChange:o,promptPreviewState:l,selectedServer:u}):null,i===`activity`?(0,D.jsx)(ft,{activityFilter:t,filteredActivity:a,onActivityFilterChange:ee,selectedServer:u}):null]})]})}):(0,D.jsx)(`div`,{className:`min-h-0 overflow-hidden`,children:(0,D.jsx)(_,{title:`Select an MCP server`,action:(0,D.jsx)(m,{type:`button`,size:`sm`,onClick:c,children:`Quick Add`}),minHeightClassName:`h-full`})})}function nt({actions:e,dialog:t,selectedServer:n}){return(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-4 border-b border-border pb-4`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,D.jsx)(`h2`,{className:`text-[18px] font-medium text-foreground`,children:n.config.name}),(0,D.jsx)(g,{uppercase:!0,className:p(H(n.snapshot.status)),children:V(n.snapshot.status)}),U(n)?(0,D.jsx)(g,{tone:`primary`,children:U(n)}):null]}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[n.config.transport,` · Auth`,` `,B(n.snapshot.auth_status)]}),n.snapshot.last_error?(0,D.jsx)(`p`,{className:`mt-2 max-w-3xl text-[13px] leading-6 text-destructive`,children:n.snapshot.last_error}):null]}),(0,D.jsx)(rt,{actions:e,dialog:t,serverRecord:n})]})}function rt({actions:e,buttonClassName:t,dialog:n,serverRecord:r}){return(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>e.toggleEnabled(r),children:r.config.enabled?`Disable`:`Enable`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,disabled:Pe(r),className:p(Q,t),onClick:()=>r.snapshot.auth_status===`connected`?e.logout(r.config.name):e.login(r.config.name),children:Ne(r)}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>n.openEditDialog(r),children:`Edit`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>e.refreshServer(r.config.name),children:`Refresh`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(We,t),onClick:()=>e.deleteServer(r.config.name),children:`Remove`})]})}function it({selectedServer:e}){return(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Status`}),(0,D.jsx)(`p`,{className:`mt-3 text-[22px] font-medium text-foreground`,children:V(e.snapshot.status)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Auth `,B(e.snapshot.auth_status)]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Visibility`}),(0,D.jsx)(`p`,{className:`mt-3 text-[22px] font-medium text-foreground`,children:U(e)??`Pending`})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Last Refresh`}),(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:R(e.snapshot.last_refresh_at)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Result`,` `,z(e.snapshot.last_refresh_result)]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Timeouts`}),(0,D.jsxs)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:[`Startup `,e.config.startup_timeout_sec,`s`]}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Tool `,e.config.tool_timeout_sec,`s`]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Tool Filters`}),(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:Me(e)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Enabled `,e.config.enabled_tools.length,` · `,`Disabled `,e.config.disabled_tools.length]})]}),(0,D.jsxs)(S,{className:p(`xl:col-span-2`,Y),children:[(0,D.jsx)(`p`,{className:Z,children:`Capability Summary`}),(0,D.jsx)(`div`,{className:`mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:Object.entries(e.snapshot.capability_counts).map(([e,t])=>(0,D.jsxs)(y,{as:`div`,padding:`sm`,className:`bg-card/20`,children:[(0,D.jsx)(`p`,{className:Z,children:e.replaceAll(`_`,` `)}),(0,D.jsx)(`p`,{className:`mt-2 text-xl font-medium text-foreground`,children:t})]},e))})]}),e.config.launcher?(0,D.jsx)(S,{className:p(`xl:col-span-2`,Y),children:(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`Original Launcher`,value:G(e.config.launcher),mono:!0}),(0,D.jsx)(J,{label:`Parsed Result`,value:Ae(e),mono:!0})]})}):null,e.config.transport===`stdio`?(0,D.jsx)(at,{selectedServer:e}):(0,D.jsx)(ot,{selectedServer:e})]})}function at({selectedServer:e}){return(0,D.jsx)(S,{className:p(`xl:col-span-2`,Y),children:(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`Command`,value:G(e.config.command),mono:!0}),(0,D.jsx)(J,{label:`Cwd`,value:G(e.config.cwd),mono:!0}),(0,D.jsx)(J,{label:`Args`,value:K(e.config.args),mono:!0}),(0,D.jsx)(J,{label:`Env Vars`,value:K(e.config.env_vars),mono:!0})]})})}function ot({selectedServer:e}){return(0,D.jsxs)(S,{className:p(`xl:col-span-2`,Y),children:[(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`URL`,value:G(e.config.url),mono:!0}),(0,D.jsx)(J,{label:`OAuth Resource`,value:G(e.config.oauth_resource),mono:!0}),(0,D.jsx)(J,{label:`Bearer Token Env Var`,value:G(e.config.bearer_token_env_var),mono:!0}),(0,D.jsx)(J,{label:`Scopes`,value:K(e.config.scopes),mono:!0}),(0,D.jsx)(J,{label:`HTTP Headers`,value:Fe(e.config.http_headers),mono:!0}),(0,D.jsx)(J,{label:`Env HTTP Headers`,value:K(e.config.env_http_headers),mono:!0})]}),(0,D.jsxs)(y,{as:`div`,padding:`sm`,className:`mt-4 bg-card/20`,children:[(0,D.jsx)(`p`,{className:Z,children:`Recent Auth Result`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:Be(e.snapshot.last_auth_result??``,`No login action yet`)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Current auth status`,` `,B(e.snapshot.auth_status)]})]})]})}function st({capabilityTab:e,onCapabilityTabChange:t,promptPreviewState:n,selectedServer:r}){return(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsx)(`div`,{className:`flex flex-wrap gap-4 border-b border-border`,children:P.map(n=>(0,D.jsx)(Ue,{active:e===n,label:n===`resource_templates`?`Resource Templates`:z(n),onClick:()=>t(n),variant:`tab`},n))}),e===`tools`?(0,D.jsx)(ct,{selectedServer:r}):null,e===`resources`?(0,D.jsx)(lt,{selectedServer:r}):null,e===`resource_templates`?(0,D.jsx)(ut,{selectedServer:r}):null,e===`prompts`?(0,D.jsx)(dt,{promptPreviewState:n,selectedServer:r}):null]})}function ct({selectedServer:e}){return e.snapshot.tools.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No tools discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.tools.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`font-mono text-[13px] text-foreground`,children:e.tool_name}),e.title?(0,D.jsx)(`p`,{className:`mt-2 text-[13px] text-foreground/70`,children:e.title}):null,(0,D.jsx)(`p`,{className:`mt-1 text-[12px] text-muted-foreground`,children:e.fully_qualified_id})]}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-2 text-[10px]`,children:[e.read_only_hint?(0,D.jsx)(g,{tone:`primary`,children:`readOnly`}):null,e.destructive_hint?(0,D.jsx)(g,{tone:`danger`,children:`destructive`}):null,e.open_world_hint?(0,D.jsx)(g,{tone:`idle`,children:`openWorld`}):null]})]}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null,(0,D.jsx)(b,{className:Ge,children:JSON.stringify(e.parameters??{},null,2)})]},e.fully_qualified_id))})}function lt({selectedServer:e}){return e.snapshot.resources.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No resources discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.resources.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:e.name}),(0,D.jsx)(`p`,{className:`mt-1 font-mono text-[12px] text-muted-foreground`,children:e.uri}),(0,D.jsx)(`p`,{className:`mt-3 text-[13px] text-foreground/70`,children:e.mime_type??`Unknown MIME`}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null]},e.uri))})}function ut({selectedServer:e}){return e.snapshot.resource_templates.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No resource templates discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.resource_templates.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:e.name}),(0,D.jsx)(`p`,{className:`mt-1 font-mono text-[12px] text-muted-foreground`,children:e.uri_template}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null]},e.uri_template))})}function dt({promptPreviewState:e,selectedServer:t}){return(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]`,children:[(0,D.jsx)(`div`,{className:`space-y-3`,children:t.snapshot.prompts.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No prompts discovered.`}):t.snapshot.prompts.map(n=>(0,D.jsxs)(m,{type:`button`,variant:`ghost`,onClick:()=>e.selectPrompt(t.config.name,n.name),className:p(`h-auto w-full flex-col items-stretch rounded-xl border border-border bg-card/20 p-5 text-left transition-colors hover:text-inherit`,e.selectedPromptName===n.name?`border-border bg-accent/20`:`hover:bg-accent/20`),children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:n.name}),n.description?(0,D.jsx)(`p`,{className:$,children:n.description}):null,(0,D.jsx)(b,{className:Ge,children:JSON.stringify(n.arguments??[],null,2)})]},n.name))}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Prompt Preview`}),e.selectedPromptName?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:e.selectedPromptName}),(0,D.jsx)(`p`,{className:`mt-4 text-[11px] text-muted-foreground/80`,children:`Arguments`}),(0,D.jsx)(c,{value:e.argumentsText,onChange:t=>e.setArgumentsText(t.target.value),className:`mt-2 min-h-[120px] bg-background/50 font-mono text-[11px] text-foreground/80`}),(0,D.jsxs)(`div`,{className:`mt-3 flex items-center justify-between gap-3`,children:[(0,D.jsx)(`p`,{className:`text-[12px] text-muted-foreground`,children:`Edit argument JSON, then refresh the preview.`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.previewCurrent,children:`Preview`})]}),e.selectedPrompt?.arguments?.length?(0,D.jsx)(b,{className:p(Ge,`max-h-40`),children:JSON.stringify(e.selectedPrompt.arguments,null,2)}):null,(0,D.jsx)(b,{className:p(Ge,`max-h-[420px]`),children:e.loading?`Loading preview...`:JSON.stringify(e.preview??{},null,2)})]}):(0,D.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`Select a prompt to preview it.`})]})]})}function ft({activityFilter:e,filteredActivity:t,onActivityFilterChange:n,selectedServer:r}){return(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:I.map(t=>(0,D.jsx)(Ue,{active:e===t.value,label:t.label,onClick:()=>n(t.value)},t.value))}),t.length===0?(0,D.jsx)(S,{className:p(Y,X),children:r.activity.length===0?`No recent MCP activity.`:`No activity matches the current filter.`}):t.map(e=>(0,D.jsx)(pt,{activityRecord:e},e.id))]})}function pt({activityRecord:e}){return(0,D.jsxs)(S,{className:Y,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(g,{tone:`neutral`,children:Re(e)}),(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:z(e.action)})]}),(0,D.jsx)(`p`,{className:`mt-2 text-[12px] text-muted-foreground`,children:R(e.started_at)})]}),(0,D.jsx)(g,{uppercase:!0,className:p(Se(e.result)),children:e.result})]}),(0,D.jsx)(`p`,{className:`mt-3 text-[13px] leading-6 text-muted-foreground`,children:e.summary}),(0,D.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4 text-[12px] text-muted-foreground`,children:[e.actor_node_id?(0,D.jsxs)(`span`,{children:[`Node `,e.actor_node_id.slice(0,8)]}):null,e.tab_id?(0,D.jsxs)(`span`,{children:[`Workflow `,e.tab_id.slice(0,8)]}):null,e.tool_name?(0,D.jsxs)(`span`,{children:[`Tool `,e.tool_name]}):null,e.target?(0,D.jsxs)(`span`,{children:[`Target `,e.target]}):null,(0,D.jsxs)(`span`,{children:[Math.round(e.duration_ms),` ms`]}),(0,D.jsx)(`span`,{children:xe(e.ended_at)})]})]})}function mt(){let{actions:e,activityFilter:t,capabilityTab:n,clearServerFilters:r,detailTab:i,dialog:o,error:s,filteredActivity:c,filteredServers:l,focusQuickAdd:u,isLoading:d,promptPreviewState:f,quickAdd:p,selectedServer:h,serverStatusFilter:te,servers:g,setActivityFilter:_,setCapabilityTab:v,setDetailTab:y,setSelectedServerName:b,setServerStatusFilter:ne,summaryCounts:re}=He();return(0,D.jsxs)(x,{children:[(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col px-8 py-6`,children:[(0,D.jsx)(ie,{title:`MCP`,actions:(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:()=>void e.refreshAll(),children:[(0,D.jsx)(ee,{className:`mr-2 size-4`}),`Refresh`]}),(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:u,children:[(0,D.jsx)(a,{className:`mr-2 size-4`}),`Quick Add`]}),(0,D.jsxs)(m,{type:`button`,onClick:o.openCreateDialog,children:[(0,D.jsx)(a,{className:`mr-2 size-4`}),`Advanced Add`]})]})}),(0,D.jsx)(`div`,{className:`mt-6 min-h-0 flex-1 overflow-hidden`,children:d?(0,D.jsx)(Ke,{}):s?(0,D.jsx)(qe,{}):g.length===0?(0,D.jsx)(Je,{quickAdd:p,dialog:o}):(0,D.jsx)(Xe,{actions:e,activityFilter:t,capabilityTab:n,clearServerFilters:r,detailTab:i,dialog:o,filteredActivity:c,filteredServers:l,onActivityFilterChange:_,onCapabilityTabChange:v,onDetailTabChange:y,onFocusQuickAdd:u,onSelectServer:b,onServerStatusFilterChange:ne,promptPreviewState:f,quickAdd:p,selectedServer:h,serverStatusFilter:te,summaryCounts:re})})]}),(0,D.jsx)(be,{draft:o.draft,onChange:o.setDraft,open:o.open,pending:o.pending,title:o.editingServerName?`Edit MCP Server`:`Advanced Add MCP Server`,onOpenChange:o.setOpen,onSubmit:()=>void o.saveServer()})]})}export{mt as McpPage};
@@ -1 +0,0 @@
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 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{Lt as r,dt as i,q as a}from"./ui-vendor-UazN8rcv.js";import{B as o,a as s,i as c,n as l,q as u,r as d,s as f,tt as p}from"./index-Biio-CoI.js";import{l as m,s as h}from"./surface-Bzr1FRG4.js";import{c as g,n as _,r as v}from"./PageScaffold-DteOA8V7.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)(``),[l,d]=(0,x.useState)(!1);(0,x.useEffect)(()=>{e&&(o(e.custom_prompt),c(e.custom_post_prompt))},[e]);let w=async()=>{d(!0);try{n(await b({custom_prompt:r,custom_post_prompt:s}),!1),a.success(`Prompts saved`)}catch{a.error(`Failed to save prompts`)}finally{d(!1)}};return t?(0,S.jsx)(f,{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:l,size:`sm`,className:`text-[13px]`,children:[(0,S.jsx)(i,{className:`size-4`}),l?`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)(m,{tone:`neutral`,className:`px-2 py-0.5`,children:[r.length,` chars`]})]})}),(0,S.jsx)(h,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(u,{"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)(m,{tone:`neutral`,className:`px-2 py-0.5`,children:[s.length,` chars`]})]})}),(0,S.jsx)(h,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(u,{"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)(c,{delayDuration:150,children:(0,S.jsxs)(l,{children:[(0,S.jsx)(s,{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)(d,{className:`max-w-xs`,children:t})]})});export{w as PromptsPage};