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
flock/mcp/manager.py ADDED
@@ -0,0 +1,286 @@
1
+ """MCP Client Manager for Connection Pooling and Lifecycle Management.
2
+
3
+ This module provides the FlockMCPClientManager class which manages MCP client
4
+ connections with per-(agent_id, run_id) isolation and lazy connection establishment.
5
+
6
+ Architecture Decisions:
7
+ - AD004: Per-(agent_id, run_id) Connection Isolation
8
+ Each unique (agent_id, run_id) pair gets its own set of isolated MCP connections
9
+ - AD005: Lazy Connection Establishment
10
+ Connections are only established when first requested
11
+ - AD007: Graceful Degradation on MCP Failures
12
+ Failures to connect to individual servers don't prevent agent execution
13
+ """
14
+
15
+ import asyncio
16
+ from typing import Any
17
+
18
+ from flock.logging.logging import get_logger
19
+ from flock.mcp.client import FlockMCPClient
20
+ from flock.mcp.config import FlockMCPConfiguration
21
+
22
+
23
+ logger = get_logger(__name__)
24
+
25
+
26
+ class FlockMCPClientManager:
27
+ """Manages MCP client connections with per-(agent_id, run_id) isolation.
28
+
29
+ This manager implements lazy connection pooling where clients are only
30
+ initialized when first requested. Each unique (agent_id, run_id) pair
31
+ gets its own set of isolated MCP connections.
32
+
33
+ Architecture Decision: AD004 - Per-(agent_id, run_id) Connection Isolation
34
+
35
+ Example:
36
+ ```python
37
+ # Initialize manager with configurations
38
+ configs = {
39
+ "filesystem": FlockMCPConfiguration(
40
+ name="filesystem",
41
+ connection_config=connection_config,
42
+ feature_config=feature_config
43
+ )
44
+ }
45
+ manager = FlockMCPClientManager(configs)
46
+
47
+ # Get client for specific agent and run
48
+ client = await manager.get_client("filesystem", "agent_1", "run_123")
49
+
50
+ # Get all tools for agent
51
+ tools = await manager.get_tools_for_agent(
52
+ "agent_1", "run_123", {"filesystem"}
53
+ )
54
+
55
+ # Cleanup after run completes
56
+ await manager.cleanup_run("agent_1", "run_123")
57
+ ```
58
+ """
59
+
60
+ def __init__(self, configs: dict[str, FlockMCPConfiguration]):
61
+ """Initialize the manager with MCP server configurations.
62
+
63
+ Args:
64
+ configs: Dictionary mapping server names to their configurations
65
+ """
66
+ self._configs = configs
67
+ # Pool structure: (agent_id, run_id) → server_name → FlockMCPClient
68
+ self._pool: dict[tuple[str, str], dict[str, FlockMCPClient]] = {}
69
+ self._lock = asyncio.Lock()
70
+
71
+ async def get_client(
72
+ self, server_name: str, agent_id: str, run_id: str, mount_points: list[str] | None = None
73
+ ) -> FlockMCPClient:
74
+ """Get or create an MCP client for the given context.
75
+
76
+ Architecture Decision: AD005 - Lazy Connection Establishment
77
+ Connections are only established when first requested.
78
+
79
+ Args:
80
+ server_name: Name of the MCP server
81
+ agent_id: Agent requesting the client
82
+ run_id: Current run identifier
83
+
84
+ Returns:
85
+ FlockMCPClient instance ready for use
86
+
87
+ Raises:
88
+ ValueError: If server_name not registered
89
+ """
90
+ if server_name not in self._configs:
91
+ raise ValueError(
92
+ f"MCP server '{server_name}' not registered. "
93
+ f"Available servers: {list(self._configs.keys())}"
94
+ )
95
+
96
+ key = (agent_id, run_id)
97
+
98
+ async with self._lock:
99
+ # Check if we have a client pool for this (agent, run)
100
+ if key not in self._pool:
101
+ self._pool[key] = {}
102
+
103
+ # Check if we have a client for this server
104
+ if server_name not in self._pool[key]:
105
+ logger.info(
106
+ f"Creating new MCP client for server '{server_name}' "
107
+ f"(agent={agent_id}, run={run_id})"
108
+ )
109
+ config = self._configs[server_name]
110
+ # MCP-ROOTS: Override mount points if provided
111
+ if mount_points:
112
+ from flock.mcp.types import MCPRoot
113
+
114
+ # Create MCPRoot objects from paths
115
+ roots = [
116
+ MCPRoot(uri=f"file://{path}", name=path.split("/")[-1])
117
+ for path in mount_points
118
+ ]
119
+ logger.info(
120
+ f"Setting {len(roots)} mount point(s) for server '{server_name}' "
121
+ f"(agent={agent_id}, run={run_id}): {[r.uri for r in roots]}"
122
+ )
123
+ # Clone config with new mount points
124
+ from copy import deepcopy
125
+
126
+ config = deepcopy(config)
127
+ config.connection_config.mount_points = roots
128
+
129
+ # Instantiate the correct concrete client class based on transport type
130
+ # Lazy import to avoid requiring all dependencies
131
+ transport_type = config.connection_config.transport_type
132
+ if transport_type == "stdio":
133
+ from flock.mcp.servers.stdio.flock_stdio_server import (
134
+ FlockStdioClient,
135
+ )
136
+
137
+ client = FlockStdioClient(config=config)
138
+ elif transport_type == "sse":
139
+ from flock.mcp.servers.sse.flock_sse_server import (
140
+ FlockSSEClient,
141
+ )
142
+
143
+ client = FlockSSEClient(config=config)
144
+ elif transport_type == "websocket":
145
+ from flock.mcp.servers.websockets.flock_websocket_server import (
146
+ FlockWSClient,
147
+ )
148
+
149
+ client = FlockWSClient(config=config)
150
+ elif transport_type == "streamable_http":
151
+ from flock.mcp.servers.streamable_http.flock_streamable_http_server import (
152
+ FlockStreamableHttpClient,
153
+ )
154
+
155
+ client = FlockStreamableHttpClient(config=config)
156
+ else:
157
+ raise ValueError(
158
+ f"Unsupported transport type: {transport_type}. "
159
+ f"Supported types: stdio, sse, websocket, streamable_http"
160
+ )
161
+
162
+ await client._connect()
163
+ self._pool[key][server_name] = client
164
+
165
+ return self._pool[key][server_name]
166
+
167
+ async def get_tools_for_agent(
168
+ self,
169
+ agent_id: str,
170
+ run_id: str,
171
+ server_names: set[str],
172
+ server_mounts: dict[str, list[str]] | None = None,
173
+ ) -> dict[str, Any]:
174
+ """Get all tools from specified servers for an agent.
175
+
176
+ Architecture Decision: AD003 - Tool Namespacing
177
+ All tools are returned with format: {server}__{tool}
178
+
179
+ Args:
180
+ agent_id: Agent requesting tools
181
+ run_id: Current run identifier
182
+ server_names: Set of MCP server names to fetch tools from
183
+ server_mounts: Optional dict mapping server names to mount points
184
+
185
+ Returns:
186
+ Dictionary mapping namespaced tool names to tool definitions
187
+
188
+ Note:
189
+ Architecture Decision: AD007 - Graceful Degradation
190
+ If a server fails to load, we log the error and continue with
191
+ other servers rather than failing the entire operation.
192
+ """
193
+ tools = {}
194
+ server_mounts = server_mounts or {}
195
+
196
+ for server_name in server_names:
197
+ try:
198
+ # Get mount points specific to this server
199
+ mount_points = server_mounts.get(server_name)
200
+
201
+ client = await self.get_client(
202
+ server_name, agent_id, run_id, mount_points=mount_points
203
+ )
204
+ server_tools = await client.get_tools(agent_id, run_id)
205
+
206
+ # Apply namespacing: AD003
207
+ for tool in server_tools:
208
+ namespaced_name = f"{server_name}__{tool.name}"
209
+ tools[namespaced_name] = {
210
+ "server_name": server_name,
211
+ "original_name": tool.name,
212
+ "tool": tool,
213
+ "client": client,
214
+ }
215
+
216
+ logger.debug(
217
+ f"Loaded {len(server_tools)} tools from server '{server_name}' "
218
+ f"for agent {agent_id}"
219
+ )
220
+
221
+ except Exception as e:
222
+ # Architecture Decision: AD007 - Graceful Degradation
223
+ logger.exception(
224
+ f"Failed to load tools from MCP server '{server_name}': {e}. "
225
+ f"Agent {agent_id} will continue without these tools."
226
+ )
227
+ # Continue loading other servers
228
+ continue
229
+
230
+ return tools
231
+
232
+ async def cleanup_run(self, agent_id: str, run_id: str) -> None:
233
+ """Clean up all MCP connections for a completed run.
234
+
235
+ Args:
236
+ agent_id: Agent identifier
237
+ run_id: Run identifier to clean up
238
+ """
239
+ key = (agent_id, run_id)
240
+
241
+ async with self._lock:
242
+ if key in self._pool:
243
+ logger.info(f"Cleaning up MCP connections for run {run_id}")
244
+ clients = self._pool[key]
245
+
246
+ # Disconnect all clients for this run
247
+ for server_name, client in clients.items():
248
+ try:
249
+ await client.disconnect()
250
+ logger.debug(f"Disconnected from MCP server '{server_name}'")
251
+ except Exception as e:
252
+ logger.warning(f"Error disconnecting from '{server_name}': {e}")
253
+
254
+ # Remove from pool
255
+ del self._pool[key]
256
+
257
+ async def cleanup_all(self) -> None:
258
+ """Clean up all MCP connections (orchestrator shutdown)."""
259
+ async with self._lock:
260
+ logger.info("Shutting down all MCP connections")
261
+
262
+ for _key, clients in self._pool.items():
263
+ for server_name, client in clients.items():
264
+ try:
265
+ await client.disconnect()
266
+ except Exception as e:
267
+ logger.warning(f"Error disconnecting from '{server_name}': {e}")
268
+
269
+ self._pool.clear()
270
+ logger.info("All MCP connections closed")
271
+
272
+ def list_servers(self) -> dict[str, dict[str, Any]]:
273
+ """List all registered MCP servers with their configurations.
274
+
275
+ Returns:
276
+ Dictionary mapping server names to configuration metadata
277
+ """
278
+ return {
279
+ name: {
280
+ "transport_type": config.connection_config.transport_type,
281
+ "tools_enabled": config.feature_config.tools_enabled,
282
+ "prompts_enabled": config.feature_config.prompts_enabled,
283
+ "sampling_enabled": config.feature_config.sampling_enabled,
284
+ }
285
+ for name, config in self._configs.items()
286
+ }
@@ -1 +1 @@
1
- """Default SSE Server Implementation for Flock."""
1
+ """Default SSE Server Implementation for flock."""
@@ -14,35 +14,32 @@ from mcp.shared.message import SessionMessage
14
14
  from opentelemetry import trace
