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.
- flock/__init__.py +12 -217
- flock/agent.py +1079 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +86 -0
- flock/cli.py +147 -0
- flock/components.py +189 -0
- flock/dashboard/__init__.py +30 -0
- flock/dashboard/collector.py +559 -0
- flock/dashboard/events.py +188 -0
- flock/dashboard/graph_builder.py +563 -0
- flock/dashboard/launcher.py +235 -0
- flock/dashboard/models/graph.py +156 -0
- flock/dashboard/service.py +991 -0
- flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
- flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
- flock/dashboard/static_v2/index.html +13 -0
- flock/dashboard/websocket.py +246 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +932 -0
- flock/examples.py +131 -0
- flock/frontend/README.md +778 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4337 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +139 -0
- flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
- flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
- flock/frontend/src/components/filters/FilterPills.module.css +220 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
- flock/frontend/src/components/filters/FilterPills.tsx +143 -0
- flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
- flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
- flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
- flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
- flock/frontend/src/components/filters/TagFilter.tsx +21 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
- flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
- flock/frontend/src/components/graph/AgentNode.tsx +324 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
- flock/frontend/src/components/graph/MessageNode.tsx +129 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +420 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
- flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
- flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
- flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
- flock/frontend/src/components/modules/registerModules.ts +29 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +157 -0
- flock/frontend/src/hooks/usePersistence.ts +141 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +337 -0
- flock/frontend/src/services/graphService.test.ts +330 -0
- flock/frontend/src/services/graphService.ts +75 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +848 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +357 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.ts +650 -0
- flock/frontend/src/store/filterStore.test.ts +250 -0
- flock/frontend/src/store/filterStore.ts +272 -0
- flock/frontend/src/store/graphStore.test.ts +570 -0
- flock/frontend/src/store/graphStore.ts +462 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +75 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +122 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +47 -0
- flock/frontend/src/types/graph.ts +95 -0
- flock/frontend/src/types/modules.ts +10 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/artifacts.ts +24 -0
- flock/frontend/src/utils/mockData.ts +98 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/{core/util → helper}/cli_helper.py +9 -5
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/logging/auto_trace.py +159 -0
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -107
- flock/{core/logging → logging}/logging.py +78 -61
- flock/{core/logging → logging}/telemetry.py +66 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/logging/trace_and_logged.py +304 -0
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
- flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
- flock/mcp/manager.py +286 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +16 -58
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
- flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
- flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +12 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +3 -3
- flock/orchestrator.py +970 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +277 -0
- flock/store.py +1214 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkmatrix.toml +2 -2
- flock/themes/darkside.toml +1 -1
- flock/themes/deep.toml +2 -2
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +5 -5
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/utility/output_utility_component.py +226 -0
- flock/visibility.py +107 -0
- flock_core-0.5.0.dist-info/METADATA +964 -0
- flock_core-0.5.0.dist-info/RECORD +525 -0
- flock_core-0.5.0.dist-info/entry_points.txt +2 -0
- {flock_core-0.4.542.dist-info → flock_core-0.5.0.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/config.py +0 -56
- flock/core/__init__.py +0 -44
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -262
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -101
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/config/flock_agent_config.py +0 -11
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -214
- flock/core/context/context_manager.py +0 -40
- flock/core/context/context_vars.py +0 -11
- flock/core/evaluation/utils.py +0 -395
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -166
- flock/core/flock.py +0 -1003
- flock/core/flock_agent.py +0 -1258
- flock/core/flock_evaluator.py +0 -60
- flock/core/flock_factory.py +0 -513
- flock/core/flock_module.py +0 -207
- flock/core/flock_registry.py +0 -702
- flock/core/flock_router.py +0 -83
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/logging/live_capture.py +0 -137
- flock/core/logging/trace_and_logged.py +0 -59
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -640
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -445
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -854
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -409
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -141
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -41
- flock/evaluators/__init__.py +0 -1
- flock/evaluators/declarative/__init__.py +0 -1
- flock/evaluators/declarative/declarative_evaluator.py +0 -217
- flock/evaluators/memory/memory_evaluator.py +0 -90
- flock/evaluators/test/test_case_evaluator.py +0 -38
- flock/evaluators/zep/zep_evaluator.py +0 -59
- flock/modules/__init__.py +0 -1
- flock/modules/assertion/__init__.py +0 -1
- flock/modules/assertion/assertion_module.py +0 -286
- flock/modules/callback/__init__.py +0 -1
- flock/modules/callback/callback_module.py +0 -91
- flock/modules/enterprise_memory/README.md +0 -99
- flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
- flock/modules/mem0/__init__.py +0 -1
- flock/modules/mem0/mem0_module.py +0 -126
- flock/modules/mem0_async/__init__.py +0 -1
- flock/modules/mem0_async/async_mem0_module.py +0 -126
- flock/modules/memory/__init__.py +0 -1
- flock/modules/memory/memory_module.py +0 -429
- flock/modules/memory/memory_parser.py +0 -125
- flock/modules/memory/memory_storage.py +0 -736
- flock/modules/output/__init__.py +0 -1
- flock/modules/output/output_module.py +0 -196
- flock/modules/performance/__init__.py +0 -1
- flock/modules/performance/metrics_module.py +0 -678
- flock/modules/zep/__init__.py +0 -1
- flock/modules/zep/zep_module.py +0 -192
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/routers/__init__.py +0 -1
- flock/routers/agent/__init__.py +0 -1
- flock/routers/agent/agent_router.py +0 -236
- flock/routers/agent/handoff_agent.py +0 -58
- flock/routers/conditional/conditional_router.py +0 -486
- flock/routers/default/__init__.py +0 -1
- flock/routers/default/default_router.py +0 -80
- flock/routers/feedback/feedback_router.py +0 -114
- flock/routers/list_generator/list_generator_router.py +0 -166
- flock/routers/llm/__init__.py +0 -1
- flock/routers/llm/llm_router.py +0 -365
- flock/tools/__init__.py +0 -0
- flock/tools/azure_tools.py +0 -781
- flock/tools/code_tools.py +0 -167
- flock/tools/file_tools.py +0 -149
- flock/tools/github_tools.py +0 -157
- flock/tools/markdown_tools.py +0 -205
- flock/tools/system_tools.py +0 -9
- flock/tools/text_tools.py +0 -810
- flock/tools/web_tools.py +0 -92
- flock/tools/zendesk_tools.py +0 -501
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -237
- flock/webapp/app/api/execution.py +0 -503
- flock/webapp/app/api/flock_management.py +0 -125
- flock/webapp/app/api/registry_viewer.py +0 -29
- flock/webapp/app/chat.py +0 -662
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1086
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -345
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -597
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -811
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -219
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -281
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -389
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -127
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_live_logs.html +0 -13
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -237
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -240
- flock/workflow/flock_workflow.py +0 -225
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -60
- flock_core-0.4.542.dist-info/METADATA +0 -676
- flock_core-0.4.542.dist-info/RECORD +0 -572
- flock_core-0.4.542.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {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
|
|
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.
|
|
18
|
-
from flock.
|
|
19
|
-
from flock.
|
|
20
|
-
|
|
21
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
53
|
+
class FlockSSEClient(FlockMCPClient):
|
|
57
54
|
"""Client for SSE Servers."""
|
|
58
55
|
|
|
59
|
-
config:
|
|
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 =
|
|
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
|
|
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.
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.
|
|
19
|
-
|
|
20
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
55
|
+
class FlockStdioClient(FlockMCPClient):
|
|
57
56
|
"""Client for Stdio Servers."""
|
|
58
57
|
|
|
59
|
-
config:
|
|
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.
|
|
20
|
-
from flock.
|
|
21
|
-
from flock.
|
|
22
|
-
|
|
23
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
62
|
+
class FlockStreamableHttpClient(FlockMCPClient):
|
|
64
63
|
"""Client for StreamableHttpServers."""
|
|
65
64
|
|
|
66
|
-
config:
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|