flock-core 0.4.543__py3-none-any.whl → 0.5.0__py3-none-any.whl

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.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

Files changed (501) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +1079 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +86 -0
  5. flock/cli.py +147 -0
  6. flock/components.py +189 -0
  7. flock/dashboard/__init__.py +30 -0
  8. flock/dashboard/collector.py +559 -0
  9. flock/dashboard/events.py +188 -0
  10. flock/dashboard/graph_builder.py +563 -0
  11. flock/dashboard/launcher.py +235 -0
  12. flock/dashboard/models/graph.py +156 -0
  13. flock/dashboard/service.py +991 -0
  14. flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
  15. flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
  16. flock/dashboard/static_v2/index.html +13 -0
  17. flock/dashboard/websocket.py +246 -0
  18. flock/engines/__init__.py +6 -0
  19. flock/engines/dspy_engine.py +932 -0
  20. flock/examples.py +131 -0
  21. flock/frontend/README.md +778 -0
  22. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  23. flock/frontend/index.html +12 -0
  24. flock/frontend/package-lock.json +4337 -0
  25. flock/frontend/package.json +48 -0
  26. flock/frontend/src/App.tsx +139 -0
  27. flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
  28. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  29. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  30. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  31. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  32. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  33. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  34. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  35. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  36. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  37. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  38. flock/frontend/src/components/controls/PublishControl.css +547 -0
  39. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  40. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  41. flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
  42. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  43. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  44. flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
  45. flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
  46. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  47. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  48. flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
  49. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  50. flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
  51. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  52. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  53. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  54. flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
  55. flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
  56. flock/frontend/src/components/filters/FilterPills.module.css +220 -0
  57. flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
  58. flock/frontend/src/components/filters/FilterPills.tsx +143 -0
  59. flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
  60. flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
  61. flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
  62. flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
  63. flock/frontend/src/components/filters/TagFilter.tsx +21 -0
  64. flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
  65. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  66. flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
  67. flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
  68. flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
  69. flock/frontend/src/components/graph/AgentNode.tsx +324 -0
  70. flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
  71. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  72. flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
  73. flock/frontend/src/components/graph/MessageNode.tsx +129 -0
  74. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  75. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  76. flock/frontend/src/components/layout/DashboardLayout.css +420 -0
  77. flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
  78. flock/frontend/src/components/layout/Header.module.css +88 -0
  79. flock/frontend/src/components/layout/Header.tsx +52 -0
  80. flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
  81. flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
  82. flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
  83. flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
  84. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  85. flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
  86. flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
  87. flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
  88. flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
  89. flock/frontend/src/components/modules/registerModules.ts +29 -0
  90. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  91. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  92. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  93. flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
  94. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  95. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  96. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  97. flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
  98. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  99. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  100. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  101. flock/frontend/src/hooks/useModules.ts +157 -0
  102. flock/frontend/src/hooks/usePersistence.ts +141 -0
  103. flock/frontend/src/main.tsx +13 -0
  104. flock/frontend/src/services/api.ts +337 -0
  105. flock/frontend/src/services/graphService.test.ts +330 -0
  106. flock/frontend/src/services/graphService.ts +75 -0
  107. flock/frontend/src/services/indexeddb.test.ts +793 -0
  108. flock/frontend/src/services/indexeddb.ts +848 -0
  109. flock/frontend/src/services/layout.test.ts +437 -0
  110. flock/frontend/src/services/layout.ts +357 -0
  111. flock/frontend/src/services/themeApplicator.ts +140 -0
  112. flock/frontend/src/services/themeService.ts +77 -0
  113. flock/frontend/src/services/websocket.ts +650 -0
  114. flock/frontend/src/store/filterStore.test.ts +250 -0
  115. flock/frontend/src/store/filterStore.ts +272 -0
  116. flock/frontend/src/store/graphStore.test.ts +570 -0
  117. flock/frontend/src/store/graphStore.ts +462 -0
  118. flock/frontend/src/store/moduleStore.test.ts +253 -0
  119. flock/frontend/src/store/moduleStore.ts +75 -0
  120. flock/frontend/src/store/settingsStore.ts +188 -0
  121. flock/frontend/src/store/streamStore.ts +68 -0
  122. flock/frontend/src/store/uiStore.test.ts +54 -0
  123. flock/frontend/src/store/uiStore.ts +122 -0
  124. flock/frontend/src/store/wsStore.ts +34 -0
  125. flock/frontend/src/styles/index.css +15 -0
  126. flock/frontend/src/styles/scrollbar.css +47 -0
  127. flock/frontend/src/styles/variables.css +488 -0
  128. flock/frontend/src/test/setup.ts +1 -0
  129. flock/frontend/src/types/filters.ts +47 -0
  130. flock/frontend/src/types/graph.ts +95 -0
  131. flock/frontend/src/types/modules.ts +10 -0
  132. flock/frontend/src/types/theme.ts +55 -0
  133. flock/frontend/src/utils/artifacts.ts +24 -0
  134. flock/frontend/src/utils/mockData.ts +98 -0
  135. flock/frontend/src/utils/performance.ts +16 -0
  136. flock/frontend/src/vite-env.d.ts +17 -0
  137. flock/frontend/tsconfig.json +27 -0
  138. flock/frontend/tsconfig.node.json +11 -0
  139. flock/frontend/vite.config.ts +25 -0
  140. flock/frontend/vitest.config.ts +11 -0
  141. flock/{core/util → helper}/cli_helper.py +9 -5
  142. flock/{core/logging → logging}/__init__.py +2 -3
  143. flock/logging/auto_trace.py +159 -0
  144. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  145. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  146. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -107
  147. flock/{core/logging → logging}/logging.py +78 -61
  148. flock/{core/logging → logging}/telemetry.py +66 -26
  149. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  150. flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
  151. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
  152. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  153. flock/logging/trace_and_logged.py +304 -0
  154. flock/mcp/__init__.py +91 -0
  155. flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
  156. flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
  157. flock/mcp/manager.py +286 -0
  158. flock/mcp/servers/sse/__init__.py +1 -1
  159. flock/mcp/servers/sse/flock_sse_server.py +16 -58
  160. flock/mcp/servers/stdio/__init__.py +1 -1
  161. flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
  162. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
  163. flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
  164. flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
  165. flock/mcp/types/__init__.py +42 -0
  166. flock/{core/mcp → mcp}/types/callbacks.py +12 -15
  167. flock/{core/mcp → mcp}/types/factories.py +7 -6
  168. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  169. flock/{core/mcp → mcp}/types/types.py +70 -74
  170. flock/{core/mcp → mcp}/util/helpers.py +3 -3
  171. flock/orchestrator.py +970 -0
  172. flock/registry.py +148 -0
  173. flock/runtime.py +262 -0
  174. flock/service.py +277 -0
  175. flock/store.py +1214 -0
  176. flock/subscription.py +111 -0
  177. flock/themes/andromeda.toml +1 -1
  178. flock/themes/apple-system-colors.toml +1 -1
  179. flock/themes/arcoiris.toml +1 -1
  180. flock/themes/atomonelight.toml +1 -1
  181. flock/themes/ayu copy.toml +1 -1
  182. flock/themes/ayu-light.toml +1 -1
  183. flock/themes/belafonte-day.toml +1 -1
  184. flock/themes/belafonte-night.toml +1 -1
  185. flock/themes/blulocodark.toml +1 -1
  186. flock/themes/breeze.toml +1 -1
  187. flock/themes/broadcast.toml +1 -1
  188. flock/themes/brogrammer.toml +1 -1
  189. flock/themes/builtin-dark.toml +1 -1
  190. flock/themes/builtin-pastel-dark.toml +1 -1
  191. flock/themes/catppuccin-latte.toml +1 -1
  192. flock/themes/catppuccin-macchiato.toml +1 -1
  193. flock/themes/catppuccin-mocha.toml +1 -1
  194. flock/themes/cga.toml +1 -1
  195. flock/themes/chalk.toml +1 -1
  196. flock/themes/ciapre.toml +1 -1
  197. flock/themes/coffee-theme.toml +1 -1
  198. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  199. flock/themes/dark+.toml +1 -1
  200. flock/themes/darkermatrix.toml +1 -1
  201. flock/themes/darkmatrix.toml +2 -2
  202. flock/themes/darkside.toml +1 -1
  203. flock/themes/deep.toml +2 -2
  204. flock/themes/desert.toml +1 -1
  205. flock/themes/django.toml +1 -1
  206. flock/themes/djangosmooth.toml +1 -1
  207. flock/themes/doomone.toml +1 -1
  208. flock/themes/dotgov.toml +1 -1
  209. flock/themes/dracula+.toml +1 -1
  210. flock/themes/duckbones.toml +1 -1
  211. flock/themes/encom.toml +1 -1
  212. flock/themes/espresso.toml +1 -1
  213. flock/themes/everblush.toml +1 -1
  214. flock/themes/fairyfloss.toml +1 -1
  215. flock/themes/fideloper.toml +1 -1
  216. flock/themes/fishtank.toml +1 -1
  217. flock/themes/flexoki-light.toml +1 -1
  218. flock/themes/floraverse.toml +1 -1
  219. flock/themes/framer.toml +1 -1
  220. flock/themes/galizur.toml +1 -1
  221. flock/themes/github.toml +1 -1
  222. flock/themes/grass.toml +1 -1
  223. flock/themes/grey-green.toml +1 -1
  224. flock/themes/gruvboxlight.toml +1 -1
  225. flock/themes/guezwhoz.toml +1 -1
  226. flock/themes/harper.toml +1 -1
  227. flock/themes/hax0r-blue.toml +1 -1
  228. flock/themes/hopscotch.256.toml +1 -1
  229. flock/themes/ic-green-ppl.toml +1 -1
  230. flock/themes/iceberg-dark.toml +1 -1
  231. flock/themes/japanesque.toml +1 -1
  232. flock/themes/jubi.toml +1 -1
  233. flock/themes/kibble.toml +1 -1
  234. flock/themes/kolorit.toml +1 -1
  235. flock/themes/kurokula.toml +1 -1
  236. flock/themes/materialdesigncolors.toml +1 -1
  237. flock/themes/matrix.toml +1 -1
  238. flock/themes/mellifluous.toml +1 -1
  239. flock/themes/midnight-in-mojave.toml +1 -1
  240. flock/themes/monokai-remastered.toml +1 -1
  241. flock/themes/monokai-soda.toml +1 -1
  242. flock/themes/neon.toml +1 -1
  243. flock/themes/neopolitan.toml +5 -5
  244. flock/themes/nord-light.toml +1 -1
  245. flock/themes/ocean.toml +1 -1
  246. flock/themes/onehalfdark.toml +1 -1
  247. flock/themes/onehalflight.toml +1 -1
  248. flock/themes/palenighthc.toml +1 -1
  249. flock/themes/paulmillr.toml +1 -1
  250. flock/themes/pencildark.toml +1 -1
  251. flock/themes/pnevma.toml +1 -1
  252. flock/themes/purple-rain.toml +1 -1
  253. flock/themes/purplepeter.toml +1 -1
  254. flock/themes/raycast-dark.toml +1 -1
  255. flock/themes/red-sands.toml +1 -1
  256. flock/themes/relaxed.toml +1 -1
  257. flock/themes/retro.toml +1 -1
  258. flock/themes/rose-pine.toml +1 -1
  259. flock/themes/royal.toml +1 -1
  260. flock/themes/ryuuko.toml +1 -1
  261. flock/themes/sakura.toml +1 -1
  262. flock/themes/scarlet-protocol.toml +1 -1
  263. flock/themes/seoulbones-dark.toml +1 -1
  264. flock/themes/shades-of-purple.toml +1 -1
  265. flock/themes/smyck.toml +1 -1
  266. flock/themes/softserver.toml +1 -1
  267. flock/themes/solarized-darcula.toml +1 -1
  268. flock/themes/square.toml +1 -1
  269. flock/themes/sugarplum.toml +1 -1
  270. flock/themes/thayer-bright.toml +1 -1
  271. flock/themes/tokyonight.toml +1 -1
  272. flock/themes/tomorrow.toml +1 -1
  273. flock/themes/ubuntu.toml +1 -1
  274. flock/themes/ultradark.toml +1 -1
  275. flock/themes/ultraviolent.toml +1 -1
  276. flock/themes/unikitty.toml +1 -1
  277. flock/themes/urple.toml +1 -1
  278. flock/themes/vesper.toml +1 -1
  279. flock/themes/vimbones.toml +1 -1
  280. flock/themes/wildcherry.toml +1 -1
  281. flock/themes/wilmersdorf.toml +1 -1
  282. flock/themes/wryan.toml +1 -1
  283. flock/themes/xcodedarkhc.toml +1 -1
  284. flock/themes/xcodelight.toml +1 -1
  285. flock/themes/zenbones-light.toml +1 -1
  286. flock/themes/zenwritten-dark.toml +1 -1
  287. flock/utilities.py +301 -0
  288. flock/utility/output_utility_component.py +226 -0
  289. flock/visibility.py +107 -0
  290. flock_core-0.5.0.dist-info/METADATA +964 -0
  291. flock_core-0.5.0.dist-info/RECORD +525 -0
  292. flock_core-0.5.0.dist-info/entry_points.txt +2 -0
  293. {flock_core-0.4.543.dist-info → flock_core-0.5.0.dist-info}/licenses/LICENSE +1 -1
  294. flock/adapter/__init__.py +0 -14
  295. flock/adapter/azure_adapter.py +0 -68
  296. flock/adapter/chroma_adapter.py +0 -73
  297. flock/adapter/faiss_adapter.py +0 -97
  298. flock/adapter/pinecone_adapter.py +0 -51
  299. flock/adapter/vector_base.py +0 -47
  300. flock/cli/assets/release_notes.md +0 -140
  301. flock/cli/config.py +0 -8
  302. flock/cli/constants.py +0 -36
  303. flock/cli/create_agent.py +0 -1
  304. flock/cli/create_flock.py +0 -280
  305. flock/cli/execute_flock.py +0 -620
  306. flock/cli/load_agent.py +0 -1
  307. flock/cli/load_examples.py +0 -1
  308. flock/cli/load_flock.py +0 -192
  309. flock/cli/load_release_notes.py +0 -20
  310. flock/cli/loaded_flock_cli.py +0 -254
  311. flock/cli/manage_agents.py +0 -459
  312. flock/cli/registry_management.py +0 -889
  313. flock/cli/runner.py +0 -41
  314. flock/cli/settings.py +0 -857
  315. flock/cli/utils.py +0 -135
  316. flock/cli/view_results.py +0 -29
  317. flock/cli/yaml_editor.py +0 -396
  318. flock/config.py +0 -56
  319. flock/core/__init__.py +0 -44
  320. flock/core/api/__init__.py +0 -10
  321. flock/core/api/custom_endpoint.py +0 -45
  322. flock/core/api/endpoints.py +0 -262
  323. flock/core/api/main.py +0 -162
  324. flock/core/api/models.py +0 -101
  325. flock/core/api/run_store.py +0 -224
  326. flock/core/api/runner.py +0 -44
  327. flock/core/api/service.py +0 -214
  328. flock/core/config/flock_agent_config.py +0 -11
  329. flock/core/config/scheduled_agent_config.py +0 -40
  330. flock/core/context/context.py +0 -214
  331. flock/core/context/context_manager.py +0 -40
  332. flock/core/context/context_vars.py +0 -11
  333. flock/core/evaluation/utils.py +0 -395
  334. flock/core/execution/batch_executor.py +0 -369
  335. flock/core/execution/evaluation_executor.py +0 -438
  336. flock/core/execution/local_executor.py +0 -31
  337. flock/core/execution/opik_executor.py +0 -103
  338. flock/core/execution/temporal_executor.py +0 -166
  339. flock/core/flock.py +0 -1003
  340. flock/core/flock_agent.py +0 -1258
  341. flock/core/flock_evaluator.py +0 -60
  342. flock/core/flock_factory.py +0 -513
  343. flock/core/flock_module.py +0 -207
  344. flock/core/flock_registry.py +0 -702
  345. flock/core/flock_router.py +0 -83
  346. flock/core/flock_scheduler.py +0 -166
  347. flock/core/flock_server_manager.py +0 -136
  348. flock/core/interpreter/python_interpreter.py +0 -689
  349. flock/core/logging/live_capture.py +0 -137
  350. flock/core/logging/trace_and_logged.py +0 -59
  351. flock/core/mcp/__init__.py +0 -1
  352. flock/core/mcp/flock_mcp_server.py +0 -640
  353. flock/core/mcp/mcp_client_manager.py +0 -201
  354. flock/core/mcp/types/__init__.py +0 -1
  355. flock/core/mixin/dspy_integration.py +0 -445
  356. flock/core/mixin/prompt_parser.py +0 -125
  357. flock/core/serialization/__init__.py +0 -13
  358. flock/core/serialization/callable_registry.py +0 -52
  359. flock/core/serialization/flock_serializer.py +0 -854
  360. flock/core/serialization/json_encoder.py +0 -41
  361. flock/core/serialization/secure_serializer.py +0 -175
  362. flock/core/serialization/serializable.py +0 -342
  363. flock/core/serialization/serialization_utils.py +0 -409
  364. flock/core/util/file_path_utils.py +0 -223
  365. flock/core/util/hydrator.py +0 -309
  366. flock/core/util/input_resolver.py +0 -141
  367. flock/core/util/loader.py +0 -59
  368. flock/core/util/splitter.py +0 -219
  369. flock/di.py +0 -41
  370. flock/evaluators/__init__.py +0 -1
  371. flock/evaluators/declarative/__init__.py +0 -1
  372. flock/evaluators/declarative/declarative_evaluator.py +0 -217
  373. flock/evaluators/memory/memory_evaluator.py +0 -90
  374. flock/evaluators/test/test_case_evaluator.py +0 -38
  375. flock/evaluators/zep/zep_evaluator.py +0 -59
  376. flock/modules/__init__.py +0 -1
  377. flock/modules/assertion/__init__.py +0 -1
  378. flock/modules/assertion/assertion_module.py +0 -286
  379. flock/modules/callback/__init__.py +0 -1
  380. flock/modules/callback/callback_module.py +0 -91
  381. flock/modules/enterprise_memory/README.md +0 -99
  382. flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
  383. flock/modules/mem0/__init__.py +0 -1
  384. flock/modules/mem0/mem0_module.py +0 -126
  385. flock/modules/mem0_async/__init__.py +0 -1
  386. flock/modules/mem0_async/async_mem0_module.py +0 -126
  387. flock/modules/memory/__init__.py +0 -1
  388. flock/modules/memory/memory_module.py +0 -429
  389. flock/modules/memory/memory_parser.py +0 -125
  390. flock/modules/memory/memory_storage.py +0 -736
  391. flock/modules/output/__init__.py +0 -1
  392. flock/modules/output/output_module.py +0 -196
  393. flock/modules/performance/__init__.py +0 -1
  394. flock/modules/performance/metrics_module.py +0 -678
  395. flock/modules/zep/__init__.py +0 -1
  396. flock/modules/zep/zep_module.py +0 -192
  397. flock/platform/docker_tools.py +0 -49
  398. flock/platform/jaeger_install.py +0 -86
  399. flock/routers/__init__.py +0 -1
  400. flock/routers/agent/__init__.py +0 -1
  401. flock/routers/agent/agent_router.py +0 -236
  402. flock/routers/agent/handoff_agent.py +0 -58
  403. flock/routers/conditional/conditional_router.py +0 -486
  404. flock/routers/default/__init__.py +0 -1
  405. flock/routers/default/default_router.py +0 -80
  406. flock/routers/feedback/feedback_router.py +0 -114
  407. flock/routers/list_generator/list_generator_router.py +0 -166
  408. flock/routers/llm/__init__.py +0 -1
  409. flock/routers/llm/llm_router.py +0 -365
  410. flock/tools/__init__.py +0 -0
  411. flock/tools/azure_tools.py +0 -781
  412. flock/tools/code_tools.py +0 -167
  413. flock/tools/file_tools.py +0 -149
  414. flock/tools/github_tools.py +0 -157
  415. flock/tools/markdown_tools.py +0 -205
  416. flock/tools/system_tools.py +0 -9
  417. flock/tools/text_tools.py +0 -810
  418. flock/tools/web_tools.py +0 -92
  419. flock/tools/zendesk_tools.py +0 -501
  420. flock/webapp/__init__.py +0 -1
  421. flock/webapp/app/__init__.py +0 -0
  422. flock/webapp/app/api/__init__.py +0 -0
  423. flock/webapp/app/api/agent_management.py +0 -237
  424. flock/webapp/app/api/execution.py +0 -503
  425. flock/webapp/app/api/flock_management.py +0 -125
  426. flock/webapp/app/api/registry_viewer.py +0 -29
  427. flock/webapp/app/chat.py +0 -662
  428. flock/webapp/app/config.py +0 -104
  429. flock/webapp/app/dependencies.py +0 -117
  430. flock/webapp/app/main.py +0 -1086
  431. flock/webapp/app/middleware.py +0 -113
  432. flock/webapp/app/models_ui.py +0 -7
  433. flock/webapp/app/services/__init__.py +0 -0
  434. flock/webapp/app/services/feedback_file_service.py +0 -363
  435. flock/webapp/app/services/flock_service.py +0 -345
  436. flock/webapp/app/services/sharing_models.py +0 -81
  437. flock/webapp/app/services/sharing_store.py +0 -597
  438. flock/webapp/app/templates/theme_mapper.html +0 -326
  439. flock/webapp/app/theme_mapper.py +0 -811
  440. flock/webapp/app/utils.py +0 -85
  441. flock/webapp/run.py +0 -219
  442. flock/webapp/static/css/chat.css +0 -301
  443. flock/webapp/static/css/components.css +0 -167
  444. flock/webapp/static/css/header.css +0 -39
  445. flock/webapp/static/css/layout.css +0 -281
  446. flock/webapp/static/css/sidebar.css +0 -127
  447. flock/webapp/static/css/two-pane.css +0 -48
  448. flock/webapp/templates/base.html +0 -389
  449. flock/webapp/templates/chat.html +0 -152
  450. flock/webapp/templates/chat_settings.html +0 -19
  451. flock/webapp/templates/flock_editor.html +0 -16
  452. flock/webapp/templates/index.html +0 -12
  453. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  454. flock/webapp/templates/partials/_agent_list.html +0 -18
  455. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  456. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  457. flock/webapp/templates/partials/_chat_container.html +0 -15
  458. flock/webapp/templates/partials/_chat_messages.html +0 -57
  459. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  460. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  461. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  462. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  463. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  464. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  465. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  466. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  467. flock/webapp/templates/partials/_execution_form.html +0 -127
  468. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  469. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  470. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  471. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  472. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  473. flock/webapp/templates/partials/_live_logs.html +0 -13
  474. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  475. flock/webapp/templates/partials/_registry_table.html +0 -25
  476. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  477. flock/webapp/templates/partials/_results_display.html +0 -78
  478. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  479. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  480. flock/webapp/templates/partials/_settings_view.html +0 -36
  481. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  482. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  483. flock/webapp/templates/partials/_sidebar.html +0 -74
  484. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  485. flock/webapp/templates/partials/_theme_preview.html +0 -36
  486. flock/webapp/templates/registry_viewer.html +0 -84
  487. flock/webapp/templates/shared_run_page.html +0 -140
  488. flock/workflow/__init__.py +0 -0
  489. flock/workflow/activities.py +0 -237
  490. flock/workflow/agent_activities.py +0 -24
  491. flock/workflow/agent_execution_activity.py +0 -240
  492. flock/workflow/flock_workflow.py +0 -225
  493. flock/workflow/temporal_config.py +0 -96
  494. flock/workflow/temporal_setup.py +0 -60
  495. flock_core-0.4.543.dist-info/METADATA +0 -676
  496. flock_core-0.4.543.dist-info/RECORD +0 -572
  497. flock_core-0.4.543.dist-info/entry_points.txt +0 -2
  498. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  499. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  500. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  501. {flock_core-0.4.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
@@ -1,224 +0,0 @@
1
- # src/flock/core/api/run_store.py
2
- """Manages the state of active and completed Flock runs."""
3
-
4
- import threading
5
- from datetime import datetime
6
- from typing import Any
7
-
8
- from flock.core.logging.logging import get_logger
9
-
10
- from .models import ( # Import from the models file
11
- FlockAPIResponse,
12
- FlockBatchResponse,
13
- )
14
-
15
- logger = get_logger("api.run_store")
16
-
17
-
18
- class RunStore:
19
- """Stores and manages the state of Flock runs."""
20
-
21
- def __init__(self):
22
- self._runs: dict[str, FlockAPIResponse] = {}
23
- self._batches: dict[str, FlockBatchResponse] = {}
24
- self._lock = threading.Lock() # Basic lock for thread safety
25
-
26
- def create_run(self, run_id: str) -> FlockAPIResponse:
27
- """Creates a new run record with 'starting' status."""
28
- with self._lock:
29
- if run_id in self._runs:
30
- logger.warning(f"Run ID {run_id} already exists. Overwriting.")
31
- response = FlockAPIResponse(
32
- run_id=run_id, status="starting", started_at=datetime.now()
33
- )
34
- self._runs[run_id] = response
35
- logger.debug(f"Created run record for run_id: {run_id}")
36
- return response
37
-
38
- def get_run(self, run_id: str) -> FlockAPIResponse | None:
39
- """Gets the status of a run."""
40
- with self._lock:
41
- return self._runs.get(run_id)
42
-
43
- def update_run_status(
44
- self, run_id: str, status: str, error: str | None = None
45
- ):
46
- """Updates the status and potentially error of a run."""
47
- with self._lock:
48
- if run_id in self._runs:
49
- self._runs[run_id].status = status
50
- if error:
51
- self._runs[run_id].error = error
52
- if status in ["completed", "failed"]:
53
- self._runs[run_id].completed_at = datetime.now()
54
- logger.debug(f"Updated status for run_id {run_id} to {status}")
55
- else:
56
- logger.warning(
57
- f"Attempted to update status for non-existent run_id: {run_id}"
58
- )
59
-
60
- def update_run_result(self, run_id: str, result: dict):
61
- """Updates the result of a completed run."""
62
- with self._lock:
63
- if run_id in self._runs:
64
- # Ensure result is serializable (e.g., convert Box)
65
- final_result = (
66
- dict(result) if hasattr(result, "to_dict") else result
67
- )
68
- self._runs[run_id].result = final_result
69
- self._runs[run_id].status = "completed"
70
- self._runs[run_id].completed_at = datetime.now()
71
- logger.debug(f"Updated result for completed run_id: {run_id}")
72
- else:
73
- logger.warning(
74
- f"Attempted to update result for non-existent run_id: {run_id}"
75
- )
76
-
77
- def create_batch(self, batch_id: str) -> FlockBatchResponse:
78
- """Creates a new batch record with 'starting' status."""
79
- with self._lock:
80
- if batch_id in self._batches:
81
- logger.warning(
82
- f"Batch ID {batch_id} already exists. Overwriting."
83
- )
84
- response = FlockBatchResponse(
85
- batch_id=batch_id,
86
- status="starting",
87
- results=[],
88
- started_at=datetime.now(),
89
- total_items=0,
90
- completed_items=0,
91
- progress_percentage=0.0,
92
- )
93
- self._batches[batch_id] = response
94
- logger.debug(f"Created batch record for batch_id: {batch_id}")
95
- return response
96
-
97
- def get_batch(self, batch_id: str) -> FlockBatchResponse | None:
98
- """Gets the status of a batch run."""
99
- with self._lock:
100
- return self._batches.get(batch_id)
101
-
102
- def update_batch_status(
103
- self, batch_id: str, status: str, error: str | None = None
104
- ):
105
- """Updates the status and potentially error of a batch run."""
106
- with self._lock:
107
- if batch_id in self._batches:
108
- self._batches[batch_id].status = status
109
- if error:
110
- self._batches[batch_id].error = error
111
- if status in ["completed", "failed"]:
112
- self._batches[batch_id].completed_at = datetime.now()
113
- # When completed, ensure progress is 100%
114
- if (
115
- status == "completed"
116
- and self._batches[batch_id].total_items > 0
117
- ):
118
- self._batches[batch_id].completed_items = self._batches[
119
- batch_id
120
- ].total_items
121
- self._batches[batch_id].progress_percentage = 100.0
122
- logger.debug(
123
- f"Updated status for batch_id {batch_id} to {status}"
124
- )
125
- else:
126
- logger.warning(
127
- f"Attempted to update status for non-existent batch_id: {batch_id}"
128
- )
129
-
130
- def update_batch_result(self, batch_id: str, results: list[Any]):
131
- """Updates the results of a completed batch run."""
132
- with self._lock:
133
- if batch_id in self._batches:
134
- # Ensure results are serializable
135
- final_results = [
136
- dict(r) if hasattr(r, "to_dict") else r for r in results
137
- ]
138
- self._batches[batch_id].results = final_results
139
- self._batches[batch_id].status = "completed"
140
- self._batches[batch_id].completed_at = datetime.now()
141
-
142
- # Update progress tracking
143
- self._batches[batch_id].completed_items = len(final_results)
144
- self._batches[batch_id].total_items = len(final_results)
145
- self._batches[batch_id].progress_percentage = 100.0
146
-
147
- logger.debug(
148
- f"Updated results for completed batch_id: {batch_id}"
149
- )
150
- else:
151
- logger.warning(
152
- f"Attempted to update results for non-existent batch_id: {batch_id}"
153
- )
154
-
155
- def set_batch_total_items(self, batch_id: str, total_items: int):
156
- """Sets the total number of items in a batch."""
157
- try:
158
- with self._lock:
159
- if batch_id in self._batches:
160
- self._batches[batch_id].total_items = total_items
161
- # Recalculate percentage
162
- if total_items > 0:
163
- self._batches[batch_id].progress_percentage = (
164
- self._batches[batch_id].completed_items
165
- / total_items
166
- * 100.0
167
- )
168
- logger.debug(
169
- f"Set total_items for batch_id {batch_id} to {total_items}"
170
- )
171
- else:
172
- logger.warning(
173
- f"Attempted to set total_items for non-existent batch_id: {batch_id}"
174
- )
175
- except Exception as e:
176
- logger.error(f"Error setting batch total items: {e}", exc_info=True)
177
-
178
- def update_batch_progress(
179
- self,
180
- batch_id: str,
181
- completed_items: int,
182
- partial_results: list[Any] = None,
183
- ):
184
- """Updates the progress of a batch run and optionally adds partial results.
185
-
186
- Args:
187
- batch_id: The ID of the batch to update
188
- completed_items: The number of items that have been completed
189
- partial_results: Optional list of results for completed items to add to the batch
190
- """
191
- try:
192
- with self._lock:
193
- if batch_id in self._batches:
194
- self._batches[batch_id].completed_items = completed_items
195
-
196
- # Calculate percentage if we have a total
197
- if self._batches[batch_id].total_items > 0:
198
- self._batches[batch_id].progress_percentage = (
199
- completed_items
200
- / self._batches[batch_id].total_items
201
- * 100.0
202
- )
203
-
204
- # Add partial results if provided
205
- if partial_results:
206
- # Ensure results are serializable
207
- final_results = [
208
- dict(r) if hasattr(r, "to_dict") else r
209
- for r in partial_results
210
- ]
211
- self._batches[batch_id].results = final_results
212
-
213
- logger.debug(
214
- f"Updated progress for batch_id {batch_id}: {completed_items}/{self._batches[batch_id].total_items} "
215
- f"({self._batches[batch_id].progress_percentage:.1f}%)"
216
- )
217
- else:
218
- logger.warning(
219
- f"Attempted to update progress for non-existent batch_id: {batch_id}"
220
- )
221
- except Exception as e:
222
- logger.error(f"Error updating batch progress: {e}", exc_info=True)
223
-
224
- # Add methods for cleanup, persistence, etc. later
flock/core/api/runner.py DELETED
@@ -1,44 +0,0 @@
1
- # src/flock/api/runner.py
2
- """Provides functionality to start the Flock API server."""
3
-
4
- from collections.abc import Callable, Sequence
5
- from typing import TYPE_CHECKING, Any
6
-
7
- from flock.core.api.custom_endpoint import FlockEndpoint
8
- from flock.core.logging.logging import get_logger
9
-
10
- if TYPE_CHECKING:
11
- from flock.core.flock import Flock
12
-
13
- logger = get_logger("api.runner")
14
-
15
-
16
- def start_flock_api(
17
- flock: "Flock",
18
- host: str = "127.0.0.1",
19
- port: int = 8344,
20
- server_name: str = "Flock API",
21
- create_ui: bool = False,
22
- custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
23
- ) -> None:
24
- """Start a REST API server for the given Flock instance."""
25
- try:
26
- # Import API class locally to avoid making it a hard dependency for core flock
27
- from flock.core.api import FlockAPI
28
- except ImportError:
29
- logger.error(
30
- "API components not found. Cannot start API. "
31
- "Ensure 'fastapi' and 'uvicorn' are installed."
32
- )
33
- return
34
-
35
- logger.info(
36
- f"Preparing to start API server for Flock '{flock.name}' on {host}:{port} {'with UI' if create_ui else 'without UI'}"
37
- )
38
- api_instance = FlockAPI(flock, custom_endpoints=custom_endpoints) # Pass the Flock instance to the API
39
- api_instance.start(
40
- host=host,
41
- port=port,
42
- server_name=server_name,
43
- create_ui=create_ui,
44
- )
flock/core/api/service.py DELETED
@@ -1,214 +0,0 @@
1
- # flock/core/api/service.py
2
- from typing import TYPE_CHECKING, Any
3
-
4
- if TYPE_CHECKING:
5
- from flock.core.api.endpoints import FlockBatchRequest
6
- from flock.core.api.run_store import RunStore
7
- from flock.core.flock import Flock
8
-
9
-
10
- from flock.core.logging.logging import get_logger
11
-
12
- logger = get_logger("flock.api")
13
-
14
- class FlockApiService:
15
- def __init__(self, flock_instance: "Flock", run_store_instance: "RunStore"):
16
- self.flock = flock_instance
17
- self.run_store = run_store_instance
18
- # You would move the _run_flock, _run_batch, _type_convert_inputs methods here
19
- # from the old FlockAPI class.
20
- async def _run_flock(
21
- self, run_id: str, agent_name: str, inputs: dict[str, Any]
22
- ):
23
- """Executes a flock workflow run (internal helper)."""
24
- try:
25
- if agent_name not in self.flock.agents:
26
- raise ValueError(f"Starting agent '{agent_name}' not found")
27
-
28
- typed_inputs = self._type_convert_inputs(agent_name, inputs)
29
-
30
- logger.debug(
31
- f"Executing flock workflow starting with '{agent_name}' (run_id: {run_id})",
32
- inputs=typed_inputs,
33
- )
34
- # Flock.run_async now handles context creation and execution
35
- result = await self.flock.run_async(
36
- start_agent=agent_name, input=typed_inputs
37
- )
38
- self.run_store.update_run_result(run_id, result)
39
-
40
- final_agent_name = (
41
- result.get("agent_name", "N/A") if isinstance(result, dict) else "N/A"
42
- ) # Handle if result is not a dict (e.g. Box)
43
- logger.info(
44
- f"Flock workflow completed (run_id: {run_id})",
45
- final_agent=final_agent_name,
46
- )
47
- except Exception as e:
48
- logger.error(
49
- f"Error in flock run {run_id} (started with '{agent_name}'): {e!s}",
50
- exc_info=True,
51
- )
52
- self.run_store.update_run_status(run_id, "failed", str(e))
53
- raise
54
-
55
- async def _run_batch(self, batch_id: str, request: "FlockBatchRequest"):
56
- """Executes a batch of runs (internal helper)."""
57
- try:
58
- if request.agent_name not in self.flock.agents:
59
- raise ValueError(f"Agent '{request.agent_name}' not found")
60
-
61
- logger.debug(
62
- f"Executing batch run starting with '{request.agent_name}' (batch_id: {batch_id})",
63
- batch_size=len(request.batch_inputs)
64
- if isinstance(request.batch_inputs, list)
65
- else "CSV/DataFrame",
66
- )
67
-
68
- # --- Re-integrating the threaded batch execution from Flock.run_batch_async ---
69
- import asyncio
70
- import threading
71
- from concurrent.futures import ThreadPoolExecutor
72
-
73
- def run_batch_sync_in_thread():
74
- loop = asyncio.new_event_loop()
75
- asyncio.set_event_loop(loop)
76
- try:
77
- batch_size = (
78
- len(request.batch_inputs)
79
- if isinstance(request.batch_inputs, list)
80
- else 0 # Or attempt to get from DataFrame/CSV load
81
- )
82
- if batch_size > 0:
83
- self.run_store.set_batch_total_items(batch_id, batch_size)
84
-
85
- class ProgressTracker:
86
- def __init__(self, store, b_id, total_size):
87
- self.store, self.batch_id, self.total_size = store, b_id, total_size
88
- self.current_count, self.partial_results, self._lock = 0, [], threading.Lock()
89
- def increment(self, res=None):
90
- with self._lock:
91
- self.current_count += 1
92
- if res is not None: self.partial_results.append(res)
93
- try: self.store.update_batch_progress(self.batch_id, self.current_count, self.partial_results)
94
- except Exception as e_prog: logger.error(f"Error updating progress: {e_prog}")
95
- return self.current_count
96
-
97
- progress_tracker = ProgressTracker(self.run_store, batch_id, batch_size)
98
-
99
- async def progress_aware_worker(index, item_inputs):
100
- try:
101
- # Call Flock's run_async for a single item
102
- item_result = await self.flock.run_async(
103
- start_agent=request.agent_name,
104
- input=item_inputs,
105
- box_result=request.box_results,
106
- )
107
- progress_tracker.increment(item_result)
108
- return item_result
109
- except Exception as item_err:
110
- logger.error(f"Error processing batch item {index}: {item_err}")
111
- progress_tracker.increment(item_err if request.return_errors else None)
112
- if request.return_errors: return item_err
113
- return None
114
-
115
- batch_inputs_list = request.batch_inputs
116
- actual_results_list = []
117
-
118
- if isinstance(batch_inputs_list, list):
119
- tasks = []
120
- for i, item_inputs in enumerate(batch_inputs_list):
121
- full_inputs = {**(request.static_inputs or {}), **item_inputs}
122
- tasks.append(progress_aware_worker(i, full_inputs))
123
-
124
- if request.parallel and request.max_workers > 1:
125
- semaphore = asyncio.Semaphore(request.max_workers)
126
- async def bounded_worker(idx, inputs_item):
127
- async with semaphore: return await progress_aware_worker(idx, inputs_item)
128
- bounded_tasks = [bounded_worker(i, {**(request.static_inputs or {}), **item}) for i, item in enumerate(batch_inputs_list)]
129
- actual_results_list = loop.run_until_complete(asyncio.gather(*bounded_tasks, return_exceptions=request.return_errors))
130
- else:
131
- for i, item_inputs in enumerate(batch_inputs_list):
132
- full_inputs = {**(request.static_inputs or {}), **item_inputs}
133
- actual_results_list.append(loop.run_until_complete(progress_aware_worker(i, full_inputs)))
134
- else: # DataFrame or CSV path - let Flock's batch processor handle this directly
135
- # This path relies on self.flock.run_batch_async being able to run within this new event loop.
136
- # It might be simpler to always convert DataFrame/CSV to list of dicts before this point.
137
- actual_results_list = loop.run_until_complete(
138
- self.flock.run_batch_async(
139
- start_agent=request.agent_name,
140
- batch_inputs=request.batch_inputs, # DataFrame or path
141
- input_mapping=request.input_mapping,
142
- static_inputs=request.static_inputs,
143
- parallel=request.parallel, # Will be re-evaluated by internal BatchProcessor
144
- max_workers=request.max_workers,
145
- use_temporal=request.use_temporal, # Will be re-evaluated
146
- box_results=request.box_results,
147
- return_errors=request.return_errors,
148
- silent_mode=True, # Internal batch runs silently for API
149
- write_to_csv=None # API handles CSV output separately if needed
150
- )
151
- )
152
- # Progress for DataFrame/CSV would need integration into BatchProcessor or this loop
153
- if actual_results_list:
154
- self.run_store.set_batch_total_items(batch_id, len(actual_results_list))
155
- self.run_store.update_batch_progress(batch_id, len(actual_results_list), actual_results_list)
156
-
157
-
158
- self.run_store.update_batch_result(batch_id, actual_results_list)
159
- logger.info(f"Batch run completed (batch_id: {batch_id})", num_results=len(actual_results_list))
160
- return actual_results_list
161
- except Exception as thread_err:
162
- logger.error(f"Error in batch run thread {batch_id}: {thread_err!s}", exc_info=True)
163
- self.run_store.update_batch_status(batch_id, "failed", str(thread_err))
164
- return None
165
- finally:
166
- loop.close()
167
- # --- End of re-integrated threaded batch execution ---
168
-
169
- # Submit the synchronous function to a thread pool from the main event loop
170
- main_loop = asyncio.get_running_loop()
171
- with ThreadPoolExecutor(thread_name_prefix="flock-api-batch") as pool:
172
- await main_loop.run_in_executor(pool, run_batch_sync_in_thread)
173
-
174
- except Exception as e:
175
- logger.error(
176
- f"Error setting up batch run {batch_id} (started with '{request.agent_name}'): {e!s}",
177
- exc_info=True,
178
- )
179
- self.run_store.update_batch_status(batch_id, "failed", str(e))
180
- raise
181
-
182
-
183
-
184
-
185
-
186
- def _type_convert_inputs(
187
- self, agent_name: str, inputs: dict[str, Any]
188
- ) -> dict[str, Any]:
189
- """Converts input values (esp. from forms) to expected Python types."""
190
- typed_inputs = {}
191
- agent_def = self.flock.agents.get(agent_name)
192
- if not agent_def or not agent_def.input or not isinstance(agent_def.input, str):
193
- return inputs # Return original if no spec or spec is not a string
194
-
195
- parsed_fields = self._parse_input_spec(agent_def.input) # Relies on the old UI helper
196
- field_types = {f["name"]: f["type"] for f in parsed_fields}
197
-
198
- for k, v in inputs.items():
199
- target_type_str = field_types.get(k)
200
- if target_type_str:
201
- if target_type_str.startswith("bool"):
202
- typed_inputs[k] = str(v).lower() in ["true", "on", "1", "yes"] if isinstance(v, str) else bool(v)
203
- elif target_type_str.startswith("int"):
204
- try: typed_inputs[k] = int(v)
205
- except (ValueError, TypeError): logger.warning(f"Could not convert '{k}' value '{v}' to int for agent '{agent_name}'"); typed_inputs[k] = v
206
- elif target_type_str.startswith("float"):
207
- try: typed_inputs[k] = float(v)
208
- except (ValueError, TypeError): logger.warning(f"Could not convert '{k}' value '{v}' to float for agent '{agent_name}'"); typed_inputs[k] = v
209
- # TODO: Add list/dict parsing (e.g., json.loads) if type_str indicates these,
210
- # especially if inputs come from HTML forms as strings.
211
- else: typed_inputs[k] = v
212
- else:
213
- typed_inputs[k] = v
214
- return typed_inputs
@@ -1,11 +0,0 @@
1
-
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class FlockAgentConfig(BaseModel):
7
- """FlockAgentConfig is a class that holds the configuration for a Flock agent.
8
- It is used to store various settings and parameters that can be accessed throughout the agent's lifecycle.
9
- """
10
-
11
- pass
@@ -1,40 +0,0 @@
1
-
2
-
3
-
4
- from pydantic import Field
5
-
6
- from flock.core.config.flock_agent_config import FlockAgentConfig
7
-
8
-
9
- class ScheduledAgentConfig(FlockAgentConfig):
10
- """Configuration specific to agents that run on a schedule."""
11
- schedule_expression: str = Field(
12
- ...,
13
- description="Defines when the agent should run. "
14
- "Examples: 'every 60m', 'every 1h', 'daily at 02:00', '0 */2 * * *' (cron expression)"
15
- )
16
- enabled: bool = Field(
17
- True,
18
- description="Whether the scheduled agent is enabled. "
19
- "If False, the agent will not run even if the schedule expression is valid."
20
- )
21
- initial_run: bool = Field(
22
- False,
23
- description="If True, the agent will run immediately after being scheduled, "
24
- "regardless of the schedule expression."
25
- )
26
- max_runs: int = Field(
27
- 0,
28
- description="Maximum number of times the agent can run. "
29
- "0 means unlimited runs. If set, the agent will stop running after reaching this limit."
30
- )
31
-
32
- def __init__(self, **kwargs):
33
- super().__init__(**kwargs)
34
- # Ensure schedule_expression is always set
35
- if 'schedule_expression' not in kwargs:
36
- raise ValueError("schedule_expression is required for ScheduledAgentConfig")
37
-
38
- # Validate initial_run and max_runs
39
- if self.initial_run and self.max_runs > 0:
40
- raise ValueError("Cannot set initial_run to True if max_runs is greater than 0")