flowent 0.0.7 → 0.0.11

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