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,10 @@
|
|
|
1
|
+
"""Presenter for tag delete command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.tags import DeleteTagResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_delete_result(response: DeleteTagResponse) -> None:
|
|
8
|
+
"""Present tag deletion result."""
|
|
9
|
+
output = OutputService.get()
|
|
10
|
+
output.success(f"Deleted tag: {response.deleted_tag.tag_path}")
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Tags get command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
import typer
|
|
5
|
+
|
|
6
|
+
from cli.commands.tags.get.presenter import present_tag_details
|
|
7
|
+
from cli.commands.flag_utils import validate_uuid
|
|
8
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def tags_get_command(
|
|
12
|
+
tag_id: str = typer.Argument(
|
|
13
|
+
...,
|
|
14
|
+
help="Tag UUID",
|
|
15
|
+
),
|
|
16
|
+
) -> None:
|
|
17
|
+
"""Get details of a single tag.
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
ai tags get 123e4567-89ab-cdef-0123-456789abcdef
|
|
21
|
+
"""
|
|
22
|
+
tag_uuid = validate_uuid(tag_id, "tag")
|
|
23
|
+
_execute_get(tag_id=tag_uuid)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@async_command
|
|
27
|
+
async def _execute_get(tag_id: UUID) -> None:
|
|
28
|
+
async with authenticated_client() as (_config, client):
|
|
29
|
+
response = await client.get_tag(tag_id)
|
|
30
|
+
|
|
31
|
+
present_tag_details(response)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Presenter for tags get command output."""
|
|
2
|
+
|
|
3
|
+
from rich.table import Table
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from alloy_runtime_types.dtos.tags import GetTagResponse
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_tag_details(response: GetTagResponse) -> None:
|
|
10
|
+
output = OutputService.get()
|
|
11
|
+
|
|
12
|
+
output.success(f"Retrieved tag: {response.tag.tag_path}")
|
|
13
|
+
|
|
14
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
15
|
+
table.add_column("Field", style="dim", width=20)
|
|
16
|
+
table.add_column("Value")
|
|
17
|
+
|
|
18
|
+
table.add_row("ID", str(response.tag.id))
|
|
19
|
+
table.add_row("Tag Path", response.tag.tag_path)
|
|
20
|
+
table.add_row("Display Name", response.tag.display_name or "-")
|
|
21
|
+
table.add_row("Description", response.tag.description or "-")
|
|
22
|
+
|
|
23
|
+
output.console.print(table)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Tags list command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.tags.list.presenter import present_tags_list
|
|
8
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def tags_list_command(
|
|
12
|
+
search: Optional[str] = typer.Option(
|
|
13
|
+
None,
|
|
14
|
+
"-s",
|
|
15
|
+
"--search",
|
|
16
|
+
help="Fuzzy search terms",
|
|
17
|
+
),
|
|
18
|
+
limit: int = typer.Option(
|
|
19
|
+
50,
|
|
20
|
+
"-l",
|
|
21
|
+
"--limit",
|
|
22
|
+
min=1,
|
|
23
|
+
max=100,
|
|
24
|
+
help="Max results",
|
|
25
|
+
),
|
|
26
|
+
offset: int = typer.Option(
|
|
27
|
+
0,
|
|
28
|
+
"--offset",
|
|
29
|
+
min=0,
|
|
30
|
+
help="Skip N results",
|
|
31
|
+
),
|
|
32
|
+
) -> None:
|
|
33
|
+
"""List tags in your organization.
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
ai tags list
|
|
37
|
+
ai tags list -s "marketing"
|
|
38
|
+
"""
|
|
39
|
+
_execute_list(search=search, limit=limit, offset=offset)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@async_command
|
|
43
|
+
async def _execute_list(search: Optional[str], limit: int, offset: int) -> None:
|
|
44
|
+
"""Execute list tags operation."""
|
|
45
|
+
async with authenticated_client() as (_config, client):
|
|
46
|
+
response = await client.list_tags(
|
|
47
|
+
search=search,
|
|
48
|
+
limit=limit,
|
|
49
|
+
offset=offset,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
present_tags_list(response)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Presenter for tags list command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.tags import ListTagsResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_tags_list(response: ListTagsResponse) -> None:
|
|
10
|
+
"""Present list of tags with Rich table formatting."""
|
|
11
|
+
output = OutputService.get()
|
|
12
|
+
|
|
13
|
+
if not response.tags:
|
|
14
|
+
output.info("No tags found")
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
columns = [
|
|
18
|
+
ColumnConfig(
|
|
19
|
+
source_field="id",
|
|
20
|
+
header_label="ID",
|
|
21
|
+
compact_line=1,
|
|
22
|
+
compact_style="cyan",
|
|
23
|
+
),
|
|
24
|
+
ColumnConfig(
|
|
25
|
+
source_field="tag_path",
|
|
26
|
+
header_label="Path",
|
|
27
|
+
compact_line=1,
|
|
28
|
+
compact_style="green",
|
|
29
|
+
),
|
|
30
|
+
ColumnConfig(
|
|
31
|
+
source_field="display_name",
|
|
32
|
+
header_label="Display Name",
|
|
33
|
+
compact_line=2,
|
|
34
|
+
compact_style="white bold",
|
|
35
|
+
),
|
|
36
|
+
ColumnConfig(
|
|
37
|
+
source_field="description",
|
|
38
|
+
header_label="Description",
|
|
39
|
+
formatter=lambda x: x[:60] + "..." if x and len(x) > 60 else (x or "-"),
|
|
40
|
+
compact_line=2,
|
|
41
|
+
compact_style="dim",
|
|
42
|
+
),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
output.table(
|
|
46
|
+
items=response.tags, # type: ignore[arg-type]
|
|
47
|
+
title=f"Tags ({response.total})",
|
|
48
|
+
columns=columns,
|
|
49
|
+
)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Tags update command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.tags.update.presenter import present_update_result
|
|
9
|
+
from cli.commands.flag_utils import validate_uuid, require_update_flags
|
|
10
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
11
|
+
from alloy_runtime_types.dtos.tags import UpdateTagRequest
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def tags_update_command(
|
|
15
|
+
tag_id: str = typer.Argument(
|
|
16
|
+
...,
|
|
17
|
+
help="Tag UUID",
|
|
18
|
+
),
|
|
19
|
+
display_name: Optional[str] = typer.Option(
|
|
20
|
+
None,
|
|
21
|
+
"-n",
|
|
22
|
+
"--display-name",
|
|
23
|
+
help="New display name",
|
|
24
|
+
),
|
|
25
|
+
description: Optional[str] = typer.Option(
|
|
26
|
+
None,
|
|
27
|
+
"-d",
|
|
28
|
+
"--description",
|
|
29
|
+
help="New description",
|
|
30
|
+
),
|
|
31
|
+
) -> None:
|
|
32
|
+
"""Update a tag's display name or description.
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
ai tags update 123e4567-89ab... -n "New Name"
|
|
36
|
+
ai tags update 123e4567-89ab... -d "New description"
|
|
37
|
+
"""
|
|
38
|
+
require_update_flags(
|
|
39
|
+
("--display-name", display_name),
|
|
40
|
+
("--description", description),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
tag_uuid = validate_uuid(tag_id, "tag")
|
|
44
|
+
_execute_update(
|
|
45
|
+
tag_id=tag_uuid,
|
|
46
|
+
display_name=display_name,
|
|
47
|
+
description=description,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@async_command
|
|
52
|
+
async def _execute_update(
|
|
53
|
+
tag_id: UUID,
|
|
54
|
+
display_name: Optional[str],
|
|
55
|
+
description: Optional[str],
|
|
56
|
+
) -> None:
|
|
57
|
+
request = UpdateTagRequest(
|
|
58
|
+
display_name=display_name,
|
|
59
|
+
description=description,
|
|
60
|
+
)
|
|
61
|
+
async with authenticated_client() as (_config, client):
|
|
62
|
+
response = await client.update_tag(tag_id, request)
|
|
63
|
+
|
|
64
|
+
present_update_result(response)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Presenter for tags update command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.tags import UpdateTagResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_update_result(response: UpdateTagResponse) -> None:
|
|
8
|
+
output = OutputService.get()
|
|
9
|
+
output.success(f"Updated tag: {response.tag.tag_path}")
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Template create command implementation."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.flag_utils import (
|
|
9
|
+
parse_tags_required,
|
|
10
|
+
require_one_of,
|
|
11
|
+
validate_template_content_type,
|
|
12
|
+
validate_visibility,
|
|
13
|
+
)
|
|
14
|
+
from cli.commands.templates.create.presenter import present_template_create_success
|
|
15
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
16
|
+
from cli.infrastructure.file_content import FileContentError, resolve_content
|
|
17
|
+
from alloy_runtime_types.dtos.templates import CreateTemplateRequest
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def templates_create_command(
|
|
21
|
+
name: str = typer.Option(
|
|
22
|
+
...,
|
|
23
|
+
"-n",
|
|
24
|
+
"--name",
|
|
25
|
+
help="Template name",
|
|
26
|
+
),
|
|
27
|
+
content_type: str = typer.Option(
|
|
28
|
+
...,
|
|
29
|
+
"--type",
|
|
30
|
+
help="Type: system_instruction, user_message, fragment",
|
|
31
|
+
),
|
|
32
|
+
visibility: str = typer.Option(
|
|
33
|
+
...,
|
|
34
|
+
"-V",
|
|
35
|
+
"--visibility",
|
|
36
|
+
help="Visibility: private, organization, public",
|
|
37
|
+
),
|
|
38
|
+
tags: str = typer.Option(
|
|
39
|
+
...,
|
|
40
|
+
"-t",
|
|
41
|
+
"--tags",
|
|
42
|
+
help="Comma-separated tags",
|
|
43
|
+
),
|
|
44
|
+
content_file: Optional[Path] = typer.Option(
|
|
45
|
+
None,
|
|
46
|
+
"-f",
|
|
47
|
+
"--file",
|
|
48
|
+
help="Read content from file",
|
|
49
|
+
exists=True,
|
|
50
|
+
readable=True,
|
|
51
|
+
),
|
|
52
|
+
content: Optional[str] = typer.Option(
|
|
53
|
+
None,
|
|
54
|
+
"-c",
|
|
55
|
+
"--content",
|
|
56
|
+
help="Inline content (or @file)",
|
|
57
|
+
),
|
|
58
|
+
description: Optional[str] = typer.Option(
|
|
59
|
+
None,
|
|
60
|
+
"-d",
|
|
61
|
+
"--description",
|
|
62
|
+
help="Template description",
|
|
63
|
+
),
|
|
64
|
+
upsert: bool = typer.Option(
|
|
65
|
+
False,
|
|
66
|
+
"--upsert",
|
|
67
|
+
help="Return existing if name exists",
|
|
68
|
+
),
|
|
69
|
+
escape_jinja: bool = typer.Option(
|
|
70
|
+
False,
|
|
71
|
+
"--escape-jinja",
|
|
72
|
+
help="Escape Jinja syntax as literals",
|
|
73
|
+
),
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Create a new template.
|
|
76
|
+
|
|
77
|
+
Examples:
|
|
78
|
+
ai templates create -n my-template --type system_instruction -V private -f template.jinja2 -t "email"
|
|
79
|
+
ai templates create -n greeting --type fragment -V private -c "Hello, {{ name }}!" -t "greeting"
|
|
80
|
+
ai tpl create -n email.header --type fragment -V organization -f header.jinja2 -d "Email header" -t "email,header"
|
|
81
|
+
"""
|
|
82
|
+
require_one_of(("--file", content_file), ("--content", content))
|
|
83
|
+
|
|
84
|
+
_execute_create_from_flags(
|
|
85
|
+
name=name,
|
|
86
|
+
content_type=content_type,
|
|
87
|
+
visibility=visibility,
|
|
88
|
+
content_file=content_file,
|
|
89
|
+
content=content,
|
|
90
|
+
description=description,
|
|
91
|
+
tags=tags,
|
|
92
|
+
upsert=upsert,
|
|
93
|
+
escape_jinja=escape_jinja,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@async_command
|
|
98
|
+
async def _execute_create(request: CreateTemplateRequest) -> None:
|
|
99
|
+
"""Execute the template creation with the given request."""
|
|
100
|
+
async with authenticated_client() as (_config, client):
|
|
101
|
+
response = await client.create_template(request)
|
|
102
|
+
|
|
103
|
+
present_template_create_success(response)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _execute_create_from_flags(
|
|
107
|
+
name: str,
|
|
108
|
+
content_type: str,
|
|
109
|
+
visibility: str,
|
|
110
|
+
content_file: Optional[Path],
|
|
111
|
+
content: Optional[str],
|
|
112
|
+
description: Optional[str],
|
|
113
|
+
tags: str,
|
|
114
|
+
upsert: bool,
|
|
115
|
+
escape_jinja: bool,
|
|
116
|
+
) -> None:
|
|
117
|
+
"""Build and execute template creation from command flags."""
|
|
118
|
+
# Resolve @file references in content
|
|
119
|
+
try:
|
|
120
|
+
content = resolve_content(content)
|
|
121
|
+
except FileContentError as e:
|
|
122
|
+
raise typer.BadParameter(str(e))
|
|
123
|
+
|
|
124
|
+
# Validate enums
|
|
125
|
+
content_type_enum = validate_template_content_type(content_type)
|
|
126
|
+
visibility_enum = validate_visibility(visibility)
|
|
127
|
+
|
|
128
|
+
# Get content from file or inline
|
|
129
|
+
if content_file:
|
|
130
|
+
template_content = content_file.read_text()
|
|
131
|
+
else:
|
|
132
|
+
template_content = content or ""
|
|
133
|
+
|
|
134
|
+
if not template_content.strip():
|
|
135
|
+
raise typer.BadParameter("Template content cannot be empty")
|
|
136
|
+
|
|
137
|
+
# Parse tags
|
|
138
|
+
tag_paths = parse_tags_required(tags)
|
|
139
|
+
|
|
140
|
+
# Build request
|
|
141
|
+
request = CreateTemplateRequest(
|
|
142
|
+
name=name,
|
|
143
|
+
content_type=content_type_enum,
|
|
144
|
+
visibility=visibility_enum,
|
|
145
|
+
initial_content=template_content,
|
|
146
|
+
tag_paths=tag_paths,
|
|
147
|
+
description=description,
|
|
148
|
+
upsert=upsert,
|
|
149
|
+
escape_jinja=escape_jinja,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
_execute_create(request)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Presenter for template creation output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
from rich.text import Text
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.formatting.fields import (
|
|
8
|
+
format_datetime,
|
|
9
|
+
format_optional,
|
|
10
|
+
format_uuid,
|
|
11
|
+
)
|
|
12
|
+
from cli.infrastructure.output import OutputService
|
|
13
|
+
from alloy_runtime_types.dtos.templates import CreateTemplateResponse
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def present_template_create_success(response: CreateTemplateResponse) -> None:
|
|
17
|
+
"""Present successful template creation.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
response: Template creation response from server
|
|
21
|
+
"""
|
|
22
|
+
output = OutputService.get()
|
|
23
|
+
|
|
24
|
+
template = response.template
|
|
25
|
+
version = response.version
|
|
26
|
+
dependencies = response.dependencies
|
|
27
|
+
|
|
28
|
+
output.success("Template created successfully")
|
|
29
|
+
|
|
30
|
+
# Build a table for template display
|
|
31
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
32
|
+
table.add_column("Field", style="dim")
|
|
33
|
+
table.add_column("Value")
|
|
34
|
+
|
|
35
|
+
# Template info
|
|
36
|
+
table.add_row("ID", format_uuid(template.id, short=False))
|
|
37
|
+
table.add_row("Name", template.name)
|
|
38
|
+
table.add_row("Content Type", template.content_type_id)
|
|
39
|
+
table.add_row("Visibility", template.visibility_id)
|
|
40
|
+
table.add_row("Description", format_optional(template.description))
|
|
41
|
+
|
|
42
|
+
# Version info
|
|
43
|
+
table.add_row("Version", str(version.version))
|
|
44
|
+
table.add_row("Version ID", format_uuid(version.id, short=True))
|
|
45
|
+
table.add_row("Content Length", f"{len(version.content)} chars")
|
|
46
|
+
|
|
47
|
+
# Tags
|
|
48
|
+
if template.tags:
|
|
49
|
+
tag_str = ", ".join(t.tag_path for t in template.tags)
|
|
50
|
+
table.add_row("Tags", tag_str)
|
|
51
|
+
else:
|
|
52
|
+
table.add_row("Tags", "(none)")
|
|
53
|
+
|
|
54
|
+
# Dependencies
|
|
55
|
+
if dependencies:
|
|
56
|
+
dep_str = ", ".join(d.child_template_name for d in dependencies)
|
|
57
|
+
table.add_row("Dependencies", dep_str)
|
|
58
|
+
else:
|
|
59
|
+
table.add_row("Dependencies", "(none)")
|
|
60
|
+
|
|
61
|
+
# Ownership
|
|
62
|
+
table.add_row(
|
|
63
|
+
"Organization ID",
|
|
64
|
+
format_optional(template.organization_id, lambda x: format_uuid(x, short=True)),
|
|
65
|
+
)
|
|
66
|
+
table.add_row(
|
|
67
|
+
"User ID",
|
|
68
|
+
format_optional(template.user_id, lambda x: format_uuid(x, short=True)),
|
|
69
|
+
)
|
|
70
|
+
table.add_row("Created At", format_datetime(template.created_at))
|
|
71
|
+
|
|
72
|
+
panel = Panel(table, title=f"Template: {template.name}", border_style="green")
|
|
73
|
+
output.console.print(panel)
|
|
74
|
+
|
|
75
|
+
# Show content preview
|
|
76
|
+
if version.content:
|
|
77
|
+
content_preview = version.content
|
|
78
|
+
if len(content_preview) > 500:
|
|
79
|
+
content_preview = content_preview[:500] + "\n... (truncated)"
|
|
80
|
+
|
|
81
|
+
content_panel = Panel(
|
|
82
|
+
Text(content_preview, style="dim"),
|
|
83
|
+
title="Content Preview",
|
|
84
|
+
border_style="blue",
|
|
85
|
+
)
|
|
86
|
+
output.console.print(content_panel)
|
|
File without changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Templates delete command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.templates.delete.presenter import present_delete_result
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
from cli.infrastructure.console import Confirm
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def templates_delete_command(
|
|
11
|
+
template: str = typer.Argument(
|
|
12
|
+
...,
|
|
13
|
+
help="Template name or UUID",
|
|
14
|
+
),
|
|
15
|
+
yes: bool = typer.Option(
|
|
16
|
+
False,
|
|
17
|
+
"-y",
|
|
18
|
+
"--yes",
|
|
19
|
+
help="Skip confirmation",
|
|
20
|
+
),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Delete a template.
|
|
23
|
+
|
|
24
|
+
Permanently removes the template and all versions.
|
|
25
|
+
Templates referenced by others cannot be deleted.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai templates delete my-template
|
|
29
|
+
ai tpl delete email.welcome -y
|
|
30
|
+
"""
|
|
31
|
+
_execute_delete(template_identifier=template, skip_confirm=yes)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@async_command
|
|
35
|
+
async def _execute_delete(template_identifier: str, skip_confirm: bool) -> None:
|
|
36
|
+
"""Execute delete template operation."""
|
|
37
|
+
if not skip_confirm:
|
|
38
|
+
confirmed = Confirm.ask(
|
|
39
|
+
f"[yellow]Delete template '{template_identifier}'?[/yellow] This cannot be undone"
|
|
40
|
+
)
|
|
41
|
+
if not confirmed:
|
|
42
|
+
raise typer.Abort()
|
|
43
|
+
|
|
44
|
+
async with authenticated_client() as (_config, client):
|
|
45
|
+
response = await client.delete_template(template_identifier)
|
|
46
|
+
|
|
47
|
+
present_delete_result(response)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Presenter for template delete command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.templates import DeleteTemplateResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_delete_result(response: DeleteTemplateResponse) -> None:
|
|
8
|
+
"""Present template deletion result.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
response: DeleteTemplateResponse from server
|
|
12
|
+
"""
|
|
13
|
+
output = OutputService.get()
|
|
14
|
+
deleted = response.deleted_template
|
|
15
|
+
|
|
16
|
+
output.success(f"Template '{deleted.name}' deleted successfully")
|
|
File without changes
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Templates get command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.templates.get.presenter import present_template_details
|
|
8
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def templates_get_command(
|
|
12
|
+
template: str = typer.Argument(
|
|
13
|
+
...,
|
|
14
|
+
help="Template name or UUID",
|
|
15
|
+
),
|
|
16
|
+
version: Optional[int] = typer.Option(
|
|
17
|
+
None,
|
|
18
|
+
"--version",
|
|
19
|
+
min=1,
|
|
20
|
+
help="Specific version number",
|
|
21
|
+
),
|
|
22
|
+
full: bool = typer.Option(
|
|
23
|
+
False,
|
|
24
|
+
"--full",
|
|
25
|
+
help="Show full content (no truncation)",
|
|
26
|
+
),
|
|
27
|
+
copy: bool = typer.Option(
|
|
28
|
+
False,
|
|
29
|
+
"--copy",
|
|
30
|
+
help="Copy content to clipboard",
|
|
31
|
+
),
|
|
32
|
+
) -> None:
|
|
33
|
+
"""Get template details.
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
ai templates get my-template
|
|
37
|
+
ai tpl get email.welcome --version 2
|
|
38
|
+
ai tpl get my-template --full
|
|
39
|
+
ai tpl get my-template --copy
|
|
40
|
+
"""
|
|
41
|
+
_execute_get(template_identifier=template, version=version, full=full, copy=copy)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@async_command
|
|
45
|
+
async def _execute_get(
|
|
46
|
+
template_identifier: str, version: Optional[int], full: bool, copy: bool
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Execute get template operation."""
|
|
49
|
+
async with authenticated_client() as (_config, client):
|
|
50
|
+
response = await client.get_template(template_identifier, version)
|
|
51
|
+
|
|
52
|
+
present_template_details(response, full=full, copy=copy)
|