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,233 @@
|
|
|
1
|
+
"""Presenter for template get command output."""
|
|
2
|
+
|
|
3
|
+
import pyperclip
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
from rich.panel import Panel
|
|
6
|
+
from rich.table import Table
|
|
7
|
+
from rich.text import Text
|
|
8
|
+
|
|
9
|
+
from cli.infrastructure.formatting.fields import (
|
|
10
|
+
format_datetime,
|
|
11
|
+
format_optional,
|
|
12
|
+
format_uuid,
|
|
13
|
+
)
|
|
14
|
+
from cli.infrastructure.output import OutputService
|
|
15
|
+
from alloy_runtime_types.dtos.templates import (
|
|
16
|
+
GetTemplateResponse,
|
|
17
|
+
TagResponse,
|
|
18
|
+
TemplateDependencyResponse,
|
|
19
|
+
TemplateVersionResponse,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _format_tags(tags: list[TagResponse]) -> str:
|
|
24
|
+
"""Format tags for display.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
tags: List of tag responses
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Formatted tags string or "(none)" if empty
|
|
31
|
+
"""
|
|
32
|
+
if not tags:
|
|
33
|
+
return "(none)"
|
|
34
|
+
return ", ".join(t.tag_path for t in tags)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _format_dependencies(dependencies: list[TemplateDependencyResponse]) -> str:
|
|
38
|
+
"""Format dependencies for display.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
dependencies: List of dependency responses
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Formatted dependencies string or "(none)" if empty
|
|
45
|
+
"""
|
|
46
|
+
if not dependencies:
|
|
47
|
+
return "(none)"
|
|
48
|
+
return ", ".join(d.child_template_name for d in dependencies)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _format_variables(variables: list[str]) -> str:
|
|
52
|
+
"""Format required variables for display.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
variables: List of variable names
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
Formatted variables string or "(none)" if empty
|
|
59
|
+
"""
|
|
60
|
+
if not variables:
|
|
61
|
+
return "(none)"
|
|
62
|
+
return ", ".join(variables)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _truncate_content(content: str, max_length: int = 500) -> str:
|
|
66
|
+
"""Truncate content for preview display.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
content: Content string to truncate
|
|
70
|
+
max_length: Maximum length before truncation
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Truncated content with indicator if truncated
|
|
74
|
+
"""
|
|
75
|
+
if len(content) <= max_length:
|
|
76
|
+
return content
|
|
77
|
+
return content[:max_length] + "\n... (truncated)"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _copy_to_clipboard(content: str, console: Console) -> bool:
|
|
81
|
+
"""Copy content to clipboard.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
content: Text to copy
|
|
85
|
+
console: Console for output messages
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
True if successful, False otherwise
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
pyperclip.copy(content)
|
|
92
|
+
console.print("[green]✓[/green] Content copied to clipboard")
|
|
93
|
+
return True
|
|
94
|
+
except pyperclip.PyperclipException as e:
|
|
95
|
+
console.print(f"[red]✗[/red] Failed to copy to clipboard: {e}")
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def present_template_details(
|
|
100
|
+
response: GetTemplateResponse, full: bool = False, copy: bool = False
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Present template details with Rich formatting.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
response: GetTemplateResponse from server
|
|
106
|
+
full: Whether to print full content instead of preview
|
|
107
|
+
copy: Whether to copy content to clipboard
|
|
108
|
+
"""
|
|
109
|
+
output = OutputService.get()
|
|
110
|
+
template = response.template
|
|
111
|
+
versions = response.versions
|
|
112
|
+
dependencies = response.dependencies
|
|
113
|
+
|
|
114
|
+
# Find latest version for required variables
|
|
115
|
+
latest_version = next((v for v in versions if v.is_latest), None)
|
|
116
|
+
required_variables = latest_version.required_variables if latest_version else []
|
|
117
|
+
|
|
118
|
+
# Build metadata table
|
|
119
|
+
metadata_table = Table(show_header=False, box=None, padding=(0, 1))
|
|
120
|
+
metadata_table.add_column("Field", style="dim")
|
|
121
|
+
metadata_table.add_column("Value")
|
|
122
|
+
|
|
123
|
+
metadata_table.add_row("ID", format_uuid(template.id, short=False))
|
|
124
|
+
metadata_table.add_row("Name", template.name)
|
|
125
|
+
metadata_table.add_row("Content Type", template.content_type_id)
|
|
126
|
+
metadata_table.add_row("Visibility", template.visibility_id)
|
|
127
|
+
metadata_table.add_row("Description", format_optional(template.description))
|
|
128
|
+
metadata_table.add_row("Tags", _format_tags(template.tags))
|
|
129
|
+
metadata_table.add_row("Dependencies", _format_dependencies(dependencies))
|
|
130
|
+
metadata_table.add_row("Required Variables", _format_variables(required_variables))
|
|
131
|
+
metadata_table.add_row(
|
|
132
|
+
"Organization ID",
|
|
133
|
+
format_optional(template.organization_id, lambda x: format_uuid(x, short=True)),
|
|
134
|
+
)
|
|
135
|
+
metadata_table.add_row(
|
|
136
|
+
"User ID",
|
|
137
|
+
format_optional(template.user_id, lambda x: format_uuid(x, short=True)),
|
|
138
|
+
)
|
|
139
|
+
metadata_table.add_row("Created At", format_datetime(template.created_at))
|
|
140
|
+
metadata_table.add_row("Updated At", format_datetime(template.updated_at))
|
|
141
|
+
|
|
142
|
+
# Display metadata panel
|
|
143
|
+
metadata_panel = Panel(
|
|
144
|
+
metadata_table,
|
|
145
|
+
title=f"Template: {template.name}",
|
|
146
|
+
border_style="green",
|
|
147
|
+
)
|
|
148
|
+
output.console.print(metadata_panel)
|
|
149
|
+
|
|
150
|
+
# Build versions table
|
|
151
|
+
if versions:
|
|
152
|
+
_present_versions_table(output, versions)
|
|
153
|
+
|
|
154
|
+
# Handle content display based on flags
|
|
155
|
+
if latest_version and latest_version.content:
|
|
156
|
+
content = latest_version.content
|
|
157
|
+
|
|
158
|
+
# Copy to clipboard if requested
|
|
159
|
+
if copy:
|
|
160
|
+
_copy_to_clipboard(content, output.console)
|
|
161
|
+
|
|
162
|
+
# Show full content or preview
|
|
163
|
+
if full:
|
|
164
|
+
_present_full_content(output, latest_version)
|
|
165
|
+
else:
|
|
166
|
+
_present_content_preview(output, latest_version)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _present_versions_table(
|
|
170
|
+
output: OutputService, versions: list[TemplateVersionResponse]
|
|
171
|
+
) -> None:
|
|
172
|
+
"""Present versions as a table.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
output: OutputService instance
|
|
176
|
+
versions: List of template versions
|
|
177
|
+
"""
|
|
178
|
+
versions_table = Table(
|
|
179
|
+
title=f"Versions ({len(versions)})",
|
|
180
|
+
show_header=True,
|
|
181
|
+
header_style="bold",
|
|
182
|
+
)
|
|
183
|
+
versions_table.add_column("Version", justify="right")
|
|
184
|
+
versions_table.add_column("Latest")
|
|
185
|
+
versions_table.add_column("Content Length", justify="right")
|
|
186
|
+
versions_table.add_column("Variables")
|
|
187
|
+
versions_table.add_column("Created At")
|
|
188
|
+
|
|
189
|
+
for v in versions:
|
|
190
|
+
versions_table.add_row(
|
|
191
|
+
f"v{v.version}",
|
|
192
|
+
"Yes" if v.is_latest else "-",
|
|
193
|
+
f"{len(v.content)} chars",
|
|
194
|
+
_format_variables(v.required_variables) if v.is_latest else "-",
|
|
195
|
+
format_datetime(v.created_at),
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
output.console.print(versions_table)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _present_content_preview(
|
|
202
|
+
output: OutputService, version: TemplateVersionResponse
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Present content preview for a version.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
output: OutputService instance
|
|
208
|
+
version: Template version to preview
|
|
209
|
+
"""
|
|
210
|
+
content_preview = _truncate_content(version.content)
|
|
211
|
+
content_panel = Panel(
|
|
212
|
+
Text(content_preview, style="dim"),
|
|
213
|
+
title=f"Content Preview (v{version.version})",
|
|
214
|
+
border_style="blue",
|
|
215
|
+
)
|
|
216
|
+
output.console.print(content_panel)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _present_full_content(
|
|
220
|
+
output: OutputService, version: TemplateVersionResponse
|
|
221
|
+
) -> None:
|
|
222
|
+
"""Present full content for a version.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
output: OutputService instance
|
|
226
|
+
version: Template version to display
|
|
227
|
+
"""
|
|
228
|
+
content_panel = Panel(
|
|
229
|
+
Text(version.content),
|
|
230
|
+
title=f"Content (v{version.version}) - {len(version.content)} chars",
|
|
231
|
+
border_style="blue",
|
|
232
|
+
)
|
|
233
|
+
output.console.print(content_panel)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Templates get_by_version command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.templates.get_by_version.presenter import present_template_details
|
|
8
|
+
from cli.commands.flag_utils import validate_uuid
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def templates_get_by_version_command(
|
|
13
|
+
version_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Template version UUID",
|
|
16
|
+
),
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Get a template by its version ID.
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
ai templates get-by-version 123e4567-89ab-cdef-0123-456789abcdef
|
|
22
|
+
"""
|
|
23
|
+
version_uuid = validate_uuid(version_id, "template version")
|
|
24
|
+
_execute_get(version_id=version_uuid)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@async_command
|
|
28
|
+
async def _execute_get(version_id: UUID) -> None:
|
|
29
|
+
async with authenticated_client() as (_config, client):
|
|
30
|
+
response = await client.get_template_by_version(version_id)
|
|
31
|
+
|
|
32
|
+
present_template_details(response)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Presenter for templates get_by_version command output."""
|
|
2
|
+
|
|
3
|
+
from rich.table import Table
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from alloy_runtime_types.dtos.templates import GetTemplateResponse
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_template_details(response: GetTemplateResponse) -> None:
|
|
10
|
+
output = OutputService.get()
|
|
11
|
+
|
|
12
|
+
output.success(f"Retrieved template: {response.template.name}")
|
|
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.template.id))
|
|
19
|
+
table.add_row("Name", response.template.name)
|
|
20
|
+
table.add_row("Description", response.template.description or "-")
|
|
21
|
+
table.add_row("Content Type", response.template.content_type_id)
|
|
22
|
+
table.add_row("Visibility", response.template.visibility_id)
|
|
23
|
+
table.add_row(
|
|
24
|
+
"Tags",
|
|
25
|
+
", ".join(t.tag_path for t in response.template.tags)
|
|
26
|
+
if response.template.tags
|
|
27
|
+
else "-",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
output.console.print(table)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Templates list command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import validate_template_content_type, validate_visibility
|
|
8
|
+
from cli.commands.templates.list.presenter import present_templates_list
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
from alloy_runtime_types.enums.template_enums import (
|
|
11
|
+
TemplateContentType,
|
|
12
|
+
TemplateVisibility,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def templates_list_command(
|
|
17
|
+
search: Optional[str] = typer.Option(
|
|
18
|
+
None,
|
|
19
|
+
"-s",
|
|
20
|
+
"--search",
|
|
21
|
+
help="Fuzzy search terms",
|
|
22
|
+
),
|
|
23
|
+
content_type: Optional[str] = typer.Option(
|
|
24
|
+
None,
|
|
25
|
+
"--type",
|
|
26
|
+
help="Filter by type: system_instruction, user_message, fragment",
|
|
27
|
+
),
|
|
28
|
+
visibility: Optional[str] = typer.Option(
|
|
29
|
+
None,
|
|
30
|
+
"-V",
|
|
31
|
+
"--visibility",
|
|
32
|
+
help="Filter by: private, organization, public",
|
|
33
|
+
),
|
|
34
|
+
tag_path: Optional[str] = typer.Option(
|
|
35
|
+
None,
|
|
36
|
+
"-t",
|
|
37
|
+
"--tag",
|
|
38
|
+
help="Filter by tag pattern (e.g., '*.email.*')",
|
|
39
|
+
),
|
|
40
|
+
limit: int = typer.Option(
|
|
41
|
+
50,
|
|
42
|
+
"-l",
|
|
43
|
+
"--limit",
|
|
44
|
+
min=1,
|
|
45
|
+
max=100,
|
|
46
|
+
help="Max results",
|
|
47
|
+
),
|
|
48
|
+
cursor: Optional[str] = typer.Option(
|
|
49
|
+
None,
|
|
50
|
+
"--cursor",
|
|
51
|
+
help="Pagination cursor",
|
|
52
|
+
),
|
|
53
|
+
) -> None:
|
|
54
|
+
"""List templates.
|
|
55
|
+
|
|
56
|
+
Examples:
|
|
57
|
+
ai templates list
|
|
58
|
+
ai tpl list -s "email newsletter"
|
|
59
|
+
ai tpl list --type system_instruction
|
|
60
|
+
ai tpl list -V organization -t "*.email.*"
|
|
61
|
+
ai tpl list -l 20
|
|
62
|
+
"""
|
|
63
|
+
# Parse and validate enums
|
|
64
|
+
content_type_enum: Optional[TemplateContentType] = None
|
|
65
|
+
if content_type:
|
|
66
|
+
content_type_enum = validate_template_content_type(content_type)
|
|
67
|
+
|
|
68
|
+
visibility_enum: Optional[TemplateVisibility] = None
|
|
69
|
+
if visibility:
|
|
70
|
+
visibility_enum = validate_visibility(visibility)
|
|
71
|
+
|
|
72
|
+
_execute_list(
|
|
73
|
+
search=search,
|
|
74
|
+
content_type=content_type_enum,
|
|
75
|
+
visibility=visibility_enum,
|
|
76
|
+
tag_path=tag_path,
|
|
77
|
+
limit=limit,
|
|
78
|
+
cursor=cursor,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@async_command
|
|
83
|
+
async def _execute_list(
|
|
84
|
+
search: Optional[str],
|
|
85
|
+
content_type: Optional[TemplateContentType],
|
|
86
|
+
visibility: Optional[TemplateVisibility],
|
|
87
|
+
tag_path: Optional[str],
|
|
88
|
+
limit: int,
|
|
89
|
+
cursor: Optional[str],
|
|
90
|
+
) -> None:
|
|
91
|
+
"""Execute list templates operation."""
|
|
92
|
+
async with authenticated_client() as (_config, client):
|
|
93
|
+
response = await client.list_templates(
|
|
94
|
+
search=search,
|
|
95
|
+
content_type=content_type,
|
|
96
|
+
visibility=visibility,
|
|
97
|
+
tag_path=tag_path,
|
|
98
|
+
limit=limit,
|
|
99
|
+
cursor=cursor,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
present_templates_list(response)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Presenter for templates list command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.templates import ListTemplatesResponse, TagResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _format_tags(tags: list[TagResponse]) -> str:
|
|
10
|
+
"""Format tags for display, truncating if too many.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
tags: List of tag responses
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
Formatted tags string
|
|
17
|
+
"""
|
|
18
|
+
if not tags:
|
|
19
|
+
return "-"
|
|
20
|
+
tag_paths = [t.tag_path for t in tags[:3]]
|
|
21
|
+
result = ", ".join(tag_paths)
|
|
22
|
+
if len(tags) > 3:
|
|
23
|
+
result += f" (+{len(tags) - 3})"
|
|
24
|
+
return result
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def present_templates_list(response: ListTemplatesResponse) -> None:
|
|
28
|
+
"""Present list of templates with Rich table formatting.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
response: List templates response from server
|
|
32
|
+
"""
|
|
33
|
+
output = OutputService.get()
|
|
34
|
+
|
|
35
|
+
if not response.templates:
|
|
36
|
+
output.info("No templates found")
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
# Define table columns with compact layout configuration
|
|
40
|
+
# Line 1 (primary): ID, type, visibility, version - machine-readable data
|
|
41
|
+
# Line 2 (detail): Name, tags - human-readable content
|
|
42
|
+
columns = [
|
|
43
|
+
ColumnConfig(
|
|
44
|
+
source_field="id",
|
|
45
|
+
header_label="UUID",
|
|
46
|
+
compact_line=1,
|
|
47
|
+
compact_style="cyan",
|
|
48
|
+
),
|
|
49
|
+
ColumnConfig(
|
|
50
|
+
source_field="content_type_id",
|
|
51
|
+
header_label="Type",
|
|
52
|
+
compact_line=1,
|
|
53
|
+
compact_style="magenta",
|
|
54
|
+
),
|
|
55
|
+
ColumnConfig(
|
|
56
|
+
source_field="visibility_id",
|
|
57
|
+
header_label="Visibility",
|
|
58
|
+
compact_line=1,
|
|
59
|
+
compact_style="dim",
|
|
60
|
+
),
|
|
61
|
+
ColumnConfig(
|
|
62
|
+
source_field="latest_version_number",
|
|
63
|
+
header_label="Version",
|
|
64
|
+
formatter=lambda x: f"v{x}" if x else "-",
|
|
65
|
+
align="right",
|
|
66
|
+
compact_line=1,
|
|
67
|
+
compact_style="yellow",
|
|
68
|
+
),
|
|
69
|
+
ColumnConfig(
|
|
70
|
+
source_field="name",
|
|
71
|
+
header_label="Name",
|
|
72
|
+
compact_line=2,
|
|
73
|
+
compact_style="white bold",
|
|
74
|
+
),
|
|
75
|
+
ColumnConfig(
|
|
76
|
+
source_field="tags",
|
|
77
|
+
header_label="Tags",
|
|
78
|
+
formatter=_format_tags,
|
|
79
|
+
compact_line=2,
|
|
80
|
+
compact_style="dim italic",
|
|
81
|
+
),
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
# Render table
|
|
85
|
+
output.table(
|
|
86
|
+
items=response.templates, # type: ignore[arg-type]
|
|
87
|
+
title=f"Templates ({response.total_count})",
|
|
88
|
+
columns=columns,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Show pagination info if there's a next page
|
|
92
|
+
if response.cursor:
|
|
93
|
+
output.status(f"Next page: ai templates list --cursor '{response.cursor}'")
|
|
File without changes
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""Template render command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Any, Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import validate_output_mode
|
|
8
|
+
from cli.commands.templates.render.presenter import present_render_result
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
from cli.infrastructure.kv_parser import parse_kv_pairs
|
|
11
|
+
from alloy_runtime_types.dtos.templates import RenderTemplateRequest
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def templates_render_command(
|
|
15
|
+
template: str = typer.Option(
|
|
16
|
+
...,
|
|
17
|
+
"-T",
|
|
18
|
+
"--template",
|
|
19
|
+
help="Template name or UUID",
|
|
20
|
+
),
|
|
21
|
+
variables: Annotated[
|
|
22
|
+
Optional[list[str]],
|
|
23
|
+
typer.Option(
|
|
24
|
+
"-v",
|
|
25
|
+
"--var",
|
|
26
|
+
help="Variable (key=value or key:=json). Repeatable.",
|
|
27
|
+
),
|
|
28
|
+
] = None,
|
|
29
|
+
output: str = typer.Option(
|
|
30
|
+
"console",
|
|
31
|
+
"-o",
|
|
32
|
+
"--output",
|
|
33
|
+
help="Output: console, clipboard, file, editor",
|
|
34
|
+
),
|
|
35
|
+
output_file: Optional[str] = typer.Option(
|
|
36
|
+
None,
|
|
37
|
+
"-O",
|
|
38
|
+
"--output-file",
|
|
39
|
+
help="Output file path (for --output file)",
|
|
40
|
+
),
|
|
41
|
+
print_escaped: bool = typer.Option(
|
|
42
|
+
False,
|
|
43
|
+
"--print-escaped",
|
|
44
|
+
help="Print remaining Jinja syntax (from raw blocks)",
|
|
45
|
+
),
|
|
46
|
+
) -> None:
|
|
47
|
+
"""Render a template with variables.
|
|
48
|
+
|
|
49
|
+
Examples:
|
|
50
|
+
ai templates render -T my-template -v name=World -v greeting=Hello
|
|
51
|
+
ai tpl render -T email.welcome -v user=John -o clipboard
|
|
52
|
+
ai tpl render -T my-template -v count:=5 -v active:=true
|
|
53
|
+
ai tpl render -T my-template -o file -O output.txt
|
|
54
|
+
"""
|
|
55
|
+
validate_output_mode(
|
|
56
|
+
output, output_file, ("console", "clipboard", "file", "editor")
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
variables_dict = parse_kv_pairs(variables)
|
|
60
|
+
|
|
61
|
+
_execute_render_from_flags(
|
|
62
|
+
template_identifier=template,
|
|
63
|
+
variables_dict=variables_dict,
|
|
64
|
+
output_mode=output,
|
|
65
|
+
output_file=output_file,
|
|
66
|
+
print_escaped=print_escaped,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _execute_render_from_flags(
|
|
71
|
+
template_identifier: str,
|
|
72
|
+
variables_dict: dict[str, Any] | None,
|
|
73
|
+
output_mode: str,
|
|
74
|
+
output_file: str | None = None,
|
|
75
|
+
print_escaped: bool = False,
|
|
76
|
+
) -> None:
|
|
77
|
+
"""Execute template rendering from command flags."""
|
|
78
|
+
_execute_render(
|
|
79
|
+
template_identifier=template_identifier,
|
|
80
|
+
variables=variables_dict,
|
|
81
|
+
output_mode=output_mode,
|
|
82
|
+
output_file=output_file,
|
|
83
|
+
print_escaped=print_escaped,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@async_command
|
|
88
|
+
async def _execute_render(
|
|
89
|
+
template_identifier: str,
|
|
90
|
+
variables: dict[str, Any] | None,
|
|
91
|
+
output_mode: str,
|
|
92
|
+
output_file: str | None = None,
|
|
93
|
+
print_escaped: bool = False,
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Execute the template render API call."""
|
|
96
|
+
from alloy_runtime_sdk.exceptions.errors import NotFoundError
|
|
97
|
+
|
|
98
|
+
async with authenticated_client() as (_config, client):
|
|
99
|
+
try:
|
|
100
|
+
template_data = await client.get_template(template_identifier)
|
|
101
|
+
except NotFoundError:
|
|
102
|
+
raise typer.BadParameter(
|
|
103
|
+
f"Template '{template_identifier}' not found. Use 'ai templates list' to see available templates."
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
request = RenderTemplateRequest(variables=variables or {})
|
|
107
|
+
response = await client.render_template(template_data.template.id, request)
|
|
108
|
+
|
|
109
|
+
present_render_result(
|
|
110
|
+
response,
|
|
111
|
+
template_data.template.name,
|
|
112
|
+
output_mode,
|
|
113
|
+
output_file=output_file,
|
|
114
|
+
print_escaped=print_escaped,
|
|
115
|
+
)
|