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
acp/schema/tool_call.py
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"""Tool call schema definitions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import base64
|
|
6
|
+
from collections.abc import Sequence # noqa: TC003
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Literal, Self
|
|
8
|
+
|
|
9
|
+
from pydantic import Field
|
|
10
|
+
|
|
11
|
+
from acp.schema.base import AnnotatedObject, Schema
|
|
12
|
+
from acp.schema.content_blocks import ( # noqa: TC001
|
|
13
|
+
Annotations,
|
|
14
|
+
Audience,
|
|
15
|
+
AudioContentBlock,
|
|
16
|
+
BlobResourceContents,
|
|
17
|
+
ContentBlock,
|
|
18
|
+
EmbeddedResourceContentBlock,
|
|
19
|
+
ImageContentBlock,
|
|
20
|
+
ResourceContentBlock,
|
|
21
|
+
TextContentBlock,
|
|
22
|
+
TextResourceContents,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from datetime import datetime
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
ToolCallKind = Literal[
|
|
31
|
+
"read",
|
|
32
|
+
"edit",
|
|
33
|
+
"delete",
|
|
34
|
+
"move",
|
|
35
|
+
"search",
|
|
36
|
+
"execute",
|
|
37
|
+
"think",
|
|
38
|
+
"fetch",
|
|
39
|
+
"switch_mode",
|
|
40
|
+
"other",
|
|
41
|
+
]
|
|
42
|
+
ToolCallStatus = Literal["pending", "in_progress", "completed", "failed"]
|
|
43
|
+
PermissionKind = Literal["allow_once", "allow_always", "reject_once", "reject_always"]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ToolCall(AnnotatedObject):
|
|
47
|
+
"""Details about the tool call requiring permission."""
|
|
48
|
+
|
|
49
|
+
content: Sequence[ToolCallContent] | None = None
|
|
50
|
+
"""Replace the content collection."""
|
|
51
|
+
|
|
52
|
+
kind: ToolCallKind | None = None
|
|
53
|
+
"""Update the tool kind."""
|
|
54
|
+
|
|
55
|
+
locations: Sequence[ToolCallLocation] | None = None
|
|
56
|
+
"""Replace the locations collection."""
|
|
57
|
+
|
|
58
|
+
raw_input: Any | None = None
|
|
59
|
+
"""Update the raw input."""
|
|
60
|
+
|
|
61
|
+
raw_output: Any | None = None
|
|
62
|
+
"""Update the raw output."""
|
|
63
|
+
|
|
64
|
+
status: ToolCallStatus | None = None
|
|
65
|
+
"""Update the execution status."""
|
|
66
|
+
|
|
67
|
+
title: str | None = None
|
|
68
|
+
"""Update the human-readable title."""
|
|
69
|
+
|
|
70
|
+
tool_call_id: str
|
|
71
|
+
"""The ID of the tool call being updated."""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class FileEditToolCallContent(AnnotatedObject):
|
|
75
|
+
"""File modification shown as a diff."""
|
|
76
|
+
|
|
77
|
+
type: Literal["diff"] = Field(default="diff", init=False)
|
|
78
|
+
"""File modification shown as a diff."""
|
|
79
|
+
|
|
80
|
+
new_text: str
|
|
81
|
+
"""The new content after modification."""
|
|
82
|
+
|
|
83
|
+
old_text: str | None
|
|
84
|
+
"""The original content (None for new files)."""
|
|
85
|
+
|
|
86
|
+
path: str
|
|
87
|
+
"""The file path being modified."""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class TerminalToolCallContent(Schema):
|
|
91
|
+
"""Embed a terminal created with `terminal/create` by its id.
|
|
92
|
+
|
|
93
|
+
The terminal must be added before calling `terminal/release`.
|
|
94
|
+
See protocol docs: [Terminal](https://agentclientprotocol.com/protocol/terminal)
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
type: Literal["terminal"] = Field(default="terminal", init=False)
|
|
98
|
+
"""Terminal tool call content."""
|
|
99
|
+
|
|
100
|
+
terminal_id: str
|
|
101
|
+
"""The ID of the terminal being embedded."""
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class ContentToolCallContent[TContentBlock: ContentBlock = ContentBlock](Schema):
|
|
105
|
+
"""Standard content block (text, images, resources)."""
|
|
106
|
+
|
|
107
|
+
type: Literal["content"] = Field(default="content", init=False)
|
|
108
|
+
"""Standard content block (text, images, resources)."""
|
|
109
|
+
|
|
110
|
+
content: TContentBlock
|
|
111
|
+
"""The actual content block."""
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def text(
|
|
115
|
+
cls,
|
|
116
|
+
text: str,
|
|
117
|
+
*,
|
|
118
|
+
audience: Audience | None = None,
|
|
119
|
+
last_modified: datetime | str | None = None,
|
|
120
|
+
priority: float | None = None,
|
|
121
|
+
) -> Self:
|
|
122
|
+
"""Create a ToolCallContent containing text.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
text: The text content.
|
|
126
|
+
audience: The audience for the text.
|
|
127
|
+
last_modified: The last modified date of the text.
|
|
128
|
+
priority: The priority of the text.
|
|
129
|
+
"""
|
|
130
|
+
annotations = Annotations.optionally_create(
|
|
131
|
+
audience=audience,
|
|
132
|
+
last_modified=last_modified,
|
|
133
|
+
priority=priority,
|
|
134
|
+
)
|
|
135
|
+
return cls(content=TextContentBlock(text=text, annotations=annotations))
|
|
136
|
+
|
|
137
|
+
@classmethod
|
|
138
|
+
def image(
|
|
139
|
+
cls,
|
|
140
|
+
data: str | bytes,
|
|
141
|
+
mime_type: str,
|
|
142
|
+
uri: str | None = None,
|
|
143
|
+
audience: Audience | None = None,
|
|
144
|
+
last_modified: datetime | str | None = None,
|
|
145
|
+
priority: float | None = None,
|
|
146
|
+
) -> Self:
|
|
147
|
+
"""Create a ToolCallContent containing an embedded image resource.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
data: The image data.
|
|
151
|
+
mime_type: The MIME type of the image.
|
|
152
|
+
uri: The URI of the image.
|
|
153
|
+
audience: The audience for the image.
|
|
154
|
+
last_modified: The last modified date of the image.
|
|
155
|
+
priority: The priority of the image.
|
|
156
|
+
"""
|
|
157
|
+
if isinstance(data, bytes):
|
|
158
|
+
data = base64.b64encode(data).decode()
|
|
159
|
+
annotations = Annotations.optionally_create(
|
|
160
|
+
audience=audience,
|
|
161
|
+
last_modified=last_modified,
|
|
162
|
+
priority=priority,
|
|
163
|
+
)
|
|
164
|
+
image = ImageContentBlock(data=data, mime_type=mime_type, uri=uri, annotations=annotations)
|
|
165
|
+
return cls(content=image)
|
|
166
|
+
|
|
167
|
+
@classmethod
|
|
168
|
+
def audio(
|
|
169
|
+
cls,
|
|
170
|
+
data: str | bytes,
|
|
171
|
+
mime_type: str,
|
|
172
|
+
audience: Audience | None = None,
|
|
173
|
+
last_modified: datetime | str | None = None,
|
|
174
|
+
priority: float | None = None,
|
|
175
|
+
) -> Self:
|
|
176
|
+
"""Create a ToolCallContent containing audio content.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
data: The audio data.
|
|
180
|
+
mime_type: The MIME type of the audio data.
|
|
181
|
+
audience: The audience for the audio chunk.
|
|
182
|
+
last_modified: The last modified date of the audio chunk.
|
|
183
|
+
priority: The priority of the audio chunk.
|
|
184
|
+
"""
|
|
185
|
+
if isinstance(data, bytes):
|
|
186
|
+
data = base64.b64encode(data).decode()
|
|
187
|
+
annotations = Annotations.optionally_create(
|
|
188
|
+
audience=audience,
|
|
189
|
+
last_modified=last_modified,
|
|
190
|
+
priority=priority,
|
|
191
|
+
)
|
|
192
|
+
content = AudioContentBlock(data=data, mime_type=mime_type, annotations=annotations)
|
|
193
|
+
return cls(content=content)
|
|
194
|
+
|
|
195
|
+
@classmethod
|
|
196
|
+
def resource(
|
|
197
|
+
cls,
|
|
198
|
+
name: str,
|
|
199
|
+
uri: str,
|
|
200
|
+
description: str | None = None,
|
|
201
|
+
mime_type: str | None = None,
|
|
202
|
+
size: int | None = None,
|
|
203
|
+
title: str | None = None,
|
|
204
|
+
audience: Audience | None = None,
|
|
205
|
+
last_modified: datetime | str | None = None,
|
|
206
|
+
priority: float | None = None,
|
|
207
|
+
) -> Self:
|
|
208
|
+
"""Create a ToolCallContent containing a resource content block.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
name: The name of the resource.
|
|
212
|
+
uri: The URI of the resource.
|
|
213
|
+
description: The description of the resource.
|
|
214
|
+
mime_type: The MIME type of the resource.
|
|
215
|
+
size: The size of the resource.
|
|
216
|
+
title: The title of the resource.
|
|
217
|
+
audience: The audience of the resource.
|
|
218
|
+
last_modified: The last modified date of the resource.
|
|
219
|
+
priority: The priority of the resource.
|
|
220
|
+
"""
|
|
221
|
+
annotations = Annotations.optionally_create(
|
|
222
|
+
audience=audience,
|
|
223
|
+
last_modified=last_modified,
|
|
224
|
+
priority=priority,
|
|
225
|
+
)
|
|
226
|
+
block = ResourceContentBlock(
|
|
227
|
+
name=name,
|
|
228
|
+
uri=uri,
|
|
229
|
+
description=description,
|
|
230
|
+
mime_type=mime_type,
|
|
231
|
+
size=size,
|
|
232
|
+
title=title,
|
|
233
|
+
annotations=annotations,
|
|
234
|
+
)
|
|
235
|
+
return cls(content=block)
|
|
236
|
+
|
|
237
|
+
@classmethod
|
|
238
|
+
def embedded_text_resource(
|
|
239
|
+
cls,
|
|
240
|
+
text: str,
|
|
241
|
+
uri: str,
|
|
242
|
+
mime_type: str | None = None,
|
|
243
|
+
audience: Audience | None = None,
|
|
244
|
+
last_modified: datetime | str | None = None,
|
|
245
|
+
priority: float | None = None,
|
|
246
|
+
) -> Self:
|
|
247
|
+
"""Create a ToolCallContent containing an embedded text resource.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
text: The text to embed.
|
|
251
|
+
uri: The URI of the resource.
|
|
252
|
+
mime_type: The MIME type of the resource.
|
|
253
|
+
audience: The audience to apply to the resource.
|
|
254
|
+
last_modified: The last modified date of the resource.
|
|
255
|
+
priority: The priority of the resource.
|
|
256
|
+
"""
|
|
257
|
+
annotations = Annotations.optionally_create(
|
|
258
|
+
audience=audience,
|
|
259
|
+
last_modified=last_modified,
|
|
260
|
+
priority=priority,
|
|
261
|
+
)
|
|
262
|
+
contents = TextResourceContents(text=text, mime_type=mime_type, uri=uri)
|
|
263
|
+
content = EmbeddedResourceContentBlock(annotations=annotations, resource=contents)
|
|
264
|
+
return cls(content=content) # ty: ignore[invalid-argument-type]
|
|
265
|
+
|
|
266
|
+
@classmethod
|
|
267
|
+
def embedded_blob_resource(
|
|
268
|
+
cls,
|
|
269
|
+
data: bytes | str,
|
|
270
|
+
uri: str,
|
|
271
|
+
mime_type: str | None = None,
|
|
272
|
+
audience: Audience | None = None,
|
|
273
|
+
last_modified: datetime | str | None = None,
|
|
274
|
+
priority: float | None = None,
|
|
275
|
+
) -> Self:
|
|
276
|
+
"""Create a ToolCallContent containing an embedded blob resource.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
data: The data to embed.
|
|
280
|
+
uri: The URI of the resource.
|
|
281
|
+
mime_type: The MIME type of the resource.
|
|
282
|
+
audience: The audience to apply to the resource.
|
|
283
|
+
last_modified: The last modified date of the resource.
|
|
284
|
+
priority: The priority of the resource.
|
|
285
|
+
"""
|
|
286
|
+
if isinstance(data, bytes):
|
|
287
|
+
data = base64.b64encode(data).decode()
|
|
288
|
+
annotations = Annotations.optionally_create(
|
|
289
|
+
audience=audience,
|
|
290
|
+
last_modified=last_modified,
|
|
291
|
+
priority=priority,
|
|
292
|
+
)
|
|
293
|
+
resource = BlobResourceContents(blob=data, mime_type=mime_type, uri=uri)
|
|
294
|
+
content = EmbeddedResourceContentBlock(annotations=annotations, resource=resource)
|
|
295
|
+
return cls(content=content) # ty: ignore[invalid-argument-type]
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
class ToolCallLocation(AnnotatedObject):
|
|
299
|
+
"""A file location being accessed or modified by a tool.
|
|
300
|
+
|
|
301
|
+
Enables clients to implement "follow-along" features that track
|
|
302
|
+
which files the agent is working with in real-time.
|
|
303
|
+
See protocol docs: [Following the Agent](https://agentclientprotocol.com/protocol/tool-calls#following-the-agent)
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
line: int = Field(default=0, ge=0)
|
|
307
|
+
"""Line number within the file (0 = beginning/unspecified)."""
|
|
308
|
+
|
|
309
|
+
path: str
|
|
310
|
+
"""The file path being accessed or modified."""
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class DeniedOutcome(Schema):
|
|
314
|
+
"""The prompt turn was cancelled before the user responded.
|
|
315
|
+
|
|
316
|
+
When a client sends a `session/cancel` notification to cancel an ongoing
|
|
317
|
+
prompt turn, it MUST respond to all pending `session/request_permission`
|
|
318
|
+
requests with this `Cancelled` outcome.
|
|
319
|
+
See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation)
|
|
320
|
+
"""
|
|
321
|
+
|
|
322
|
+
outcome: Literal["cancelled"] = Field(default="cancelled", init=False)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class AllowedOutcome(Schema):
|
|
326
|
+
"""The user selected one of the provided options."""
|
|
327
|
+
|
|
328
|
+
option_id: str
|
|
329
|
+
"""The ID of the option the user selected."""
|
|
330
|
+
|
|
331
|
+
outcome: Literal["selected"] = Field(default="selected", init=False)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
class PermissionOption(AnnotatedObject):
|
|
335
|
+
"""An option presented to the user when requesting permission."""
|
|
336
|
+
|
|
337
|
+
kind: PermissionKind
|
|
338
|
+
"""Hint about the nature of this permission option."""
|
|
339
|
+
|
|
340
|
+
name: str
|
|
341
|
+
"""Human-readable label to display to the user."""
|
|
342
|
+
|
|
343
|
+
option_id: str
|
|
344
|
+
"""Unique identifier for this permission option."""
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
ToolCallContent = ContentToolCallContent | FileEditToolCallContent | TerminalToolCallContent
|
acp/stdio.py
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
import sys
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
import anyio
|
|
9
|
+
|
|
10
|
+
from acp.agent.connection import AgentSideConnection
|
|
11
|
+
from acp.client.connection import ClientSideConnection
|
|
12
|
+
from acp.connection import Connection
|
|
13
|
+
from acp.transports import spawn_stdio_transport
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from collections.abc import AsyncIterator, Callable, Mapping
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from anyio.abc import ByteReceiveStream, ByteSendStream, Process
|
|
21
|
+
|
|
22
|
+
from acp.agent.protocol import Agent
|
|
23
|
+
from acp.client.protocol import Client
|
|
24
|
+
from acp.connection import MethodHandler, StreamObserver
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"connect_to_agent",
|
|
28
|
+
"run_agent",
|
|
29
|
+
"spawn_agent_process",
|
|
30
|
+
"spawn_client_process",
|
|
31
|
+
"spawn_stdio_connection",
|
|
32
|
+
"stdio_streams",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class StdinStream(anyio.abc.ByteReceiveStream):
|
|
37
|
+
"""Wrapper for stdin that implements ByteReceiveStream interface."""
|
|
38
|
+
|
|
39
|
+
async def receive(self, max_bytes: int = 65536) -> bytes:
|
|
40
|
+
"""Read bytes from stdin.
|
|
41
|
+
|
|
42
|
+
Uses read1() which returns as soon as any data is available,
|
|
43
|
+
rather than blocking until max_bytes are read.
|
|
44
|
+
"""
|
|
45
|
+
loop = asyncio.get_running_loop()
|
|
46
|
+
# read1() returns immediately when any data is available (up to max_bytes)
|
|
47
|
+
# unlike read() which blocks until exactly max_bytes are read or EOF
|
|
48
|
+
data: bytes = await loop.run_in_executor(None, sys.stdin.buffer.read1, max_bytes) # type: ignore[union-attr]
|
|
49
|
+
if not data:
|
|
50
|
+
raise anyio.EndOfStream
|
|
51
|
+
return data
|
|
52
|
+
|
|
53
|
+
async def aclose(self) -> None:
|
|
54
|
+
"""Close is a no-op for stdin."""
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class StdoutStream(anyio.abc.ByteSendStream):
|
|
58
|
+
"""Wrapper for stdout that implements ByteSendStream interface."""
|
|
59
|
+
|
|
60
|
+
async def send(self, item: bytes) -> None:
|
|
61
|
+
"""Write bytes to stdout."""
|
|
62
|
+
loop = asyncio.get_running_loop()
|
|
63
|
+
await loop.run_in_executor(None, self._write, item)
|
|
64
|
+
|
|
65
|
+
def _write(self, data: bytes) -> None:
|
|
66
|
+
sys.stdout.buffer.write(data)
|
|
67
|
+
sys.stdout.buffer.flush()
|
|
68
|
+
|
|
69
|
+
async def aclose(self) -> None:
|
|
70
|
+
"""Close is a no-op for stdout."""
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def stdio_streams() -> tuple[StdinStream, StdoutStream]:
|
|
74
|
+
"""Create stdio anyio-compatible streams (cross-platform).
|
|
75
|
+
|
|
76
|
+
Returns (stdin, stdout) as byte stream wrappers compatible with
|
|
77
|
+
ByteReceiveStream and ByteSendStream interfaces.
|
|
78
|
+
"""
|
|
79
|
+
return StdinStream(), StdoutStream()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@asynccontextmanager
|
|
83
|
+
async def spawn_stdio_connection(
|
|
84
|
+
handler: MethodHandler,
|
|
85
|
+
command: str,
|
|
86
|
+
*args: str,
|
|
87
|
+
env: Mapping[str, str] | None = None,
|
|
88
|
+
cwd: str | Path | None = None,
|
|
89
|
+
observers: list[StreamObserver] | None = None,
|
|
90
|
+
**transport_kwargs: Any,
|
|
91
|
+
) -> AsyncIterator[tuple[Connection, Process]]:
|
|
92
|
+
"""Spawn a subprocess and bind its stdio to a low-level Connection."""
|
|
93
|
+
async with spawn_stdio_transport(command, *args, env=env, cwd=cwd, **transport_kwargs) as (
|
|
94
|
+
reader,
|
|
95
|
+
writer,
|
|
96
|
+
process,
|
|
97
|
+
):
|
|
98
|
+
conn = Connection(handler, writer, reader, observers=observers)
|
|
99
|
+
try:
|
|
100
|
+
yield conn, process
|
|
101
|
+
finally:
|
|
102
|
+
await conn.close()
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@asynccontextmanager
|
|
106
|
+
async def spawn_agent_process(
|
|
107
|
+
to_client: Callable[[Agent], Client],
|
|
108
|
+
command: str,
|
|
109
|
+
*args: str,
|
|
110
|
+
env: Mapping[str, str] | None = None,
|
|
111
|
+
cwd: str | Path | None = None,
|
|
112
|
+
transport_kwargs: Mapping[str, Any] | None = None,
|
|
113
|
+
**connection_kwargs: Any,
|
|
114
|
+
) -> AsyncIterator[tuple[ClientSideConnection, Process]]:
|
|
115
|
+
"""Spawn an ACP agent subprocess and return a ClientSideConnection to it."""
|
|
116
|
+
async with spawn_stdio_transport(
|
|
117
|
+
command,
|
|
118
|
+
*args,
|
|
119
|
+
env=env,
|
|
120
|
+
cwd=cwd,
|
|
121
|
+
**(dict(transport_kwargs) if transport_kwargs else {}),
|
|
122
|
+
) as (reader, writer, process):
|
|
123
|
+
conn = ClientSideConnection(to_client, writer, reader, **connection_kwargs)
|
|
124
|
+
try:
|
|
125
|
+
yield conn, process
|
|
126
|
+
finally:
|
|
127
|
+
await conn.close()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@asynccontextmanager
|
|
131
|
+
async def spawn_client_process(
|
|
132
|
+
to_agent: Callable[[AgentSideConnection], Agent],
|
|
133
|
+
command: str,
|
|
134
|
+
*args: str,
|
|
135
|
+
env: Mapping[str, str] | None = None,
|
|
136
|
+
cwd: str | Path | None = None,
|
|
137
|
+
transport_kwargs: Mapping[str, Any] | None = None,
|
|
138
|
+
**connection_kwargs: Any,
|
|
139
|
+
) -> AsyncIterator[tuple[AgentSideConnection, Process]]:
|
|
140
|
+
"""Spawn an ACP client subprocess and return an AgentSideConnection to it."""
|
|
141
|
+
async with spawn_stdio_transport(
|
|
142
|
+
command,
|
|
143
|
+
*args,
|
|
144
|
+
env=env,
|
|
145
|
+
cwd=cwd,
|
|
146
|
+
**(dict(transport_kwargs) if transport_kwargs else {}),
|
|
147
|
+
) as (reader, writer, process):
|
|
148
|
+
conn = AgentSideConnection(to_agent, writer, reader, **connection_kwargs)
|
|
149
|
+
try:
|
|
150
|
+
yield conn, process
|
|
151
|
+
finally:
|
|
152
|
+
await conn.close()
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
async def run_agent(
|
|
156
|
+
agent: Agent | Callable[[AgentSideConnection], Agent],
|
|
157
|
+
input_stream: ByteSendStream | None = None,
|
|
158
|
+
output_stream: ByteReceiveStream | None = None,
|
|
159
|
+
**connection_kwargs: Any,
|
|
160
|
+
) -> None:
|
|
161
|
+
"""Run an ACP agent over stdio or provided streams.
|
|
162
|
+
|
|
163
|
+
This is the recommended entry point for running agents. It handles stream
|
|
164
|
+
setup and connection lifecycle automatically.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
agent: An Agent implementation or a factory callable that takes
|
|
168
|
+
an AgentSideConnection and returns an Agent. Using a factory allows
|
|
169
|
+
the agent to access the connection for client communication.
|
|
170
|
+
input_stream: Optional ByteSendStream for output (defaults to stdio).
|
|
171
|
+
output_stream: Optional ByteReceiveStream for input (defaults to stdio).
|
|
172
|
+
**connection_kwargs: Additional keyword arguments for AgentSideConnection.
|
|
173
|
+
|
|
174
|
+
Example with direct agent:
|
|
175
|
+
```python
|
|
176
|
+
class MyAgent(Agent):
|
|
177
|
+
async def initialize(self, params: InitializeRequest) -> InitializeResponse:
|
|
178
|
+
return InitializeResponse(protocol_version=params.protocol_version)
|
|
179
|
+
# ... implement protocol methods ...
|
|
180
|
+
|
|
181
|
+
await run_agent(MyAgent())
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Example with factory:
|
|
185
|
+
```python
|
|
186
|
+
class MyAgent(Agent):
|
|
187
|
+
def __init__(self, connection: AgentSideConnection):
|
|
188
|
+
self.connection = connection
|
|
189
|
+
# ... implement protocol methods ...
|
|
190
|
+
|
|
191
|
+
def create_agent(conn: AgentSideConnection) -> MyAgent:
|
|
192
|
+
return MyAgent(conn)
|
|
193
|
+
|
|
194
|
+
await run_agent(create_agent)
|
|
195
|
+
```
|
|
196
|
+
"""
|
|
197
|
+
if input_stream is None or output_stream is None:
|
|
198
|
+
# For stdio, we need to create byte streams from the text wrappers
|
|
199
|
+
# This follows the MCP SDK server pattern
|
|
200
|
+
_stdin_file, _stdout_file = await stdio_streams()
|
|
201
|
+
# Note: run_agent expects ByteSendStream/ByteReceiveStream but stdio_streams
|
|
202
|
+
# returns text AsyncFiles. For now, we'll use the underlying buffer.
|
|
203
|
+
# TODO: Consider refactoring to use memory object streams like MCP SDK
|
|
204
|
+
msg = "run_agent with stdio streams requires explicit stream arguments for now"
|
|
205
|
+
raise NotImplementedError(msg)
|
|
206
|
+
|
|
207
|
+
# Wrap agent instance in factory if needed
|
|
208
|
+
if callable(agent):
|
|
209
|
+
agent_factory = agent # pyright: ignore[reportAssignmentType]
|
|
210
|
+
else:
|
|
211
|
+
|
|
212
|
+
def agent_factory(connection: AgentSideConnection) -> Agent:
|
|
213
|
+
return agent # ty: ignore[invalid-return-type]
|
|
214
|
+
|
|
215
|
+
conn = AgentSideConnection(agent_factory, input_stream, output_stream, **connection_kwargs)
|
|
216
|
+
shutdown_event = asyncio.Event()
|
|
217
|
+
try:
|
|
218
|
+
# Keep the connection alive until cancelled
|
|
219
|
+
await shutdown_event.wait()
|
|
220
|
+
except asyncio.CancelledError:
|
|
221
|
+
pass
|
|
222
|
+
finally:
|
|
223
|
+
await conn.close()
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def connect_to_agent(
|
|
227
|
+
client: Client,
|
|
228
|
+
input_stream: ByteSendStream,
|
|
229
|
+
output_stream: ByteReceiveStream,
|
|
230
|
+
**connection_kwargs: Any,
|
|
231
|
+
) -> ClientSideConnection:
|
|
232
|
+
"""Create a ClientSideConnection to an ACP agent.
|
|
233
|
+
|
|
234
|
+
This is the recommended entry point for client-side connections.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
client: The client implementation.
|
|
238
|
+
input_stream: ByteSendStream for sending to the agent.
|
|
239
|
+
output_stream: ByteReceiveStream for receiving from the agent.
|
|
240
|
+
**connection_kwargs: Additional keyword arguments for ClientSideConnection.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
A ClientSideConnection connected to the agent.
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
# Create a factory that ignores the connection parameter
|
|
247
|
+
def client_factory(connection: Agent) -> Client:
|
|
248
|
+
return client
|
|
249
|
+
|
|
250
|
+
return ClientSideConnection(client_factory, input_stream, output_stream, **connection_kwargs)
|
acp/task/__init__.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Task package."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
__all__ = ["RpcTask", "RpcTaskKind"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RpcTaskKind(Enum):
|
|
13
|
+
"""RpcTaskKind represents the kind of task to be executed by the agent."""
|
|
14
|
+
|
|
15
|
+
REQUEST = "request"
|
|
16
|
+
NOTIFICATION = "notification"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(slots=True)
|
|
20
|
+
class RpcTask:
|
|
21
|
+
"""RpcTask represents a task to be executed by the agent."""
|
|
22
|
+
|
|
23
|
+
kind: RpcTaskKind
|
|
24
|
+
message: dict[str, Any]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
from .dispatcher import (
|
|
28
|
+
DefaultMessageDispatcher,
|
|
29
|
+
MessageDispatcher,
|
|
30
|
+
NotificationRunner,
|
|
31
|
+
RequestRunner,
|
|
32
|
+
)
|
|
33
|
+
from .queue import InMemoryMessageQueue, MessageQueue
|
|
34
|
+
from .sender import MessageSender, SenderFactory
|
|
35
|
+
from .state import InMemoryMessageStateStore, MessageStateStore
|
|
36
|
+
from .supervisor import TaskSupervisor
|
|
37
|
+
from .debug import DebugEntry, DebuggingMessageStateStore
|
|
38
|
+
|
|
39
|
+
__all__ += [
|
|
40
|
+
"DebugEntry",
|
|
41
|
+
"DebuggingMessageStateStore",
|
|
42
|
+
"DefaultMessageDispatcher",
|
|
43
|
+
"InMemoryMessageQueue",
|
|
44
|
+
"InMemoryMessageStateStore",
|
|
45
|
+
"MessageDispatcher",
|
|
46
|
+
"MessageQueue",
|
|
47
|
+
"MessageSender",
|
|
48
|
+
"MessageStateStore",
|
|
49
|
+
"NotificationRunner",
|
|
50
|
+
"RequestRunner",
|
|
51
|
+
"SenderFactory",
|
|
52
|
+
"TaskSupervisor",
|
|
53
|
+
]
|