15
15
  from pydantic import Field
16
16
 
17
- from flock.core.logging.logging import get_logger
18
- from flock.core.mcp.flock_mcp_server import FlockMCPServerBase
19
- from flock.core.mcp.mcp_client import FlockMCPClientBase
20
- from flock.core.mcp.mcp_client_manager import FlockMCPClientManagerBase
21
- from flock.core.mcp.mcp_config import (
22
- FlockMCPConfigurationBase,
23
- FlockMCPConnectionConfigurationBase,
17
+ from flock.logging.logging import get_logger
18
+ from flock.mcp.client import FlockMCPClient
19
+ from flock.mcp.config import (
20
+ FlockMCPConfiguration,
21
+ FlockMCPConnectionConfiguration,
24
22
  )
25
- from flock.core.mcp.types.types import SseServerParameters
23
+ from flock.mcp.types import SseServerParameters
24
+
26
25
 
27
26
  logger = get_logger("mcp.sse.server")
28
27
  tracer = trace.get_tracer(__name__)
29
28
 
30
29
 
31
- class FlockSSEConnectionConfig(FlockMCPConnectionConfigurationBase):
30
+ class FlockSSEConnectionConfig(FlockMCPConnectionConfiguration):
32
31
  """Concrete ConnectionConfig for an SSEClient."""
33
32
 
34
33
  # Only thing we need to override here is the concrete transport_type
35
34
  # and connection_parameters fields.
36
- transport_type: Literal["sse"] = Field(
37
- default="sse", description="Use the sse transport type."
38
- )
35
+ transport_type: Literal["sse"] = Field(default="sse", description="Use the sse transport type.")
39
36
 
40
37
  connection_parameters: SseServerParameters = Field(
41
38
  ..., description="SSE Server Connection Parameters."
42
39
  )
43
40
 
44
41
 
45
- class FlockSSEConfig(FlockMCPConfigurationBase):
42
+ class FlockSSEConfig(FlockMCPConfiguration):
46
43
  """Configuration for SSE Clients."""
47
44
 
48
45
  # The only thing we need to override here is the concrete
@@ -53,10 +50,10 @@ class FlockSSEConfig(FlockMCPConfigurationBase):
53
50
  )
