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,366 @@
|
|
|
1
|
+
"""Shared flag validation and parsing utilities.
|
|
2
|
+
|
|
3
|
+
This module provides reusable validation functions for common flag patterns.
|
|
4
|
+
Import these in command handlers to avoid duplicating validation logic.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
from cli.commands.flag_utils import validate_provider, validate_uuid, parse_tags
|
|
8
|
+
|
|
9
|
+
def my_command(provider: str, id: str, tags: str | None) -> None:
|
|
10
|
+
provider_enum = validate_provider(provider)
|
|
11
|
+
uuid = validate_uuid(id, "resource")
|
|
12
|
+
tag_list = parse_tags(tags)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from uuid import UUID
|
|
16
|
+
|
|
17
|
+
import typer
|
|
18
|
+
|
|
19
|
+
from alloy_runtime_types.dtos.knowledge import (
|
|
20
|
+
SectionStrategyType,
|
|
21
|
+
SourceType,
|
|
22
|
+
)
|
|
23
|
+
from alloy_runtime_types.enums.ownership_scope import OwnershipScope
|
|
24
|
+
from alloy_runtime_types.enums.provider import Provider
|
|
25
|
+
from alloy_runtime_types.enums.schema_enums import SchemaFormat
|
|
26
|
+
from alloy_runtime_types.enums.template_enums import (
|
|
27
|
+
TemplateContentType,
|
|
28
|
+
TemplateVisibility,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def validate_provider(provider: str) -> Provider:
|
|
33
|
+
"""Validate and convert provider string to Provider enum.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
provider: Provider key string (e.g., 'openai', 'anthropic')
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Provider enum value
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
typer.BadParameter: If provider is invalid
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
return Provider(provider.lower())
|
|
46
|
+
except ValueError:
|
|
47
|
+
valid = [p.value for p in Provider if not p.name.startswith("TESTING")]
|
|
48
|
+
raise typer.BadParameter(
|
|
49
|
+
f"Invalid provider '{provider}'. Valid: {', '.join(valid[:8])}..."
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def validate_uuid(value: str, name: str = "ID") -> UUID:
|
|
54
|
+
"""Validate and convert string to UUID.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
value: UUID string
|
|
58
|
+
name: Field name for error message (e.g., "agent", "template")
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
UUID object
|
|
62
|
+
|
|
63
|
+
Raises:
|
|
64
|
+
typer.BadParameter: If UUID format is invalid
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
return UUID(value)
|
|
68
|
+
except ValueError:
|
|
69
|
+
raise typer.BadParameter(f"Invalid {name} UUID format: '{value}'")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def validate_scope(scope: str) -> OwnershipScope:
|
|
73
|
+
"""Validate and convert scope string to OwnershipScope enum.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
scope: Scope string ('user', 'organization', 'global')
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
OwnershipScope enum value
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
typer.BadParameter: If scope is invalid
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
return OwnershipScope(scope.lower())
|
|
86
|
+
except ValueError:
|
|
87
|
+
valid = ", ".join(s.value for s in OwnershipScope)
|
|
88
|
+
raise typer.BadParameter(f"Invalid scope '{scope}'. Valid: {valid}")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def validate_visibility(visibility: str) -> TemplateVisibility:
|
|
92
|
+
"""Validate and convert visibility string to TemplateVisibility enum.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
visibility: Visibility string ('private', 'organization', 'public')
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
TemplateVisibility enum value
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
typer.BadParameter: If visibility is invalid
|
|
102
|
+
"""
|
|
103
|
+
try:
|
|
104
|
+
return TemplateVisibility(visibility.lower())
|
|
105
|
+
except ValueError:
|
|
106
|
+
valid = ", ".join(v.value for v in TemplateVisibility)
|
|
107
|
+
raise typer.BadParameter(f"Invalid visibility '{visibility}'. Valid: {valid}")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def validate_template_content_type(content_type: str) -> TemplateContentType:
|
|
111
|
+
"""Validate and convert content type string to TemplateContentType enum.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
content_type: Content type string ('system_instruction', 'user_message', 'fragment')
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
TemplateContentType enum value
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
typer.BadParameter: If content type is invalid
|
|
121
|
+
"""
|
|
122
|
+
try:
|
|
123
|
+
return TemplateContentType(content_type.lower())
|
|
124
|
+
except ValueError:
|
|
125
|
+
valid = ", ".join(ct.value for ct in TemplateContentType)
|
|
126
|
+
raise typer.BadParameter(f"Invalid type '{content_type}'. Valid: {valid}")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def validate_schema_format(schema_format: str) -> SchemaFormat:
|
|
130
|
+
"""Validate and convert schema format string to SchemaFormat enum.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
schema_format: Schema format string ('json_schema', 'regex')
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
SchemaFormat enum value
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
typer.BadParameter: If schema format is invalid
|
|
140
|
+
"""
|
|
141
|
+
try:
|
|
142
|
+
return SchemaFormat(schema_format.lower())
|
|
143
|
+
except ValueError:
|
|
144
|
+
valid = ", ".join(f.value for f in SchemaFormat)
|
|
145
|
+
raise typer.BadParameter(
|
|
146
|
+
f"Invalid schema format '{schema_format}'. Valid: {valid}"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def validate_section_strategy(strategy: str) -> SectionStrategyType:
|
|
151
|
+
"""Validate section strategy for knowledge collection chunking.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
strategy: Strategy string ('heading_based', 'paragraph_based', 'fixed_size', 'none')
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
Valid SectionStrategyType value
|
|
158
|
+
|
|
159
|
+
Raises:
|
|
160
|
+
typer.BadParameter: If strategy is invalid
|
|
161
|
+
"""
|
|
162
|
+
valid_strategies = ["heading_based", "paragraph_based", "fixed_size", "none"]
|
|
163
|
+
lower = strategy.lower()
|
|
164
|
+
if lower not in valid_strategies:
|
|
165
|
+
raise typer.BadParameter(
|
|
166
|
+
f"Invalid section strategy '{strategy}'. Valid: {', '.join(valid_strategies)}"
|
|
167
|
+
)
|
|
168
|
+
return lower # type: ignore[return-value]
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def validate_source_type(source_type: str) -> SourceType:
|
|
172
|
+
"""Validate source type for document ingestion.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
source_type: Source type string ('upload', 'paste', 'api_import', 'url_scrape')
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Valid SourceType value
|
|
179
|
+
|
|
180
|
+
Raises:
|
|
181
|
+
typer.BadParameter: If source type is invalid
|
|
182
|
+
"""
|
|
183
|
+
valid_types = ["upload", "paste", "api_import", "url_scrape"]
|
|
184
|
+
lower = source_type.lower()
|
|
185
|
+
if lower not in valid_types:
|
|
186
|
+
raise typer.BadParameter(
|
|
187
|
+
f"Invalid source type '{source_type}'. Valid: {', '.join(valid_types)}"
|
|
188
|
+
)
|
|
189
|
+
return lower # type: ignore[return-value]
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def validate_document_type(
|
|
193
|
+
document_type: str,
|
|
194
|
+
) -> str:
|
|
195
|
+
"""Validate document type for preprocessing.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
document_type: Document type string ('transcript', 'sales_call', 'markdown', 'document')
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Valid document type string
|
|
202
|
+
|
|
203
|
+
Raises:
|
|
204
|
+
typer.BadParameter: If document type is invalid
|
|
205
|
+
"""
|
|
206
|
+
valid_types = ["transcript", "markdown", "document"]
|
|
207
|
+
lower = document_type.lower()
|
|
208
|
+
if lower not in valid_types:
|
|
209
|
+
raise typer.BadParameter(
|
|
210
|
+
f"Invalid document type '{document_type}'. Valid: {', '.join(valid_types)}"
|
|
211
|
+
)
|
|
212
|
+
return lower
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def validate_output_mode(
|
|
216
|
+
output_mode: str,
|
|
217
|
+
output_file: str | None,
|
|
218
|
+
valid_modes: tuple[str, ...] = ("console", "clipboard", "file"),
|
|
219
|
+
) -> None:
|
|
220
|
+
"""Validate output mode and file path combination.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
output_mode: Output mode ('console', 'clipboard', 'file', 'editor')
|
|
224
|
+
output_file: Output file path (required for 'file' mode)
|
|
225
|
+
valid_modes: Tuple of valid mode strings
|
|
226
|
+
|
|
227
|
+
Raises:
|
|
228
|
+
typer.BadParameter: If mode is invalid or file required but not provided
|
|
229
|
+
"""
|
|
230
|
+
if output_mode not in valid_modes:
|
|
231
|
+
raise typer.BadParameter(
|
|
232
|
+
f"Invalid output '{output_mode}'. Valid: {', '.join(valid_modes)}"
|
|
233
|
+
)
|
|
234
|
+
if output_mode == "file" and not output_file:
|
|
235
|
+
raise typer.BadParameter("--output-file/-O required with --output file")
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def parse_tags(tags: str | None) -> list[str]:
|
|
239
|
+
"""Parse comma-separated tags string into list.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
tags: Comma-separated tags string or None
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
List of tag strings (empty list if None)
|
|
246
|
+
|
|
247
|
+
Example:
|
|
248
|
+
parse_tags("email,marketing,draft") -> ["email", "marketing", "draft"]
|
|
249
|
+
parse_tags(None) -> []
|
|
250
|
+
"""
|
|
251
|
+
if not tags:
|
|
252
|
+
return []
|
|
253
|
+
return [t.strip() for t in tags.split(",") if t.strip()]
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def parse_tags_required(tags: str) -> list[str]:
|
|
257
|
+
"""Parse comma-separated tags string, requiring at least one tag.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
tags: Comma-separated tags string
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
List of tag strings
|
|
264
|
+
|
|
265
|
+
Raises:
|
|
266
|
+
typer.BadParameter: If no valid tags after parsing
|
|
267
|
+
"""
|
|
268
|
+
tag_list = parse_tags(tags)
|
|
269
|
+
if not tag_list:
|
|
270
|
+
raise typer.BadParameter("At least one tag required")
|
|
271
|
+
return tag_list
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def require_one_of(*args: tuple[str, object]) -> None:
|
|
275
|
+
"""Require that at least one of the named values is provided.
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
*args: Tuples of (name, value) to check
|
|
279
|
+
|
|
280
|
+
Raises:
|
|
281
|
+
typer.BadParameter: If all values are None/empty
|
|
282
|
+
|
|
283
|
+
Example:
|
|
284
|
+
require_one_of(
|
|
285
|
+
("--message", message),
|
|
286
|
+
("--message-template", message_template),
|
|
287
|
+
)
|
|
288
|
+
"""
|
|
289
|
+
provided = [name for name, value in args if value]
|
|
290
|
+
if not provided:
|
|
291
|
+
names = " or ".join(name for name, _ in args)
|
|
292
|
+
raise typer.BadParameter(f"One of {names} is required")
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def require_exclusive(*args: tuple[str, object]) -> None:
|
|
296
|
+
"""Require that at most one of the named values is provided.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
*args: Tuples of (name, value) to check
|
|
300
|
+
|
|
301
|
+
Raises:
|
|
302
|
+
typer.BadParameter: If more than one value is provided
|
|
303
|
+
|
|
304
|
+
Example:
|
|
305
|
+
require_exclusive(
|
|
306
|
+
("--agent", agent),
|
|
307
|
+
("--provider/--model", provider or model),
|
|
308
|
+
)
|
|
309
|
+
"""
|
|
310
|
+
provided = [name for name, value in args if value]
|
|
311
|
+
if len(provided) > 1:
|
|
312
|
+
raise typer.BadParameter(f"Cannot use {' and '.join(provided)} together")
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def require_together(*args: tuple[str, object]) -> None:
|
|
316
|
+
"""Require that if any of the named values is provided, all must be provided.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
*args: Tuples of (name, value) to check
|
|
320
|
+
|
|
321
|
+
Raises:
|
|
322
|
+
typer.BadParameter: If some but not all values are provided
|
|
323
|
+
|
|
324
|
+
Example:
|
|
325
|
+
require_together(
|
|
326
|
+
("--provider", provider),
|
|
327
|
+
("--model", model),
|
|
328
|
+
)
|
|
329
|
+
"""
|
|
330
|
+
provided = [name for name, value in args if value]
|
|
331
|
+
missing = [name for name, value in args if not value]
|
|
332
|
+
|
|
333
|
+
if provided and missing:
|
|
334
|
+
raise typer.BadParameter(
|
|
335
|
+
f"{' and '.join(missing)} required with {' and '.join(provided)}"
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def check_no_update_flags(*args: tuple[str, object]) -> bool:
|
|
340
|
+
"""Check if no update flags were provided.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
*args: Tuples of (name, value) to check
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
True if no flags provided
|
|
347
|
+
|
|
348
|
+
Example:
|
|
349
|
+
if check_no_update_flags(("--name", name), ("--description", desc)):
|
|
350
|
+
raise typer.BadParameter("At least one update flag required")
|
|
351
|
+
"""
|
|
352
|
+
return not any(value for _, value in args)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def require_update_flags(*args: tuple[str, object]) -> None:
|
|
356
|
+
"""Require that at least one update flag was provided.
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
*args: Tuples of (name, value) to check
|
|
360
|
+
|
|
361
|
+
Raises:
|
|
362
|
+
typer.BadParameter: If no flags provided
|
|
363
|
+
"""
|
|
364
|
+
if check_no_update_flags(*args):
|
|
365
|
+
names = ", ".join(name for name, _ in args)
|
|
366
|
+
raise typer.BadParameter(f"At least one flag required: {names}")
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Async generation cancel command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.generate.cancel.presenter import present_generation_cancel
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
from cli.infrastructure.console import Confirm
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def generate_cancel_command(
|
|
11
|
+
execution_id: str = typer.Argument(
|
|
12
|
+
...,
|
|
13
|
+
help="Execution UUID of the async generation to cancel",
|
|
14
|
+
),
|
|
15
|
+
yes: bool = typer.Option(
|
|
16
|
+
False,
|
|
17
|
+
"-y",
|
|
18
|
+
"--yes",
|
|
19
|
+
help="Skip confirmation",
|
|
20
|
+
),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Cancel a pending or running async generation.
|
|
23
|
+
|
|
24
|
+
Only generations in non-terminal states (pending, running) can be cancelled.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
ai generate cancel 123e4567-89ab-cdef-0123-456789abcdef
|
|
28
|
+
ai generate cancel 123e4567-... -y
|
|
29
|
+
"""
|
|
30
|
+
if not yes:
|
|
31
|
+
confirmed = Confirm.ask(f"[yellow]Cancel generation {execution_id}?[/yellow]")
|
|
32
|
+
if not confirmed:
|
|
33
|
+
raise typer.Abort()
|
|
34
|
+
|
|
35
|
+
_execute_cancel(execution_id=execution_id)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@async_command
|
|
39
|
+
async def _execute_cancel(execution_id: str) -> None:
|
|
40
|
+
"""Execute cancel operation."""
|
|
41
|
+
async with authenticated_client() as (_config, client):
|
|
42
|
+
response = await client.cancel_generation(execution_id)
|
|
43
|
+
|
|
44
|
+
present_generation_cancel(response)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Presenter for async generation cancel command output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import format_uuid
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from alloy_runtime_types.dtos.generation import AsyncGenerationCancelResponse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def present_generation_cancel(response: AsyncGenerationCancelResponse) -> None:
|
|
12
|
+
"""Present async generation cancel result."""
|
|
13
|
+
output = OutputService.get()
|
|
14
|
+
|
|
15
|
+
output.success(response.message)
|
|
16
|
+
|
|
17
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
18
|
+
table.add_column("Field", style="dim")
|
|
19
|
+
table.add_column("Value")
|
|
20
|
+
|
|
21
|
+
table.add_row("Execution ID", format_uuid(response.execution_id, short=False))
|
|
22
|
+
table.add_row("Status", response.status)
|
|
23
|
+
table.add_row("Was Running", "Yes" if response.was_running else "No")
|
|
24
|
+
|
|
25
|
+
panel = Panel(table, title="Generation Cancelled", border_style="yellow")
|
|
26
|
+
output.console.print(panel)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Async generation status command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.generate.status.presenter import present_generation_status
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def generate_status_command(
|
|
10
|
+
execution_id: str = typer.Argument(
|
|
11
|
+
...,
|
|
12
|
+
help="Execution UUID of the async generation",
|
|
13
|
+
),
|
|
14
|
+
watch: bool = typer.Option(
|
|
15
|
+
False,
|
|
16
|
+
"--watch",
|
|
17
|
+
help="Poll until generation reaches terminal state",
|
|
18
|
+
),
|
|
19
|
+
timeout: float = typer.Option(
|
|
20
|
+
300.0,
|
|
21
|
+
"--timeout",
|
|
22
|
+
help="Maximum seconds to wait when using --watch (default: 300)",
|
|
23
|
+
),
|
|
24
|
+
) -> None:
|
|
25
|
+
"""Get status of an async generation.
|
|
26
|
+
|
|
27
|
+
Check the status and result of a previously submitted async generation.
|
|
28
|
+
Use --watch to poll until completion.
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
ai generate status 123e4567-89ab-cdef-0123-456789abcdef
|
|
32
|
+
ai generate status 123e4567-... --watch
|
|
33
|
+
ai generate status 123e4567-... --watch --timeout 600
|
|
34
|
+
"""
|
|
35
|
+
_execute_status(
|
|
36
|
+
execution_id=execution_id,
|
|
37
|
+
watch=watch,
|
|
38
|
+
timeout=timeout,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@async_command
|
|
43
|
+
async def _execute_status(
|
|
44
|
+
execution_id: str,
|
|
45
|
+
watch: bool,
|
|
46
|
+
timeout: float,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Execute status operation."""
|
|
49
|
+
async with authenticated_client() as (_config, client):
|
|
50
|
+
if watch:
|
|
51
|
+
response = await client.wait_for_generation(
|
|
52
|
+
execution_id,
|
|
53
|
+
timeout=timeout,
|
|
54
|
+
)
|
|
55
|
+
else:
|
|
56
|
+
response = await client.get_generation(execution_id)
|
|
57
|
+
|
|
58
|
+
present_generation_status(response)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Presenter for async generation status command output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import (
|
|
7
|
+
format_cost,
|
|
8
|
+
format_datetime,
|
|
9
|
+
format_duration_ms,
|
|
10
|
+
format_optional,
|
|
11
|
+
format_tokens,
|
|
12
|
+
format_uuid,
|
|
13
|
+
)
|
|
14
|
+
from cli.infrastructure.output import OutputService
|
|
15
|
+
from alloy_runtime_types.dtos.generation import AsyncGenerationStatusResponse
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def present_generation_status(response: AsyncGenerationStatusResponse) -> None:
|
|
19
|
+
"""Present async generation status details."""
|
|
20
|
+
output = OutputService.get()
|
|
21
|
+
|
|
22
|
+
border_style = {
|
|
23
|
+
"completed": "green",
|
|
24
|
+
"failed": "red",
|
|
25
|
+
"cancelled": "yellow",
|
|
26
|
+
"timeout": "yellow",
|
|
27
|
+
"running": "blue",
|
|
28
|
+
"pending": "dim",
|
|
29
|
+
}.get(response.status, "dim")
|
|
30
|
+
|
|
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
|
+
table.add_row("Execution ID", format_uuid(response.execution_id, short=False))
|
|
36
|
+
table.add_row("Status", response.status)
|
|
37
|
+
table.add_row("Queued At", format_datetime(response.queued_at))
|
|
38
|
+
|
|
39
|
+
if response.started_at:
|
|
40
|
+
table.add_row("Started At", format_datetime(response.started_at))
|
|
41
|
+
|
|
42
|
+
if response.completed_at:
|
|
43
|
+
table.add_row("Completed At", format_datetime(response.completed_at))
|
|
44
|
+
|
|
45
|
+
if response.total_duration_ms:
|
|
46
|
+
table.add_row("Duration", format_duration_ms(response.total_duration_ms))
|
|
47
|
+
|
|
48
|
+
if response.output_text:
|
|
49
|
+
table.add_row(
|
|
50
|
+
"Output",
|
|
51
|
+
response.output_text[:200] + "..."
|
|
52
|
+
if len(response.output_text) > 200
|
|
53
|
+
else response.output_text,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if response.usage:
|
|
57
|
+
table.add_row("Input Tokens", format_tokens(response.usage.input_tokens))
|
|
58
|
+
table.add_row("Output Tokens", format_tokens(response.usage.output_tokens))
|
|
59
|
+
|
|
60
|
+
if response.cost:
|
|
61
|
+
table.add_row("Cost", format_cost(response.cost.total_cost_usd))
|
|
62
|
+
|
|
63
|
+
if response.provider_key:
|
|
64
|
+
table.add_row("Provider", response.provider_key)
|
|
65
|
+
|
|
66
|
+
if response.provider_model_name:
|
|
67
|
+
table.add_row("Model", response.provider_model_name)
|
|
68
|
+
|
|
69
|
+
if response.error_message:
|
|
70
|
+
table.add_row("Error", response.error_message)
|
|
71
|
+
|
|
72
|
+
if response.error_type:
|
|
73
|
+
table.add_row("Error Type", response.error_type)
|
|
74
|
+
|
|
75
|
+
table.add_row("External ID", format_optional(response.external_id))
|
|
76
|
+
|
|
77
|
+
panel = Panel(table, title="Generation Status", border_style=border_style)
|
|
78
|
+
output.console.print(panel)
|
|
File without changes
|