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,319 @@
|
|
|
1
|
+
"""Manages message flow between agents/groups."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from contextlib import asynccontextmanager
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
8
|
+
|
|
9
|
+
from psygnal import Signal
|
|
10
|
+
from psygnal.containers import EventedList
|
|
11
|
+
|
|
12
|
+
from agentpool.log import get_logger
|
|
13
|
+
from agentpool.talk import AggregatedTalkStats, Talk, TeamTalk
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from collections.abc import AsyncIterator
|
|
18
|
+
from datetime import timedelta
|
|
19
|
+
|
|
20
|
+
from agentpool.common_types import AgentName, AnyTransformFn, AsyncFilterFn, QueueStrategy
|
|
21
|
+
from agentpool.messaging import ChatMessage, MessageNode
|
|
22
|
+
from agentpool_config.forward_targets import ConnectionType
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ConnectionManager:
|
|
28
|
+
"""Manages connections for both Agents and Teams."""
|
|
29
|
+
|
|
30
|
+
connection_processed = Signal(Talk.ConnectionProcessed)
|
|
31
|
+
|
|
32
|
+
node_connected = Signal(object) # Node
|
|
33
|
+
connection_added = Signal(Talk) # Agent
|
|
34
|
+
|
|
35
|
+
def __init__(self, owner: MessageNode[Any, Any]) -> None:
|
|
36
|
+
self.owner = owner
|
|
37
|
+
# helper class for the user
|
|
38
|
+
self._connections = EventedList[Talk]()
|
|
39
|
+
self._wait_states: dict[AgentName, bool] = {}
|
|
40
|
+
|
|
41
|
+
def __repr__(self) -> str:
|
|
42
|
+
return f"ConnectionManager({self.owner})"
|
|
43
|
+
|
|
44
|
+
def _on_talk_added(self, index: int, talk: Talk) -> None:
|
|
45
|
+
"""Connect to new talk's signal."""
|
|
46
|
+
talk.connection_processed.connect(self._handle_message_flow)
|
|
47
|
+
|
|
48
|
+
def _on_talk_removed(self, index: int, talk: Talk) -> None:
|
|
49
|
+
"""Disconnect from removed talk's signal."""
|
|
50
|
+
talk.connection_processed.disconnect(self._handle_message_flow)
|
|
51
|
+
|
|
52
|
+
def _on_talk_changed(self, index: int, old: Talk, new: Talk) -> None:
|
|
53
|
+
"""Update signal connections on talk change."""
|
|
54
|
+
old.connection_processed.disconnect(self._handle_message_flow)
|
|
55
|
+
new.connection_processed.connect(self._handle_message_flow)
|
|
56
|
+
|
|
57
|
+
def _handle_message_flow(self, event: Talk.ConnectionProcessed) -> None:
|
|
58
|
+
"""Forward message flow to our aggregated signal."""
|
|
59
|
+
self.connection_processed.emit(event)
|
|
60
|
+
|
|
61
|
+
def set_wait_state(self, target: MessageNode[Any, Any] | AgentName, wait: bool = True) -> None:
|
|
62
|
+
"""Set waiting behavior for target."""
|
|
63
|
+
target_name = target if isinstance(target, str) else target.name
|
|
64
|
+
self._wait_states[target_name] = wait
|
|
65
|
+
|
|
66
|
+
async def wait_for_connections(self, _seen: set[AgentName] | None = None) -> None:
|
|
67
|
+
"""Wait for this agent and all connected agents to complete their tasks."""
|
|
68
|
+
seen: set[AgentName] = _seen or {self.owner.name}
|
|
69
|
+
|
|
70
|
+
# Wait for our own tasks
|
|
71
|
+
await self.owner.task_manager.complete_tasks()
|
|
72
|
+
|
|
73
|
+
# Wait for connected agents
|
|
74
|
+
for agent in self.get_targets():
|
|
75
|
+
if agent.name not in seen:
|
|
76
|
+
seen.add(agent.name)
|
|
77
|
+
await agent.connections.wait_for_connections(seen)
|
|
78
|
+
|
|
79
|
+
def get_targets(
|
|
80
|
+
self, recursive: bool = False, _seen: set[AgentName] | None = None
|
|
81
|
+
) -> set[MessageNode[Any, Any]]:
|
|
82
|
+
"""Get all currently connected target agents.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
recursive: Whether to include targets of targets
|
|
86
|
+
"""
|
|
87
|
+
# Get direct targets
|
|
88
|
+
targets = {t for conn in self._connections for t in conn.targets if conn.active}
|
|
89
|
+
|
|
90
|
+
if not recursive:
|
|
91
|
+
return targets
|
|
92
|
+
|
|
93
|
+
# Track seen agents to prevent cycles
|
|
94
|
+
seen = _seen or {self.owner.name}
|
|
95
|
+
all_targets = set()
|
|
96
|
+
|
|
97
|
+
for target in targets:
|
|
98
|
+
if target.name not in seen:
|
|
99
|
+
targets_ = target.connections.get_targets(recursive=True, _seen=seen)
|
|
100
|
+
seen.add(target.name)
|
|
101
|
+
all_targets.add(target)
|
|
102
|
+
all_targets.update(targets_)
|
|
103
|
+
|
|
104
|
+
return all_targets
|
|
105
|
+
|
|
106
|
+
def has_connection_to(self, target: MessageNode[Any, Any]) -> bool:
|
|
107
|
+
"""Check if target is connected."""
|
|
108
|
+
return any(target in conn.targets for conn in self._connections if conn.active)
|
|
109
|
+
|
|
110
|
+
def create_connection(
|
|
111
|
+
self,
|
|
112
|
+
source: MessageNode[Any, Any],
|
|
113
|
+
target: MessageNode[Any, Any] | Sequence[MessageNode[Any, Any]],
|
|
114
|
+
*,
|
|
115
|
+
connection_type: ConnectionType = "run",
|
|
116
|
+
priority: int = 0,
|
|
117
|
+
delay: timedelta | None = None,
|
|
118
|
+
queued: bool = False,
|
|
119
|
+
queue_strategy: QueueStrategy = "latest",
|
|
120
|
+
transform: AnyTransformFn[Any] | None = None,
|
|
121
|
+
filter_condition: AsyncFilterFn | None = None,
|
|
122
|
+
stop_condition: AsyncFilterFn | None = None,
|
|
123
|
+
exit_condition: AsyncFilterFn | None = None,
|
|
124
|
+
name: str | None = None,
|
|
125
|
+
) -> Talk[Any] | TeamTalk:
|
|
126
|
+
"""Create connection(s) to target(s).
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
source: Source agent or team
|
|
130
|
+
target: Single target or sequence of targets
|
|
131
|
+
connection_type: How to handle messages
|
|
132
|
+
priority: Task priority (lower = higher priority)
|
|
133
|
+
delay: Optional delay before processing
|
|
134
|
+
queued: Whether to queue messages for manual processing
|
|
135
|
+
queue_strategy: How to process queued messages
|
|
136
|
+
transform: Optional message transformation
|
|
137
|
+
filter_condition: When to filter messages
|
|
138
|
+
stop_condition: When to disconnect
|
|
139
|
+
exit_condition: When to exit application
|
|
140
|
+
name: Optional name for cross-referencing connections
|
|
141
|
+
"""
|
|
142
|
+
if isinstance(target, Sequence):
|
|
143
|
+
# Create individual talks recursively
|
|
144
|
+
talks = [
|
|
145
|
+
self.create_connection(
|
|
146
|
+
source,
|
|
147
|
+
t,
|
|
148
|
+
connection_type=connection_type,
|
|
149
|
+
priority=priority,
|
|
150
|
+
delay=delay,
|
|
151
|
+
queued=queued,
|
|
152
|
+
queue_strategy=queue_strategy,
|
|
153
|
+
transform=transform,
|
|
154
|
+
filter_condition=filter_condition,
|
|
155
|
+
stop_condition=stop_condition,
|
|
156
|
+
exit_condition=exit_condition,
|
|
157
|
+
# Don't pass name - it should only apply to single connections
|
|
158
|
+
)
|
|
159
|
+
for t in target
|
|
160
|
+
]
|
|
161
|
+
return TeamTalk(talks)
|
|
162
|
+
|
|
163
|
+
# Single target case
|
|
164
|
+
talk = Talk(
|
|
165
|
+
source=source,
|
|
166
|
+
targets=[target],
|
|
167
|
+
connection_type=connection_type,
|
|
168
|
+
name=name,
|
|
169
|
+
priority=priority,
|
|
170
|
+
delay=delay,
|
|
171
|
+
queued=queued,
|
|
172
|
+
queue_strategy=queue_strategy,
|
|
173
|
+
transform=transform,
|
|
174
|
+
filter_condition=filter_condition,
|
|
175
|
+
stop_condition=stop_condition,
|
|
176
|
+
exit_condition=exit_condition,
|
|
177
|
+
)
|
|
178
|
+
# TODO: better perhaps directly connect EventedList signal to node_connected?
|
|
179
|
+
# or emit in _on_talk_added?
|
|
180
|
+
self.node_connected.emit(target)
|
|
181
|
+
self._connections.append(talk)
|
|
182
|
+
self.connection_added.emit(talk)
|
|
183
|
+
if pool := source.agent_pool:
|
|
184
|
+
# Always use Talk's name for registration
|
|
185
|
+
if name:
|
|
186
|
+
pool.connection_registry.register(name, talk)
|
|
187
|
+
else:
|
|
188
|
+
pool.connection_registry.register_auto(talk)
|
|
189
|
+
else:
|
|
190
|
+
logger.debug("Could not register connection. no pool available", connection=name)
|
|
191
|
+
return talk
|
|
192
|
+
|
|
193
|
+
async def trigger_all(self) -> dict[AgentName, list[ChatMessage[Any]]]:
|
|
194
|
+
"""Trigger all queued connections."""
|
|
195
|
+
return {
|
|
196
|
+
i.source.name: await i.trigger()
|
|
197
|
+
for i in self._connections
|
|
198
|
+
if isinstance(i, Talk) and i.queued
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async def trigger_for(
|
|
202
|
+
self, target: AgentName | MessageNode[Any, Any]
|
|
203
|
+
) -> list[ChatMessage[Any]]:
|
|
204
|
+
"""Trigger queued connections to specific target."""
|
|
205
|
+
target_name = target if isinstance(target, str) else target.name
|
|
206
|
+
results = []
|
|
207
|
+
for talk in self._connections:
|
|
208
|
+
if talk.queued and (t.name == target_name for t in talk.targets):
|
|
209
|
+
results.extend(await talk.trigger())
|
|
210
|
+
return results
|
|
211
|
+
|
|
212
|
+
def disconnect_all(self) -> None:
|
|
213
|
+
"""Disconnect all managed connections."""
|
|
214
|
+
for conn in self._connections:
|
|
215
|
+
conn.disconnect()
|
|
216
|
+
self._connections.clear()
|
|
217
|
+
|
|
218
|
+
def disconnect(self, node: MessageNode[Any, Any]) -> None:
|
|
219
|
+
"""Disconnect a specific node."""
|
|
220
|
+
for talk in self._connections:
|
|
221
|
+
if node in talk.targets or node == talk.source:
|
|
222
|
+
talk.active = False
|
|
223
|
+
self._connections.remove(talk)
|
|
224
|
+
|
|
225
|
+
async def route_message(self, message: ChatMessage[Any], wait: bool | None = None) -> None:
|
|
226
|
+
"""Route message to all connections."""
|
|
227
|
+
if wait is not None:
|
|
228
|
+
should_wait = wait
|
|
229
|
+
else:
|
|
230
|
+
should_wait = any(self._wait_states.get(t.name, False) for t in self.get_targets())
|
|
231
|
+
msg = "ConnectionManager routing message"
|
|
232
|
+
logger.debug(msg, sender=message.name, num_connections=len(self._connections))
|
|
233
|
+
for talk in self._connections:
|
|
234
|
+
await talk._handle_message(message, None)
|
|
235
|
+
|
|
236
|
+
if should_wait:
|
|
237
|
+
await self.wait_for_connections()
|
|
238
|
+
|
|
239
|
+
@asynccontextmanager
|
|
240
|
+
async def paused_routing(self) -> AsyncIterator[Self]:
|
|
241
|
+
"""Temporarily pause message routing to connections."""
|
|
242
|
+
active_talks = [talk for talk in self._connections if talk.active]
|
|
243
|
+
for talk in active_talks:
|
|
244
|
+
talk.active = False
|
|
245
|
+
try:
|
|
246
|
+
yield self
|
|
247
|
+
finally:
|
|
248
|
+
for talk in active_talks:
|
|
249
|
+
talk.active = True
|
|
250
|
+
|
|
251
|
+
@property
|
|
252
|
+
def stats(self) -> AggregatedTalkStats:
|
|
253
|
+
"""Get aggregated statistics for all connections."""
|
|
254
|
+
return AggregatedTalkStats(stats=[conn.stats for conn in self._connections])
|
|
255
|
+
|
|
256
|
+
def get_connections(self, recursive: bool = False) -> list[Talk[Any]]:
|
|
257
|
+
"""Get all Talk connections, flattening TeamTalks."""
|
|
258
|
+
result = []
|
|
259
|
+
seen = set()
|
|
260
|
+
|
|
261
|
+
# Get our direct connections
|
|
262
|
+
for conn in self._connections:
|
|
263
|
+
result.append(conn) # noqa: PERF402
|
|
264
|
+
# Get target connections if recursive
|
|
265
|
+
if recursive:
|
|
266
|
+
for conn in result:
|
|
267
|
+
for target in conn.targets:
|
|
268
|
+
if target.name not in seen:
|
|
269
|
+
seen.add(target.name)
|
|
270
|
+
result.extend(target.connections.get_connections(True))
|
|
271
|
+
|
|
272
|
+
return result
|
|
273
|
+
|
|
274
|
+
def get_mermaid_diagram(
|
|
275
|
+
self,
|
|
276
|
+
include_details: bool = True,
|
|
277
|
+
recursive: bool = True,
|
|
278
|
+
) -> str:
|
|
279
|
+
"""Generate mermaid flowchart of all connections."""
|
|
280
|
+
lines = ["flowchart LR"]
|
|
281
|
+
connections = self.get_connections(recursive=recursive)
|
|
282
|
+
|
|
283
|
+
for talk in connections:
|
|
284
|
+
source = talk.source.name
|
|
285
|
+
for target in talk.targets:
|
|
286
|
+
if not include_details:
|
|
287
|
+
lines.append(f" {source}-->{target.name}")
|
|
288
|
+
continue
|
|
289
|
+
details: list[str] = []
|
|
290
|
+
details.append(talk.connection_type)
|
|
291
|
+
if talk.queued:
|
|
292
|
+
details.append(f"queued({talk.queue_strategy})")
|
|
293
|
+
if talk.filter_condition:
|
|
294
|
+
details.append(f"filter:{talk.filter_condition.__name__}")
|
|
295
|
+
if talk.stop_condition:
|
|
296
|
+
details.append(f"stop:{talk.stop_condition.__name__}")
|
|
297
|
+
if talk.exit_condition:
|
|
298
|
+
details.append(f"exit:{talk.exit_condition.__name__}")
|
|
299
|
+
elif any([talk.filter_condition, talk.stop_condition, talk.exit_condition]):
|
|
300
|
+
details.append("conditions")
|
|
301
|
+
|
|
302
|
+
label = f"|{' '.join(details)}|" if details else ""
|
|
303
|
+
lines.append(f" {source}--{label}-->{target.name}")
|
|
304
|
+
|
|
305
|
+
return "\n".join(lines)
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
if __name__ == "__main__":
|
|
309
|
+
from agentpool.agents import Agent
|
|
310
|
+
|
|
311
|
+
agent = Agent("test_agent")
|
|
312
|
+
agent_2 = Agent("test_agent_2")
|
|
313
|
+
agent_3 = Agent("test_agent_3")
|
|
314
|
+
agent_4 = Agent("test_agent_4")
|
|
315
|
+
_conn_1 = agent >> agent_2
|
|
316
|
+
_conn_2 = agent >> agent_3
|
|
317
|
+
_conn_3 = agent_2 >> agent_4
|
|
318
|
+
# print(agent.connections.get_connections(recursive=True))
|
|
319
|
+
# print(agent.connections.get_mermaid_diagram())
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Base class for message processing nodes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from agentpool import AgentPool
|
|
11
|
+
from agentpool.agents.base_agent import BaseAgent
|
|
12
|
+
from agentpool.messaging import MessageNode
|
|
13
|
+
from agentpool.models.manifest import AgentsManifest
|
|
14
|
+
from agentpool.prompts.manager import PromptManager
|
|
15
|
+
from agentpool.ui.base import InputProvider
|
|
16
|
+
from agentpool_config.nodes import NodeConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(kw_only=True)
|
|
20
|
+
class NodeContext[TDeps = object]:
|
|
21
|
+
"""Context for message processing nodes."""
|
|
22
|
+
|
|
23
|
+
node: MessageNode[TDeps, Any]
|
|
24
|
+
"""Current Node."""
|
|
25
|
+
|
|
26
|
+
pool: AgentPool[Any] | None = None
|
|
27
|
+
"""The agent pool the node is part of."""
|
|
28
|
+
|
|
29
|
+
config: NodeConfig
|
|
30
|
+
"""Node configuration."""
|
|
31
|
+
|
|
32
|
+
definition: AgentsManifest
|
|
33
|
+
"""Complete agent definition with all configurations."""
|
|
34
|
+
|
|
35
|
+
input_provider: InputProvider | None = None
|
|
36
|
+
"""Provider for human-input-handling."""
|
|
37
|
+
|
|
38
|
+
data: TDeps | None = None
|
|
39
|
+
"""Custom context data."""
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def node_name(self) -> str:
|
|
43
|
+
"""Name of the current node."""
|
|
44
|
+
return self.node.name
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def agent(self) -> BaseAgent[TDeps, Any]:
|
|
48
|
+
"""Return agent node, type-narrowed to BaseAgent."""
|
|
49
|
+
from agentpool.agents.base_agent import BaseAgent
|
|
50
|
+
|
|
51
|
+
assert isinstance(self.node, BaseAgent)
|
|
52
|
+
return self.node
|
|
53
|
+
|
|
54
|
+
def get_input_provider(self) -> InputProvider:
|
|
55
|
+
from agentpool.ui.stdlib_provider import StdlibInputProvider
|
|
56
|
+
|
|
57
|
+
if self.input_provider:
|
|
58
|
+
return self.input_provider
|
|
59
|
+
if self.pool and self.pool._input_provider:
|
|
60
|
+
return self.pool._input_provider
|
|
61
|
+
return StdlibInputProvider()
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def prompt_manager(self) -> PromptManager:
|
|
65
|
+
"""Get prompt manager from manifest."""
|
|
66
|
+
return self.definition.prompt_manager
|