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,309 +0,0 @@
1
- # src/flock/core/util/hydrator.py (Revised - Simpler)
2
-
3
- import asyncio
4
- import json
5
- from typing import (
6
- Any,
7
- TypeVar,
8
- get_type_hints,
9
- )
10
-
11
- from pydantic import BaseModel
12
-
13
- # Import necessary Flock components
14
- from flock.core import Flock, FlockFactory
15
- from flock.core.logging.logging import get_logger
16
-
17
- # Import helper to format type hints back to strings
18
- from flock.core.serialization.serialization_utils import _format_type_to_string
19
-
20
- logger = get_logger("hydrator")
21
- T = TypeVar("T", bound=BaseModel)
22
-
23
-
24
- def flockclass(model: str = "openai/gpt-4o", agent_description: str | None = None):
25
- """Decorator to add a .hydrate() method to a Pydantic class.
26
- Leverages a dynamic Flock agent to fill missing (None) fields.
27
-
28
- Args:
29
- model: The default LLM model identifier to use for hydration.
30
- agent_description: An optional description for the dynamically created agent.
31
- """
32
-
33
- def decorator(cls: type[T]) -> type[T]:
34
- if not issubclass(cls, BaseModel):
35
- raise TypeError(
36
- "@flockclass can only decorate Pydantic BaseModel subclasses."
37
- )
38
-
39
- # Store metadata on the class
40
- setattr(cls, "__flock_model__", model)
41
- setattr(cls, "__flock_agent_description__", agent_description)
42
-
43
- # --- Attach the async hydrate method directly ---
44
- async def hydrate_async(self) -> T:
45
- """Hydrates the object by filling None fields using a dynamic Flock agent.
46
- Uses existing non-None fields as input context.
47
- Returns the hydrated object (self).
48
- """
49
- class_name = self.__class__.__name__
50
- logger.info(f"Starting hydration for instance of {class_name}")
51
-
52
- # Get field information
53
- all_fields, type_hints = _get_model_fields(self, class_name)
54
- if all_fields is None or type_hints is None:
55
- return self # Return early if field introspection failed
56
-
57
- # Identify existing and missing fields
58
- existing_data, missing_fields = _identify_fields(self, all_fields)
59
-
60
- if not missing_fields:
61
- logger.info(f"No fields to hydrate for {class_name} instance.")
62
- return self
63
-
64
- logger.debug(f"{class_name}: Fields to hydrate: {missing_fields}")
65
- logger.debug(
66
- f"{class_name}: Existing data for context: {json.dumps(existing_data, default=str)}"
67
- )
68
-
69
- # Create agent signatures
70
- input_str, output_str, input_parts = _build_agent_signatures(
71
- existing_data,
72
- missing_fields,
73
- type_hints,
74
- all_fields,
75
- class_name,
76
- )
77
-
78
- # Create and run agent
79
- result = await _run_hydration_agent(
80
- self,
81
- input_str,
82
- output_str,
83
- input_parts,
84
- existing_data,
85
- class_name,
86
- )
87
- if result is None:
88
- return self # Return early if agent run failed
89
-
90
- # Update object fields with results
91
- _update_fields_with_results(self, result, missing_fields, class_name)
92
-
93
- return self
94
-
95
- # --- Attach the sync hydrate method directly ---
96
- def hydrate(self) -> T:
97
- """Synchronous wrapper for the async hydrate method."""
98
- try:
99
- # Try to get the current running loop
100
- loop = asyncio.get_running_loop()
101
-
102
- # If we reach here, there is a running loop
103
- if loop.is_running():
104
- # This runs the coroutine in the existing loop from a different thread
105
- import concurrent.futures
106
-
107
- with concurrent.futures.ThreadPoolExecutor() as executor:
108
- future = executor.submit(asyncio.run, hydrate_async(self))
109
- return future.result()
110
- else:
111
- # There's a loop but it's not running
112
- return loop.run_until_complete(hydrate_async(self))
113
-
114
- except RuntimeError: # No running loop
115
- # If no loop is running, create a new one and run our coroutine
116
- return asyncio.run(hydrate_async(self))
117
-
118
- # Attach the methods to the class
119
- setattr(cls, "hydrate_async", hydrate_async)
120
- setattr(cls, "hydrate", hydrate)
121
- setattr(cls, "hydrate_sync", hydrate) # Alias for backward compatibility
122
-
123
- logger.debug(f"Attached hydrate methods to class {cls.__name__}")
124
- return cls
125
-
126
- return decorator
127
-
128
-
129
- def _get_model_fields(
130
- obj: BaseModel, class_name: str
131
- ) -> tuple[dict | None, dict | None]:
132
- """Extracts field information from a Pydantic model, handling v1/v2 compatibility."""
133
- try:
134
- if hasattr(obj, "model_fields"): # Pydantic v2
135
- all_fields = obj.model_fields
136
- type_hints = {name: field.annotation for name, field in all_fields.items()}
137
- else: # Pydantic v1 fallback
138
- type_hints = get_type_hints(obj.__class__)
139
- all_fields = getattr(obj, "__fields__", {name: None for name in type_hints})
140
- return all_fields, type_hints
141
- except Exception as e:
142
- logger.error(
143
- f"Could not get fields/type hints for {class_name}: {e}",
144
- exc_info=True,
145
- )
146
- return None, None
147
-
148
-
149
- def _identify_fields(
150
- obj: BaseModel, all_fields: dict
151
- ) -> tuple[dict[str, Any], list[str]]:
152
- """Identifies existing (non-None) and missing fields in the object."""
153
- existing_data: dict[str, Any] = {}
154
- missing_fields: list[str] = []
155
-
156
- for field_name in all_fields:
157
- if hasattr(obj, field_name): # Check if attribute exists
158
- value = getattr(obj, field_name)
159
- if value is not None:
160
- existing_data[field_name] = value
161
- else:
162
- missing_fields.append(field_name)
163
-
164
- return existing_data, missing_fields
165
-
166
-
167
- def _build_agent_signatures(
168
- existing_data: dict[str, Any],
169
- missing_fields: list[str],
170
- type_hints: dict,
171
- all_fields: dict,
172
- class_name: str,
173
- ) -> tuple[str, str, list]:
174
- """Builds input and output signatures for the dynamic agent."""
175
- # Input signature based on existing data
176
- input_parts = []
177
- for name in existing_data:
178
- field_type = type_hints.get(name, Any)
179
- type_str = _format_type_to_string(field_type)
180
- field_info = all_fields.get(name)
181
- field_desc = getattr(field_info, "description", "")
182
- if field_desc:
183
- input_parts.append(f"{name}: {type_str} | {field_desc}")
184
- else:
185
- input_parts.append(f"{name}: {type_str}")
186
-
187
- input_str = (
188
- ", ".join(input_parts)
189
- if input_parts
190
- else "context_info: dict | Optional context if no fields have values"
191
- )
192
-
193
- # Output signature based on missing fields
194
- output_parts = []
195
- for name in missing_fields:
196
- field_type = type_hints.get(name, Any)
197
- type_str = _format_type_to_string(field_type)
198
- field_info = all_fields.get(name)
199
- field_desc = getattr(field_info, "description", "")
200
- if field_desc:
201
- output_parts.append(f"{name}: {type_str} | {field_desc}")
202
- else:
203
- output_parts.append(f"{name}: {type_str}")
204
-
205
- output_str = ", ".join(output_parts)
206
-
207
- return input_str, output_str, input_parts
208
-
209
-
210
- async def _run_hydration_agent(
211
- obj: BaseModel,
212
- input_str: str,
213
- output_str: str,
214
- input_parts: list,
215
- existing_data: dict[str, Any],
216
- class_name: str,
217
- ) -> dict[str, Any] | None:
218
- """Creates and runs a dynamic Flock agent to hydrate the object."""
219
- # Agent configuration
220
- agent_name = f"hydrator_{class_name}_{id(obj)}"
221
- description = (
222
- getattr(obj, "__flock_agent_description__", None)
223
- or f"Agent that completes missing data for a {class_name} object."
224
- )
225
- hydration_model = getattr(obj, "__flock_model__", "openai/gpt-4o")
226
-
227
- logger.debug(f"Creating dynamic agent '{agent_name}' for {class_name}")
228
- logger.debug(f" Input Schema: {input_str}")
229
- logger.debug(f" Output Schema: {output_str}")
230
-
231
- try:
232
- # Create agent
233
- dynamic_agent = FlockFactory.create_default_agent(
234
- name=agent_name,
235
- description=description,
236
- input=input_str,
237
- output=output_str,
238
- model=hydration_model,
239
- no_output=True,
240
- use_cache=False,
241
- )
242
-
243
- # Create temporary Flock
244
- temp_flock = Flock(
245
- name=f"temp_hydrator_flock_{agent_name}",
246
- model=hydration_model,
247
- show_flock_banner=False,
248
- )
249
- temp_flock.add_agent(dynamic_agent)
250
-
251
- # Prepare input data
252
- agent_input_data = (
253
- existing_data
254
- if input_parts
255
- else {"context_info": {"object_type": class_name}}
256
- )
257
-
258
- logger.info(f"Running hydration agent '{agent_name}' for {class_name}...")
259
-
260
- # Run agent
261
- result = await temp_flock.run_async(
262
- start_agent=agent_name,
263
- input=agent_input_data,
264
- box_result=False,
265
- )
266
- logger.info(f"Hydration agent returned for {class_name}: {list(result.keys())}")
267
-
268
- return result
269
-
270
- except Exception as e:
271
- logger.error(
272
- f"Hydration agent creation or run failed for {class_name}: {e}",
273
- exc_info=True,
274
- )
275
- return None
276
-
277
-
278
- def _update_fields_with_results(
279
- obj: BaseModel,
280
- result: dict[str, Any],
281
- missing_fields: list[str],
282
- class_name: str,
283
- ) -> None:
284
- """Updates object fields with results from the hydration agent."""
285
- updated_count = 0
286
- for field_name in missing_fields:
287
- if field_name in result:
288
- try:
289
- setattr(obj, field_name, result[field_name])
290
- logger.debug(
291
- f"Hydrated field '{field_name}' in {class_name} with value: {getattr(obj, field_name)}"
292
- )
293
- updated_count += 1
294
- except Exception as e:
295
- logger.warning(
296
- f"Failed to set hydrated value for '{field_name}' in {class_name}: {e}. Value received: {result[field_name]}"
297
- )
298
- else:
299
- logger.warning(
300
- f"Hydration result missing expected field for {class_name}: '{field_name}'"
301
- )
302
-
303
- logger.info(
304
- f"Hydration complete for {class_name}. Updated {updated_count}/{len(missing_fields)} fields."
305
- )
306
-
307
-
308
- # Ensure helper functions are available
309
- # from flock.core.serialization.serialization_utils import _format_type_to_string
@@ -1,141 +0,0 @@
1
- """Utility functions for resolving input keys to their corresponding values."""
2
-
3
- from flock.core.context.context import FlockContext
4
- from flock.core.util.splitter import split_top_level
5
-
6
-
7
- def get_callable_members(obj):
8
- """Extract all callable (methods/functions) members from a module or class.
9
- Returns a list of callable objects.
10
- """
11
- import inspect
12
-
13
- # Get all members of the object
14
- members = inspect.getmembers(obj)
15
-
16
- # Filter for callable members that don't start with underscore (to exclude private/special methods)
17
- callables = [
18
- member[1]
19
- for member in members
20
- if inspect.isroutine(member[1]) and not member[0].startswith("_")
21
- ]
22
-
23
- return callables
24
-
25
-
26
- def _parse_keys(keys: list[str]) -> list[str]:
27
- """Split a comma‐separated string and strip any type annotations.
28
-
29
- For example, "a, b: list[str]" becomes ["a", "b"].
30
- """
31
- res_keys = []
32
- for key in keys:
33
- if "|" in key:
34
- key = key.split("|")[0].strip()
35
- if ":" in key:
36
- key = key.split(":")[0].strip()
37
- res_keys.append(key)
38
- return res_keys
39
-
40
-
41
- def top_level_to_keys(s: str) -> list[str]:
42
- """Convert a top-level comma-separated string to a list of keys."""
43
- top_level_split = split_top_level(s)
44
- return _parse_keys(top_level_split)
45
-
46
-
47
- def resolve_inputs(
48
- input_spec: str, context: FlockContext, previous_agent_name: str
49
- ) -> dict:
50
- """Build a dictionary of inputs based on the input specification string and the provided context.
51
-
52
- The lookup rules are:
53
- - "context" (case-insensitive): returns the entire context.
54
- - "context.property": returns an attribute from the context.
55
- - "def.agent_name": returns the agent definition for the given agent.
56
- - "agent_name": returns the most up2date record from the given agent's history.
57
- - "agent_name.property": returns the value of a property from the state variable keyed by "agent_name.property".
58
- - "property": searches the history for the most recent value of a property.
59
- - Otherwise, if no matching value is found, fallback to the FLOCK_INITIAL_INPUT.
60
-
61
- -> Recommendations:
62
- - prefix your agent variables with the agent name or a short handle to avoid conflicts.
63
- eg. agent name: "idea_agent", variable: "ia_idea" (ia = idea agent)
64
- - or set hand off mode to strict to avoid conflicts.
65
- with strict mode, the agent will only accept inputs from the previous agent.
66
-
67
- Args:
68
- input_spec: Comma-separated input keys (e.g., "query" or "agent_name.property").
69
- context: A FlockContext instance.
70
-
71
- Returns:
72
- A dictionary mapping each input key to its resolved value.
73
- """
74
- split_input = split_top_level(input_spec)
75
- keys = _parse_keys(split_input)
76
- inputs = {}
77
-
78
- def _normalize_empty_string(val):
79
- """Treat empty string inputs as None to match None semantics.
80
-
81
- This aligns behavior so passing "" behaves like passing None
82
- for agent input properties.
83
- """
84
- if isinstance(val, str) and val == "":
85
- return None
86
- return val
87
-
88
- for key in keys:
89
- split_key = key.split(".")
90
-
91
- # Case 1: A single key
92
- if len(split_key) == 1:
93
- # Special keyword: "context"
94
- if key.lower() == "context":
95
- inputs[key] = context
96
- continue
97
-
98
- # Try to get a historic record for an agent (if any)
99
- historic_records = context.get_agent_history(key)
100
- if historic_records:
101
- # You may choose to pass the entire record or just its data.
102
- inputs[key] = historic_records[0].data
103
- continue
104
-
105
- # Fallback to the most recent value in the state
106
- historic_value = context.get_most_recent_value(key)
107
- if historic_value is not None:
108
- inputs[key] = _normalize_empty_string(historic_value)
109
- continue
110
-
111
- # Fallback to the initial input
112
- var_value = context.get_variable(key)
113
- if var_value is not None:
114
- inputs[key] = _normalize_empty_string(var_value)
115
- continue
116
-
117
- inputs[key] = _normalize_empty_string(
118
- context.get_variable("flock." + key)
119
- )
120
-
121
- # Case 2: A compound key (e.g., "agent_name.property" or "context.property")
122
- elif len(split_key) == 2:
123
- entity_name, property_name = split_key
124
-
125
- if entity_name.lower() == "context":
126
- # Try to fetch the attribute from the context
127
- inputs[key] = getattr(context, property_name, None)
128
- continue
129
-
130
- if entity_name.lower() == "def":
131
- # Return the agent definition for the given property name
132
- inputs[key] = context.get_agent_definition(property_name)
133
- continue
134
-
135
- # Otherwise, attempt to look up a state variable with the key "agent_name.property"
136
- inputs[key] = _normalize_empty_string(
137
- context.get_variable(f"{entity_name}.{property_name}")
138
- )
139
- continue
140
-
141
- return inputs
flock/core/util/loader.py DELETED
@@ -1,59 +0,0 @@
1
- # src/flock/core/loader.py
2
- """Provides functionality to load Flock instances from files."""
3
-
4
- from pathlib import Path
5
- from typing import TYPE_CHECKING
6
-
7
- # Use TYPE_CHECKING to avoid runtime circular import if Flock imports this module indirectly
8
- if TYPE_CHECKING:
9
- from flock.core.flock import Flock
10
-
11
- # Import locally within the function to ensure Serializable methods are available
12
- # from .serialization.serializable import Serializable # Serializable defines the file methods
13
-
14
- # Cloudpickle check needs to be top-level
15
- try:
16
- import cloudpickle
17
-
18
- PICKLE_AVAILABLE = True
19
- except ImportError:
20
- PICKLE_AVAILABLE = False
21
-
22
-
23
- def load_flock_from_file(file_path: str) -> "Flock":
24
- """Load a Flock instance from various file formats (detects type)."""
25
- # Import Flock locally within the function to avoid circular dependency at module level
26
- from flock.core.flock import Flock
27
-
28
- p = Path(file_path)
29
- if not p.exists():
30
- raise FileNotFoundError(f"Flock file not found: {file_path}")
31
-
32
- try:
33
- if p.suffix.lower() in [".yaml", ".yml"]:
34
- return Flock.from_yaml_file(p)
35
- elif p.suffix.lower() == ".json":
36
- # Assuming from_json is available via Serializable or directly on Flock
37
- return Flock.from_json(p.read_text())
38
- elif p.suffix.lower() == ".msgpack":
39
- # Assuming from_msgpack_file is available via Serializable or directly on Flock
40
- return Flock.from_msgpack_file(p)
41
- elif p.suffix.lower() == ".pkl":
42
- if PICKLE_AVAILABLE:
43
- # Assuming from_pickle_file is available via Serializable or directly on Flock
44
- return Flock.from_pickle_file(p)
45
- else:
46
- raise RuntimeError(
47
- "Cannot load Pickle file: cloudpickle not installed."
48
- )
49
- else:
50
- raise ValueError(f"Unsupported file extension: {p.suffix}")
51
- except Exception as e:
52
- # Add specific error logging if helpful
53
- from flock.core.logging.logging import get_logger
54
-
55
- logger = get_logger("loader")
56
- logger.error(
57
- f"Error loading Flock from {file_path}: {e}", exc_info=True
58
- )
59
- raise # Re-raise the original exception