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,175 @@
|
|
|
1
|
+
"""Agent connection management commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from rich.tree import Tree
|
|
8
|
+
from slashed import CommandContext, CommandError # noqa: TC002
|
|
9
|
+
from slashed.completers import CallbackCompleter
|
|
10
|
+
|
|
11
|
+
from agentpool.log import get_logger
|
|
12
|
+
from agentpool.messaging import MessageNode
|
|
13
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
14
|
+
from agentpool_commands.base import NodeCommand
|
|
15
|
+
from agentpool_commands.completers import get_available_nodes
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def format_node_name(node: MessageNode[Any, Any], current: bool = False) -> str:
|
|
22
|
+
"""Format node name for display."""
|
|
23
|
+
name = node.name
|
|
24
|
+
if current:
|
|
25
|
+
return f"โบ {name} (current)"
|
|
26
|
+
if node.connections.get_targets():
|
|
27
|
+
return f"โ {name}"
|
|
28
|
+
return f"โ {name}"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ConnectCommand(NodeCommand):
|
|
32
|
+
"""Connect the current node to another node.
|
|
33
|
+
|
|
34
|
+
Messages will be forwarded to the target node.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
/connect node2 # Forward to node, wait for responses
|
|
38
|
+
/connect node2 --no-wait # Forward without waiting
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
name = "connect"
|
|
42
|
+
category = "nodes"
|
|
43
|
+
|
|
44
|
+
async def execute_command(
|
|
45
|
+
self,
|
|
46
|
+
ctx: CommandContext[NodeContext],
|
|
47
|
+
node_name: str,
|
|
48
|
+
*,
|
|
49
|
+
wait: bool = True,
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Connect to another node.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
ctx: Command context
|
|
55
|
+
node_name: Name of the node to connect to
|
|
56
|
+
wait: Whether to wait for responses (default: True)
|
|
57
|
+
"""
|
|
58
|
+
try:
|
|
59
|
+
assert ctx.context.pool
|
|
60
|
+
target_node = ctx.context.pool[node_name]
|
|
61
|
+
assert isinstance(target_node, MessageNode)
|
|
62
|
+
ctx.context.node.connect_to(target_node)
|
|
63
|
+
ctx.context.node.connections.set_wait_state(node_name, wait)
|
|
64
|
+
text = "*(waiting for responses)*" if wait else "*(async)*"
|
|
65
|
+
msg = f"๐ **Connected:** `{ctx.context.node_name}` โ `{node_name}` {text}"
|
|
66
|
+
await ctx.print(msg)
|
|
67
|
+
except Exception as e:
|
|
68
|
+
msg = f"Failed to connect {ctx.context.node_name!r} to {node_name!r}: {e}"
|
|
69
|
+
raise CommandError(msg) from e
|
|
70
|
+
|
|
71
|
+
def get_completer(self) -> CallbackCompleter:
|
|
72
|
+
"""Get completer for node names."""
|
|
73
|
+
return CallbackCompleter(get_available_nodes)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class DisconnectCommand(NodeCommand):
|
|
77
|
+
"""Disconnect the current node from a target node.
|
|
78
|
+
|
|
79
|
+
Stops forwarding messages to the specified node.
|
|
80
|
+
|
|
81
|
+
Example: /disconnect node2
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
name = "disconnect"
|
|
85
|
+
category = "nodes"
|
|
86
|
+
|
|
87
|
+
async def execute_command(
|
|
88
|
+
self,
|
|
89
|
+
ctx: CommandContext[NodeContext],
|
|
90
|
+
node_name: str,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Disconnect from another node.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
ctx: Command context
|
|
96
|
+
node_name: Name of the node to disconnect from
|
|
97
|
+
"""
|
|
98
|
+
source = ctx.context.node_name
|
|
99
|
+
try:
|
|
100
|
+
assert ctx.context.pool
|
|
101
|
+
target_node = ctx.context.pool[node_name]
|
|
102
|
+
assert isinstance(target_node, MessageNode)
|
|
103
|
+
ctx.context.node.connections.disconnect(target_node)
|
|
104
|
+
await ctx.print(f"๐ **Disconnected:** `{source}` โ `{node_name}`")
|
|
105
|
+
except Exception as e:
|
|
106
|
+
msg = f"{source!r} failed to disconnect from {node_name!r}: {e}"
|
|
107
|
+
raise CommandError(msg) from e
|
|
108
|
+
|
|
109
|
+
def get_completer(self) -> CallbackCompleter:
|
|
110
|
+
"""Get completer for node names."""
|
|
111
|
+
return CallbackCompleter(get_available_nodes)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class DisconnectAllCommand(NodeCommand):
|
|
115
|
+
"""Disconnect from all nodes.
|
|
116
|
+
|
|
117
|
+
Remove all node connections.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
name = "disconnect-all"
|
|
121
|
+
category = "nodes"
|
|
122
|
+
|
|
123
|
+
async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
|
|
124
|
+
"""Disconnect from all nodes.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
ctx: Command context
|
|
128
|
+
"""
|
|
129
|
+
if not ctx.context.node.connections.get_targets():
|
|
130
|
+
await ctx.print("โน๏ธ **No active connections**") # noqa: RUF001
|
|
131
|
+
return
|
|
132
|
+
source = ctx.context.node_name
|
|
133
|
+
await ctx.context.node.disconnect_all()
|
|
134
|
+
await ctx.print(f"๐ **Disconnected** `{source}` from all nodes")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class ListConnectionsCommand(NodeCommand):
|
|
138
|
+
"""Show current node connections and their status.
|
|
139
|
+
|
|
140
|
+
Displays:
|
|
141
|
+
- Connected nodes
|
|
142
|
+
- Wait settings
|
|
143
|
+
- Message flow direction
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
name = "connections"
|
|
147
|
+
category = "nodes"
|
|
148
|
+
|
|
149
|
+
async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
|
|
150
|
+
"""List current connections.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
ctx: Command context
|
|
154
|
+
"""
|
|
155
|
+
if not ctx.context.node.connections.get_targets():
|
|
156
|
+
await ctx.print("โน๏ธ **No active connections**") # noqa: RUF001
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
# Create tree visualization
|
|
160
|
+
tree = Tree(format_node_name(ctx.context.node, current=True))
|
|
161
|
+
|
|
162
|
+
# Use session's get_connections() for info
|
|
163
|
+
for node in ctx.context.node.connections.get_targets():
|
|
164
|
+
assert ctx.context.pool
|
|
165
|
+
name = format_node_name(ctx.context.pool[node.name])
|
|
166
|
+
_branch = tree.add(name)
|
|
167
|
+
|
|
168
|
+
# Create string representation
|
|
169
|
+
from rich.console import Console
|
|
170
|
+
|
|
171
|
+
console = Console()
|
|
172
|
+
with console.capture() as capture:
|
|
173
|
+
console.print(tree)
|
|
174
|
+
tree_str = capture.get()
|
|
175
|
+
await ctx.print(f"\n## ๐ณ Connection Tree\n\n```\n{tree_str}\n```")
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Markdown formatting utilities for command output."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def format_table(headers: list[str], rows: list[dict[str, Any]]) -> str:
|
|
9
|
+
"""Format data as a markdown table.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
headers: Column headers
|
|
13
|
+
rows: List of dicts with keys matching headers
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
Markdown table string
|
|
17
|
+
"""
|
|
18
|
+
if not rows:
|
|
19
|
+
return ""
|
|
20
|
+
|
|
21
|
+
# Create header row
|
|
22
|
+
header_row = "| " + " | ".join(headers) + " |"
|
|
23
|
+
separator_row = "|" + "|".join("---" for _ in headers) + "|"
|
|
24
|
+
|
|
25
|
+
# Create data rows
|
|
26
|
+
data_rows = []
|
|
27
|
+
for row in rows:
|
|
28
|
+
values = [str(row.get(header, "")) for header in headers]
|
|
29
|
+
data_rows.append("| " + " | ".join(values) + " |")
|
|
30
|
+
|
|
31
|
+
return "\n".join([header_row, separator_row, *data_rows])
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Model-related commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from slashed import CommandContext # noqa: TC002
|
|
8
|
+
from slashed.completers import CallbackCompleter
|
|
9
|
+
|
|
10
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
11
|
+
from agentpool_commands.base import NodeCommand
|
|
12
|
+
from agentpool_commands.completers import get_model_names
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from agentpool.messaging import MessageNode
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SetModelCommand(NodeCommand):
|
|
20
|
+
"""Change the language model for the current conversation.
|
|
21
|
+
|
|
22
|
+
The model change takes effect immediately for all following messages.
|
|
23
|
+
Previous messages and their context are preserved.
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
/set-model gpt-5
|
|
27
|
+
/set-model openai:gpt-5-mini
|
|
28
|
+
/set-model claude-2
|
|
29
|
+
|
|
30
|
+
Note: Available models depend on your configuration and API access.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
name = "set-model"
|
|
34
|
+
category = "model"
|
|
35
|
+
|
|
36
|
+
async def execute_command(
|
|
37
|
+
self,
|
|
38
|
+
ctx: CommandContext[AgentContext],
|
|
39
|
+
model: str,
|
|
40
|
+
) -> None:
|
|
41
|
+
"""Change the model for the current conversation.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
ctx: Command context
|
|
45
|
+
model: Model name to switch to
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
# Create new session with model override
|
|
49
|
+
ctx.context.native_agent.set_model(model)
|
|
50
|
+
await ctx.print(f"โ
**Model changed to:** `{model}`")
|
|
51
|
+
except Exception as e: # noqa: BLE001
|
|
52
|
+
await ctx.print(f"โ **Failed to change model:** {e}")
|
|
53
|
+
|
|
54
|
+
def get_completer(self) -> CallbackCompleter:
|
|
55
|
+
"""Get completer for model names."""
|
|
56
|
+
return CallbackCompleter(get_model_names)
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def supports_node(cls, node: MessageNode[Any, Any]) -> bool:
|
|
60
|
+
from agentpool import Agent
|
|
61
|
+
|
|
62
|
+
return isinstance(node, Agent)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Prompt slash commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from slashed import CommandContext, CommandError # noqa: TC002
|
|
6
|
+
|
|
7
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
8
|
+
from agentpool_commands.base import NodeCommand
|
|
9
|
+
from agentpool_commands.completers import PromptCompleter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ShowPromptCommand(NodeCommand):
|
|
13
|
+
"""Show prompts from configured prompt hubs.
|
|
14
|
+
|
|
15
|
+
Usage examples:
|
|
16
|
+
/prompt role.reviewer # Use builtin prompt
|
|
17
|
+
/prompt langfuse:explain@v2 # Use specific version
|
|
18
|
+
/prompt some_prompt[var=value] # With variables
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
name = "prompt"
|
|
22
|
+
category = "prompts"
|
|
23
|
+
|
|
24
|
+
async def execute_command(self, ctx: CommandContext[NodeContext], identifier: str) -> None:
|
|
25
|
+
"""Show prompt content.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
ctx: Command context
|
|
29
|
+
identifier: Prompt identifier ([provider:]name[@version][?var=val])
|
|
30
|
+
"""
|
|
31
|
+
try:
|
|
32
|
+
prompt = await ctx.context.prompt_manager.get(identifier)
|
|
33
|
+
await ctx.print(f"## ๐ Prompt Content\n\n```\n{prompt}\n```")
|
|
34
|
+
except Exception as e:
|
|
35
|
+
msg = f"Error getting prompt: {e}"
|
|
36
|
+
raise CommandError(msg) from e
|
|
37
|
+
|
|
38
|
+
def get_completer(self) -> PromptCompleter:
|
|
39
|
+
"""Get completer for prompt names."""
|
|
40
|
+
return PromptCompleter()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ListPromptsCommand(NodeCommand):
|
|
44
|
+
"""List available prompts from all providers.
|
|
45
|
+
|
|
46
|
+
Show all prompts available in the current configuration.
|
|
47
|
+
Each prompt is shown with its name and description.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
name = "list-prompts"
|
|
51
|
+
category = "prompts"
|
|
52
|
+
|
|
53
|
+
async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
|
|
54
|
+
"""List available prompts from all providers.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
ctx: Command context
|
|
58
|
+
"""
|
|
59
|
+
prompts = await ctx.context.prompt_manager.list_prompts()
|
|
60
|
+
output_lines = ["\n## ๐ Available Prompts\n"]
|
|
61
|
+
|
|
62
|
+
for provider, provider_prompts in prompts.items():
|
|
63
|
+
if not provider_prompts:
|
|
64
|
+
continue
|
|
65
|
+
|
|
66
|
+
output_lines.append(f"\n### {provider.title()}\n")
|
|
67
|
+
sorted_prompts = sorted(provider_prompts)
|
|
68
|
+
|
|
69
|
+
# For builtin prompts we can show their description
|
|
70
|
+
if provider == "builtin":
|
|
71
|
+
for prompt_name in sorted_prompts:
|
|
72
|
+
prompt = ctx.context.definition.prompts.system_prompts[prompt_name]
|
|
73
|
+
desc = f" - *{prompt.category}*" if prompt.category else ""
|
|
74
|
+
output_lines.append(f"- **{prompt_name}**{desc}")
|
|
75
|
+
else:
|
|
76
|
+
# For other providers, just show names
|
|
77
|
+
output_lines.extend(f"- `{prompt_name}`" for prompt_name in sorted_prompts)
|
|
78
|
+
await ctx.print("\n".join(output_lines))
|
|
File without changes
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Command for reading file content into conversations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from slashed import CommandContext, CommandError # noqa: TC002
|
|
8
|
+
from slashed.completers import PathCompleter
|
|
9
|
+
|
|
10
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
11
|
+
from agentpool.log import get_logger
|
|
12
|
+
from agentpool_commands.base import NodeCommand
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from agentpool.messaging import MessageNode
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ReadCommand(NodeCommand):
|
|
22
|
+
"""Read content from files or URLs into the conversation.
|
|
23
|
+
|
|
24
|
+
By default reads raw content, but can convert supported formats to markdown
|
|
25
|
+
with the --convert-to-md flag.
|
|
26
|
+
|
|
27
|
+
Supported formats for conversion:
|
|
28
|
+
- PDF documents
|
|
29
|
+
- Office files (Word, Excel, PowerPoint)
|
|
30
|
+
- Images (with metadata)
|
|
31
|
+
- Audio files (metadata)
|
|
32
|
+
- HTML pages
|
|
33
|
+
- Text formats (CSV, JSON, XML)
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
/read document.txt # Read raw text
|
|
37
|
+
/read document.pdf --convert-to-md # Convert PDF to markdown
|
|
38
|
+
/read https://example.com/doc.docx --convert-to-md
|
|
39
|
+
/read presentation.pptx --convert-to-md
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
name = "read"
|
|
43
|
+
category = "content"
|
|
44
|
+
|
|
45
|
+
async def execute_command(
|
|
46
|
+
self,
|
|
47
|
+
ctx: CommandContext[AgentContext],
|
|
48
|
+
path: str,
|
|
49
|
+
*,
|
|
50
|
+
convert_to_md: bool = False,
|
|
51
|
+
) -> None:
|
|
52
|
+
"""Read file content into conversation.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
ctx: Command context
|
|
56
|
+
path: Path or URL to read
|
|
57
|
+
convert_to_md: Whether to convert to markdown format
|
|
58
|
+
"""
|
|
59
|
+
try:
|
|
60
|
+
agent = ctx.context.agent
|
|
61
|
+
await agent.conversation.add_context_from_path(path, convert_to_md=convert_to_md)
|
|
62
|
+
await ctx.print(f"๐ **Added content from** {path!r} **to next message as context**")
|
|
63
|
+
except Exception as e:
|
|
64
|
+
msg = f"Unexpected error reading {path}: {e}"
|
|
65
|
+
logger.exception(msg)
|
|
66
|
+
raise CommandError(msg) from e
|
|
67
|
+
|
|
68
|
+
@classmethod
|
|
69
|
+
def supports_node(cls, node: MessageNode[Any, Any]) -> bool:
|
|
70
|
+
"""Only available for Agent nodes."""
|
|
71
|
+
from agentpool import Agent
|
|
72
|
+
|
|
73
|
+
return isinstance(node, Agent)
|
|
74
|
+
|
|
75
|
+
def get_completer(self) -> PathCompleter:
|
|
76
|
+
"""Get completer for file paths."""
|
|
77
|
+
return PathCompleter()
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""Resource management commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from slashed import CommandContext, CommandError # noqa: TC002
|
|
6
|
+
|
|
7
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
8
|
+
from agentpool.log import get_logger
|
|
9
|
+
from agentpool.messaging.context import NodeContext # noqa: TC001
|
|
10
|
+
from agentpool_commands.base import AgentCommand, NodeCommand
|
|
11
|
+
from agentpool_commands.markdown_utils import format_table
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
logger = get_logger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ListResourcesCommand(NodeCommand):
|
|
18
|
+
"""Display all resources available to the agent.
|
|
19
|
+
|
|
20
|
+
Shows:
|
|
21
|
+
- Resource names and descriptions
|
|
22
|
+
- Resource types and URIs
|
|
23
|
+
- Whether parameters are supported
|
|
24
|
+
- MIME types
|
|
25
|
+
|
|
26
|
+
Resource types can be:
|
|
27
|
+
- path: Files or URLs
|
|
28
|
+
- text: Raw text content
|
|
29
|
+
- cli: Command line tools
|
|
30
|
+
- source: Python source code
|
|
31
|
+
- callable: Python functions
|
|
32
|
+
- image: Image files
|
|
33
|
+
|
|
34
|
+
Use /show-resource for detailed information about specific resources.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
name = "list-resources"
|
|
38
|
+
category = "resources"
|
|
39
|
+
|
|
40
|
+
async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
|
|
41
|
+
"""List available resources.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
ctx: Command context
|
|
45
|
+
"""
|
|
46
|
+
try:
|
|
47
|
+
fs = ctx.context.definition.vfs_registry.get_fs()
|
|
48
|
+
root = await fs._ls("/", detail=True)
|
|
49
|
+
|
|
50
|
+
rows = []
|
|
51
|
+
for entry in root:
|
|
52
|
+
protocol = entry["name"].removesuffix("://")
|
|
53
|
+
info = await fs._info(f"{protocol}://")
|
|
54
|
+
|
|
55
|
+
rows.append({
|
|
56
|
+
"Resource": protocol,
|
|
57
|
+
"Type": info.get("type", "unknown"),
|
|
58
|
+
"URI": info.get("uri", ""),
|
|
59
|
+
"Description": info.get("description", ""),
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
headers = ["Resource", "Type", "URI", "Description"]
|
|
63
|
+
table = format_table(headers, rows)
|
|
64
|
+
await ctx.print(f"## ๐ Available Resources\n\n{table}")
|
|
65
|
+
except Exception as e: # noqa: BLE001
|
|
66
|
+
await ctx.print(f"โ **Failed to list resources:** {e}")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ShowResourceCommand(NodeCommand):
|
|
70
|
+
"""Display detailed information and content of a specific resource.
|
|
71
|
+
|
|
72
|
+
Shows:
|
|
73
|
+
- Resource metadata (type, URI, description)
|
|
74
|
+
- MIME type information
|
|
75
|
+
- Parameter support status
|
|
76
|
+
- Resource content (if loadable)
|
|
77
|
+
|
|
78
|
+
For resources that support parameters:
|
|
79
|
+
- Pass parameters as --param arguments
|
|
80
|
+
- Parameters are passed to resource loader
|
|
81
|
+
|
|
82
|
+
Examples:
|
|
83
|
+
/show-resource config.yml # Show configuration file
|
|
84
|
+
/show-resource template --date today # Template with parameters
|
|
85
|
+
/show-resource image.png # Show image details
|
|
86
|
+
/show-resource api --key value # API with parameters
|
|
87
|
+
|
|
88
|
+
Note: Some resources might require parameters to be viewed.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
name = "show-resource"
|
|
92
|
+
category = "resources"
|
|
93
|
+
|
|
94
|
+
async def execute_command(
|
|
95
|
+
self,
|
|
96
|
+
ctx: CommandContext[NodeContext],
|
|
97
|
+
name: str,
|
|
98
|
+
**kwargs: str,
|
|
99
|
+
) -> None:
|
|
100
|
+
"""Show details or content of a resource.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
ctx: Command context
|
|
104
|
+
name: Resource name to show
|
|
105
|
+
**kwargs: Additional parameters for the resource
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
fs = ctx.context.definition.vfs_registry.get_fs()
|
|
109
|
+
|
|
110
|
+
# Get resource info
|
|
111
|
+
try:
|
|
112
|
+
info = await fs._info(f"{name}://")
|
|
113
|
+
except Exception as e: # noqa: BLE001
|
|
114
|
+
await ctx.print(f"โ **Resource** `{name}` **not found:** {e}")
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
sections = [f"## ๐ Resource: {name}\n"]
|
|
118
|
+
if typ := info.get("type"):
|
|
119
|
+
sections.append(f"**Type:** `{typ}`")
|
|
120
|
+
if uri := info.get("uri"):
|
|
121
|
+
sections.append(f"**URI:** `{uri}`")
|
|
122
|
+
if desc := info.get("description"):
|
|
123
|
+
sections.append(f"Description: {desc}")
|
|
124
|
+
if mime := info.get("mime_type"):
|
|
125
|
+
sections.append(f"MIME Type: {mime}")
|
|
126
|
+
|
|
127
|
+
# Try to list contents
|
|
128
|
+
try:
|
|
129
|
+
listing = await fs._ls(f"{name}://", detail=False)
|
|
130
|
+
if listing:
|
|
131
|
+
sections.extend(["\n# Contents:", "```", *listing, "```"])
|
|
132
|
+
except Exception as e: # noqa: BLE001
|
|
133
|
+
sections.append(f"\nFailed to list contents: {e}")
|
|
134
|
+
|
|
135
|
+
await ctx.print("\n".join(sections))
|
|
136
|
+
except Exception as e: # noqa: BLE001
|
|
137
|
+
await ctx.print(f"โ **Error accessing resource:** {e}")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class AddResourceCommand(AgentCommand):
|
|
141
|
+
"""Add content from a resource to the next message.
|
|
142
|
+
|
|
143
|
+
Parameters are passed to the resource loader if supported.
|
|
144
|
+
|
|
145
|
+
Examples:
|
|
146
|
+
/add-resource config.yml
|
|
147
|
+
/add-resource template --date today
|
|
148
|
+
/add-resource api_data --key value
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
name = "add-resource"
|
|
152
|
+
category = "resources"
|
|
153
|
+
|
|
154
|
+
async def execute_command(
|
|
155
|
+
self,
|
|
156
|
+
ctx: CommandContext[AgentContext],
|
|
157
|
+
resource_path: str,
|
|
158
|
+
*,
|
|
159
|
+
pattern: str | None = None,
|
|
160
|
+
**kwargs: str,
|
|
161
|
+
) -> None:
|
|
162
|
+
"""Add resource content as context for the next message.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
ctx: Command context
|
|
166
|
+
resource_path: Resource name or resource/path
|
|
167
|
+
pattern: Pattern for filtering files
|
|
168
|
+
**kwargs: Additional parameters for the resource
|
|
169
|
+
"""
|
|
170
|
+
try:
|
|
171
|
+
# Parse resource name and path
|
|
172
|
+
parts = resource_path.split("/", 1)
|
|
173
|
+
resource_name = parts[0]
|
|
174
|
+
path = parts[1] if len(parts) > 1 else ""
|
|
175
|
+
|
|
176
|
+
registry = ctx.context.definition.vfs_registry
|
|
177
|
+
|
|
178
|
+
if path:
|
|
179
|
+
if "*" in path:
|
|
180
|
+
# It's a pattern - use query
|
|
181
|
+
files = await registry.query(resource_name, pattern=path)
|
|
182
|
+
for file in files:
|
|
183
|
+
content = await registry.get_content(resource_name, file)
|
|
184
|
+
ctx.context.agent.conversation.add_context_message(
|
|
185
|
+
content, source=f"{resource_name}/{file}", **kwargs
|
|
186
|
+
)
|
|
187
|
+
msg = f"Added {len(files)} files from {resource_name!r} matching {path!r}"
|
|
188
|
+
else:
|
|
189
|
+
# Specific file
|
|
190
|
+
content = await registry.get_content(resource_name, path)
|
|
191
|
+
ctx.context.agent.conversation.add_context_message(
|
|
192
|
+
content, source=f"{resource_name}/{path}", **kwargs
|
|
193
|
+
)
|
|
194
|
+
msg = f"Added '{resource_name}/{path}' to context"
|
|
195
|
+
else:
|
|
196
|
+
# Add all content from resource root
|
|
197
|
+
files = await registry.query(resource_name, pattern=pattern or "**/*")
|
|
198
|
+
for file in files:
|
|
199
|
+
content = await registry.get_content(resource_name, file)
|
|
200
|
+
ctx.context.agent.conversation.add_context_message(
|
|
201
|
+
content, source=f"{resource_name}/{file}", **kwargs
|
|
202
|
+
)
|
|
203
|
+
msg = f"โ
**Added {len(files)} files from** `{resource_name}`"
|
|
204
|
+
|
|
205
|
+
await ctx.print(msg)
|
|
206
|
+
|
|
207
|
+
except Exception as e:
|
|
208
|
+
msg = f"Error loading resource: {e}"
|
|
209
|
+
logger.exception(msg)
|
|
210
|
+
raise CommandError(msg) from e
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Agent session slash commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from slashed import CommandContext # noqa: TC002
|
|
6
|
+
|
|
7
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
8
|
+
from agentpool_commands.base import AgentCommand
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ClearCommand(AgentCommand):
|
|
12
|
+
"""Clear the current chat session history.
|
|
13
|
+
|
|
14
|
+
This removes all previous messages but keeps tools and settings.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
name = "clear"
|
|
18
|
+
category = "session"
|
|
19
|
+
|
|
20
|
+
async def execute_command(self, ctx: CommandContext[AgentContext]) -> None:
|
|
21
|
+
"""Clear chat history.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
ctx: Command context
|
|
25
|
+
"""
|
|
26
|
+
ctx.context.agent.conversation.clear()
|
|
27
|
+
await ctx.print("๐งน **Chat history cleared**")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ResetCommand(AgentCommand):
|
|
31
|
+
"""Reset the entire session state.
|
|
32
|
+
|
|
33
|
+
- Clears chat history
|
|
34
|
+
- Restores default tool settings
|
|
35
|
+
- Resets any session-specific configurations
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
name = "reset"
|
|
39
|
+
category = "session"
|
|
40
|
+
|
|
41
|
+
async def execute_command(self, ctx: CommandContext[AgentContext]) -> None:
|
|
42
|
+
"""Reset session state.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
ctx: Command context
|
|
46
|
+
"""
|
|
47
|
+
await ctx.context.native_agent.reset()
|
|
48
|
+
await ctx.print("๐ **Session state reset** - history cleared, tools and settings restored")
|