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/bridge/README.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# ACP Bridge
|
|
2
|
+
|
|
3
|
+
A stdio-to-HTTP bridge for ACP (Agent Client Protocol) agents.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The ACP Bridge allows you to expose stdio-based ACP agents via a streamable HTTP endpoint. This is useful when you want to run an agent as a subprocess but communicate with it over HTTP instead of stdio.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Stdio to HTTP**: Spawns an ACP agent subprocess and exposes it via HTTP
|
|
12
|
+
- **Streamable HTTP**: Uses streamable HTTP transport for efficient communication
|
|
13
|
+
- **CORS Support**: Optional CORS configuration for web clients
|
|
14
|
+
- **Health Endpoint**: Built-in `/status` endpoint for monitoring
|
|
15
|
+
- **Type-Safe**: Full type hints and Pydantic validation
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
The bridge is included in the `acp` package:
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from acp.bridge import ACPBridge, BridgeSettings
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Programmatic Usage
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
import anyio
|
|
31
|
+
from acp.bridge import ACPBridge, BridgeSettings
|
|
32
|
+
|
|
33
|
+
settings = BridgeSettings(
|
|
34
|
+
host="127.0.0.1",
|
|
35
|
+
port=8080,
|
|
36
|
+
log_level="INFO",
|
|
37
|
+
allow_origins=["*"], # Optional CORS
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
bridge = ACPBridge(
|
|
41
|
+
command="uv",
|
|
42
|
+
args=["run", "my-agent"],
|
|
43
|
+
settings=settings,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
anyio.run(bridge.run)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Command Line Usage
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Basic usage
|
|
53
|
+
acp-bridge my-agent-command
|
|
54
|
+
|
|
55
|
+
# With custom port and host
|
|
56
|
+
acp-bridge --port 8080 --host 0.0.0.0 -- uv run my-agent
|
|
57
|
+
|
|
58
|
+
# With debug logging
|
|
59
|
+
acp-bridge --log-level DEBUG my-agent
|
|
60
|
+
|
|
61
|
+
# With CORS enabled
|
|
62
|
+
acp-bridge --allow-origin "*" my-agent
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Endpoints
|
|
66
|
+
|
|
67
|
+
### POST /acp
|
|
68
|
+
|
|
69
|
+
The main endpoint for ACP JSON-RPC requests. Send ACP protocol messages here.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
curl -X POST http://localhost:8080/acp \
|
|
73
|
+
-H "Content-Type: application/json" \
|
|
74
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### GET /status
|
|
78
|
+
|
|
79
|
+
Health check endpoint that returns the bridge status.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
curl http://localhost:8080/status
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Response:
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"status": "connected",
|
|
89
|
+
"command": "my-agent",
|
|
90
|
+
"args": ["--config", "config.yml"]
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Configuration
|
|
95
|
+
|
|
96
|
+
### BridgeSettings
|
|
97
|
+
|
|
98
|
+
- `host` (str): Host to bind the server to. Default: `"127.0.0.1"`
|
|
99
|
+
- `port` (int): Port to serve on. Default: `8080`
|
|
100
|
+
- `log_level` (str): Logging level. Default: `"INFO"`
|
|
101
|
+
- `allow_origins` (list[str] | None): CORS allowed origins. Default: `None`
|
|
102
|
+
|
|
103
|
+
### ACPBridge
|
|
104
|
+
|
|
105
|
+
- `command` (str): Command to spawn the ACP agent
|
|
106
|
+
- `args` (list[str] | None): Arguments for the command
|
|
107
|
+
- `env` (Mapping[str, str] | None): Environment variables
|
|
108
|
+
- `cwd` (str | Path | None): Working directory
|
|
109
|
+
- `settings` (BridgeSettings | None): Server settings
|
|
110
|
+
|
|
111
|
+
## Example: Bridging an Existing Agent
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from acp.bridge import ACPBridge
|
|
115
|
+
|
|
116
|
+
# Bridge the debug server
|
|
117
|
+
bridge = ACPBridge(
|
|
118
|
+
command="uv",
|
|
119
|
+
args=["run", "python", "-m", "acp.debug_server"],
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
await bridge.run()
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Architecture
|
|
126
|
+
|
|
127
|
+
The bridge works by:
|
|
128
|
+
|
|
129
|
+
1. Spawning the specified command as a subprocess with stdio pipes
|
|
130
|
+
2. Creating a `ClientSideConnection` to communicate with the agent via stdio
|
|
131
|
+
3. Exposing an HTTP server that accepts JSON-RPC requests
|
|
132
|
+
4. Forwarding HTTP requests to the stdio agent and returning responses
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
HTTP Client → HTTP Server → ClientSideConnection → stdio → Agent Process
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Supported Methods
|
|
139
|
+
|
|
140
|
+
The bridge supports all standard ACP protocol methods:
|
|
141
|
+
|
|
142
|
+
- `initialize`
|
|
143
|
+
- `session/new`, `session/load`, `session/list`
|
|
144
|
+
- `session/fork`, `session/resume`
|
|
145
|
+
- `session/prompt`, `session/cancel`
|
|
146
|
+
- `session/set_mode`, `session/set_model`
|
|
147
|
+
- `authenticate`
|
|
148
|
+
- Extension methods (prefixed with `_`)
|
|
149
|
+
|
|
150
|
+
## Error Handling
|
|
151
|
+
|
|
152
|
+
The bridge returns standard JSON-RPC error responses:
|
|
153
|
+
|
|
154
|
+
- `-32700`: Parse error (invalid JSON)
|
|
155
|
+
- `-32600`: Invalid Request (missing method)
|
|
156
|
+
- `-32603`: Internal error (agent communication failure)
|
|
157
|
+
- `503`: Service unavailable (agent not connected)
|
|
158
|
+
|
|
159
|
+
## See Also
|
|
160
|
+
|
|
161
|
+
- [ACP Protocol Documentation](../README.md)
|
|
162
|
+
- [MCP Proxy](https://github.com/modelcontextprotocol/mcp-proxy) - Similar concept for MCP
|
acp/bridge/__init__.py
ADDED
acp/bridge/__main__.py
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""CLI entry point for running the ACP bridge.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
uv run -m acp_bridge <command> [args...]
|
|
5
|
+
uv run -m acp_bridge --port 8080 -- your-agent-command --arg1 value1
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import contextlib
|
|
12
|
+
import logging
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
import anyio
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def main() -> None:
|
|
19
|
+
"""Run the ACP bridge from command line."""
|
|
20
|
+
parser = argparse.ArgumentParser(
|
|
21
|
+
description="Bridge a stdio ACP agent to streamable HTTP transport.",
|
|
22
|
+
epilog=(
|
|
23
|
+
"Examples:\n"
|
|
24
|
+
" acp-bridge your-agent-command\n"
|
|
25
|
+
" acp-bridge --port 8080 -- your-agent --config config.yml\n"
|
|
26
|
+
" acp-bridge -H 0.0.0.0 -p 9000 -- uv run my-agent\n"
|
|
27
|
+
),
|
|
28
|
+
formatter_class=argparse.RawTextHelpFormatter,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
parser.add_argument("command", help="Command to spawn the ACP agent.")
|
|
32
|
+
parser.add_argument("args", nargs="*", help="Arguments for the agent command.")
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"-p",
|
|
35
|
+
"--port",
|
|
36
|
+
type=int,
|
|
37
|
+
default=8080,
|
|
38
|
+
help="Port to serve the HTTP endpoint on. Default: 8080",
|
|
39
|
+
)
|
|
40
|
+
parser.add_argument(
|
|
41
|
+
"-H",
|
|
42
|
+
"--host",
|
|
43
|
+
default="127.0.0.1",
|
|
44
|
+
help="Host to bind the server to. Default: 127.0.0.1",
|
|
45
|
+
)
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
"--log-level",
|
|
48
|
+
choices=["DEBUG", "INFO", "WARNING", "ERROR"],
|
|
49
|
+
default="INFO",
|
|
50
|
+
help="Log level. Default: INFO",
|
|
51
|
+
)
|
|
52
|
+
parser.add_argument(
|
|
53
|
+
"--allow-origin",
|
|
54
|
+
action="append",
|
|
55
|
+
default=[],
|
|
56
|
+
help="Allowed CORS origins. Can be specified multiple times.",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--cwd",
|
|
60
|
+
default=None,
|
|
61
|
+
help="Working directory for the agent subprocess.",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
parsed = parser.parse_args()
|
|
65
|
+
|
|
66
|
+
if not parsed.command:
|
|
67
|
+
parser.print_help()
|
|
68
|
+
sys.exit(1)
|
|
69
|
+
|
|
70
|
+
logging.basicConfig(
|
|
71
|
+
level=getattr(logging, parsed.log_level),
|
|
72
|
+
format="[%(levelname)1.1s %(asctime)s.%(msecs)03d %(name)s] %(message)s",
|
|
73
|
+
datefmt="%H:%M:%S",
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
from acp.bridge import ACPBridge, BridgeSettings
|
|
77
|
+
|
|
78
|
+
settings = BridgeSettings(
|
|
79
|
+
host=parsed.host,
|
|
80
|
+
port=parsed.port,
|
|
81
|
+
log_level=parsed.log_level,
|
|
82
|
+
allow_origins=parsed.allow_origin if parsed.allow_origin else None,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
bridge = ACPBridge(command=parsed.command, args=parsed.args, cwd=parsed.cwd, settings=settings)
|
|
86
|
+
with contextlib.suppress(KeyboardInterrupt):
|
|
87
|
+
anyio.run(bridge.run)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
main()
|
acp/bridge/bridge.py
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""ACP Bridge - Proxy stdio ACP agents to streamable HTTP transport.
|
|
2
|
+
|
|
3
|
+
This module provides functionality to spawn a stdio-based ACP agent subprocess
|
|
4
|
+
and expose it via a streamable HTTP endpoint.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import contextlib
|
|
10
|
+
import logging
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
12
|
+
|
|
13
|
+
from starlette.applications import Starlette
|
|
14
|
+
from starlette.middleware import Middleware
|
|
15
|
+
from starlette.middleware.cors import CORSMiddleware
|
|
16
|
+
from starlette.responses import JSONResponse, Response
|
|
17
|
+
from starlette.routing import Route
|
|
18
|
+
import uvicorn
|
|
19
|
+
|
|
20
|
+
from acp.bridge.settings import BridgeSettings
|
|
21
|
+
from acp.client.connection import ClientSideConnection
|
|
22
|
+
from acp.client.implementations import NoOpClient
|
|
23
|
+
from acp.schema import (
|
|
24
|
+
AuthenticateRequest,
|
|
25
|
+
CancelNotification,
|
|
26
|
+
ForkSessionRequest,
|
|
27
|
+
InitializeRequest,
|
|
28
|
+
ListSessionsRequest,
|
|
29
|
+
LoadSessionRequest,
|
|
30
|
+
NewSessionRequest,
|
|
31
|
+
PromptRequest,
|
|
32
|
+
ResumeSessionRequest,
|
|
33
|
+
SetSessionModelRequest,
|
|
34
|
+
SetSessionModeRequest,
|
|
35
|
+
)
|
|
36
|
+
from acp.transports import spawn_stdio_transport
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from collections.abc import Mapping
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
|
|
43
|
+
import anyio
|
|
44
|
+
from starlette.requests import Request
|
|
45
|
+
|
|
46
|
+
from acp.schema import AgentMethod
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
logger = logging.getLogger(__name__)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ACPBridge:
|
|
53
|
+
"""Bridge that proxies stdio ACP agents to streamable HTTP."""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
command: str,
|
|
58
|
+
args: list[str] | None = None,
|
|
59
|
+
*,
|
|
60
|
+
env: Mapping[str, str] | None = None,
|
|
61
|
+
cwd: str | Path | None = None,
|
|
62
|
+
settings: BridgeSettings | None = None,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""Initialize the ACP bridge.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
command: Command to spawn the ACP agent.
|
|
68
|
+
args: Arguments for the command.
|
|
69
|
+
env: Environment variables for the subprocess.
|
|
70
|
+
cwd: Working directory for the subprocess.
|
|
71
|
+
settings: Bridge server settings.
|
|
72
|
+
"""
|
|
73
|
+
self.command = command
|
|
74
|
+
self.args = args or []
|
|
75
|
+
self.env = env
|
|
76
|
+
self.cwd = cwd
|
|
77
|
+
self.settings = settings or BridgeSettings()
|
|
78
|
+
self._connection: ClientSideConnection | None = None
|
|
79
|
+
self._process: anyio.abc.Process | None = None
|
|
80
|
+
|
|
81
|
+
async def _handle_acp_request(self, request: Request) -> Response:
|
|
82
|
+
"""Handle incoming ACP JSON-RPC requests."""
|
|
83
|
+
if self._connection is None:
|
|
84
|
+
response = {"jsonrpc": "2.0", "error": {"code": -32603, "message": "Not connected"}}
|
|
85
|
+
return JSONResponse(response, status_code=503)
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
body = await request.json()
|
|
89
|
+
except Exception: # noqa: BLE001
|
|
90
|
+
response = {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}}
|
|
91
|
+
return JSONResponse(response, status_code=400)
|
|
92
|
+
|
|
93
|
+
method = body.get("method")
|
|
94
|
+
params = body.get("params")
|
|
95
|
+
request_id = body.get("id")
|
|
96
|
+
is_notification = request_id is None
|
|
97
|
+
|
|
98
|
+
if method is None:
|
|
99
|
+
return JSONResponse(
|
|
100
|
+
{
|
|
101
|
+
"jsonrpc": "2.0",
|
|
102
|
+
"id": request_id,
|
|
103
|
+
"error": {"code": -32600, "message": "Invalid Request"},
|
|
104
|
+
},
|
|
105
|
+
status_code=400,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
result = await self._dispatch_to_agent(method, params, is_notification)
|
|
110
|
+
if is_notification:
|
|
111
|
+
return Response(status_code=204)
|
|
112
|
+
return JSONResponse({"jsonrpc": "2.0", "id": request_id, "result": result})
|
|
113
|
+
except Exception as exc:
|
|
114
|
+
logger.exception("Error dispatching request to agent")
|
|
115
|
+
err = {"code": -32603, "message": str(exc)}
|
|
116
|
+
return JSONResponse({"jsonrpc": "2.0", "id": request_id, "error": err}, status_code=500)
|
|
117
|
+
|
|
118
|
+
async def _dispatch_to_agent( # noqa: PLR0911
|
|
119
|
+
self,
|
|
120
|
+
method: AgentMethod,
|
|
121
|
+
params: dict[str, Any] | None,
|
|
122
|
+
is_notification: bool,
|
|
123
|
+
) -> Any:
|
|
124
|
+
"""Dispatch a request to the connected agent."""
|
|
125
|
+
if self._connection is None:
|
|
126
|
+
msg = "No agent connection"
|
|
127
|
+
raise RuntimeError(msg)
|
|
128
|
+
match method:
|
|
129
|
+
case "initialize":
|
|
130
|
+
init_request = InitializeRequest.model_validate(params)
|
|
131
|
+
init_resp = await self._connection.initialize(init_request)
|
|
132
|
+
return init_resp.model_dump(by_alias=True, exclude_none=True)
|
|
133
|
+
case "session/new":
|
|
134
|
+
new_session_request = NewSessionRequest.model_validate(params)
|
|
135
|
+
new_session_resp = await self._connection.new_session(new_session_request)
|
|
136
|
+
return new_session_resp.model_dump(by_alias=True, exclude_none=True)
|
|
137
|
+
case "session/load":
|
|
138
|
+
load_session_request = LoadSessionRequest.model_validate(params)
|
|
139
|
+
load_sessoin_resp = await self._connection.load_session(load_session_request)
|
|
140
|
+
return load_sessoin_resp.model_dump(by_alias=True, exclude_none=True)
|
|
141
|
+
case "session/list":
|
|
142
|
+
list_sessions_request = ListSessionsRequest.model_validate(params)
|
|
143
|
+
list_session_resp = await self._connection.list_sessions(list_sessions_request)
|
|
144
|
+
return list_session_resp.model_dump(by_alias=True, exclude_none=True)
|
|
145
|
+
case "session/fork":
|
|
146
|
+
fork_session_request = ForkSessionRequest.model_validate(params)
|
|
147
|
+
fork_session_resp = await self._connection.fork_session(fork_session_request)
|
|
148
|
+
return fork_session_resp.model_dump(by_alias=True, exclude_none=True)
|
|
149
|
+
case "session/resume":
|
|
150
|
+
resume_session_request = ResumeSessionRequest.model_validate(params)
|
|
151
|
+
resume_session_resp = await self._connection.resume_session(resume_session_request)
|
|
152
|
+
return resume_session_resp.model_dump(by_alias=True, exclude_none=True)
|
|
153
|
+
case "session/prompt":
|
|
154
|
+
prompt_request = PromptRequest.model_validate(params)
|
|
155
|
+
prompt_resp = await self._connection.prompt(prompt_request)
|
|
156
|
+
return prompt_resp.model_dump(by_alias=True, exclude_none=True)
|
|
157
|
+
case "session/cancel":
|
|
158
|
+
cancel_request = CancelNotification.model_validate(params)
|
|
159
|
+
await self._connection.cancel(cancel_request)
|
|
160
|
+
return None
|
|
161
|
+
case "session/set_mode":
|
|
162
|
+
set_mode_request = SetSessionModeRequest.model_validate(params)
|
|
163
|
+
resp = await self._connection.set_session_mode(set_mode_request)
|
|
164
|
+
return resp.model_dump(by_alias=True, exclude_none=True) if resp else {}
|
|
165
|
+
case "session/set_model":
|
|
166
|
+
set_model_request = SetSessionModelRequest.model_validate(params)
|
|
167
|
+
set_model_resp = await self._connection.set_session_model(set_model_request)
|
|
168
|
+
return (
|
|
169
|
+
set_model_resp.model_dump(by_alias=True, exclude_none=True)
|
|
170
|
+
if set_model_resp
|
|
171
|
+
else {}
|
|
172
|
+
)
|
|
173
|
+
case "authenticate":
|
|
174
|
+
authenticate_request = AuthenticateRequest.model_validate(params)
|
|
175
|
+
authenticate_resp = await self._connection.authenticate(authenticate_request)
|
|
176
|
+
return (
|
|
177
|
+
authenticate_resp.model_dump(by_alias=True, exclude_none=True)
|
|
178
|
+
if authenticate_resp
|
|
179
|
+
else {}
|
|
180
|
+
)
|
|
181
|
+
case str() if method.startswith("_") and is_notification:
|
|
182
|
+
await self._connection.ext_notification(method[1:], params or {})
|
|
183
|
+
return None
|
|
184
|
+
case str() if method.startswith("_"):
|
|
185
|
+
return await self._connection.ext_method(method[1:], params or {})
|
|
186
|
+
case _:
|
|
187
|
+
msg = f"Method not found: {method}"
|
|
188
|
+
raise ValueError(msg)
|
|
189
|
+
|
|
190
|
+
async def _handle_status(self, request: Request) -> Response:
|
|
191
|
+
"""Health check endpoint."""
|
|
192
|
+
status = "connected" if self._connection else "disconnected"
|
|
193
|
+
return JSONResponse({"status": status, "command": self.command, "args": self.args})
|
|
194
|
+
|
|
195
|
+
def _create_app(self) -> Starlette:
|
|
196
|
+
"""Create the Starlette application."""
|
|
197
|
+
routes = [
|
|
198
|
+
Route("/acp", endpoint=self._handle_acp_request, methods=["POST"]),
|
|
199
|
+
Route("/status", endpoint=self._handle_status, methods=["GET"]),
|
|
200
|
+
]
|
|
201
|
+
|
|
202
|
+
middleware: list[Middleware] = []
|
|
203
|
+
if self.settings.allow_origins:
|
|
204
|
+
middleware.append(
|
|
205
|
+
Middleware(
|
|
206
|
+
CORSMiddleware, # ty: ignore[invalid-argument-type]
|
|
207
|
+
allow_origins=self.settings.allow_origins,
|
|
208
|
+
allow_methods=["*"],
|
|
209
|
+
allow_headers=["*"],
|
|
210
|
+
)
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
return Starlette(
|
|
214
|
+
debug=(self.settings.log_level == "DEBUG"),
|
|
215
|
+
routes=routes,
|
|
216
|
+
middleware=middleware,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
async def run(self) -> None:
|
|
220
|
+
"""Run the bridge server."""
|
|
221
|
+
async with contextlib.AsyncExitStack() as stack:
|
|
222
|
+
# Spawn the stdio agent subprocess
|
|
223
|
+
logger.info("Spawning ACP agent: %s %s", self.command, " ".join(self.args))
|
|
224
|
+
reader, writer, process = await stack.enter_async_context(
|
|
225
|
+
spawn_stdio_transport(self.command, *self.args, env=self.env, cwd=self.cwd)
|
|
226
|
+
)
|
|
227
|
+
self._process = process
|
|
228
|
+
|
|
229
|
+
# Create client connection to the agent
|
|
230
|
+
def client_factory(agent: Any) -> NoOpClient:
|
|
231
|
+
return NoOpClient()
|
|
232
|
+
|
|
233
|
+
self._connection = ClientSideConnection(client_factory, writer, reader)
|
|
234
|
+
stack.push_async_callback(self._connection.close)
|
|
235
|
+
# Create and run the HTTP server
|
|
236
|
+
app = self._create_app()
|
|
237
|
+
config = uvicorn.Config(
|
|
238
|
+
app,
|
|
239
|
+
host=self.settings.host,
|
|
240
|
+
port=self.settings.port,
|
|
241
|
+
log_level=self.settings.log_level.lower(),
|
|
242
|
+
)
|
|
243
|
+
server = uvicorn.Server(config)
|
|
244
|
+
url = f"http://{self.settings.host}:{self.settings.port}"
|
|
245
|
+
logger.info("ACP Bridge serving at %s/acp", url)
|
|
246
|
+
await server.serve()
|
acp/bridge/py.typed
ADDED
|
File without changes
|
acp/bridge/settings.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Configuration settings for ACP Bridge."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class BridgeSettings:
|
|
10
|
+
"""Settings for the ACP Bridge server."""
|
|
11
|
+
|
|
12
|
+
host: str = "127.0.0.1"
|
|
13
|
+
port: int = 8080
|
|
14
|
+
log_level: str = "INFO"
|
|
15
|
+
allow_origins: list[str] | None = None
|
acp/client/__init__.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Client ACP Connection."""
|
|
2
|
+
|
|
3
|
+
from acp.client.protocol import Client
|
|
4
|
+
from acp.client.implementations import DefaultACPClient, HeadlessACPClient, NoOpClient
|
|
5
|
+
from acp.client.connection import ClientSideConnection
|
|
6
|
+
|
|
7
|
+
__all__ = ["Client", "ClientSideConnection", "DefaultACPClient", "HeadlessACPClient", "NoOpClient"]
|