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.
- 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/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
## ACP Protocol Features
|
|
2
|
+
|
|
3
|
+
### JSON-RPC 2.0 Communication
|
|
4
|
+
|
|
5
|
+
ACP uses JSON-RPC 2.0 over newline-delimited JSON streams:
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
// Initialize request
|
|
9
|
+
{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":1},"id":1}
|
|
10
|
+
|
|
11
|
+
// Initialize response
|
|
12
|
+
{"jsonrpc":"2.0","result":{"protocolVersion":1,"agentCapabilities":{...}},"id":1}
|
|
13
|
+
|
|
14
|
+
// Create session
|
|
15
|
+
{"jsonrpc":"2.0","method":"session/new","params":{"cwd":"/tmp"},"id":2}
|
|
16
|
+
|
|
17
|
+
// Session response
|
|
18
|
+
{"jsonrpc":"2.0","result":{"sessionId":"sess_abc123"},"id":2}
|
|
19
|
+
|
|
20
|
+
// Send prompt
|
|
21
|
+
{"jsonrpc":"2.0","method":"session/prompt","params":{
|
|
22
|
+
"sessionId":"sess_abc123",
|
|
23
|
+
"prompt":[{"type":"text","text":"Hello!"}]
|
|
24
|
+
},"id":3}
|
|
25
|
+
|
|
26
|
+
// Streaming responses via session updates
|
|
27
|
+
{"jsonrpc":"2.0","method":"session/update","params":{
|
|
28
|
+
"sessionId":"sess_abc123",
|
|
29
|
+
"update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"Hi there!"}}
|
|
30
|
+
}}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Content Blocks
|
|
34
|
+
|
|
35
|
+
ACP supports rich content blocks:
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
# Text content
|
|
39
|
+
TextContent(text="Hello world")
|
|
40
|
+
|
|
41
|
+
# Image content
|
|
42
|
+
ImageContent(type="image", data="base64...", mimeType="image/png")
|
|
43
|
+
|
|
44
|
+
# Audio content
|
|
45
|
+
AudioContent(type="audio", data="base64...", mimeType="audio/wav")
|
|
46
|
+
|
|
47
|
+
# Resource links
|
|
48
|
+
ResourceContentBlock(type="resource_link", uri="file:///path/to/file", name="document.pdf")
|
|
49
|
+
|
|
50
|
+
# Embedded resources
|
|
51
|
+
EmbeddedResource(type="resource", resource=TextResourceContents(uri="...", text="..."))
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### MCP Server Integration
|
|
56
|
+
|
|
57
|
+
ACP provides seamless integration with MCP (Model Context Protocol) servers, allowing agents to access external tools and data sources. MCP servers are automatically connected when creating sessions.
|
|
58
|
+
|
|
59
|
+
#### How MCP Integration Works
|
|
60
|
+
|
|
61
|
+
1. **Session Creation**: Client provides MCP server configurations in `session/new`
|
|
62
|
+
2. **Automatic Connection**: ACP server connects to all specified MCP servers
|
|
63
|
+
3. **Tool Integration**: MCP tools become available to the agent automatically
|
|
64
|
+
4. **Transparent Usage**: Agent can use MCP tools just like built-in tools
|
acp/__init__.py
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Agent Client protocol (ACP) implementation."""
|
|
2
|
+
|
|
3
|
+
from acp.client import DefaultACPClient, HeadlessACPClient, NoOpClient, ClientSideConnection
|
|
4
|
+
from acp.agent import AgentSideConnection
|
|
5
|
+
from acp.bridge import ACPBridge, BridgeSettings
|
|
6
|
+
from acp.filesystem import ACPFileSystem, ACPPath
|
|
7
|
+
from acp.agent.protocol import Agent
|
|
8
|
+
from acp.client.protocol import Client
|
|
9
|
+
from acp.terminal_handle import TerminalHandle
|
|
10
|
+
from acp.tool_call_state import ToolCallState
|
|
11
|
+
from acp.schema import (
|
|
12
|
+
AuthenticateRequest,
|
|
13
|
+
AuthenticateResponse,
|
|
14
|
+
CancelNotification,
|
|
15
|
+
CreateTerminalRequest,
|
|
16
|
+
ClientCapabilities,
|
|
17
|
+
SessionMode,
|
|
18
|
+
FileSystemCapability,
|
|
19
|
+
AgentMessageChunk,
|
|
20
|
+
UserMessageChunk,
|
|
21
|
+
TextContentBlock,
|
|
22
|
+
SessionModeState,
|
|
23
|
+
Implementation,
|
|
24
|
+
ToolCallLocation,
|
|
25
|
+
EnvVariable,
|
|
26
|
+
StdioMcpServer,
|
|
27
|
+
SseMcpServer,
|
|
28
|
+
HttpMcpServer,
|
|
29
|
+
CreateTerminalResponse,
|
|
30
|
+
InitializeRequest,
|
|
31
|
+
PlanEntryPriority,
|
|
32
|
+
PlanEntryStatus,
|
|
33
|
+
InitializeResponse,
|
|
34
|
+
KillTerminalCommandRequest,
|
|
35
|
+
KillTerminalCommandResponse,
|
|
36
|
+
LoadSessionRequest,
|
|
37
|
+
LoadSessionResponse,
|
|
38
|
+
ModelInfo,
|
|
39
|
+
AllowedOutcome,
|
|
40
|
+
DeniedOutcome,
|
|
41
|
+
NewSessionRequest,
|
|
42
|
+
NewSessionResponse,
|
|
43
|
+
PromptRequest,
|
|
44
|
+
PromptResponse,
|
|
45
|
+
ReadTextFileRequest,
|
|
46
|
+
ReadTextFileResponse,
|
|
47
|
+
ReleaseTerminalRequest,
|
|
48
|
+
ReleaseTerminalResponse,
|
|
49
|
+
RequestPermissionRequest,
|
|
50
|
+
RequestPermissionResponse,
|
|
51
|
+
SessionModelState,
|
|
52
|
+
SessionNotification,
|
|
53
|
+
SetSessionModelRequest,
|
|
54
|
+
SetSessionModelResponse,
|
|
55
|
+
SetSessionModeRequest,
|
|
56
|
+
SetSessionModeResponse,
|
|
57
|
+
TerminalOutputRequest,
|
|
58
|
+
TerminalOutputResponse,
|
|
59
|
+
WaitForTerminalExitRequest,
|
|
60
|
+
WaitForTerminalExitResponse,
|
|
61
|
+
WriteTextFileRequest,
|
|
62
|
+
WriteTextFileResponse,
|
|
63
|
+
PermissionOption,
|
|
64
|
+
PROTOCOL_VERSION,
|
|
65
|
+
AgentMethod,
|
|
66
|
+
ClientMethod,
|
|
67
|
+
Annotations,
|
|
68
|
+
AvailableCommand,
|
|
69
|
+
PlanEntry,
|
|
70
|
+
ToolCallContent,
|
|
71
|
+
ToolCallKind,
|
|
72
|
+
ToolCallStatus,
|
|
73
|
+
ToolCall,
|
|
74
|
+
)
|
|
75
|
+
from acp.stdio import stdio_streams, run_agent, connect_to_agent
|
|
76
|
+
from acp.exceptions import RequestError
|
|
77
|
+
|
|
78
|
+
__version__ = "0.0.1"
|
|
79
|
+
|
|
80
|
+
__all__ = [ # noqa: RUF022
|
|
81
|
+
# bridge
|
|
82
|
+
"ACPBridge",
|
|
83
|
+
"BridgeSettings",
|
|
84
|
+
# client implementations
|
|
85
|
+
"DefaultACPClient",
|
|
86
|
+
"HeadlessACPClient",
|
|
87
|
+
"NoOpClient",
|
|
88
|
+
# constants
|
|
89
|
+
"PROTOCOL_VERSION",
|
|
90
|
+
# literal types
|
|
91
|
+
"AgentMethod",
|
|
92
|
+
"ClientMethod",
|
|
93
|
+
# types
|
|
94
|
+
"Annotations",
|
|
95
|
+
"AvailableCommand",
|
|
96
|
+
"PlanEntry",
|
|
97
|
+
"AllowedOutcome",
|
|
98
|
+
"ToolCall",
|
|
99
|
+
"DeniedOutcome",
|
|
100
|
+
"ToolCallContent",
|
|
101
|
+
"PermissionOption",
|
|
102
|
+
"ToolCallKind",
|
|
103
|
+
"PlanEntryPriority",
|
|
104
|
+
"PlanEntryStatus",
|
|
105
|
+
"ToolCallStatus",
|
|
106
|
+
"InitializeRequest",
|
|
107
|
+
"ToolCallLocation",
|
|
108
|
+
"InitializeResponse",
|
|
109
|
+
"EnvVariable",
|
|
110
|
+
"HttpMcpServer",
|
|
111
|
+
"StdioMcpServer",
|
|
112
|
+
"SseMcpServer",
|
|
113
|
+
"NewSessionRequest",
|
|
114
|
+
"AgentMessageChunk",
|
|
115
|
+
"UserMessageChunk",
|
|
116
|
+
"TextContentBlock",
|
|
117
|
+
"NewSessionResponse",
|
|
118
|
+
"LoadSessionRequest",
|
|
119
|
+
"LoadSessionResponse",
|
|
120
|
+
"AuthenticateRequest",
|
|
121
|
+
"AuthenticateResponse",
|
|
122
|
+
"PromptRequest",
|
|
123
|
+
"ClientCapabilities",
|
|
124
|
+
"SessionModeState",
|
|
125
|
+
"SessionMode",
|
|
126
|
+
"Implementation",
|
|
127
|
+
"PromptResponse",
|
|
128
|
+
"WriteTextFileRequest",
|
|
129
|
+
"WriteTextFileResponse",
|
|
130
|
+
"ReadTextFileRequest",
|
|
131
|
+
"ReadTextFileResponse",
|
|
132
|
+
"RequestPermissionRequest",
|
|
133
|
+
"RequestPermissionResponse",
|
|
134
|
+
"CancelNotification",
|
|
135
|
+
"SessionNotification",
|
|
136
|
+
"SetSessionModeRequest",
|
|
137
|
+
"SetSessionModeResponse",
|
|
138
|
+
# model types
|
|
139
|
+
"ModelInfo",
|
|
140
|
+
"SessionModelState",
|
|
141
|
+
"SetSessionModelRequest",
|
|
142
|
+
"SetSessionModelResponse",
|
|
143
|
+
# terminal types
|
|
144
|
+
"CreateTerminalRequest",
|
|
145
|
+
"CreateTerminalResponse",
|
|
146
|
+
"TerminalOutputRequest",
|
|
147
|
+
"TerminalOutputResponse",
|
|
148
|
+
"WaitForTerminalExitRequest",
|
|
149
|
+
"WaitForTerminalExitResponse",
|
|
150
|
+
"KillTerminalCommandRequest",
|
|
151
|
+
"KillTerminalCommandResponse",
|
|
152
|
+
"ReleaseTerminalRequest",
|
|
153
|
+
"ReleaseTerminalResponse",
|
|
154
|
+
# core
|
|
155
|
+
"AgentSideConnection",
|
|
156
|
+
"ClientSideConnection",
|
|
157
|
+
"RequestError",
|
|
158
|
+
"Agent",
|
|
159
|
+
"Client",
|
|
160
|
+
"TerminalHandle",
|
|
161
|
+
"ToolCallState",
|
|
162
|
+
# connection helpers (recommended)
|
|
163
|
+
"run_agent",
|
|
164
|
+
"connect_to_agent",
|
|
165
|
+
# split protocols
|
|
166
|
+
"FileSystemCapability",
|
|
167
|
+
# stdio helper
|
|
168
|
+
"stdio_streams",
|
|
169
|
+
# filesystem
|
|
170
|
+
"ACPFileSystem",
|
|
171
|
+
"ACPPath",
|
|
172
|
+
]
|
acp/__main__.py
ADDED
acp/acp_requests.py
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"""ACP request utilities for simplified client interactions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from acp.schema import (
|
|
9
|
+
CreateTerminalRequest,
|
|
10
|
+
EnvVariable,
|
|
11
|
+
KillTerminalCommandRequest,
|
|
12
|
+
PermissionOption,
|
|
13
|
+
ReadTextFileRequest,
|
|
14
|
+
ReleaseTerminalRequest,
|
|
15
|
+
RequestPermissionRequest,
|
|
16
|
+
TerminalOutputRequest,
|
|
17
|
+
ToolCall,
|
|
18
|
+
WaitForTerminalExitRequest,
|
|
19
|
+
WriteTextFileRequest,
|
|
20
|
+
)
|
|
21
|
+
from acp.terminal_handle import TerminalHandle
|
|
22
|
+
from agentpool.log import get_logger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from acp import (
|
|
27
|
+
Client,
|
|
28
|
+
RequestPermissionResponse,
|
|
29
|
+
TerminalOutputResponse,
|
|
30
|
+
WaitForTerminalExitResponse,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
logger = get_logger(__name__)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
RULES_FILE_NAMES = [
|
|
37
|
+
".rules",
|
|
38
|
+
"CLAUDE.md",
|
|
39
|
+
"AGENT.md",
|
|
40
|
+
"AGENTS.md",
|
|
41
|
+
"GEMINI.md",
|
|
42
|
+
".cursorrules",
|
|
43
|
+
".windsurfrules",
|
|
44
|
+
".clinerules",
|
|
45
|
+
".github/copilot-instructions.md",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ACPRequests:
|
|
50
|
+
"""Clean API for creating and sending ACP session requests.
|
|
51
|
+
|
|
52
|
+
Provides convenient methods for common request patterns,
|
|
53
|
+
handling both creation and sending in a single call.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, client: Client, session_id: str) -> None:
|
|
57
|
+
"""Initialize requests helper.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
client: ACP client
|
|
61
|
+
session_id: Session ID
|
|
62
|
+
"""
|
|
63
|
+
self.client = client
|
|
64
|
+
self.id = session_id
|
|
65
|
+
|
|
66
|
+
async def read_text_file(
|
|
67
|
+
self,
|
|
68
|
+
path: str,
|
|
69
|
+
*,
|
|
70
|
+
limit: int | None = None,
|
|
71
|
+
line: int | None = None,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""Read text content from a file.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
path: File path to read
|
|
77
|
+
limit: Maximum number of lines to read
|
|
78
|
+
line: Line number to start reading from (1-based)
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
File content as string
|
|
82
|
+
"""
|
|
83
|
+
request = ReadTextFileRequest(
|
|
84
|
+
session_id=self.id,
|
|
85
|
+
path=path,
|
|
86
|
+
limit=limit,
|
|
87
|
+
line=line,
|
|
88
|
+
)
|
|
89
|
+
response = await self.client.read_text_file(request)
|
|
90
|
+
return response.content
|
|
91
|
+
|
|
92
|
+
async def read_agent_rules(self, cwd: str) -> str | None:
|
|
93
|
+
"""Check common agent rule files and return content of first match.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
cwd: Current working directory
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Agent rules as string or None if not found
|
|
100
|
+
"""
|
|
101
|
+
for filename in RULES_FILE_NAMES:
|
|
102
|
+
if info := await self.read_text_file(f"{cwd}/{filename}"):
|
|
103
|
+
return info
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
async def write_text_file(self, path: str, content: str) -> None:
|
|
107
|
+
"""Write text content to a file.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
path: File path to write
|
|
111
|
+
content: Text content to write
|
|
112
|
+
"""
|
|
113
|
+
request = WriteTextFileRequest(session_id=self.id, path=path, content=content)
|
|
114
|
+
await self.client.write_text_file(request)
|
|
115
|
+
|
|
116
|
+
async def create_terminal(
|
|
117
|
+
self,
|
|
118
|
+
command: str,
|
|
119
|
+
*,
|
|
120
|
+
args: list[str] | None = None,
|
|
121
|
+
cwd: str | None = None,
|
|
122
|
+
env: dict[str, str] | None = None,
|
|
123
|
+
output_byte_limit: int | None = None,
|
|
124
|
+
) -> TerminalHandle:
|
|
125
|
+
"""Create a new terminal session.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
command: Command to run. For shell commands (pipes, redirects, etc.),
|
|
129
|
+
pass the full command string and omit args.
|
|
130
|
+
args: Command arguments, appended to command.
|
|
131
|
+
cwd: Working directory for terminal
|
|
132
|
+
env: Environment variables for terminal
|
|
133
|
+
output_byte_limit: Maximum bytes to capture from output
|
|
134
|
+
"""
|
|
135
|
+
request = CreateTerminalRequest(
|
|
136
|
+
session_id=self.id,
|
|
137
|
+
command=command,
|
|
138
|
+
# Only include args if non-empty, following claude-code-acp pattern.
|
|
139
|
+
# When args is None/empty, ACP clients interpret command as a shell command.
|
|
140
|
+
args=args or None,
|
|
141
|
+
cwd=cwd,
|
|
142
|
+
env=[EnvVariable(name=k, value=v) for k, v in (env or {}).items()],
|
|
143
|
+
output_byte_limit=output_byte_limit,
|
|
144
|
+
)
|
|
145
|
+
response = await self.client.create_terminal(request)
|
|
146
|
+
return TerminalHandle(terminal_id=response.terminal_id, requests=self)
|
|
147
|
+
|
|
148
|
+
async def terminal_output(self, terminal_id: str) -> TerminalOutputResponse:
|
|
149
|
+
"""Get output from a terminal session.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
terminal_id: Terminal identifier
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Terminal output response
|
|
156
|
+
"""
|
|
157
|
+
request = TerminalOutputRequest(session_id=self.id, terminal_id=terminal_id)
|
|
158
|
+
return await self.client.terminal_output(request)
|
|
159
|
+
|
|
160
|
+
async def wait_for_terminal_exit(
|
|
161
|
+
self,
|
|
162
|
+
terminal_id: str,
|
|
163
|
+
) -> WaitForTerminalExitResponse:
|
|
164
|
+
"""Wait for a terminal to exit.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
terminal_id: Terminal identifier
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
Terminal exit response with exit_code
|
|
171
|
+
"""
|
|
172
|
+
request = WaitForTerminalExitRequest(session_id=self.id, terminal_id=terminal_id)
|
|
173
|
+
return await self.client.wait_for_terminal_exit(request)
|
|
174
|
+
|
|
175
|
+
async def kill_terminal(self, terminal_id: str) -> None:
|
|
176
|
+
"""Kill a terminal session.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
terminal_id: Terminal identifier to kill
|
|
180
|
+
"""
|
|
181
|
+
request = KillTerminalCommandRequest(session_id=self.id, terminal_id=terminal_id)
|
|
182
|
+
await self.client.kill_terminal(request)
|
|
183
|
+
|
|
184
|
+
async def release_terminal(self, terminal_id: str) -> None:
|
|
185
|
+
"""Release a terminal session.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
terminal_id: Terminal identifier to release
|
|
189
|
+
"""
|
|
190
|
+
request = ReleaseTerminalRequest(session_id=self.id, terminal_id=terminal_id)
|
|
191
|
+
await self.client.release_terminal(request)
|
|
192
|
+
|
|
193
|
+
async def run_command(
|
|
194
|
+
self,
|
|
195
|
+
command: str,
|
|
196
|
+
*,
|
|
197
|
+
args: list[str] | None = None,
|
|
198
|
+
cwd: str | None = None,
|
|
199
|
+
env: dict[str, str] | None = None,
|
|
200
|
+
output_byte_limit: int | None = None,
|
|
201
|
+
timeout_seconds: int | None = None,
|
|
202
|
+
) -> tuple[str, int | None]:
|
|
203
|
+
"""Execute a shell command and return output and exit code.
|
|
204
|
+
|
|
205
|
+
This is a high-level convenience method that creates a terminal,
|
|
206
|
+
runs the command, waits for completion, and cleans up.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
command: Command to execute
|
|
210
|
+
args: Command arguments
|
|
211
|
+
cwd: Working directory for command execution
|
|
212
|
+
env: Environment variables for command execution
|
|
213
|
+
output_byte_limit: Maximum bytes to capture from output
|
|
214
|
+
timeout_seconds: Command timeout in seconds
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Tuple of (output, exit_code)
|
|
218
|
+
"""
|
|
219
|
+
terminal_handle = await self.create_terminal(
|
|
220
|
+
command=command,
|
|
221
|
+
args=args,
|
|
222
|
+
cwd=cwd,
|
|
223
|
+
env=env,
|
|
224
|
+
output_byte_limit=output_byte_limit,
|
|
225
|
+
)
|
|
226
|
+
terminal_id = terminal_handle.terminal_id
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
if timeout_seconds: # Wait for completion (with optional timeout)
|
|
230
|
+
try:
|
|
231
|
+
exit_result = await asyncio.wait_for(
|
|
232
|
+
self.wait_for_terminal_exit(terminal_id),
|
|
233
|
+
timeout=timeout_seconds,
|
|
234
|
+
)
|
|
235
|
+
except TimeoutError: # Kill on timeout and get partial output
|
|
236
|
+
await self.kill_terminal(terminal_id)
|
|
237
|
+
output_response = await self.terminal_output(terminal_id)
|
|
238
|
+
return output_response.output, None
|
|
239
|
+
else:
|
|
240
|
+
exit_result = await self.wait_for_terminal_exit(terminal_id)
|
|
241
|
+
|
|
242
|
+
output_response = await self.terminal_output(terminal_id)
|
|
243
|
+
return output_response.output, exit_result.exit_code
|
|
244
|
+
|
|
245
|
+
finally: # Always release terminal
|
|
246
|
+
await self.release_terminal(terminal_id)
|
|
247
|
+
|
|
248
|
+
async def request_permission(
|
|
249
|
+
self,
|
|
250
|
+
tool_call_id: str,
|
|
251
|
+
*,
|
|
252
|
+
title: str | None = None,
|
|
253
|
+
options: list[PermissionOption] | None = None,
|
|
254
|
+
) -> RequestPermissionResponse:
|
|
255
|
+
"""Request permission from user before executing a tool call.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
tool_call_id: Unique identifier for the tool call
|
|
259
|
+
title: Human-readable description of the operation
|
|
260
|
+
options: Available permission options (defaults to allow/reject once)
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
Permission response with user's decision
|
|
264
|
+
"""
|
|
265
|
+
if options is None:
|
|
266
|
+
options = [
|
|
267
|
+
PermissionOption(
|
|
268
|
+
option_id="allow-once",
|
|
269
|
+
name="Allow once",
|
|
270
|
+
kind="allow_once",
|
|
271
|
+
),
|
|
272
|
+
PermissionOption(
|
|
273
|
+
option_id="reject-once",
|
|
274
|
+
name="Reject",
|
|
275
|
+
kind="reject_once",
|
|
276
|
+
),
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
tool_call = ToolCall(tool_call_id=tool_call_id, title=title)
|
|
280
|
+
request = RequestPermissionRequest(
|
|
281
|
+
session_id=self.id,
|
|
282
|
+
tool_call=tool_call,
|
|
283
|
+
options=options,
|
|
284
|
+
)
|
|
285
|
+
return await self.client.request_permission(request)
|