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,210 @@
|
|
|
1
|
+
"""Spawn subagent slash command."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
import uuid
|
|
7
|
+
|
|
8
|
+
from pydantic_ai import (
|
|
9
|
+
FinalResultEvent,
|
|
10
|
+
FunctionToolCallEvent,
|
|
11
|
+
FunctionToolResultEvent,
|
|
12
|
+
PartDeltaEvent,
|
|
13
|
+
PartStartEvent,
|
|
14
|
+
RetryPromptPart,
|
|
15
|
+
TextPart,
|
|
16
|
+
TextPartDelta,
|
|
17
|
+
ThinkingPart,
|
|
18
|
+
ThinkingPartDelta,
|
|
19
|
+
ToolCallPartDelta,
|
|
20
|
+
ToolReturnPart,
|
|
21
|
+
)
|
|
22
|
+
from slashed import CommandContext, CommandError # noqa: TC002
|
|
23
|
+
|
|
24
|
+
from agentpool.agents.events import StreamCompleteEvent, ToolCallProgressEvent
|
|
25
|
+
from agentpool.log import get_logger
|
|
26
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
27
|
+
from agentpool_commands.base import NodeCommand
|
|
28
|
+
from agentpool_server.acp_server.session import ACPSession # noqa: TC001
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from agentpool.agents.events import RichAgentStreamEvent
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
logger = get_logger(__name__)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SpawnSubagentCommand(NodeCommand):
|
|
39
|
+
"""Spawn a subagent to execute a specific task.
|
|
40
|
+
|
|
41
|
+
The subagent runs concurrently and reports progress in a dedicated tool call box.
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
/spawn "agent-name" "prompt for the subagent"
|
|
45
|
+
/spawn "code-reviewer" "Review the main.py file for potential bugs"
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
name = "spawn"
|
|
49
|
+
category = "agents"
|
|
50
|
+
|
|
51
|
+
async def execute_command(
|
|
52
|
+
self,
|
|
53
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
54
|
+
agent_name: str,
|
|
55
|
+
task_prompt: str,
|
|
56
|
+
) -> None:
|
|
57
|
+
"""Spawn a subagent to execute a task.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
ctx: Command context with ACP session
|
|
61
|
+
agent_name: Name of the agent to spawn
|
|
62
|
+
task_prompt: Task prompt for the subagent
|
|
63
|
+
"""
|
|
64
|
+
session = ctx.context.data
|
|
65
|
+
assert session, "ACP session required for spawn command"
|
|
66
|
+
# Generate unique tool call ID
|
|
67
|
+
tool_call_id = f"spawn-{agent_name}-{uuid.uuid4().hex[:8]}"
|
|
68
|
+
try:
|
|
69
|
+
# Check if agent exists in pool
|
|
70
|
+
if not session.agent_pool or agent_name not in session.agent_pool.agents:
|
|
71
|
+
available = list(session.agent_pool.agents.keys())
|
|
72
|
+
error_msg = f"Agent {agent_name!r} not found. Available agents: {available}"
|
|
73
|
+
await ctx.print(f"❌ {error_msg}")
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
target_agent = session.agent_pool.get_agent(agent_name)
|
|
77
|
+
await session.notifications.tool_call_start(
|
|
78
|
+
tool_call_id=tool_call_id,
|
|
79
|
+
title=f"Spawning agent: {agent_name}",
|
|
80
|
+
kind="execute",
|
|
81
|
+
raw_input={
|
|
82
|
+
"agent_name": agent_name,
|
|
83
|
+
"task_prompt": task_prompt,
|
|
84
|
+
},
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
aggregated_content: list[str] = [] # Aggregate output as we stream
|
|
88
|
+
try:
|
|
89
|
+
# Run the subagent and handle events
|
|
90
|
+
async for event in target_agent.run_stream(task_prompt):
|
|
91
|
+
await _handle_subagent_event(event, tool_call_id, aggregated_content, session)
|
|
92
|
+
|
|
93
|
+
final_content = "".join(aggregated_content).strip()
|
|
94
|
+
await session.notifications.tool_call_progress(
|
|
95
|
+
tool_call_id=tool_call_id,
|
|
96
|
+
status="completed",
|
|
97
|
+
content=[final_content] if final_content else None,
|
|
98
|
+
)
|
|
99
|
+
except Exception as e:
|
|
100
|
+
error_msg = f"Subagent execution failed: {e}"
|
|
101
|
+
logger.exception("Subagent execution error", error=str(e))
|
|
102
|
+
await session.notifications.tool_call_progress(
|
|
103
|
+
tool_call_id=tool_call_id,
|
|
104
|
+
status="failed",
|
|
105
|
+
raw_output=error_msg,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
error_msg = f"Failed to spawn agent '{agent_name}': {e}"
|
|
110
|
+
logger.exception("Spawn command error", error=str(e))
|
|
111
|
+
raise CommandError(error_msg) from e
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def _handle_subagent_event(
|
|
115
|
+
event: RichAgentStreamEvent[Any],
|
|
116
|
+
tool_call_id: str,
|
|
117
|
+
aggregated_content: list[str],
|
|
118
|
+
session: ACPSession,
|
|
119
|
+
) -> None:
|
|
120
|
+
"""Handle events from spawned subagent and convert to tool_call_progress.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
event: Event from the subagent stream
|
|
124
|
+
tool_call_id: ID of the tool call box
|
|
125
|
+
aggregated_content: List to accumulate content for final display
|
|
126
|
+
session: ACP session for notifications
|
|
127
|
+
"""
|
|
128
|
+
match event:
|
|
129
|
+
case (
|
|
130
|
+
PartStartEvent(part=TextPart(content=delta))
|
|
131
|
+
| PartDeltaEvent(delta=TextPartDelta(content_delta=delta))
|
|
132
|
+
):
|
|
133
|
+
# Subagent text output → accumulate and update progress
|
|
134
|
+
aggregated_content.append(delta)
|
|
135
|
+
await session.notifications.tool_call_progress(
|
|
136
|
+
tool_call_id=tool_call_id,
|
|
137
|
+
status="in_progress",
|
|
138
|
+
content=["".join(aggregated_content)],
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
case (
|
|
142
|
+
PartStartEvent(part=ThinkingPart(content=delta))
|
|
143
|
+
| PartDeltaEvent(delta=ThinkingPartDelta(content_delta=delta))
|
|
144
|
+
):
|
|
145
|
+
# Subagent thinking → show thinking indicator
|
|
146
|
+
if delta:
|
|
147
|
+
thinking_text = f"💭 {delta}"
|
|
148
|
+
aggregated_content.append(thinking_text)
|
|
149
|
+
await session.notifications.tool_call_progress(
|
|
150
|
+
tool_call_id=tool_call_id,
|
|
151
|
+
status="in_progress",
|
|
152
|
+
content=["".join(aggregated_content)],
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
case FunctionToolCallEvent(part=part):
|
|
156
|
+
# Subagent calls a tool → show nested tool call
|
|
157
|
+
tool_text = f"\n🔧 Using tool: {part.tool_name}\n"
|
|
158
|
+
aggregated_content.append(tool_text)
|
|
159
|
+
await session.notifications.tool_call_progress(
|
|
160
|
+
tool_call_id=tool_call_id,
|
|
161
|
+
status="in_progress",
|
|
162
|
+
content=["".join(aggregated_content)],
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
case FunctionToolResultEvent(
|
|
166
|
+
result=ToolReturnPart(content=content, tool_name=tool_name),
|
|
167
|
+
):
|
|
168
|
+
# Subagent tool completes → show tool result
|
|
169
|
+
result_text = f"✅ {tool_name}: {content}\n"
|
|
170
|
+
aggregated_content.append(result_text)
|
|
171
|
+
await session.notifications.tool_call_progress(
|
|
172
|
+
tool_call_id=tool_call_id,
|
|
173
|
+
status="in_progress",
|
|
174
|
+
content=["".join(aggregated_content)],
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
case FunctionToolResultEvent(
|
|
178
|
+
result=RetryPromptPart(tool_name=tool_name) as result,
|
|
179
|
+
):
|
|
180
|
+
# Tool call failed and needs retry
|
|
181
|
+
error_message = result.model_response()
|
|
182
|
+
error_text = f"❌ {tool_name or 'unknown'}: Error: {error_message}\n"
|
|
183
|
+
aggregated_content.append(error_text)
|
|
184
|
+
await session.notifications.tool_call_progress(
|
|
185
|
+
tool_call_id=tool_call_id,
|
|
186
|
+
status="in_progress",
|
|
187
|
+
content=["".join(aggregated_content)],
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
case ToolCallProgressEvent(message=message, tool_name=tool_name):
|
|
191
|
+
# Progress event from tools
|
|
192
|
+
if message:
|
|
193
|
+
progress_text = f"🔄 {tool_name}: {message}\n"
|
|
194
|
+
aggregated_content.append(progress_text)
|
|
195
|
+
await session.notifications.tool_call_progress(
|
|
196
|
+
tool_call_id=tool_call_id,
|
|
197
|
+
status="in_progress",
|
|
198
|
+
content=["".join(aggregated_content)],
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
case (
|
|
202
|
+
PartStartEvent()
|
|
203
|
+
| PartDeltaEvent(delta=ToolCallPartDelta())
|
|
204
|
+
| FinalResultEvent()
|
|
205
|
+
| StreamCompleteEvent()
|
|
206
|
+
):
|
|
207
|
+
pass # These events don't need special handling
|
|
208
|
+
|
|
209
|
+
case _:
|
|
210
|
+
logger.debug("Unhandled subagent event", event_type=type(event).__name__)
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""Content conversion utilities for ACP (Agent Client Protocol) integration.
|
|
2
|
+
|
|
3
|
+
This module handles conversion between pydantic-ai message formats and ACP protocol
|
|
4
|
+
content blocks, session updates, and other data structures using the external acp library.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import base64
|
|
10
|
+
from typing import TYPE_CHECKING, Any, assert_never, overload
|
|
11
|
+
|
|
12
|
+
from pydantic import HttpUrl
|
|
13
|
+
from pydantic_ai import AudioUrl, BinaryContent, BinaryImage, DocumentUrl, ImageUrl, VideoUrl
|
|
14
|
+
|
|
15
|
+
from acp.schema import (
|
|
16
|
+
AudioContentBlock,
|
|
17
|
+
BlobResourceContents,
|
|
18
|
+
EmbeddedResourceContentBlock,
|
|
19
|
+
HttpMcpServer,
|
|
20
|
+
ImageContentBlock,
|
|
21
|
+
ResourceContentBlock,
|
|
22
|
+
SessionMode,
|
|
23
|
+
SseMcpServer,
|
|
24
|
+
StdioMcpServer,
|
|
25
|
+
TextContentBlock,
|
|
26
|
+
TextResourceContents,
|
|
27
|
+
)
|
|
28
|
+
from agentpool.log import get_logger
|
|
29
|
+
from agentpool_config.mcp_server import (
|
|
30
|
+
SSEMCPServerConfig,
|
|
31
|
+
StdioMCPServerConfig,
|
|
32
|
+
StreamableHTTPMCPServerConfig,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from collections.abc import Sequence
|
|
38
|
+
|
|
39
|
+
from pydantic_ai import UserContent
|
|
40
|
+
|
|
41
|
+
from acp.schema import ContentBlock, McpServer
|
|
42
|
+
from agentpool.messaging import MessageNode
|
|
43
|
+
from agentpool_config.mcp_server import MCPServerConfig
|
|
44
|
+
from agentpool_config.nodes import ToolConfirmationMode
|
|
45
|
+
|
|
46
|
+
logger = get_logger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@overload
|
|
50
|
+
def convert_acp_mcp_server_to_config(
|
|
51
|
+
acp_server: HttpMcpServer,
|
|
52
|
+
) -> StreamableHTTPMCPServerConfig: ...
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@overload
|
|
56
|
+
def convert_acp_mcp_server_to_config(
|
|
57
|
+
acp_server: SseMcpServer,
|
|
58
|
+
) -> SSEMCPServerConfig: ...
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@overload
|
|
62
|
+
def convert_acp_mcp_server_to_config(
|
|
63
|
+
acp_server: StdioMcpServer,
|
|
64
|
+
) -> StdioMCPServerConfig: ...
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@overload
|
|
68
|
+
def convert_acp_mcp_server_to_config(acp_server: McpServer) -> MCPServerConfig: ...
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def convert_acp_mcp_server_to_config(acp_server: McpServer) -> MCPServerConfig:
|
|
72
|
+
"""Convert ACP McpServer to native MCPServerConfig.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
acp_server: ACP McpServer object from session/new request
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
MCPServerConfig instance
|
|
79
|
+
"""
|
|
80
|
+
match acp_server:
|
|
81
|
+
case StdioMcpServer(name=name, command=cmd, args=args, env=env_vars):
|
|
82
|
+
env = {var.name: var.value for var in env_vars}
|
|
83
|
+
return StdioMCPServerConfig(name=name, command=cmd, args=list(args), env=env)
|
|
84
|
+
case SseMcpServer(name=name, url=url, headers=headers):
|
|
85
|
+
h = {h.name: h.value for h in headers}
|
|
86
|
+
return SSEMCPServerConfig(name=name, url=HttpUrl(url), headers=h)
|
|
87
|
+
case HttpMcpServer(name=name, url=url, headers=headers):
|
|
88
|
+
h = {h.name: h.value for h in acp_server.headers}
|
|
89
|
+
return StreamableHTTPMCPServerConfig(name=name, url=HttpUrl(url), headers=h)
|
|
90
|
+
case _ as unreachable:
|
|
91
|
+
assert_never(unreachable)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def format_uri_as_link(uri: str) -> str:
|
|
95
|
+
"""Format URI as markdown-style link similar to other ACP implementations.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
uri: URI to format (file://, zed://, etc.)
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Markdown-style link in format [@name](uri)
|
|
102
|
+
"""
|
|
103
|
+
if uri.startswith("file://"):
|
|
104
|
+
path = uri[7:] # Remove "file://"
|
|
105
|
+
name = path.split("/")[-1] or path
|
|
106
|
+
return f"[@{name}]({uri})"
|
|
107
|
+
if uri.startswith("zed://"):
|
|
108
|
+
parts = uri.split("/")
|
|
109
|
+
name = parts[-1] or uri
|
|
110
|
+
return f"[@{name}]({uri})"
|
|
111
|
+
return uri
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def from_acp_content(blocks: Sequence[ContentBlock]) -> Sequence[UserContent]:
|
|
115
|
+
"""Convert ACP content blocks to pydantic-ai UserContent objects.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
blocks: List of ACP ContentBlock objects
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
List of pydantic-ai UserContent objects (str, ImageUrl, BinaryContent, etc.)
|
|
122
|
+
"""
|
|
123
|
+
content: list[UserContent] = []
|
|
124
|
+
|
|
125
|
+
for block in blocks:
|
|
126
|
+
match block:
|
|
127
|
+
case TextContentBlock(text=text):
|
|
128
|
+
content.append(text)
|
|
129
|
+
|
|
130
|
+
case ImageContentBlock(data=data, mime_type=mime_type):
|
|
131
|
+
# ACP image data is base64 encoded
|
|
132
|
+
binary_data = base64.b64decode(data)
|
|
133
|
+
content.append(BinaryImage(data=binary_data, media_type=mime_type))
|
|
134
|
+
|
|
135
|
+
case AudioContentBlock(data=data, mime_type=mime_type):
|
|
136
|
+
binary_data = base64.b64decode(data)
|
|
137
|
+
content.append(BinaryContent(data=binary_data, media_type=mime_type))
|
|
138
|
+
|
|
139
|
+
case ResourceContentBlock(uri=uri, mime_type=mime_type):
|
|
140
|
+
# Convert to appropriate URL type based on MIME type
|
|
141
|
+
if mime_type:
|
|
142
|
+
if mime_type.startswith("image/"):
|
|
143
|
+
content.append(ImageUrl(url=uri))
|
|
144
|
+
elif mime_type.startswith("audio/"):
|
|
145
|
+
content.append(AudioUrl(url=uri))
|
|
146
|
+
elif mime_type.startswith("video/"):
|
|
147
|
+
content.append(VideoUrl(url=uri))
|
|
148
|
+
elif mime_type == "application/pdf":
|
|
149
|
+
content.append(DocumentUrl(url=uri))
|
|
150
|
+
else:
|
|
151
|
+
# Generic resource - convert to text link
|
|
152
|
+
content.append(format_uri_as_link(uri))
|
|
153
|
+
else:
|
|
154
|
+
# No MIME type - fallback to text link
|
|
155
|
+
content.append(format_uri_as_link(uri))
|
|
156
|
+
|
|
157
|
+
case EmbeddedResourceContentBlock(resource=resource):
|
|
158
|
+
match resource:
|
|
159
|
+
case TextResourceContents(uri=uri, text=text):
|
|
160
|
+
content.append(format_uri_as_link(uri))
|
|
161
|
+
content.append(f'\n<context ref="{uri}">\n{text}\n</context>')
|
|
162
|
+
case BlobResourceContents(blob=blob, mime_type=mime_type):
|
|
163
|
+
# Convert embedded binary to appropriate content type
|
|
164
|
+
binary_data = base64.b64decode(blob)
|
|
165
|
+
if mime_type and mime_type.startswith("image/"):
|
|
166
|
+
content.append(BinaryImage(data=binary_data, media_type=mime_type))
|
|
167
|
+
elif mime_type and mime_type.startswith("audio/"):
|
|
168
|
+
content.append(BinaryContent(data=binary_data, media_type=mime_type))
|
|
169
|
+
elif mime_type == "application/pdf":
|
|
170
|
+
content.append(
|
|
171
|
+
BinaryContent(data=binary_data, media_type="application/pdf")
|
|
172
|
+
)
|
|
173
|
+
else:
|
|
174
|
+
# Unknown binary type - describe it
|
|
175
|
+
formatted_uri = format_uri_as_link(resource.uri)
|
|
176
|
+
content.append(f"Binary Resource: {formatted_uri}")
|
|
177
|
+
|
|
178
|
+
return content
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def agent_to_mode(agent: MessageNode[Any, Any]) -> SessionMode:
|
|
182
|
+
"""Convert agent to a session mode (deprecated - use get_confirmation_modes)."""
|
|
183
|
+
desc = agent.description or f"Switch to {agent.name} agent"
|
|
184
|
+
return SessionMode(id=agent.name, name=agent.display_name, description=desc)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def get_confirmation_modes() -> list[SessionMode]:
|
|
188
|
+
"""Get available tool confirmation modes as ACP session modes.
|
|
189
|
+
|
|
190
|
+
Returns standard ACP-compatible modes for tool confirmation levels.
|
|
191
|
+
"""
|
|
192
|
+
return [
|
|
193
|
+
SessionMode(
|
|
194
|
+
id="default",
|
|
195
|
+
name="Default",
|
|
196
|
+
description="Require confirmation for tools marked as needing it",
|
|
197
|
+
),
|
|
198
|
+
SessionMode(
|
|
199
|
+
id="acceptEdits",
|
|
200
|
+
name="Accept Edits",
|
|
201
|
+
description="Auto-approve all tool calls without confirmation",
|
|
202
|
+
),
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def mode_id_to_confirmation_mode(mode_id: str) -> ToolConfirmationMode | None:
|
|
207
|
+
"""Map ACP mode ID to ToolConfirmationMode.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
ToolConfirmationMode value or None if mode_id is invalid
|
|
211
|
+
"""
|
|
212
|
+
mapping: dict[str, ToolConfirmationMode] = {
|
|
213
|
+
"default": "per_tool",
|
|
214
|
+
"acceptEdits": "never",
|
|
215
|
+
"bypassPermissions": "never",
|
|
216
|
+
# "plan": "..."
|
|
217
|
+
}
|
|
218
|
+
return mapping.get(mode_id)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def confirmation_mode_to_mode_id(mode: ToolConfirmationMode) -> str:
|
|
222
|
+
"""Map ToolConfirmationMode to ACP mode ID.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
mode: Tool confirmation mode
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
ACP mode ID string
|
|
229
|
+
"""
|
|
230
|
+
mapping: dict[ToolConfirmationMode, str] = {
|
|
231
|
+
"per_tool": "default",
|
|
232
|
+
"always": "default", # No direct ACP equivalent, use default (requires confirmation)
|
|
233
|
+
"never": "acceptEdits",
|
|
234
|
+
}
|
|
235
|
+
return mapping.get(mode, "default")
|