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,42 @@
|
|
|
1
|
+
"""Filtering resource provider implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from agentpool.resource_providers import ResourceProvider
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from agentpool.tools.base import Tool
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class FilteringResourceProvider(ResourceProvider):
|
|
15
|
+
"""Wrapper that filters tools from a ResourceProvider based on tool name filter."""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
provider: ResourceProvider,
|
|
20
|
+
tool_filter: dict[str, bool],
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Initialize filtering wrapper.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
provider: The provider to wrap
|
|
26
|
+
tool_filter: Dict mapping tool names to enabled state (defaults to True)
|
|
27
|
+
"""
|
|
28
|
+
self._provider = provider
|
|
29
|
+
self._tool_filter = tool_filter
|
|
30
|
+
|
|
31
|
+
def __getattr__(self, name: str) -> Any:
|
|
32
|
+
"""Delegate attribute access to wrapped provider."""
|
|
33
|
+
return getattr(self._provider, name)
|
|
34
|
+
|
|
35
|
+
async def get_tools(self) -> list[Tool]:
|
|
36
|
+
"""Get filtered tools from wrapped provider.
|
|
37
|
+
|
|
38
|
+
Returns only tools where the filter value is True. Tools not in the filter
|
|
39
|
+
default to enabled (True).
|
|
40
|
+
"""
|
|
41
|
+
tools = await self._provider.get_tools()
|
|
42
|
+
return [t for t in tools if self._tool_filter.get(t.name, True)]
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""Tool management for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from contextlib import AsyncExitStack
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
8
|
+
|
|
9
|
+
from agentpool.log import get_logger
|
|
10
|
+
from agentpool.resource_providers import ResourceProvider
|
|
11
|
+
from agentpool_config.mcp_server import BaseMCPServerConfig
|
|
12
|
+
from agentpool_config.resources import ResourceInfo
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from typing import Literal
|
|
17
|
+
|
|
18
|
+
from fastmcp.client.sampling import SamplingHandler
|
|
19
|
+
|
|
20
|
+
from agentpool.prompts.prompts import MCPClientPrompt
|
|
21
|
+
from agentpool.tools.base import Tool
|
|
22
|
+
from agentpool_config.mcp_server import MCPServerConfig
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MCPResourceProvider(ResourceProvider):
|
|
29
|
+
"""Resource provider for a single MCP server."""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
server: MCPServerConfig | str,
|
|
34
|
+
name: str = "mcp",
|
|
35
|
+
owner: str | None = None,
|
|
36
|
+
source: Literal["pool", "node"] = "node",
|
|
37
|
+
sampling_callback: SamplingHandler[Any, Any] | None = None,
|
|
38
|
+
accessible_roots: list[str] | None = None,
|
|
39
|
+
) -> None:
|
|
40
|
+
from agentpool.mcp_server import MCPClient
|
|
41
|
+
|
|
42
|
+
super().__init__(name, owner=owner)
|
|
43
|
+
self.server = BaseMCPServerConfig.from_string(server) if isinstance(server, str) else server
|
|
44
|
+
self.source = source
|
|
45
|
+
self.exit_stack = AsyncExitStack()
|
|
46
|
+
self._accessible_roots = accessible_roots
|
|
47
|
+
self._sampling_callback = sampling_callback
|
|
48
|
+
|
|
49
|
+
# Tool caching
|
|
50
|
+
self._tools_cache: list[Tool] | None = None
|
|
51
|
+
self._saved_enabled_states: dict[str, bool] = {}
|
|
52
|
+
|
|
53
|
+
# Prompt caching
|
|
54
|
+
self._prompts_cache: list[MCPClientPrompt] | None = None
|
|
55
|
+
|
|
56
|
+
# Resource caching
|
|
57
|
+
self._resources_cache: list[ResourceInfo] | None = None
|
|
58
|
+
|
|
59
|
+
self.client = MCPClient(
|
|
60
|
+
config=self.server,
|
|
61
|
+
sampling_callback=self._sampling_callback,
|
|
62
|
+
accessible_roots=self._accessible_roots,
|
|
63
|
+
tool_change_callback=self._on_tools_changed,
|
|
64
|
+
prompt_change_callback=self._on_prompts_changed,
|
|
65
|
+
resource_change_callback=self._on_resources_changed,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def __repr__(self) -> str:
|
|
69
|
+
return f"MCPResourceProvider({self.server!r}, source={self.source!r})"
|
|
70
|
+
|
|
71
|
+
async def __aenter__(self) -> Self:
|
|
72
|
+
try:
|
|
73
|
+
await self.exit_stack.enter_async_context(self.client)
|
|
74
|
+
except Exception as e:
|
|
75
|
+
# Clean up in case of error
|
|
76
|
+
await self.__aexit__(type(e), e, e.__traceback__)
|
|
77
|
+
msg = "Failed to initialize MCP manager"
|
|
78
|
+
raise RuntimeError(msg) from e
|
|
79
|
+
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
async def __aexit__(self, *args: object) -> None:
|
|
83
|
+
try:
|
|
84
|
+
try:
|
|
85
|
+
# Clean up exit stack (which includes MCP clients)
|
|
86
|
+
await self.exit_stack.aclose()
|
|
87
|
+
except RuntimeError as e:
|
|
88
|
+
if "different task" in str(e):
|
|
89
|
+
# Handle task context mismatch
|
|
90
|
+
current_task = asyncio.current_task()
|
|
91
|
+
if current_task:
|
|
92
|
+
loop = asyncio.get_running_loop()
|
|
93
|
+
await loop.create_task(self.exit_stack.aclose())
|
|
94
|
+
else:
|
|
95
|
+
raise
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
msg = "Error during MCP manager cleanup"
|
|
99
|
+
logger.exception(msg, exc_info=e)
|
|
100
|
+
raise RuntimeError(msg) from e
|
|
101
|
+
|
|
102
|
+
async def _on_tools_changed(self) -> None:
|
|
103
|
+
"""Callback when tools change on the MCP server."""
|
|
104
|
+
logger.info("MCP tool list changed, refreshing provider cache")
|
|
105
|
+
self._saved_enabled_states = {t.name: t.enabled for t in self._tools_cache or []}
|
|
106
|
+
self._tools_cache = None
|
|
107
|
+
|
|
108
|
+
async def _on_prompts_changed(self) -> None:
|
|
109
|
+
"""Callback when prompts change on the MCP server."""
|
|
110
|
+
logger.info("MCP prompt list changed, refreshing provider cache")
|
|
111
|
+
self._prompts_cache = None
|
|
112
|
+
|
|
113
|
+
async def _on_resources_changed(self) -> None:
|
|
114
|
+
"""Callback when resources change on the MCP server."""
|
|
115
|
+
logger.info("MCP resource list changed, refreshing provider cache")
|
|
116
|
+
self._resources_cache = None
|
|
117
|
+
|
|
118
|
+
async def refresh_tools_cache(self) -> None:
|
|
119
|
+
"""Refresh the tools cache by fetching from client."""
|
|
120
|
+
try:
|
|
121
|
+
# Get fresh tools from client
|
|
122
|
+
mcp_tools = await self.client.list_tools()
|
|
123
|
+
all_tools: list[Tool] = []
|
|
124
|
+
|
|
125
|
+
for tool in mcp_tools:
|
|
126
|
+
try:
|
|
127
|
+
tool_info = self.client.convert_tool(tool)
|
|
128
|
+
all_tools.append(tool_info)
|
|
129
|
+
except Exception:
|
|
130
|
+
logger.exception("Failed to create MCP tool", name=tool.name)
|
|
131
|
+
continue
|
|
132
|
+
|
|
133
|
+
# Restore enabled states from saved states
|
|
134
|
+
for tool_info in all_tools:
|
|
135
|
+
if tool_info.name in self._saved_enabled_states:
|
|
136
|
+
tool_info.enabled = self._saved_enabled_states[tool_info.name]
|
|
137
|
+
|
|
138
|
+
self._tools_cache = all_tools
|
|
139
|
+
logger.debug("Refreshed MCP tools cache", num_tools=len(all_tools))
|
|
140
|
+
except Exception:
|
|
141
|
+
logger.exception("Failed to refresh MCP tools cache")
|
|
142
|
+
self._tools_cache = []
|
|
143
|
+
|
|
144
|
+
async def get_tools(self) -> list[Tool]:
|
|
145
|
+
"""Get cached tools, refreshing if necessary."""
|
|
146
|
+
if self._tools_cache is None:
|
|
147
|
+
await self.refresh_tools_cache()
|
|
148
|
+
|
|
149
|
+
return self._tools_cache or []
|
|
150
|
+
|
|
151
|
+
async def refresh_prompts_cache(self) -> None:
|
|
152
|
+
"""Refresh the prompts cache by fetching from client."""
|
|
153
|
+
from agentpool.prompts.prompts import MCPClientPrompt
|
|
154
|
+
|
|
155
|
+
try:
|
|
156
|
+
result = await self.client.list_prompts()
|
|
157
|
+
all_prompts: list[MCPClientPrompt] = []
|
|
158
|
+
|
|
159
|
+
for prompt in result:
|
|
160
|
+
try:
|
|
161
|
+
converted = MCPClientPrompt.from_fastmcp(self.client, prompt)
|
|
162
|
+
all_prompts.append(converted)
|
|
163
|
+
except Exception:
|
|
164
|
+
logger.exception("Failed to convert prompt", name=prompt.name)
|
|
165
|
+
continue
|
|
166
|
+
|
|
167
|
+
self._prompts_cache = all_prompts
|
|
168
|
+
logger.debug("Refreshed MCP prompts cache", num_prompts=len(all_prompts))
|
|
169
|
+
except Exception:
|
|
170
|
+
logger.exception("Failed to refresh MCP prompts cache")
|
|
171
|
+
self._prompts_cache = []
|
|
172
|
+
|
|
173
|
+
async def get_prompts(self) -> list[MCPClientPrompt]: # type: ignore
|
|
174
|
+
"""Get cached prompts, refreshing if necessary."""
|
|
175
|
+
if self._prompts_cache is None:
|
|
176
|
+
await self.refresh_prompts_cache()
|
|
177
|
+
|
|
178
|
+
return self._prompts_cache or []
|
|
179
|
+
|
|
180
|
+
async def refresh_resources_cache(self) -> None:
|
|
181
|
+
"""Refresh the resources cache by fetching from client."""
|
|
182
|
+
try:
|
|
183
|
+
result = await self.client.list_resources()
|
|
184
|
+
all_resources: list[ResourceInfo] = []
|
|
185
|
+
|
|
186
|
+
for resource in result:
|
|
187
|
+
try:
|
|
188
|
+
converted = await ResourceInfo.from_mcp_resource(resource)
|
|
189
|
+
all_resources.append(converted)
|
|
190
|
+
except Exception:
|
|
191
|
+
logger.exception("Failed to convert resource", name=resource.name)
|
|
192
|
+
continue
|
|
193
|
+
|
|
194
|
+
self._resources_cache = all_resources
|
|
195
|
+
logger.debug("Refreshed MCP resources cache", num_resources=len(all_resources))
|
|
196
|
+
except Exception:
|
|
197
|
+
logger.exception("Failed to refresh MCP resources cache")
|
|
198
|
+
self._resources_cache = []
|
|
199
|
+
|
|
200
|
+
async def get_resources(self) -> list[ResourceInfo]:
|
|
201
|
+
"""Get cached resources, refreshing if necessary."""
|
|
202
|
+
if self._resources_cache is None:
|
|
203
|
+
await self.refresh_resources_cache()
|
|
204
|
+
|
|
205
|
+
return self._resources_cache or []
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
if __name__ == "__main__":
|
|
209
|
+
import anyio
|
|
210
|
+
|
|
211
|
+
from agentpool_config.mcp_server import StdioMCPServerConfig
|
|
212
|
+
|
|
213
|
+
cfg = StdioMCPServerConfig(
|
|
214
|
+
command="uv",
|
|
215
|
+
args=["run", "/home/phil65/dev/oss/agentpool/tests/mcp_server/server.py"],
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
async def main() -> None:
|
|
219
|
+
manager = MCPResourceProvider(cfg)
|
|
220
|
+
async with manager:
|
|
221
|
+
prompts = await manager.get_prompts()
|
|
222
|
+
print(f"Found prompts: {prompts}")
|
|
223
|
+
|
|
224
|
+
# Test static prompt (no arguments)
|
|
225
|
+
static_prompt = next(p for p in prompts if p.name == "static_prompt")
|
|
226
|
+
print(f"\n--- Testing static prompt: {static_prompt} ---")
|
|
227
|
+
components = await static_prompt.get_components()
|
|
228
|
+
assert components, "No prompt components found"
|
|
229
|
+
print(f"Found {len(components)} prompt components:")
|
|
230
|
+
for i, component in enumerate(components):
|
|
231
|
+
comp_type = type(component).__name__
|
|
232
|
+
print(f" {i + 1}. {comp_type}: {component.content}")
|
|
233
|
+
|
|
234
|
+
# Test dynamic prompt (with arguments)
|
|
235
|
+
dynamic_prompt = next(p for p in prompts if p.name == "dynamic_prompt")
|
|
236
|
+
print(f"\n--- Testing dynamic prompt: {dynamic_prompt} ---")
|
|
237
|
+
components = await dynamic_prompt.get_components(
|
|
238
|
+
arguments={"some_arg": "Hello, world!"}
|
|
239
|
+
)
|
|
240
|
+
assert components, "No prompt components found"
|
|
241
|
+
print(f"Found {len(components)} prompt components:")
|
|
242
|
+
for i, component in enumerate(components):
|
|
243
|
+
comp_type = type(component).__name__
|
|
244
|
+
print(f" {i + 1}. {comp_type}: {component.content}")
|
|
245
|
+
|
|
246
|
+
anyio.run(main)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Plan provider for agent planning and task management."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING, Literal
|
|
7
|
+
|
|
8
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
9
|
+
from agentpool.resource_providers import ResourceProvider
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from agentpool.tools.base import Tool
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Plan entry types - domain models independent of ACP
|
|
17
|
+
PlanEntryPriority = Literal["high", "medium", "low"]
|
|
18
|
+
PlanEntryStatus = Literal["pending", "in_progress", "completed"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(kw_only=True)
|
|
22
|
+
class PlanEntry:
|
|
23
|
+
"""A single entry in the execution plan.
|
|
24
|
+
|
|
25
|
+
Represents a task or goal that the assistant intends to accomplish
|
|
26
|
+
as part of fulfilling the user's request.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
content: str
|
|
30
|
+
"""Human-readable description of what this task aims to accomplish."""
|
|
31
|
+
|
|
32
|
+
priority: PlanEntryPriority
|
|
33
|
+
"""The relative importance of this task."""
|
|
34
|
+
|
|
35
|
+
status: PlanEntryStatus
|
|
36
|
+
"""Current execution status of this task."""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(kw_only=True)
|
|
40
|
+
class PlanUpdateEvent:
|
|
41
|
+
"""Event indicating plan state has changed."""
|
|
42
|
+
|
|
43
|
+
entries: list[PlanEntry]
|
|
44
|
+
"""Current plan entries."""
|
|
45
|
+
event_kind: Literal["plan_update"] = "plan_update"
|
|
46
|
+
"""Event type identifier."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class PlanProvider(ResourceProvider):
|
|
50
|
+
"""Provides plan-related tools for agent planning and task management.
|
|
51
|
+
|
|
52
|
+
This provider creates tools for managing agent plans and tasks,
|
|
53
|
+
emitting domain events that can be handled by protocol adapters.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self) -> None:
|
|
57
|
+
"""Initialize plan provider."""
|
|
58
|
+
super().__init__(name="plan")
|
|
59
|
+
self._current_plan: list[PlanEntry] = []
|
|
60
|
+
|
|
61
|
+
async def get_tools(self) -> list[Tool]:
|
|
62
|
+
"""Get plan management tools."""
|
|
63
|
+
return [
|
|
64
|
+
self.create_tool(self.get_plan, category="read"),
|
|
65
|
+
self.create_tool(self.add_plan_entry, category="other"),
|
|
66
|
+
self.create_tool(self.update_plan_entry, category="edit"),
|
|
67
|
+
self.create_tool(self.remove_plan_entry, category="delete"),
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
async def get_plan(self, agent_ctx: AgentContext) -> str:
|
|
71
|
+
"""Get the current plan formatted as markdown.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
agent_ctx: Agent execution context
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Markdown-formatted plan with all entries and their status
|
|
78
|
+
"""
|
|
79
|
+
if not self._current_plan:
|
|
80
|
+
return "## Plan\n\n*No plan entries yet.*"
|
|
81
|
+
|
|
82
|
+
lines = ["## Plan", ""]
|
|
83
|
+
status_icons = {
|
|
84
|
+
"pending": "⬚",
|
|
85
|
+
"in_progress": "◐",
|
|
86
|
+
"completed": "✓",
|
|
87
|
+
}
|
|
88
|
+
priority_labels = {
|
|
89
|
+
"high": "🔴",
|
|
90
|
+
"medium": "🟡",
|
|
91
|
+
"low": "🟢",
|
|
92
|
+
}
|
|
93
|
+
for i, entry in enumerate(self._current_plan):
|
|
94
|
+
icon = status_icons.get(entry.status, "?")
|
|
95
|
+
priority = priority_labels.get(entry.priority, "")
|
|
96
|
+
lines.append(f"{i}. {icon} {priority} {entry.content} *({entry.status})*")
|
|
97
|
+
|
|
98
|
+
return "\n".join(lines)
|
|
99
|
+
|
|
100
|
+
async def add_plan_entry(
|
|
101
|
+
self,
|
|
102
|
+
agent_ctx: AgentContext,
|
|
103
|
+
content: str,
|
|
104
|
+
priority: PlanEntryPriority = "medium",
|
|
105
|
+
index: int | None = None,
|
|
106
|
+
) -> str:
|
|
107
|
+
"""Add a new plan entry.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
agent_ctx: Agent execution context
|
|
111
|
+
content: Description of what this task aims to accomplish
|
|
112
|
+
priority: Relative importance (high/medium/low)
|
|
113
|
+
index: Optional position to insert at (default: append to end)
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Success message indicating entry was added
|
|
117
|
+
"""
|
|
118
|
+
entry = PlanEntry(content=content, priority=priority, status="pending")
|
|
119
|
+
if index is None:
|
|
120
|
+
self._current_plan.append(entry)
|
|
121
|
+
entry_index = len(self._current_plan) - 1
|
|
122
|
+
else:
|
|
123
|
+
if index < 0 or index > len(self._current_plan):
|
|
124
|
+
return f"Error: Index {index} out of range (0-{len(self._current_plan)})"
|
|
125
|
+
self._current_plan.insert(index, entry)
|
|
126
|
+
entry_index = index
|
|
127
|
+
|
|
128
|
+
await self._emit_plan_update(agent_ctx)
|
|
129
|
+
|
|
130
|
+
return f"Added plan entry at index {entry_index}: {content!r} (priority={priority!r})"
|
|
131
|
+
|
|
132
|
+
async def update_plan_entry(
|
|
133
|
+
self,
|
|
134
|
+
agent_ctx: AgentContext,
|
|
135
|
+
index: int,
|
|
136
|
+
content: str | None = None,
|
|
137
|
+
status: PlanEntryStatus | None = None,
|
|
138
|
+
priority: PlanEntryPriority | None = None,
|
|
139
|
+
) -> str:
|
|
140
|
+
"""Update an existing plan entry.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
agent_ctx: Agent execution context
|
|
144
|
+
index: Position of entry to update (0-based)
|
|
145
|
+
content: New task description
|
|
146
|
+
status: New execution status
|
|
147
|
+
priority: New priority level
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Success message indicating what was updated
|
|
151
|
+
"""
|
|
152
|
+
if index < 0 or index >= len(self._current_plan):
|
|
153
|
+
return f"Error: Index {index} out of range (0-{len(self._current_plan) - 1})"
|
|
154
|
+
|
|
155
|
+
entry = self._current_plan[index]
|
|
156
|
+
updates = []
|
|
157
|
+
|
|
158
|
+
if content is not None:
|
|
159
|
+
entry.content = content
|
|
160
|
+
updates.append(f"content to {content!r}")
|
|
161
|
+
|
|
162
|
+
if status is not None:
|
|
163
|
+
entry.status = status
|
|
164
|
+
updates.append(f"status to {status!r}")
|
|
165
|
+
|
|
166
|
+
if priority is not None:
|
|
167
|
+
entry.priority = priority
|
|
168
|
+
updates.append(f"priority to {priority!r}")
|
|
169
|
+
|
|
170
|
+
if not updates:
|
|
171
|
+
return "No changes specified"
|
|
172
|
+
|
|
173
|
+
await self._emit_plan_update(agent_ctx)
|
|
174
|
+
return f"Updated entry {index}: {', '.join(updates)}"
|
|
175
|
+
|
|
176
|
+
async def remove_plan_entry(self, agent_ctx: AgentContext, index: int) -> str:
|
|
177
|
+
"""Remove a plan entry.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
agent_ctx: Agent execution context
|
|
181
|
+
index: Position of entry to remove (0-based)
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Success message indicating entry was removed
|
|
185
|
+
"""
|
|
186
|
+
if index < 0 or index >= len(self._current_plan):
|
|
187
|
+
return f"Error: Index {index} out of range (0-{len(self._current_plan) - 1})"
|
|
188
|
+
removed_entry = self._current_plan.pop(index)
|
|
189
|
+
await self._emit_plan_update(agent_ctx)
|
|
190
|
+
if self._current_plan:
|
|
191
|
+
return f"Removed entry {index}: {removed_entry.content!r}, remaining entries reindexed"
|
|
192
|
+
return f"Removed entry {index}: {removed_entry.content!r}, plan is now empty"
|
|
193
|
+
|
|
194
|
+
async def _emit_plan_update(self, agent_ctx: AgentContext) -> None:
|
|
195
|
+
"""Emit plan update event."""
|
|
196
|
+
await agent_ctx.events.plan_updated(self._current_plan)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Resource provider exposing Nodes as tools."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from agentpool.log import get_logger
|
|
8
|
+
from agentpool.resource_providers import ResourceProvider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from agentpool import AgentPool
|
|
13
|
+
from agentpool.prompts.prompts import BasePrompt
|
|
14
|
+
from agentpool.tools.base import Tool
|
|
15
|
+
from agentpool_config.resources import ResourceInfo
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PoolResourceProvider(ResourceProvider):
|
|
21
|
+
"""Provider that exposes an AgentPool's resources."""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
pool: AgentPool[Any],
|
|
26
|
+
name: str | None = None,
|
|
27
|
+
zed_mode: bool = False,
|
|
28
|
+
include_team_members: bool = False,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialize provider with agent pool.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
pool: Agent pool to expose resources from
|
|
34
|
+
name: Optional name override (defaults to pool name)
|
|
35
|
+
zed_mode: Whether to enable Zed mode
|
|
36
|
+
include_team_members: Whether to include team members in the pool
|
|
37
|
+
in addition to the team itself.
|
|
38
|
+
"""
|
|
39
|
+
super().__init__(name=name or repr(pool))
|
|
40
|
+
self.pool = pool
|
|
41
|
+
self.zed_mode = zed_mode
|
|
42
|
+
self.include_team_members = include_team_members
|
|
43
|
+
|
|
44
|
+
async def get_tools(self) -> list[Tool]:
|
|
45
|
+
"""Get tools from all agents in pool."""
|
|
46
|
+
team_tools = [team.to_tool() for team in self.pool.teams.values()]
|
|
47
|
+
agents = list(self.pool.agents.values())
|
|
48
|
+
team_members = {member for t in self.pool.teams.values() for member in t.nodes}
|
|
49
|
+
if self.include_team_members:
|
|
50
|
+
agent_tools = [agent.to_tool() for agent in agents]
|
|
51
|
+
else:
|
|
52
|
+
agent_tools = [agent.to_tool() for agent in agents if agent not in team_members]
|
|
53
|
+
return team_tools + agent_tools
|
|
54
|
+
|
|
55
|
+
async def get_prompts(self) -> list[BasePrompt]:
|
|
56
|
+
"""Get prompts from pool's manifest."""
|
|
57
|
+
prompts: list[Any] = []
|
|
58
|
+
# if self.pool.manifest.prompts:
|
|
59
|
+
# prompts.extend(self.pool.manifest.prompts.system_prompts.values())
|
|
60
|
+
|
|
61
|
+
# if self.zed_mode:
|
|
62
|
+
# prompts = prepare_prompts_for_zed(prompts)
|
|
63
|
+
|
|
64
|
+
return prompts
|
|
65
|
+
|
|
66
|
+
async def get_resources(self) -> list[ResourceInfo]:
|
|
67
|
+
"""Get resources from pool's manifest."""
|
|
68
|
+
# Here we could expose knowledge bases or other resources from manifest
|
|
69
|
+
return []
|