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,345 @@
|
|
|
1
|
+
"""MCP Registry client service for discovering and managing MCP servers.
|
|
2
|
+
|
|
3
|
+
This module provides functionality to interact with the Model Context Protocol
|
|
4
|
+
registry API for server discovery and configuration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
import logging
|
|
11
|
+
import time
|
|
12
|
+
from typing import Any, Literal, Self
|
|
13
|
+
|
|
14
|
+
import anyio
|
|
15
|
+
import httpx
|
|
16
|
+
from pydantic import Field
|
|
17
|
+
from schemez import Schema
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Constants
|
|
21
|
+
HTTP_NOT_FOUND = 404
|
|
22
|
+
CACHE_TTL = 3600 # 1 hour
|
|
23
|
+
NAME = "io.modelcontextprotocol.registry/official"
|
|
24
|
+
|
|
25
|
+
ServiceName = str
|
|
26
|
+
log = logging.getLogger(__name__)
|
|
27
|
+
TransportType = Literal["stdio", "sse", "websocket", "http"]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class UnsupportedTransportError(Exception):
|
|
31
|
+
"""Raised when no supported transport is available."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class RegistryRepository(Schema):
|
|
35
|
+
"""Repository information for a registry server."""
|
|
36
|
+
|
|
37
|
+
url: str | None = None
|
|
38
|
+
source: str | None = None
|
|
39
|
+
"""Repository platform (e.g., 'github')."""
|
|
40
|
+
|
|
41
|
+
subfolder: str | None = None
|
|
42
|
+
"""Repository subfolder path."""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class RegistryTransport(Schema):
|
|
46
|
+
"""Transport configuration for a package."""
|
|
47
|
+
|
|
48
|
+
type: str
|
|
49
|
+
"""Transport type (stdio, sse, streamable-http)."""
|
|
50
|
+
|
|
51
|
+
url: str | None = None
|
|
52
|
+
"""URL for HTTP transports."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class RegistryPackage(Schema):
|
|
56
|
+
"""Package information for installing an MCP server."""
|
|
57
|
+
|
|
58
|
+
registry_type: str = Field(alias="registryType")
|
|
59
|
+
"""Package registry type (npm, pypi, docker)."""
|
|
60
|
+
|
|
61
|
+
identifier: str
|
|
62
|
+
"""Package identifier."""
|
|
63
|
+
|
|
64
|
+
version: str | None = None
|
|
65
|
+
"""Package version."""
|
|
66
|
+
|
|
67
|
+
transport: RegistryTransport
|
|
68
|
+
"""Transport configuration."""
|
|
69
|
+
|
|
70
|
+
environment_variables: list[dict[str, Any]] = Field(
|
|
71
|
+
default_factory=list, alias="environmentVariables"
|
|
72
|
+
)
|
|
73
|
+
"""Environment variables."""
|
|
74
|
+
|
|
75
|
+
package_arguments: list[dict[str, Any]] = Field(default_factory=list, alias="packageArguments")
|
|
76
|
+
"""Package arguments."""
|
|
77
|
+
|
|
78
|
+
runtime_hint: str | None = Field(None, alias="runtimeHint")
|
|
79
|
+
"""Runtime hint."""
|
|
80
|
+
|
|
81
|
+
registry_base_url: str | None = Field(None, alias="registryBaseUrl")
|
|
82
|
+
"""Registry base URL."""
|
|
83
|
+
|
|
84
|
+
file_sha256: str | None = Field(None, alias="fileSha256")
|
|
85
|
+
"""File SHA256 hash."""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class RegistryRemote(Schema):
|
|
89
|
+
"""Remote endpoint configuration."""
|
|
90
|
+
|
|
91
|
+
type: str
|
|
92
|
+
"""Remote type (sse, streamable-http)."""
|
|
93
|
+
|
|
94
|
+
url: str
|
|
95
|
+
"""Remote URL."""
|
|
96
|
+
|
|
97
|
+
headers: list[dict[str, Any]] = Field(default_factory=list)
|
|
98
|
+
"""Request headers."""
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class RegistryServer(Schema):
|
|
102
|
+
"""MCP server entry from the registry."""
|
|
103
|
+
|
|
104
|
+
name: ServiceName
|
|
105
|
+
"""Unique server identifier."""
|
|
106
|
+
|
|
107
|
+
description: str
|
|
108
|
+
"""Server description."""
|
|
109
|
+
|
|
110
|
+
version: str
|
|
111
|
+
"""Server version."""
|
|
112
|
+
|
|
113
|
+
repository: RegistryRepository
|
|
114
|
+
"""Repository information."""
|
|
115
|
+
|
|
116
|
+
packages: list[RegistryPackage] = Field(default_factory=list)
|
|
117
|
+
"""Available packages."""
|
|
118
|
+
|
|
119
|
+
remotes: list[RegistryRemote] = Field(default_factory=list)
|
|
120
|
+
"""Remote endpoints."""
|
|
121
|
+
|
|
122
|
+
schema_: str | None = Field(None, alias="$schema")
|
|
123
|
+
"""JSON schema URL."""
|
|
124
|
+
|
|
125
|
+
def get_preferred_transport(self) -> TransportType:
|
|
126
|
+
"""Select optimal transport method based on availability and performance."""
|
|
127
|
+
# Prefer local packages for better performance/security
|
|
128
|
+
for package in self.packages:
|
|
129
|
+
if package.registry_type in ["docker", "oci"]: # OCI containers
|
|
130
|
+
return "stdio"
|
|
131
|
+
|
|
132
|
+
# Fallback to remote endpoints
|
|
133
|
+
for remote in self.remotes:
|
|
134
|
+
if remote.type == "sse":
|
|
135
|
+
return "sse"
|
|
136
|
+
if remote.type in ["streamable-http", "http"]:
|
|
137
|
+
return "http"
|
|
138
|
+
if remote.type == "websocket":
|
|
139
|
+
return "websocket"
|
|
140
|
+
|
|
141
|
+
# Provide helpful error message
|
|
142
|
+
available_transports = []
|
|
143
|
+
if self.packages:
|
|
144
|
+
available_transports.extend([f"package:{pkg.registry_type}" for pkg in self.packages])
|
|
145
|
+
if self.remotes:
|
|
146
|
+
available_transports.extend([f"remote:{remote.type}" for remote in self.remotes])
|
|
147
|
+
|
|
148
|
+
if available_transports:
|
|
149
|
+
error_msg = (
|
|
150
|
+
f"No supported transport for {self.name}. "
|
|
151
|
+
f"Available: {available_transports}. "
|
|
152
|
+
f"Supported: docker packages, sse/streamable-http/websocket remotes"
|
|
153
|
+
)
|
|
154
|
+
else:
|
|
155
|
+
error_msg = (
|
|
156
|
+
f"No transports available for {self.name}. Server metadata may be incomplete"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
raise UnsupportedTransportError(error_msg)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class RegistryServerWrapper(Schema):
|
|
163
|
+
"""Wrapper for server data from the official registry API."""
|
|
164
|
+
|
|
165
|
+
server: RegistryServer
|
|
166
|
+
"""The actual server data."""
|
|
167
|
+
|
|
168
|
+
meta: dict[str, Any] = Field(default_factory=dict, alias="_meta")
|
|
169
|
+
"""Registry metadata."""
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class RegistryListResponse(Schema):
|
|
173
|
+
"""Response from the registry list servers endpoint."""
|
|
174
|
+
|
|
175
|
+
servers: list[RegistryServerWrapper]
|
|
176
|
+
"""List of wrapped server entries."""
|
|
177
|
+
|
|
178
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
179
|
+
"""Response metadata."""
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@dataclass(slots=True)
|
|
183
|
+
class ListServersCacheEntry:
|
|
184
|
+
"""Cache entry for list_servers results."""
|
|
185
|
+
|
|
186
|
+
servers: list[RegistryServer]
|
|
187
|
+
timestamp: float
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
@dataclass(slots=True)
|
|
191
|
+
class GetServerCacheEntry:
|
|
192
|
+
"""Cache entry for get_server results."""
|
|
193
|
+
|
|
194
|
+
server: RegistryServer
|
|
195
|
+
timestamp: float
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class MCPRegistryClient:
|
|
199
|
+
"""Client for interacting with the MCP registry API."""
|
|
200
|
+
|
|
201
|
+
def __init__(self, base_url: str = "https://registry.modelcontextprotocol.io") -> None:
|
|
202
|
+
self.base_url = base_url.rstrip("/")
|
|
203
|
+
self.client = httpx.AsyncClient(timeout=30.0)
|
|
204
|
+
self._cache_lists: dict[str, ListServersCacheEntry] = {}
|
|
205
|
+
self._cache_servers: dict[str, GetServerCacheEntry] = {}
|
|
206
|
+
|
|
207
|
+
async def list_servers(
|
|
208
|
+
self, search: str | None = None, status: str = "active"
|
|
209
|
+
) -> list[RegistryServer]:
|
|
210
|
+
"""List servers from registry with optional filtering."""
|
|
211
|
+
cache_key = f"list_servers:{search}:{status}"
|
|
212
|
+
|
|
213
|
+
# Check cache first
|
|
214
|
+
if cache_key in self._cache_lists:
|
|
215
|
+
cached_entry = self._cache_lists[cache_key]
|
|
216
|
+
if time.time() - cached_entry.timestamp < CACHE_TTL:
|
|
217
|
+
log.debug("Using cached server list")
|
|
218
|
+
return cached_entry.servers
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
log.info("Fetching server list from registry")
|
|
222
|
+
response = await self.client.get(f"{self.base_url}/v0/servers")
|
|
223
|
+
response.raise_for_status()
|
|
224
|
+
data = response.json()
|
|
225
|
+
except httpx.HTTPError as e:
|
|
226
|
+
msg = f"Failed to list servers: {e}"
|
|
227
|
+
raise MCPRegistryError(msg) from e
|
|
228
|
+
else:
|
|
229
|
+
data = RegistryListResponse(**data)
|
|
230
|
+
if status: # Filter by status from metadata
|
|
231
|
+
wrappers = [w for w in data.servers if w.meta.get(NAME, {}).get("status") == status]
|
|
232
|
+
else:
|
|
233
|
+
wrappers = data.servers
|
|
234
|
+
servers = [wrapper.server for wrapper in wrappers]
|
|
235
|
+
if search: # Filter by search term
|
|
236
|
+
lower = search.lower()
|
|
237
|
+
servers = [s for s in servers if lower in s.name.lower() + s.description.lower()]
|
|
238
|
+
# Cache the result
|
|
239
|
+
ts = time.time()
|
|
240
|
+
self._cache_lists[cache_key] = ListServersCacheEntry(servers=servers, timestamp=ts)
|
|
241
|
+
log.info("Successfully fetched %d servers", len(servers))
|
|
242
|
+
return servers
|
|
243
|
+
|
|
244
|
+
async def get_server(self, server_id: str) -> RegistryServer:
|
|
245
|
+
"""Get full server details including packages."""
|
|
246
|
+
cache_key = f"server:{server_id}"
|
|
247
|
+
# Check cache first
|
|
248
|
+
if cache_key in self._cache_servers:
|
|
249
|
+
cached_entry = self._cache_servers[cache_key]
|
|
250
|
+
if time.time() - cached_entry.timestamp < CACHE_TTL:
|
|
251
|
+
log.debug("Using cached server details for %s", server_id)
|
|
252
|
+
return cached_entry.server
|
|
253
|
+
|
|
254
|
+
log.info("Fetching server details for %s", server_id)
|
|
255
|
+
try:
|
|
256
|
+
# Get all wrappers to access metadata
|
|
257
|
+
response = await self.client.get(f"{self.base_url}/v0/servers")
|
|
258
|
+
response.raise_for_status()
|
|
259
|
+
data = response.json()
|
|
260
|
+
response_data = RegistryListResponse(**data)
|
|
261
|
+
# Find server by name
|
|
262
|
+
target_wrapper = None
|
|
263
|
+
for wrapper in response_data.servers:
|
|
264
|
+
if wrapper.server.name == server_id:
|
|
265
|
+
target_wrapper = wrapper
|
|
266
|
+
break
|
|
267
|
+
|
|
268
|
+
if not target_wrapper:
|
|
269
|
+
msg = f"Server {server_id!r} not found in registry"
|
|
270
|
+
raise MCPRegistryError(msg)
|
|
271
|
+
# Get the UUID from metadata
|
|
272
|
+
server_uuid = target_wrapper.meta.get(NAME, {}).get("id")
|
|
273
|
+
if not server_uuid:
|
|
274
|
+
msg = f"No UUID found for server {server_id!r}"
|
|
275
|
+
raise MCPRegistryError(msg)
|
|
276
|
+
# Now fetch the full server details using UUID
|
|
277
|
+
response = await self.client.get(f"{self.base_url}/v0/servers/{server_uuid}")
|
|
278
|
+
response.raise_for_status()
|
|
279
|
+
server_data = response.json()
|
|
280
|
+
except httpx.HTTPStatusError as e:
|
|
281
|
+
if e.response.status_code == HTTP_NOT_FOUND:
|
|
282
|
+
msg = f"Server {server_id!r} not found in registry"
|
|
283
|
+
raise MCPRegistryError(msg) from e
|
|
284
|
+
msg = f"Failed to get server details: {e}"
|
|
285
|
+
raise MCPRegistryError(msg) from e
|
|
286
|
+
except (httpx.HTTPError, ValueError, KeyError) as e:
|
|
287
|
+
msg = f"Failed to get server details: {e}"
|
|
288
|
+
raise MCPRegistryError(msg) from e
|
|
289
|
+
else:
|
|
290
|
+
server = RegistryServer(**server_data)
|
|
291
|
+
ts = time.time()
|
|
292
|
+
self._cache_servers[cache_key] = GetServerCacheEntry(server=server, timestamp=ts)
|
|
293
|
+
log.info("Successfully fetched server details for %s", server_id)
|
|
294
|
+
return server
|
|
295
|
+
|
|
296
|
+
def clear_cache(self) -> None:
|
|
297
|
+
"""Clear the metadata cache."""
|
|
298
|
+
self._cache_lists.clear()
|
|
299
|
+
self._cache_servers.clear()
|
|
300
|
+
log.debug("Cleared metadata cache")
|
|
301
|
+
|
|
302
|
+
async def close(self) -> None:
|
|
303
|
+
"""Close the HTTP client."""
|
|
304
|
+
await self.client.aclose()
|
|
305
|
+
log.debug("Closed HTTP client")
|
|
306
|
+
|
|
307
|
+
async def __aenter__(self) -> Self:
|
|
308
|
+
return self
|
|
309
|
+
|
|
310
|
+
async def __aexit__(self, *args: object) -> None:
|
|
311
|
+
await self.close()
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
class MCPRegistryError(Exception):
|
|
315
|
+
"""Exception raised for MCP registry operations."""
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
if __name__ == "__main__":
|
|
319
|
+
|
|
320
|
+
async def main() -> None:
|
|
321
|
+
"""Test the MCP registry client with caching and transport resolution."""
|
|
322
|
+
async with MCPRegistryClient() as client:
|
|
323
|
+
print("Listing servers from official registry...")
|
|
324
|
+
servers = await client.list_servers()
|
|
325
|
+
print(f"Found {len(servers)} servers")
|
|
326
|
+
|
|
327
|
+
# Test transport resolution for first few servers
|
|
328
|
+
for server in servers[:3]:
|
|
329
|
+
print(f"\n=== {server.name} ===")
|
|
330
|
+
try:
|
|
331
|
+
transport = server.get_preferred_transport()
|
|
332
|
+
print(f"Preferred transport: {transport}")
|
|
333
|
+
|
|
334
|
+
# Show available transports
|
|
335
|
+
if server.packages:
|
|
336
|
+
print(f"Packages: {[p.registry_type for p in server.packages]}")
|
|
337
|
+
if server.remotes:
|
|
338
|
+
print(f"Remotes: {[r.type for r in server.remotes]}")
|
|
339
|
+
|
|
340
|
+
except UnsupportedTransportError as e:
|
|
341
|
+
print(f"Transport error: {e}")
|
|
342
|
+
|
|
343
|
+
print(server)
|
|
344
|
+
|
|
345
|
+
anyio.run(main)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""Functions to discover available MCP servers from PulseMCP."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
import anyenv
|
|
8
|
+
from pydantic import Field
|
|
9
|
+
from schemez import Schema
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Remote(Schema):
|
|
13
|
+
"""Information about a remote MCP server endpoint."""
|
|
14
|
+
|
|
15
|
+
url_direct: str | None = None
|
|
16
|
+
url_setup: str | None = None
|
|
17
|
+
transport: Literal["streamable_http", "sse"] | None = None
|
|
18
|
+
authentication_method: str | None = None
|
|
19
|
+
cost: str | None = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ServerInfo(Schema):
|
|
23
|
+
"""Information about an MCP server."""
|
|
24
|
+
|
|
25
|
+
name: str
|
|
26
|
+
url: str
|
|
27
|
+
external_url: str | None = None
|
|
28
|
+
short_description: str
|
|
29
|
+
source_code_url: str | None = None
|
|
30
|
+
github_stars: int | None = Field(default=None)
|
|
31
|
+
package_registry: str | None = None
|
|
32
|
+
package_name: str | None = None
|
|
33
|
+
package_download_count: int | None = Field(default=None)
|
|
34
|
+
ai_generated_description: str | None = Field(
|
|
35
|
+
default=None, alias="EXPERIMENTAL_ai_generated_description"
|
|
36
|
+
)
|
|
37
|
+
remotes: list[Remote] = Field(default_factory=list)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ServerListResponse(Schema):
|
|
41
|
+
"""Response from the MCP server list endpoint."""
|
|
42
|
+
|
|
43
|
+
servers: list[ServerInfo]
|
|
44
|
+
next: str | None = None
|
|
45
|
+
total_count: int
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def get_mcp_servers(
|
|
49
|
+
query: str | None = None,
|
|
50
|
+
count_per_page: int | None = None,
|
|
51
|
+
offset: int | None = None,
|
|
52
|
+
) -> list[ServerInfo]:
|
|
53
|
+
"""Fetch all available MCP servers.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
query: Optional query string to filter the results.
|
|
57
|
+
count_per_page: Optional number of results to return per page.
|
|
58
|
+
offset: Optional offset for pagination.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
List of ServerInfo objects representing available MCP servers.
|
|
62
|
+
|
|
63
|
+
Raises:
|
|
64
|
+
HTTPError: If the API request fails.
|
|
65
|
+
"""
|
|
66
|
+
params: dict[str, Any] = {}
|
|
67
|
+
if query:
|
|
68
|
+
params["query"] = query
|
|
69
|
+
if count_per_page is not None:
|
|
70
|
+
params["count_per_page"] = count_per_page
|
|
71
|
+
if offset is not None:
|
|
72
|
+
params["offset"] = offset
|
|
73
|
+
result = await anyenv.get_json(
|
|
74
|
+
"https://api.pulsemcp.com/v0beta/servers",
|
|
75
|
+
headers={"User-Agent": "MCPToolDiscovery/1.0"},
|
|
76
|
+
params=params,
|
|
77
|
+
return_type=ServerListResponse,
|
|
78
|
+
)
|
|
79
|
+
return result.servers
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
import asyncio
|
|
84
|
+
|
|
85
|
+
servers = asyncio.run(get_mcp_servers(count_per_page=100))
|
|
86
|
+
print(f"Found {len(servers)} MCP servers")
|
|
87
|
+
for server in servers:
|
|
88
|
+
print(server)
|