alloy-runtime-cli 0.1.0__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.
- alloy_runtime_cli-0.1.0.dist-info/METADATA +61 -0
- alloy_runtime_cli-0.1.0.dist-info/RECORD +451 -0
- alloy_runtime_cli-0.1.0.dist-info/WHEEL +5 -0
- alloy_runtime_cli-0.1.0.dist-info/entry_points.txt +2 -0
- alloy_runtime_cli-0.1.0.dist-info/top_level.txt +1 -0
- cli/__init__.py +0 -0
- cli/commands/__init__.py +0 -0
- cli/commands/admin/__init__.py +0 -0
- cli/commands/admin/bootstrap_command.py +118 -0
- cli/commands/admin/credentials/__init__.py +0 -0
- cli/commands/admin/credentials/create/__init__.py +0 -0
- cli/commands/admin/credentials/create/command.py +148 -0
- cli/commands/admin/credentials/create/presenter.py +16 -0
- cli/commands/admin/credentials/grant/__init__.py +0 -0
- cli/commands/admin/credentials/grant/command.py +119 -0
- cli/commands/admin/credentials/grant/fields.py +33 -0
- cli/commands/admin/credentials/grant/presenter.py +23 -0
- cli/commands/agents/__init__.py +0 -0
- cli/commands/agents/create/__init__.py +0 -0
- cli/commands/agents/create/command.py +475 -0
- cli/commands/agents/create/fields.py +64 -0
- cli/commands/agents/create/presenter.py +68 -0
- cli/commands/agents/delete/__init__.py +0 -0
- cli/commands/agents/delete/command.py +47 -0
- cli/commands/agents/delete/presenter.py +16 -0
- cli/commands/agents/get/command.py +37 -0
- cli/commands/agents/get/presenter.py +32 -0
- cli/commands/agents/list/__init__.py +1 -0
- cli/commands/agents/list/command.py +54 -0
- cli/commands/agents/list/presenter.py +82 -0
- cli/commands/agents/update/__init__.py +0 -0
- cli/commands/agents/update/command.py +435 -0
- cli/commands/agents/update/fields.py +40 -0
- cli/commands/agents/update/presenter.py +68 -0
- cli/commands/audio/__init__.py +0 -0
- cli/commands/audio/transcribe/__init__.py +0 -0
- cli/commands/audio/transcribe/command.py +144 -0
- cli/commands/audio/transcribe/presenter.py +15 -0
- cli/commands/auth/__init__.py +0 -0
- cli/commands/auth/login/__init__.py +0 -0
- cli/commands/auth/login/command.py +80 -0
- cli/commands/auth/signup/__init__.py +0 -0
- cli/commands/auth/signup/command.py +115 -0
- cli/commands/billing/__init__.py +1 -0
- cli/commands/billing/costs/__init__.py +1 -0
- cli/commands/billing/costs/by_agent/__init__.py +1 -0
- cli/commands/billing/costs/by_agent/command.py +57 -0
- cli/commands/billing/costs/by_agent/presenter.py +81 -0
- cli/commands/billing/costs/by_model/__init__.py +1 -0
- cli/commands/billing/costs/by_model/command.py +57 -0
- cli/commands/billing/costs/by_model/presenter.py +80 -0
- cli/commands/billing/costs/daily/__init__.py +1 -0
- cli/commands/billing/costs/daily/command.py +55 -0
- cli/commands/billing/costs/daily/presenter.py +75 -0
- cli/commands/billing/costs/summary/__init__.py +1 -0
- cli/commands/billing/costs/summary/command.py +57 -0
- cli/commands/billing/costs/summary/presenter.py +42 -0
- cli/commands/billing/projects/__init__.py +1 -0
- cli/commands/billing/projects/create/__init__.py +1 -0
- cli/commands/billing/projects/create/command.py +60 -0
- cli/commands/billing/projects/create/presenter.py +26 -0
- cli/commands/billing/projects/get/__init__.py +1 -0
- cli/commands/billing/projects/get/command.py +33 -0
- cli/commands/billing/projects/get/presenter.py +32 -0
- cli/commands/billing/projects/list/__init__.py +1 -0
- cli/commands/billing/projects/list/command.py +40 -0
- cli/commands/billing/projects/list/presenter.py +57 -0
- cli/commands/content/__init__.py +1 -0
- cli/commands/content/delete/__init__.py +0 -0
- cli/commands/content/delete/command.py +49 -0
- cli/commands/content/delete/presenter.py +18 -0
- cli/commands/content/edit/__init__.py +1 -0
- cli/commands/content/edit/command.py +155 -0
- cli/commands/content/edit/editor.py +150 -0
- cli/commands/content/edit/presenter.py +146 -0
- cli/commands/content/get/__init__.py +1 -0
- cli/commands/content/get/command.py +39 -0
- cli/commands/content/get/presenter.py +176 -0
- cli/commands/content/list/__init__.py +1 -0
- cli/commands/content/list/command.py +347 -0
- cli/commands/content/list/export_formatters.py +409 -0
- cli/commands/content/list/export_handler.py +165 -0
- cli/commands/content/list/presenter.py +190 -0
- cli/commands/credentials/__init__.py +0 -0
- cli/commands/credentials/create/__init__.py +0 -0
- cli/commands/credentials/create/command.py +165 -0
- cli/commands/credentials/create/fields.py +38 -0
- cli/commands/credentials/create/presenter.py +20 -0
- cli/commands/credentials/update/__init__.py +0 -0
- cli/commands/credentials/update/command.py +53 -0
- cli/commands/credentials/update/fields.py +71 -0
- cli/commands/credentials/update/presenter.py +16 -0
- cli/commands/flag_utils.py +366 -0
- cli/commands/generate/__init__.py +0 -0
- cli/commands/generate/cancel/__init__.py +1 -0
- cli/commands/generate/cancel/command.py +44 -0
- cli/commands/generate/cancel/presenter.py +26 -0
- cli/commands/generate/status/__init__.py +1 -0
- cli/commands/generate/status/command.py +58 -0
- cli/commands/generate/status/presenter.py +78 -0
- cli/commands/generate/text/__init__.py +0 -0
- cli/commands/generate/text/command.py +1325 -0
- cli/commands/generate/text/concurrent_renderer.py +355 -0
- cli/commands/generate/text/presenter.py +287 -0
- cli/commands/generate/text/stream_renderer.py +129 -0
- cli/commands/knowledge/__init__.py +0 -0
- cli/commands/knowledge/collections/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster/command.py +64 -0
- cli/commands/knowledge/collections/cluster/presenter.py +74 -0
- cli/commands/knowledge/collections/cluster_status/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster_status/command.py +46 -0
- cli/commands/knowledge/collections/cluster_status/presenter.py +10 -0
- cli/commands/knowledge/collections/create/__init__.py +0 -0
- cli/commands/knowledge/collections/create/command.py +137 -0
- cli/commands/knowledge/collections/create/presenter.py +38 -0
- cli/commands/knowledge/collections/delete/__init__.py +1 -0
- cli/commands/knowledge/collections/delete/command.py +47 -0
- cli/commands/knowledge/collections/delete/presenter.py +20 -0
- cli/commands/knowledge/collections/get/__init__.py +1 -0
- cli/commands/knowledge/collections/get/command.py +30 -0
- cli/commands/knowledge/collections/get/presenter.py +44 -0
- cli/commands/knowledge/collections/list/__init__.py +1 -0
- cli/commands/knowledge/collections/list/command.py +41 -0
- cli/commands/knowledge/collections/list/presenter.py +68 -0
- cli/commands/knowledge/collections/update/__init__.py +0 -0
- cli/commands/knowledge/collections/update/command.py +97 -0
- cli/commands/knowledge/collections/update/presenter.py +42 -0
- cli/commands/knowledge/documents/__init__.py +0 -0
- cli/commands/knowledge/documents/bulk_metadata/__init__.py +0 -0
- cli/commands/knowledge/documents/bulk_metadata/command.py +119 -0
- cli/commands/knowledge/documents/bulk_metadata/presenter.py +36 -0
- cli/commands/knowledge/documents/delete/__init__.py +0 -0
- cli/commands/knowledge/documents/delete/command.py +47 -0
- cli/commands/knowledge/documents/delete/presenter.py +20 -0
- cli/commands/knowledge/documents/get/__init__.py +0 -0
- cli/commands/knowledge/documents/get/command.py +39 -0
- cli/commands/knowledge/documents/get/presenter.py +78 -0
- cli/commands/knowledge/documents/ingest/__init__.py +0 -0
- cli/commands/knowledge/documents/ingest/command.py +222 -0
- cli/commands/knowledge/documents/ingest/presenter.py +41 -0
- cli/commands/knowledge/documents/list/__init__.py +0 -0
- cli/commands/knowledge/documents/list/command.py +69 -0
- cli/commands/knowledge/documents/list/presenter.py +86 -0
- cli/commands/knowledge/documents/reingest/__init__.py +0 -0
- cli/commands/knowledge/documents/reingest/command.py +102 -0
- cli/commands/knowledge/documents/reingest/presenter.py +70 -0
- cli/commands/knowledge/documents/update/__init__.py +0 -0
- cli/commands/knowledge/documents/update/command.py +85 -0
- cli/commands/knowledge/documents/update/presenter.py +37 -0
- cli/commands/knowledge/recover/__init__.py +0 -0
- cli/commands/knowledge/recover/command.py +46 -0
- cli/commands/knowledge/recover/presenter.py +79 -0
- cli/commands/knowledge/search/__init__.py +0 -0
- cli/commands/knowledge/search/command.py +218 -0
- cli/commands/knowledge/search/presenter.py +111 -0
- cli/commands/knowledge/synthesis/__init__.py +0 -0
- cli/commands/knowledge/synthesis/create/__init__.py +0 -0
- cli/commands/knowledge/synthesis/create/command.py +127 -0
- cli/commands/knowledge/synthesis/create/presenter.py +33 -0
- cli/commands/knowledge/synthesis/delete/__init__.py +0 -0
- cli/commands/knowledge/synthesis/delete/command.py +53 -0
- cli/commands/knowledge/synthesis/delete/presenter.py +31 -0
- cli/commands/knowledge/synthesis/get/__init__.py +0 -0
- cli/commands/knowledge/synthesis/get/command.py +55 -0
- cli/commands/knowledge/synthesis/get/presenter.py +114 -0
- cli/commands/knowledge/synthesis/list/__init__.py +0 -0
- cli/commands/knowledge/synthesis/list/command.py +132 -0
- cli/commands/knowledge/synthesis/list/presenter.py +84 -0
- cli/commands/knowledge/synthesis/refresh/__init__.py +0 -0
- cli/commands/knowledge/synthesis/refresh/command.py +42 -0
- cli/commands/knowledge/synthesis/refresh/presenter.py +33 -0
- cli/commands/knowledge/synthesis/update/__init__.py +0 -0
- cli/commands/knowledge/synthesis/update/command.py +76 -0
- cli/commands/knowledge/synthesis/update/presenter.py +41 -0
- cli/commands/models/__init__.py +0 -0
- cli/commands/models/list/__init__.py +0 -0
- cli/commands/models/list/command.py +84 -0
- cli/commands/models/list/presenter.py +114 -0
- cli/commands/organizations/__init__.py +0 -0
- cli/commands/organizations/create/command.py +32 -0
- cli/commands/organizations/create/presenter.py +9 -0
- cli/commands/pipelines/__init__.py +1 -0
- cli/commands/pipelines/approvals/__init__.py +1 -0
- cli/commands/pipelines/approvals/decide_command.py +77 -0
- cli/commands/pipelines/approvals/get_command.py +44 -0
- cli/commands/pipelines/approvals/presenter.py +56 -0
- cli/commands/pipelines/costs/__init__.py +1 -0
- cli/commands/pipelines/costs/command.py +57 -0
- cli/commands/pipelines/costs/daily_command.py +54 -0
- cli/commands/pipelines/costs/daily_presenter.py +59 -0
- cli/commands/pipelines/costs/presenter.py +37 -0
- cli/commands/pipelines/create/__init__.py +1 -0
- cli/commands/pipelines/create/command.py +103 -0
- cli/commands/pipelines/create/presenter.py +22 -0
- cli/commands/pipelines/env_vars/__init__.py +1 -0
- cli/commands/pipelines/env_vars/command.py +51 -0
- cli/commands/pipelines/env_vars/presenter.py +16 -0
- cli/commands/pipelines/execute/__init__.py +1 -0
- cli/commands/pipelines/execute/command.py +142 -0
- cli/commands/pipelines/execute/presenter.py +47 -0
- cli/commands/pipelines/executions/__init__.py +1 -0
- cli/commands/pipelines/executions/costs/__init__.py +1 -0
- cli/commands/pipelines/executions/costs/command.py +48 -0
- cli/commands/pipelines/executions/costs/presenter.py +29 -0
- cli/commands/pipelines/executions/costs_by_model/__init__.py +1 -0
- cli/commands/pipelines/executions/costs_by_model/command.py +50 -0
- cli/commands/pipelines/executions/costs_by_model/presenter.py +78 -0
- cli/commands/pipelines/executions/costs_by_step/__init__.py +1 -0
- cli/commands/pipelines/executions/costs_by_step/command.py +50 -0
- cli/commands/pipelines/executions/costs_by_step/presenter.py +72 -0
- cli/commands/pipelines/executions/get_command.py +38 -0
- cli/commands/pipelines/executions/list_command.py +123 -0
- cli/commands/pipelines/executions/presenter.py +131 -0
- cli/commands/pipelines/executions/rerun_command.py +41 -0
- cli/commands/pipelines/executions/update/__init__.py +1 -0
- cli/commands/pipelines/executions/update/command.py +110 -0
- cli/commands/pipelines/executions/update/presenter.py +28 -0
- cli/commands/pipelines/get/__init__.py +1 -0
- cli/commands/pipelines/get/command.py +33 -0
- cli/commands/pipelines/get/presenter.py +48 -0
- cli/commands/pipelines/list/__init__.py +1 -0
- cli/commands/pipelines/list/command.py +53 -0
- cli/commands/pipelines/list/presenter.py +66 -0
- cli/commands/pipelines/schedules/__init__.py +1 -0
- cli/commands/pipelines/schedules/create_command.py +119 -0
- cli/commands/pipelines/schedules/create_presenter.py +35 -0
- cli/commands/pipelines/schedules/delete_command.py +52 -0
- cli/commands/pipelines/schedules/env_vars_command.py +59 -0
- cli/commands/pipelines/schedules/env_vars_presenter.py +16 -0
- cli/commands/pipelines/schedules/get_command.py +38 -0
- cli/commands/pipelines/schedules/list_command.py +33 -0
- cli/commands/pipelines/schedules/once_command.py +90 -0
- cli/commands/pipelines/schedules/once_presenter.py +30 -0
- cli/commands/pipelines/schedules/presenter.py +104 -0
- cli/commands/pipelines/schedules/update_command.py +139 -0
- cli/commands/pipelines/schedules/update_presenter.py +29 -0
- cli/commands/render/__init__.py +0 -0
- cli/commands/render/html_to_image/__init__.py +0 -0
- cli/commands/render/html_to_image/command.py +170 -0
- cli/commands/schemas/__init__.py +0 -0
- cli/commands/schemas/create/__init__.py +0 -0
- cli/commands/schemas/create/command.py +122 -0
- cli/commands/schemas/create/presenter.py +53 -0
- cli/commands/schemas/delete/command.py +45 -0
- cli/commands/schemas/delete/presenter.py +9 -0
- cli/commands/schemas/get/__init__.py +0 -0
- cli/commands/schemas/get/command.py +56 -0
- cli/commands/schemas/get/presenter.py +129 -0
- cli/commands/schemas/list/__init__.py +0 -0
- cli/commands/schemas/list/command.py +64 -0
- cli/commands/schemas/list/presenter.py +133 -0
- cli/commands/schemas/update/__init__.py +0 -0
- cli/commands/schemas/update/command.py +369 -0
- cli/commands/schemas/update/presenter.py +53 -0
- cli/commands/sessions/__init__.py +1 -0
- cli/commands/sessions/delete/__init__.py +1 -0
- cli/commands/sessions/delete/command.py +47 -0
- cli/commands/sessions/delete/presenter.py +10 -0
- cli/commands/sessions/get/__init__.py +1 -0
- cli/commands/sessions/get/command.py +42 -0
- cli/commands/sessions/get/presenter.py +59 -0
- cli/commands/sessions/list/__init__.py +1 -0
- cli/commands/sessions/list/command.py +61 -0
- cli/commands/sessions/list/presenter.py +68 -0
- cli/commands/sessions/messages/__init__.py +1 -0
- cli/commands/sessions/messages/command.py +78 -0
- cli/commands/sessions/messages/presenter.py +79 -0
- cli/commands/shared_flags.py +500 -0
- cli/commands/sync/__init__.py +0 -0
- cli/commands/sync/command.py +45 -0
- cli/commands/sync/presenter.py +49 -0
- cli/commands/tags/__init__.py +1 -0
- cli/commands/tags/create/__init__.py +1 -0
- cli/commands/tags/create/command.py +60 -0
- cli/commands/tags/delete/__init__.py +1 -0
- cli/commands/tags/delete/command.py +47 -0
- cli/commands/tags/delete/presenter.py +10 -0
- cli/commands/tags/get/command.py +31 -0
- cli/commands/tags/get/presenter.py +23 -0
- cli/commands/tags/list/__init__.py +1 -0
- cli/commands/tags/list/command.py +52 -0
- cli/commands/tags/list/presenter.py +49 -0
- cli/commands/tags/update/command.py +64 -0
- cli/commands/tags/update/presenter.py +9 -0
- cli/commands/templates/__init__.py +0 -0
- cli/commands/templates/create/__init__.py +0 -0
- cli/commands/templates/create/command.py +152 -0
- cli/commands/templates/create/presenter.py +86 -0
- cli/commands/templates/delete/__init__.py +0 -0
- cli/commands/templates/delete/command.py +47 -0
- cli/commands/templates/delete/presenter.py +16 -0
- cli/commands/templates/get/__init__.py +0 -0
- cli/commands/templates/get/command.py +52 -0
- cli/commands/templates/get/presenter.py +233 -0
- cli/commands/templates/get_by_version/command.py +32 -0
- cli/commands/templates/get_by_version/presenter.py +30 -0
- cli/commands/templates/list/__init__.py +1 -0
- cli/commands/templates/list/command.py +102 -0
- cli/commands/templates/list/presenter.py +93 -0
- cli/commands/templates/render/__init__.py +0 -0
- cli/commands/templates/render/command.py +115 -0
- cli/commands/templates/render/presenter.py +276 -0
- cli/commands/templates/update/__init__.py +0 -0
- cli/commands/templates/update/command.py +199 -0
- cli/commands/templates/update/presenter.py +94 -0
- cli/commands/templates/version/__init__.py +1 -0
- cli/commands/templates/version/command.py +116 -0
- cli/commands/templates/version/presenter.py +100 -0
- cli/commands/tool_configs/__init__.py +0 -0
- cli/commands/tool_configs/create/__init__.py +0 -0
- cli/commands/tool_configs/create/command.py +118 -0
- cli/commands/tool_configs/create/presenter.py +53 -0
- cli/commands/tool_configs/delete/__init__.py +0 -0
- cli/commands/tool_configs/delete/command.py +47 -0
- cli/commands/tool_configs/delete/presenter.py +18 -0
- cli/commands/tool_configs/get/__init__.py +0 -0
- cli/commands/tool_configs/get/command.py +31 -0
- cli/commands/tool_configs/get/presenter.py +62 -0
- cli/commands/tool_configs/list/__init__.py +0 -0
- cli/commands/tool_configs/list/command.py +59 -0
- cli/commands/tool_configs/list/presenter.py +60 -0
- cli/commands/tool_configs/update/__init__.py +0 -0
- cli/commands/tool_configs/update/command.py +128 -0
- cli/commands/tool_configs/update/presenter.py +53 -0
- cli/commands/tools/__init__.py +1 -0
- cli/commands/tools/get/__init__.py +1 -0
- cli/commands/tools/get/command.py +42 -0
- cli/commands/tools/get/presenter.py +45 -0
- cli/commands/tools/list/__init__.py +1 -0
- cli/commands/tools/list/command.py +56 -0
- cli/commands/tools/list/presenter.py +44 -0
- cli/commands/users/__init__.py +0 -0
- cli/commands/users/create/command.py +53 -0
- cli/commands/users/create/presenter.py +9 -0
- cli/commands/whoami/__init__.py +0 -0
- cli/commands/whoami/command.py +42 -0
- cli/infrastructure/__init__.py +0 -0
- cli/infrastructure/auth_storage.py +71 -0
- cli/infrastructure/client_factory.py +36 -0
- cli/infrastructure/command.py +75 -0
- cli/infrastructure/config.py +188 -0
- cli/infrastructure/console.py +27 -0
- cli/infrastructure/editor.py +138 -0
- cli/infrastructure/error_display.py +178 -0
- cli/infrastructure/field_extractor.py +360 -0
- cli/infrastructure/file_content.py +210 -0
- cli/infrastructure/filter_parser.py +256 -0
- cli/infrastructure/formatters/__init__.py +0 -0
- cli/infrastructure/formatters/base.py +99 -0
- cli/infrastructure/formatters/compact_formatter.py +245 -0
- cli/infrastructure/formatters/json_formatter.py +84 -0
- cli/infrastructure/formatters/lines_formatter.py +102 -0
- cli/infrastructure/formatting/__init__.py +0 -0
- cli/infrastructure/formatting/fields.py +193 -0
- cli/infrastructure/forms/__init__.py +0 -0
- cli/infrastructure/forms/agent_picker.py +123 -0
- cli/infrastructure/forms/agent_tool_editor.py +384 -0
- cli/infrastructure/forms/agent_tools_manager.py +212 -0
- cli/infrastructure/forms/base_picker.py +469 -0
- cli/infrastructure/forms/components.py +126 -0
- cli/infrastructure/forms/json_schema_builder.py +149 -0
- cli/infrastructure/forms/model_picker.py +134 -0
- cli/infrastructure/forms/parsers.py +173 -0
- cli/infrastructure/forms/resolution_modal.py +302 -0
- cli/infrastructure/forms/schema_picker.py +137 -0
- cli/infrastructure/forms/tag_management_modal.py +103 -0
- cli/infrastructure/forms/tag_picker.py +207 -0
- cli/infrastructure/forms/template_picker.py +131 -0
- cli/infrastructure/forms/tool_config_picker.py +130 -0
- cli/infrastructure/forms/tool_picker.py +103 -0
- cli/infrastructure/injection/__init__.py +0 -0
- cli/infrastructure/injection/parser.py +302 -0
- cli/infrastructure/injection/resolver.py +399 -0
- cli/infrastructure/kv_parser.py +130 -0
- cli/infrastructure/local_storage.py +227 -0
- cli/infrastructure/macro_parser.py +215 -0
- cli/infrastructure/output.py +192 -0
- cli/infrastructure/provider_setup.py +81 -0
- cli/infrastructure/renderers/__init__.py +0 -0
- cli/infrastructure/renderers/entity_renderer.py +77 -0
- cli/infrastructure/renderers/list_renderer.py +114 -0
- cli/infrastructure/scope_utils.py +47 -0
- cli/infrastructure/spinner.py +101 -0
- cli/infrastructure/tui/__init__.py +0 -0
- cli/infrastructure/tui/clipboard.py +41 -0
- cli/infrastructure/tui/formatters.py +105 -0
- cli/infrastructure/tui/preview.py +14 -0
- cli/infrastructure/tui/selectable.py +198 -0
- cli/infrastructure/validation/__init__.py +0 -0
- cli/infrastructure/validation/tag_validation.py +74 -0
- cli/main.py +759 -0
- cli/tui/__init__.py +0 -0
- cli/tui/app.py +199 -0
- cli/tui/app_store.py +73 -0
- cli/tui/chat/__init__.py +0 -0
- cli/tui/chat/commands/__init__.py +0 -0
- cli/tui/chat/commands/base.py +65 -0
- cli/tui/chat/commands/create_session.py +135 -0
- cli/tui/chat/commands/load_session.py +119 -0
- cli/tui/chat/commands/regenerate.py +120 -0
- cli/tui/chat/commands/reload_session.py +63 -0
- cli/tui/chat/commands/send_message.py +190 -0
- cli/tui/chat/commands/undo.py +66 -0
- cli/tui/chat/editor.py +71 -0
- cli/tui/chat/messages.py +223 -0
- cli/tui/chat/pane.py +141 -0
- cli/tui/chat/renderers/__init__.py +0 -0
- cli/tui/chat/renderers/base.py +72 -0
- cli/tui/chat/renderers/markdown.py +250 -0
- cli/tui/chat/renderers/plain.py +83 -0
- cli/tui/chat/screen.py +1155 -0
- cli/tui/chat/services/__init__.py +0 -0
- cli/tui/chat/services/injection.py +386 -0
- cli/tui/chat/services/name_generator.py +256 -0
- cli/tui/chat/slash_commands.py +424 -0
- cli/tui/chat/store.py +280 -0
- cli/tui/chat/types.py +220 -0
- cli/tui/chat/widgets/__init__.py +0 -0
- cli/tui/chat/widgets/chat_header.py +75 -0
- cli/tui/chat/widgets/chat_input.py +362 -0
- cli/tui/chat/widgets/injection_popup.py +161 -0
- cli/tui/chat/widgets/message_display.py +287 -0
- cli/tui/chat/widgets/session_sidebar.py +214 -0
- cli/tui/chat/widgets/welcome_screen.py +290 -0
- cli/tui/screens/__init__.py +0 -0
- cli/tui/screens/agents.py +344 -0
- cli/tui/screens/base.py +301 -0
- cli/tui/screens/content.py +508 -0
- cli/tui/screens/dashboard.py +89 -0
- cli/tui/screens/models.py +96 -0
- cli/tui/screens/nav_screen.py +186 -0
- cli/tui/screens/schemas.py +522 -0
- cli/tui/screens/templates.py +734 -0
- cli/tui/screens/tool_configs.py +335 -0
- cli/tui/styles/__init__.py +0 -0
- cli/tui/widgets/__init__.py +0 -0
- cli/tui/widgets/agent_create_modal.py +139 -0
- cli/tui/widgets/agent_form_modal.py +659 -0
- cli/tui/widgets/agent_update_modal.py +299 -0
- cli/tui/widgets/base_form_modal.py +77 -0
- cli/tui/widgets/confirm_modal.py +75 -0
- cli/tui/widgets/help_modal.py +145 -0
- cli/tui/widgets/new_session_modal.py +328 -0
- cli/tui/widgets/schema_create_modal.py +271 -0
- cli/tui/widgets/schema_update_modal.py +188 -0
- cli/tui/widgets/status_footer.py +147 -0
- cli/tui/widgets/template_create_modal.py +502 -0
- cli/tui/widgets/template_update_modal.py +308 -0
- cli/tui/widgets/tool_config_create_modal.py +216 -0
- cli/tui/widgets/tool_config_update_modal.py +208 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"""Tool Configs screen for browsing and managing tool configurations.
|
|
2
|
+
|
|
3
|
+
This screen provides:
|
|
4
|
+
- Search and browse tool configs
|
|
5
|
+
- View tool config details in preview panel (including JSON config)
|
|
6
|
+
- Create new tool configs
|
|
7
|
+
- Edit existing tool configs
|
|
8
|
+
- Delete tool configs (with in-use protection)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from rich.markup import escape
|
|
14
|
+
from textual import on, work
|
|
15
|
+
from textual.app import ComposeResult
|
|
16
|
+
from textual.binding import Binding
|
|
17
|
+
from textual.containers import Horizontal, Vertical, VerticalScroll
|
|
18
|
+
from textual.widgets import Button, DataTable, Input, Static
|
|
19
|
+
|
|
20
|
+
from alloy_runtime_types.dtos.tool_configs import ToolConfigSummary
|
|
21
|
+
|
|
22
|
+
from cli.infrastructure.scope_utils import format_scope_label
|
|
23
|
+
from cli.infrastructure.tui.clipboard import copy_to_clipboard
|
|
24
|
+
from cli.infrastructure.tui.formatters import format_datetime, truncate_text
|
|
25
|
+
from cli.tui.screens.base import BrowserWidget
|
|
26
|
+
from cli.tui.screens.nav_screen import NavScreen
|
|
27
|
+
from cli.tui.widgets.confirm_modal import ConfirmModal
|
|
28
|
+
from cli.tui.widgets.tool_config_create_modal import (
|
|
29
|
+
ToolConfigCreateModal,
|
|
30
|
+
ToolConfigCreateResult,
|
|
31
|
+
)
|
|
32
|
+
from cli.tui.widgets.tool_config_update_modal import ToolConfigUpdateModal
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from cli.tui.app import AlloyRuntimeApp
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ToolConfigsWidget(BrowserWidget[ToolConfigSummary]):
|
|
39
|
+
"""Widget for browsing and managing tool configurations."""
|
|
40
|
+
|
|
41
|
+
app: "AlloyRuntimeApp"
|
|
42
|
+
|
|
43
|
+
TITLE = "Tool Configs"
|
|
44
|
+
TABLE_COLUMNS = ["Name", "Tool", "Scope", "Updated"]
|
|
45
|
+
|
|
46
|
+
def compose(self) -> ComposeResult:
|
|
47
|
+
"""Compose the browser layout with a New button."""
|
|
48
|
+
with Vertical(id="browser-root"):
|
|
49
|
+
with Vertical(id="search-container"):
|
|
50
|
+
with Horizontal(id="search-row"):
|
|
51
|
+
yield Input(
|
|
52
|
+
placeholder=f"Search {self.TITLE.lower()}...",
|
|
53
|
+
id="search-input",
|
|
54
|
+
)
|
|
55
|
+
yield Button("+ New", id="new-config-btn", variant="primary")
|
|
56
|
+
yield Static("Loading...", id="status-bar")
|
|
57
|
+
|
|
58
|
+
with Horizontal(id="main-container"):
|
|
59
|
+
with Vertical(id="list-container"):
|
|
60
|
+
yield DataTable(id="data-table", cursor_type="row")
|
|
61
|
+
|
|
62
|
+
with Vertical(id="detail-container"):
|
|
63
|
+
yield Static("Preview", id="preview-title")
|
|
64
|
+
with VerticalScroll(id="preview-scroll"):
|
|
65
|
+
yield Static(
|
|
66
|
+
"Select an item to view details",
|
|
67
|
+
id="preview-content",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
@on(Button.Pressed, "#new-config-btn")
|
|
71
|
+
def _on_new_config_btn_pressed(self, event: Button.Pressed) -> None:
|
|
72
|
+
"""Handle New button press."""
|
|
73
|
+
self.open_new_modal()
|
|
74
|
+
|
|
75
|
+
async def _fetch_items(self, query: str) -> tuple[list[ToolConfigSummary], int]:
|
|
76
|
+
"""Fetch tool configs from the API."""
|
|
77
|
+
client = await self._ensure_client()
|
|
78
|
+
response = await client.list_tool_configs(
|
|
79
|
+
search=query if query else None,
|
|
80
|
+
limit=50,
|
|
81
|
+
)
|
|
82
|
+
return list(response.tool_configs), response.total
|
|
83
|
+
|
|
84
|
+
def _format_row(self, item: ToolConfigSummary) -> tuple[str, ...]:
|
|
85
|
+
"""Format a tool config as a table row."""
|
|
86
|
+
return (
|
|
87
|
+
truncate_text(item.name, max_length=30),
|
|
88
|
+
item.tool_id,
|
|
89
|
+
format_scope_label(
|
|
90
|
+
str(item.organization_id) if item.organization_id else None,
|
|
91
|
+
str(item.user_id) if item.user_id else None,
|
|
92
|
+
),
|
|
93
|
+
format_datetime(item.updated_at),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def _update_preview(self, item: ToolConfigSummary) -> None:
|
|
97
|
+
"""Update the preview pane with tool config details.
|
|
98
|
+
|
|
99
|
+
Note: ToolConfigSummary doesn't include the full config JSON.
|
|
100
|
+
We show the basic info here. For full config, user can edit.
|
|
101
|
+
"""
|
|
102
|
+
preview = self.query_one("#preview-content", Static)
|
|
103
|
+
|
|
104
|
+
scope = format_scope_label(
|
|
105
|
+
str(item.organization_id) if item.organization_id else None,
|
|
106
|
+
str(item.user_id) if item.user_id else None,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
created = format_datetime(item.created_at)
|
|
110
|
+
updated = format_datetime(item.updated_at)
|
|
111
|
+
|
|
112
|
+
preview_text = f"""[bold]Tool Config ID:[/] {escape(str(item.id))}
|
|
113
|
+
[bold]Name:[/] {escape(item.name)}
|
|
114
|
+
[bold]Slug:[/] {escape(item.slug)}
|
|
115
|
+
[bold]Tool:[/] {escape(item.tool_id)}
|
|
116
|
+
[bold]Scope:[/] {scope}
|
|
117
|
+
|
|
118
|
+
[bold]Description:[/]
|
|
119
|
+
{escape(item.description or "(no description)")}
|
|
120
|
+
|
|
121
|
+
[dim]Note: Edit to view full configuration JSON[/]
|
|
122
|
+
|
|
123
|
+
[bold]Created:[/] {created}
|
|
124
|
+
[bold]Updated:[/] {updated}"""
|
|
125
|
+
|
|
126
|
+
preview.update(preview_text)
|
|
127
|
+
|
|
128
|
+
# =========================================================================
|
|
129
|
+
# Public methods for parent Screen to call
|
|
130
|
+
# =========================================================================
|
|
131
|
+
|
|
132
|
+
def copy_config_name(self) -> None:
|
|
133
|
+
"""Copy the tool config name to clipboard."""
|
|
134
|
+
config = self.get_selected_item()
|
|
135
|
+
if not config:
|
|
136
|
+
self.app.notify("No tool config selected", severity="warning")
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
copy_to_clipboard(self.app, config.name, "Tool config name")
|
|
140
|
+
|
|
141
|
+
def open_new_modal(self) -> None:
|
|
142
|
+
"""Open the tool config creation modal."""
|
|
143
|
+
self._open_create_modal()
|
|
144
|
+
|
|
145
|
+
def open_edit_modal(self) -> None:
|
|
146
|
+
"""Open the tool config update modal for the selected config."""
|
|
147
|
+
config = self.get_selected_item()
|
|
148
|
+
if not config:
|
|
149
|
+
self.app.notify("No tool config selected", severity="warning")
|
|
150
|
+
return
|
|
151
|
+
self._open_update_modal(config)
|
|
152
|
+
|
|
153
|
+
def delete_selected(self) -> None:
|
|
154
|
+
"""Delete the currently selected tool config."""
|
|
155
|
+
config = self.get_selected_item()
|
|
156
|
+
if not config:
|
|
157
|
+
self.app.notify("No tool config selected", severity="warning")
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
config_name = config.name
|
|
161
|
+
self.app.push_screen(
|
|
162
|
+
ConfirmModal(
|
|
163
|
+
title="Delete Tool Config",
|
|
164
|
+
message=f"Delete tool config '{config_name}'?\n\n"
|
|
165
|
+
"Note: Deletion will fail if this config is used by any agents.",
|
|
166
|
+
),
|
|
167
|
+
lambda confirmed: self._on_delete_confirmed(confirmed, str(config.id)),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
# =========================================================================
|
|
171
|
+
# Internal async operations
|
|
172
|
+
# =========================================================================
|
|
173
|
+
|
|
174
|
+
@work(exclusive=True)
|
|
175
|
+
async def _open_create_modal(self) -> None:
|
|
176
|
+
"""Open the tool config creation modal."""
|
|
177
|
+
try:
|
|
178
|
+
client = await self._ensure_client()
|
|
179
|
+
self.app.push_screen(
|
|
180
|
+
ToolConfigCreateModal(client=client),
|
|
181
|
+
self._on_config_created,
|
|
182
|
+
)
|
|
183
|
+
except Exception as e:
|
|
184
|
+
self.app.notify(f"Failed to open config creator: {e}", severity="error")
|
|
185
|
+
|
|
186
|
+
def _on_config_created(self, result: ToolConfigCreateResult | None) -> None:
|
|
187
|
+
"""Callback when tool config creation modal is dismissed."""
|
|
188
|
+
if result is not None:
|
|
189
|
+
self.app.notify(
|
|
190
|
+
f"Created tool config: {result.config_name}",
|
|
191
|
+
severity="information",
|
|
192
|
+
)
|
|
193
|
+
# Refresh the list
|
|
194
|
+
self._do_search(self._last_search)
|
|
195
|
+
|
|
196
|
+
@work(exclusive=True)
|
|
197
|
+
async def _open_update_modal(self, config_summary: ToolConfigSummary) -> None:
|
|
198
|
+
"""Fetch full tool config details and open the update modal."""
|
|
199
|
+
try:
|
|
200
|
+
client = await self._ensure_client()
|
|
201
|
+
# Fetch full config (includes the config JSON)
|
|
202
|
+
config = await client.get_tool_config(str(config_summary.id))
|
|
203
|
+
self.app.push_screen(
|
|
204
|
+
ToolConfigUpdateModal(client=client, config=config),
|
|
205
|
+
self._on_config_updated,
|
|
206
|
+
)
|
|
207
|
+
except Exception as e:
|
|
208
|
+
self.app.notify(f"Failed to open config editor: {e}", severity="error")
|
|
209
|
+
|
|
210
|
+
def _on_config_updated(self, result: ToolConfigCreateResult | None) -> None:
|
|
211
|
+
"""Callback when tool config update modal is dismissed."""
|
|
212
|
+
if result is not None:
|
|
213
|
+
self.app.notify(
|
|
214
|
+
f"Updated tool config: {result.config_name}",
|
|
215
|
+
severity="information",
|
|
216
|
+
)
|
|
217
|
+
# Refresh the list
|
|
218
|
+
self._do_search(self._last_search)
|
|
219
|
+
|
|
220
|
+
def _on_delete_confirmed(self, confirmed: bool | None, config_id: str) -> None:
|
|
221
|
+
"""Callback when delete confirmation modal is dismissed."""
|
|
222
|
+
if confirmed:
|
|
223
|
+
self._execute_delete(config_id)
|
|
224
|
+
|
|
225
|
+
@work(exclusive=True)
|
|
226
|
+
async def _execute_delete(self, config_id: str) -> None:
|
|
227
|
+
"""Execute the delete operation."""
|
|
228
|
+
try:
|
|
229
|
+
client = await self._ensure_client()
|
|
230
|
+
response = await client.delete_tool_config(config_id)
|
|
231
|
+
|
|
232
|
+
self.app.notify(
|
|
233
|
+
f"Tool config '{response.deleted_tool_config.name}' deleted",
|
|
234
|
+
severity="information",
|
|
235
|
+
)
|
|
236
|
+
# Refresh the list
|
|
237
|
+
self._do_search(self._last_search)
|
|
238
|
+
|
|
239
|
+
except Exception as e:
|
|
240
|
+
error_msg = str(e)
|
|
241
|
+
if "in use" in error_msg.lower() or "referenced" in error_msg.lower():
|
|
242
|
+
self.app.notify(
|
|
243
|
+
"Cannot delete: config is used by one or more agents",
|
|
244
|
+
severity="error",
|
|
245
|
+
)
|
|
246
|
+
else:
|
|
247
|
+
self.app.notify(f"Failed to delete tool config: {e}", severity="error")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class ToolConfigsScreen(NavScreen):
|
|
251
|
+
"""Screen for browsing and managing tool configurations.
|
|
252
|
+
|
|
253
|
+
This is a proper Textual Screen that wraps the ToolConfigsWidget
|
|
254
|
+
and provides keybindings that work regardless of focus.
|
|
255
|
+
"""
|
|
256
|
+
|
|
257
|
+
app: "AlloyRuntimeApp"
|
|
258
|
+
|
|
259
|
+
SCREEN_ID = "tool_configs"
|
|
260
|
+
|
|
261
|
+
DEFAULT_CSS = """
|
|
262
|
+
ToolConfigsScreen #screen-root {
|
|
263
|
+
height: 1fr;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
ToolConfigsScreen .browser-widget {
|
|
267
|
+
height: 100%;
|
|
268
|
+
width: 100%;
|
|
269
|
+
}
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
# Screen-specific bindings (Ctrl+ prefixed)
|
|
273
|
+
# NavScreen.BINDINGS provides global navigation (c, a, t, s, m, d, g, ?)
|
|
274
|
+
BINDINGS = NavScreen.BINDINGS + [
|
|
275
|
+
Binding("ctrl+f", "focus_search", "Search", show=True),
|
|
276
|
+
Binding("ctrl+r", "refresh", "Refresh", show=True),
|
|
277
|
+
Binding("ctrl+y", "copy_name", "Copy Name", show=True),
|
|
278
|
+
Binding("ctrl+n", "new_config", "New", show=True),
|
|
279
|
+
Binding("ctrl+e", "edit_config", "Edit", show=True),
|
|
280
|
+
Binding("ctrl+d", "delete_config", "Delete", show=True),
|
|
281
|
+
Binding("escape", "focus_table", "Focus List", show=False),
|
|
282
|
+
Binding("enter", "copy_name", "Copy Name", show=False),
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
def compose_content(self) -> ComposeResult:
|
|
286
|
+
"""Compose the screen content."""
|
|
287
|
+
yield ToolConfigsWidget(id="tool-configs-widget")
|
|
288
|
+
|
|
289
|
+
def on_screen_resume(self) -> None:
|
|
290
|
+
"""Focus the data table when screen becomes active."""
|
|
291
|
+
self.call_after_refresh(self._focus_table)
|
|
292
|
+
|
|
293
|
+
def _focus_table(self) -> None:
|
|
294
|
+
"""Focus the data table."""
|
|
295
|
+
try:
|
|
296
|
+
widget = self.query_one("#tool-configs-widget", ToolConfigsWidget)
|
|
297
|
+
widget.focus_table()
|
|
298
|
+
except Exception:
|
|
299
|
+
pass
|
|
300
|
+
|
|
301
|
+
def _get_widget(self) -> ToolConfigsWidget:
|
|
302
|
+
"""Get the tool configs widget."""
|
|
303
|
+
return self.query_one("#tool-configs-widget", ToolConfigsWidget)
|
|
304
|
+
|
|
305
|
+
# =========================================================================
|
|
306
|
+
# Actions (keybinding handlers)
|
|
307
|
+
# =========================================================================
|
|
308
|
+
|
|
309
|
+
def action_focus_search(self) -> None:
|
|
310
|
+
"""Focus the search input."""
|
|
311
|
+
self._get_widget().focus_search()
|
|
312
|
+
|
|
313
|
+
def action_focus_table(self) -> None:
|
|
314
|
+
"""Focus the data table."""
|
|
315
|
+
self._get_widget().focus_table()
|
|
316
|
+
|
|
317
|
+
def action_refresh(self) -> None:
|
|
318
|
+
"""Refresh the current search results."""
|
|
319
|
+
self._get_widget().refresh_data()
|
|
320
|
+
|
|
321
|
+
def action_copy_name(self) -> None:
|
|
322
|
+
"""Copy the tool config name to clipboard."""
|
|
323
|
+
self._get_widget().copy_config_name()
|
|
324
|
+
|
|
325
|
+
def action_new_config(self) -> None:
|
|
326
|
+
"""Open the tool config creation modal."""
|
|
327
|
+
self._get_widget().open_new_modal()
|
|
328
|
+
|
|
329
|
+
def action_edit_config(self) -> None:
|
|
330
|
+
"""Open the tool config update modal."""
|
|
331
|
+
self._get_widget().open_edit_modal()
|
|
332
|
+
|
|
333
|
+
def action_delete_config(self) -> None:
|
|
334
|
+
"""Delete the selected tool config."""
|
|
335
|
+
self._get_widget().delete_selected()
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""Agent creation modal for creating new agents.
|
|
2
|
+
|
|
3
|
+
Provides a comprehensive modal screen that allows users to create a new agent
|
|
4
|
+
with all required fields: name, models, tags, and optional configuration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from alloy_runtime_sdk.api_client.client import ApiClient
|
|
10
|
+
from alloy_runtime_types.dtos.agents import CreateAgentRequest
|
|
11
|
+
|
|
12
|
+
from cli.infrastructure.forms.agent_picker import AgentPicker
|
|
13
|
+
from cli.infrastructure.forms.schema_picker import SchemaPicker
|
|
14
|
+
from cli.infrastructure.forms.tag_picker import TagPicker
|
|
15
|
+
from cli.infrastructure.forms.template_picker import TemplatePicker
|
|
16
|
+
from cli.tui.widgets.agent_form_modal import AgentFormModal, AgentFormResult
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AgentCreateModal(AgentFormModal):
|
|
20
|
+
"""Modal for creating a new agent.
|
|
21
|
+
|
|
22
|
+
Provides a comprehensive form with:
|
|
23
|
+
- Required fields: name, models, tags
|
|
24
|
+
- Basic info: description, scope, base agent
|
|
25
|
+
- System instruction: template picker
|
|
26
|
+
- Schemas: input/output schema pickers or inline JSON schema builder
|
|
27
|
+
- Generation parameters: temperature, max_tokens, etc.
|
|
28
|
+
- Advanced: default headers with quick-add buttons
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
def on_agent_created(result: AgentCreateResult | None):
|
|
32
|
+
if result is not None:
|
|
33
|
+
self.notify(f"Created agent: {result.agent_name}")
|
|
34
|
+
self._do_search("") # Refresh list
|
|
35
|
+
|
|
36
|
+
client = await self.app.store.get_client()
|
|
37
|
+
self.app.push_screen(
|
|
38
|
+
AgentCreateModal(client=client),
|
|
39
|
+
on_agent_created
|
|
40
|
+
)
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
client: ApiClient,
|
|
46
|
+
**kwargs: Any,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Initialize the agent creation modal.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
client: ApiClient instance for API calls
|
|
52
|
+
"""
|
|
53
|
+
super().__init__(client=client, **kwargs)
|
|
54
|
+
|
|
55
|
+
def _get_modal_title(self) -> str:
|
|
56
|
+
"""Return the modal title."""
|
|
57
|
+
return "Create New Agent"
|
|
58
|
+
|
|
59
|
+
def _get_submit_button_text(self) -> str:
|
|
60
|
+
"""Return the submit button text."""
|
|
61
|
+
return "Create Agent"
|
|
62
|
+
|
|
63
|
+
def _is_scope_editable(self) -> bool:
|
|
64
|
+
"""Return whether the scope can be changed."""
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
async def _submit_form(self) -> AgentFormResult:
|
|
68
|
+
"""Submit the form to create a new agent."""
|
|
69
|
+
request = self._build_create_request()
|
|
70
|
+
response = await self._client.create_agent(request)
|
|
71
|
+
|
|
72
|
+
return AgentFormResult(
|
|
73
|
+
agent_id=str(response.id),
|
|
74
|
+
agent_name=response.name,
|
|
75
|
+
is_update=False,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def _build_create_request(self) -> CreateAgentRequest:
|
|
79
|
+
"""Build the CreateAgentRequest from form fields."""
|
|
80
|
+
from textual.widgets import Input, TextArea
|
|
81
|
+
|
|
82
|
+
# Required: name
|
|
83
|
+
name = self.query_one("#name-input", Input).value.strip()
|
|
84
|
+
|
|
85
|
+
# Required: models
|
|
86
|
+
model_configs = self._build_model_configs()
|
|
87
|
+
|
|
88
|
+
# Required for non-global: tags
|
|
89
|
+
tag_picker = self.query_one("#tag-picker", TagPicker)
|
|
90
|
+
tags = tag_picker.selected_tags
|
|
91
|
+
|
|
92
|
+
# Basic info
|
|
93
|
+
description = self.query_one("#description-input", Input).value.strip() or None
|
|
94
|
+
scope = self._get_scope()
|
|
95
|
+
|
|
96
|
+
# Base agent
|
|
97
|
+
base_agent_picker = self.query_one("#base-agent-picker", AgentPicker)
|
|
98
|
+
base_agent_id = self._parse_uuid(
|
|
99
|
+
base_agent_picker.selected_agent_id, "Base Agent"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# System instruction template
|
|
103
|
+
template_picker = self.query_one("#system-template-picker", TemplatePicker)
|
|
104
|
+
system_instruction_version_id = self._parse_uuid(
|
|
105
|
+
template_picker.selected_id, "System Template"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Schemas
|
|
109
|
+
output_schema_picker = self.query_one("#output-schema-picker", SchemaPicker)
|
|
110
|
+
output_schema_id = self._parse_uuid(
|
|
111
|
+
output_schema_picker.selected_id, "Output Schema"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Output schema from JSON builder
|
|
115
|
+
output_schema = self._get_output_schema()
|
|
116
|
+
|
|
117
|
+
# Generation parameters
|
|
118
|
+
gen_params = self._build_generation_params()
|
|
119
|
+
|
|
120
|
+
# Advanced: default headers
|
|
121
|
+
default_headers = self._parse_json(
|
|
122
|
+
self.query_one("#default-headers-textarea", TextArea).text,
|
|
123
|
+
"Default Headers",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
return CreateAgentRequest(
|
|
127
|
+
name=name,
|
|
128
|
+
models=model_configs,
|
|
129
|
+
tags=tags,
|
|
130
|
+
scope=scope,
|
|
131
|
+
base_agent_id=base_agent_id,
|
|
132
|
+
description=description,
|
|
133
|
+
system_instruction_version_id=system_instruction_version_id,
|
|
134
|
+
output_schema_id=output_schema_id,
|
|
135
|
+
output_schema=output_schema,
|
|
136
|
+
default_request_headers=default_headers,
|
|
137
|
+
generation_params=gen_params,
|
|
138
|
+
tools=self._build_tools(),
|
|
139
|
+
)
|