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,43 @@
|
|
|
1
|
+
"""ACP resource providers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from exxec.acp_provider import ACPExecutionEnvironment
|
|
8
|
+
|
|
9
|
+
from agentpool.resource_providers import PlanProvider
|
|
10
|
+
from agentpool_toolsets.builtin import CodeTools, ExecutionEnvironmentTools
|
|
11
|
+
from agentpool_toolsets.fsspec_toolset import FSSpecTools
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from agentpool.resource_providers.aggregating import AggregatingResourceProvider
|
|
16
|
+
from agentpool_server.acp_server.session import ACPSession
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_acp_provider(session: ACPSession) -> AggregatingResourceProvider:
|
|
20
|
+
"""Create aggregated resource provider with ACP-specific toolsets.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
session: The ACP session to create providers for
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
AggregatingResourceProvider with execution, filesystem, and code tools
|
|
27
|
+
"""
|
|
28
|
+
from agentpool.resource_providers.aggregating import AggregatingResourceProvider
|
|
29
|
+
|
|
30
|
+
execution_env = ACPExecutionEnvironment(
|
|
31
|
+
fs=session.fs, requests=session.requests, cwd=session.cwd
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
providers = [
|
|
35
|
+
PlanProvider(),
|
|
36
|
+
ExecutionEnvironmentTools(env=execution_env, name=f"acp_execution_{session.session_id}"),
|
|
37
|
+
FSSpecTools(execution_env, name=f"acp_fs_{session.session_id}", cwd=session.cwd),
|
|
38
|
+
CodeTools(execution_env, name=f"acp_code_{session.session_id}", cwd=session.cwd),
|
|
39
|
+
]
|
|
40
|
+
return AggregatingResourceProvider(providers=providers, name=f"acp_{session.session_id}")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
__all__ = ["get_acp_provider"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Slash commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from .docs_commands import get_docs_commands
|
|
6
|
+
from .acp_commands import get_acp_commands
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from slashed import SlashedCommand
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_commands() -> list[type[SlashedCommand]]:
|
|
14
|
+
"""Get all ACP-specific commands."""
|
|
15
|
+
return [*get_acp_commands(), *get_docs_commands()]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["get_acp_commands", "get_docs_commands"]
|
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
"""ACP-specific slash commands for session management."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from slashed import CommandContext # noqa: TC002
|
|
8
|
+
|
|
9
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
10
|
+
from agentpool_commands.base import NodeCommand
|
|
11
|
+
from agentpool_config.session import SessionQuery
|
|
12
|
+
from agentpool_server.acp_server.session import ACPSession # noqa: TC001
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from pydantic_ai import ModelRequest, ModelResponse
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ListSessionsCommand(NodeCommand):
|
|
20
|
+
"""List all available ACP sessions.
|
|
21
|
+
|
|
22
|
+
Shows:
|
|
23
|
+
- Session ID and status (active/stored)
|
|
24
|
+
- Agent name and working directory
|
|
25
|
+
- Creation time and last activity
|
|
26
|
+
|
|
27
|
+
Options:
|
|
28
|
+
--active Show only active sessions
|
|
29
|
+
--stored Show only stored sessions
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
name = "list-sessions"
|
|
33
|
+
category = "acp"
|
|
34
|
+
|
|
35
|
+
async def execute_command(
|
|
36
|
+
self,
|
|
37
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
38
|
+
*,
|
|
39
|
+
active: bool = False,
|
|
40
|
+
stored: bool = False,
|
|
41
|
+
) -> None:
|
|
42
|
+
"""List available ACP sessions.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
ctx: Command context with ACP session
|
|
46
|
+
active: Show only active sessions
|
|
47
|
+
stored: Show only stored sessions
|
|
48
|
+
"""
|
|
49
|
+
session = ctx.context.data
|
|
50
|
+
if not session:
|
|
51
|
+
raise RuntimeError("Session not available in command context")
|
|
52
|
+
|
|
53
|
+
if not session.manager:
|
|
54
|
+
await ctx.output.print("❌ **Session manager not available**")
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
# If no filter specified, show both
|
|
58
|
+
if not active and not stored:
|
|
59
|
+
active = stored = True
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
output_lines = ["## 📋 ACP Sessions\n"]
|
|
63
|
+
|
|
64
|
+
# Show active sessions
|
|
65
|
+
if active:
|
|
66
|
+
output_lines.append("### 🟢 Active Sessions")
|
|
67
|
+
active_sessions = session.manager._active
|
|
68
|
+
|
|
69
|
+
if not active_sessions:
|
|
70
|
+
output_lines.append("*No active sessions*\n")
|
|
71
|
+
else:
|
|
72
|
+
for session_id, sess in active_sessions.items():
|
|
73
|
+
agent_name = sess.current_agent_name
|
|
74
|
+
cwd = sess.cwd or "unknown"
|
|
75
|
+
is_current = session_id == session.session_id
|
|
76
|
+
|
|
77
|
+
# Get title from SessionData
|
|
78
|
+
session_data = await session.manager.session_manager.store.load(session_id)
|
|
79
|
+
title = session_data.title if session_data else None
|
|
80
|
+
|
|
81
|
+
status = " *(current)*" if is_current else ""
|
|
82
|
+
title_text = f": {title}" if title else ""
|
|
83
|
+
output_lines.append(f"- **{session_id}**{status}{title_text}")
|
|
84
|
+
output_lines.append(f" - Agent: `{agent_name}`")
|
|
85
|
+
output_lines.append(f" - Directory: `{cwd}`")
|
|
86
|
+
output_lines.append("")
|
|
87
|
+
|
|
88
|
+
# Show stored sessions
|
|
89
|
+
if stored:
|
|
90
|
+
output_lines.append("### 💾 Stored Sessions")
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
stored_session_ids = await session.manager.session_manager.store.list_sessions()
|
|
94
|
+
# Filter out active ones if we already showed them
|
|
95
|
+
if active:
|
|
96
|
+
stored_session_ids = [
|
|
97
|
+
sid for sid in stored_session_ids if sid not in session.manager._active
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
if not stored_session_ids:
|
|
101
|
+
output_lines.append("*No stored sessions*\n")
|
|
102
|
+
else:
|
|
103
|
+
for session_id in stored_session_ids:
|
|
104
|
+
session_data = await session.manager.session_manager.store.load(
|
|
105
|
+
session_id
|
|
106
|
+
)
|
|
107
|
+
if session_data:
|
|
108
|
+
title_text = f": {session_data.title}" if session_data.title else ""
|
|
109
|
+
output_lines.append(f"- **{session_id}**{title_text}")
|
|
110
|
+
output_lines.append(f" - Agent: `{session_data.agent_name}`")
|
|
111
|
+
output_lines.append(
|
|
112
|
+
f" - Directory: `{session_data.cwd or 'unknown'}`"
|
|
113
|
+
)
|
|
114
|
+
output_lines.append(
|
|
115
|
+
f" - Last active: {session_data.last_active.strftime('%Y-%m-%d %H:%M')}" # noqa: E501
|
|
116
|
+
)
|
|
117
|
+
output_lines.append("")
|
|
118
|
+
except Exception as e: # noqa: BLE001
|
|
119
|
+
output_lines.append(f"*Error loading stored sessions: {e}*\n")
|
|
120
|
+
|
|
121
|
+
await ctx.output.print("\n".join(output_lines))
|
|
122
|
+
|
|
123
|
+
except Exception as e: # noqa: BLE001
|
|
124
|
+
await ctx.output.print(f"❌ **Error listing sessions:** {e}")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class LoadSessionCommand(NodeCommand):
|
|
128
|
+
"""Load a previous ACP session with conversation replay.
|
|
129
|
+
|
|
130
|
+
This command will:
|
|
131
|
+
1. Look up the session by ID
|
|
132
|
+
2. Replay the conversation history via ACP notifications
|
|
133
|
+
3. Restore the session context (agent, working directory)
|
|
134
|
+
|
|
135
|
+
Options:
|
|
136
|
+
--preview Show session info without loading
|
|
137
|
+
--no-replay Load session without replaying conversation
|
|
138
|
+
|
|
139
|
+
Examples:
|
|
140
|
+
/load-session sess_abc123def456
|
|
141
|
+
/load-session sess_abc123def456 --preview
|
|
142
|
+
/load-session sess_abc123def456 --no-replay
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
name = "load-session"
|
|
146
|
+
category = "acp"
|
|
147
|
+
|
|
148
|
+
async def execute_command( # noqa: PLR0915
|
|
149
|
+
self,
|
|
150
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
151
|
+
session_id: str,
|
|
152
|
+
*,
|
|
153
|
+
preview: bool = False,
|
|
154
|
+
no_replay: bool = False,
|
|
155
|
+
) -> None:
|
|
156
|
+
"""Load a previous ACP session.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
ctx: Command context with ACP session
|
|
160
|
+
session_id: Session identifier to load
|
|
161
|
+
preview: Show session info without loading
|
|
162
|
+
no_replay: Load session without replaying conversation
|
|
163
|
+
"""
|
|
164
|
+
session = ctx.context.data
|
|
165
|
+
if not session:
|
|
166
|
+
raise RuntimeError("Session not available in command context")
|
|
167
|
+
|
|
168
|
+
if not session.manager:
|
|
169
|
+
await ctx.output.print("❌ **Session manager not available**")
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
# Load session data from storage
|
|
174
|
+
session_data = await session.manager.session_manager.store.load(session_id)
|
|
175
|
+
|
|
176
|
+
if not session_data:
|
|
177
|
+
await ctx.output.print(f"❌ **Session not found:** `{session_id}`")
|
|
178
|
+
return
|
|
179
|
+
|
|
180
|
+
# Get conversation history from storage
|
|
181
|
+
storage = session.agent_pool.storage
|
|
182
|
+
messages = []
|
|
183
|
+
if storage:
|
|
184
|
+
query = SessionQuery(name=session_data.conversation_id)
|
|
185
|
+
messages = await storage.filter_messages(query)
|
|
186
|
+
|
|
187
|
+
if preview:
|
|
188
|
+
# Show session preview without loading
|
|
189
|
+
preview_lines = [
|
|
190
|
+
f"## 📋 Session Preview: `{session_id}`\n",
|
|
191
|
+
]
|
|
192
|
+
|
|
193
|
+
if session_data.title:
|
|
194
|
+
preview_lines.append(f"**Title:** {session_data.title}")
|
|
195
|
+
|
|
196
|
+
preview_lines.extend([
|
|
197
|
+
f"**Agent:** `{session_data.agent_name}`",
|
|
198
|
+
f"**Directory:** `{session_data.cwd or 'unknown'}`",
|
|
199
|
+
f"**Created:** {session_data.created_at.strftime('%Y-%m-%d %H:%M')}",
|
|
200
|
+
f"**Last active:** {session_data.last_active.strftime('%Y-%m-%d %H:%M')}",
|
|
201
|
+
f"**Conversation ID:** `{session_data.conversation_id}`",
|
|
202
|
+
f"**Messages:** {len(messages)}",
|
|
203
|
+
])
|
|
204
|
+
|
|
205
|
+
if session_data.metadata:
|
|
206
|
+
preview_lines.append(
|
|
207
|
+
f"**Protocol:** {session_data.metadata.get('protocol', 'unknown')}"
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
await ctx.output.print("\n".join(preview_lines))
|
|
211
|
+
return
|
|
212
|
+
|
|
213
|
+
# Actually load the session
|
|
214
|
+
await ctx.output.print(f"🔄 **Loading session `{session_id}`...**")
|
|
215
|
+
|
|
216
|
+
# Switch to the session's agent if different
|
|
217
|
+
if session_data.agent_name != session.current_agent_name:
|
|
218
|
+
if session_data.agent_name in session.agent_pool.all_agents:
|
|
219
|
+
await session.switch_active_agent(session_data.agent_name)
|
|
220
|
+
await ctx.output.print(f"📌 **Switched to agent:** `{session_data.agent_name}`")
|
|
221
|
+
else:
|
|
222
|
+
await ctx.output.print(
|
|
223
|
+
f"⚠️ **Agent `{session_data.agent_name}` not found, keeping current agent**"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Update working directory if specified
|
|
227
|
+
if session_data.cwd and session_data.cwd != session.cwd:
|
|
228
|
+
session.cwd = session_data.cwd
|
|
229
|
+
await ctx.output.print(f"📂 **Working directory:** `{session_data.cwd}`")
|
|
230
|
+
|
|
231
|
+
# Replay conversation history unless disabled
|
|
232
|
+
if not no_replay and messages:
|
|
233
|
+
await ctx.output.print(f"📽️ **Replaying {len(messages)} messages...**")
|
|
234
|
+
|
|
235
|
+
# Extract ModelRequest/ModelResponse from ChatMessage.messages field
|
|
236
|
+
|
|
237
|
+
model_messages: list[ModelRequest | ModelResponse] = []
|
|
238
|
+
for chat_msg in messages:
|
|
239
|
+
if chat_msg.messages:
|
|
240
|
+
model_messages.extend(chat_msg.messages)
|
|
241
|
+
|
|
242
|
+
if model_messages:
|
|
243
|
+
# Use ACPNotifications.replay() which handles all content types properly
|
|
244
|
+
try:
|
|
245
|
+
await session.notifications.replay(model_messages)
|
|
246
|
+
await ctx.output.print(
|
|
247
|
+
f"✅ **Replayed {len(model_messages)} model messages**"
|
|
248
|
+
)
|
|
249
|
+
except Exception as e: # noqa: BLE001
|
|
250
|
+
session.log.warning("Failed to replay conversation history", error=str(e))
|
|
251
|
+
await ctx.output.print(f"⚠️ **Failed to replay messages:** {e}")
|
|
252
|
+
else:
|
|
253
|
+
await ctx.output.print("📭 **No model messages to replay**")
|
|
254
|
+
elif no_replay:
|
|
255
|
+
await ctx.output.print("⏭️ **Skipped conversation replay**")
|
|
256
|
+
else:
|
|
257
|
+
await ctx.output.print("📭 **No conversation history to replay**")
|
|
258
|
+
|
|
259
|
+
await ctx.output.print(f"✅ **Session `{session_id}` loaded successfully**")
|
|
260
|
+
|
|
261
|
+
except Exception as e: # noqa: BLE001
|
|
262
|
+
await ctx.output.print(f"❌ **Error loading session:** {e}")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class SaveSessionCommand(NodeCommand):
|
|
266
|
+
"""Save the current ACP session to persistent storage.
|
|
267
|
+
|
|
268
|
+
This will save:
|
|
269
|
+
- Current agent configuration
|
|
270
|
+
- Working directory
|
|
271
|
+
- Session metadata
|
|
272
|
+
|
|
273
|
+
Note: Conversation history is automatically saved if storage is enabled.
|
|
274
|
+
|
|
275
|
+
Options:
|
|
276
|
+
--description "text" Optional description for the session
|
|
277
|
+
|
|
278
|
+
Examples:
|
|
279
|
+
/save-session
|
|
280
|
+
/save-session --description "Working on feature X"
|
|
281
|
+
"""
|
|
282
|
+
|
|
283
|
+
name = "save-session"
|
|
284
|
+
category = "acp"
|
|
285
|
+
|
|
286
|
+
async def execute_command(
|
|
287
|
+
self,
|
|
288
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
289
|
+
*,
|
|
290
|
+
description: str | None = None,
|
|
291
|
+
) -> None:
|
|
292
|
+
"""Save the current ACP session.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
ctx: Command context with ACP session
|
|
296
|
+
description: Optional description for the session
|
|
297
|
+
"""
|
|
298
|
+
session = ctx.context.data
|
|
299
|
+
if not session:
|
|
300
|
+
raise RuntimeError("Session not available in command context")
|
|
301
|
+
|
|
302
|
+
if not session.manager:
|
|
303
|
+
await ctx.output.print("❌ **Session manager not available**")
|
|
304
|
+
return
|
|
305
|
+
|
|
306
|
+
try:
|
|
307
|
+
# Load current session data
|
|
308
|
+
session_data = await session.manager.session_manager.store.load(session.session_id)
|
|
309
|
+
|
|
310
|
+
if session_data:
|
|
311
|
+
# Update metadata if description provided
|
|
312
|
+
if description:
|
|
313
|
+
session_data = session_data.with_metadata(description=description)
|
|
314
|
+
|
|
315
|
+
# Touch to update last_active
|
|
316
|
+
session_data.touch()
|
|
317
|
+
|
|
318
|
+
# Save back
|
|
319
|
+
await session.manager.session_manager.save(session_data)
|
|
320
|
+
|
|
321
|
+
await ctx.output.print(f"💾 **Session `{session.session_id}` saved successfully**")
|
|
322
|
+
if description:
|
|
323
|
+
await ctx.output.print(f"📝 **Description:** {description}")
|
|
324
|
+
else:
|
|
325
|
+
await ctx.output.print(f"⚠️ **Session `{session.session_id}` not found in storage**")
|
|
326
|
+
|
|
327
|
+
except Exception as e: # noqa: BLE001
|
|
328
|
+
await ctx.output.print(f"❌ **Error saving session:** {e}")
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
class DeleteSessionCommand(NodeCommand):
|
|
332
|
+
"""Delete a stored ACP session.
|
|
333
|
+
|
|
334
|
+
This permanently removes the session from storage.
|
|
335
|
+
Use with caution as this action cannot be undone.
|
|
336
|
+
|
|
337
|
+
Options:
|
|
338
|
+
--confirm Skip confirmation prompt
|
|
339
|
+
|
|
340
|
+
Examples:
|
|
341
|
+
/delete-session sess_abc123def456
|
|
342
|
+
/delete-session sess_abc123def456 --confirm
|
|
343
|
+
"""
|
|
344
|
+
|
|
345
|
+
name = "delete-session"
|
|
346
|
+
category = "acp"
|
|
347
|
+
|
|
348
|
+
async def execute_command(
|
|
349
|
+
self,
|
|
350
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
351
|
+
session_id: str,
|
|
352
|
+
*,
|
|
353
|
+
confirm: bool = False,
|
|
354
|
+
) -> None:
|
|
355
|
+
"""Delete a stored ACP session.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
ctx: Command context with ACP session
|
|
359
|
+
session_id: Session identifier to delete
|
|
360
|
+
confirm: Skip confirmation prompt
|
|
361
|
+
"""
|
|
362
|
+
session = ctx.context.data
|
|
363
|
+
if not session:
|
|
364
|
+
raise RuntimeError("Session not available in command context")
|
|
365
|
+
|
|
366
|
+
if not session.manager:
|
|
367
|
+
await ctx.output.print("❌ **Session manager not available**")
|
|
368
|
+
return
|
|
369
|
+
|
|
370
|
+
# Prevent deleting current session
|
|
371
|
+
if session_id == session.session_id:
|
|
372
|
+
await ctx.output.print("❌ **Cannot delete the current active session**")
|
|
373
|
+
return
|
|
374
|
+
|
|
375
|
+
try:
|
|
376
|
+
# Check if session exists
|
|
377
|
+
session_data = await session.manager.session_manager.store.load(session_id)
|
|
378
|
+
|
|
379
|
+
if not session_data:
|
|
380
|
+
await ctx.output.print(f"❌ **Session not found:** `{session_id}`")
|
|
381
|
+
return
|
|
382
|
+
|
|
383
|
+
if not confirm:
|
|
384
|
+
await ctx.output.print(f"⚠️ **About to delete session `{session_id}`**")
|
|
385
|
+
await ctx.output.print(f"📌 **Agent:** `{session_data.agent_name}`")
|
|
386
|
+
await ctx.output.print(
|
|
387
|
+
f"📅 **Last active:** {session_data.last_active.strftime('%Y-%m-%d %H:%M')}"
|
|
388
|
+
)
|
|
389
|
+
await ctx.output.print(
|
|
390
|
+
f"**To confirm, run:** `/delete-session {session_id} --confirm`"
|
|
391
|
+
)
|
|
392
|
+
return
|
|
393
|
+
|
|
394
|
+
# Delete the session
|
|
395
|
+
deleted = await session.manager.session_manager.store.delete(session_id)
|
|
396
|
+
|
|
397
|
+
if deleted:
|
|
398
|
+
await ctx.output.print(f"🗑️ **Session `{session_id}` deleted successfully**")
|
|
399
|
+
else:
|
|
400
|
+
await ctx.output.print(f"⚠️ **Failed to delete session `{session_id}`**")
|
|
401
|
+
|
|
402
|
+
except Exception as e: # noqa: BLE001
|
|
403
|
+
await ctx.output.print(f"❌ **Error deleting session:** {e}")
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
class ListPoolsCommand(NodeCommand):
|
|
407
|
+
"""List available agent pool configurations.
|
|
408
|
+
|
|
409
|
+
Shows:
|
|
410
|
+
- Stored configurations from ConfigStore (name -> path mapping)
|
|
411
|
+
- Currently active pool configuration
|
|
412
|
+
- Available agents in the current pool
|
|
413
|
+
|
|
414
|
+
Examples:
|
|
415
|
+
/list-pools
|
|
416
|
+
"""
|
|
417
|
+
|
|
418
|
+
name = "list-pools"
|
|
419
|
+
category = "acp"
|
|
420
|
+
|
|
421
|
+
async def execute_command(
|
|
422
|
+
self,
|
|
423
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
424
|
+
) -> None:
|
|
425
|
+
"""List available pool configurations.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
ctx: Command context with ACP session
|
|
429
|
+
"""
|
|
430
|
+
from agentpool_cli import agent_store
|
|
431
|
+
|
|
432
|
+
session = ctx.context.data
|
|
433
|
+
if not session:
|
|
434
|
+
raise RuntimeError("Session not available in command context")
|
|
435
|
+
|
|
436
|
+
try:
|
|
437
|
+
output_lines = ["## 🏊 Agent Pool Configurations\n"]
|
|
438
|
+
|
|
439
|
+
# Show current pool info
|
|
440
|
+
output_lines.append("### 📍 Current Pool")
|
|
441
|
+
current_config = (
|
|
442
|
+
session.acp_agent.server.config_path if session.acp_agent.server else None
|
|
443
|
+
)
|
|
444
|
+
if current_config:
|
|
445
|
+
output_lines.append(f"**Config:** `{current_config}`")
|
|
446
|
+
else:
|
|
447
|
+
output_lines.append("**Config:** *(default/built-in)*")
|
|
448
|
+
|
|
449
|
+
# Show agents in current pool
|
|
450
|
+
agent_names = list(session.agent_pool.all_agents.keys())
|
|
451
|
+
output_lines.append(f"**Agents:** {', '.join(f'`{n}`' for n in agent_names)}")
|
|
452
|
+
output_lines.append(f"**Active agent:** `{session.current_agent_name}`")
|
|
453
|
+
output_lines.append("")
|
|
454
|
+
|
|
455
|
+
# Show stored configurations
|
|
456
|
+
output_lines.append("### 💾 Stored Configurations")
|
|
457
|
+
stored_configs = agent_store.list_configs()
|
|
458
|
+
active_config = agent_store.get_active()
|
|
459
|
+
|
|
460
|
+
if not stored_configs:
|
|
461
|
+
output_lines.append("*No stored configurations*")
|
|
462
|
+
output_lines.append("")
|
|
463
|
+
output_lines.append("Use `agentpool add <name> <path>` to add configurations.")
|
|
464
|
+
else:
|
|
465
|
+
# Build markdown table
|
|
466
|
+
output_lines.append("| Name | Path |")
|
|
467
|
+
output_lines.append("|------|------|")
|
|
468
|
+
for name, path in stored_configs:
|
|
469
|
+
is_active = active_config and active_config.name == name
|
|
470
|
+
is_current = current_config and path == current_config
|
|
471
|
+
markers = []
|
|
472
|
+
if is_active:
|
|
473
|
+
markers.append("default")
|
|
474
|
+
if is_current:
|
|
475
|
+
markers.append("current")
|
|
476
|
+
name_col = f"{name} ({', '.join(markers)})" if markers else name
|
|
477
|
+
output_lines.append(f"| {name_col} | `{path}` |")
|
|
478
|
+
|
|
479
|
+
output_lines.append("")
|
|
480
|
+
output_lines.append("*Use `/set-pool <name>` or `/set-pool <path>` to switch pools.*")
|
|
481
|
+
|
|
482
|
+
await ctx.output.print("\n".join(output_lines))
|
|
483
|
+
|
|
484
|
+
except Exception as e: # noqa: BLE001
|
|
485
|
+
await ctx.output.print(f"❌ **Error listing pools:** {e}")
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
class SetPoolCommand(NodeCommand):
|
|
489
|
+
"""Switch to a different agent pool configuration.
|
|
490
|
+
|
|
491
|
+
This command will:
|
|
492
|
+
1. Close all active sessions
|
|
493
|
+
2. Load the new pool configuration
|
|
494
|
+
3. Initialize the new pool with all agents
|
|
495
|
+
|
|
496
|
+
The configuration can be specified as:
|
|
497
|
+
- A stored config name (from `agentpool add`)
|
|
498
|
+
- A direct path to a configuration file
|
|
499
|
+
|
|
500
|
+
Options:
|
|
501
|
+
--agent <name> Specify which agent to use as default
|
|
502
|
+
|
|
503
|
+
Examples:
|
|
504
|
+
/set-pool prod
|
|
505
|
+
/set-pool /path/to/agents.yml
|
|
506
|
+
/set-pool dev --agent=coder
|
|
507
|
+
"""
|
|
508
|
+
|
|
509
|
+
name = "set-pool"
|
|
510
|
+
category = "acp"
|
|
511
|
+
|
|
512
|
+
async def execute_command(
|
|
513
|
+
self,
|
|
514
|
+
ctx: CommandContext[NodeContext[ACPSession]],
|
|
515
|
+
config: str,
|
|
516
|
+
*,
|
|
517
|
+
agent: str | None = None,
|
|
518
|
+
) -> None:
|
|
519
|
+
"""Switch to a different agent pool.
|
|
520
|
+
|
|
521
|
+
Args:
|
|
522
|
+
ctx: Command context with ACP session
|
|
523
|
+
config: Config name (from store) or path to config file
|
|
524
|
+
agent: Optional specific agent to use as default
|
|
525
|
+
"""
|
|
526
|
+
from pathlib import Path
|
|
527
|
+
|
|
528
|
+
from agentpool_cli import agent_store
|
|
529
|
+
|
|
530
|
+
session = ctx.context.data
|
|
531
|
+
if not session:
|
|
532
|
+
raise RuntimeError("Session not available in command context")
|
|
533
|
+
|
|
534
|
+
if not session.acp_agent.server:
|
|
535
|
+
await ctx.output.print("❌ **Server reference not available - cannot switch pools**")
|
|
536
|
+
return
|
|
537
|
+
|
|
538
|
+
try:
|
|
539
|
+
# Resolve config path
|
|
540
|
+
config_path: str | None = None
|
|
541
|
+
config_name: str | None = None
|
|
542
|
+
|
|
543
|
+
# First try as stored config name
|
|
544
|
+
try:
|
|
545
|
+
config_path = agent_store.get_config(config)
|
|
546
|
+
config_name = config
|
|
547
|
+
except KeyError:
|
|
548
|
+
# Not a stored config, try as direct path
|
|
549
|
+
path = Path(config)
|
|
550
|
+
if path.exists() and path.is_file():
|
|
551
|
+
config_path = str(path.resolve())
|
|
552
|
+
else:
|
|
553
|
+
await ctx.output.print(f"❌ **Config not found:** `{config}`")
|
|
554
|
+
await ctx.output.print("Provide a stored config name or a valid file path.")
|
|
555
|
+
return
|
|
556
|
+
|
|
557
|
+
# Show what we're doing
|
|
558
|
+
if config_name:
|
|
559
|
+
await ctx.output.print(f"🔄 **Switching pool to `{config_name}`...**")
|
|
560
|
+
else:
|
|
561
|
+
await ctx.output.print(f"🔄 **Switching pool to `{config_path}`...**")
|
|
562
|
+
|
|
563
|
+
# Perform the swap
|
|
564
|
+
agent_names = await session.acp_agent.swap_pool(config_path, agent)
|
|
565
|
+
|
|
566
|
+
# Report success
|
|
567
|
+
await ctx.output.print("✅ **Pool switched successfully**")
|
|
568
|
+
await ctx.output.print(f"**Agents:** {', '.join(f'`{n}`' for n in agent_names)}")
|
|
569
|
+
if agent:
|
|
570
|
+
await ctx.output.print(f"**Default agent:** `{agent}`")
|
|
571
|
+
else:
|
|
572
|
+
await ctx.output.print(f"**Default agent:** `{agent_names[0]}`")
|
|
573
|
+
|
|
574
|
+
await ctx.output.print("")
|
|
575
|
+
await ctx.output.print("*Note: A new session will be created on your next message.*")
|
|
576
|
+
|
|
577
|
+
except FileNotFoundError as e:
|
|
578
|
+
await ctx.output.print(f"❌ **Config file not found:** {e}")
|
|
579
|
+
except ValueError as e:
|
|
580
|
+
await ctx.output.print(f"❌ **Invalid configuration:** {e}")
|
|
581
|
+
except Exception as e: # noqa: BLE001
|
|
582
|
+
await ctx.output.print(f"❌ **Error switching pool:** {e}")
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
def get_acp_commands() -> list[type[NodeCommand]]:
|
|
586
|
+
"""Get all ACP-specific slash commands."""
|
|
587
|
+
return [
|
|
588
|
+
ListSessionsCommand,
|
|
589
|
+
LoadSessionCommand,
|
|
590
|
+
SaveSessionCommand,
|
|
591
|
+
DeleteSessionCommand,
|
|
592
|
+
ListPoolsCommand,
|
|
593
|
+
SetPoolCommand,
|
|
594
|
+
]
|