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,345 +0,0 @@
1
- # src/flock/webapp/app/services/flock_service.py
2
- from typing import TYPE_CHECKING, Any, Optional
3
-
4
- import yaml
5
-
6
- # Conditional import for Flock and FlockFactory for type hinting
7
- if TYPE_CHECKING:
8
- from flock.core.flock import Flock
9
- from flock.core.flock_factory import FlockFactory
10
- else:
11
- Flock = "flock.core.flock.Flock"
12
- FlockFactory = "flock.core.flock_factory.FlockFactory"
13
-
14
- from flock.core.api.run_store import RunStore
15
- from flock.core.flock_registry import get_registry
16
- from flock.core.logging.logging import get_logger
17
- from flock.webapp.app.config import FLOCK_FILES_DIR
18
- from flock.webapp.app.dependencies import set_global_flock_services
19
-
20
- logger = get_logger("webapp.service")
21
-
22
-
23
- def get_available_flock_files() -> list[str]:
24
- """Returns a sorted list of available .yaml, .yml, or .flock files."""
25
- if not FLOCK_FILES_DIR.exists():
26
- return []
27
- return sorted(
28
- [
29
- f.name
30
- for f in FLOCK_FILES_DIR.iterdir()
31
- if f.is_file() and (f.suffix.lower() in [".yaml", ".yml", ".flock"])
32
- ]
33
- )
34
-
35
- def _ensure_run_store_in_app_state(app_state: object) -> RunStore: # app_state is Starlette's State
36
- """Ensures a RunStore instance exists in app_state, creating if necessary."""
37
- run_store = getattr(app_state, 'run_store', None)
38
- if not isinstance(run_store, RunStore):
39
- logger.info("RunStore not found or invalid in app_state, creating a new one for this session.")
40
- run_store = RunStore()
41
- setattr(app_state, 'run_store', run_store)
42
- return run_store
43
-
44
-
45
- def load_flock_from_file_service(filename: str, app_state: object) -> Optional["Flock"]:
46
- """Loads a Flock instance from a file.
47
- Updates app_state with the loaded flock/filename and updates DI services.
48
- """
49
- from flock.core.flock import Flock as ConcreteFlock
50
-
51
- file_path = FLOCK_FILES_DIR / filename
52
- if not file_path.exists():
53
- logger.error(f"Flock file not found: {file_path}")
54
- clear_current_flock_service(app_state)
55
- return None
56
- try:
57
- logger.info(f"Loading flock from: {file_path}")
58
- loaded_flock = ConcreteFlock.load_from_file(str(file_path))
59
-
60
- setattr(app_state, 'flock_instance', loaded_flock)
61
- setattr(app_state, 'flock_filename', filename)
62
- run_store = _ensure_run_store_in_app_state(app_state)
63
- set_global_flock_services(loaded_flock, run_store)
64
-
65
- logger.info(f"Service: Successfully loaded flock '{loaded_flock.name}' from '{filename}'. DI updated.")
66
- return loaded_flock
67
- except Exception as e:
68
- logger.error(f"Service: Error loading flock from {file_path}: {e}", exc_info=True)
69
- clear_current_flock_service(app_state)
70
- return None
71
-
72
-
73
- def create_new_flock_service(
74
- name: str, model: str | None, description: str | None, app_state: object
75
- ) -> "Flock":
76
- """Creates a new Flock instance.
77
- Updates app_state and DI services.
78
- """
79
- from flock.core.flock import Flock as ConcreteFlock
80
-
81
- effective_model = model.strip() if model and model.strip() else None
82
- new_flock = ConcreteFlock(
83
- name=name,
84
- model=effective_model,
85
- description=description,
86
- show_flock_banner=False,
87
- )
88
- default_filename = f"{name.replace(' ', '_').lower()}.flock.yaml"
89
-
90
- setattr(app_state, 'flock_instance', new_flock)
91
- setattr(app_state, 'flock_filename', default_filename)
92
- run_store = _ensure_run_store_in_app_state(app_state)
93
- set_global_flock_services(new_flock, run_store)
94
-
95
- logger.info(f"Service: Created new flock '{name}'. DI updated. Default filename: '{default_filename}'.")
96
- return new_flock
97
-
98
-
99
- def clear_current_flock_service(app_state: object):
100
- """Clears the current Flock from app_state and updates DI services.
101
- """
102
- if hasattr(app_state, 'flock_instance'):
103
- delattr(app_state, 'flock_instance')
104
- if hasattr(app_state, 'flock_filename'):
105
- delattr(app_state, 'flock_filename')
106
-
107
- run_store = _ensure_run_store_in_app_state(app_state)
108
- set_global_flock_services(None, run_store)
109
- logger.info("Service: Current flock cleared from app_state. DI updated (Flock is None).")
110
-
111
-
112
- def save_current_flock_to_file_service(new_filename: str, app_state: object) -> tuple[bool, str]:
113
- """Saves the Flock from app_state to a file. Updates app_state's current filename on success.
114
- """
115
- current_flock: Flock | None = getattr(app_state, 'flock_instance', None)
116
- if not current_flock:
117
- return False, "No flock loaded to save."
118
- if not new_filename.strip():
119
- return False, "Filename cannot be empty."
120
-
121
- save_path = FLOCK_FILES_DIR / new_filename
122
- try:
123
- current_flock.to_yaml_file(str(save_path))
124
- setattr(app_state, 'flock_filename', new_filename) # Update filename in app_state
125
- logger.info(f"Service: Flock '{current_flock.name}' saved to '{new_filename}'.")
126
- return True, f"Flock saved to '{new_filename}'."
127
- except Exception as e:
128
- logger.error(f"Service: Error saving flock '{current_flock.name}' to {save_path}: {e}", exc_info=True)
129
- return False, f"Error saving flock: {e}"
130
-
131
-
132
- def update_flock_properties_service(
133
- name: str, model: str | None, description: str | None, app_state: object
134
- ) -> bool:
135
- """Updates properties of the Flock in app_state. Updates app_state's filename if name changes.
136
- """
137
- current_flock: Flock | None = getattr(app_state, 'flock_instance', None)
138
- current_filename: str | None = getattr(app_state, 'flock_filename', None)
139
-
140
- if not current_flock:
141
- logger.warning("Service: Attempted to update properties, but no flock loaded.")
142
- return False
143
-
144
- old_name = current_flock.name
145
- old_name_default_filename = f"{old_name.replace(' ', '_').lower()}.flock.yaml"
146
-
147
- current_flock.name = name
148
- current_flock.model = model.strip() if model and model.strip() else None
149
- current_flock.description = description
150
-
151
- if current_filename == old_name_default_filename and old_name != name:
152
- new_default_filename = f"{name.replace(' ', '_').lower()}.flock.yaml"
153
- setattr(app_state, 'flock_filename', new_default_filename)
154
- logger.info(f"Service: Default filename updated to '{new_default_filename}' due to flock name change.")
155
-
156
- logger.info(f"Service: Flock properties updated for '{name}'.")
157
- return True
158
-
159
-
160
- def add_agent_to_current_flock_service(agent_config: dict, app_state: object) -> bool:
161
- """Adds an agent to the Flock in app_state."""
162
- from flock.core.flock_factory import FlockFactory as ConcreteFlockFactory
163
-
164
- current_flock: Flock | None = getattr(app_state, 'flock_instance', None)
165
- if not current_flock:
166
- logger.warning("Service: Cannot add agent, no flock loaded.")
167
- return False
168
-
169
- registry = get_registry()
170
- tools_instances = []
171
- if agent_config.get("tools_names"):
172
- for tool_name in agent_config["tools_names"]:
173
- try: tools_instances.append(registry.get_callable(tool_name))
174
- except KeyError: logger.warning(f"Service: Tool '{tool_name}' not found for agent '{agent_config['name']}'.")
175
- try:
176
- agent = ConcreteFlockFactory.create_default_agent(
177
- name=agent_config["name"],
178
- description=agent_config.get("description"),
179
- model=agent_config.get("model"),
180
- input=agent_config["input"],
181
- output=agent_config["output"],
182
- tools=tools_instances or None,
183
- )
184
- current_flock.add_agent(agent)
185
- logger.info(f"Service: Agent '{agent.name}' added to flock '{current_flock.name}'.")
186
- return True
187
- except Exception as e:
188
- logger.error(f"Service: Error adding agent to flock '{current_flock.name}': {e}", exc_info=True)
189
- return False
190
-
191
-
192
- def update_agent_in_current_flock_service(
193
- original_agent_name: str, agent_config: dict, app_state: object
194
- ) -> bool:
195
- """Updates an agent in the Flock in app_state."""
196
- current_flock: Flock | None = getattr(app_state, 'flock_instance', None)
197
- if not current_flock:
198
- logger.warning("Service: Cannot update agent, no flock loaded.")
199
- return False
200
-
201
- agent_to_update = current_flock.agents.get(original_agent_name)
202
- if not agent_to_update:
203
- logger.warning(f"Service: Agent '{original_agent_name}' not found in flock '{current_flock.name}' for update.")
204
- return False
205
-
206
- registry = get_registry()
207
- tools_instances = []
208
- if agent_config.get("tools_names"):
209
- for tool_name in agent_config["tools_names"]:
210
- try: tools_instances.append(registry.get_callable(tool_name))
211
- except KeyError: logger.warning(f"Service: Tool '{tool_name}' not found during agent update.")
212
- try:
213
- new_name = agent_config["name"]
214
- agent_to_update.description = agent_config.get("description")
215
- current_agent_model = agent_config.get("model")
216
- agent_to_update.model = current_agent_model if current_agent_model and current_agent_model.strip() else None
217
- agent_to_update.input = agent_config["input"]
218
- agent_to_update.output = agent_config["output"]
219
- agent_to_update.tools = tools_instances or []
220
-
221
- if original_agent_name != new_name:
222
- current_flock._agents.pop(original_agent_name)
223
- agent_to_update.name = new_name
224
- current_flock.add_agent(agent_to_update)
225
- logger.info(f"Service: Agent '{original_agent_name}' renamed to '{new_name}' and updated in flock '{current_flock.name}'.")
226
- else:
227
- logger.info(f"Service: Agent '{original_agent_name}' updated in flock '{current_flock.name}'.")
228
- return True
229
- except Exception as e:
230
- logger.error(f"Service: Error updating agent '{original_agent_name}' in flock '{current_flock.name}': {e}", exc_info=True)
231
- return False
232
-
233
-
234
- def remove_agent_from_current_flock_service(agent_name: str, app_state: object) -> bool:
235
- """Removes an agent from the Flock in app_state."""
236
- current_flock: Flock | None = getattr(app_state, 'flock_instance', None)
237
- if not current_flock or agent_name not in current_flock.agents:
238
- logger.warning(f"Service: Cannot remove agent '{agent_name}', no flock loaded or agent not found.")
239
- return False
240
- try:
241
- del current_flock._agents[agent_name]
242
- logger.info(f"Service: Agent '{agent_name}' removed from flock '{current_flock.name}'.")
243
- return True
244
- except Exception as e:
245
- logger.error(f"Service: Error removing agent '{agent_name}' from flock '{current_flock.name}': {e}", exc_info=True)
246
- return False
247
-
248
-
249
- async def run_current_flock_service(
250
- start_agent_name: str,
251
- inputs: dict[str, Any],
252
- app_state: Any,
253
- *,
254
- use_production_tools: bool = False,
255
- ) -> dict[str, Any]:
256
- """Runs the specified agent from the current flock instance in app_state."""
257
- logger.info(
258
- f"Attempting to run agent: {start_agent_name} using flock from app_state.",
259
- use_production_tools=use_production_tools,
260
- )
261
-
262
- current_flock: Flock | None = getattr(app_state, "flock_instance", None)
263
- run_store: RunStore | None = getattr(app_state, "run_store", None)
264
-
265
- if not current_flock:
266
- logger.error("Run service: No Flock instance available in app_state.")
267
- return {"error": "No Flock loaded in the application."}
268
- if not run_store:
269
- logger.error("Run service: No RunStore instance available in app_state.")
270
- # Attempt to initialize a default run_store if missing and this service is critical
271
- # This might indicate an issue in the application lifecycle setup
272
- logger.warning("Run service: Initializing a default RunStore as none was found in app_state.")
273
- run_store = RunStore()
274
- setattr(app_state, "run_store", run_store)
275
- # Also update global DI if this is how it's managed elsewhere for consistency,
276
- # though ideally DI setup handles this more centrally.
277
- # from flock.webapp.app.dependencies import set_global_flock_services
278
- # set_global_flock_services(current_flock, run_store)
279
-
280
-
281
- if start_agent_name not in current_flock.agents:
282
- logger.error(f"Run service: Agent '{start_agent_name}' not found in current flock '{current_flock.name}'.")
283
- return {"error": f"Agent '{start_agent_name}' not found."}
284
-
285
- try:
286
- logger.info(f"Executing agent '{start_agent_name}' from flock '{current_flock.name}' using app_state.")
287
- # Direct execution using the flock from app_state
288
- result = await current_flock.run_async(
289
- start_agent=start_agent_name,
290
- input=inputs,
291
- box_result=False,
292
- use_production_tools=use_production_tools,
293
- )
294
- # Store run details using the run_store from app_state
295
- if hasattr(run_store, "add_run_details"): # Check if RunStore has this method
296
- run_id = result.get("run_id", "unknown_run_id") # Assuming run_async result might contain run_id
297
- run_store.add_run_details(run_id=run_id, agent_name=start_agent_name, inputs=inputs, outputs=result)
298
- return result
299
- except Exception as e:
300
- logger.error(f"Run service: Error during agent execution: {e}", exc_info=True)
301
- return {"error": f"An error occurred: {e}"}
302
-
303
-
304
- def get_registered_items_service(item_type: str) -> list[dict]:
305
- """Retrieves items of a specific type from the global FlockRegistry."""
306
- registry = get_registry()
307
- items_dict: dict | None = None
308
- if item_type == "type": items_dict = registry._types
309
- elif item_type == "tool": items_dict = registry._callables
310
- elif item_type == "component": items_dict = registry._components
311
- else: return []
312
-
313
- if items_dict is None: return []
314
-
315
- items = []
316
- for name, item_obj in items_dict.items():
317
- module_path = "N/A"
318
- try: module_path = item_obj.__module__
319
- except AttributeError: pass
320
- items.append({"name": name, "module": module_path})
321
- return sorted(items, key=lambda x: x["name"])
322
-
323
-
324
- def get_flock_preview_service(filename: str) -> dict | None:
325
- """Loads basic properties of a flock file for preview."""
326
- file_path = FLOCK_FILES_DIR / filename
327
- if not file_path.exists():
328
- logger.warning(f"Service: Preview failed, file not found {file_path}")
329
- return None
330
- try:
331
- with file_path.open("r", encoding="utf-8") as f:
332
- data = yaml.safe_load(f)
333
- if isinstance(data, dict):
334
- return {
335
- "name": data.get("name", filename),
336
- "model": data.get("model"),
337
- "description": data.get("description"),
338
- "agents_count": len(data.get("agents", {})),
339
- "enable_temporal": data.get("enable_temporal", False)
340
- }
341
- logger.warning(f"Service: Preview failed, '{filename}' is not a valid Flock YAML (not a dict).")
342
- return {"name": filename, "error": "Not a valid Flock YAML structure"}
343
- except Exception as e:
344
- logger.error(f"Service: Error getting flock preview for {filename}: {e}", exc_info=True)
345
- return {"name": filename, "error": str(e)}
@@ -1,81 +0,0 @@
1
- from datetime import datetime
2
-
3
- from pydantic import BaseModel, Field
4
-
5
-
6
- class SharedLinkConfig(BaseModel):
7
- """Configuration for a shared Flock agent execution link or chat session."""
8
-
9
- share_id: str = Field(..., description="Unique identifier for the shared link.")
10
- agent_name: str = Field(..., description="The name of the agent being shared (for run) or the chat agent (for chat).")
11
- flock_definition: str = Field(..., description="The YAML/JSON string definition of the Flock the agent belongs to.")
12
- created_at: datetime = Field(
13
- default_factory=datetime.utcnow, description="Timestamp of when the link was created."
14
- )
15
- share_type: str = Field(default="agent_run", description="Type of share: 'agent_run' or 'chat'")
16
-
17
- # Chat-specific settings (only relevant if share_type is 'chat')
18
- chat_message_key: str | None = Field(None, description="Message key for chat input mapping.")
19
- chat_history_key: str | None = Field(None, description="History key for chat input mapping.")
20
- chat_response_key: str | None = Field(None, description="Response key for chat output mapping.")
21
-
22
- # Placeholder for future enhancement: pre-filled input values
23
- # input_values: Optional[Dict[str, Any]] = Field(
24
- # None, description="Optional pre-filled input values for the agent."
25
- # )
26
-
27
- model_config = {
28
- "from_attributes": True,
29
- "json_schema_extra": {
30
- "examples": [
31
- {
32
- "share_id": "abcdef123456",
33
- "agent_name": "MyChatAgent",
34
- "flock_definition": "name: MySharedFlock\nagents:\n MyChatAgent:\n input: 'message: str'\n output: 'response: str'\n # ... rest of flock YAML ...",
35
- "created_at": "2023-10-26T10:00:00Z",
36
- "share_type": "chat",
37
- "chat_message_key": "user_input",
38
- "chat_history_key": "conversation_history",
39
- "chat_response_key": "agent_output"
40
- }
41
- ]
42
- }
43
- }
44
-
45
- # -----------------------------------------------------------
46
- # Feedback model (user ratings / corrections)
47
- # -----------------------------------------------------------
48
-
49
-
50
- class FeedbackRecord(BaseModel):
51
- """A user-submitted piece of feedback for an agent run or chat turn."""
52
-
53
- feedback_id: str = Field(..., description="Unique identifier for this feedback entry.")
54
- share_id: str | None = Field(None, description="If the feedback refers to a shared link, its ID; otherwise None.")
55
- context_type: str = Field(
56
- default="agent_run",
57
- description="Where the feedback originates (agent_run | chat | other)",
58
- )
59
- reason: str = Field(..., description="User-supplied reason / comment.")
60
- expected_response: str | None = Field(
61
- None,
62
- description="Desired or corrected response in JSON or plain text.",
63
- )
64
- actual_response: str | None = Field(
65
- None,
66
- description="Original response shown to the user (optional, for context).",
67
- )
68
- created_at: datetime = Field(default_factory=datetime.utcnow)
69
- # When share_id is None store explicit target identifiers
70
- flock_name: str | None = Field(
71
- None,
72
- description="Name of the flock that produced the result when no share_id is used.",
73
- )
74
- agent_name: str | None = Field(
75
- None,
76
- description="Name of the agent or chat involved in the feedback.",
77
- )
78
- flock_definition: str | None = Field(
79
- None,
80
- description="Full YAML definition of the flock when feedback was submitted.",
81
- )