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,176 @@
|
|
|
1
|
+
"""Get Python code from Pydantic model schema."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import uuid
|
|
7
|
+
|
|
8
|
+
from pydantic_ai import UserPromptPart
|
|
9
|
+
from schemez import jsonschema_to_code, openapi_to_code
|
|
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
|
+
from .helpers import SCHEMA_EXTRACTION_SCRIPT
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class GetSchemaCommand(NodeCommand):
|
|
24
|
+
"""Get Python code from Pydantic model schema.
|
|
25
|
+
|
|
26
|
+
Supports both dot notation paths to BaseModel classes and URLs to OpenAPI schemas.
|
|
27
|
+
Uses datamodel-codegen to generate clean Python code from schemas.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
name = "get-schema"
|
|
31
|
+
category = "docs"
|
|
32
|
+
|
|
33
|
+
async def execute_command(
|
|
34
|
+
self,
|
|
35
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
36
|
+
input_path: str,
|
|
37
|
+
*,
|
|
38
|
+
class_name: str | None = None,
|
|
39
|
+
cwd: str | None = None,
|
|
40
|
+
) -> None:
|
|
41
|
+
"""Get Python code from Pydantic model schema.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
ctx: Command context with ACP session
|
|
45
|
+
input_path: Dot notation path to BaseModel or URL to OpenAPI schema
|
|
46
|
+
class_name: Optional custom class name for generated code
|
|
47
|
+
cwd: Working directory to run in (defaults to session cwd)
|
|
48
|
+
"""
|
|
49
|
+
session = ctx.context.data
|
|
50
|
+
assert session
|
|
51
|
+
|
|
52
|
+
# Generate tool call ID
|
|
53
|
+
tool_call_id = f"get-schema-{uuid.uuid4().hex[:8]}"
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
# Check if we have terminal access
|
|
57
|
+
if not (
|
|
58
|
+
session.client_capabilities
|
|
59
|
+
and session.client_capabilities.terminal
|
|
60
|
+
and session.acp_agent.terminal_access
|
|
61
|
+
):
|
|
62
|
+
await session.notifications.send_agent_text(
|
|
63
|
+
"❌ **Terminal access not available for schema generation**"
|
|
64
|
+
)
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
# Determine if input is URL or dot path
|
|
68
|
+
is_url = input_path.startswith(("http://", "https://"))
|
|
69
|
+
|
|
70
|
+
# Start tool call
|
|
71
|
+
display_title = (
|
|
72
|
+
f"Generating schema from URL: {input_path}"
|
|
73
|
+
if is_url
|
|
74
|
+
else f"Generating schema from model: {input_path}"
|
|
75
|
+
)
|
|
76
|
+
await session.notifications.tool_call_start(
|
|
77
|
+
tool_call_id=tool_call_id,
|
|
78
|
+
title=display_title,
|
|
79
|
+
kind="read",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if is_url:
|
|
83
|
+
# Direct URL approach - use OpenAPIParser directly
|
|
84
|
+
try:
|
|
85
|
+
generated_code = await asyncio.to_thread(
|
|
86
|
+
openapi_to_code, input_path=input_path, class_name=class_name
|
|
87
|
+
)
|
|
88
|
+
except Exception as e: # noqa: BLE001
|
|
89
|
+
await session.notifications.tool_call_progress(
|
|
90
|
+
tool_call_id=tool_call_id,
|
|
91
|
+
status="failed",
|
|
92
|
+
title=f"Failed to generate from URL: {e!s}",
|
|
93
|
+
)
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
generated_code = generated_code.strip()
|
|
97
|
+
|
|
98
|
+
else:
|
|
99
|
+
# Dot path approach - client-side schema extraction
|
|
100
|
+
# Step 1: CLIENT-SIDE - Extract schema via inline script
|
|
101
|
+
schema_script = SCHEMA_EXTRACTION_SCRIPT.format(input_path=input_path)
|
|
102
|
+
|
|
103
|
+
# Run schema extraction client-side using uv run python -c
|
|
104
|
+
output, exit_code = await session.requests.run_command(
|
|
105
|
+
command="uv",
|
|
106
|
+
args=["run", "python", "-c", schema_script],
|
|
107
|
+
cwd=cwd or session.cwd,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if exit_code != 0:
|
|
111
|
+
error_msg = output.strip() or f"Exit code: {exit_code}"
|
|
112
|
+
await session.notifications.tool_call_progress(
|
|
113
|
+
tool_call_id=tool_call_id,
|
|
114
|
+
status="failed",
|
|
115
|
+
title=f"Failed to extract schema: {error_msg}",
|
|
116
|
+
)
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
schema_json = output.strip()
|
|
120
|
+
if not schema_json:
|
|
121
|
+
await session.notifications.tool_call_progress(
|
|
122
|
+
tool_call_id=tool_call_id,
|
|
123
|
+
status="failed",
|
|
124
|
+
title="No schema extracted from model",
|
|
125
|
+
)
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
# Step 2: SERVER-SIDE - Generate code from schema
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
generated_code = await asyncio.to_thread(
|
|
132
|
+
jsonschema_to_code,
|
|
133
|
+
schema_json=schema_json,
|
|
134
|
+
class_name=class_name,
|
|
135
|
+
input_path=input_path,
|
|
136
|
+
)
|
|
137
|
+
except Exception as e: # noqa: BLE001
|
|
138
|
+
await session.notifications.tool_call_progress(
|
|
139
|
+
tool_call_id=tool_call_id,
|
|
140
|
+
status="failed",
|
|
141
|
+
title=f"Failed to generate code: {e!s}",
|
|
142
|
+
)
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
generated_code = generated_code.strip()
|
|
146
|
+
|
|
147
|
+
if not generated_code:
|
|
148
|
+
await session.notifications.tool_call_progress(
|
|
149
|
+
tool_call_id=tool_call_id,
|
|
150
|
+
status="completed",
|
|
151
|
+
title="No code generated from schema",
|
|
152
|
+
)
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
# Stage the generated code for use in agent context
|
|
156
|
+
staged_part = UserPromptPart(
|
|
157
|
+
content=f"Generated Python code from {input_path}:\n\n{generated_code}"
|
|
158
|
+
)
|
|
159
|
+
session.staged_content.add([staged_part])
|
|
160
|
+
|
|
161
|
+
# Send successful result - wrap in code block for proper display
|
|
162
|
+
staged_count = len(session.staged_content)
|
|
163
|
+
await session.notifications.tool_call_progress(
|
|
164
|
+
tool_call_id=tool_call_id,
|
|
165
|
+
status="completed",
|
|
166
|
+
title=f"Schema code generated and staged ({staged_count} total parts)",
|
|
167
|
+
content=[f"```python\n{generated_code}\n```"],
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.exception("Unexpected error generating schema code", input_path=input_path)
|
|
172
|
+
await session.notifications.tool_call_progress(
|
|
173
|
+
tool_call_id=tool_call_id,
|
|
174
|
+
status="failed",
|
|
175
|
+
title=f"Error: {e}",
|
|
176
|
+
)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Get Python source code using dot notation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import uuid
|
|
6
|
+
|
|
7
|
+
from pydantic_ai import UserPromptPart
|
|
8
|
+
from slashed import CommandContext # noqa: TC002
|
|
9
|
+
|
|
10
|
+
from agentpool.log import get_logger
|
|
11
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
12
|
+
import agentpool.utils.importing
|
|
13
|
+
from agentpool_commands.base import NodeCommand
|
|
14
|
+
from agentpool_server.acp_server.session import ACPSession # noqa: TC001
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetSourceCommand(NodeCommand):
|
|
21
|
+
"""Get Python source code using dot notation.
|
|
22
|
+
|
|
23
|
+
Uses the AgentPool importing.py utility to fetch source code
|
|
24
|
+
for any Python object accessible via dot notation.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
name = "get-source"
|
|
28
|
+
category = "docs"
|
|
29
|
+
|
|
30
|
+
async def execute_command(
|
|
31
|
+
self,
|
|
32
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
33
|
+
dot_path: str,
|
|
34
|
+
*,
|
|
35
|
+
cwd: str | None = None,
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Get Python source code for an object.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
ctx: Command context with ACP session
|
|
41
|
+
dot_path: Dot notation path to Python object (e.g., 'requests.Session.get')
|
|
42
|
+
cwd: Working directory to run in (defaults to session cwd)
|
|
43
|
+
"""
|
|
44
|
+
session = ctx.context.data
|
|
45
|
+
assert session
|
|
46
|
+
|
|
47
|
+
# Generate tool call ID
|
|
48
|
+
tool_call_id = f"get-source-{uuid.uuid4().hex[:8]}"
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
# Check if we have terminal access
|
|
52
|
+
if not (
|
|
53
|
+
session.client_capabilities
|
|
54
|
+
and session.client_capabilities.terminal
|
|
55
|
+
and session.acp_agent.terminal_access
|
|
56
|
+
):
|
|
57
|
+
msg = "❌ **Terminal access not available for source code fetching**"
|
|
58
|
+
await session.notifications.send_agent_text(msg)
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
importing_py_path = agentpool.utils.importing.__file__
|
|
62
|
+
assert isinstance(importing_py_path, str)
|
|
63
|
+
await session.notifications.tool_call_start(
|
|
64
|
+
tool_call_id=tool_call_id,
|
|
65
|
+
title=f"Getting source: {dot_path}",
|
|
66
|
+
kind="read",
|
|
67
|
+
)
|
|
68
|
+
# Run importing.py as script
|
|
69
|
+
output, exit_code = await session.requests.run_command(
|
|
70
|
+
command="uv",
|
|
71
|
+
args=["run", importing_py_path, dot_path],
|
|
72
|
+
cwd=cwd or session.cwd,
|
|
73
|
+
)
|
|
74
|
+
# Check if command succeeded
|
|
75
|
+
if exit_code != 0:
|
|
76
|
+
error_msg = output.strip() or f"Exit code: {exit_code}"
|
|
77
|
+
await session.notifications.tool_call_progress(
|
|
78
|
+
tool_call_id=tool_call_id,
|
|
79
|
+
status="failed",
|
|
80
|
+
title=f"Failed to get source for {dot_path}: {error_msg}",
|
|
81
|
+
)
|
|
82
|
+
return
|
|
83
|
+
source_content = output.strip()
|
|
84
|
+
if not source_content:
|
|
85
|
+
await session.notifications.tool_call_progress(
|
|
86
|
+
tool_call_id=tool_call_id,
|
|
87
|
+
status="completed",
|
|
88
|
+
title="No source code found",
|
|
89
|
+
)
|
|
90
|
+
return
|
|
91
|
+
# Stage the source content for use in agent context
|
|
92
|
+
content = f"Python source code for {dot_path}:\n\n{source_content}"
|
|
93
|
+
staged_part = UserPromptPart(content=content)
|
|
94
|
+
session.staged_content.add([staged_part])
|
|
95
|
+
# Send successful result - wrap in code block for proper display
|
|
96
|
+
staged_count = len(session.staged_content)
|
|
97
|
+
await session.notifications.tool_call_progress(
|
|
98
|
+
tool_call_id=tool_call_id,
|
|
99
|
+
status="completed",
|
|
100
|
+
title=f"Source code fetched and staged ({staged_count} total parts)",
|
|
101
|
+
content=[f"```python\n{source_content}\n```"],
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
except Exception as e:
|
|
105
|
+
logger.exception("Unexpected error fetching source code", dot_path=dot_path)
|
|
106
|
+
await session.notifications.tool_call_progress(
|
|
107
|
+
tool_call_id=tool_call_id,
|
|
108
|
+
status="failed",
|
|
109
|
+
title=f"Error: {e}",
|
|
110
|
+
)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""Fetch git diff for a specific commit."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import uuid
|
|
6
|
+
|
|
7
|
+
from pydantic_ai import UserPromptPart
|
|
8
|
+
from slashed import CommandContext # noqa: TC002
|
|
9
|
+
|
|
10
|
+
from agentpool.log import get_logger
|
|
11
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
12
|
+
from agentpool_commands.base import NodeCommand
|
|
13
|
+
from agentpool_server.acp_server.session import ACPSession # noqa: TC001
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class GitDiffCommand(NodeCommand):
|
|
20
|
+
"""Fetch git diff for a specific commit.
|
|
21
|
+
|
|
22
|
+
Executes git diff client-side to get the complete diff
|
|
23
|
+
and displays it in a structured format.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
name = "git-diff"
|
|
27
|
+
category = "docs"
|
|
28
|
+
|
|
29
|
+
async def execute_command(
|
|
30
|
+
self,
|
|
31
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
32
|
+
commit: str,
|
|
33
|
+
*,
|
|
34
|
+
base_commit: str | None = None,
|
|
35
|
+
cwd: str | None = None,
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Fetch git diff for a specific commit.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
ctx: Command context with ACP session
|
|
41
|
+
commit: Commit hash or reference to diff
|
|
42
|
+
base_commit: Base commit to compare against (defaults to commit~1)
|
|
43
|
+
cwd: Working directory to run git in (defaults to session cwd)
|
|
44
|
+
"""
|
|
45
|
+
session = ctx.context.data
|
|
46
|
+
assert session
|
|
47
|
+
tool_call_id = f"git-diff-{uuid.uuid4().hex[:8]}"
|
|
48
|
+
try:
|
|
49
|
+
caps = session.client_capabilities # Check if we have terminal access for running git
|
|
50
|
+
if not (caps and caps.terminal and session.acp_agent.terminal_access):
|
|
51
|
+
msg = "❌ **Terminal access not available for git operations**"
|
|
52
|
+
await session.notifications.send_agent_text(msg)
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
# Build git diff command
|
|
56
|
+
if base_commit:
|
|
57
|
+
git_command = ["git", "diff", base_commit, commit]
|
|
58
|
+
display_title = f"Git diff: {base_commit}..{commit}"
|
|
59
|
+
else:
|
|
60
|
+
git_command = ["git", "diff", f"{commit}~1", commit]
|
|
61
|
+
display_title = f"Git diff: {commit}"
|
|
62
|
+
|
|
63
|
+
# Start tool call
|
|
64
|
+
await session.notifications.tool_call_start(
|
|
65
|
+
tool_call_id=tool_call_id,
|
|
66
|
+
title=display_title,
|
|
67
|
+
kind="execute",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Run git diff command
|
|
71
|
+
output, exit_code = await session.requests.run_command(
|
|
72
|
+
command=git_command[0],
|
|
73
|
+
args=git_command[1:],
|
|
74
|
+
cwd=cwd or session.cwd,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Check if git command succeeded
|
|
78
|
+
if exit_code != 0:
|
|
79
|
+
await session.notifications.tool_call_progress(
|
|
80
|
+
tool_call_id=tool_call_id,
|
|
81
|
+
status="failed",
|
|
82
|
+
title=f"Git diff failed (exit code: {exit_code})",
|
|
83
|
+
)
|
|
84
|
+
return
|
|
85
|
+
diff_content = output.strip()
|
|
86
|
+
if not diff_content:
|
|
87
|
+
await session.notifications.tool_call_progress(
|
|
88
|
+
tool_call_id=tool_call_id,
|
|
89
|
+
status="completed",
|
|
90
|
+
title="No changes found in diff",
|
|
91
|
+
)
|
|
92
|
+
return
|
|
93
|
+
|
|
94
|
+
# Stage the diff content for use in agent context
|
|
95
|
+
staged_part = UserPromptPart(content=f"Git diff for {display_title}:\n\n{diff_content}")
|
|
96
|
+
session.staged_content.add([staged_part])
|
|
97
|
+
# Send successful result - wrap in code block for proper display
|
|
98
|
+
staged_count = len(session.staged_content)
|
|
99
|
+
await session.notifications.tool_call_progress(
|
|
100
|
+
tool_call_id=tool_call_id,
|
|
101
|
+
status="completed",
|
|
102
|
+
title=f"Git diff fetched and staged ({staged_count} total parts)",
|
|
103
|
+
content=[f"```diff\n{diff_content}\n```"],
|
|
104
|
+
)
|
|
105
|
+
except Exception as e:
|
|
106
|
+
logger.exception("Unexpected error fetching git diff", commit=commit)
|
|
107
|
+
await session.notifications.tool_call_progress(
|
|
108
|
+
tool_call_id=tool_call_id,
|
|
109
|
+
status="failed",
|
|
110
|
+
title=f"Error: {e}",
|
|
111
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Helper functions and constants for documentation commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Script constants for client-side execution
|
|
7
|
+
SCHEMA_EXTRACTION_SCRIPT = """
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import importlib
|
|
11
|
+
|
|
12
|
+
def import_callable(path):
|
|
13
|
+
parts = path.split(".")
|
|
14
|
+
for i in range(len(parts), 0, -1):
|
|
15
|
+
try:
|
|
16
|
+
module_path = ".".join(parts[:i])
|
|
17
|
+
module = importlib.import_module(module_path)
|
|
18
|
+
obj = module
|
|
19
|
+
for part in parts[i:]:
|
|
20
|
+
obj = getattr(obj, part)
|
|
21
|
+
return obj
|
|
22
|
+
except (ImportError, AttributeError):
|
|
23
|
+
continue
|
|
24
|
+
raise ImportError(f"Could not import %s" % path)
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
model_class = import_callable("{input_path}")
|
|
28
|
+
schema = model_class.model_json_schema()
|
|
29
|
+
print(json.dumps(schema, indent=2))
|
|
30
|
+
except Exception as e:
|
|
31
|
+
print(f"Error: %s" % e, file=sys.stderr)
|
|
32
|
+
sys.exit(1)
|
|
33
|
+
"""
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Convert a webpage to markdown using urltomarkdown.herokuapp.com."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import urllib.parse
|
|
6
|
+
import uuid
|
|
7
|
+
|
|
8
|
+
import anyenv
|
|
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 UrlToMarkdownCommand(NodeCommand):
|
|
22
|
+
"""Convert a webpage to markdown using urltomarkdown.herokuapp.com.
|
|
23
|
+
|
|
24
|
+
Fetches a web page and converts it to markdown format,
|
|
25
|
+
making it ideal for staging as AI context.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = "url-to-markdown"
|
|
29
|
+
category = "docs"
|
|
30
|
+
|
|
31
|
+
async def execute_command(
|
|
32
|
+
self,
|
|
33
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
34
|
+
url: str,
|
|
35
|
+
*,
|
|
36
|
+
title: bool = True,
|
|
37
|
+
links: bool = True,
|
|
38
|
+
clean: bool = True,
|
|
39
|
+
) -> None:
|
|
40
|
+
"""Convert a webpage to markdown.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
ctx: Command context with ACP session
|
|
44
|
+
url: URL to convert to markdown
|
|
45
|
+
title: Include page title as H1 header
|
|
46
|
+
links: Include links in markdown output
|
|
47
|
+
clean: Clean/filter content before conversion
|
|
48
|
+
"""
|
|
49
|
+
session = ctx.context.data
|
|
50
|
+
assert session
|
|
51
|
+
tool_call_id = f"url-to-markdown-{uuid.uuid4().hex[:8]}"
|
|
52
|
+
api_url = "https://urltomarkdown.herokuapp.com/" # Build API URL and parameters
|
|
53
|
+
params = {"url": url}
|
|
54
|
+
if title:
|
|
55
|
+
params["title"] = "true"
|
|
56
|
+
if not links:
|
|
57
|
+
params["links"] = "false"
|
|
58
|
+
if not clean:
|
|
59
|
+
params["clean"] = "false"
|
|
60
|
+
try:
|
|
61
|
+
await session.notifications.tool_call_start(
|
|
62
|
+
tool_call_id=tool_call_id,
|
|
63
|
+
title=f"Converting to markdown: {url}",
|
|
64
|
+
kind="fetch",
|
|
65
|
+
)
|
|
66
|
+
response = await anyenv.get(api_url, params=params, timeout=30.0)
|
|
67
|
+
markdown_content = await response.text()
|
|
68
|
+
page_title = ""
|
|
69
|
+
if "X-Title" in response.headers:
|
|
70
|
+
page_title = urllib.parse.unquote(response.headers["X-Title"])
|
|
71
|
+
page_title = f" - {page_title}"
|
|
72
|
+
# Stage the markdown content for use in agent context
|
|
73
|
+
content = f"Webpage content from {url}{page_title}:\n\n{markdown_content}"
|
|
74
|
+
staged_part = UserPromptPart(content=content)
|
|
75
|
+
session.staged_content.add([staged_part])
|
|
76
|
+
# Send successful result - wrap in code block for proper display
|
|
77
|
+
staged_count = len(session.staged_content)
|
|
78
|
+
await session.notifications.tool_call_progress(
|
|
79
|
+
tool_call_id=tool_call_id,
|
|
80
|
+
status="completed",
|
|
81
|
+
title=f"Webpage converted and staged ({staged_count} total parts)",
|
|
82
|
+
content=[f"```markdown\n{markdown_content}\n```"],
|
|
83
|
+
)
|
|
84
|
+
except Exception as e:
|
|
85
|
+
logger.exception("Unexpected error converting URL", url=url)
|
|
86
|
+
await session.notifications.tool_call_progress(
|
|
87
|
+
tool_call_id=tool_call_id,
|
|
88
|
+
status="failed",
|
|
89
|
+
title=f"Error: {e}",
|
|
90
|
+
)
|