54
51
 
55
52
 
56
- class FlockSSEClient(FlockMCPClientBase):
53
+ class FlockSSEClient(FlockMCPClient):
57
54
  """Client for SSE Servers."""
58
55
 
59
- config: FlockSSEConfig = Field(..., description="Client configuration.")
56
+ config: FlockMCPConfiguration = Field(..., description="Client configuration.")
60
57
 
61
58
  async def create_transport(
62
59
  self,
@@ -73,22 +70,14 @@ class FlockSSEClient(FlockMCPClientBase):
73
70
  param_copy = copy.deepcopy(params)
74
71
 
75
72
  if additional_params:
76
- override_headers = bool(
77
- additional_params.get("override_headers", False)
78
- )
73
+ override_headers = bool(additional_params.get("override_headers", False))
79
74
  if "headers" in additional_params:
80
75
  if override_headers:
81
- param_copy.headers = additional_params.get(
82
- "headers", params.headers
83
- )
76
+ param_copy.headers = additional_params.get("headers", params.headers)
84
77
  else:
85
- param_copy.headers.update(
86
- additional_params.get("headers", {})
87
- )
78
+ param_copy.headers.update(additional_params.get("headers", {}))
88
79
  if "read_timeout_seconds" in additional_params:
89
- param_copy.timeout = additional_params.get(
90
- "read_timeout_seconds", params.timeout
91
- )
80
+ param_copy.timeout = additional_params.get("read_timeout_seconds", params.timeout)
92
81
 
93
82
  if "sse_read_timeout" in additional_params:
94
83
  param_copy.sse_read_timeout = additional_params.get(
@@ -113,34 +102,3 @@ class FlockSSEClient(FlockMCPClientBase):
113
102
  timeout=float(param_copy.timeout),
114
103
  sse_read_timeout=float(param_copy.sse_read_timeout),
115
104
  )
116
-
117
-
118
- class FlockSSEClientManager(FlockMCPClientManagerBase):
119
- """Manager for handling SSE Clients."""
120
-
121
- client_config: FlockSSEConfig = Field(
122
- ..., description="Configuration for clients."
123
- )
124
-
125
- async def make_client(
126
- self, additional_params: dict[str, Any]
127
- ) -> FlockSSEClient:
128
- """Create a new client instance."""
129
- new_client = FlockSSEClient(
130
- config=self.client_config, additional_params=additional_params
131
- )
132
- return new_client
133
-
134
-
135
- class FlockSSEServer(FlockMCPServerBase):
136
- """Class which represents a MCP Server using the SSE Transport type."""
137
-
138
- config: FlockSSEConfig = Field(..., description="Config for the server.")
139
-
140
- async def initialize(self) -> FlockSSEClientManager:
141
- """Called when initializing the server."""
142
- client_manager = FlockSSEClientManager(
143
- client_config=self.config,
144
- )
145
-
146
- return client_manager
@@ -1 +1 @@
1
- """Default Stdio Server Implementation for Flock."""
1
+ """Default Stdio Server Implementation for flock."""
@@ -13,21 +13,20 @@ from mcp.types import JSONRPCMessage
13
13
  from opentelemetry import trace
14
14
  from pydantic import Field
15
15
 
16
- from flock.core.logging.logging import get_logger
17
- from flock.core.mcp.flock_mcp_server import FlockMCPServerBase
18
- from flock.core.mcp.mcp_client import FlockMCPClientBase
19
- from flock.core.mcp.mcp_client_manager import FlockMCPClientManagerBase
20
- from flock.core.mcp.mcp_config import (
21
- FlockMCPConfigurationBase,
22
- FlockMCPConnectionConfigurationBase,
16
+ from flock.logging.logging import get_logger
17
+ from flock.mcp.client import FlockMCPClient
18
+ from flock.mcp.config import (
19
+ FlockMCPConfiguration,
20
+ FlockMCPConnectionConfiguration,
23
21
  )
24
- from flock.core.mcp.types.types import StdioServerParameters
22
+ from flock.mcp.types import StdioServerParameters
23
+
25
24
 
26
25
  logger = get_logger("mcp.stdio.server")
27
26
  tracer = trace.get_tracer(__name__)
28
27
 
29
28
 
30
- class FlockStdioConnectionConfig(FlockMCPConnectionConfigurationBase):
29
+ class FlockStdioConnectionConfig(FlockMCPConnectionConfiguration):
31
30
  """Concrete ConnectionConfig for an StdioClient."""
32
31
 
33
32
  # Only thing we need to override here is the concrete transport_type
@@ -42,7 +41,7 @@ class FlockStdioConnectionConfig(FlockMCPConnectionConfigurationBase):
42
41
  )
43
42
 
44
43
 
45
- class FlockStdioConfig(FlockMCPConfigurationBase):
44
+ class FlockStdioConfig(FlockMCPConfiguration):
46
45
  """Configuration for Stdio Clients."""
47
46
 
48
47
  # The only thing we need to override here is the
@@ -53,10 +52,10 @@ class FlockStdioConfig(FlockMCPConfigurationBase):
53
52
  )
