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,611 +0,0 @@
1
- import json
2
-
3
- from flowent.agent import Agent
4
- from flowent.models import NodeConfig, NodeType
5
- from flowent.settings import (
6
- AssistantSettings,
7
- EventLogSettings,
8
- LeaderSettings,
9
- ModelSettings,
10
- ProviderConfig,
11
- RoleConfig,
12
- Settings,
13
- build_assistant_write_dirs,
14
- )
15
- from flowent.tools.manage_settings import ManageSettingsTool
16
-
17
-
18
- def test_manage_settings_get_returns_current_settings(monkeypatch):
19
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
20
- settings = Settings(
21
- assistant=AssistantSettings(
22
- role_name="Steward",
23
- allow_network=False,
24
- write_dirs=["/tmp/workspace", "/tmp/output"],
25
- ),
26
- leader=LeaderSettings(role_name="Conductor"),
27
- event_log=EventLogSettings(timestamp_format="relative"),
28
- model=ModelSettings(active_provider_id="provider-1", active_model="gpt-4o"),
29
- )
30
-
31
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
32
-
33
- result = json.loads(ManageSettingsTool().execute(agent, {"action": "get"}))
34
-
35
- assert result == {
36
- "app_data_dir": settings.app_data_dir,
37
- "working_dir": settings.working_dir,
38
- "assistant": {
39
- "role_name": "Steward",
40
- "allow_network": False,
41
- "write_dirs": ["/tmp/workspace", "/tmp/output"],
42
- },
43
- "leader": {
44
- "role_name": "Conductor",
45
- },
46
- "model": {
47
- "active_provider_id": "provider-1",
48
- "active_model": "gpt-4o",
49
- "input_image": None,
50
- "output_image": None,
51
- "structured_output": None,
52
- "context_window_tokens": None,
53
- "capabilities": None,
54
- "resolved_context_window_tokens": None,
55
- "timeout_ms": 10000,
56
- "retry_policy": "limited",
57
- "max_retries": 5,
58
- "retry_initial_delay_seconds": 0.5,
59
- "retry_max_delay_seconds": 8.0,
60
- "retry_backoff_cap_retries": 5,
61
- "auto_compact_token_limit": None,
62
- "params": {
63
- "reasoning_effort": None,
64
- "verbosity": None,
65
- "max_output_tokens": None,
66
- "temperature": None,
67
- "top_p": None,
68
- },
69
- },
70
- "event_log": {
71
- "timestamp_format": "relative",
72
- },
73
- }
74
-
75
-
76
- def test_manage_settings_update_changes_active_provider_and_model(monkeypatch):
77
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
78
- settings = Settings()
79
- saved: list[Settings] = []
80
- invalidations: list[str] = []
81
-
82
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
83
- monkeypatch.setattr(
84
- "flowent.settings.save_settings", lambda current: saved.append(current)
85
- )
86
- monkeypatch.setattr(
87
- "flowent.providers.gateway.gateway.invalidate_cache",
88
- lambda: invalidations.append("invalidate"),
89
- )
90
-
91
- result = json.loads(
92
- ManageSettingsTool().execute(
93
- agent,
94
- {
95
- "action": "update",
96
- "active_provider_id": "provider-2",
97
- "active_model": "gpt-4.1",
98
- },
99
- )
100
- )
101
-
102
- assert result["model"] == {
103
- "active_provider_id": "provider-2",
104
- "active_model": "gpt-4.1",
105
- "input_image": None,
106
- "output_image": None,
107
- "structured_output": None,
108
- "context_window_tokens": None,
109
- "capabilities": None,
110
- "resolved_context_window_tokens": None,
111
- "timeout_ms": 10000,
112
- "retry_policy": "limited",
113
- "max_retries": 5,
114
- "retry_initial_delay_seconds": 0.5,
115
- "retry_max_delay_seconds": 8.0,
116
- "retry_backoff_cap_retries": 5,
117
- "auto_compact_token_limit": None,
118
- "params": {
119
- "reasoning_effort": None,
120
- "verbosity": None,
121
- "max_output_tokens": None,
122
- "temperature": None,
123
- "top_p": None,
124
- },
125
- }
126
- assert settings.model.active_provider_id == "provider-2"
127
- assert settings.model.active_model == "gpt-4.1"
128
- assert saved == [settings]
129
- assert invalidations == ["invalidate"]
130
-
131
-
132
- def test_manage_settings_update_changes_assistant_role(monkeypatch):
133
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
134
- settings = Settings(
135
- roles=[
136
- RoleConfig(name="Steward", system_prompt="Default assistant role."),
137
- RoleConfig(name="Reviewer", system_prompt="Review carefully."),
138
- ]
139
- )
140
- expected_write_dirs = list(settings.assistant.write_dirs)
141
- saved: list[Settings] = []
142
-
143
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
144
- monkeypatch.setattr(
145
- "flowent.settings.save_settings", lambda current: saved.append(current)
146
- )
147
- monkeypatch.setattr(
148
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
149
- )
150
-
151
- result = json.loads(
152
- ManageSettingsTool().execute(
153
- agent,
154
- {
155
- "action": "update",
156
- "assistant_role_name": "Reviewer",
157
- },
158
- )
159
- )
160
-
161
- assert result["assistant"] == {
162
- "role_name": "Reviewer",
163
- "allow_network": True,
164
- "write_dirs": expected_write_dirs,
165
- }
166
- assert settings.assistant.role_name == "Reviewer"
167
- assert saved == [settings]
168
-
169
-
170
- def test_manage_settings_update_changes_assistant_permissions(monkeypatch):
171
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
172
- settings = Settings()
173
- expected_write_dirs = build_assistant_write_dirs([" ./tmp ", "./tmp/", ""])
174
-
175
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
176
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
177
- monkeypatch.setattr(
178
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
179
- )
180
-
181
- result = json.loads(
182
- ManageSettingsTool().execute(
183
- agent,
184
- {
185
- "action": "update",
186
- "assistant_allow_network": False,
187
- "assistant_write_dirs": [" ./tmp ", "./tmp/", ""],
188
- },
189
- )
190
- )
191
-
192
- assert result["assistant"] == {
193
- "role_name": "Steward",
194
- "allow_network": False,
195
- "write_dirs": expected_write_dirs,
196
- }
197
- assert settings.assistant.allow_network is False
198
- assert settings.assistant.write_dirs == expected_write_dirs
199
-
200
-
201
- def test_manage_settings_update_changes_working_dir(monkeypatch, tmp_path):
202
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
203
- settings = Settings()
204
-
205
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
206
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
207
- monkeypatch.setattr(
208
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
209
- )
210
-
211
- result = json.loads(
212
- ManageSettingsTool().execute(
213
- agent,
214
- {
215
- "action": "update",
216
- "working_dir": str(tmp_path),
217
- },
218
- )
219
- )
220
-
221
- assert result["working_dir"] == str(tmp_path.resolve())
222
- assert settings.working_dir == str(tmp_path.resolve())
223
-
224
-
225
- def test_manage_settings_update_resolves_write_dirs_against_new_working_dir(
226
- monkeypatch,
227
- tmp_path,
228
- ):
229
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
230
- settings = Settings()
231
- target_dir = tmp_path / "project"
232
- target_dir.mkdir()
233
-
234
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
235
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
236
- monkeypatch.setattr(
237
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
238
- )
239
-
240
- result = json.loads(
241
- ManageSettingsTool().execute(
242
- agent,
243
- {
244
- "action": "update",
245
- "working_dir": str(target_dir),
246
- "assistant_write_dirs": ["./out"],
247
- },
248
- )
249
- )
250
-
251
- assert result["working_dir"] == str(target_dir.resolve())
252
- assert result["assistant"]["write_dirs"] == [str((target_dir / "out").resolve())]
253
- assert settings.working_dir == str(target_dir.resolve())
254
- assert settings.assistant.write_dirs == [str((target_dir / "out").resolve())]
255
-
256
-
257
- def test_manage_settings_update_rejects_blank_working_dir(monkeypatch):
258
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
259
- settings = Settings()
260
-
261
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
262
-
263
- result = json.loads(
264
- ManageSettingsTool().execute(
265
- agent,
266
- {
267
- "action": "update",
268
- "working_dir": " ",
269
- },
270
- )
271
- )
272
-
273
- assert result == {"error": "working_dir must not be empty"}
274
-
275
-
276
- def test_manage_settings_update_changes_leader_role(monkeypatch):
277
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
278
- settings = Settings(
279
- roles=[
280
- RoleConfig(name="Conductor", system_prompt="Default leader role."),
281
- RoleConfig(name="Reviewer", system_prompt="Review carefully."),
282
- ]
283
- )
284
- saved: list[Settings] = []
285
-
286
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
287
- monkeypatch.setattr(
288
- "flowent.settings.save_settings", lambda current: saved.append(current)
289
- )
290
- monkeypatch.setattr(
291
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
292
- )
293
-
294
- result = json.loads(
295
- ManageSettingsTool().execute(
296
- agent,
297
- {
298
- "action": "update",
299
- "leader_role_name": "Reviewer",
300
- },
301
- )
302
- )
303
-
304
- assert result["leader"] == {"role_name": "Reviewer"}
305
- assert settings.leader.role_name == "Reviewer"
306
- assert saved == [settings]
307
-
308
-
309
- def test_manage_settings_update_changes_max_retries(monkeypatch):
310
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
311
- settings = Settings()
312
-
313
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
314
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
315
- monkeypatch.setattr(
316
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
317
- )
318
-
319
- result = json.loads(
320
- ManageSettingsTool().execute(
321
- agent,
322
- {
323
- "action": "update",
324
- "max_retries": 7,
325
- },
326
- )
327
- )
328
-
329
- assert result["model"]["max_retries"] == 7
330
- assert settings.model.max_retries == 7
331
-
332
-
333
- def test_manage_settings_update_changes_retry_policy(monkeypatch):
334
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
335
- settings = Settings()
336
-
337
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
338
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
339
- monkeypatch.setattr(
340
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
341
- )
342
-
343
- result = json.loads(
344
- ManageSettingsTool().execute(
345
- agent,
346
- {
347
- "action": "update",
348
- "retry_policy": "unlimited",
349
- },
350
- )
351
- )
352
-
353
- assert result["model"]["retry_policy"] == "unlimited"
354
- assert settings.model.retry_policy == "unlimited"
355
-
356
-
357
- def test_manage_settings_update_changes_timeout_ms(monkeypatch):
358
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
359
- settings = Settings()
360
-
361
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
362
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
363
- monkeypatch.setattr(
364
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
365
- )
366
-
367
- result = json.loads(
368
- ManageSettingsTool().execute(
369
- agent,
370
- {
371
- "action": "update",
372
- "timeout_ms": 15000,
373
- },
374
- )
375
- )
376
-
377
- assert result["model"]["timeout_ms"] == 15000
378
- assert settings.model.timeout_ms == 15000
379
-
380
-
381
- def test_manage_settings_update_changes_retry_backoff(monkeypatch):
382
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
383
- settings = Settings()
384
-
385
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
386
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
387
- monkeypatch.setattr(
388
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
389
- )
390
-
391
- result = json.loads(
392
- ManageSettingsTool().execute(
393
- agent,
394
- {
395
- "action": "update",
396
- "retry_initial_delay_seconds": 0.75,
397
- "retry_max_delay_seconds": 12.0,
398
- "retry_backoff_cap_retries": 3,
399
- },
400
- )
401
- )
402
-
403
- assert result["model"]["retry_initial_delay_seconds"] == 0.75
404
- assert result["model"]["retry_max_delay_seconds"] == 12.0
405
- assert result["model"]["retry_backoff_cap_retries"] == 3
406
- assert settings.model.retry_initial_delay_seconds == 0.75
407
- assert settings.model.retry_max_delay_seconds == 12.0
408
- assert settings.model.retry_backoff_cap_retries == 3
409
-
410
-
411
- def test_manage_settings_update_changes_model_metadata_overrides_and_token_limit(
412
- monkeypatch,
413
- ):
414
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
415
- settings = Settings(
416
- providers=[
417
- ProviderConfig(
418
- id="provider-1",
419
- name="Primary",
420
- type="openai_responses",
421
- base_url="https://api.example.com/v1",
422
- api_key="secret",
423
- )
424
- ]
425
- )
426
- settings.model.active_provider_id = "provider-1"
427
- settings.model.active_model = "gpt-5.2"
428
-
429
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
430
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
431
- monkeypatch.setattr(
432
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
433
- )
434
-
435
- result = json.loads(
436
- ManageSettingsTool().execute(
437
- agent,
438
- {
439
- "action": "update",
440
- "context_window_tokens": 64000,
441
- "input_image": True,
442
- "output_image": False,
443
- "auto_compact_token_limit": 48000,
444
- },
445
- )
446
- )
447
-
448
- assert result["model"]["context_window_tokens"] == 64000
449
- assert result["model"]["resolved_context_window_tokens"] == 64000
450
- assert result["model"]["capabilities"] == {
451
- "input_image": True,
452
- "output_image": False,
453
- "structured_output": False,
454
- }
455
- assert result["model"]["auto_compact_token_limit"] == 48000
456
- assert settings.model.context_window_tokens == 64000
457
- assert settings.model.input_image is True
458
- assert settings.model.output_image is False
459
- assert settings.model.auto_compact_token_limit == 48000
460
-
461
-
462
- def test_manage_settings_update_rejects_non_positive_timeout_ms(monkeypatch):
463
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
464
- settings = Settings()
465
-
466
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
467
-
468
- result = json.loads(
469
- ManageSettingsTool().execute(
470
- agent,
471
- {
472
- "action": "update",
473
- "timeout_ms": 0,
474
- },
475
- )
476
- )
477
-
478
- assert result == {"error": "timeout_ms must be greater than 0"}
479
-
480
-
481
- def test_manage_settings_update_rejects_invalid_retry_policy(monkeypatch):
482
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
483
- settings = Settings()
484
-
485
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
486
-
487
- result = json.loads(
488
- ManageSettingsTool().execute(
489
- agent,
490
- {
491
- "action": "update",
492
- "retry_policy": "forever",
493
- },
494
- )
495
- )
496
-
497
- assert result == {
498
- "error": "retry_policy must be one of: limited, no_retry, unlimited"
499
- }
500
-
501
-
502
- def test_manage_settings_update_rejects_retry_backoff_when_max_below_initial(
503
- monkeypatch,
504
- ):
505
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
506
- settings = Settings()
507
- original_retry_initial_delay_seconds = settings.model.retry_initial_delay_seconds
508
- original_retry_max_delay_seconds = settings.model.retry_max_delay_seconds
509
-
510
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
511
-
512
- result = json.loads(
513
- ManageSettingsTool().execute(
514
- agent,
515
- {
516
- "action": "update",
517
- "retry_initial_delay_seconds": 2.0,
518
- "retry_max_delay_seconds": 1.0,
519
- },
520
- )
521
- )
522
-
523
- assert result == {
524
- "error": "model.retry_max_delay_seconds must be greater than or equal to model.retry_initial_delay_seconds"
525
- }
526
- assert (
527
- settings.model.retry_initial_delay_seconds
528
- == original_retry_initial_delay_seconds
529
- )
530
- assert settings.model.retry_max_delay_seconds == original_retry_max_delay_seconds
531
-
532
-
533
- def test_manage_settings_update_rejects_unknown_assistant_role(monkeypatch):
534
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
535
- settings = Settings(roles=[RoleConfig(name="Steward", system_prompt="Default.")])
536
-
537
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
538
-
539
- result = json.loads(
540
- ManageSettingsTool().execute(
541
- agent,
542
- {
543
- "action": "update",
544
- "assistant_role_name": "Ghost",
545
- },
546
- )
547
- )
548
-
549
- assert result == {"error": "Role 'Ghost' not found"}
550
-
551
-
552
- def test_manage_settings_update_rejects_invalid_assistant_allow_network(monkeypatch):
553
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
554
- settings = Settings()
555
-
556
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
557
-
558
- result = json.loads(
559
- ManageSettingsTool().execute(
560
- agent,
561
- {
562
- "action": "update",
563
- "assistant_allow_network": "yes",
564
- },
565
- )
566
- )
567
-
568
- assert result == {"error": "assistant_allow_network must be a boolean"}
569
-
570
-
571
- def test_manage_settings_update_rejects_unknown_leader_role(monkeypatch):
572
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
573
- settings = Settings(roles=[RoleConfig(name="Conductor", system_prompt="Default.")])
574
-
575
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
576
-
577
- result = json.loads(
578
- ManageSettingsTool().execute(
579
- agent,
580
- {
581
- "action": "update",
582
- "leader_role_name": "Ghost",
583
- },
584
- )
585
- )
586
-
587
- assert result == {"error": "Role 'Ghost' not found"}
588
-
589
-
590
- def test_manage_settings_update_accepts_xhigh_reasoning_effort(monkeypatch):
591
- agent = Agent(NodeConfig(node_type=NodeType.ASSISTANT, tools=["manage_settings"]))
592
- settings = Settings()
593
-
594
- monkeypatch.setattr("flowent.settings.get_settings", lambda: settings)
595
- monkeypatch.setattr("flowent.settings.save_settings", lambda current: None)
596
- monkeypatch.setattr(
597
- "flowent.providers.gateway.gateway.invalidate_cache", lambda: None
598
- )
599
-
600
- result = json.loads(
601
- ManageSettingsTool().execute(
602
- agent,
603
- {
604
- "action": "update",
605
- "model_params": {"reasoning_effort": "xhigh"},
606
- },
607
- )
608
- )
609
-
610
- assert result["model"]["params"]["reasoning_effort"] == "xhigh"
611
- assert settings.model.params.reasoning_effort == "xhigh"
@@ -1,33 +0,0 @@
1
- import json
2
-
3
- from flowent.agent import Agent
4
- from flowent.models import NodeConfig, NodeType
5
- from flowent.tools.read import ReadTool
6
-
7
-
8
- def test_read_tool_prefixes_each_line_with_cat_n_style_line_numbers(tmp_path):
9
- target = tmp_path / "sample.txt"
10
- target.write_text("alpha\nbeta\n", encoding="utf-8")
11
- agent = Agent(NodeConfig(node_type=NodeType.AGENT, tools=["read"]))
12
-
13
- result = json.loads(ReadTool().execute(agent, {"path": str(target)}))
14
-
15
- assert result["content"] == " 1\talpha\n 2\tbeta\n"
16
-
17
-
18
- def test_read_tool_streams_numbered_content_chunks(tmp_path):
19
- target = tmp_path / "sample.txt"
20
- target.write_text("alpha\nbeta\ngamma\n", encoding="utf-8")
21
- agent = Agent(NodeConfig(node_type=NodeType.AGENT, tools=["read"]))
22
- chunks: list[str] = []
23
-
24
- result = json.loads(
25
- ReadTool().execute(
26
- agent,
27
- {"path": str(target), "start_line": 2, "end_line": 3},
28
- on_output=chunks.append,
29
- )
30
- )
31
-
32
- assert result["content"] == " 2\tbeta\n 3\tgamma\n"
33
- assert "".join(chunks) == result["content"]