flock-core 0.4.543__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.543.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.543.dist-info/METADATA +0 -676
- flock_core-0.4.543.dist-info/RECORD +0 -572
- flock_core-0.4.543.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.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
|
@@ -13,22 +13,21 @@ from mcp.shared.message import SessionMessage
|
|
|
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 WebsocketServerParameters
|
|
23
|
+
|
|
25
24
|
|
|
26
25
|
logger = get_logger("mcp.ws.server")
|
|
27
26
|
tracer = trace.get_tracer(__name__)
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
# Optional to provide type hints.
|
|
31
|
-
class FlockWSConnectionConfig(
|
|
30
|
+
class FlockWSConnectionConfig(FlockMCPConnectionConfiguration):
|
|
32
31
|
"""Concrete ConnectionConfig for a WS Client."""
|
|
33
32
|
|
|
34
33
|
# Only thing we need to override here is the concrete transport_type
|
|
@@ -44,7 +43,7 @@ class FlockWSConnectionConfig(FlockMCPConnectionConfigurationBase):
|
|
|
44
43
|
|
|
45
44
|
|
|
46
45
|
# Optional to provide type hints.
|
|
47
|
-
class FlockWSConfig(
|
|
46
|
+
class FlockWSConfig(FlockMCPConfiguration):
|
|
48
47
|
"""Configuration for Websocket clients."""
|
|
49
48
|
|
|
50
49
|
# The only thing we need to override here is the concrete
|
|
@@ -56,10 +55,10 @@ class FlockWSConfig(FlockMCPConfigurationBase):
|
|
|
56
55
|
)
|
|
57
56
|
|
|
58
57
|
|
|
59
|
-
class FlockWSClient(
|
|
58
|
+
class FlockWSClient(FlockMCPClient):
|
|
60
59
|
"""Client for Websocket servers."""
|
|
61
60
|
|
|
62
|
-
config:
|
|
61
|
+
config: FlockMCPConfiguration = Field(..., description="Client Configuration")
|
|
63
62
|
|
|
64
63
|
# This one we HAVE to specify. This tells Flock
|
|
65
64
|
# how to create the underlying connection.
|
|
@@ -84,36 +83,4 @@ class FlockWSClient(FlockMCPClientBase):
|
|
|
84
83
|
# If present, then apply the changes in "url" to the create_transport logic.
|
|
85
84
|
param_copy.url = additional_params.get("url", params.url)
|
|
86
85
|
|
|
87
|
-
return websocket_client(
|
|
88
|
-
url=param_copy.url
|
|
89
|
-
) # return the async context manager
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
# not really needed, but kept for type hints and as an example.
|
|
93
|
-
class FlockWSClientManager(FlockMCPClientManagerBase):
|
|
94
|
-
"""Manager for handling websocket clients."""
|
|
95
|
-
|
|
96
|
-
client_config: FlockWSConfig = Field(
|
|
97
|
-
..., description="Configuration for clients."
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
async def make_client(self, additional_params=None):
|
|
101
|
-
"""Create a new client instance."""
|
|
102
|
-
new_client = FlockWSClient(
|
|
103
|
-
config=self.client_config,
|
|
104
|
-
additional_params=additional_params,
|
|
105
|
-
)
|
|
106
|
-
return new_client
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class FlockWSServer(FlockMCPServerBase):
|
|
110
|
-
"""Class which represents an MCP Server using the websocket transport type."""
|
|
111
|
-
|
|
112
|
-
config: FlockWSConfig = Field(..., description="Config for the server.")
|
|
113
|
-
|
|
114
|
-
# Specify the concrete type for the server.
|
|
115
|
-
async def initialize(self) -> FlockWSClientManager:
|
|
116
|
-
"""Called when initializing the server."""
|
|
117
|
-
client_manager = FlockWSClientManager(client_config=self.config)
|
|
118
|
-
|
|
119
|
-
return client_manager
|
|
86
|
+
return websocket_client(url=param_copy.url) # return the async context manager
|
|
@@ -3,17 +3,20 @@
|
|
|
3
3
|
from typing import Any, TypeVar
|
|
4
4
|
|
|
5
5
|
from dspy import Tool as DSPyTool
|
|
6
|
+
from dspy.adapters.types.tool import convert_input_schema_to_tool_args
|
|
6
7
|
from mcp import Tool
|
|
7
8
|
from mcp.types import CallToolResult, TextContent, ToolAnnotations
|
|
8
9
|
from opentelemetry import trace
|
|
9
10
|
from pydantic import BaseModel, Field
|
|
11
|
+
from typing_extensions import Self
|
|
12
|
+
|
|
13
|
+
from flock.logging.logging import get_logger
|
|
10
14
|
|
|
11
|
-
from flock.core.logging.logging import get_logger
|
|
12
15
|
|
|
13
16
|
logger = get_logger("mcp.tool")
|
|
14
17
|
tracer = trace.get_tracer(__name__)
|
|
15
18
|
|
|
16
|
-
T = TypeVar("T", bound="
|
|
19
|
+
T = TypeVar("T", bound="FlockMCPTool")
|
|
17
20
|
|
|
18
21
|
TYPE_MAPPING = {
|
|
19
22
|
"string": str,
|
|
@@ -25,22 +28,16 @@ TYPE_MAPPING = {
|
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
class
|
|
31
|
+
class FlockMCPTool(BaseModel):
|
|
29
32
|
"""Base Class for MCP Tools for Flock."""
|
|
30
33
|
|
|
31
34
|
name: str = Field(..., description="Name of the tool")
|
|
32
35
|
|
|
33
|
-
agent_id: str = Field(
|
|
34
|
-
..., description="Associated agent_id. Used for internal tracking."
|
|
35
|
-
)
|
|
36
|
+
agent_id: str = Field(..., description="Associated agent_id. Used for internal tracking.")
|
|
36
37
|
|
|
37
|
-
run_id: str = Field(
|
|
38
|
-
..., description="Associated run_id. Used for internal tracking."
|
|
39
|
-
)
|
|
38
|
+
run_id: str = Field(..., description="Associated run_id. Used for internal tracking.")
|
|
40
39
|
|
|
41
|
-
description: str | None = Field(
|
|
42
|
-
..., description="A human-readable description of the tool"
|
|
43
|
-
)
|
|
40
|
+
description: str | None = Field(..., description="A human-readable description of the tool")
|
|
44
41
|
|
|
45
42
|
input_schema: dict[str, Any] = Field(
|
|
46
43
|
...,
|
|
@@ -52,9 +49,7 @@ class FlockMCPToolBase(BaseModel):
|
|
|
52
49
|
)
|
|
53
50
|
|
|
54
51
|
@classmethod
|
|
55
|
-
def from_mcp_tool(
|
|
56
|
-
cls: type[T], tool: Tool, agent_id: str, run_id: str
|
|
57
|
-
) -> T:
|
|
52
|
+
def from_mcp_tool(cls, tool: Tool, agent_id: str, run_id: str) -> Self:
|
|
58
53
|
"""Convert MCP Tool to Flock Tool."""
|
|
59
54
|
return cls(
|
|
60
55
|
name=tool.name,
|
|
@@ -66,7 +61,7 @@ class FlockMCPToolBase(BaseModel):
|
|
|
66
61
|
)
|
|
67
62
|
|
|
68
63
|
@classmethod
|
|
69
|
-
def to_mcp_tool(cls
|
|
64
|
+
def to_mcp_tool(cls, instance: Self) -> Tool | None:
|
|
70
65
|
"""Convert a flock mcp tool into a mcp tool."""
|
|
71
66
|
return Tool(
|
|
72
67
|
name=instance.name,
|
|
@@ -75,63 +70,18 @@ class FlockMCPToolBase(BaseModel):
|
|
|
75
70
|
annotations=instance.annotations,
|
|
76
71
|
)
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
"""Recursively resolve json model schema, expanding all references."""
|
|
80
|
-
if "$defs" not in schema and "definitions" not in schema:
|
|
81
|
-
return schema
|
|
82
|
-
|
|
83
|
-
def resolve_refs(obj: Any) -> Any:
|
|
84
|
-
if not isinstance(obj, dict[list, list]):
|
|
85
|
-
return obj
|
|
86
|
-
if isinstance(obj, dict) and "$ref" in obj:
|
|
87
|
-
# ref_path = obj["$ref"].split("/")[-1]
|
|
88
|
-
return {resolve_refs(v) for k, v in obj.items()}
|
|
89
|
-
|
|
90
|
-
return [resolve_refs(item) for item in obj]
|
|
91
|
-
|
|
92
|
-
resolved_schema = resolve_refs(schema)
|
|
93
|
-
|
|
94
|
-
resolved_schema.pop("$defs", None)
|
|
95
|
-
return resolved_schema
|
|
96
|
-
|
|
73
|
+
# Use DSPy's converter for JSON Schema → Tool args to stay aligned with DSPy.
|
|
97
74
|
def _convert_input_schema_to_tool_args(
|
|
98
75
|
self, input_schema: dict[str, Any]
|
|
99
|
-
) -> tuple[dict[str, Any], dict[str,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
args, arg_types, arg_desc = {}, {}, {}
|
|
109
|
-
properties = input_schema.get("properties")
|
|
110
|
-
if properties is None:
|
|
111
|
-
return args, arg_types, arg_desc
|
|
112
|
-
|
|
113
|
-
required = input_schema.get("required", [])
|
|
114
|
-
|
|
115
|
-
defs = input_schema.get("$defs", {})
|
|
116
|
-
|
|
117
|
-
for name, prop in properties.items():
|
|
118
|
-
if len(defs) > 0:
|
|
119
|
-
prop = self.resolve_json_schema_reference(
|
|
120
|
-
{"$defs": defs, **prop}
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
args[name] = prop
|
|
124
|
-
|
|
125
|
-
arg_types[name] = TYPE_MAPPING.get(prop.get("type"), Any)
|
|
126
|
-
arg_desc[name] = prop.get("description", "No description provided")
|
|
127
|
-
if name in required:
|
|
128
|
-
arg_desc[name] += " (Required)"
|
|
129
|
-
|
|
130
|
-
return args, arg_types, arg_desc
|
|
131
|
-
|
|
132
|
-
def _convert_mcp_tool_result(
|
|
133
|
-
self, call_tool_result: CallToolResult
|
|
134
|
-
) -> str | list[Any]:
|
|
76
|
+
) -> tuple[dict[str, Any], dict[str, Any], dict[str, str]]:
|
|
77
|
+
try:
|
|
78
|
+
return convert_input_schema_to_tool_args(input_schema)
|
|
79
|
+
except Exception as e: # pragma: no cover - defensive
|
|
80
|
+
logger.exception("Failed to convert MCP tool schema to DSPy tool args: %s", e)
|
|
81
|
+
# Fallback to empty definitions to avoid breaking execution
|
|
82
|
+
return {}, {}, {}
|
|
83
|
+
|
|
84
|
+
def _convert_mcp_tool_result(self, call_tool_result: CallToolResult) -> str | list[Any]:
|
|
135
85
|
text_contents: list[TextContent] = []
|
|
136
86
|
non_text_contents = []
|
|
137
87
|
|
|
@@ -158,9 +108,7 @@ class FlockMCPToolBase(BaseModel):
|
|
|
158
108
|
|
|
159
109
|
def as_dspy_tool(self, server: Any) -> DSPyTool:
|
|
160
110
|
"""Wrap this tool as a DSPyTool for downstream."""
|
|
161
|
-
args, arg_type, args_desc = self._convert_input_schema_to_tool_args(
|
|
162
|
-
self.input_schema
|
|
163
|
-
)
|
|
111
|
+
args, arg_type, args_desc = self._convert_input_schema_to_tool_args(self.input_schema)
|
|
164
112
|
|
|
165
113
|
async def func(*args, **kwargs):
|
|
166
114
|
with tracer.start_as_current_span(f"tool.{self.name}.call") as span:
|
|
@@ -172,9 +120,7 @@ class FlockMCPToolBase(BaseModel):
|
|
|
172
120
|
logger.debug(
|
|
173
121
|
f"Tool: {self.name}: got client for server '{server_name}' for agent {self.agent_id} on run {self.run_id}"
|
|
174
122
|
)
|
|
175
|
-
logger.debug(
|
|
176
|
-
f"Tool: {self.name}: calling server '{server_name}'"
|
|
177
|
-
)
|
|
123
|
+
logger.debug(f"Tool: {self.name}: calling server '{server_name}'")
|
|
178
124
|
result = await server.call_tool(
|
|
179
125
|
agent_id=self.agent_id,
|
|
180
126
|
run_id=self.run_id,
|
|
@@ -186,7 +132,7 @@ class FlockMCPToolBase(BaseModel):
|
|
|
186
132
|
)
|
|
187
133
|
return self._convert_mcp_tool_result(result)
|
|
188
134
|
except Exception as e:
|
|
189
|
-
logger.
|
|
135
|
+
logger.exception(
|
|
190
136
|
f"Tool: Exception ocurred when calling tool '{self.name}': {e}"
|
|
191
137
|
)
|
|
192
138
|
span.record_exception(e)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""MCP Type Definitions for Flock-Flow."""
|
|
2
|
+
|
|
3
|
+
from flock.mcp.types.factories import (
|
|
4
|
+
default_flock_mcp_list_roots_callback_factory,
|
|
5
|
+
default_flock_mcp_logging_callback_factory,
|
|
6
|
+
default_flock_mcp_message_handler_callback_factory,
|
|
7
|
+
default_flock_mcp_sampling_callback_factory,
|
|
8
|
+
)
|
|
9
|
+
from flock.mcp.types.types import (
|
|
10
|
+
FlockListRootsMCPCallback,
|
|
11
|
+
FlockLoggingMCPCallback,
|
|
12
|
+
FlockLoggingMessageNotificationParams,
|
|
13
|
+
FlockMessageHandlerMCPCallback,
|
|
14
|
+
FlockSamplingMCPCallback,
|
|
15
|
+
MCPRoot,
|
|
16
|
+
ServerNotification,
|
|
17
|
+
ServerParameters,
|
|
18
|
+
SseServerParameters,
|
|
19
|
+
StdioServerParameters,
|
|
20
|
+
StreamableHttpServerParameters,
|
|
21
|
+
WebsocketServerParameters,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"FlockListRootsMCPCallback",
|
|
27
|
+
"FlockLoggingMCPCallback",
|
|
28
|
+
"FlockLoggingMessageNotificationParams",
|
|
29
|
+
"FlockMessageHandlerMCPCallback",
|
|
30
|
+
"FlockSamplingMCPCallback",
|
|
31
|
+
"MCPRoot",
|
|
32
|
+
"ServerNotification",
|
|
33
|
+
"ServerParameters",
|
|
34
|
+
"SseServerParameters",
|
|
35
|
+
"StdioServerParameters",
|
|
36
|
+
"StreamableHttpServerParameters",
|
|
37
|
+
"WebsocketServerParameters",
|
|
38
|
+
"default_flock_mcp_list_roots_callback_factory",
|
|
39
|
+
"default_flock_mcp_logging_callback_factory",
|
|
40
|
+
"default_flock_mcp_message_handler_callback_factory",
|
|
41
|
+
"default_flock_mcp_sampling_callback_factory",
|
|
42
|
+
]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""MCP Callbacks."""
|
|
2
2
|
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
3
5
|
from mcp.shared.context import RequestContext
|
|
4
6
|
from mcp.shared.session import RequestResponder
|
|
5
7
|
from mcp.types import (
|
|
@@ -13,9 +15,8 @@ from mcp.types import (
|
|
|
13
15
|
ServerRequest,
|
|
14
16
|
)
|
|
15
17
|
|
|
16
|
-
from flock.
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.core.mcp.types.handlers import (
|
|
18
|
+
from flock.logging.logging import FlockLogger
|
|
19
|
+
from flock.mcp.types.handlers import (
|
|
19
20
|
handle_incoming_exception,
|
|
20
21
|
handle_incoming_request,
|
|
21
22
|
handle_incoming_server_notification,
|
|
@@ -27,14 +28,12 @@ async def default_sampling_callback(
|
|
|
27
28
|
ctx: RequestContext, params: CreateMessageRequestParams, logger: FlockLogger
|
|
28
29
|
) -> ErrorData:
|
|
29
30
|
"""Default Callback for Sampling."""
|
|
30
|
-
logger.info(
|
|
31
|
+
logger.info("Rejecting Sampling Request.")
|
|
31
32
|
return ErrorData(code=INVALID_REQUEST, message="Sampling not supported.")
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
async def default_message_handler(
|
|
35
|
-
req: RequestResponder[ServerRequest, ClientResult]
|
|
36
|
-
| ServerNotification
|
|
37
|
-
| Exception,
|
|
36
|
+
req: RequestResponder[ServerRequest, ClientResult] | ServerNotification | Exception,
|
|
38
37
|
logger: FlockLogger,
|
|
39
38
|
associated_client: Any,
|
|
40
39
|
) -> None:
|
|
@@ -65,12 +64,12 @@ async def default_list_roots_callback(
|
|
|
65
64
|
) -> ListRootsResult | ErrorData:
|
|
66
65
|
"""Default List Roots Callback."""
|
|
67
66
|
if associated_client.config.feature_config.roots_enabled:
|
|
68
|
-
|
|
67
|
+
# Use lock-free version to avoid deadlock during initialization
|
|
68
|
+
# when the lock is already held by _connect()
|
|
69
|
+
current_roots = associated_client._get_roots_no_lock()
|
|
70
|
+
logger.debug(f"Server requested list/roots. Sending: {current_roots}")
|
|
69
71
|
return ListRootsResult(roots=current_roots)
|
|
70
|
-
|
|
71
|
-
return ErrorData(
|
|
72
|
-
code=INVALID_REQUEST, message="List roots not supported."
|
|
73
|
-
)
|
|
72
|
+
return ErrorData(code=INVALID_REQUEST, message="List roots not supported.")
|
|
74
73
|
|
|
75
74
|
|
|
76
75
|
async def default_logging_callback(
|
|
@@ -79,6 +78,4 @@ async def default_logging_callback(
|
|
|
79
78
|
server_name: str,
|
|
80
79
|
) -> None:
|
|
81
80
|
"""Default Logging Handling Callback."""
|
|
82
|
-
await handle_logging_message(
|
|
83
|
-
params=params, logger=logger, server_name=server_name
|
|
84
|
-
)
|
|
81
|
+
await handle_logging_message(params=params, logger=logger, server_name=server_name)
|
|
@@ -7,14 +7,14 @@ from mcp.types import (
|
|
|
7
7
|
CreateMessageRequestParams,
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
-
from flock.
|
|
11
|
-
from flock.
|
|
10
|
+
from flock.logging.logging import FlockLogger, get_logger
|
|
11
|
+
from flock.mcp.types.callbacks import (
|
|
12
12
|
default_list_roots_callback,
|
|
13
13
|
default_logging_callback,
|
|
14
14
|
default_message_handler,
|
|
15
15
|
default_sampling_callback,
|
|
16
16
|
)
|
|
17
|
-
from flock.
|
|
17
|
+
from flock.mcp.types.types import (
|
|
18
18
|
FlockListRootsMCPCallback,
|
|
19
19
|
FlockLoggingMCPCallback,
|
|
20
20
|
FlockLoggingMessageNotificationParams,
|
|
@@ -23,6 +23,7 @@ from flock.core.mcp.types.types import (
|
|
|
23
23
|
ServerNotification,
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
+
|
|
26
27
|
default_logging_callback_logger = get_logger("mcp.callback.logging")
|
|
27
28
|
default_sampling_callback_logger = get_logger("mcp.callback.sampling")
|
|
28
29
|
default_list_roots_callback_logger = get_logger("mcp.callback.roots")
|
|
@@ -45,6 +46,8 @@ def default_flock_mcp_logging_callback_factory(
|
|
|
45
46
|
server_name=associated_client.config.name,
|
|
46
47
|
)
|
|
47
48
|
|
|
49
|
+
return _method
|
|
50
|
+
|
|
48
51
|
|
|
49
52
|
def default_flock_mcp_sampling_callback_factory(
|
|
50
53
|
associated_client: Any,
|
|
@@ -60,9 +63,7 @@ def default_flock_mcp_sampling_callback_factory(
|
|
|
60
63
|
logger_to_use.info(
|
|
61
64
|
f"SAMPLING_REQUEST: server '{associated_client.config.name}' sent a sampling request: {params}"
|
|
62
65
|
)
|
|
63
|
-
await default_sampling_callback(
|
|
64
|
-
ctx=ctx, params=params, logger=logger_to_use
|
|
65
|
-
)
|
|
66
|
+
await default_sampling_callback(ctx=ctx, params=params, logger=logger_to_use)
|
|
66
67
|
|
|
67
68
|
return _method
|
|
68
69
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Handler functions."""
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
from mcp import CreateMessageRequest
|
|
6
6
|
from mcp.client.session import ClientResponse
|
|
@@ -22,8 +22,7 @@ from mcp.types import (
|
|
|
22
22
|
ToolListChangedNotification,
|
|
23
23
|
)
|
|
24
24
|
|
|
25
|
-
from flock.
|
|
26
|
-
from flock.core.mcp.mcp_client import Any
|
|
25
|
+
from flock.logging.logging import FlockLogger
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
async def handle_incoming_exception(
|
|
@@ -50,7 +49,7 @@ async def handle_progress_notification(
|
|
|
50
49
|
progress = params.progress
|
|
51
50
|
total = params.total or "Unknown"
|
|
52
51
|
progress_token = params.progressToken
|
|
53
|
-
metadata = params.meta or {}
|
|
52
|
+
metadata: dict[str, Any] = params.meta or {} # type: ignore[assignment]
|
|
54
53
|
|
|
55
54
|
message = f"PROGRESS_NOTIFICATION: Server '{server_name}' reports Progress: {progress}/{total}. (Token: {progress_token}) (Meta Data: {metadata})"
|
|
56
55
|
|
|
@@ -66,7 +65,7 @@ async def handle_cancellation_notification(
|
|
|
66
65
|
params = n.params
|
|
67
66
|
request_id_to_cancel = params.requestId
|
|
68
67
|
reason = params.reason or "no reason given"
|
|
69
|
-
metadata = params.meta or {}
|
|
68
|
+
metadata: dict[str, Any] = params.meta or {} # type: ignore[assignment]
|
|
70
69
|
|
|
71
70
|
message = f"CANCELLATION_REQUEST: Server '{server_name}' requests to cancel request with id: {request_id_to_cancel}. Reason: {reason}. (Metadata: {metadata})"
|
|
72
71
|
|
|
@@ -83,7 +82,7 @@ async def handle_resource_update_notification(
|
|
|
83
82
|
# its resource_contents_cache
|
|
84
83
|
|
|
85
84
|
params = n.params
|
|
86
|
-
metadata = params.meta or {}
|
|
85
|
+
metadata: dict[str, Any] = params.meta or {} # type: ignore[assignment]
|
|
87
86
|
uri = params.uri
|
|
88
87
|
|
|
89
88
|
message = f"RESOURCE_UPDATE: Server '{associated_client.config.name}' reports change on resoure at: {uri}. (Meta Data: {metadata})"
|
|
@@ -102,8 +101,8 @@ async def handle_resource_list_changed_notification(
|
|
|
102
101
|
# This also means that the associated client needs to invalidate
|
|
103
102
|
# its resource_contents_cache
|
|
104
103
|
|
|
105
|
-
params = n.params or {}
|
|
106
|
-
metadata = params.meta or {}
|
|
104
|
+
params: Any = n.params or {}
|
|
105
|
+
metadata: dict[str, Any] = params.meta or {}
|
|
107
106
|
|
|
108
107
|
message = f"TOOLS_LIST_CHANGED: Server '{associated_client.config.name}' reports a change in their tools list: {metadata}. Resetting Tools Cache for associated clients."
|
|
109
108
|
|
|
@@ -117,8 +116,8 @@ async def handle_tool_list_changed_notification(
|
|
|
117
116
|
associated_client: Any,
|
|
118
117
|
) -> None:
|
|
119
118
|
"""Handle an incoming ToolListChangedNotification."""
|
|
120
|
-
params = n.params or {}
|
|
121
|
-
metadata = params.meta or {}
|
|
119
|
+
params: Any = n.params or {}
|
|
120
|
+
metadata: dict[str, Any] = params.meta or {}
|
|
122
121
|
|
|
123
122
|
message = f"TOOLS_LIST_CHANGED: Server '{associated_client.config.name}' reports a change in their tools list: {metadata}. Resetting Tools Cache for associated clients."
|
|
124
123
|
|
|
@@ -126,7 +125,7 @@ async def handle_tool_list_changed_notification(
|
|
|
126
125
|
await associated_client.invalidate_tool_cache()
|
|
127
126
|
|
|
128
127
|
|
|
129
|
-
_SERVER_NOTIFICATION_MAP:
|
|
128
|
+
_SERVER_NOTIFICATION_MAP: Any = {
|
|
130
129
|
ResourceListChangedNotification: handle_resource_list_changed_notification,
|
|
131
130
|
ResourceUpdatedNotification: handle_resource_update_notification,
|
|
132
131
|
LoggingMessageNotification: lambda n, log, client: handle_logging_message(
|
|
@@ -159,7 +158,7 @@ async def handle_logging_message(
|
|
|
159
158
|
level = params.level
|
|
160
159
|
method = logger.debug
|
|
161
160
|
logger_name = params.logger if params.logger else "unknown_remote_logger"
|
|
162
|
-
metadata = params.meta or {}
|
|
161
|
+
metadata: dict[str, Any] = params.meta or {} # type: ignore[assignment]
|
|
163
162
|
|
|
164
163
|
str_level = "DEBUG"
|
|
165
164
|
prefix = f"Message from Remote MCP Logger '{logger_name}' for server '{server_name}': "
|
|
@@ -206,7 +205,6 @@ async def handle_incoming_request(
|
|
|
206
205
|
case CreateMessageRequest(params=req.request.root.params):
|
|
207
206
|
with req:
|
|
208
207
|
# invoke user's sampling callback
|
|
209
|
-
# type: ignore
|
|
210
208
|
response = await associated_client.sampling_callback(
|
|
211
209
|
ctx, req.request.root.params
|
|
212
210
|
)
|
|
@@ -214,7 +212,6 @@ async def handle_incoming_request(
|
|
|
214
212
|
await req.respond(client_resp)
|
|
215
213
|
case ListRootsRequest():
|
|
216
214
|
with req:
|
|
217
|
-
# type: ignore
|
|
218
215
|
response = await associated_client.list_roots_callback(ctx)
|
|
219
216
|
client_resp = ClientResponse.validate_python(response)
|
|
220
217
|
await req.respond(client_resp)
|
|
@@ -223,15 +220,13 @@ async def handle_incoming_request(
|
|
|
223
220
|
return
|
|
224
221
|
except Exception as e:
|
|
225
222
|
# 1) Log the error and stacktrace
|
|
226
|
-
logger_to_use.
|
|
223
|
+
logger_to_use.exception(
|
|
227
224
|
f"Error in fallback handle_incoming_request (id={req.request_id}): {e}"
|
|
228
225
|
)
|
|
229
226
|
# 2) If the request wasn't already completed, send a JSON-RPC error back
|
|
230
227
|
if not getattr(req, "_completed", False):
|
|
231
228
|
with req:
|
|
232
|
-
err = ErrorData(
|
|
233
|
-
code=INTERNAL_ERROR, message=f"Client-side error: {e}"
|
|
234
|
-
)
|
|
229
|
+
err = ErrorData(code=INTERNAL_ERROR, message=f"Client-side error: {e}")
|
|
235
230
|
client_err = ClientResponse.validate_python(err)
|
|
236
231
|
await req.respond(client_err)
|
|
237
232
|
return
|