54
53
 
55
54
 
56
- class FlockStdioClient(FlockMCPClientBase):
55
+ class FlockStdioClient(FlockMCPClient):
57
56
  """Client for Stdio Servers."""
58
57
 
59
- config: FlockStdioConfig = Field(..., description="Client Configuration.")
58
+ config: FlockMCPConfiguration = Field(..., description="Client Configuration.")
60
59
 
61
60
  async def create_transport(
62
61
  self,
@@ -78,9 +77,7 @@ class FlockStdioClient(FlockMCPClientBase):
78
77
  if additional_params:
79
78
  # If it is present, then modify server parameters based on certain keys.
80
79
  if "command" in additional_params:
81
- param_copy.command = additional_params.get(
82
- "command", params.command
83
- )
80
+ param_copy.command = additional_params.get("command", params.command)
84
81
  if "args" in additional_params:
85
82
  param_copy.args = additional_params.get("args", params.command)
86
83
  if "env" in additional_params:
@@ -90,9 +87,7 @@ class FlockStdioClient(FlockMCPClientBase):
90
87
  param_copy.cwd = additional_params.get("cwd", params.env)
91
88
 
92
89
  if "encoding" in additional_params:
93
- param_copy.encoding = additional_params.get(
94
- "encoding", params.encoding
95
- )
90
+ param_copy.encoding = additional_params.get("encoding", params.encoding)
96
91
 
97
92
  if "encoding_error_handler" in additional_params:
98
93
  param_copy.encoding_error_handler = additional_params.get(
@@ -101,38 +96,3 @@ class FlockStdioClient(FlockMCPClientBase):
101
96
 
102
97
  # stdio_client already is an AsyncContextManager
103
98
  return stdio_client(server=param_copy)
104
-
105
-
106
- # Not really needed but kept here as an example.
107
- class FlockStdioClientManager(FlockMCPClientManagerBase):
108
- """Manager for handling Stdio Clients."""
109
-
110
- client_config: FlockStdioConfig = Field(
111
- ..., description="Configuration for clients."
112
- )
113
-
114
- async def make_client(
115
- self, additional_params: dict[str, Any] | None = None
116
- ):
117
- """Create a new client instance with any additional parameters."""
118
- new_client = FlockStdioClient(
119
- config=self.client_config,
120
- additional_params=additional_params,
121
- )
122
- return new_client
123
-
124
-
125
- class FlockMCPStdioServer(FlockMCPServerBase):
126
- """Class which represents a MCP Server using the Stdio Transport type.
127
-
128
- This means (most likely) that the server is a locally
129
- executed script.
130
- """
131
-
132
- config: FlockStdioConfig = Field(..., description="Config for the server.")
133
-
134
- async def initialize(self) -> FlockStdioClientManager:
135
- """Called when initializing the server."""
136
- client_manager = FlockStdioClientManager(client_config=self.config)
137
-
138
- return client_manager
@@ -16,25 +16,24 @@ from mcp.shared.message import SessionMessage
16
16
  from opentelemetry import trace
17
17
  from pydantic import Field
18
18
 
19
- from flock.core.logging.logging import get_logger
20
- from flock.core.mcp.flock_mcp_server import FlockMCPServerBase
21
- from flock.core.mcp.mcp_client import FlockMCPClientBase
22
- from flock.core.mcp.mcp_client_manager import FlockMCPClientManagerBase
23
- from flock.core.mcp.mcp_config import (
24
- FlockMCPConfigurationBase,
25
- FlockMCPConnectionConfigurationBase,
19
+ from flock.logging.logging import get_logger
20
+ from flock.mcp.client import FlockMCPClient
21
+ from flock.mcp.config import (
22
+ FlockMCPConfiguration,
23
+ FlockMCPConnectionConfiguration,
26
24
  )
27
- from flock.core.mcp.types.types import (
25
+ from flock.mcp.types import (
28
26
  StreamableHttpServerParameters,
29
27
  )
30
28
 
29
+
31
30
  logger = get_logger("mcp.streamable_http.server")
32
31
  tracer = trace.get_tracer(__name__)
33
32
 
34
33
  GetSessionIdCallback = Callable[[], str | None]
35
34
 
36
35
 
37
- class FlockStreamableHttpConnectionConfig(FlockMCPConnectionConfigurationBase):
36
+ class FlockStreamableHttpConnectionConfig(FlockMCPConnectionConfiguration):
38
37
  """Concrete ConnectionConfig for a StreamableHttpClient."""
39
38
 
40
39
  # Only thing we need to override here is the concrete transport_type
@@ -49,7 +48,7 @@ class FlockStreamableHttpConnectionConfig(FlockMCPConnectionConfigurationBase):
49
48
  )
50
49
 
51
50
 
52
- class FlockStreamableHttpConfig(FlockMCPConfigurationBase):
51
+ class FlockStreamableHttpConfig(FlockMCPConfiguration):
53
52
  """Configuration for Streamable HTTP Clients."""
54
53
 
55
54
  # The only thing we need to override here is the
@@ -60,51 +59,41 @@ class FlockStreamableHttpConfig(FlockMCPConfigurationBase):
60
59
  )
61
60
 
62
61
 
63
- class FlockStreamableHttpClient(FlockMCPClientBase):
62
+ class FlockStreamableHttpClient(FlockMCPClient):
64
63
  """Client for StreamableHttpServers."""
65
64
 
66
- config: FlockStreamableHttpConfig = Field(
67
- ..., description="Client configuration."
68
- )
65
+ config: FlockMCPConfiguration = Field(..., description="Client configuration.")
69
66
 
70
67
  async def create_transport(
71
68
  self,
72
69
  params: StreamableHttpServerParameters,
73
70
  additional_params: dict[str, Any] | None = None,
74
71
  ) -> AbstractAsyncContextManager[
75
- tuple[
76
- MemoryObjectReceiveStream[SessionMessage | Exception],
77
- MemoryObjectSendStream[SessionMessage],
78
- GetSessionIdCallback,
79
- ],
80
- None,
81
- ]:
72
+ tuple[
73
+ MemoryObjectReceiveStream[SessionMessage | Exception],
74
+ MemoryObjectSendStream[SessionMessage],
75
+ GetSessionIdCallback,
76
+ ],
77
+ None,
78
+ ]:
82
79
  """Return an async context manager whose __aenter__ method yields (read_stream, send_stream)."""
83
80
  param_copy = copy.deepcopy(params)
84
81
 
85
82
  if additional_params:
86
- override_headers = bool(
87
- additional_params.get("override_headers", False)
88
- )
83
+ override_headers = bool(additional_params.get("override_headers", False))
89
84
 
90
85
  if "headers" in additional_params:
91
86
  if override_headers:
92
- param_copy.headers = additional_params.get(
93
- "headers", params.headers
94
- )
87
+ param_copy.headers = additional_params.get("headers", params.headers)
95
88
  else:
96
- param_copy.headers.update(
97
- additional_params.get("headers", {})
98
- )
89
+ param_copy.headers.update(additional_params.get("headers", {}))
99
90
  if "auth" in additional_params and isinstance(
100
91
  additional_params.get("auth"), httpx.Auth
101
92
  ):
102
93
  param_copy.auth = additional_params.get("auth", param_copy.auth)
103
94
 
104
95
  if "read_timeout_seconds" in additional_params:
105
- param_copy.timeout = additional_params.get(
106
- "read_timeout_seconds", params.timeout
107
- )
96
+ param_copy.timeout = additional_params.get("read_timeout_seconds", params.timeout)
108
97
 
109
98
  if "sse_read_timeout" in additional_params:
110
99
  param_copy.sse_read_timeout = additional_params.get(
@@ -133,37 +122,3 @@ class FlockStreamableHttpClient(FlockMCPClientBase):
133
122
  terminate_on_close=param_copy.terminate_on_close,
134
123
  auth=param_copy.auth,
135
124
  )
136
-
137
-
138
- class FlockStreamableHttpClientManager(FlockMCPClientManagerBase):
139
- """Manager for handling StreamableHttpClients."""
140
-
141
- client_config: FlockStreamableHttpConfig = Field(
142
- ..., description="Configuration for clients."
143
- )
144
-
145
- async def make_client(
146
- self, additional_params: dict[str, Any] | None = None
147
- ) -> FlockStreamableHttpClient:
148
- """Create a new client instance."""
149
- new_client = FlockStreamableHttpClient(
150
- config=self.client_config,
151
- additional_params=additional_params,
152
- )
153
- return new_client
154
-
155
-
156
- class FlockStreamableHttpServer(FlockMCPServerBase):
157
- """Class which represents a MCP Server using the streamable Http Transport type."""
158
-
159
- config: FlockStreamableHttpConfig = Field(
160
- ..., description="Config for the server."
161
- )
162
-
163
- async def initialize(self) -> FlockStreamableHttpClientManager:
164
- """Called when initializing the server."""
165
- client_manager = FlockStreamableHttpClientManager(
166
- client_config=self.config
167
- )
168
-
169
- return client_manager