flock-core 0.4.542__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.542.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.542.dist-info/METADATA +0 -676
  496. flock_core-0.4.542.dist-info/RECORD +0 -572
  497. flock_core-0.4.542.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.542.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
@@ -1,503 +0,0 @@
1
- # src/flock/webapp/app/api/execution.py
2
- import html
3
- import json
4
- from pathlib import Path
5
- from typing import TYPE_CHECKING, Any, Literal
6
-
7
- import markdown2 # Import markdown2
8
- from fastapi import ( # Ensure Form and HTTPException are imported
9
- APIRouter,
10
- Depends,
11
- Form,
12
- Request,
13
- )
14
- from fastapi.encoders import jsonable_encoder
15
- from fastapi.responses import FileResponse, HTMLResponse
16
- from fastapi.templating import Jinja2Templates
17
- from werkzeug.utils import secure_filename
18
-
19
- from flock.webapp.app.services.feedback_file_service import (
20
- create_csv_feedback_file,
21
- create_csv_feedback_file_for_agent,
22
- create_xlsx_feedback_file,
23
- create_xlsx_feedback_file_for_agent,
24
- )
25
-
26
- if TYPE_CHECKING:
27
- from flock.core.flock import Flock
28
-
29
-
30
- from flock.core.logging.logging import (
31
- get_logger as get_flock_logger, # For logging within the new endpoint
32
- )
33
- from flock.core.util.splitter import parse_schema
34
-
35
- # Import the dependency to get the current Flock instance
36
- from flock.webapp.app.dependencies import (
37
- get_flock_instance,
38
- get_optional_flock_instance,
39
- get_shared_link_store,
40
- )
41
-
42
- # Service function now takes app_state
43
- from flock.webapp.app.services.flock_service import (
44
- run_current_flock_service,
45
- # get_current_flock_instance IS NO LONGER IMPORTED
46
- )
47
- from flock.webapp.app.services.sharing_store import SharedLinkStoreInterface
48
-
49
- router = APIRouter()
50
- BASE_DIR = Path(__file__).resolve().parent.parent.parent
51
- templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
52
-
53
-
54
- # Add markdown2 filter to Jinja2 environment for this router
55
- def markdown_filter(text):
56
- return markdown2.markdown(text, extras=["tables", "fenced-code-blocks"])
57
-
58
-
59
- templates.env.filters["markdown"] = markdown_filter
60
-
61
-
62
- @router.get("/htmx/execution-form-content", response_class=HTMLResponse)
63
- async def htmx_get_execution_form_content(
64
- request: Request,
65
- current_flock: "Flock | None" = Depends(
66
- get_optional_flock_instance
67
- ), # Use optional if form can show 'no flock'
68
- ):
69
- # flock instance is injected
70
- return templates.TemplateResponse(request, "partials/_execution_form.html",
71
- {
72
- "request": request,
73
- "flock": current_flock, # Pass the injected flock instance
74
- "input_fields": [],
75
- "selected_agent_name": None, # Form starts with no agent selected
76
- },
77
- )
78
-
79
-
80
- @router.get("/htmx/agents/{agent_name}/input-form", response_class=HTMLResponse)
81
- async def htmx_get_agent_input_form(
82
- request: Request,
83
- agent_name: str,
84
- current_flock: "Flock" = Depends(
85
- get_flock_instance
86
- ), # Expect flock to be loaded
87
- ):
88
- # flock instance is injected
89
- agent = current_flock.agents.get(agent_name)
90
- if not agent:
91
- return HTMLResponse(
92
- f"<p class='error'>Agent '{agent_name}' not found in the current Flock.</p>"
93
- )
94
-
95
- input_fields = []
96
- if agent.input and isinstance(agent.input, str):
97
- try:
98
- parsed_spec = parse_schema(agent.input)
99
- for name, type_str, description in parsed_spec:
100
- field_info = {
101
- "name": name,
102
- "type": type_str.lower(),
103
- "description": description or "",
104
- }
105
- if "bool" in field_info["type"]:
106
- field_info["html_type"] = "checkbox"
107
- elif (
108
- "int" in field_info["type"] or "float" in field_info["type"]
109
- ):
110
- field_info["html_type"] = "number"
111
- elif (
112
- "list" in field_info["type"] or "dict" in field_info["type"]
113
- ):
114
- field_info["html_type"] = "textarea"
115
- field_info["placeholder"] = (
116
- f"Enter JSON for {field_info['type']}"
117
- )
118
- else:
119
- field_info["html_type"] = "text"
120
- input_fields.append(field_info)
121
- except Exception as e:
122
- return HTMLResponse(
123
- f"<p class='error'>Error parsing input signature for {agent_name}: {e}</p>"
124
- )
125
- return templates.TemplateResponse(request, "partials/_dynamic_input_form_content.html",
126
- {"request": request, "input_fields": input_fields},
127
- )
128
-
129
-
130
- @router.post("/htmx/run", response_class=HTMLResponse)
131
- async def htmx_run_flock(
132
- request: Request,
133
- ):
134
- current_flock_from_state: Flock | None = getattr(
135
- request.app.state, "flock_instance", None
136
- )
137
- logger = get_flock_logger("webapp.execution.regular_run")
138
-
139
- if not current_flock_from_state:
140
- logger.error("HTMX Run (Regular): No Flock loaded in app_state.")
141
- return HTMLResponse("<p class='error'>No Flock loaded to run.</p>")
142
-
143
- form_data = await request.form()
144
- start_agent_name = form_data.get("start_agent_name")
145
- use_production_flag = str(
146
- form_data.get("use_production_tools", "")
147
- ).lower() in {"true", "on", "1"}
148
-
149
- if not start_agent_name:
150
- logger.warning("HTMX Run (Regular): Starting agent not selected.")
151
- return HTMLResponse("<p class='error'>Starting agent not selected.</p>")
152
-
153
- agent = current_flock_from_state.agents.get(start_agent_name)
154
- if not agent:
155
- logger.error(
156
- f"HTMX Run (Regular): Agent '{start_agent_name}' not found in Flock '{current_flock_from_state.name}'."
157
- )
158
- return HTMLResponse(
159
- f"<p class='error'>Agent '{start_agent_name}' not found in the current Flock.</p>"
160
- )
161
-
162
- inputs = {}
163
- if agent.input and isinstance(agent.input, str):
164
- try:
165
- parsed_spec = parse_schema(agent.input)
166
- for name, type_str, _ in parsed_spec:
167
- form_field_name = f"agent_input_{name}"
168
- raw_value = form_data.get(form_field_name)
169
- if raw_value is None and "bool" in type_str.lower():
170
- inputs[name] = False
171
- continue
172
- if raw_value is None:
173
- inputs[name] = None
174
- continue
175
- if "int" in type_str.lower():
176
- inputs[name] = int(raw_value)
177
- elif "float" in type_str.lower():
178
- inputs[name] = float(raw_value)
179
- elif "bool" in type_str.lower():
180
- inputs[name] = raw_value.lower() in [
181
- "true",
182
- "on",
183
- "1",
184
- "yes",
185
- ]
186
- elif "list" in type_str.lower() or "dict" in type_str.lower():
187
- inputs[name] = json.loads(raw_value)
188
- else:
189
- inputs[name] = raw_value
190
- except ValueError as ve:
191
- logger.error(
192
- f"HTMX Run (Regular): Input parsing error for agent '{start_agent_name}': {ve}",
193
- exc_info=True,
194
- )
195
- return HTMLResponse(
196
- "<p class='error'>Invalid input format. Please check your input and try again.</p>"
197
- )
198
- except Exception as e_parse:
199
- logger.error(
200
- f"HTMX Run (Regular): Error processing inputs for '{start_agent_name}': {e_parse}",
201
- exc_info=True,
202
- )
203
- return HTMLResponse(
204
- f"<p class='error'>Error processing inputs for {html.escape(str(start_agent_name))}: {html.escape(str(e_parse))}</p>"
205
- )
206
-
207
- result_data = await run_current_flock_service(
208
- start_agent_name,
209
- inputs,
210
- request.app.state,
211
- use_production_tools=use_production_flag,
212
- )
213
-
214
- raw_json_for_template = json.dumps(
215
- jsonable_encoder(
216
- result_data
217
- ), # ← converts every nested BaseModel, datetime, etc.
218
- indent=2,
219
- ensure_ascii=False,
220
- )
221
- # Unescape newlines for proper display in HTML <pre> tag
222
- result_data_raw_json_str = raw_json_for_template.replace("\\n", "\n")
223
- root_path = request.scope.get("root_path", "")
224
- return templates.TemplateResponse(request, "partials/_results_display.html",
225
- {
226
- "request": request,
227
- "result": result_data,
228
- "result_raw_json": result_data_raw_json_str,
229
- "feedback_endpoint": f"{root_path}/ui/api/flock/htmx/feedback",
230
- "share_id": None,
231
- "flock_name": current_flock_from_state.name,
232
- "agent_name": start_agent_name,
233
- "flock_definition": current_flock_from_state.to_yaml(),
234
- },
235
- )
236
-
237
-
238
- # --- NEW ENDPOINT FOR SHARED RUNS ---
239
- @router.post("/htmx/run-shared", response_class=HTMLResponse)
240
- async def htmx_run_shared_flock(
241
- request: Request,
242
- share_id: str = Form(...),
243
- ):
244
- shared_logger = get_flock_logger("webapp.execution.shared_run_stateful")
245
- form_data = await request.form()
246
- start_agent_name = form_data.get("start_agent_name")
247
-
248
- if not start_agent_name:
249
- shared_logger.warning("HTMX Run Shared: Starting agent not selected.")
250
- return HTMLResponse(
251
- "<p class='error'>Starting agent not selected for shared run.</p>"
252
- )
253
-
254
- inputs: dict[str, Any] = {}
255
- try:
256
- shared_flocks_store = getattr(request.app.state, "shared_flocks", {})
257
- temp_flock = shared_flocks_store.get(share_id)
258
-
259
- if not temp_flock:
260
- shared_logger.error(
261
- f"HTMX Run Shared: Flock instance for share_id '{share_id}' not found in app.state."
262
- )
263
- return HTMLResponse(
264
- f"<p class='error'>Shared session not found or expired. Please try accessing the shared link again.</p>"
265
- )
266
-
267
- shared_logger.info(
268
- f"HTMX Run Shared: Successfully retrieved pre-loaded Flock '{temp_flock.name}' for agent '{start_agent_name}' (share_id: {share_id})."
269
- )
270
-
271
- agent = temp_flock.agents.get(start_agent_name)
272
- if not agent:
273
- shared_logger.error(
274
- f"HTMX Run Shared: Agent '{start_agent_name}' not found in shared Flock '{temp_flock.name}'."
275
- )
276
- return HTMLResponse(
277
- f"<p class='error'>Agent '{start_agent_name}' not found in the provided shared Flock definition.</p>"
278
- )
279
-
280
- if agent.input and isinstance(agent.input, str):
281
- parsed_spec = parse_schema(agent.input)
282
- for name, type_str, _ in parsed_spec:
283
- form_field_name = f"agent_input_{name}"
284
- raw_value = form_data.get(form_field_name)
285
- if raw_value is None and "bool" in type_str.lower():
286
- inputs[name] = False
287
- continue
288
- if raw_value is None:
289
- inputs[name] = None
290
- continue
291
- if "int" in type_str.lower():
292
- inputs[name] = int(raw_value)
293
- elif "float" in type_str.lower():
294
- inputs[name] = float(raw_value)
295
- elif "bool" in type_str.lower():
296
- inputs[name] = raw_value.lower() in [
297
- "true",
298
- "on",
299
- "1",
300
- "yes",
301
- ]
302
- elif "list" in type_str.lower() or "dict" in type_str.lower():
303
- inputs[name] = json.loads(raw_value)
304
- else:
305
- inputs[name] = raw_value
306
-
307
- shared_logger.info(
308
- f"HTMX Run Shared: Executing agent '{start_agent_name}' in pre-loaded Flock '{temp_flock.name}'. Inputs: {list(inputs.keys())}"
309
- )
310
- result_data = await temp_flock.run_async(
311
- start_agent=start_agent_name, input=inputs, box_result=False
312
- )
313
- raw_json_for_template = json.dumps(
314
- jsonable_encoder(
315
- result_data
316
- ), # ← converts every nested BaseModel, datetime, etc.
317
- indent=2,
318
- ensure_ascii=False,
319
- )
320
- # Unescape newlines for proper display in HTML <pre> tag
321
- result_data_raw_json_str = raw_json_for_template.replace("\\n", "\n")
322
- shared_logger.info(
323
- f"HTMX Run Shared: Agent '{start_agent_name}' executed. Result keys: {list(result_data.keys()) if isinstance(result_data, dict) else 'N/A'}"
324
- )
325
-
326
- except ValueError as ve:
327
- shared_logger.error(
328
- f"HTMX Run Shared: Input parsing error for '{start_agent_name}' (share_id: {share_id}): {ve}",
329
- exc_info=True,
330
- )
331
- return HTMLResponse(
332
- f"<p class='error'>Invalid input format: {ve!s}</p>"
333
- )
334
- except Exception as e:
335
- shared_logger.error(
336
- f"HTMX Run Shared: Error during execution for '{start_agent_name}' (share_id: {share_id}): {e}",
337
- exc_info=True,
338
- )
339
- return HTMLResponse(
340
- f"<p class='error'>An unexpected error occurred: {e!s}</p>"
341
- )
342
- root_path = request.scope.get("root_path", "")
343
-
344
- return templates.TemplateResponse(request, "partials/_results_display.html",
345
- {
346
- "request": request,
347
- "result": result_data,
348
- "result_raw_json": result_data_raw_json_str,
349
- "feedback_endpoint": f"{root_path}/ui/api/flock/htmx/feedback-shared",
350
- "share_id": share_id,
351
- "flock_name": temp_flock.name,
352
- "agent_name": start_agent_name,
353
- "flock_definition": temp_flock.to_yaml(),
354
- },
355
- )
356
-
357
-
358
- # --- Feedback endpoints ---
359
- @router.post("/htmx/feedback", response_class=HTMLResponse)
360
- async def htmx_submit_feedback(
361
- request: Request,
362
- reason: str = Form(...),
363
- expected_response: str | None = Form(None),
364
- actual_response: str | None = Form(None),
365
- flock_name: str | None = Form(None),
366
- agent_name: str | None = Form(None),
367
- flock_definition: str | None = Form(None),
368
- store: SharedLinkStoreInterface = Depends(get_shared_link_store),
369
- ):
370
- from uuid import uuid4
371
-
372
- from flock.webapp.app.services.sharing_models import FeedbackRecord
373
-
374
- record = FeedbackRecord(
375
- feedback_id=uuid4().hex,
376
- share_id=None,
377
- context_type="agent_run",
378
- reason=reason,
379
- expected_response=expected_response,
380
- actual_response=actual_response,
381
- flock_name=flock_name,
382
- agent_name=agent_name,
383
- flock_definition=flock_definition,
384
- )
385
- await store.save_feedback(record)
386
- return HTMLResponse("<p>🙏 Feedback received – thank you!</p>")
387
-
388
-
389
- @router.post("/htmx/feedback-shared", response_class=HTMLResponse)
390
- async def htmx_submit_feedback_shared(
391
- request: Request,
392
- share_id: str = Form(...),
393
- reason: str = Form(...),
394
- expected_response: str | None = Form(None),
395
- actual_response: str | None = Form(None),
396
- flock_definition: str | None = Form(None),
397
- flock_name: str | None = Form(None),
398
- agent_name: str | None = Form(None),
399
- store: SharedLinkStoreInterface = Depends(get_shared_link_store),
400
- ):
401
- from uuid import uuid4
402
-
403
- from flock.webapp.app.services.sharing_models import FeedbackRecord
404
-
405
- record = FeedbackRecord(
406
- feedback_id=uuid4().hex,
407
- share_id=share_id,
408
- context_type="agent_run",
409
- reason=reason,
410
- expected_response=expected_response,
411
- actual_response=actual_response,
412
- flock_definition=flock_definition,
413
- agent_name=agent_name,
414
- flock_name=flock_name,
415
- )
416
- await store.save_feedback(record)
417
- return HTMLResponse(
418
- "<p>🙏 Feedback received for shared run – thank you!</p>"
419
- )
420
-
421
-
422
- @router.get("/htmx/feedback-download/{format}", response_class=FileResponse)
423
- async def chat_feedback_download_all(
424
- request: Request,
425
- format: Literal["csv", "xlsx"] = "csv",
426
- store: SharedLinkStoreInterface = Depends(get_shared_link_store),
427
- ):
428
- """Download all feedback records for all agents in the current flock as a CSV file.
429
-
430
- This function iterates through all agents in the currently loaded flock and collects
431
- all feedback records for each agent, then exports them as a single CSV file.
432
-
433
- Args:
434
- request: The FastAPI request object
435
- store: The shared link store interface dependency
436
-
437
- Returns:
438
- FileResponse: CSV/XLSX file containing all feedback records for all agents
439
-
440
- Raises:
441
- HTTPException: If no flock is loaded or no agents are found in the flock
442
- """
443
- safe_format = secure_filename(format)
444
- if safe_format == "csv":
445
- return await create_csv_feedback_file(
446
- request=request,
447
- store=store,
448
- separator=","
449
- )
450
- elif safe_format == "xlsx":
451
- return await create_xlsx_feedback_file(
452
- request=request,
453
- store=store,
454
- )
455
- else:
456
- from fastapi import HTTPException
457
-
458
- raise HTTPException(
459
- status_code=400,
460
- detail="Invalid file-format specified. Valid formats are: 'csv', 'xlsx'"
461
- )
462
-
463
-
464
- @router.get("/htmx/feedback-download/{agent_name}/{format}", response_class=FileResponse)
465
- async def chat_feedback_download(
466
- request: Request,
467
- agent_name: str,
468
- format: Literal["csv", "xlsx"] = "csv",
469
- store: SharedLinkStoreInterface = Depends(get_shared_link_store),
470
- ):
471
- """Download all feedback records for a specific agent as a file.
472
-
473
- Args:
474
- request: The FastAPI request object
475
- agent_name: Name of the agent to download feedback for
476
- store: The shared link store interface dependency
477
- format: Either 'csv' or 'xlsx' the file format to use
478
-
479
- Returns:
480
- FileResponse: CSV/XLSX file containing all feedback records for the specified agent
481
- """
482
- safe_format = secure_filename(format)
483
- safe_agent_name = secure_filename(agent_name)
484
- if safe_format == "csv":
485
- return await create_csv_feedback_file_for_agent(
486
- request=request,
487
- store=store,
488
- separator=",",
489
- agent_name=safe_agent_name,
490
- )
491
- elif safe_format == "xlsx":
492
- return await create_xlsx_feedback_file_for_agent(
493
- request=request,
494
- store=store,
495
- agent_name=safe_agent_name,
496
- )
497
- else:
498
- from fastapi import HTTPException
499
-
500
- raise HTTPException(
501
- status_code=400,
502
- detail="Invalid file-format specified. Valid formats are: 'csv', 'xlsx'"
503
- )
@@ -1,125 +0,0 @@
1
- # src/flock/webapp/app/api/flock_management.py
2
- from pathlib import Path
3
- from typing import TYPE_CHECKING
4
-
5
- from fastapi import APIRouter, Depends, Form, Request # Added Depends
6
- from fastapi.responses import HTMLResponse
7
- from fastapi.templating import Jinja2Templates
8
-
9
- if TYPE_CHECKING:
10
- from flock.core.flock import Flock
11
-
12
- # Import the dependency to get the current Flock instance
13
- from flock.webapp.app.dependencies import (
14
- get_flock_instance,
15
- )
16
-
17
- # Service functions now take app_state
18
- from flock.webapp.app.services.flock_service import (
19
- save_current_flock_to_file_service,
20
- update_flock_properties_service,
21
- # get_current_flock_filename IS NO LONGER IMPORTED
22
- # get_current_flock_instance IS NO LONGER IMPORTED
23
- )
24
-
25
- router = APIRouter()
26
- BASE_DIR = Path(__file__).resolve().parent.parent.parent
27
- templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
28
-
29
-
30
- @router.get("/htmx/flock-properties-form", response_class=HTMLResponse)
31
- async def htmx_get_flock_properties_form(
32
- request: Request,
33
- update_message: str = None,
34
- success: bool = None,
35
- current_flock: "Flock" = Depends(get_flock_instance) # Expect flock to be loaded for this form
36
- ):
37
- # current_flock is now injected by FastAPI
38
- # Get the filename from app.state, as it's managed there
39
- current_filename: str | None = getattr(request.app.state, 'flock_filename', None)
40
-
41
- if not current_flock: # Should be caught by Depends if get_flock_instance raises error
42
- return HTMLResponse(
43
- "<div class='error'>Error: No flock loaded. Please load or create one first.</div>"
44
- )
45
- return templates.TemplateResponse(request, "partials/_flock_properties_form.html",
46
- {
47
- "request": request,
48
- "flock": current_flock,
49
- "current_filename": current_filename,
50
- "update_message": update_message,
51
- "success": success,
52
- },
53
- )
54
-
55
-
56
- @router.post("/htmx/flock-properties", response_class=HTMLResponse)
57
- async def htmx_update_flock_properties(
58
- request: Request,
59
- flock_name: str = Form(...),
60
- default_model: str = Form(...),
61
- description: str = Form(""),
62
- # current_flock: Flock = Depends(get_flock_instance) # Service will use app_state
63
- ):
64
- # Pass request.app.state to the service function
65
- success_update = update_flock_properties_service(
66
- flock_name, default_model, description, request.app.state
67
- )
68
-
69
- # Retrieve updated flock and filename from app.state for rendering the form
70
- updated_flock: Flock | None = getattr(request.app.state, 'flock_instance', None)
71
- updated_filename: str | None = getattr(request.app.state, 'flock_filename', None)
72
-
73
- return templates.TemplateResponse(request, "partials/_flock_properties_form.html",
74
- {
75
- "request": request,
76
- "flock": updated_flock,
77
- "current_filename": updated_filename,
78
- "update_message": "Flock properties updated!"
79
- if success_update
80
- else "Failed to update properties. Check logs.",
81
- "success": success_update,
82
- },
83
- )
84
-
85
-
86
- @router.post("/htmx/save-flock", response_class=HTMLResponse)
87
- async def htmx_save_flock(
88
- request: Request,
89
- save_filename: str = Form(...),
90
- # current_flock: Flock = Depends(get_flock_instance) # Service will use app_state
91
- ):
92
- current_flock_from_state: Flock | None = getattr(request.app.state, 'flock_instance', None)
93
- current_filename_from_state: str | None = getattr(request.app.state, 'flock_filename', None)
94
-
95
- if not save_filename.strip():
96
- return templates.TemplateResponse(request, "partials/_flock_properties_form.html",
97
- {
98
- "request": request,
99
- "flock": current_flock_from_state,
100
- "current_filename": current_filename_from_state,
101
- "save_message": "Filename cannot be empty.",
102
- "success": False,
103
- },
104
- )
105
-
106
- if not (save_filename.endswith(".yaml") or save_filename.endswith(".yml") or save_filename.endswith(".flock")):
107
- save_filename += ".flock.yaml"
108
-
109
- # Pass request.app.state to the service function
110
- success, message = save_current_flock_to_file_service(save_filename, request.app.state)
111
-
112
- # Retrieve potentially updated flock and filename from app.state
113
- saved_flock: Flock | None = getattr(request.app.state, 'flock_instance', None)
114
- saved_filename: str | None = getattr(request.app.state, 'flock_filename', None)
115
-
116
-
117
- return templates.TemplateResponse(request, "partials/_flock_properties_form.html",
118
- {
119
- "request": request,
120
- "flock": saved_flock, # Use the instance from app_state
121
- "current_filename": saved_filename, # Use the filename from app_state (updated on successful save)
122
- "save_message": message,
123
- "success": success,
124
- },
125
- )
@@ -1,29 +0,0 @@
1
- from pathlib import Path
2
-
3
- from fastapi import APIRouter, Request
4
- from fastapi.responses import HTMLResponse
5
- from fastapi.templating import Jinja2Templates
6
-
7
- from flock.webapp.app.services.flock_service import get_registered_items_service
8
-
9
- router = APIRouter()
10
- BASE_DIR = Path(__file__).resolve().parent.parent.parent
11
- templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
12
-
13
-
14
- @router.get("/htmx/{item_type}/table", response_class=HTMLResponse)
15
- async def htmx_get_registry_table(request: Request, item_type: str):
16
- valid_item_types = ["type", "tool", "component"]
17
- if item_type not in valid_item_types:
18
- return HTMLResponse(
19
- "<p class='error'>Invalid item type requested.</p>", status_code=400
20
- )
21
-
22
- items = get_registered_items_service(item_type)
23
- return templates.TemplateResponse(request, "partials/_registry_table.html",
24
- {
25
- "request": request,
26
- "item_type_display": item_type.capitalize() + "s",
27
- "items": items,
28
- },
29
- )