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,376 @@
|
|
|
1
|
+
"""Debug commands for ACP notification replay and testing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import anyenv
|
|
9
|
+
import anyio
|
|
10
|
+
from pydantic import TypeAdapter
|
|
11
|
+
from slashed import CommandContext # noqa: TC002
|
|
12
|
+
|
|
13
|
+
from acp.schema import (
|
|
14
|
+
AgentMessageChunk,
|
|
15
|
+
AgentThoughtChunk,
|
|
16
|
+
ContentToolCallContent,
|
|
17
|
+
SessionNotification,
|
|
18
|
+
SessionUpdate,
|
|
19
|
+
TextContentBlock,
|
|
20
|
+
ToolCallKind, # noqa: TC001
|
|
21
|
+
ToolCallProgress,
|
|
22
|
+
ToolCallStart,
|
|
23
|
+
UserMessageChunk,
|
|
24
|
+
)
|
|
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
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
# TypeAdapter for auto-constructing SessionUpdate variants from discriminator
|
|
34
|
+
SessionUpdateAdapter: TypeAdapter[SessionUpdate] = TypeAdapter(SessionUpdate)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class DebugSendTextCommand(NodeCommand):
|
|
38
|
+
"""Send a text chunk notification for debugging.
|
|
39
|
+
|
|
40
|
+
Useful for testing client rendering of different message types.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
name = "debug-send-text"
|
|
44
|
+
category = "debug"
|
|
45
|
+
|
|
46
|
+
async def execute_command(
|
|
47
|
+
self,
|
|
48
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
49
|
+
text: str,
|
|
50
|
+
*,
|
|
51
|
+
chunk_type: str = "agent",
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Send a text chunk notification.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
ctx: Command context
|
|
57
|
+
text: Text content to send
|
|
58
|
+
chunk_type: Type of chunk ('agent', 'user', 'thought')
|
|
59
|
+
"""
|
|
60
|
+
session = ctx.context.data
|
|
61
|
+
assert session
|
|
62
|
+
try:
|
|
63
|
+
content = TextContentBlock(text=text)
|
|
64
|
+
|
|
65
|
+
if chunk_type == "agent":
|
|
66
|
+
update: SessionUpdate = AgentMessageChunk(content=content)
|
|
67
|
+
elif chunk_type == "user":
|
|
68
|
+
update = UserMessageChunk(content=content)
|
|
69
|
+
elif chunk_type == "thought":
|
|
70
|
+
update = AgentThoughtChunk(content=content)
|
|
71
|
+
else:
|
|
72
|
+
await ctx.print(f"❌ **Invalid chunk type:** `{chunk_type}`")
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
notification = SessionNotification(session_id=session.session_id, update=update)
|
|
76
|
+
await session.client.session_update(notification) # pyright: ignore[reportArgumentType]
|
|
77
|
+
await ctx.print(f"✅ **Sent {chunk_type} text chunk:** {text[:50]}...")
|
|
78
|
+
|
|
79
|
+
except Exception as e:
|
|
80
|
+
logger.exception("Failed to send debug text chunk")
|
|
81
|
+
await ctx.print(f"❌ **Failed to send text chunk:** {e}")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class DebugSendToolCallCommand(NodeCommand):
|
|
85
|
+
"""Send a tool call notification for debugging.
|
|
86
|
+
|
|
87
|
+
Tests the client's tool call visualization and status handling.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
name = "debug-send-tool-call"
|
|
91
|
+
category = "debug"
|
|
92
|
+
|
|
93
|
+
async def execute_command(
|
|
94
|
+
self,
|
|
95
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
96
|
+
title: str,
|
|
97
|
+
*,
|
|
98
|
+
kind: ToolCallKind = "other",
|
|
99
|
+
) -> None:
|
|
100
|
+
"""Send a tool call notification.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
ctx: Command context
|
|
104
|
+
title: Tool call title/description
|
|
105
|
+
kind: Tool kind ('read', 'edit', 'delete', 'move', 'search',
|
|
106
|
+
'execute', 'think', 'fetch', 'other')
|
|
107
|
+
"""
|
|
108
|
+
session = ctx.context.data
|
|
109
|
+
assert session
|
|
110
|
+
try:
|
|
111
|
+
id_ = f"debug-{hash(title)}"
|
|
112
|
+
await session.notifications.tool_call_start(id_, title=title, kind=kind)
|
|
113
|
+
await ctx.print(f"✅ **Sent tool call:** {title}")
|
|
114
|
+
except Exception as e:
|
|
115
|
+
logger.exception("Failed to send debug tool call")
|
|
116
|
+
await ctx.print(f"❌ **Failed to send tool call:** {e}")
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
# class DebugUpdateToolCallCommand(SlashedCommand):
|
|
120
|
+
# """Send a tool call update notification for debugging.
|
|
121
|
+
|
|
122
|
+
# Tests tool call progress updates and result display.
|
|
123
|
+
# """
|
|
124
|
+
|
|
125
|
+
# name = "debug-update-tool"
|
|
126
|
+
# category = "debug"
|
|
127
|
+
|
|
128
|
+
# async def execute_command(
|
|
129
|
+
# self,
|
|
130
|
+
# ctx: CommandContext[AgentContext[ACPSession]],
|
|
131
|
+
# tool_call_id: str,
|
|
132
|
+
# *,
|
|
133
|
+
# status: ToolCallStatus = "completed",
|
|
134
|
+
# content: str = "",
|
|
135
|
+
# ):
|
|
136
|
+
# """Send a tool call update notification.
|
|
137
|
+
|
|
138
|
+
# Args:
|
|
139
|
+
# ctx: Command context
|
|
140
|
+
# tool_call_id: ID of tool call to update
|
|
141
|
+
# status: New status
|
|
142
|
+
# content: Content to include in update
|
|
143
|
+
# """
|
|
144
|
+
# session = ctx.context.data
|
|
145
|
+
# assert session
|
|
146
|
+
# try:
|
|
147
|
+
# tool_content = []
|
|
148
|
+
# if content:
|
|
149
|
+
# tool_content = [
|
|
150
|
+
# ContentToolCallContent(content=TextContentBlock(text=content))
|
|
151
|
+
# ]
|
|
152
|
+
# await session.notifications.tool_call_progress(
|
|
153
|
+
# tool_call_id,
|
|
154
|
+
# status,
|
|
155
|
+
# content=tool_content,
|
|
156
|
+
# )
|
|
157
|
+
# await ctx.print(f"✅ **Updated tool call {tool_call_id}:** {status}")
|
|
158
|
+
|
|
159
|
+
# except Exception as e:
|
|
160
|
+
# logger.exception("Failed to update debug tool call")
|
|
161
|
+
# await ctx.print(f"❌ **Failed to update tool call:** {e}")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class DebugReplaySequenceCommand(NodeCommand):
|
|
165
|
+
"""Replay a sequence of ACP notifications from a JSON file.
|
|
166
|
+
|
|
167
|
+
Allows testing complex interaction flows by replaying recorded sequences.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
name = "debug-replay"
|
|
171
|
+
category = "debug"
|
|
172
|
+
|
|
173
|
+
async def execute_command(
|
|
174
|
+
self,
|
|
175
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
176
|
+
file_path: str,
|
|
177
|
+
) -> None:
|
|
178
|
+
"""Replay a sequence of ACP notifications from a JSON file.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
ctx: Command context
|
|
182
|
+
file_path: Path to JSON file containing notification sequence
|
|
183
|
+
"""
|
|
184
|
+
session = ctx.context.data
|
|
185
|
+
assert session
|
|
186
|
+
try:
|
|
187
|
+
path = Path(file_path)
|
|
188
|
+
if not path.exists():
|
|
189
|
+
await ctx.print(f"❌ **File not found:** `{file_path}`")
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
with path.open() as f:
|
|
193
|
+
sequence_data = json.load(f)
|
|
194
|
+
|
|
195
|
+
if not isinstance(sequence_data, dict) or "notifications" not in sequence_data:
|
|
196
|
+
await ctx.print("❌ **Invalid replay file.** Expected: `{'notifications': [...]}`")
|
|
197
|
+
return
|
|
198
|
+
|
|
199
|
+
notifications = sequence_data["notifications"]
|
|
200
|
+
count = 0
|
|
201
|
+
delay_ms = sequence_data.get("delay_ms", 0)
|
|
202
|
+
|
|
203
|
+
for notification_data in notifications:
|
|
204
|
+
try:
|
|
205
|
+
# Auto-construct the correct SessionUpdate type via discriminator
|
|
206
|
+
update = SessionUpdateAdapter.validate_python(notification_data)
|
|
207
|
+
notification = SessionNotification(session_id=session.session_id, update=update)
|
|
208
|
+
await session.client.session_update(notification) # pyright: ignore[reportArgumentType]
|
|
209
|
+
count += 1
|
|
210
|
+
if delay_ms:
|
|
211
|
+
await anyio.sleep(delay_ms / 1000)
|
|
212
|
+
|
|
213
|
+
except Exception as e: # noqa: BLE001
|
|
214
|
+
logger.warning("Failed to replay notification", error=e)
|
|
215
|
+
continue
|
|
216
|
+
|
|
217
|
+
await ctx.print(f"✅ **Replayed {count} notifications from** `{file_path}`")
|
|
218
|
+
|
|
219
|
+
except Exception as e:
|
|
220
|
+
logger.exception("Failed to replay debug sequence")
|
|
221
|
+
await ctx.print(f"❌ **Failed to replay sequence:** {e}")
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class DebugSessionInfoCommand(NodeCommand):
|
|
225
|
+
"""Show current ACP session debugging information.
|
|
226
|
+
|
|
227
|
+
Displays session state, client capabilities, and configuration details.
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
name = "debug-session-info"
|
|
231
|
+
category = "debug"
|
|
232
|
+
|
|
233
|
+
async def execute_command(self, ctx: CommandContext[NodeContext[ACPSession]]) -> None:
|
|
234
|
+
"""Show current ACP session debugging information."""
|
|
235
|
+
session = ctx.context.data
|
|
236
|
+
assert session
|
|
237
|
+
try:
|
|
238
|
+
info = {
|
|
239
|
+
"session_id": session.session_id,
|
|
240
|
+
"current_agent": session.current_agent_name,
|
|
241
|
+
"available_agents": list(session.agent_pool.agents.keys()),
|
|
242
|
+
"cwd": session.cwd,
|
|
243
|
+
"client_capabilities": (
|
|
244
|
+
session.client_capabilities.model_dump()
|
|
245
|
+
if session.client_capabilities
|
|
246
|
+
else None
|
|
247
|
+
),
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
text = anyenv.dump_json(info, indent=True)
|
|
251
|
+
await ctx.print(f"## 🔍 Session Debug Info\n\n```json\n{text}\n```")
|
|
252
|
+
|
|
253
|
+
except Exception as e:
|
|
254
|
+
logger.exception("Failed to get session info")
|
|
255
|
+
await ctx.print(f"❌ **Failed to get session info:** {e}")
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class DebugCreateTemplateCommand(NodeCommand):
|
|
259
|
+
"""Create a template JSON file for debugging notification sequences.
|
|
260
|
+
|
|
261
|
+
Generates a sample replay file with common notification types.
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
name = "debug-create-template"
|
|
265
|
+
category = "debug"
|
|
266
|
+
|
|
267
|
+
async def execute_command(
|
|
268
|
+
self,
|
|
269
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
270
|
+
*,
|
|
271
|
+
file_path: str = "debug_replay_template.json",
|
|
272
|
+
) -> None:
|
|
273
|
+
"""Create a template JSON file for debugging notification sequences.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
ctx: Command context
|
|
277
|
+
file_path: Path where to create the template file
|
|
278
|
+
"""
|
|
279
|
+
try:
|
|
280
|
+
# Create proper BaseModel instances
|
|
281
|
+
message_chunk = AgentMessageChunk.text(text="Hello, this is a debug message!")
|
|
282
|
+
|
|
283
|
+
tool_start = ToolCallStart(
|
|
284
|
+
tool_call_id="debug-tool-1",
|
|
285
|
+
title="Debug Tool Call",
|
|
286
|
+
status="in_progress",
|
|
287
|
+
kind="other",
|
|
288
|
+
content=None,
|
|
289
|
+
locations=None,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
tool_update = ToolCallProgress(
|
|
293
|
+
tool_call_id="debug-tool-1",
|
|
294
|
+
status="completed",
|
|
295
|
+
content=[
|
|
296
|
+
ContentToolCallContent.text(text="Tool completed successfully!"),
|
|
297
|
+
],
|
|
298
|
+
title="tool_call_update",
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# Create notifications using proper SessionNotification models
|
|
302
|
+
notifications = [
|
|
303
|
+
SessionNotification(session_id="template", update=message_chunk),
|
|
304
|
+
SessionNotification(session_id="template", update=tool_start),
|
|
305
|
+
SessionNotification(session_id="template", update=tool_update),
|
|
306
|
+
]
|
|
307
|
+
|
|
308
|
+
# Convert to JSON-serializable format
|
|
309
|
+
template = {
|
|
310
|
+
"description": "ACP notification replay sequence for debugging",
|
|
311
|
+
"delay_ms": 100,
|
|
312
|
+
"notifications": [notif.model_dump()["update"] for notif in notifications],
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
with Path(file_path).open("w") as f:
|
|
316
|
+
json.dump(template, f, indent=2)
|
|
317
|
+
|
|
318
|
+
await ctx.print(f"✅ **Created replay template:** `{file_path}`")
|
|
319
|
+
|
|
320
|
+
except Exception as e:
|
|
321
|
+
logger.exception("Failed to create replay template")
|
|
322
|
+
await ctx.print(f"❌ **Failed to create template:** {e}")
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class DebugSendRawCommand(NodeCommand):
|
|
326
|
+
"""Send a raw ACP notification from JSON string.
|
|
327
|
+
|
|
328
|
+
For advanced debugging - send arbitrary notification structures.
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
name = "debug-send-raw"
|
|
332
|
+
category = "debug"
|
|
333
|
+
|
|
334
|
+
async def execute_command(
|
|
335
|
+
self,
|
|
336
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
337
|
+
notification_json: str,
|
|
338
|
+
) -> None:
|
|
339
|
+
"""Send a raw ACP notification from JSON string.
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
ctx: Command context
|
|
343
|
+
notification_json: JSON string of the notification to send
|
|
344
|
+
"""
|
|
345
|
+
session = ctx.context.data
|
|
346
|
+
assert session
|
|
347
|
+
try:
|
|
348
|
+
data = anyenv.load_json(notification_json, return_type=dict)
|
|
349
|
+
|
|
350
|
+
# Validate it has the expected structure
|
|
351
|
+
if "update" not in data:
|
|
352
|
+
msg = "❌ **Notification JSON must contain 'update' field**"
|
|
353
|
+
await ctx.print(msg)
|
|
354
|
+
return
|
|
355
|
+
|
|
356
|
+
notification = SessionNotification(session_id=session.session_id, **data)
|
|
357
|
+
await session.client.session_update(notification)
|
|
358
|
+
await ctx.print("✅ **Sent raw notification**")
|
|
359
|
+
except json.JSONDecodeError as e:
|
|
360
|
+
await ctx.print(f"❌ **Invalid JSON:** {e}")
|
|
361
|
+
except Exception as e:
|
|
362
|
+
logger.exception("Failed to send raw notification")
|
|
363
|
+
await ctx.print(f"❌ **Failed to send raw notification:** {e}")
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def get_debug_commands() -> list[type[NodeCommand]]:
|
|
367
|
+
"""Get all ACP debug commands."""
|
|
368
|
+
return [
|
|
369
|
+
DebugSendTextCommand,
|
|
370
|
+
DebugSendToolCallCommand,
|
|
371
|
+
# DebugUpdateToolCallCommand,
|
|
372
|
+
DebugReplaySequenceCommand,
|
|
373
|
+
DebugSessionInfoCommand,
|
|
374
|
+
DebugCreateTemplateCommand,
|
|
375
|
+
DebugSendRawCommand,
|
|
376
|
+
]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Documentation commands package.
|
|
2
|
+
|
|
3
|
+
This package contains slash commands for documentation-related operations
|
|
4
|
+
in ACP sessions, including source code fetching, git operations, schema
|
|
5
|
+
generation, URL conversion, and repository fetching.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
from .fetch_repo import FetchRepoCommand
|
|
12
|
+
from .get_schema import GetSchemaCommand
|
|
13
|
+
from .get_source import GetSourceCommand
|
|
14
|
+
from .git_diff import GitDiffCommand
|
|
15
|
+
from .url_to_markdown import UrlToMarkdownCommand
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from slashed import SlashedCommand
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"FetchRepoCommand",
|
|
23
|
+
"GetSchemaCommand",
|
|
24
|
+
"GetSourceCommand",
|
|
25
|
+
"GitDiffCommand",
|
|
26
|
+
"UrlToMarkdownCommand",
|
|
27
|
+
"get_docs_commands",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_docs_commands() -> list[type[SlashedCommand]]:
|
|
32
|
+
"""Get all documentation-related slash commands."""
|
|
33
|
+
return [
|
|
34
|
+
GetSourceCommand,
|
|
35
|
+
GetSchemaCommand,
|
|
36
|
+
GitDiffCommand,
|
|
37
|
+
FetchRepoCommand,
|
|
38
|
+
UrlToMarkdownCommand,
|
|
39
|
+
]
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""Fetch contents from a GitHub repository via UIThub."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import uuid
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
from pydantic_ai import UserPromptPart
|
|
10
|
+
from slashed import CommandContext # noqa: TC002
|
|
11
|
+
|
|
12
|
+
from agentpool.log import get_logger
|
|
13
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
14
|
+
from agentpool_commands.base import NodeCommand
|
|
15
|
+
from agentpool_server.acp_server.session import ACPSession # noqa: TC001
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FetchRepoCommand(NodeCommand):
|
|
22
|
+
"""Fetch contents from a GitHub repository via UIThub.
|
|
23
|
+
|
|
24
|
+
Retrieves repository contents with various filtering options
|
|
25
|
+
and displays them in a structured format.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = "fetch-repo"
|
|
29
|
+
category = "docs"
|
|
30
|
+
|
|
31
|
+
async def execute_command( # noqa: PLR0915
|
|
32
|
+
self,
|
|
33
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
34
|
+
repo: str,
|
|
35
|
+
*,
|
|
36
|
+
branch: str | None = None,
|
|
37
|
+
path: str | None = None,
|
|
38
|
+
include_dirs: list[str] | None = None,
|
|
39
|
+
disable_genignore: bool = False,
|
|
40
|
+
exclude_dirs: list[str] | None = None,
|
|
41
|
+
exclude_extensions: list[str] | None = None,
|
|
42
|
+
include_extensions: list[str] | None = None,
|
|
43
|
+
include_line_numbers: bool = True,
|
|
44
|
+
max_file_size: int | None = None,
|
|
45
|
+
max_tokens: int | None = None,
|
|
46
|
+
omit_files: bool = False,
|
|
47
|
+
yaml_string: str | None = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Fetch contents from a GitHub repository.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
ctx: Command context with ACP session
|
|
53
|
+
repo: GitHub path (owner/repo)
|
|
54
|
+
branch: Branch name (defaults to main if not provided)
|
|
55
|
+
path: File or directory path within the repository
|
|
56
|
+
include_dirs: List of directories to include
|
|
57
|
+
disable_genignore: Disable .genignore filtering
|
|
58
|
+
exclude_dirs: List of directories to exclude
|
|
59
|
+
exclude_extensions: List of file extensions to exclude
|
|
60
|
+
include_extensions: List of file extensions to include
|
|
61
|
+
include_line_numbers: Include line numbers in HTML/markdown output
|
|
62
|
+
max_file_size: Maximum file size in bytes
|
|
63
|
+
max_tokens: Maximum number of tokens in response
|
|
64
|
+
omit_files: Only return directory structure without file contents
|
|
65
|
+
yaml_string: URL encoded YAML string of file hierarchy to include
|
|
66
|
+
"""
|
|
67
|
+
session = ctx.context.data
|
|
68
|
+
assert session
|
|
69
|
+
|
|
70
|
+
# Generate tool call ID
|
|
71
|
+
tool_call_id = f"fetch-repo-{uuid.uuid4().hex[:8]}"
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
# Build URL
|
|
75
|
+
base_url = f"https://uithub.com/{repo}"
|
|
76
|
+
if branch:
|
|
77
|
+
base_url += f"/tree/{branch}"
|
|
78
|
+
if path:
|
|
79
|
+
base_url += f"/{path}"
|
|
80
|
+
|
|
81
|
+
# Build parameters
|
|
82
|
+
params = {}
|
|
83
|
+
api_key = os.getenv("UITHUB_API_KEY")
|
|
84
|
+
if api_key:
|
|
85
|
+
params["apiKey"] = api_key
|
|
86
|
+
|
|
87
|
+
if include_dirs:
|
|
88
|
+
params["dir"] = ",".join(include_dirs)
|
|
89
|
+
if disable_genignore:
|
|
90
|
+
params["disableGenignore"] = "true"
|
|
91
|
+
if exclude_dirs:
|
|
92
|
+
params["exclude-dir"] = ",".join(exclude_dirs)
|
|
93
|
+
if exclude_extensions:
|
|
94
|
+
params["exclude-ext"] = ",".join(exclude_extensions)
|
|
95
|
+
if include_extensions:
|
|
96
|
+
params["ext"] = ",".join(include_extensions)
|
|
97
|
+
if not include_line_numbers:
|
|
98
|
+
params["lines"] = "false"
|
|
99
|
+
if max_file_size:
|
|
100
|
+
params["maxFileSize"] = str(max_file_size)
|
|
101
|
+
if max_tokens:
|
|
102
|
+
params["maxTokens"] = str(max_tokens)
|
|
103
|
+
if omit_files:
|
|
104
|
+
params["omitFiles"] = "true"
|
|
105
|
+
if yaml_string:
|
|
106
|
+
params["yamlString"] = yaml_string
|
|
107
|
+
|
|
108
|
+
# Start tool call
|
|
109
|
+
display_path = f"{repo}"
|
|
110
|
+
if branch:
|
|
111
|
+
display_path += f"@{branch}"
|
|
112
|
+
if path:
|
|
113
|
+
display_path += f":{path}"
|
|
114
|
+
|
|
115
|
+
await session.notifications.tool_call_start(
|
|
116
|
+
tool_call_id=tool_call_id,
|
|
117
|
+
title=f"Fetching repository: {display_path}",
|
|
118
|
+
kind="fetch",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Make async HTTP request
|
|
122
|
+
async with httpx.AsyncClient() as client:
|
|
123
|
+
response = await client.get(
|
|
124
|
+
base_url,
|
|
125
|
+
params=params,
|
|
126
|
+
headers={"accept": "text/markdown"},
|
|
127
|
+
timeout=30.0,
|
|
128
|
+
)
|
|
129
|
+
response.raise_for_status()
|
|
130
|
+
content = response.text
|
|
131
|
+
|
|
132
|
+
# Stage the content for use in agent context
|
|
133
|
+
staged_part = UserPromptPart(
|
|
134
|
+
content=f"Repository contents from {display_path}:\n\n{content}"
|
|
135
|
+
)
|
|
136
|
+
session.staged_content.add([staged_part])
|
|
137
|
+
|
|
138
|
+
# Send successful result - wrap in code block for proper display
|
|
139
|
+
staged_count = len(session.staged_content)
|
|
140
|
+
await session.notifications.tool_call_progress(
|
|
141
|
+
tool_call_id=tool_call_id,
|
|
142
|
+
status="completed",
|
|
143
|
+
title=f"Repository {display_path} fetched and staged ({staged_count} total parts)",
|
|
144
|
+
content=[f"```\n{content}\n```"],
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
except httpx.HTTPStatusError as e:
|
|
148
|
+
logger.exception(
|
|
149
|
+
"HTTP error fetching repository", repo=repo, status=e.response.status_code
|
|
150
|
+
)
|
|
151
|
+
await session.notifications.tool_call_progress(
|
|
152
|
+
tool_call_id=tool_call_id,
|
|
153
|
+
status="failed",
|
|
154
|
+
title=f"HTTP {e.response.status_code}: Failed to fetch {repo}",
|
|
155
|
+
)
|
|
156
|
+
except httpx.RequestError as e:
|
|
157
|
+
logger.exception("Request error fetching repository", repo=repo)
|
|
158
|
+
await session.notifications.tool_call_progress(
|
|
159
|
+
tool_call_id=tool_call_id,
|
|
160
|
+
status="failed",
|
|
161
|
+
title=f"Network error: {e}",
|
|
162
|
+
)
|
|
163
|
+
except Exception as e:
|
|
164
|
+
logger.exception("Unexpected error fetching repository", repo=repo)
|
|
165
|
+
await session.notifications.tool_call_progress(
|
|
166
|
+
tool_call_id=tool_call_id,
|
|
167
|
+
status="failed",
|
|
168
|
+
title=f"Error: {e}",
|
|
169
|
+
)
|