agentpool 2.1.9__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 agentpool might be problematic. Click here for more details.
- acp/README.md +64 -0
- acp/__init__.py +172 -0
- acp/__main__.py +10 -0
- acp/acp_requests.py +285 -0
- acp/agent/__init__.py +6 -0
- acp/agent/connection.py +256 -0
- acp/agent/implementations/__init__.py +6 -0
- acp/agent/implementations/debug_server/__init__.py +1 -0
- acp/agent/implementations/debug_server/cli.py +79 -0
- acp/agent/implementations/debug_server/debug.html +234 -0
- acp/agent/implementations/debug_server/debug_server.py +496 -0
- acp/agent/implementations/testing.py +91 -0
- acp/agent/protocol.py +65 -0
- acp/bridge/README.md +162 -0
- acp/bridge/__init__.py +6 -0
- acp/bridge/__main__.py +91 -0
- acp/bridge/bridge.py +246 -0
- acp/bridge/py.typed +0 -0
- acp/bridge/settings.py +15 -0
- acp/client/__init__.py +7 -0
- acp/client/connection.py +251 -0
- acp/client/implementations/__init__.py +7 -0
- acp/client/implementations/default_client.py +185 -0
- acp/client/implementations/headless_client.py +266 -0
- acp/client/implementations/noop_client.py +110 -0
- acp/client/protocol.py +61 -0
- acp/connection.py +280 -0
- acp/exceptions.py +46 -0
- acp/filesystem.py +524 -0
- acp/notifications.py +832 -0
- acp/py.typed +0 -0
- acp/schema/__init__.py +265 -0
- acp/schema/agent_plan.py +30 -0
- acp/schema/agent_requests.py +126 -0
- acp/schema/agent_responses.py +256 -0
- acp/schema/base.py +39 -0
- acp/schema/capabilities.py +230 -0
- acp/schema/client_requests.py +247 -0
- acp/schema/client_responses.py +96 -0
- acp/schema/common.py +81 -0
- acp/schema/content_blocks.py +188 -0
- acp/schema/mcp.py +82 -0
- acp/schema/messages.py +171 -0
- acp/schema/notifications.py +82 -0
- acp/schema/protocol_stuff.md +3 -0
- acp/schema/session_state.py +160 -0
- acp/schema/session_updates.py +419 -0
- acp/schema/slash_commands.py +51 -0
- acp/schema/terminal.py +15 -0
- acp/schema/tool_call.py +347 -0
- acp/stdio.py +250 -0
- acp/task/__init__.py +53 -0
- acp/task/debug.py +197 -0
- acp/task/dispatcher.py +93 -0
- acp/task/queue.py +69 -0
- acp/task/sender.py +82 -0
- acp/task/state.py +87 -0
- acp/task/supervisor.py +93 -0
- acp/terminal_handle.py +30 -0
- acp/tool_call_reporter.py +199 -0
- acp/tool_call_state.py +178 -0
- acp/transports.py +104 -0
- acp/utils.py +240 -0
- agentpool/__init__.py +63 -0
- agentpool/__main__.py +7 -0
- agentpool/agents/__init__.py +30 -0
- agentpool/agents/acp_agent/__init__.py +5 -0
- agentpool/agents/acp_agent/acp_agent.py +837 -0
- agentpool/agents/acp_agent/acp_converters.py +294 -0
- agentpool/agents/acp_agent/client_handler.py +317 -0
- agentpool/agents/acp_agent/session_state.py +44 -0
- agentpool/agents/agent.py +1264 -0
- agentpool/agents/agui_agent/__init__.py +19 -0
- agentpool/agents/agui_agent/agui_agent.py +677 -0
- agentpool/agents/agui_agent/agui_converters.py +423 -0
- agentpool/agents/agui_agent/chunk_transformer.py +204 -0
- agentpool/agents/agui_agent/event_types.py +83 -0
- agentpool/agents/agui_agent/helpers.py +192 -0
- agentpool/agents/architect.py +71 -0
- agentpool/agents/base_agent.py +177 -0
- agentpool/agents/claude_code_agent/__init__.py +11 -0
- agentpool/agents/claude_code_agent/claude_code_agent.py +1021 -0
- agentpool/agents/claude_code_agent/converters.py +243 -0
- agentpool/agents/context.py +105 -0
- agentpool/agents/events/__init__.py +61 -0
- agentpool/agents/events/builtin_handlers.py +129 -0
- agentpool/agents/events/event_emitter.py +320 -0
- agentpool/agents/events/events.py +561 -0
- agentpool/agents/events/tts_handlers.py +186 -0
- agentpool/agents/interactions.py +419 -0
- agentpool/agents/slashed_agent.py +244 -0
- agentpool/agents/sys_prompts.py +178 -0
- agentpool/agents/tool_wrapping.py +184 -0
- agentpool/base_provider.py +28 -0
- agentpool/common_types.py +226 -0
- agentpool/config_resources/__init__.py +16 -0
- agentpool/config_resources/acp_assistant.yml +24 -0
- agentpool/config_resources/agents.yml +109 -0
- agentpool/config_resources/agents_template.yml +18 -0
- agentpool/config_resources/agui_test.yml +18 -0
- agentpool/config_resources/claude_code_agent.yml +16 -0
- agentpool/config_resources/claude_style_subagent.md +30 -0
- agentpool/config_resources/external_acp_agents.yml +77 -0
- agentpool/config_resources/opencode_style_subagent.md +19 -0
- agentpool/config_resources/tts_test_agents.yml +78 -0
- agentpool/delegation/__init__.py +8 -0
- agentpool/delegation/base_team.py +504 -0
- agentpool/delegation/message_flow_tracker.py +39 -0
- agentpool/delegation/pool.py +1129 -0
- agentpool/delegation/team.py +325 -0
- agentpool/delegation/teamrun.py +343 -0
- agentpool/docs/__init__.py +5 -0
- agentpool/docs/gen_examples.py +42 -0
- agentpool/docs/utils.py +370 -0
- agentpool/functional/__init__.py +20 -0
- agentpool/functional/py.typed +0 -0
- agentpool/functional/run.py +80 -0
- agentpool/functional/structure.py +136 -0
- agentpool/hooks/__init__.py +20 -0
- agentpool/hooks/agent_hooks.py +247 -0
- agentpool/hooks/base.py +119 -0
- agentpool/hooks/callable.py +140 -0
- agentpool/hooks/command.py +180 -0
- agentpool/hooks/prompt.py +122 -0
- agentpool/jinja_filters.py +132 -0
- agentpool/log.py +224 -0
- agentpool/mcp_server/__init__.py +17 -0
- agentpool/mcp_server/client.py +429 -0
- agentpool/mcp_server/constants.py +32 -0
- agentpool/mcp_server/conversions.py +172 -0
- agentpool/mcp_server/helpers.py +47 -0
- agentpool/mcp_server/manager.py +232 -0
- agentpool/mcp_server/message_handler.py +164 -0
- agentpool/mcp_server/registries/__init__.py +1 -0
- agentpool/mcp_server/registries/official_registry_client.py +345 -0
- agentpool/mcp_server/registries/pulsemcp_client.py +88 -0
- agentpool/mcp_server/tool_bridge.py +548 -0
- agentpool/messaging/__init__.py +58 -0
- agentpool/messaging/compaction.py +928 -0
- agentpool/messaging/connection_manager.py +319 -0
- agentpool/messaging/context.py +66 -0
- agentpool/messaging/event_manager.py +426 -0
- agentpool/messaging/events.py +39 -0
- agentpool/messaging/message_container.py +209 -0
- agentpool/messaging/message_history.py +491 -0
- agentpool/messaging/messagenode.py +377 -0
- agentpool/messaging/messages.py +655 -0
- agentpool/messaging/processing.py +76 -0
- agentpool/mime_utils.py +95 -0
- agentpool/models/__init__.py +21 -0
- agentpool/models/acp_agents/__init__.py +22 -0
- agentpool/models/acp_agents/base.py +308 -0
- agentpool/models/acp_agents/mcp_capable.py +790 -0
- agentpool/models/acp_agents/non_mcp.py +842 -0
- agentpool/models/agents.py +450 -0
- agentpool/models/agui_agents.py +89 -0
- agentpool/models/claude_code_agents.py +238 -0
- agentpool/models/file_agents.py +116 -0
- agentpool/models/file_parsing.py +367 -0
- agentpool/models/manifest.py +658 -0
- agentpool/observability/__init__.py +9 -0
- agentpool/observability/observability_registry.py +97 -0
- agentpool/prompts/__init__.py +1 -0
- agentpool/prompts/base.py +27 -0
- agentpool/prompts/builtin_provider.py +75 -0
- agentpool/prompts/conversion_manager.py +95 -0
- agentpool/prompts/convert.py +96 -0
- agentpool/prompts/manager.py +204 -0
- agentpool/prompts/parts/zed.md +33 -0
- agentpool/prompts/prompts.py +581 -0
- agentpool/py.typed +0 -0
- agentpool/queries/tree-sitter-language-pack/README.md +7 -0
- agentpool/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/c-tags.scm +9 -0
- agentpool/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
- agentpool/queries/tree-sitter-language-pack/clojure-tags.scm +7 -0
- agentpool/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
- agentpool/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
- agentpool/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
- agentpool/queries/tree-sitter-language-pack/d-tags.scm +26 -0
- agentpool/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
- agentpool/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
- agentpool/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
- agentpool/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
- agentpool/queries/tree-sitter-language-pack/go-tags.scm +42 -0
- agentpool/queries/tree-sitter-language-pack/java-tags.scm +20 -0
- agentpool/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
- agentpool/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
- agentpool/queries/tree-sitter-language-pack/matlab-tags.scm +10 -0
- agentpool/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
- agentpool/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
- agentpool/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
- agentpool/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/python-tags.scm +14 -0
- agentpool/queries/tree-sitter-language-pack/r-tags.scm +21 -0
- agentpool/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
- agentpool/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
- agentpool/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
- agentpool/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
- agentpool/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
- agentpool/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
- agentpool/queries/tree-sitter-languages/README.md +24 -0
- agentpool/queries/tree-sitter-languages/c-tags.scm +9 -0
- agentpool/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
- agentpool/queries/tree-sitter-languages/cpp-tags.scm +15 -0
- agentpool/queries/tree-sitter-languages/dart-tags.scm +91 -0
- agentpool/queries/tree-sitter-languages/elisp-tags.scm +8 -0
- agentpool/queries/tree-sitter-languages/elixir-tags.scm +54 -0
- agentpool/queries/tree-sitter-languages/elm-tags.scm +19 -0
- agentpool/queries/tree-sitter-languages/fortran-tags.scm +15 -0
- agentpool/queries/tree-sitter-languages/go-tags.scm +30 -0
- agentpool/queries/tree-sitter-languages/haskell-tags.scm +3 -0
- agentpool/queries/tree-sitter-languages/hcl-tags.scm +77 -0
- agentpool/queries/tree-sitter-languages/java-tags.scm +20 -0
- agentpool/queries/tree-sitter-languages/javascript-tags.scm +88 -0
- agentpool/queries/tree-sitter-languages/julia-tags.scm +60 -0
- agentpool/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
- agentpool/queries/tree-sitter-languages/matlab-tags.scm +10 -0
- agentpool/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
- agentpool/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
- agentpool/queries/tree-sitter-languages/php-tags.scm +26 -0
- agentpool/queries/tree-sitter-languages/python-tags.scm +12 -0
- agentpool/queries/tree-sitter-languages/ql-tags.scm +26 -0
- agentpool/queries/tree-sitter-languages/ruby-tags.scm +64 -0
- agentpool/queries/tree-sitter-languages/rust-tags.scm +60 -0
- agentpool/queries/tree-sitter-languages/scala-tags.scm +65 -0
- agentpool/queries/tree-sitter-languages/typescript-tags.scm +41 -0
- agentpool/queries/tree-sitter-languages/zig-tags.scm +3 -0
- agentpool/repomap.py +1231 -0
- agentpool/resource_providers/__init__.py +17 -0
- agentpool/resource_providers/aggregating.py +54 -0
- agentpool/resource_providers/base.py +172 -0
- agentpool/resource_providers/codemode/__init__.py +9 -0
- agentpool/resource_providers/codemode/code_executor.py +215 -0
- agentpool/resource_providers/codemode/default_prompt.py +19 -0
- agentpool/resource_providers/codemode/helpers.py +83 -0
- agentpool/resource_providers/codemode/progress_executor.py +212 -0
- agentpool/resource_providers/codemode/provider.py +150 -0
- agentpool/resource_providers/codemode/remote_mcp_execution.py +143 -0
- agentpool/resource_providers/codemode/remote_provider.py +171 -0
- agentpool/resource_providers/filtering.py +42 -0
- agentpool/resource_providers/mcp_provider.py +246 -0
- agentpool/resource_providers/plan_provider.py +196 -0
- agentpool/resource_providers/pool.py +69 -0
- agentpool/resource_providers/static.py +289 -0
- agentpool/running/__init__.py +20 -0
- agentpool/running/decorators.py +56 -0
- agentpool/running/discovery.py +101 -0
- agentpool/running/executor.py +284 -0
- agentpool/running/injection.py +111 -0
- agentpool/running/py.typed +0 -0
- agentpool/running/run_nodes.py +87 -0
- agentpool/server.py +122 -0
- agentpool/sessions/__init__.py +13 -0
- agentpool/sessions/manager.py +302 -0
- agentpool/sessions/models.py +71 -0
- agentpool/sessions/session.py +239 -0
- agentpool/sessions/store.py +163 -0
- agentpool/skills/__init__.py +5 -0
- agentpool/skills/manager.py +120 -0
- agentpool/skills/registry.py +210 -0
- agentpool/skills/skill.py +36 -0
- agentpool/storage/__init__.py +17 -0
- agentpool/storage/manager.py +419 -0
- agentpool/storage/serialization.py +136 -0
- agentpool/talk/__init__.py +13 -0
- agentpool/talk/registry.py +128 -0
- agentpool/talk/stats.py +159 -0
- agentpool/talk/talk.py +604 -0
- agentpool/tasks/__init__.py +20 -0
- agentpool/tasks/exceptions.py +25 -0
- agentpool/tasks/registry.py +33 -0
- agentpool/testing.py +129 -0
- agentpool/text_templates/__init__.py +39 -0
- agentpool/text_templates/system_prompt.jinja +30 -0
- agentpool/text_templates/tool_call_default.jinja +13 -0
- agentpool/text_templates/tool_call_markdown.jinja +25 -0
- agentpool/text_templates/tool_call_simple.jinja +5 -0
- agentpool/tools/__init__.py +16 -0
- agentpool/tools/base.py +269 -0
- agentpool/tools/exceptions.py +9 -0
- agentpool/tools/manager.py +255 -0
- agentpool/tools/tool_call_info.py +87 -0
- agentpool/ui/__init__.py +2 -0
- agentpool/ui/base.py +89 -0
- agentpool/ui/mock_provider.py +81 -0
- agentpool/ui/stdlib_provider.py +150 -0
- agentpool/utils/__init__.py +44 -0
- agentpool/utils/baseregistry.py +185 -0
- agentpool/utils/count_tokens.py +62 -0
- agentpool/utils/dag.py +184 -0
- agentpool/utils/importing.py +206 -0
- agentpool/utils/inspection.py +334 -0
- agentpool/utils/model_capabilities.py +25 -0
- agentpool/utils/network.py +28 -0
- agentpool/utils/now.py +22 -0
- agentpool/utils/parse_time.py +87 -0
- agentpool/utils/result_utils.py +35 -0
- agentpool/utils/signatures.py +305 -0
- agentpool/utils/streams.py +112 -0
- agentpool/utils/tasks.py +186 -0
- agentpool/vfs_registry.py +250 -0
- agentpool-2.1.9.dist-info/METADATA +336 -0
- agentpool-2.1.9.dist-info/RECORD +474 -0
- agentpool-2.1.9.dist-info/WHEEL +4 -0
- agentpool-2.1.9.dist-info/entry_points.txt +14 -0
- agentpool-2.1.9.dist-info/licenses/LICENSE +22 -0
- agentpool_cli/__init__.py +34 -0
- agentpool_cli/__main__.py +66 -0
- agentpool_cli/agent.py +175 -0
- agentpool_cli/cli_types.py +23 -0
- agentpool_cli/common.py +163 -0
- agentpool_cli/create.py +175 -0
- agentpool_cli/history.py +217 -0
- agentpool_cli/log.py +78 -0
- agentpool_cli/py.typed +0 -0
- agentpool_cli/run.py +84 -0
- agentpool_cli/serve_acp.py +177 -0
- agentpool_cli/serve_api.py +69 -0
- agentpool_cli/serve_mcp.py +74 -0
- agentpool_cli/serve_vercel.py +233 -0
- agentpool_cli/store.py +171 -0
- agentpool_cli/task.py +84 -0
- agentpool_cli/utils.py +104 -0
- agentpool_cli/watch.py +54 -0
- agentpool_commands/__init__.py +180 -0
- agentpool_commands/agents.py +199 -0
- agentpool_commands/base.py +45 -0
- agentpool_commands/commands.py +58 -0
- agentpool_commands/completers.py +110 -0
- agentpool_commands/connections.py +175 -0
- agentpool_commands/markdown_utils.py +31 -0
- agentpool_commands/models.py +62 -0
- agentpool_commands/prompts.py +78 -0
- agentpool_commands/py.typed +0 -0
- agentpool_commands/read.py +77 -0
- agentpool_commands/resources.py +210 -0
- agentpool_commands/session.py +48 -0
- agentpool_commands/tools.py +269 -0
- agentpool_commands/utils.py +189 -0
- agentpool_commands/workers.py +163 -0
- agentpool_config/__init__.py +53 -0
- agentpool_config/builtin_tools.py +265 -0
- agentpool_config/commands.py +237 -0
- agentpool_config/conditions.py +301 -0
- agentpool_config/converters.py +30 -0
- agentpool_config/durable.py +331 -0
- agentpool_config/event_handlers.py +600 -0
- agentpool_config/events.py +153 -0
- agentpool_config/forward_targets.py +251 -0
- agentpool_config/hook_conditions.py +331 -0
- agentpool_config/hooks.py +241 -0
- agentpool_config/jinja.py +206 -0
- agentpool_config/knowledge.py +41 -0
- agentpool_config/loaders.py +350 -0
- agentpool_config/mcp_server.py +243 -0
- agentpool_config/nodes.py +202 -0
- agentpool_config/observability.py +191 -0
- agentpool_config/output_types.py +55 -0
- agentpool_config/pool_server.py +267 -0
- agentpool_config/prompt_hubs.py +105 -0
- agentpool_config/prompts.py +185 -0
- agentpool_config/py.typed +0 -0
- agentpool_config/resources.py +33 -0
- agentpool_config/session.py +119 -0
- agentpool_config/skills.py +17 -0
- agentpool_config/storage.py +288 -0
- agentpool_config/system_prompts.py +190 -0
- agentpool_config/task.py +162 -0
- agentpool_config/teams.py +52 -0
- agentpool_config/tools.py +112 -0
- agentpool_config/toolsets.py +1033 -0
- agentpool_config/workers.py +86 -0
- agentpool_prompts/__init__.py +1 -0
- agentpool_prompts/braintrust_hub.py +235 -0
- agentpool_prompts/fabric.py +75 -0
- agentpool_prompts/langfuse_hub.py +79 -0
- agentpool_prompts/promptlayer_provider.py +59 -0
- agentpool_prompts/py.typed +0 -0
- agentpool_server/__init__.py +9 -0
- agentpool_server/a2a_server/__init__.py +5 -0
- agentpool_server/a2a_server/a2a_types.py +41 -0
- agentpool_server/a2a_server/server.py +190 -0
- agentpool_server/a2a_server/storage.py +81 -0
- agentpool_server/acp_server/__init__.py +22 -0
- agentpool_server/acp_server/acp_agent.py +786 -0
- agentpool_server/acp_server/acp_tools.py +43 -0
- agentpool_server/acp_server/commands/__init__.py +18 -0
- agentpool_server/acp_server/commands/acp_commands.py +594 -0
- agentpool_server/acp_server/commands/debug_commands.py +376 -0
- agentpool_server/acp_server/commands/docs_commands/__init__.py +39 -0
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +169 -0
- agentpool_server/acp_server/commands/docs_commands/get_schema.py +176 -0
- agentpool_server/acp_server/commands/docs_commands/get_source.py +110 -0
- agentpool_server/acp_server/commands/docs_commands/git_diff.py +111 -0
- agentpool_server/acp_server/commands/docs_commands/helpers.py +33 -0
- agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py +90 -0
- agentpool_server/acp_server/commands/spawn.py +210 -0
- agentpool_server/acp_server/converters.py +235 -0
- agentpool_server/acp_server/input_provider.py +338 -0
- agentpool_server/acp_server/server.py +288 -0
- agentpool_server/acp_server/session.py +969 -0
- agentpool_server/acp_server/session_manager.py +313 -0
- agentpool_server/acp_server/syntax_detection.py +250 -0
- agentpool_server/acp_server/zed_tools.md +90 -0
- agentpool_server/aggregating_server.py +309 -0
- agentpool_server/agui_server/__init__.py +11 -0
- agentpool_server/agui_server/server.py +128 -0
- agentpool_server/base.py +189 -0
- agentpool_server/http_server.py +164 -0
- agentpool_server/mcp_server/__init__.py +6 -0
- agentpool_server/mcp_server/server.py +314 -0
- agentpool_server/mcp_server/zed_wrapper.py +110 -0
- agentpool_server/openai_api_server/__init__.py +5 -0
- agentpool_server/openai_api_server/completions/__init__.py +1 -0
- agentpool_server/openai_api_server/completions/helpers.py +81 -0
- agentpool_server/openai_api_server/completions/models.py +98 -0
- agentpool_server/openai_api_server/responses/__init__.py +1 -0
- agentpool_server/openai_api_server/responses/helpers.py +74 -0
- agentpool_server/openai_api_server/responses/models.py +96 -0
- agentpool_server/openai_api_server/server.py +242 -0
- agentpool_server/py.typed +0 -0
- agentpool_storage/__init__.py +9 -0
- agentpool_storage/base.py +310 -0
- agentpool_storage/file_provider.py +378 -0
- agentpool_storage/formatters.py +129 -0
- agentpool_storage/memory_provider.py +396 -0
- agentpool_storage/models.py +108 -0
- agentpool_storage/py.typed +0 -0
- agentpool_storage/session_store.py +262 -0
- agentpool_storage/sql_provider/__init__.py +21 -0
- agentpool_storage/sql_provider/cli.py +146 -0
- agentpool_storage/sql_provider/models.py +249 -0
- agentpool_storage/sql_provider/queries.py +15 -0
- agentpool_storage/sql_provider/sql_provider.py +444 -0
- agentpool_storage/sql_provider/utils.py +234 -0
- agentpool_storage/text_log_provider.py +275 -0
- agentpool_toolsets/__init__.py +15 -0
- agentpool_toolsets/builtin/__init__.py +33 -0
- agentpool_toolsets/builtin/agent_management.py +239 -0
- agentpool_toolsets/builtin/chain.py +288 -0
- agentpool_toolsets/builtin/code.py +398 -0
- agentpool_toolsets/builtin/debug.py +291 -0
- agentpool_toolsets/builtin/execution_environment.py +381 -0
- agentpool_toolsets/builtin/file_edit/__init__.py +11 -0
- agentpool_toolsets/builtin/file_edit/file_edit.py +747 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/__init__.py +5 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/example_usage.py +311 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/streaming_fuzzy_matcher.py +443 -0
- agentpool_toolsets/builtin/history.py +36 -0
- agentpool_toolsets/builtin/integration.py +85 -0
- agentpool_toolsets/builtin/skills.py +77 -0
- agentpool_toolsets/builtin/subagent_tools.py +324 -0
- agentpool_toolsets/builtin/tool_management.py +90 -0
- agentpool_toolsets/builtin/user_interaction.py +52 -0
- agentpool_toolsets/builtin/workers.py +128 -0
- agentpool_toolsets/composio_toolset.py +96 -0
- agentpool_toolsets/config_creation.py +192 -0
- agentpool_toolsets/entry_points.py +47 -0
- agentpool_toolsets/fsspec_toolset/__init__.py +7 -0
- agentpool_toolsets/fsspec_toolset/diagnostics.py +115 -0
- agentpool_toolsets/fsspec_toolset/grep.py +450 -0
- agentpool_toolsets/fsspec_toolset/helpers.py +631 -0
- agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py +249 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +1384 -0
- agentpool_toolsets/mcp_run_toolset.py +61 -0
- agentpool_toolsets/notifications.py +146 -0
- agentpool_toolsets/openapi.py +118 -0
- agentpool_toolsets/py.typed +0 -0
- agentpool_toolsets/search_toolset.py +202 -0
- agentpool_toolsets/semantic_memory_toolset.py +536 -0
- agentpool_toolsets/streaming_tools.py +265 -0
- agentpool_toolsets/vfs_toolset.py +124 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""MCP server management for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import base64
|
|
7
|
+
from contextlib import AsyncExitStack
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Self, cast
|
|
9
|
+
|
|
10
|
+
import anyio
|
|
11
|
+
from pydantic_ai import BinaryContent, BinaryImage, UsageLimits
|
|
12
|
+
|
|
13
|
+
from agentpool.log import get_logger
|
|
14
|
+
from agentpool.resource_providers import AggregatingResourceProvider, ResourceProvider
|
|
15
|
+
from agentpool.resource_providers.mcp_provider import MCPResourceProvider
|
|
16
|
+
from agentpool_config.mcp_server import BaseMCPServerConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from collections.abc import Sequence
|
|
21
|
+
from types import TracebackType
|
|
22
|
+
|
|
23
|
+
from mcp import types
|
|
24
|
+
from mcp.shared.context import RequestContext
|
|
25
|
+
from mcp.types import SamplingMessage
|
|
26
|
+
from pydantic_ai import UserContent
|
|
27
|
+
|
|
28
|
+
from agentpool_config.mcp_server import MCPServerConfig
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class MCPManager:
|
|
35
|
+
"""Manages MCP server connections and distributes resource providers."""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
name: str = "mcp",
|
|
40
|
+
owner: str | None = None,
|
|
41
|
+
servers: Sequence[MCPServerConfig | str] | None = None,
|
|
42
|
+
accessible_roots: list[str] | None = None,
|
|
43
|
+
) -> None:
|
|
44
|
+
self.name = name
|
|
45
|
+
self.owner = owner
|
|
46
|
+
self.servers: list[MCPServerConfig] = []
|
|
47
|
+
for server in servers or []:
|
|
48
|
+
self.add_server_config(server)
|
|
49
|
+
self.providers: list[MCPResourceProvider] = []
|
|
50
|
+
self.aggregating_provider = AggregatingResourceProvider(
|
|
51
|
+
providers=cast(list[ResourceProvider], self.providers),
|
|
52
|
+
name=f"{name}_aggregated",
|
|
53
|
+
)
|
|
54
|
+
self.exit_stack = AsyncExitStack()
|
|
55
|
+
self._accessible_roots = accessible_roots
|
|
56
|
+
|
|
57
|
+
def add_server_config(self, cfg: MCPServerConfig | str) -> None:
|
|
58
|
+
"""Add a new MCP server to the manager."""
|
|
59
|
+
resolved = BaseMCPServerConfig.from_string(cfg) if isinstance(cfg, str) else cfg
|
|
60
|
+
self.servers.append(resolved)
|
|
61
|
+
|
|
62
|
+
def __repr__(self) -> str:
|
|
63
|
+
return f"MCPManager(name={self.name!r}, servers={len(self.servers)})"
|
|
64
|
+
|
|
65
|
+
async def __aenter__(self) -> Self:
|
|
66
|
+
try:
|
|
67
|
+
if tasks := [self._setup_server(server) for server in self.servers]:
|
|
68
|
+
await asyncio.gather(*tasks)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
await self.__aexit__(type(e), e, e.__traceback__)
|
|
71
|
+
msg = "Failed to initialize MCP manager"
|
|
72
|
+
raise RuntimeError(msg) from e
|
|
73
|
+
|
|
74
|
+
return self
|
|
75
|
+
|
|
76
|
+
async def __aexit__(
|
|
77
|
+
self,
|
|
78
|
+
exc_type: type[BaseException] | None,
|
|
79
|
+
exc_val: BaseException | None,
|
|
80
|
+
exc_tb: TracebackType | None,
|
|
81
|
+
) -> None:
|
|
82
|
+
await self.cleanup()
|
|
83
|
+
|
|
84
|
+
async def _sampling_callback(
|
|
85
|
+
self,
|
|
86
|
+
messages: list[SamplingMessage],
|
|
87
|
+
params: types.CreateMessageRequestParams,
|
|
88
|
+
context: RequestContext[Any, Any, Any],
|
|
89
|
+
) -> str:
|
|
90
|
+
"""Handle MCP sampling by creating a new agent with specified preferences."""
|
|
91
|
+
from mcp import types
|
|
92
|
+
|
|
93
|
+
from agentpool.agents import Agent
|
|
94
|
+
|
|
95
|
+
# Convert messages to prompts for the agent
|
|
96
|
+
prompts: list[UserContent] = []
|
|
97
|
+
for mcp_msg in messages:
|
|
98
|
+
match mcp_msg.content:
|
|
99
|
+
case types.TextContent(text=text):
|
|
100
|
+
prompts.append(text)
|
|
101
|
+
case types.ImageContent(data=data, mimeType=mime_type):
|
|
102
|
+
binary_data = base64.b64decode(data)
|
|
103
|
+
prompts.append(BinaryImage(data=binary_data, media_type=mime_type))
|
|
104
|
+
case types.AudioContent(data=data, mimeType=mime_type):
|
|
105
|
+
binary_data = base64.b64decode(data)
|
|
106
|
+
prompts.append(BinaryContent(data=binary_data, media_type=mime_type))
|
|
107
|
+
|
|
108
|
+
# Extract model from preferences
|
|
109
|
+
model = None
|
|
110
|
+
if (prefs := params.modelPreferences) and prefs.hints and prefs.hints[0].name:
|
|
111
|
+
model = prefs.hints[0].name
|
|
112
|
+
# Create usage limits from sampling parameters
|
|
113
|
+
limits = UsageLimits(output_tokens_limit=params.maxTokens, request_limit=1)
|
|
114
|
+
# TODO: Apply temperature from params.temperature
|
|
115
|
+
sys_prompt = params.systemPrompt or ""
|
|
116
|
+
agent = Agent(name="sampling-agent", model=model, system_prompt=sys_prompt, session=False)
|
|
117
|
+
try:
|
|
118
|
+
async with agent:
|
|
119
|
+
result = await agent.run(*prompts, store_history=False, usage_limits=limits)
|
|
120
|
+
return result.content
|
|
121
|
+
|
|
122
|
+
except Exception as e:
|
|
123
|
+
logger.exception("Sampling failed")
|
|
124
|
+
return f"Sampling failed: {e!s}"
|
|
125
|
+
|
|
126
|
+
async def _setup_server(self, config: MCPServerConfig) -> None:
|
|
127
|
+
"""Set up a single MCP server resource provider."""
|
|
128
|
+
if not config.enabled:
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
provider = MCPResourceProvider(
|
|
132
|
+
server=config,
|
|
133
|
+
name=f"{self.name}_{config.client_id}",
|
|
134
|
+
owner=self.owner,
|
|
135
|
+
source="pool" if self.owner == "pool" else "node",
|
|
136
|
+
sampling_callback=self._sampling_callback,
|
|
137
|
+
accessible_roots=self._accessible_roots,
|
|
138
|
+
)
|
|
139
|
+
provider = await self.exit_stack.enter_async_context(provider)
|
|
140
|
+
self.providers.append(provider)
|
|
141
|
+
|
|
142
|
+
def get_mcp_providers(self) -> list[MCPResourceProvider]:
|
|
143
|
+
"""Get all MCP resource providers managed by this manager."""
|
|
144
|
+
return list(self.providers)
|
|
145
|
+
|
|
146
|
+
def get_aggregating_provider(self) -> AggregatingResourceProvider:
|
|
147
|
+
"""Get the aggregating provider that contains all MCP providers."""
|
|
148
|
+
return self.aggregating_provider
|
|
149
|
+
|
|
150
|
+
async def setup_server_runtime(self, config: MCPServerConfig) -> MCPResourceProvider:
|
|
151
|
+
"""Set up a single MCP server at runtime while manager is running.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
The newly created and initialized MCPResourceProvider
|
|
155
|
+
"""
|
|
156
|
+
if not config.enabled:
|
|
157
|
+
msg = f"Server config {config.client_id} is disabled"
|
|
158
|
+
raise ValueError(msg)
|
|
159
|
+
|
|
160
|
+
# Add the config first
|
|
161
|
+
self.add_server_config(config)
|
|
162
|
+
provider = MCPResourceProvider(
|
|
163
|
+
server=config,
|
|
164
|
+
name=f"{self.name}_{config.client_id}",
|
|
165
|
+
owner=self.owner,
|
|
166
|
+
source="pool" if self.owner == "pool" else "node",
|
|
167
|
+
sampling_callback=self._sampling_callback,
|
|
168
|
+
accessible_roots=self._accessible_roots,
|
|
169
|
+
)
|
|
170
|
+
provider = await self.exit_stack.enter_async_context(provider)
|
|
171
|
+
self.providers.append(provider)
|
|
172
|
+
# Note: AggregatingResourceProvider automatically sees the new provider
|
|
173
|
+
# since it references self.providers list
|
|
174
|
+
|
|
175
|
+
return provider
|
|
176
|
+
|
|
177
|
+
async def cleanup(self) -> None:
|
|
178
|
+
"""Clean up all MCP connections and providers."""
|
|
179
|
+
try:
|
|
180
|
+
try:
|
|
181
|
+
# Clean up exit stack (which includes MCP providers)
|
|
182
|
+
await self.exit_stack.aclose()
|
|
183
|
+
except RuntimeError as e:
|
|
184
|
+
if "different task" in str(e):
|
|
185
|
+
# Handle task context mismatch
|
|
186
|
+
current_task = asyncio.current_task()
|
|
187
|
+
if current_task:
|
|
188
|
+
loop = asyncio.get_running_loop()
|
|
189
|
+
await loop.create_task(self.exit_stack.aclose())
|
|
190
|
+
else:
|
|
191
|
+
raise
|
|
192
|
+
|
|
193
|
+
self.providers.clear()
|
|
194
|
+
|
|
195
|
+
except Exception as e:
|
|
196
|
+
msg = "Error during MCP manager cleanup"
|
|
197
|
+
logger.exception(msg, exc_info=e)
|
|
198
|
+
raise RuntimeError(msg) from e
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def active_servers(self) -> list[str]:
|
|
202
|
+
"""Get IDs of active servers."""
|
|
203
|
+
return [provider.server.client_id for provider in self.providers]
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
if __name__ == "__main__":
|
|
207
|
+
from agentpool_config.mcp_server import StdioMCPServerConfig
|
|
208
|
+
|
|
209
|
+
cfg = StdioMCPServerConfig(
|
|
210
|
+
command="uv",
|
|
211
|
+
args=["run", "/home/phil65/dev/oss/agentpool/tests/mcp_server/server.py"],
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
async def main() -> None:
|
|
215
|
+
manager = MCPManager(servers=[cfg])
|
|
216
|
+
async with manager:
|
|
217
|
+
providers = manager.get_mcp_providers()
|
|
218
|
+
print(f"Found {len(providers)} providers")
|
|
219
|
+
provider = providers[0]
|
|
220
|
+
prompts = await provider.get_prompts()
|
|
221
|
+
print(f"Found prompts: {prompts}")
|
|
222
|
+
# Test static prompt (no arguments)
|
|
223
|
+
static_prompt = next(p for p in prompts if p.name == "static_prompt")
|
|
224
|
+
print(f"\n--- Testing static prompt: {static_prompt} ---")
|
|
225
|
+
components = await static_prompt.get_components()
|
|
226
|
+
assert components, "No prompt components found"
|
|
227
|
+
print(f"Found {len(components)} prompt components:")
|
|
228
|
+
for i, component in enumerate(components):
|
|
229
|
+
comp_type = type(component).__name__
|
|
230
|
+
print(f" {i + 1}. {comp_type}: {component.content}")
|
|
231
|
+
|
|
232
|
+
anyio.run(main)
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""FastMCP message handler for agentpool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from agentpool.log import get_logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Awaitable, Callable
|
|
13
|
+
|
|
14
|
+
from mcp.shared.session import RequestResponder
|
|
15
|
+
import mcp.types
|
|
16
|
+
|
|
17
|
+
from agentpool.mcp_server import MCPClient
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class MCPMessageHandler:
|
|
24
|
+
"""Custom message handler that bridges FastMCP to agentpool notifications."""
|
|
25
|
+
|
|
26
|
+
client: MCPClient
|
|
27
|
+
"""The MCP client instance."""
|
|
28
|
+
tool_change_callback: Callable[[], Awaitable[None]] | None = None
|
|
29
|
+
"""Tool change callback."""
|
|
30
|
+
prompt_change_callback: Callable[[], Awaitable[None]] | None = None
|
|
31
|
+
"""Prompt change callback."""
|
|
32
|
+
resource_change_callback: Callable[[], Awaitable[None]] | None = None
|
|
33
|
+
"""Resource change callback."""
|
|
34
|
+
|
|
35
|
+
async def __call__(
|
|
36
|
+
self,
|
|
37
|
+
message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
|
|
38
|
+
| mcp.types.ServerNotification
|
|
39
|
+
| Exception,
|
|
40
|
+
) -> None:
|
|
41
|
+
"""Handle FastMCP messages by dispatching to appropriate handlers."""
|
|
42
|
+
from mcp.shared.session import RequestResponder
|
|
43
|
+
import mcp.types
|
|
44
|
+
|
|
45
|
+
await self.on_message(message)
|
|
46
|
+
match message:
|
|
47
|
+
# requests
|
|
48
|
+
case RequestResponder() as responder:
|
|
49
|
+
await self.on_request(responder)
|
|
50
|
+
# Handle specific requests
|
|
51
|
+
root = responder.request.root
|
|
52
|
+
match root:
|
|
53
|
+
case mcp.types.PingRequest():
|
|
54
|
+
await self.on_ping(root)
|
|
55
|
+
case mcp.types.ListRootsRequest():
|
|
56
|
+
await self.on_list_roots(root)
|
|
57
|
+
case mcp.types.CreateMessageRequest():
|
|
58
|
+
await self.on_create_message(root)
|
|
59
|
+
|
|
60
|
+
case mcp.types.ServerNotification() as notification:
|
|
61
|
+
await self.on_notification(notification)
|
|
62
|
+
root = notification.root
|
|
63
|
+
match root:
|
|
64
|
+
case mcp.types.CancelledNotification():
|
|
65
|
+
await self.on_cancelled(root)
|
|
66
|
+
case mcp.types.ProgressNotification():
|
|
67
|
+
await self.on_progress(root)
|
|
68
|
+
case mcp.types.LoggingMessageNotification():
|
|
69
|
+
await self.on_logging_message(root)
|
|
70
|
+
case mcp.types.ToolListChangedNotification():
|
|
71
|
+
await self.on_tool_list_changed(root)
|
|
72
|
+
case mcp.types.ResourceListChangedNotification():
|
|
73
|
+
await self.on_resource_list_changed(root)
|
|
74
|
+
case mcp.types.PromptListChangedNotification():
|
|
75
|
+
await self.on_prompt_list_changed(root)
|
|
76
|
+
case mcp.types.ResourceUpdatedNotification():
|
|
77
|
+
await self.on_resource_updated(root)
|
|
78
|
+
case mcp.types.ElicitCompleteNotification():
|
|
79
|
+
await self.on_elicit_complete(root)
|
|
80
|
+
|
|
81
|
+
case Exception():
|
|
82
|
+
await self.on_exception(message)
|
|
83
|
+
|
|
84
|
+
async def on_message(
|
|
85
|
+
self,
|
|
86
|
+
message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
|
|
87
|
+
| mcp.types.ServerNotification
|
|
88
|
+
| Exception,
|
|
89
|
+
) -> None:
|
|
90
|
+
"""Handle generic messages."""
|
|
91
|
+
|
|
92
|
+
async def on_request(
|
|
93
|
+
self, message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Handle requests."""
|
|
96
|
+
|
|
97
|
+
async def on_notification(self, message: mcp.types.ServerNotification) -> None:
|
|
98
|
+
"""Handle server notifications."""
|
|
99
|
+
|
|
100
|
+
async def on_tool_list_changed(self, message: mcp.types.ToolListChangedNotification) -> None:
|
|
101
|
+
"""Handle tool list changes."""
|
|
102
|
+
logger.info("MCP tool list changed", message=message)
|
|
103
|
+
# Call the tool change callback if provided
|
|
104
|
+
if self.tool_change_callback:
|
|
105
|
+
await self.tool_change_callback()
|
|
106
|
+
|
|
107
|
+
async def on_resource_list_changed(
|
|
108
|
+
self, message: mcp.types.ResourceListChangedNotification
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Handle resource list changes."""
|
|
111
|
+
logger.info("MCP resource list changed", message=message)
|
|
112
|
+
# Call the resource change callback if provided
|
|
113
|
+
if self.resource_change_callback:
|
|
114
|
+
await self.resource_change_callback()
|
|
115
|
+
|
|
116
|
+
async def on_resource_updated(self, message: mcp.types.ResourceUpdatedNotification) -> None:
|
|
117
|
+
"""Handle resource updates."""
|
|
118
|
+
# ResourceUpdatedNotification has uri directly, not in params
|
|
119
|
+
logger.info("MCP resource updated", uri=getattr(message, "uri", "unknown"))
|
|
120
|
+
|
|
121
|
+
async def on_progress(self, message: mcp.types.ProgressNotification) -> None:
|
|
122
|
+
"""Handle progress notifications with proper context."""
|
|
123
|
+
# Note: Progress notifications from MCP servers are now handled per-tool-call
|
|
124
|
+
# with the contextual progress handler, so global notifications are ignored
|
|
125
|
+
|
|
126
|
+
async def on_prompt_list_changed(
|
|
127
|
+
self, message: mcp.types.PromptListChangedNotification
|
|
128
|
+
) -> None:
|
|
129
|
+
"""Handle prompt list changes."""
|
|
130
|
+
logger.info("MCP prompt list changed", message=message)
|
|
131
|
+
# Call the prompt change callback if provided
|
|
132
|
+
if self.prompt_change_callback:
|
|
133
|
+
await self.prompt_change_callback()
|
|
134
|
+
|
|
135
|
+
async def on_cancelled(self, message: mcp.types.CancelledNotification) -> None:
|
|
136
|
+
"""Handle cancelled operations."""
|
|
137
|
+
logger.info("MCP operation cancelled", message=message)
|
|
138
|
+
|
|
139
|
+
async def on_logging_message(self, message: mcp.types.LoggingMessageNotification) -> None:
|
|
140
|
+
"""Handle server log messages."""
|
|
141
|
+
# This is handled by _log_handler, but keep for completeness
|
|
142
|
+
|
|
143
|
+
async def on_exception(self, message: Exception) -> None:
|
|
144
|
+
"""Handle exceptions."""
|
|
145
|
+
logger.error("MCP client exception", error=message)
|
|
146
|
+
|
|
147
|
+
async def on_ping(self, message: mcp.types.PingRequest) -> None:
|
|
148
|
+
"""Handle ping requests."""
|
|
149
|
+
|
|
150
|
+
async def on_list_roots(self, message: mcp.types.ListRootsRequest) -> None:
|
|
151
|
+
"""Handle list roots requests."""
|
|
152
|
+
|
|
153
|
+
async def on_create_message(self, message: mcp.types.CreateMessageRequest) -> None:
|
|
154
|
+
"""Handle create message requests."""
|
|
155
|
+
|
|
156
|
+
async def on_elicit_complete(self, message: mcp.types.ElicitCompleteNotification) -> None:
|
|
157
|
+
"""Handle elicitation completion notifications.
|
|
158
|
+
|
|
159
|
+
Sent by servers when a URL mode elicitation completes out-of-band.
|
|
160
|
+
"""
|
|
161
|
+
logger.info(
|
|
162
|
+
"MCP elicitation completed",
|
|
163
|
+
elicitation_id=message.params.elicitationId,
|
|
164
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""MCP registry clients."""
|