flock-core 0.5.0b28__py3-none-any.whl → 0.5.56b0__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 +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/{core/util → helper}/cli_helper.py +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- 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 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -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 +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -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/darkside.toml +1 -1
- 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 +1 -1
- 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/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.56b0.dist-info/METADATA +747 -0
- flock_core-0.5.56b0.dist-info/RECORD +398 -0
- flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.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/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- 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 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- 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/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- 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 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- 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 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- 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 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- 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 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- 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 -118
- 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/_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/_streaming_results_container.html +0 -195
- 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 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.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.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
|
@@ -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
|
|
@@ -15,32 +15,53 @@ from anyio.streams.memory import (
|
|
|
15
15
|
from mcp import (
|
|
16
16
|
ClientSession,
|
|
17
17
|
CreateMessageResult,
|
|
18
|
+
)
|
|
19
|
+
from mcp import (
|
|
18
20
|
StdioServerParameters as _MCPStdioServerParameters,
|
|
19
21
|
)
|
|
20
22
|
from mcp.shared.context import RequestContext
|
|
21
23
|
from mcp.shared.session import RequestResponder
|
|
22
24
|
from mcp.types import (
|
|
23
25
|
CancelledNotification as _MCPCancelledNotification,
|
|
26
|
+
)
|
|
27
|
+
from mcp.types import (
|
|
24
28
|
ClientResult,
|
|
25
29
|
CreateMessageRequestParams,
|
|
26
30
|
ErrorData,
|
|
27
31
|
JSONRPCMessage,
|
|
28
32
|
ListRootsResult,
|
|
33
|
+
ServerRequest,
|
|
34
|
+
)
|
|
35
|
+
from mcp.types import (
|
|
29
36
|
LoggingMessageNotification as _MCPLoggingMessageNotification,
|
|
37
|
+
)
|
|
38
|
+
from mcp.types import (
|
|
30
39
|
LoggingMessageNotificationParams as _MCPLoggingMessageNotificationParams,
|
|
40
|
+
)
|
|
41
|
+
from mcp.types import (
|
|
31
42
|
ProgressNotification as _MCPProgressNotification,
|
|
43
|
+
)
|
|
44
|
+
from mcp.types import (
|
|
32
45
|
PromptListChangedNotification as _MCPPromptListChangedNotification,
|
|
46
|
+
)
|
|
47
|
+
from mcp.types import (
|
|
33
48
|
ResourceListChangedNotification as _MCPResourceListChangedNotification,
|
|
49
|
+
)
|
|
50
|
+
from mcp.types import (
|
|
34
51
|
ResourceUpdatedNotification as _MCPResourceUpdateNotification,
|
|
52
|
+
)
|
|
53
|
+
from mcp.types import (
|
|
35
54
|
Root as _MCPRoot,
|
|
55
|
+
)
|
|
56
|
+
from mcp.types import (
|
|
36
57
|
ServerNotification as _MCPServerNotification,
|
|
37
|
-
|
|
58
|
+
)
|
|
59
|
+
from mcp.types import (
|
|
38
60
|
ToolListChangedNotification as _MCPToolListChangedNotification,
|
|
39
61
|
)
|
|
40
62
|
from pydantic import AnyUrl, BaseModel, ConfigDict, Field
|
|
41
63
|
|
|
42
|
-
from flock.
|
|
43
|
-
from flock.core.serialization.serializable import Serializable
|
|
64
|
+
from flock.mcp.util.helpers import get_default_env
|
|
44
65
|
|
|
45
66
|
|
|
46
67
|
class ServerNotification(_MCPServerNotification):
|
|
@@ -75,9 +96,7 @@ class PromptListChangedNotification(_MCPPromptListChangedNotification):
|
|
|
75
96
|
"""A notification message sent by the server side informing a client about a change in the list of offered Prompts."""
|
|
76
97
|
|
|
77
98
|
|
|
78
|
-
class FlockLoggingMessageNotificationParams(
|
|
79
|
-
_MCPLoggingMessageNotificationParams
|
|
80
|
-
):
|
|
99
|
+
class FlockLoggingMessageNotificationParams(_MCPLoggingMessageNotificationParams):
|
|
81
100
|
"""Parameters contained within a Logging Message Notification."""
|
|
82
101
|
|
|
83
102
|
|
|
@@ -85,7 +104,7 @@ class MCPRoot(_MCPRoot):
|
|
|
85
104
|
"""Wrapper for mcp.types.Root."""
|
|
86
105
|
|
|
87
106
|
|
|
88
|
-
class ServerParameters(BaseModel
|
|
107
|
+
class ServerParameters(BaseModel):
|
|
89
108
|
"""Base Type for server parameters."""
|
|
90
109
|
|
|
91
110
|
model_config = ConfigDict(
|
|
@@ -93,17 +112,12 @@ class ServerParameters(BaseModel, Serializable):
|
|
|
93
112
|
)
|
|
94
113
|
|
|
95
114
|
transport_type: Literal["stdio", "websockets", "sse", "streamable_http"] = Field(
|
|
96
|
-
...,
|
|
97
|
-
description="which type of transport these connection params are used for."
|
|
115
|
+
..., description="which type of transport these connection params are used for."
|
|
98
116
|
)
|
|
99
117
|
|
|
100
118
|
def to_dict(self, path_type: str = "relative"):
|
|
101
119
|
"""Serialize."""
|
|
102
|
-
return self.model_dump(
|
|
103
|
-
exclude_defaults=False,
|
|
104
|
-
exclude_none=True,
|
|
105
|
-
mode="json"
|
|
106
|
-
)
|
|
120
|
+
return self.model_dump(exclude_defaults=False, exclude_none=True, mode="json")
|
|
107
121
|
|
|
108
122
|
@classmethod
|
|
109
123
|
def from_dict(cls, data: dict[str, Any]):
|
|
@@ -114,10 +128,7 @@ class ServerParameters(BaseModel, Serializable):
|
|
|
114
128
|
class StdioServerParameters(_MCPStdioServerParameters, ServerParameters):
|
|
115
129
|
"""Base Type for Stdio Server parameters."""
|
|
116
130
|
|
|
117
|
-
transport_type: Literal["stdio"] = Field(
|
|
118
|
-
default="stdio",
|
|
119
|
-
description="Use stdio params."
|
|
120
|
-
)
|
|
131
|
+
transport_type: Literal["stdio"] = Field(default="stdio", description="Use stdio params.")
|
|
121
132
|
|
|
122
133
|
env: dict[str, str] | None = Field(
|
|
123
134
|
default_factory=get_default_env,
|
|
@@ -129,28 +140,23 @@ class WebsocketServerParameters(ServerParameters):
|
|
|
129
140
|
"""Base Type for Websocket Server params."""
|
|
130
141
|
|
|
131
142
|
transport_type: Literal["websockets"] = Field(
|
|
132
|
-
default="websockets",
|
|
133
|
-
description="Use websocket params."
|
|
143
|
+
default="websockets", description="Use websocket params."
|
|
134
144
|
)
|
|
135
145
|
|
|
136
146
|
url: str | AnyUrl = Field(..., description="Url the server listens at.")
|
|
137
147
|
|
|
148
|
+
|
|
138
149
|
class StreamableHttpServerParameters(ServerParameters):
|
|
139
150
|
"""Base Type for StreamableHttp params."""
|
|
140
151
|
|
|
141
152
|
transport_type: Literal["streamable_http"] = Field(
|
|
142
|
-
default="streamable_http",
|
|
143
|
-
description="Use streamable http params."
|
|
153
|
+
default="streamable_http", description="Use streamable http params."
|
|
144
154
|
)
|
|
145
155
|
|
|
146
|
-
url: str | AnyUrl = Field(
|
|
147
|
-
...,
|
|
148
|
-
description="The url the server listens at."
|
|
149
|
-
)
|
|
156
|
+
url: str | AnyUrl = Field(..., description="The url the server listens at.")
|
|
150
157
|
|
|
151
158
|
headers: dict[str, Any] | None = Field(
|
|
152
|
-
default=None,
|
|
153
|
-
description="Additional headers to pass to the client."
|
|
159
|
+
default=None, description="Additional headers to pass to the client."
|
|
154
160
|
)
|
|
155
161
|
|
|
156
162
|
timeout: float | int = Field(
|
|
@@ -159,19 +165,13 @@ class StreamableHttpServerParameters(ServerParameters):
|
|
|
159
165
|
)
|
|
160
166
|
|
|
161
167
|
sse_read_timeout: float | int = Field(
|
|
162
|
-
default=60*5,
|
|
163
|
-
description="How long the client will wait before disconnecting from the server."
|
|
168
|
+
default=60 * 5,
|
|
169
|
+
description="How long the client will wait before disconnecting from the server.",
|
|
164
170
|
)
|
|
165
171
|
|
|
166
|
-
terminate_on_close: bool = Field(
|
|
167
|
-
default=True,
|
|
168
|
-
description="Terminate connection on close"
|
|
169
|
-
)
|
|
172
|
+
terminate_on_close: bool = Field(default=True, description="Terminate connection on close")
|
|
170
173
|
|
|
171
|
-
auth: httpx.Auth | None = Field(
|
|
172
|
-
default=None,
|
|
173
|
-
description="Httpx Auth Scheme"
|
|
174
|
-
)
|
|
174
|
+
auth: httpx.Auth | None = Field(default=None, description="Httpx Auth Scheme")
|
|
175
175
|
|
|
176
176
|
@classmethod
|
|
177
177
|
def from_dict(cls, data: dict[str, Any]):
|
|
@@ -188,7 +188,7 @@ class StreamableHttpServerParameters(ServerParameters):
|
|
|
188
188
|
mod = importlib.import_module(impl["module_path"])
|
|
189
189
|
real_cls = getattr(mod, impl["classname"])
|
|
190
190
|
if params:
|
|
191
|
-
auth_obj = real_cls(**
|
|
191
|
+
auth_obj = real_cls(**dict(params.items()))
|
|
192
192
|
else:
|
|
193
193
|
# assume that the implementation handles it.
|
|
194
194
|
auth_obj = real_cls()
|
|
@@ -196,9 +196,9 @@ class StreamableHttpServerParameters(ServerParameters):
|
|
|
196
196
|
raise ValueError("No concrete implementation for auth provided.")
|
|
197
197
|
|
|
198
198
|
data["auth"] = auth_obj
|
|
199
|
-
return cls(**
|
|
199
|
+
return cls(**dict(data.items()))
|
|
200
200
|
|
|
201
|
-
def to_dict(self, path_type
|
|
201
|
+
def to_dict(self, path_type="relative"):
|
|
202
202
|
"""Serialize the object."""
|
|
203
203
|
exclude = ["auth"]
|
|
204
204
|
|
|
@@ -224,24 +224,24 @@ class StreamableHttpServerParameters(ServerParameters):
|
|
|
224
224
|
except Exception:
|
|
225
225
|
params = None
|
|
226
226
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
227
|
+
data["auth"] = {
|
|
228
|
+
"implementation": {
|
|
229
|
+
"class_name": type(self.auth).__name__,
|
|
230
|
+
"module_path": type(self.auth).__module__,
|
|
231
|
+
"file_path": file_path,
|
|
232
|
+
},
|
|
233
|
+
"params": params,
|
|
234
|
+
}
|
|
235
|
+
else:
|
|
236
|
+
data["auth"] = None
|
|
235
237
|
|
|
236
238
|
return data
|
|
237
239
|
|
|
240
|
+
|
|
238
241
|
class SseServerParameters(ServerParameters):
|
|
239
242
|
"""Base Type for SSE Server params."""
|
|
240
243
|
|
|
241
|
-
transport_type: Literal["sse"] = Field(
|
|
242
|
-
default="sse",
|
|
243
|
-
description="Use sse server params."
|
|
244
|
-
)
|
|
244
|
+
transport_type: Literal["sse"] = Field(default="sse", description="Use sse server params.")
|
|
245
245
|
|
|
246
246
|
url: str | AnyUrl = Field(..., description="The url the server listens at.")
|
|
247
247
|
|
|
@@ -256,10 +256,7 @@ class SseServerParameters(ServerParameters):
|
|
|
256
256
|
description="How long the client will wait before disconnecting from the server.",
|
|
257
257
|
)
|
|
258
258
|
|
|
259
|
-
auth: httpx.Auth | None = Field(
|
|
260
|
-
default=None,
|
|
261
|
-
description="Httpx Auth Scheme."
|
|
262
|
-
)
|
|
259
|
+
auth: httpx.Auth | None = Field(default=None, description="Httpx Auth Scheme.")
|
|
263
260
|
|
|
264
261
|
@classmethod
|
|
265
262
|
def from_dict(cls, data: dict[str, Any]):
|
|
@@ -267,7 +264,7 @@ class SseServerParameters(ServerParameters):
|
|
|
267
264
|
# find and import the concrete implementation for
|
|
268
265
|
# the auth object.
|
|
269
266
|
auth_obj: httpx.Auth | None = None
|
|
270
|
-
auth_impl = data.pop("auth", None)
|
|
267
|
+
auth_impl = data.pop("auth", None) # get the specs for the auth class
|
|
271
268
|
if auth_impl:
|
|
272
269
|
# find the concrete implementation
|
|
273
270
|
impl = auth_impl.pop("implementation", None)
|
|
@@ -276,7 +273,7 @@ class SseServerParameters(ServerParameters):
|
|
|
276
273
|
mod = importlib.import_module(impl["module_path"])
|
|
277
274
|
real_cls = getattr(mod, impl["class_name"])
|
|
278
275
|
if params:
|
|
279
|
-
auth_obj = real_cls(**
|
|
276
|
+
auth_obj = real_cls(**dict(params.items()))
|
|
280
277
|
else:
|
|
281
278
|
# assume that implementation handles it
|
|
282
279
|
auth_obj = real_cls()
|
|
@@ -284,9 +281,9 @@ class SseServerParameters(ServerParameters):
|
|
|
284
281
|
raise ValueError("No concrete implementation for auth provided.")
|
|
285
282
|
|
|
286
283
|
data["auth"] = auth_obj
|
|
287
|
-
return cls(**
|
|
284
|
+
return cls(**dict(data.items()))
|
|
288
285
|
|
|
289
|
-
def to_dict(self, path_type
|
|
286
|
+
def to_dict(self, path_type="relative"):
|
|
290
287
|
"""Serialize the object."""
|
|
291
288
|
exclude = ["auth"]
|
|
292
289
|
|
|
@@ -312,17 +309,20 @@ class SseServerParameters(ServerParameters):
|
|
|
312
309
|
except Exception:
|
|
313
310
|
params = None
|
|
314
311
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
312
|
+
data["auth"] = {
|
|
313
|
+
"implementation": {
|
|
314
|
+
"class_name": type(self.auth).__name__,
|
|
315
|
+
"module_path": type(self.auth).__module__,
|
|
316
|
+
"file_path": file_path,
|
|
317
|
+
},
|
|
318
|
+
"params": params,
|
|
319
|
+
}
|
|
320
|
+
else:
|
|
321
|
+
data["auth"] = None
|
|
323
322
|
|
|
324
323
|
return data
|
|
325
324
|
|
|
325
|
+
|
|
326
326
|
MCPCLientInitFunction = Callable[
|
|
327
327
|
...,
|
|
328
328
|
AbstractAsyncContextManager[
|
|
@@ -351,10 +351,6 @@ FlockLoggingMCPCallback = Callable[
|
|
|
351
351
|
]
|
|
352
352
|
|
|
353
353
|
FlockMessageHandlerMCPCallback = Callable[
|
|
354
|
-
[
|
|
355
|
-
RequestResponder[ServerRequest, ClientResult]
|
|
356
|
-
| ServerNotification
|
|
357
|
-
| Exception
|
|
358
|
-
],
|
|
354
|
+
[RequestResponder[ServerRequest, ClientResult] | ServerNotification | Exception],
|
|
359
355
|
Awaitable[None],
|
|
360
356
|
]
|
|
@@ -18,6 +18,6 @@ def get_default_env() -> dict[str, str]:
|
|
|
18
18
|
def cache_key_generator(agent_id: str, run_id: str, *args, **kwargs) -> str:
|
|
19
19
|
"""Helper function to generate cache keys for Flock MCP caches."""
|
|
20
20
|
args_digest = hashlib.md5(
|
|
21
|
-
json.dumps(kwargs, sort_keys=True).encode()
|
|
21
|
+
json.dumps(kwargs, sort_keys=True).encode(), usedforsecurity=False
|
|
22
22
|
).hexdigest()
|
|
23
23
|
return f"{agent_id}:{run_id}:{args_digest}"
|