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
|
@@ -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
|
|
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.
|
|
40
|
-
from flock.
|
|
41
|
-
from flock.
|
|
42
|
-
from flock.
|
|
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.
|
|
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
|
|
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:
|
|
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.
|
|
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:
|
|
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
|
-
|
|
301
|
-
|
|
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
|
-
|
|
314
|
-
|
|
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
|
-
|
|
327
|
-
|
|
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
|
-
|
|
340
|
-
|
|
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[
|
|
357
|
+
) -> list[FlockMCPTool]:
|
|
378
358
|
"""Gets a list of available tools from the server."""
|
|
379
359
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
406
|
+
# Check cache first
|
|
407
|
+
if cache_key in self.tool_result_cache:
|
|
408
|
+
return self.tool_result_cache[cache_key]
|
|
428
409
|
|
|
429
|
-
|
|
430
|
-
|
|
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,
|
|
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
|
-
|
|
626
|
-
|
|
627
|
-
|
|
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
|