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,84 @@
|
|
|
1
|
+
"""Models list command implementation."""
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.models.list.presenter import present_models_list
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DisplayColumn(str, Enum):
|
|
13
|
+
"""Column display options."""
|
|
14
|
+
|
|
15
|
+
MODEL = "model"
|
|
16
|
+
PROVIDER = "provider"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def models_list_command(
|
|
20
|
+
search: Optional[str] = typer.Option(
|
|
21
|
+
None,
|
|
22
|
+
"-s",
|
|
23
|
+
"--search",
|
|
24
|
+
help="Fuzzy search terms",
|
|
25
|
+
),
|
|
26
|
+
provider_filter: Optional[str] = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"-p",
|
|
29
|
+
"--provider",
|
|
30
|
+
help="Filter by provider",
|
|
31
|
+
),
|
|
32
|
+
configured_only: bool = typer.Option(
|
|
33
|
+
False,
|
|
34
|
+
"--configured",
|
|
35
|
+
help="Only show models with credentials",
|
|
36
|
+
),
|
|
37
|
+
display: DisplayColumn | None = typer.Option(
|
|
38
|
+
None,
|
|
39
|
+
"--display",
|
|
40
|
+
help="Show only: model or provider",
|
|
41
|
+
),
|
|
42
|
+
extra_fields: bool = typer.Option(
|
|
43
|
+
False,
|
|
44
|
+
"--extra",
|
|
45
|
+
help="Show detailed table",
|
|
46
|
+
),
|
|
47
|
+
) -> None:
|
|
48
|
+
"""List available AI models.
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
ai models list
|
|
52
|
+
ai models list -s "claude sonnet"
|
|
53
|
+
ai models list -p anthropic
|
|
54
|
+
ai models list --configured
|
|
55
|
+
ai models list --display model
|
|
56
|
+
ai models list --extra
|
|
57
|
+
"""
|
|
58
|
+
_execute_list(
|
|
59
|
+
search=search,
|
|
60
|
+
provider_filter=provider_filter,
|
|
61
|
+
configured_only=configured_only,
|
|
62
|
+
display=display,
|
|
63
|
+
extra_fields=extra_fields,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@async_command
|
|
68
|
+
async def _execute_list(
|
|
69
|
+
search: Optional[str],
|
|
70
|
+
provider_filter: Optional[str],
|
|
71
|
+
configured_only: bool,
|
|
72
|
+
display: DisplayColumn | None,
|
|
73
|
+
extra_fields: bool,
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Execute list models operation."""
|
|
76
|
+
async with authenticated_client() as (_config, client):
|
|
77
|
+
response = await client.list_models(
|
|
78
|
+
search=search,
|
|
79
|
+
provider_filter=provider_filter,
|
|
80
|
+
configured_only=configured_only,
|
|
81
|
+
limit=100,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
present_models_list(response, display_column=display, extra_fields=extra_fields)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Presenter for models list command output."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_types.dtos.models import ListModelsResponse
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from cli.commands.models.list.command import DisplayColumn
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def present_models_list(
|
|
15
|
+
response: ListModelsResponse,
|
|
16
|
+
*,
|
|
17
|
+
display_column: "DisplayColumn | None" = None,
|
|
18
|
+
extra_fields: bool = False,
|
|
19
|
+
) -> None:
|
|
20
|
+
"""Present list of models with Rich table formatting.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
response: List models response from server
|
|
24
|
+
display_column: If set, only show that specific column. None = all columns.
|
|
25
|
+
extra_fields: If True, show detailed table with all fields. Default is simple one-line format.
|
|
26
|
+
"""
|
|
27
|
+
# Import here to avoid circular import
|
|
28
|
+
from cli.commands.models.list.command import DisplayColumn
|
|
29
|
+
|
|
30
|
+
output = OutputService.get()
|
|
31
|
+
|
|
32
|
+
if not response.models:
|
|
33
|
+
output.info("No models found")
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
# If display_column is set, show single column
|
|
37
|
+
if display_column == DisplayColumn.PROVIDER:
|
|
38
|
+
columns = [
|
|
39
|
+
ColumnConfig(
|
|
40
|
+
source_field="provider_key",
|
|
41
|
+
header_label="Provider",
|
|
42
|
+
compact_line=1,
|
|
43
|
+
compact_style="green",
|
|
44
|
+
),
|
|
45
|
+
]
|
|
46
|
+
elif display_column == DisplayColumn.MODEL:
|
|
47
|
+
columns = [
|
|
48
|
+
ColumnConfig(
|
|
49
|
+
source_field="provider_model_name",
|
|
50
|
+
header_label="Model Name",
|
|
51
|
+
compact_line=1,
|
|
52
|
+
compact_style="cyan",
|
|
53
|
+
),
|
|
54
|
+
]
|
|
55
|
+
# If extra_fields is True, show detailed table with compact layout
|
|
56
|
+
elif extra_fields:
|
|
57
|
+
# Line 1 (primary): Provider, model name, context window - identifiers
|
|
58
|
+
# Line 2 (detail): Max output, modalities - technical details
|
|
59
|
+
columns = [
|
|
60
|
+
ColumnConfig(
|
|
61
|
+
source_field="provider_key",
|
|
62
|
+
header_label="Provider",
|
|
63
|
+
compact_line=1,
|
|
64
|
+
compact_style="green",
|
|
65
|
+
),
|
|
66
|
+
ColumnConfig(
|
|
67
|
+
source_field="provider_model_name",
|
|
68
|
+
header_label="Model Name",
|
|
69
|
+
compact_line=1,
|
|
70
|
+
compact_style="cyan",
|
|
71
|
+
),
|
|
72
|
+
ColumnConfig(
|
|
73
|
+
source_field="context_window",
|
|
74
|
+
header_label="Context",
|
|
75
|
+
formatter=lambda x: f"{x:,}" if x else "-",
|
|
76
|
+
align="right",
|
|
77
|
+
compact_line=1,
|
|
78
|
+
compact_style="yellow",
|
|
79
|
+
),
|
|
80
|
+
ColumnConfig(
|
|
81
|
+
source_field="max_output_tokens",
|
|
82
|
+
header_label="Max Output",
|
|
83
|
+
formatter=lambda x: f"{x:,}" if x else "-",
|
|
84
|
+
align="right",
|
|
85
|
+
compact_line=2,
|
|
86
|
+
compact_style="dim",
|
|
87
|
+
),
|
|
88
|
+
ColumnConfig(
|
|
89
|
+
source_field="input_modalities",
|
|
90
|
+
header_label="Input",
|
|
91
|
+
formatter=lambda x: ", ".join(sorted(x)) if x else "-",
|
|
92
|
+
compact_line=2,
|
|
93
|
+
compact_style="dim",
|
|
94
|
+
),
|
|
95
|
+
ColumnConfig(
|
|
96
|
+
source_field="output_modalities",
|
|
97
|
+
header_label="Output",
|
|
98
|
+
formatter=lambda x: ", ".join(sorted(x)) if x else "-",
|
|
99
|
+
compact_line=2,
|
|
100
|
+
compact_style="dim",
|
|
101
|
+
),
|
|
102
|
+
]
|
|
103
|
+
else:
|
|
104
|
+
# Default: simple one-line format (provider/model)
|
|
105
|
+
for model in response.models:
|
|
106
|
+
output.console.print(f"{model.provider_key}/{model.provider_model_name}")
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
# Render table (cast needed due to list invariance)
|
|
110
|
+
output.table(
|
|
111
|
+
items=response.models, # type: ignore[arg-type]
|
|
112
|
+
title=f"Available Models ({response.total_count})",
|
|
113
|
+
columns=columns,
|
|
114
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Organizations create command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.organizations.create.presenter import present_create_result
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
from alloy_runtime_types.dtos.organizations import CreateOrganizationRequest
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def organizations_create_command(
|
|
11
|
+
name: str = typer.Option(
|
|
12
|
+
...,
|
|
13
|
+
"-n",
|
|
14
|
+
"--name",
|
|
15
|
+
help="Organization name",
|
|
16
|
+
),
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Create a new organization.
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
ai organizations create --name "My Company"
|
|
22
|
+
"""
|
|
23
|
+
_execute_create(name=name)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@async_command
|
|
27
|
+
async def _execute_create(name: str) -> None:
|
|
28
|
+
request = CreateOrganizationRequest(name=name)
|
|
29
|
+
async with authenticated_client() as (_config, client):
|
|
30
|
+
response = await client.create_organization(request)
|
|
31
|
+
|
|
32
|
+
present_create_result(response)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Presenter for organizations create command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.organizations import OrganizationResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_create_result(response: OrganizationResponse) -> None:
|
|
8
|
+
output = OutputService.get()
|
|
9
|
+
output.success(f"Created organization: {response.name}")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Pipeline approval checkpoint decide command implementation."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from cli.commands.flag_utils import validate_uuid
|
|
10
|
+
from cli.commands.pipelines.approvals.presenter import present_approval_checkpoint
|
|
11
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def pipelines_approvals_decide_command(
|
|
15
|
+
execution_id: str = typer.Argument(
|
|
16
|
+
...,
|
|
17
|
+
help="Pipeline execution UUID",
|
|
18
|
+
),
|
|
19
|
+
approval_key: str = typer.Argument(
|
|
20
|
+
...,
|
|
21
|
+
help="Approval checkpoint key",
|
|
22
|
+
),
|
|
23
|
+
approve: bool = typer.Option(
|
|
24
|
+
...,
|
|
25
|
+
"--approve/--reject",
|
|
26
|
+
help="Approve or reject the checkpoint",
|
|
27
|
+
),
|
|
28
|
+
data: Optional[str] = typer.Option(
|
|
29
|
+
None,
|
|
30
|
+
"-d",
|
|
31
|
+
"--data",
|
|
32
|
+
help='Decision data as JSON string (e.g. \'{"reason": "looks good"}\')',
|
|
33
|
+
),
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Submit a decision on an approval checkpoint.
|
|
36
|
+
|
|
37
|
+
Examples:
|
|
38
|
+
ai pipelines approvals decide 123e4567... pe:123:approval:review --approve
|
|
39
|
+
ai pipelines approvals decide 123e4567... pe:123:approval:review --reject
|
|
40
|
+
ai pipelines approvals decide 123e4567... pe:123:approval:review --approve -d '{"reason": "LGTM"}'
|
|
41
|
+
"""
|
|
42
|
+
e_uuid = validate_uuid(execution_id, "execution")
|
|
43
|
+
|
|
44
|
+
decision_data: dict[str, Any] | None = None
|
|
45
|
+
if data:
|
|
46
|
+
try:
|
|
47
|
+
decision_data = json.loads(data)
|
|
48
|
+
except json.JSONDecodeError as e:
|
|
49
|
+
raise typer.BadParameter(f"Invalid JSON for --data: {e}")
|
|
50
|
+
if not isinstance(decision_data, dict):
|
|
51
|
+
raise typer.BadParameter("--data must be a JSON object")
|
|
52
|
+
|
|
53
|
+
_execute_decide(
|
|
54
|
+
execution_id=e_uuid,
|
|
55
|
+
approval_key=approval_key,
|
|
56
|
+
approved=approve,
|
|
57
|
+
decision_data=decision_data,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@async_command
|
|
62
|
+
async def _execute_decide(
|
|
63
|
+
execution_id: UUID,
|
|
64
|
+
approval_key: str,
|
|
65
|
+
approved: bool,
|
|
66
|
+
decision_data: dict[str, Any] | None,
|
|
67
|
+
) -> None:
|
|
68
|
+
"""Execute decide approval checkpoint operation."""
|
|
69
|
+
async with authenticated_client() as (_config, client):
|
|
70
|
+
checkpoint = await client.decide_approval(
|
|
71
|
+
execution_id,
|
|
72
|
+
approval_key,
|
|
73
|
+
approved=approved,
|
|
74
|
+
decision_data=decision_data,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
present_approval_checkpoint(checkpoint)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Pipeline approval checkpoint get command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import validate_uuid
|
|
8
|
+
from cli.commands.pipelines.approvals.presenter import (
|
|
9
|
+
present_approval_checkpoint,
|
|
10
|
+
present_approval_not_found,
|
|
11
|
+
)
|
|
12
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def pipelines_approvals_get_command(
|
|
16
|
+
execution_id: str = typer.Argument(
|
|
17
|
+
...,
|
|
18
|
+
help="Pipeline execution UUID",
|
|
19
|
+
),
|
|
20
|
+
approval_key: str = typer.Argument(
|
|
21
|
+
...,
|
|
22
|
+
help="Approval checkpoint key",
|
|
23
|
+
),
|
|
24
|
+
) -> None:
|
|
25
|
+
"""Get details of an approval checkpoint.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai pipelines approvals get 123e4567... pe:123:approval:review_step
|
|
29
|
+
"""
|
|
30
|
+
e_uuid = validate_uuid(execution_id, "execution")
|
|
31
|
+
_execute_get(execution_id=e_uuid, approval_key=approval_key)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@async_command
|
|
35
|
+
async def _execute_get(execution_id: UUID, approval_key: str) -> None:
|
|
36
|
+
"""Execute get approval checkpoint operation."""
|
|
37
|
+
async with authenticated_client() as (_config, client):
|
|
38
|
+
checkpoint = await client.get_approval_checkpoint(execution_id, approval_key)
|
|
39
|
+
|
|
40
|
+
if checkpoint is None:
|
|
41
|
+
present_approval_not_found(str(execution_id), approval_key)
|
|
42
|
+
raise typer.Exit(code=1)
|
|
43
|
+
|
|
44
|
+
present_approval_checkpoint(checkpoint)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Presenters for pipeline approval checkpoint command output."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_sdk.pipeline.types import ApprovalCheckpoint
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.formatting.fields import format_optional
|
|
8
|
+
from cli.infrastructure.output import OutputService
|
|
9
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _format_status(status: str) -> str:
|
|
13
|
+
"""Format approval status for display."""
|
|
14
|
+
return status
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _format_approved(approved: bool | None) -> str:
|
|
18
|
+
"""Format approved boolean for display."""
|
|
19
|
+
if approved is None:
|
|
20
|
+
return "(pending)"
|
|
21
|
+
return "Yes" if approved else "No"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def present_approval_checkpoint(checkpoint: ApprovalCheckpoint) -> None:
|
|
25
|
+
"""Present a single approval checkpoint with Rich formatting."""
|
|
26
|
+
output = OutputService.get()
|
|
27
|
+
|
|
28
|
+
fields = [
|
|
29
|
+
FieldConfig("id", "Checkpoint ID", str),
|
|
30
|
+
FieldConfig("pipeline_execution_id", "Execution ID", str),
|
|
31
|
+
FieldConfig("approval_key", "Approval Key"),
|
|
32
|
+
FieldConfig("status", "Status", _format_status),
|
|
33
|
+
FieldConfig("approved", "Approved", _format_approved),
|
|
34
|
+
FieldConfig(
|
|
35
|
+
"decided_by_user_id", "Decided By", lambda v: format_optional(v, str)
|
|
36
|
+
),
|
|
37
|
+
FieldConfig("decided_at", "Decided At", format_optional),
|
|
38
|
+
FieldConfig("created_at", "Created At"),
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
output.entity(checkpoint, f"Approval: {checkpoint.status}", fields)
|
|
42
|
+
|
|
43
|
+
if checkpoint.decision_data:
|
|
44
|
+
data_str = json.dumps(checkpoint.decision_data, indent=2)
|
|
45
|
+
if len(data_str) > 500:
|
|
46
|
+
data_str = data_str[:500] + "\n..."
|
|
47
|
+
output.info(f"Decision Data:\n{data_str}")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def present_approval_not_found(execution_id: str, approval_key: str) -> None:
|
|
51
|
+
"""Present a not-found message for an approval checkpoint."""
|
|
52
|
+
output = OutputService.get()
|
|
53
|
+
output.warning(
|
|
54
|
+
f"No approval checkpoint found for execution {execution_id} "
|
|
55
|
+
f"with key '{approval_key}'"
|
|
56
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Pipeline costs command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.flag_utils import validate_uuid
|
|
9
|
+
from cli.commands.pipelines.costs.presenter import present_pipeline_costs
|
|
10
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def pipelines_costs_command(
|
|
14
|
+
pipeline_id: str = typer.Argument(
|
|
15
|
+
...,
|
|
16
|
+
help="Pipeline UUID",
|
|
17
|
+
),
|
|
18
|
+
start_date: Optional[str] = typer.Option(
|
|
19
|
+
None,
|
|
20
|
+
"--start",
|
|
21
|
+
help="Start date (ISO 8601, defaults to 30 days ago)",
|
|
22
|
+
),
|
|
23
|
+
end_date: Optional[str] = typer.Option(
|
|
24
|
+
None,
|
|
25
|
+
"--end",
|
|
26
|
+
help="End date (ISO 8601, defaults to now)",
|
|
27
|
+
),
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Get cost summary for a pipeline.
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
ai pipelines costs 123e4567-89ab...
|
|
33
|
+
ai pipelines costs 123e4567-89ab... --start 2026-01-01 --end 2026-01-31
|
|
34
|
+
"""
|
|
35
|
+
pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
|
|
36
|
+
_execute_costs(
|
|
37
|
+
pipeline_id=pipeline_uuid,
|
|
38
|
+
start_date=start_date,
|
|
39
|
+
end_date=end_date,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@async_command
|
|
44
|
+
async def _execute_costs(
|
|
45
|
+
pipeline_id: UUID,
|
|
46
|
+
start_date: Optional[str],
|
|
47
|
+
end_date: Optional[str],
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Execute get pipeline costs operation."""
|
|
50
|
+
async with authenticated_client() as (_config, client):
|
|
51
|
+
response = await client.get_pipeline_costs(
|
|
52
|
+
pipeline_id,
|
|
53
|
+
start_date=start_date,
|
|
54
|
+
end_date=end_date,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
present_pipeline_costs(response)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Pipeline daily costs command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import validate_uuid
|
|
8
|
+
from cli.commands.pipelines.costs.daily_presenter import present_pipeline_daily_costs
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def pipeline_costs_daily_command(
|
|
13
|
+
pipeline_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Pipeline UUID",
|
|
16
|
+
),
|
|
17
|
+
start_date: str = typer.Option(
|
|
18
|
+
...,
|
|
19
|
+
"--from",
|
|
20
|
+
help="Start date (ISO 8601, required)",
|
|
21
|
+
),
|
|
22
|
+
end_date: str = typer.Option(
|
|
23
|
+
...,
|
|
24
|
+
"--to",
|
|
25
|
+
help="End date (ISO 8601, required)",
|
|
26
|
+
),
|
|
27
|
+
) -> None:
|
|
28
|
+
"""Get daily cost breakdown for a pipeline.
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
ai pipelines costs daily 123e4567-89ab... --from 2026-01-01 --to 2026-01-31
|
|
32
|
+
"""
|
|
33
|
+
pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
|
|
34
|
+
_execute_daily_costs(
|
|
35
|
+
pipeline_id=pipeline_uuid,
|
|
36
|
+
start_date=start_date,
|
|
37
|
+
end_date=end_date,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@async_command
|
|
42
|
+
async def _execute_daily_costs(
|
|
43
|
+
pipeline_id: UUID,
|
|
44
|
+
start_date: str,
|
|
45
|
+
end_date: str,
|
|
46
|
+
) -> None:
|
|
47
|
+
async with authenticated_client() as (_config, client):
|
|
48
|
+
response = await client.get_pipeline_costs_daily(
|
|
49
|
+
pipeline_id,
|
|
50
|
+
start_date=start_date,
|
|
51
|
+
end_date=end_date,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
present_pipeline_daily_costs(response)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Presenter for pipeline daily costs command output."""
|
|
2
|
+
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_types.dtos.pipeline_costs import DailyCostEntry
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _format_cost(cost: Decimal | None) -> str:
|
|
12
|
+
if cost is None:
|
|
13
|
+
return "-"
|
|
14
|
+
return f"${cost:.4f}"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def present_pipeline_daily_costs(entries: list[DailyCostEntry]) -> None:
|
|
18
|
+
output = OutputService.get()
|
|
19
|
+
|
|
20
|
+
if not entries:
|
|
21
|
+
output.info("No daily cost data found for the specified period")
|
|
22
|
+
return
|
|
23
|
+
|
|
24
|
+
columns = [
|
|
25
|
+
ColumnConfig(
|
|
26
|
+
source_field="date",
|
|
27
|
+
header_label="Date",
|
|
28
|
+
formatter=str,
|
|
29
|
+
compact_line=1,
|
|
30
|
+
compact_style="cyan",
|
|
31
|
+
),
|
|
32
|
+
ColumnConfig(
|
|
33
|
+
source_field="execution_count",
|
|
34
|
+
header_label="Executions",
|
|
35
|
+
formatter=str,
|
|
36
|
+
compact_line=1,
|
|
37
|
+
compact_style="white",
|
|
38
|
+
),
|
|
39
|
+
ColumnConfig(
|
|
40
|
+
source_field="total_cost_usd",
|
|
41
|
+
header_label="Total Cost",
|
|
42
|
+
formatter=_format_cost,
|
|
43
|
+
compact_line=1,
|
|
44
|
+
compact_style="green bold",
|
|
45
|
+
),
|
|
46
|
+
ColumnConfig(
|
|
47
|
+
source_field="avg_cost_usd",
|
|
48
|
+
header_label="Avg Cost",
|
|
49
|
+
formatter=_format_cost,
|
|
50
|
+
compact_line=2,
|
|
51
|
+
compact_style="dim",
|
|
52
|
+
),
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
output.table(
|
|
56
|
+
items=entries, # type: ignore[arg-type]
|
|
57
|
+
title=f"Daily Costs ({len(entries)} days)",
|
|
58
|
+
columns=columns,
|
|
59
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Presenter for pipeline costs command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.pipeline_costs import PipelineDefinitionCostSummary
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _format_period(response: PipelineDefinitionCostSummary) -> str:
|
|
10
|
+
"""Format period dates for display."""
|
|
11
|
+
return f"{response.period_start.strftime('%Y-%m-%d')} to {response.period_end.strftime('%Y-%m-%d')}"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _format_cost(cost: float | None) -> str:
|
|
15
|
+
"""Format cost for display."""
|
|
16
|
+
if cost is None:
|
|
17
|
+
return "-"
|
|
18
|
+
return f"${cost:.4f}"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def present_pipeline_costs(response: PipelineDefinitionCostSummary) -> None:
|
|
22
|
+
"""Present pipeline cost summary."""
|
|
23
|
+
output = OutputService.get()
|
|
24
|
+
|
|
25
|
+
fields = [
|
|
26
|
+
FieldConfig("pipeline_definition_id", "Pipeline ID", str),
|
|
27
|
+
FieldConfig("period", "Period", lambda _: _format_period(response)),
|
|
28
|
+
FieldConfig("execution_count", "Total Executions", str),
|
|
29
|
+
FieldConfig("completed_count", "Completed", str),
|
|
30
|
+
FieldConfig("failed_count", "Failed", str),
|
|
31
|
+
FieldConfig("total_cost_usd", "Total Cost", _format_cost),
|
|
32
|
+
FieldConfig("avg_cost_usd", "Avg Cost", _format_cost),
|
|
33
|
+
FieldConfig("min_cost_usd", "Min Cost", _format_cost),
|
|
34
|
+
FieldConfig("max_cost_usd", "Max Cost", _format_cost),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
output.entity(response, "Pipeline Cost Summary", fields)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|