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
agentpool_cli/agent.py
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""Agent-related CLI commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shutil
|
|
6
|
+
from typing import Annotated
|
|
7
|
+
|
|
8
|
+
import typer as t
|
|
9
|
+
|
|
10
|
+
from agentpool_cli import agent_store, resolve_agent_config
|
|
11
|
+
from agentpool_cli.common import verbose_opt
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
agent_cli = t.Typer(help="Agent management commands", no_args_is_help=True)
|
|
15
|
+
|
|
16
|
+
NAME_HELP = "Name for the configuration (defaults to filename)"
|
|
17
|
+
|
|
18
|
+
INTERACTIVE_CMD = "--interactive/--no-interactive"
|
|
19
|
+
INTERACTIVE_HELP = "Use interactive configuration wizard"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@agent_cli.command("init")
|
|
23
|
+
def init_agent_config(
|
|
24
|
+
output: Annotated[str, t.Argument(help="Path to write agent configuration file")],
|
|
25
|
+
name: Annotated[str | None, t.Option("--name", "-n", help=NAME_HELP)] = None,
|
|
26
|
+
interactive: Annotated[bool, t.Option(INTERACTIVE_CMD, help=INTERACTIVE_HELP)] = False,
|
|
27
|
+
) -> None:
|
|
28
|
+
"""Initialize a new agent configuration file.
|
|
29
|
+
|
|
30
|
+
Creates and activates a new agent configuration. The configuration will be
|
|
31
|
+
automatically registered and set as active.
|
|
32
|
+
"""
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
if interactive:
|
|
36
|
+
from agentpool.utils.inspection import validate_import
|
|
37
|
+
|
|
38
|
+
validate_import("promptantic", "chat")
|
|
39
|
+
from promptantic import ModelGenerator
|
|
40
|
+
|
|
41
|
+
from agentpool import AgentsManifest
|
|
42
|
+
|
|
43
|
+
generator = ModelGenerator()
|
|
44
|
+
manifest = generator.populate(AgentsManifest)
|
|
45
|
+
manifest.save(output)
|
|
46
|
+
else:
|
|
47
|
+
from agentpool import config_resources
|
|
48
|
+
|
|
49
|
+
shutil.copy2(config_resources.AGENTS_TEMPLATE, output)
|
|
50
|
+
|
|
51
|
+
config_name = name or Path(output).stem
|
|
52
|
+
agent_store.add_config(config_name, output)
|
|
53
|
+
agent_store.set_active(config_name)
|
|
54
|
+
|
|
55
|
+
print(f"\nCreated and activated agent configuration {config_name!r}: {output}")
|
|
56
|
+
print("\nTry these commands:")
|
|
57
|
+
print(" agentpool list")
|
|
58
|
+
print(" agentpool chat simple_agent")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@agent_cli.command("add")
|
|
62
|
+
def add_agent_file(
|
|
63
|
+
name: Annotated[str, t.Argument(help="Name for the agent configuration file")],
|
|
64
|
+
path: Annotated[str, t.Argument(help="Path to agent configuration file")],
|
|
65
|
+
verbose: bool = verbose_opt,
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Add a new agent configuration file."""
|
|
68
|
+
try:
|
|
69
|
+
agent_store.add_config(name, path)
|
|
70
|
+
t.echo(f"Added agent configuration {name!r} -> {path}")
|
|
71
|
+
except Exception as e:
|
|
72
|
+
t.echo(f"Error adding configuration: {e}", err=True)
|
|
73
|
+
raise t.Exit(1) from e
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@agent_cli.command("set")
|
|
77
|
+
def set_active_file(
|
|
78
|
+
name: Annotated[str, t.Argument(help="Name of agent configuration to set as active")],
|
|
79
|
+
verbose: bool = verbose_opt,
|
|
80
|
+
) -> None:
|
|
81
|
+
"""Set the active agent configuration file."""
|
|
82
|
+
try:
|
|
83
|
+
agent_store.set_active(name)
|
|
84
|
+
t.echo(f"Set {name!r} as active agent configuration")
|
|
85
|
+
except Exception as e:
|
|
86
|
+
t.echo(f"Error setting active configuration: {e}", err=True)
|
|
87
|
+
raise t.Exit(1) from e
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def list_configs() -> None:
|
|
91
|
+
"""List stored agent configurations."""
|
|
92
|
+
from rich.console import Console
|
|
93
|
+
from rich.table import Table
|
|
94
|
+
|
|
95
|
+
configs = agent_store.list_configs()
|
|
96
|
+
active = agent_store.get_active()
|
|
97
|
+
active_name = active.name if active else None
|
|
98
|
+
|
|
99
|
+
if not configs:
|
|
100
|
+
t.echo("No configurations stored. Use 'agentpool add' to add one.")
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
table = Table(title="Stored Configurations")
|
|
104
|
+
table.add_column("Name", style="cyan")
|
|
105
|
+
table.add_column("Path")
|
|
106
|
+
table.add_column("Active", justify="center")
|
|
107
|
+
|
|
108
|
+
for name, path in configs:
|
|
109
|
+
marker = "✓" if name == active_name else ""
|
|
110
|
+
table.add_row(name, path, marker)
|
|
111
|
+
|
|
112
|
+
Console().print(table)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def list_agents(
|
|
116
|
+
config_name: Annotated[
|
|
117
|
+
str | None,
|
|
118
|
+
t.Option(
|
|
119
|
+
"-c",
|
|
120
|
+
"--config",
|
|
121
|
+
help="Name of agent configuration to list (defaults to active)",
|
|
122
|
+
),
|
|
123
|
+
] = None,
|
|
124
|
+
verbose: bool = verbose_opt,
|
|
125
|
+
) -> None:
|
|
126
|
+
"""List agents from the active (or specified) configuration."""
|
|
127
|
+
import yaml
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
try:
|
|
131
|
+
config_path = resolve_agent_config(config_name)
|
|
132
|
+
except ValueError as e:
|
|
133
|
+
msg = str(e)
|
|
134
|
+
raise t.BadParameter(msg) from e
|
|
135
|
+
|
|
136
|
+
# Parse YAML directly without loading full manifest
|
|
137
|
+
from upathtools import to_upath
|
|
138
|
+
|
|
139
|
+
text = to_upath(config_path).read_text()
|
|
140
|
+
data = yaml.safe_load(text)
|
|
141
|
+
|
|
142
|
+
agents = data.get("agents", {})
|
|
143
|
+
if not agents:
|
|
144
|
+
t.echo("No agents found in configuration.")
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
from rich.console import Console
|
|
148
|
+
from rich.table import Table
|
|
149
|
+
|
|
150
|
+
table = Table(title="Agents")
|
|
151
|
+
table.add_column("Name", style="cyan")
|
|
152
|
+
table.add_column("Type", style="magenta")
|
|
153
|
+
table.add_column("Display Name")
|
|
154
|
+
table.add_column("Description")
|
|
155
|
+
|
|
156
|
+
for name, config in agents.items():
|
|
157
|
+
agent_type = config.get("type", "native")
|
|
158
|
+
display = config.get("display_name", name)
|
|
159
|
+
desc = config.get("description", "")
|
|
160
|
+
# Truncate long descriptions
|
|
161
|
+
if len(desc) > 50: # noqa: PLR2004
|
|
162
|
+
desc = desc[:47] + "..."
|
|
163
|
+
table.add_row(name, agent_type, display, desc)
|
|
164
|
+
|
|
165
|
+
Console().print(table)
|
|
166
|
+
|
|
167
|
+
except t.Exit:
|
|
168
|
+
raise
|
|
169
|
+
except Exception as e:
|
|
170
|
+
t.echo(f"Error: {e}", err=True)
|
|
171
|
+
if verbose:
|
|
172
|
+
import traceback
|
|
173
|
+
|
|
174
|
+
t.echo(traceback.format_exc(), err=True)
|
|
175
|
+
raise t.Exit(1) from e
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Type definitions for CLI options."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Literal
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Log levels
|
|
9
|
+
LogLevel = Literal["debug", "info", "warning", "error"]
|
|
10
|
+
|
|
11
|
+
# Output detail levels
|
|
12
|
+
DetailLevel = Literal["simple", "detailed", "markdown"]
|
|
13
|
+
|
|
14
|
+
# Statistics grouping options
|
|
15
|
+
GroupBy = Literal["agent", "model", "hour", "day"]
|
|
16
|
+
|
|
17
|
+
OutputFormat = Literal["json", "yaml", "table", "text"]
|
|
18
|
+
|
|
19
|
+
# Provider types
|
|
20
|
+
Provider = Literal["pydantic_ai"]
|
|
21
|
+
|
|
22
|
+
# Merge methods for pull requests
|
|
23
|
+
MergeMethod = Literal["merge", "squash", "rebase"]
|
agentpool_cli/common.py
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""Common utilities for the CLI."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
from logging.handlers import RotatingFileHandler
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import sys
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Literal, assert_never
|
|
12
|
+
|
|
13
|
+
import platformdirs
|
|
14
|
+
import typer as t
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from collections.abc import Sequence
|
|
19
|
+
|
|
20
|
+
OutputFormat = Literal["text", "json", "yaml"]
|
|
21
|
+
|
|
22
|
+
CONFIG_HELP = "Path to config file or name of stored config"
|
|
23
|
+
OUTPUT_FORMAT_HELP = "Output format. One of: text, json, yaml"
|
|
24
|
+
VERBOSE_HELP = "Enable debug logging"
|
|
25
|
+
# Command options
|
|
26
|
+
OUTPUT_FORMAT_CMDS = "-o", "--output-format"
|
|
27
|
+
VERBOSE_CMDS = "-v", "--verbose"
|
|
28
|
+
|
|
29
|
+
LOG_DIR = Path(platformdirs.user_log_dir("agentpool", "agentpool"))
|
|
30
|
+
TIMESTAMP = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
31
|
+
LOG_FILE = LOG_DIR / f"agentpool_{TIMESTAMP}.log"
|
|
32
|
+
|
|
33
|
+
MAX_LOG_SIZE = 10 * 1024 * 1024 # (10MB)
|
|
34
|
+
|
|
35
|
+
BACKUP_COUNT = 5
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def setup_logging(
|
|
39
|
+
*,
|
|
40
|
+
level: int | str = logging.INFO,
|
|
41
|
+
handlers: Sequence[logging.Handler] | None = None,
|
|
42
|
+
format_string: str | None = None,
|
|
43
|
+
log_to_file: bool = True,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Configure logging.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
level: The logging level for console output
|
|
49
|
+
handlers: Optional sequence of handlers to add
|
|
50
|
+
format_string: Optional custom format string
|
|
51
|
+
log_to_file: Whether to log to file in addition to stdout
|
|
52
|
+
"""
|
|
53
|
+
logger = logging.getLogger("agentpool")
|
|
54
|
+
logger.setLevel(logging.DEBUG)
|
|
55
|
+
format_string = format_string or "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
56
|
+
formatter = logging.Formatter(format_string)
|
|
57
|
+
if not handlers:
|
|
58
|
+
handlers = []
|
|
59
|
+
# Add stdout handler with user-specified level
|
|
60
|
+
stdout_handler = logging.StreamHandler(sys.stdout)
|
|
61
|
+
stdout_handler.setFormatter(formatter)
|
|
62
|
+
stdout_handler.setLevel(level)
|
|
63
|
+
handlers.append(stdout_handler)
|
|
64
|
+
# Add file handler if requested (always DEBUG level)
|
|
65
|
+
if log_to_file:
|
|
66
|
+
try:
|
|
67
|
+
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
file_handler = RotatingFileHandler(
|
|
69
|
+
LOG_FILE,
|
|
70
|
+
maxBytes=MAX_LOG_SIZE,
|
|
71
|
+
backupCount=BACKUP_COUNT,
|
|
72
|
+
encoding="utf-8",
|
|
73
|
+
)
|
|
74
|
+
file_handler.setFormatter(formatter)
|
|
75
|
+
file_handler.setLevel(logging.DEBUG)
|
|
76
|
+
handlers.append(file_handler)
|
|
77
|
+
except Exception as exc: # noqa: BLE001
|
|
78
|
+
msg = f"Failed to create log file: {exc}"
|
|
79
|
+
print(msg, file=sys.stderr)
|
|
80
|
+
|
|
81
|
+
for handler in handlers:
|
|
82
|
+
if not handler.formatter:
|
|
83
|
+
handler.setFormatter(formatter)
|
|
84
|
+
logger.addHandler(handler)
|
|
85
|
+
|
|
86
|
+
logger.info("Logging initialized")
|
|
87
|
+
if log_to_file:
|
|
88
|
+
msg = "Console logging level: %s, File logging level: DEBUG (%s)"
|
|
89
|
+
logger.debug(msg, logging.getLevelName(level), LOG_FILE)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def complete_config_names() -> list[str]:
|
|
93
|
+
"""Complete stored config names."""
|
|
94
|
+
from agentpool_cli import agent_store
|
|
95
|
+
|
|
96
|
+
return [name for name, _ in agent_store.list_configs()]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def complete_output_formats() -> list[str]:
|
|
100
|
+
"""Complete output format options."""
|
|
101
|
+
return ["text", "json", "yaml"]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def verbose_callback(ctx: t.Context, _param: t.CallbackParam, value: bool) -> bool:
|
|
105
|
+
"""Handle verbose flag."""
|
|
106
|
+
if value:
|
|
107
|
+
setup_logging(level=logging.DEBUG)
|
|
108
|
+
return value
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
output_format_opt = t.Option(
|
|
112
|
+
"text",
|
|
113
|
+
*OUTPUT_FORMAT_CMDS,
|
|
114
|
+
help=OUTPUT_FORMAT_HELP,
|
|
115
|
+
autocompletion=complete_output_formats,
|
|
116
|
+
)
|
|
117
|
+
verbose_opt = t.Option(False, *VERBOSE_CMDS, help=VERBOSE_HELP, callback=verbose_callback)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def format_output(result: Any, output_format: OutputFormat = "text") -> None:
|
|
121
|
+
"""Format and print data in the requested format using TypeAdapter.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
result: Any object to format
|
|
125
|
+
output_format: One of: text, json, yaml
|
|
126
|
+
"""
|
|
127
|
+
from pydantic import TypeAdapter
|
|
128
|
+
from rich.console import Console
|
|
129
|
+
|
|
130
|
+
adapter = TypeAdapter(type(result))
|
|
131
|
+
data = adapter.dump_python(result)
|
|
132
|
+
console = Console()
|
|
133
|
+
match output_format:
|
|
134
|
+
case "json":
|
|
135
|
+
print(json.dumps(data, indent=2, default=str))
|
|
136
|
+
case "yaml":
|
|
137
|
+
import yamling
|
|
138
|
+
|
|
139
|
+
print(yamling.dump_yaml(data))
|
|
140
|
+
case "text":
|
|
141
|
+
console.print(data)
|
|
142
|
+
case _ as unreachable:
|
|
143
|
+
assert_never(unreachable)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
from dataclasses import dataclass
|
|
148
|
+
|
|
149
|
+
@dataclass
|
|
150
|
+
class Person:
|
|
151
|
+
"""Test class."""
|
|
152
|
+
|
|
153
|
+
name: str
|
|
154
|
+
age: int
|
|
155
|
+
|
|
156
|
+
people = [Person("Alice", 30), Person("Bob", 25)]
|
|
157
|
+
|
|
158
|
+
print("=== JSON ===")
|
|
159
|
+
format_output(people, "json")
|
|
160
|
+
print("\n=== YAML ===")
|
|
161
|
+
format_output(people, "yaml")
|
|
162
|
+
print("\n=== TEXT ===")
|
|
163
|
+
format_output(people, "text")
|
agentpool_cli/create.py
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""Web interface commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Annotated, Any, ClassVar
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from agentpool_cli.cli_types import Provider # noqa: TC001
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def create(
|
|
13
|
+
output: Annotated[
|
|
14
|
+
str | None,
|
|
15
|
+
typer.Option(
|
|
16
|
+
"-o",
|
|
17
|
+
"--output",
|
|
18
|
+
help="Output file path. If not provided, only displays the config.",
|
|
19
|
+
),
|
|
20
|
+
] = None,
|
|
21
|
+
add_to_store: Annotated[
|
|
22
|
+
bool, typer.Option("-a", "--add-to-store", help="Add generated config to ConfigStore")
|
|
23
|
+
] = False,
|
|
24
|
+
model: Annotated[
|
|
25
|
+
str, typer.Option("-m", "--model", help="Model to use for generation")
|
|
26
|
+
] = "gpt-5",
|
|
27
|
+
provider: Annotated[
|
|
28
|
+
Provider, typer.Option("-p", "--provider", help="Provider to use")
|
|
29
|
+
] = "pydantic_ai",
|
|
30
|
+
) -> None:
|
|
31
|
+
"""Interactive config generator for agents and teams."""
|
|
32
|
+
from schemez import YAMLCode
|
|
33
|
+
from textual.app import App
|
|
34
|
+
from textual.binding import Binding
|
|
35
|
+
from textual.containers import ScrollableContainer
|
|
36
|
+
from textual.widgets import Header, Input, Static
|
|
37
|
+
|
|
38
|
+
from agentpool import Agent, AgentsManifest
|
|
39
|
+
from agentpool.agents.architect import create_architect_agent
|
|
40
|
+
from agentpool.utils.count_tokens import count_tokens
|
|
41
|
+
from agentpool_cli import agent_store
|
|
42
|
+
|
|
43
|
+
if TYPE_CHECKING:
|
|
44
|
+
from textual.app import ComposeResult
|
|
45
|
+
|
|
46
|
+
class StatsDisplay(Static):
|
|
47
|
+
"""Display for token count and validation status."""
|
|
48
|
+
|
|
49
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
50
|
+
super().__init__(*args, markup=kwargs.pop("markup", False), **kwargs)
|
|
51
|
+
|
|
52
|
+
def update_stats(self, token_count: int, status: str | None = None) -> None:
|
|
53
|
+
"""Update the stats display."""
|
|
54
|
+
text = f"Context tokens: {token_count:,}"
|
|
55
|
+
if status:
|
|
56
|
+
text = f"{status} | {text}"
|
|
57
|
+
self.update(text)
|
|
58
|
+
|
|
59
|
+
class YamlDisplay(ScrollableContainer):
|
|
60
|
+
"""Display for YAML content with syntax highlighting."""
|
|
61
|
+
|
|
62
|
+
def __init__(self) -> None:
|
|
63
|
+
super().__init__()
|
|
64
|
+
self._content = Static("")
|
|
65
|
+
|
|
66
|
+
def compose(self) -> ComposeResult:
|
|
67
|
+
"""Initial empty content."""
|
|
68
|
+
yield self._content
|
|
69
|
+
|
|
70
|
+
def update_yaml(self, content: str) -> None:
|
|
71
|
+
"""Update the YAML content with syntax highlighting."""
|
|
72
|
+
from rich.syntax import Syntax
|
|
73
|
+
|
|
74
|
+
syntax = Syntax(content, "yaml", theme="monokai")
|
|
75
|
+
self._content.update(syntax)
|
|
76
|
+
|
|
77
|
+
class ConfigGeneratorApp(App[None]):
|
|
78
|
+
"""Application for generating configuration files."""
|
|
79
|
+
|
|
80
|
+
CSS = """
|
|
81
|
+
Screen {
|
|
82
|
+
layout: grid;
|
|
83
|
+
grid-size: 1;
|
|
84
|
+
padding: 1;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
Input {
|
|
88
|
+
dock: top;
|
|
89
|
+
margin: 1 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
YamlDisplay {
|
|
93
|
+
height: 1fr;
|
|
94
|
+
border: solid green;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
StatsDisplay {
|
|
98
|
+
dock: bottom;
|
|
99
|
+
height: 3;
|
|
100
|
+
content-align: center middle;
|
|
101
|
+
}
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
BINDINGS: ClassVar = [
|
|
105
|
+
Binding("ctrl+s", "save", "Save Config", show=True),
|
|
106
|
+
("escape", "quit", "Quit"),
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
def __init__(
|
|
110
|
+
self,
|
|
111
|
+
model: str = "openai:gpt-5-mini",
|
|
112
|
+
output_path: str | None = None,
|
|
113
|
+
add_to_store: bool = False,
|
|
114
|
+
) -> None:
|
|
115
|
+
from upathtools import to_upath
|
|
116
|
+
|
|
117
|
+
super().__init__()
|
|
118
|
+
agent = Agent(output_type=YAMLCode)
|
|
119
|
+
self.agent = agent
|
|
120
|
+
self.current_config: str | None = None
|
|
121
|
+
self.output_path = to_upath(output_path) if output_path else None
|
|
122
|
+
self.add_to_store = add_to_store
|
|
123
|
+
self._token_count: int = 0
|
|
124
|
+
|
|
125
|
+
def compose(self) -> ComposeResult:
|
|
126
|
+
yield Header()
|
|
127
|
+
yield Input(placeholder="Describe your configuration needs...")
|
|
128
|
+
yield YamlDisplay()
|
|
129
|
+
yield StatsDisplay("Context tokens: calculating...")
|
|
130
|
+
|
|
131
|
+
async def on_mount(self) -> None:
|
|
132
|
+
"""Load schema and calculate token count."""
|
|
133
|
+
self.agent = await create_architect_agent(model="openai:gpt-5-nano")
|
|
134
|
+
assert self.agent.model_name
|
|
135
|
+
model_name = self.agent.model_name.split(":")[-1]
|
|
136
|
+
context = await self.agent.conversation.format_history()
|
|
137
|
+
self._token_count = count_tokens(context, model_name)
|
|
138
|
+
stats = self.query_one(StatsDisplay)
|
|
139
|
+
stats.update_stats(self._token_count)
|
|
140
|
+
|
|
141
|
+
async def on_input_submitted(self, message: Input.Submitted) -> None:
|
|
142
|
+
"""Generate config when user hits enter."""
|
|
143
|
+
from pydantic import ValidationError
|
|
144
|
+
from yamling import YAMLError
|
|
145
|
+
|
|
146
|
+
yaml = await self.agent.run(message.value)
|
|
147
|
+
self.current_config = yaml.content.code
|
|
148
|
+
try:
|
|
149
|
+
AgentsManifest.from_yaml(yaml.content.code)
|
|
150
|
+
status = "✓ Valid configuration"
|
|
151
|
+
except (ValidationError, YAMLError) as e:
|
|
152
|
+
status = f"✗ Invalid: {e}"
|
|
153
|
+
|
|
154
|
+
content = self.query_one(YamlDisplay)
|
|
155
|
+
content.update_yaml(yaml.content.code)
|
|
156
|
+
stats = self.query_one(StatsDisplay)
|
|
157
|
+
stats.update_stats(self._token_count, status)
|
|
158
|
+
|
|
159
|
+
def action_save(self) -> None:
|
|
160
|
+
"""Save current config."""
|
|
161
|
+
if not self.current_config:
|
|
162
|
+
self.notify("No configuration generated yet!")
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
if not self.output_path:
|
|
166
|
+
self.notify("No output path specified!")
|
|
167
|
+
return
|
|
168
|
+
|
|
169
|
+
self.output_path.write_text(self.current_config)
|
|
170
|
+
if self.add_to_store:
|
|
171
|
+
agent_store.add_config(self.output_path.stem, str(self.output_path))
|
|
172
|
+
self.notify(f"Saved to {self.output_path}")
|
|
173
|
+
|
|
174
|
+
app = ConfigGeneratorApp(model=model, provider=provider) # type: ignore
|
|
175
|
+
app.run()
|