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/client/connection.py
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"""Client ACP Connection."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from functools import partial
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
7
|
+
|
|
8
|
+
import logfire
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from types import TracebackType
|
|
13
|
+
|
|
14
|
+
from anyio.abc import ByteReceiveStream, ByteSendStream
|
|
15
|
+
|
|
16
|
+
from acp.client.protocol import Client
|
|
17
|
+
from acp.connection import StreamObserver
|
|
18
|
+
from acp.schema import (
|
|
19
|
+
AuthenticateRequest,
|
|
20
|
+
CancelNotification,
|
|
21
|
+
ClientMethod,
|
|
22
|
+
CreateTerminalResponse,
|
|
23
|
+
ForkSessionRequest,
|
|
24
|
+
InitializeRequest,
|
|
25
|
+
KillTerminalCommandResponse,
|
|
26
|
+
ListSessionsRequest,
|
|
27
|
+
LoadSessionRequest,
|
|
28
|
+
NewSessionRequest,
|
|
29
|
+
PromptRequest,
|
|
30
|
+
ReadTextFileResponse,
|
|
31
|
+
ReleaseTerminalResponse,
|
|
32
|
+
RequestPermissionResponse,
|
|
33
|
+
ResumeSessionRequest,
|
|
34
|
+
SetSessionModelRequest,
|
|
35
|
+
SetSessionModeRequest,
|
|
36
|
+
TerminalOutputResponse,
|
|
37
|
+
WaitForTerminalExitResponse,
|
|
38
|
+
WriteTextFileResponse,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
from acp.agent.protocol import Agent
|
|
42
|
+
from acp.connection import Connection
|
|
43
|
+
from acp.exceptions import RequestError
|
|
44
|
+
from acp.schema import (
|
|
45
|
+
AuthenticateResponse,
|
|
46
|
+
CreateTerminalRequest,
|
|
47
|
+
ForkSessionResponse,
|
|
48
|
+
InitializeResponse,
|
|
49
|
+
KillTerminalCommandRequest,
|
|
50
|
+
ListSessionsResponse,
|
|
51
|
+
LoadSessionResponse,
|
|
52
|
+
NewSessionResponse,
|
|
53
|
+
PromptResponse,
|
|
54
|
+
ReadTextFileRequest,
|
|
55
|
+
ReleaseTerminalRequest,
|
|
56
|
+
RequestPermissionRequest,
|
|
57
|
+
ResumeSessionResponse,
|
|
58
|
+
SessionNotification,
|
|
59
|
+
SetSessionModelResponse,
|
|
60
|
+
SetSessionModeResponse,
|
|
61
|
+
TerminalOutputRequest,
|
|
62
|
+
WaitForTerminalExitRequest,
|
|
63
|
+
WriteTextFileRequest,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
if TYPE_CHECKING:
|
|
68
|
+
from collections.abc import Callable
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class ClientSideConnection(Agent):
|
|
72
|
+
"""Client-side connection.
|
|
73
|
+
|
|
74
|
+
Use when you implement the Client and need to talk to an Agent.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
to_client: factory that receives this connection and returns your Client
|
|
78
|
+
input: ByteSendStream (local -> peer)
|
|
79
|
+
output: ByteReceiveStream (peer -> local)
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __init__(
|
|
83
|
+
self,
|
|
84
|
+
to_client: Callable[[Agent], Client],
|
|
85
|
+
input_stream: ByteSendStream,
|
|
86
|
+
output_stream: ByteReceiveStream,
|
|
87
|
+
observers: list[StreamObserver] | None = None,
|
|
88
|
+
) -> None:
|
|
89
|
+
# Build client first so handler can delegate
|
|
90
|
+
client = to_client(self)
|
|
91
|
+
handler = partial(_handle_client_method, client)
|
|
92
|
+
self._conn = Connection(handler, input_stream, output_stream, observers=observers)
|
|
93
|
+
|
|
94
|
+
# agent-bound methods (client -> agent)
|
|
95
|
+
async def initialize(self, params: InitializeRequest) -> InitializeResponse:
|
|
96
|
+
dct = params.model_dump(
|
|
97
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
98
|
+
)
|
|
99
|
+
resp = await self._conn.send_request("initialize", dct)
|
|
100
|
+
return InitializeResponse.model_validate(resp)
|
|
101
|
+
|
|
102
|
+
async def new_session(self, params: NewSessionRequest) -> NewSessionResponse:
|
|
103
|
+
# Don't exclude_defaults - MCP server 'type' field is required for discriminated unions
|
|
104
|
+
dct = params.model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
105
|
+
resp = await self._conn.send_request("session/new", dct)
|
|
106
|
+
return NewSessionResponse.model_validate(resp)
|
|
107
|
+
|
|
108
|
+
async def load_session(self, params: LoadSessionRequest) -> LoadSessionResponse:
|
|
109
|
+
dct = params.model_dump(
|
|
110
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
111
|
+
)
|
|
112
|
+
resp = await self._conn.send_request("session/load", dct)
|
|
113
|
+
payload = resp if isinstance(resp, dict) else {}
|
|
114
|
+
return LoadSessionResponse.model_validate(payload)
|
|
115
|
+
|
|
116
|
+
async def list_sessions(self, params: ListSessionsRequest) -> ListSessionsResponse:
|
|
117
|
+
dct = params.model_dump(
|
|
118
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
119
|
+
)
|
|
120
|
+
resp = await self._conn.send_request("session/list", dct)
|
|
121
|
+
return ListSessionsResponse.model_validate(resp)
|
|
122
|
+
|
|
123
|
+
async def fork_session(self, params: ForkSessionRequest) -> ForkSessionResponse:
|
|
124
|
+
dct = params.model_dump(
|
|
125
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
126
|
+
)
|
|
127
|
+
resp = await self._conn.send_request("session/fork", dct)
|
|
128
|
+
return ForkSessionResponse.model_validate(resp)
|
|
129
|
+
|
|
130
|
+
async def resume_session(self, params: ResumeSessionRequest) -> ResumeSessionResponse:
|
|
131
|
+
dct = params.model_dump(
|
|
132
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
133
|
+
)
|
|
134
|
+
resp = await self._conn.send_request("session/resume", dct)
|
|
135
|
+
payload = resp if isinstance(resp, dict) else {}
|
|
136
|
+
return ResumeSessionResponse.model_validate(payload)
|
|
137
|
+
|
|
138
|
+
async def set_session_mode(self, params: SetSessionModeRequest) -> SetSessionModeResponse:
|
|
139
|
+
dct = params.model_dump(
|
|
140
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
141
|
+
)
|
|
142
|
+
resp = await self._conn.send_request("session/set_mode", dct)
|
|
143
|
+
payload = resp if isinstance(resp, dict) else {}
|
|
144
|
+
return SetSessionModeResponse.model_validate(payload)
|
|
145
|
+
|
|
146
|
+
async def set_session_model(self, params: SetSessionModelRequest) -> SetSessionModelResponse:
|
|
147
|
+
dct = params.model_dump(
|
|
148
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
149
|
+
)
|
|
150
|
+
resp = await self._conn.send_request("session/set_model", dct)
|
|
151
|
+
payload = resp if isinstance(resp, dict) else {}
|
|
152
|
+
return SetSessionModelResponse.model_validate(payload)
|
|
153
|
+
|
|
154
|
+
async def authenticate(self, params: AuthenticateRequest) -> AuthenticateResponse:
|
|
155
|
+
dct = params.model_dump(
|
|
156
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
157
|
+
)
|
|
158
|
+
resp = await self._conn.send_request("authenticate", dct)
|
|
159
|
+
payload = resp if isinstance(resp, dict) else {}
|
|
160
|
+
return AuthenticateResponse.model_validate(payload)
|
|
161
|
+
|
|
162
|
+
async def prompt(self, params: PromptRequest) -> PromptResponse:
|
|
163
|
+
# Don't exclude_defaults here - the 'type' field in content blocks has a default
|
|
164
|
+
# value but is required for discriminated unions to work
|
|
165
|
+
dct = params.model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
166
|
+
resp = await self._conn.send_request("session/prompt", dct)
|
|
167
|
+
return PromptResponse.model_validate(resp)
|
|
168
|
+
|
|
169
|
+
async def cancel(self, params: CancelNotification) -> None:
|
|
170
|
+
dct = params.model_dump(
|
|
171
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
172
|
+
)
|
|
173
|
+
await self._conn.send_notification("session/cancel", dct)
|
|
174
|
+
|
|
175
|
+
async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
176
|
+
return await self._conn.send_request(f"_{method}", params) # type: ignore[no-any-return]
|
|
177
|
+
|
|
178
|
+
async def ext_notification(self, method: str, params: dict[str, Any]) -> None:
|
|
179
|
+
await self._conn.send_notification(f"_{method}", params)
|
|
180
|
+
|
|
181
|
+
async def close(self) -> None:
|
|
182
|
+
await self._conn.close()
|
|
183
|
+
|
|
184
|
+
async def __aenter__(self) -> Self:
|
|
185
|
+
return self
|
|
186
|
+
|
|
187
|
+
async def __aexit__(
|
|
188
|
+
self,
|
|
189
|
+
exc_type: type[BaseException] | None,
|
|
190
|
+
exc_val: BaseException | None,
|
|
191
|
+
exc_tb: TracebackType | None,
|
|
192
|
+
) -> None:
|
|
193
|
+
await self.close()
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@logfire.instrument(r"Handle Client Method {method}")
|
|
197
|
+
async def _handle_client_method( # noqa: PLR0911
|
|
198
|
+
client: Client,
|
|
199
|
+
method: ClientMethod | str,
|
|
200
|
+
params: dict[str, Any] | None,
|
|
201
|
+
is_notification: bool,
|
|
202
|
+
) -> (
|
|
203
|
+
WriteTextFileResponse
|
|
204
|
+
| ReadTextFileResponse
|
|
205
|
+
| RequestPermissionResponse
|
|
206
|
+
| SessionNotification
|
|
207
|
+
| CreateTerminalResponse
|
|
208
|
+
| TerminalOutputResponse
|
|
209
|
+
| WaitForTerminalExitResponse
|
|
210
|
+
| ReleaseTerminalResponse
|
|
211
|
+
| KillTerminalCommandResponse
|
|
212
|
+
| dict[str, Any]
|
|
213
|
+
| None
|
|
214
|
+
):
|
|
215
|
+
"""Handle client method calls."""
|
|
216
|
+
match method:
|
|
217
|
+
case "fs/write_text_file":
|
|
218
|
+
write_file_request = WriteTextFileRequest.model_validate(params)
|
|
219
|
+
return await client.write_text_file(write_file_request)
|
|
220
|
+
case "fs/read_text_file":
|
|
221
|
+
read_file_request = ReadTextFileRequest.model_validate(params)
|
|
222
|
+
return await client.read_text_file(read_file_request)
|
|
223
|
+
case "session/request_permission":
|
|
224
|
+
permission_request = RequestPermissionRequest.model_validate(params)
|
|
225
|
+
return await client.request_permission(permission_request)
|
|
226
|
+
case "session/update":
|
|
227
|
+
notification = SessionNotification.model_validate(params)
|
|
228
|
+
await client.session_update(notification)
|
|
229
|
+
return None
|
|
230
|
+
case "terminal/create":
|
|
231
|
+
create_request = CreateTerminalRequest.model_validate(params)
|
|
232
|
+
return await client.create_terminal(create_request)
|
|
233
|
+
case "terminal/output":
|
|
234
|
+
output_request = TerminalOutputRequest.model_validate(params)
|
|
235
|
+
return await client.terminal_output(output_request)
|
|
236
|
+
case "terminal/release":
|
|
237
|
+
release_request = ReleaseTerminalRequest.model_validate(params)
|
|
238
|
+
return await client.release_terminal(release_request)
|
|
239
|
+
case "terminal/wait_for_exit":
|
|
240
|
+
wait_request = WaitForTerminalExitRequest.model_validate(params)
|
|
241
|
+
return await client.wait_for_terminal_exit(wait_request)
|
|
242
|
+
case "terminal/kill":
|
|
243
|
+
kill_request = KillTerminalCommandRequest.model_validate(params)
|
|
244
|
+
return await client.kill_terminal(kill_request)
|
|
245
|
+
case str() if method.startswith("_") and is_notification:
|
|
246
|
+
await client.ext_notification(method[1:], params or {})
|
|
247
|
+
return None
|
|
248
|
+
case str() if method.startswith("_") and is_notification:
|
|
249
|
+
return await client.ext_method(method[1:], params or {})
|
|
250
|
+
case _:
|
|
251
|
+
raise RequestError.method_not_found(method)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""ACP Client implementations."""
|
|
2
|
+
|
|
3
|
+
from acp.client.implementations.default_client import DefaultACPClient
|
|
4
|
+
from acp.client.implementations.headless_client import HeadlessACPClient
|
|
5
|
+
from acp.client.implementations.noop_client import NoOpClient
|
|
6
|
+
|
|
7
|
+
__all__ = ["DefaultACPClient", "HeadlessACPClient", "NoOpClient"]
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Default ACP client implementation.
|
|
2
|
+
|
|
3
|
+
This module provides a basic client implementation for the Agent Client Protocol (ACP)
|
|
4
|
+
that can be used for testing or as a base for more sophisticated client implementations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
|
+
|
|
12
|
+
from acp.client import Client
|
|
13
|
+
from acp.schema import ReadTextFileResponse, RequestPermissionResponse, WriteTextFileResponse
|
|
14
|
+
from agentpool import log
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from acp.schema import (
|
|
19
|
+
AllowedOutcome,
|
|
20
|
+
CreateTerminalRequest,
|
|
21
|
+
CreateTerminalResponse,
|
|
22
|
+
DeniedOutcome,
|
|
23
|
+
KillTerminalCommandRequest,
|
|
24
|
+
KillTerminalCommandResponse,
|
|
25
|
+
ReadTextFileRequest,
|
|
26
|
+
ReleaseTerminalRequest,
|
|
27
|
+
ReleaseTerminalResponse,
|
|
28
|
+
RequestPermissionRequest,
|
|
29
|
+
SessionNotification,
|
|
30
|
+
TerminalOutputRequest,
|
|
31
|
+
TerminalOutputResponse,
|
|
32
|
+
WaitForTerminalExitRequest,
|
|
33
|
+
WaitForTerminalExitResponse,
|
|
34
|
+
WriteTextFileRequest,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
logger = log.get_logger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class DefaultACPClient(Client):
|
|
41
|
+
"""Default implementation of ACP Client interface for basic operations.
|
|
42
|
+
|
|
43
|
+
This provides a basic client implementation that can be used for testing
|
|
44
|
+
or as a base for more sophisticated client implementations.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
*,
|
|
50
|
+
allow_file_operations: bool = False,
|
|
51
|
+
permission_outcomes: list[dict[str, DeniedOutcome | AllowedOutcome]] | None = None,
|
|
52
|
+
use_real_files: bool = True,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Initialize default ACP client.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
allow_file_operations: Whether to allow file read/write operations
|
|
58
|
+
permission_outcomes: Queue of permission outcomes for testing
|
|
59
|
+
use_real_files: Whether to use real filesystem or in-memory storage
|
|
60
|
+
"""
|
|
61
|
+
self.allow_file_operations = allow_file_operations
|
|
62
|
+
self.use_real_files = use_real_files
|
|
63
|
+
self.permission_outcomes = permission_outcomes or []
|
|
64
|
+
self.files: dict[str, str] = {} # In-memory file storage for testing
|
|
65
|
+
self.ext_calls: list[tuple[str, dict[str, Any]]] = []
|
|
66
|
+
self.ext_notes: list[tuple[str, dict[str, Any]]] = []
|
|
67
|
+
self.notifications: list[SessionNotification] = []
|
|
68
|
+
|
|
69
|
+
async def request_permission(
|
|
70
|
+
self, params: RequestPermissionRequest
|
|
71
|
+
) -> RequestPermissionResponse:
|
|
72
|
+
"""Default permission handler - grants all permissions or uses test queue."""
|
|
73
|
+
title = params.tool_call.title or "operation"
|
|
74
|
+
logger.info("Permission requested", title=title)
|
|
75
|
+
|
|
76
|
+
# If we have test outcomes queued, use them
|
|
77
|
+
if self.permission_outcomes:
|
|
78
|
+
outcome = self.permission_outcomes.pop(0)
|
|
79
|
+
return RequestPermissionResponse.model_validate({"outcome": outcome})
|
|
80
|
+
|
|
81
|
+
# Default: grant permission for the first option
|
|
82
|
+
if params.options:
|
|
83
|
+
id_ = params.options[0].option_id
|
|
84
|
+
return RequestPermissionResponse.allowed(id_)
|
|
85
|
+
|
|
86
|
+
# No options - deny
|
|
87
|
+
return RequestPermissionResponse.denied()
|
|
88
|
+
|
|
89
|
+
async def session_update(self, params: SessionNotification) -> None:
|
|
90
|
+
"""Handle session update notifications."""
|
|
91
|
+
msg = "Session update for %s: %s"
|
|
92
|
+
logger.debug(msg, params.session_id, params.update.session_update)
|
|
93
|
+
self.notifications.append(params)
|
|
94
|
+
|
|
95
|
+
async def write_text_file(self, params: WriteTextFileRequest) -> WriteTextFileResponse:
|
|
96
|
+
"""Write text to file (if allowed)."""
|
|
97
|
+
if not self.allow_file_operations:
|
|
98
|
+
raise RuntimeError("File operations not allowed")
|
|
99
|
+
|
|
100
|
+
if self.use_real_files:
|
|
101
|
+
try:
|
|
102
|
+
path = Path(params.path)
|
|
103
|
+
path.write_text(params.content, encoding="utf-8")
|
|
104
|
+
logger.info("Wrote file", path=params.path)
|
|
105
|
+
except Exception:
|
|
106
|
+
logger.exception("Failed to write file", path=params.path)
|
|
107
|
+
raise
|
|
108
|
+
else:
|
|
109
|
+
# In-memory storage for testing
|
|
110
|
+
self.files[str(params.path)] = params.content
|
|
111
|
+
|
|
112
|
+
return WriteTextFileResponse()
|
|
113
|
+
|
|
114
|
+
async def read_text_file(self, params: ReadTextFileRequest) -> ReadTextFileResponse:
|
|
115
|
+
"""Read text from file (if allowed)."""
|
|
116
|
+
if not self.allow_file_operations:
|
|
117
|
+
raise RuntimeError("File operations not allowed")
|
|
118
|
+
|
|
119
|
+
if self.use_real_files:
|
|
120
|
+
try:
|
|
121
|
+
path = Path(params.path)
|
|
122
|
+
|
|
123
|
+
if not path.exists():
|
|
124
|
+
raise FileNotFoundError(f"File not found: {params.path}") # noqa: TRY301
|
|
125
|
+
|
|
126
|
+
content = path.read_text(encoding="utf-8")
|
|
127
|
+
|
|
128
|
+
# Apply line filtering if requested
|
|
129
|
+
if params.line is not None or params.limit is not None:
|
|
130
|
+
lines = content.splitlines()
|
|
131
|
+
start_line = (params.line - 1) if params.line else 0
|
|
132
|
+
end_line = start_line + params.limit if params.limit else len(lines)
|
|
133
|
+
content = "\n".join(lines[start_line:end_line])
|
|
134
|
+
|
|
135
|
+
logger.info("Read file", path=params.path)
|
|
136
|
+
return ReadTextFileResponse(content=content)
|
|
137
|
+
|
|
138
|
+
except Exception:
|
|
139
|
+
logger.exception("Failed to read file", path=params.path)
|
|
140
|
+
raise
|
|
141
|
+
else:
|
|
142
|
+
# In-memory storage for testing
|
|
143
|
+
content = self.files.get(str(params.path), "default content")
|
|
144
|
+
return ReadTextFileResponse(content=content)
|
|
145
|
+
|
|
146
|
+
async def create_terminal(self, params: CreateTerminalRequest) -> CreateTerminalResponse:
|
|
147
|
+
"""Create terminal (not implemented)."""
|
|
148
|
+
raise NotImplementedError("Terminal operations not implemented")
|
|
149
|
+
|
|
150
|
+
async def terminal_output(self, params: TerminalOutputRequest) -> TerminalOutputResponse:
|
|
151
|
+
"""Get terminal output (not implemented)."""
|
|
152
|
+
raise NotImplementedError("Terminal operations not implemented")
|
|
153
|
+
|
|
154
|
+
async def release_terminal(
|
|
155
|
+
self, params: ReleaseTerminalRequest
|
|
156
|
+
) -> ReleaseTerminalResponse | None:
|
|
157
|
+
"""Release terminal (not implemented)."""
|
|
158
|
+
raise NotImplementedError("Terminal operations not implemented")
|
|
159
|
+
|
|
160
|
+
async def wait_for_terminal_exit(
|
|
161
|
+
self, params: WaitForTerminalExitRequest
|
|
162
|
+
) -> WaitForTerminalExitResponse:
|
|
163
|
+
"""Wait for terminal exit (not implemented)."""
|
|
164
|
+
raise NotImplementedError("Terminal operations not implemented")
|
|
165
|
+
|
|
166
|
+
async def kill_terminal(
|
|
167
|
+
self, params: KillTerminalCommandRequest
|
|
168
|
+
) -> KillTerminalCommandResponse | None:
|
|
169
|
+
"""Kill terminal (not implemented)."""
|
|
170
|
+
raise NotImplementedError("Terminal operations not implemented")
|
|
171
|
+
|
|
172
|
+
def get_session_updates(self) -> list[SessionNotification]:
|
|
173
|
+
"""Get all received session updates."""
|
|
174
|
+
return self.notifications.copy()
|
|
175
|
+
|
|
176
|
+
def clear_session_updates(self) -> None:
|
|
177
|
+
"""Clear all stored session updates."""
|
|
178
|
+
self.notifications.clear()
|
|
179
|
+
|
|
180
|
+
async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
181
|
+
self.ext_calls.append((method, params))
|
|
182
|
+
return {"ok": True, "method": method}
|
|
183
|
+
|
|
184
|
+
async def ext_notification(self, method: str, params: dict[str, Any]) -> None:
|
|
185
|
+
self.ext_notes.append((method, params))
|