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
@@ -11,16 +11,13 @@ from contextlib import (
11
11
  )
12
12
  from datetime import timedelta
13
13
  from typing import (
14
+ TYPE_CHECKING,
14
15
  Any,
15
16
  )
16
17
 
17
18
  import httpx
18
19
  from anyio import ClosedResourceError
19
- from anyio.streams.memory import (
20
- MemoryObjectReceiveStream,
21
- MemoryObjectSendStream,
22
- )
23
- from cachetools import TTLCache, cached
20
+ from cachetools import TTLCache
24
21
  from mcp import (
25
22
  ClientSession,
26
23
  InitializeResult,
@@ -36,16 +33,10 @@ from pydantic import (
36
33
  Field,
37
34
  )
38
35
 
39
- from flock.core.logging.logging import get_logger
40
- from flock.core.mcp.flock_mcp_tool_base import FlockMCPToolBase
41
- from flock.core.mcp.mcp_config import FlockMCPConfigurationBase
42
- from flock.core.mcp.types.factories import (
43
- default_flock_mcp_list_roots_callback_factory,
44
- default_flock_mcp_logging_callback_factory,
45
- default_flock_mcp_message_handler_callback_factory,
46
- default_flock_mcp_sampling_callback_factory,
47
- )
48
- from flock.core.mcp.types.types import (
36
+ from flock.logging.logging import get_logger
37
+ from flock.mcp.config import FlockMCPConfiguration
38
+ from flock.mcp.tool import FlockMCPTool
39
+ from flock.mcp.types import (
49
40
  FlockListRootsMCPCallback,
50
41
  FlockLoggingMCPCallback,
51
42
  FlockMessageHandlerMCPCallback,
@@ -53,7 +44,21 @@ from flock.core.mcp.types.types import (
53
44
  MCPRoot,
54
45
  ServerParameters,
55
46
  )
56
- from flock.core.mcp.util.helpers import cache_key_generator
47
+ from flock.mcp.types.factories import (
48
+ default_flock_mcp_list_roots_callback_factory,
49
+ default_flock_mcp_logging_callback_factory,
50
+ default_flock_mcp_message_handler_callback_factory,
51
+ default_flock_mcp_sampling_callback_factory,
52
+ )
53
+ from flock.mcp.util.helpers import cache_key_generator
54
+
55
+
56
+ if TYPE_CHECKING:
57
+ from anyio.streams.memory import (
58
+ MemoryObjectReceiveStream,
59
+ MemoryObjectSendStream,
60
+ )
61
+
57
62
 
58
63
  logger = get_logger("mcp.client")
59
64
  tracer = trace.get_tracer(__name__)
@@ -61,7 +66,7 @@ tracer = trace.get_tracer(__name__)
61
66
  GetSessionIdCallback = Callable[[], str | None]
62
67
 
63
68
 
64
- class FlockMCPClientBase(BaseModel, ABC):
69
+ class FlockMCPClient(BaseModel, ABC):
65
70
  """Wrapper for mcp ClientSession.
66
71
 
67
72
  Class will attempt to re-establish connection if possible.
@@ -71,9 +76,7 @@ class FlockMCPClientBase(BaseModel, ABC):
71
76
  """
72
77
 
73
78
  # --- Properties ---
74
- config: FlockMCPConfigurationBase = Field(
75
- ..., description="The config for this client instance."
76
- )
79
+ config: FlockMCPConfiguration = Field(..., description="The config for this client instance.")
77
80
 
78
81
  tool_cache: TTLCache | None = Field(
79
82
  default=None,
@@ -150,13 +153,14 @@ class FlockMCPClientBase(BaseModel, ABC):
150
153
  class _SessionProxy:
151
154
  def __init__(self, client: Any):
152
155
  self._client = client
156
+ # Check if roots are specified in the config
157
+ if not self.current_roots and self.config.connection_config.mount_points:
158
+ self.current_roots = self.config.connection_config.mount_points
153
159
 
154
160
  def __getattr__(self, name: str):
155
161
  # return an async function that auto-reconnects, then calls through.
156
162
  async def _method(*args, **kwargs):
157
- with tracer.start_as_current_span(
158
- "session_proxy.__getattr__"
159
- ) as span:
163
+ with tracer.start_as_current_span("session_proxy.__getattr__") as span:
160
164
  client = self._client
161
165
  cfg = client.config
162
166
  max_tries = cfg.connection_config.max_retries or 1
@@ -170,18 +174,14 @@ class FlockMCPClientBase(BaseModel, ABC):
170
174
  await client._ensure_connected()
171
175
  try:
172
176
  # delegate the real session
173
- return await getattr(client.client_session, name)(
174
- *args, **kwargs
175
- )
177
+ return await getattr(client.client_session, name)(*args, **kwargs)
176
178
  except McpError as e:
177
179
  # only retry on a transport timeout
178
180
  if e.error.code == httpx.codes.REQUEST_TIMEOUT:
179
181
  kind = "timeout"
180
182
  else:
181
183
  # application-level MCP error -> give up immediately
182
- logger.error(
183
- f"MCP error in session.{name}: {e.error}"
184
- )
184
+ logger.exception(f"MCP error in session.{name}: {e.error}")
185
185
  return None
186
186
  except (BrokenPipeError, ClosedResourceError) as e:
187
187
  kind = type(e).__name__
@@ -199,9 +199,7 @@ class FlockMCPClientBase(BaseModel, ABC):
199
199
  try:
200
200
  await client.disconnect()
201
201
  except Exception as e:
202
- logger.warning(
203
- f"Error tearing down stale session: {e}"
204
- )
202
+ logger.warning(f"Error tearing down stale session: {e}")
205
203
  span.record_exception(e)
206
204
  return None
207
205
 
@@ -213,19 +211,20 @@ class FlockMCPClientBase(BaseModel, ABC):
213
211
  await client.disconnect()
214
212
  await client._connect()
215
213
  except Exception as e:
216
- logger.error(f"Reconnect failed: {e}")
214
+ logger.exception(f"Reconnect failed: {e}")
217
215
  span.record_exception(e)
218
216
 
219
217
  # Exponential backoff + 10% jitter
220
218
  delay = base_delay ** (2 ** (attempt - 1))
221
219
  delay += random.uniform(0, delay * 0.1)
222
220
  await asyncio.sleep(delay)
221
+ return None
223
222
 
224
223
  return _method
225
224
 
226
225
  def __init__(
227
226
  self,
228
- config: FlockMCPConfigurationBase,
227
+ config: FlockMCPConfiguration,
229
228
  lock: Lock | None = None,
230
229
  tool_cache: TTLCache | None = None,
231
230
  tool_result_cache: TTLCache | None = None,
@@ -262,10 +261,7 @@ class FlockMCPClientBase(BaseModel, ABC):
262
261
  )
263
262
 
264
263
  # Check if roots are specified in the config:
265
- if (
266
- not self.current_roots
267
- and self.config.connection_config.mount_points
268
- ):
264
+ if not self.current_roots and self.config.connection_config.mount_points:
269
265
  # That means that the roots are set in the config
270
266
  self.current_roots = self.config.connection_config.mount_points
271
267
 
@@ -296,55 +292,39 @@ class FlockMCPClientBase(BaseModel, ABC):
296
292
  # set up callbacks
297
293
  if not self.logging_callback:
298
294
  if not self.config.callback_config.logging_callback:
299
- self.logging_callback = (
300
- default_flock_mcp_logging_callback_factory(
301
- associated_client=self,
302
- logger=logger,
303
- )
295
+ self.logging_callback = default_flock_mcp_logging_callback_factory(
296
+ associated_client=self,
297
+ logger=logger,
304
298
  )
305
299
  else:
306
- self.logging_callback = (
307
- self.config.callback_config.logging_callback
308
- )
300
+ self.logging_callback = self.config.callback_config.logging_callback
309
301
 
310
302
  if not self.message_handler:
311
303
  if not self.config.callback_config.message_handler:
312
- self.message_handler = (
313
- default_flock_mcp_message_handler_callback_factory(
314
- associated_client=self,
315
- logger=logger,
316
- )
304
+ self.message_handler = default_flock_mcp_message_handler_callback_factory(
305
+ associated_client=self,
306
+ logger=logger,
317
307
  )
318
308
  else:
319
- self.message_handler = (
320
- self.config.callback_config.message_handler
321
- )
309
+ self.message_handler = self.config.callback_config.message_handler
322
310
 
323
311
  if not self.list_roots_callback:
324
312
  if not self.config.callback_config.list_roots_callback:
325
- self.list_roots_callback = (
326
- default_flock_mcp_list_roots_callback_factory(
327
- associated_client=self,
328
- logger=logger,
329
- )
313
+ self.list_roots_callback = default_flock_mcp_list_roots_callback_factory(
314
+ associated_client=self,
315
+ logger=logger,
330
316
  )
331
317
  else:
332
- self.list_roots_callback = (
333
- self.config.callback_config.list_roots_callback
334
- )
318
+ self.list_roots_callback = self.config.callback_config.list_roots_callback
335
319
 
336
320
  if not self.sampling_callback:
337
321
  if not self.config.callback_config.sampling_callback:
338
- self.sampling_callback = (
339
- default_flock_mcp_sampling_callback_factory(
340
- associated_client=self,
341
- logger=logger,
342
- )
322
+ self.sampling_callback = default_flock_mcp_sampling_callback_factory(
323
+ associated_client=self,
324
+ logger=logger,
343
325
  )
344
326
  else:
345
- self.sampling_callback = (
346
- self.config.callback_config.sampling_callback
347
- )
327
+ self.sampling_callback = self.config.callback_config.sampling_callback
348
328
 
349
329
  @property
350
330
  def session(self) -> _SessionProxy:
@@ -374,61 +354,69 @@ class FlockMCPClientBase(BaseModel, ABC):
374
354
  self,
375
355
  agent_id: str,
376
356
  run_id: str,
377
- ) -> list[FlockMCPToolBase]:
357
+ ) -> list[FlockMCPTool]:
378
358
  """Gets a list of available tools from the server."""
379
359
 
380
- @cached(cache=self.tool_cache, key=cache_key_generator)
381
- async def _get_tools_cached(
382
- agent_id: str,
383
- run_id: str,
384
- ) -> list[FlockMCPToolBase]:
385
- if not self.config.feature_config.tools_enabled:
386
- return []
387
-
388
- async def _get_tools_internal() -> list[FlockMCPToolBase]:
389
- # TODO: Crash
390
- response: ListToolsResult = await self.session.list_tools()
391
- flock_tools = []
392
-
393
- for tool in response.tools:
394
- converted_tool = FlockMCPToolBase.from_mcp_tool(
395
- tool,
396
- agent_id=agent_id,
397
- run_id=run_id,
398
- )
399
- if converted_tool:
400
- flock_tools.append(converted_tool)
401
- return flock_tools
402
-
403
- return await _get_tools_internal()
360
+ cache_key = cache_key_generator(agent_id, run_id)
361
+
362
+ # Check cache first
363
+ if cache_key in self.tool_cache:
364
+ return self.tool_cache[cache_key]
365
+
366
+ if not self.config.feature_config.tools_enabled:
367
+ result = []
368
+ self.tool_cache[cache_key] = result
369
+ return result
370
+
371
+ async def _get_tools_internal() -> list[FlockMCPTool]:
372
+ response: ListToolsResult = await self.session.list_tools()
373
+ flock_tools = []
374
+ tool_whitelist = self.config.feature_config.tool_whitelist
375
+
376
+ for tool in response.tools:
377
+ # Skip tools that are not whitelisted
378
+ # IF a whitelist is present
379
+ if (
380
+ tool_whitelist is not None
381
+ and isinstance(tool_whitelist, list)
382
+ and len(tool_whitelist) > 0
383
+ and tool.name not in tool_whitelist
384
+ ):
385
+ continue
386
+ converted_tool = FlockMCPTool.from_mcp_tool(
387
+ tool,
388
+ agent_id=agent_id,
389
+ run_id=run_id,
390
+ )
391
+ if converted_tool:
392
+ flock_tools.append(converted_tool)
393
+ return flock_tools
404
394
 
405
- return await _get_tools_cached(agent_id=agent_id, run_id=run_id)
395
+ result = await _get_tools_internal()
396
+ self.tool_cache[cache_key] = result
397
+ return result
406
398
 
407
399
  async def call_tool(
408
400
  self, agent_id: str, run_id: str, name: str, arguments: dict[str, Any]
409
401
  ) -> CallToolResult:
410
402
  """Call a tool via the MCP Protocol on the client's server."""
411
403
 
412
- @cached(cache=self.tool_result_cache, key=cache_key_generator)
413
- async def _call_tool_cached(
414
- agent_id: str, run_id: str, name: str, arguments: dict[str, Any]
415
- ) -> CallToolResult:
416
- async def _call_tool_internal(
417
- name: str, arguments: dict[str, Any]
418
- ) -> CallToolResult:
419
- logger.debug(
420
- f"Calling tool '{name}' with arguments {arguments}"
421
- )
422
- return await self.session.call_tool(
423
- name=name,
424
- arguments=arguments,
425
- )
404
+ cache_key = cache_key_generator(agent_id, run_id, name, arguments)
426
405
 
427
- return await _call_tool_internal(name=name, arguments=arguments)
406
+ # Check cache first
407
+ if cache_key in self.tool_result_cache:
408
+ return self.tool_result_cache[cache_key]
428
409
 
429
- return await _call_tool_cached(
430
- agent_id=agent_id, run_id=run_id, name=name, arguments=arguments
431
- )
410
+ async def _call_tool_internal(name: str, arguments: dict[str, Any]) -> CallToolResult:
411
+ logger.debug(f"Calling tool '{name}' with arguments {arguments}")
412
+ return await self.session.call_tool(
413
+ name=name,
414
+ arguments=arguments,
415
+ )
416
+
417
+ result = await _call_tool_internal(name=name, arguments=arguments)
418
+ self.tool_result_cache[cache_key] = result
419
+ return result
432
420
 
433
421
  async def get_server_name(self) -> str:
434
422
  """Return the server_name.
@@ -446,6 +434,14 @@ class FlockMCPClientBase(BaseModel, ABC):
446
434
  async with self.lock:
447
435
  return self.current_roots
448
436
 
437
+ def _get_roots_no_lock(self) -> list[MCPRoot] | None:
438
+ """Get the currently set roots without acquiring a lock.
439
+
440
+ WARNING: Only use this internally when you're sure there's no race condition.
441
+ This is primarily for use during initialization when the lock is already held.
442
+ """
443
+ return self.current_roots
444
+
449
445
  async def set_roots(self, new_roots: list[MCPRoot]) -> None:
450
446
  """Set the current roots of the client.
451
447
 
@@ -465,33 +461,23 @@ class FlockMCPClientBase(BaseModel, ABC):
465
461
  async with self.lock:
466
462
  if self.tool_cache:
467
463
  self.tool_cache.clear()
468
- logger.debug(
469
- f"Invalidated tool_cache for server '{self.config.name}'"
470
- )
464
+ logger.debug(f"Invalidated tool_cache for server '{self.config.name}'")
471
465
 
472
466
  async def invalidate_resource_list_cache(self) -> None:
473
467
  """Invalidate the entries in the resource list cache."""
474
- logger.debug(
475
- f"Invalidating resource_list_cache for server '{self.config.name}'"
476
- )
468
+ logger.debug(f"Invalidating resource_list_cache for server '{self.config.name}'")
477
469
  async with self.lock:
478
470
  if self.resource_list_cache:
479
471
  self.resource_list_cache.clear()
480
- logger.debug(
481
- f"Invalidated resource_list_cache for server '{self.config.name}'"
482
- )
472
+ logger.debug(f"Invalidated resource_list_cache for server '{self.config.name}'")
483
473
 
484
474
  async def invalidate_resource_contents_cache(self) -> None:
485
475
  """Invalidate the entries in the resource contents cache."""
486
- logger.debug(
487
- f"Invalidating resource_contents_cache for server '{self.config.name}'."
488
- )
476
+ logger.debug(f"Invalidating resource_contents_cache for server '{self.config.name}'.")
489
477
  async with self.lock:
490
478
  if self.resource_contents_cache:
491
479
  self.resource_contents_cache.clear()
492
- logger.debug(
493
- f"Invalidated resource_contents_cache for server '{self.config.name}'"
494
- )
480
+ logger.debug(f"Invalidated resource_contents_cache for server '{self.config.name}'")
495
481
 
496
482
  async def invalidate_resource_contents_cache_entry(self, key: str) -> None:
497
483
  """Invalidate a single entry in the resource contents cache."""
@@ -531,8 +517,7 @@ class FlockMCPClientBase(BaseModel, ABC):
531
517
  await cm.__aexit__(None, None, None)
532
518
  except Exception as e:
533
519
  logger.debug(
534
- f"Suppressed transport-ctx exit error "
535
- f"for server '{self.config.name}': {e!r}"
520
+ f"Suppressed transport-ctx exit error for server '{self.config.name}': {e!r}"
536
521
  )
537
522
 
538
523
  async def _create_session(self) -> None:
@@ -548,42 +533,29 @@ class FlockMCPClientBase(BaseModel, ABC):
548
533
  server_params = self.config.connection_config.connection_parameters
549
534
 
550
535
  # Single Hook
551
- transport_ctx = await self.create_transport(
552
- server_params, self.additional_params
553
- )
536
+ transport_ctx = await self.create_transport(server_params, self.additional_params)
554
537
  safe_transport = self._safe_transport_ctx(transport_ctx)
555
538
  result = await stack.enter_async_context(safe_transport)
556
539
 
557
540
  # support old (read, write) or new (read, write, get_sesssion_id_callback)
558
541
  read: MemoryObjectReceiveStream | None = None
559
542
  write: MemoryObjectSendStream | None = None
560
- get_session_id_callback: GetSessionIdCallback | None = None
561
543
  if isinstance(result, tuple) and len(result) == 2:
562
544
  # old type
563
545
  read, write = result
564
- get_session_id_callback = None
565
546
  elif isinstance(result, tuple) and len(result) == 3:
566
547
  # new type
567
- read, write, get_session_id_callback = result
548
+ read, write, _get_session_id_callback = result
568
549
  else:
569
- raise RuntimeError(
570
- f"create_transport returned unexpected tuple of {result}"
571
- )
550
+ raise RuntimeError(f"create_transport returned unexpected tuple of {result}")
572
551
 
573
552
  if read is None or write is None:
574
- raise RuntimeError(
575
- f"create_transport did not create any read or write streams."
576
- )
553
+ raise RuntimeError("create_transport did not create any read or write streams.")
577
554
 
578
555
  read_timeout = self.config.connection_config.read_timeout_seconds
579
556
 
580
- if (
581
- self.additional_params
582
- and "read_timeout_seconds" in self.additional_params
583
- ):
584
- read_timeout = self.additional_params.get(
585
- "read_timeout_seconds", read_timeout
586
- )
557
+ if self.additional_params and "read_timeout_seconds" in self.additional_params:
558
+ read_timeout = self.additional_params.get("read_timeout_seconds", read_timeout)
587
559
 
588
560
  timeout_seconds = (
589
561
  read_timeout
@@ -622,11 +594,10 @@ class FlockMCPClientBase(BaseModel, ABC):
622
594
  )
623
595
  return self.client_session
624
596
 
625
- else:
626
- logger.debug(
627
- f"Client Session for Server '{self.config.name}' does not exist yet. Connecting..."
628
- )
629
- await self._create_session()
597
+ logger.debug(
598
+ f"Client Session for Server '{self.config.name}' does not exist yet. Connecting..."
599
+ )
600
+ await self._create_session()
630
601
 
631
602
  if not self.connected_server_capabilities:
632
603
  # This means we never asked the server to initialize the connection.
@@ -636,9 +607,7 @@ class FlockMCPClientBase(BaseModel, ABC):
636
607
  async def _perform_initial_handshake(self) -> None:
637
608
  """Tell the server who we are, what capabilities we have, and what roots we're interested in."""
638
609
  # 1) do the LSP-style initialize handshake
639
- logger.debug(
640
- f"Performing intialize handshake with server '{self.config.name}'"
641
- )
610
+ logger.debug(f"Performing intialize handshake with server '{self.config.name}'")
642
611
  init: InitializeResult = await self.client_session.initialize()
643
612
 
644
613
  self.connected_server_capabilities = init
@@ -650,6 +619,10 @@ class FlockMCPClientBase(BaseModel, ABC):
650
619
  # 2) if we already know our current roots, notify the server
651
620
  # so that it will follow up with a ListRootsRequest
652
621
  if self.current_roots and self.config.feature_config.roots_enabled:
622
+ logger.debug(
623
+ f"Notifying server '{self.config.name}' of {len(self.current_roots)} root(s): "
624
+ f"{[r.uri for r in self.current_roots]}"
625
+ )
653
626
  await self.client_session.send_roots_list_changed()
654
627
 
655
628
  # 3) Tell the server, what logging level we would like to use