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,80 @@
|
|
|
1
|
+
"""Presenter for billing project costs by model command output."""
|
|
2
|
+
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_types.dtos.billing import ProjectCostByModel
|
|
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
|
+
"""Format cost for display."""
|
|
13
|
+
if cost is None:
|
|
14
|
+
return "-"
|
|
15
|
+
return f"${cost:.4f}"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def present_billing_costs_by_model(entries: list[ProjectCostByModel]) -> None:
|
|
19
|
+
"""Present billing project cost breakdown by model."""
|
|
20
|
+
output = OutputService.get()
|
|
21
|
+
|
|
22
|
+
if not entries:
|
|
23
|
+
output.info("No cost data by model found")
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
columns = [
|
|
27
|
+
ColumnConfig(
|
|
28
|
+
source_field="provider_key",
|
|
29
|
+
header_label="Provider",
|
|
30
|
+
compact_line=1,
|
|
31
|
+
compact_style="cyan",
|
|
32
|
+
),
|
|
33
|
+
ColumnConfig(
|
|
34
|
+
source_field="model_name",
|
|
35
|
+
header_label="Model",
|
|
36
|
+
compact_line=1,
|
|
37
|
+
compact_style="green",
|
|
38
|
+
),
|
|
39
|
+
ColumnConfig(
|
|
40
|
+
source_field="execution_count",
|
|
41
|
+
header_label="Executions",
|
|
42
|
+
formatter=str,
|
|
43
|
+
compact_line=1,
|
|
44
|
+
compact_style="white",
|
|
45
|
+
),
|
|
46
|
+
ColumnConfig(
|
|
47
|
+
source_field="total_tokens",
|
|
48
|
+
header_label="Total Tokens",
|
|
49
|
+
formatter=lambda x: f"{x:,}",
|
|
50
|
+
compact_line=2,
|
|
51
|
+
compact_style="dim",
|
|
52
|
+
),
|
|
53
|
+
ColumnConfig(
|
|
54
|
+
source_field="llm_cost_usd",
|
|
55
|
+
header_label="LLM Cost",
|
|
56
|
+
formatter=_format_cost,
|
|
57
|
+
compact_line=2,
|
|
58
|
+
compact_style="dim",
|
|
59
|
+
),
|
|
60
|
+
ColumnConfig(
|
|
61
|
+
source_field="rag_cost_usd",
|
|
62
|
+
header_label="RAG Cost",
|
|
63
|
+
formatter=_format_cost,
|
|
64
|
+
compact_line=2,
|
|
65
|
+
compact_style="dim",
|
|
66
|
+
),
|
|
67
|
+
ColumnConfig(
|
|
68
|
+
source_field="total_cost_usd",
|
|
69
|
+
header_label="Total Cost",
|
|
70
|
+
formatter=_format_cost,
|
|
71
|
+
compact_line=1,
|
|
72
|
+
compact_style="green bold",
|
|
73
|
+
),
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
output.table(
|
|
77
|
+
items=entries, # type: ignore[arg-type]
|
|
78
|
+
title=f"Costs by Model ({len(entries)} models)",
|
|
79
|
+
columns=columns,
|
|
80
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Billing project daily costs command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.billing.costs.daily.presenter import present_billing_daily_costs
|
|
8
|
+
from cli.commands.flag_utils import validate_uuid
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def billing_costs_daily_command(
|
|
13
|
+
project_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Billing project 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 billing project.
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
ai billing costs daily 123e4567-89ab... --from 2026-01-01 --to 2026-01-31
|
|
32
|
+
"""
|
|
33
|
+
project_uuid = validate_uuid(project_id, "billing project")
|
|
34
|
+
_execute_daily_costs(
|
|
35
|
+
project_id=project_uuid,
|
|
36
|
+
start_date=start_date,
|
|
37
|
+
end_date=end_date,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@async_command
|
|
42
|
+
async def _execute_daily_costs(
|
|
43
|
+
project_id: UUID,
|
|
44
|
+
start_date: str,
|
|
45
|
+
end_date: str,
|
|
46
|
+
) -> None:
|
|
47
|
+
"""Execute get billing project daily costs operation."""
|
|
48
|
+
async with authenticated_client() as (_config, client):
|
|
49
|
+
response = await client.get_billing_project_costs_daily(
|
|
50
|
+
project_id,
|
|
51
|
+
start_date=start_date,
|
|
52
|
+
end_date=end_date,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
present_billing_daily_costs(response)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Presenter for billing project daily costs command output."""
|
|
2
|
+
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_types.dtos.billing import ProjectDailyCostEntry
|
|
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
|
+
"""Format cost for display."""
|
|
13
|
+
if cost is None:
|
|
14
|
+
return "-"
|
|
15
|
+
return f"${cost:.4f}"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def present_billing_daily_costs(entries: list[ProjectDailyCostEntry]) -> None:
|
|
19
|
+
"""Present billing project daily cost breakdown."""
|
|
20
|
+
output = OutputService.get()
|
|
21
|
+
|
|
22
|
+
if not entries:
|
|
23
|
+
output.info("No daily cost data found for the specified period")
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
columns = [
|
|
27
|
+
ColumnConfig(
|
|
28
|
+
source_field="date",
|
|
29
|
+
header_label="Date",
|
|
30
|
+
formatter=lambda x: str(x),
|
|
31
|
+
compact_line=1,
|
|
32
|
+
compact_style="cyan",
|
|
33
|
+
),
|
|
34
|
+
ColumnConfig(
|
|
35
|
+
source_field="execution_count",
|
|
36
|
+
header_label="Executions",
|
|
37
|
+
formatter=str,
|
|
38
|
+
compact_line=1,
|
|
39
|
+
compact_style="white",
|
|
40
|
+
),
|
|
41
|
+
ColumnConfig(
|
|
42
|
+
source_field="llm_cost_usd",
|
|
43
|
+
header_label="LLM Cost",
|
|
44
|
+
formatter=_format_cost,
|
|
45
|
+
compact_line=2,
|
|
46
|
+
compact_style="dim",
|
|
47
|
+
),
|
|
48
|
+
ColumnConfig(
|
|
49
|
+
source_field="rag_cost_usd",
|
|
50
|
+
header_label="RAG Cost",
|
|
51
|
+
formatter=_format_cost,
|
|
52
|
+
compact_line=2,
|
|
53
|
+
compact_style="dim",
|
|
54
|
+
),
|
|
55
|
+
ColumnConfig(
|
|
56
|
+
source_field="total_cost_usd",
|
|
57
|
+
header_label="Total Cost",
|
|
58
|
+
formatter=_format_cost,
|
|
59
|
+
compact_line=1,
|
|
60
|
+
compact_style="green bold",
|
|
61
|
+
),
|
|
62
|
+
ColumnConfig(
|
|
63
|
+
source_field="avg_cost_usd",
|
|
64
|
+
header_label="Avg Cost",
|
|
65
|
+
formatter=_format_cost,
|
|
66
|
+
compact_line=2,
|
|
67
|
+
compact_style="dim",
|
|
68
|
+
),
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
output.table(
|
|
72
|
+
items=entries, # type: ignore[arg-type]
|
|
73
|
+
title=f"Daily Costs ({len(entries)} days)",
|
|
74
|
+
columns=columns,
|
|
75
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Billing project cost summary command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.billing.costs.summary.presenter import present_billing_cost_summary
|
|
9
|
+
from cli.commands.flag_utils import validate_uuid
|
|
10
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def billing_costs_summary_command(
|
|
14
|
+
project_id: str = typer.Argument(
|
|
15
|
+
...,
|
|
16
|
+
help="Billing project UUID",
|
|
17
|
+
),
|
|
18
|
+
start_date: Optional[str] = typer.Option(
|
|
19
|
+
None,
|
|
20
|
+
"--from",
|
|
21
|
+
help="Start date (ISO 8601, defaults to 30 days ago)",
|
|
22
|
+
),
|
|
23
|
+
end_date: Optional[str] = typer.Option(
|
|
24
|
+
None,
|
|
25
|
+
"--to",
|
|
26
|
+
help="End date (ISO 8601, defaults to now)",
|
|
27
|
+
),
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Get cost summary for a billing project.
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
ai billing costs summary 123e4567-89ab...
|
|
33
|
+
ai billing costs summary 123e4567-89ab... --from 2026-01-01 --to 2026-01-31
|
|
34
|
+
"""
|
|
35
|
+
project_uuid = validate_uuid(project_id, "billing project")
|
|
36
|
+
_execute_cost_summary(
|
|
37
|
+
project_id=project_uuid,
|
|
38
|
+
start_date=start_date,
|
|
39
|
+
end_date=end_date,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@async_command
|
|
44
|
+
async def _execute_cost_summary(
|
|
45
|
+
project_id: UUID,
|
|
46
|
+
start_date: Optional[str],
|
|
47
|
+
end_date: Optional[str],
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Execute get billing project costs operation."""
|
|
50
|
+
async with authenticated_client() as (_config, client):
|
|
51
|
+
response = await client.get_billing_project_costs(
|
|
52
|
+
project_id,
|
|
53
|
+
start_date=start_date,
|
|
54
|
+
end_date=end_date,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
present_billing_cost_summary(response)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Presenter for billing project cost summary command output."""
|
|
2
|
+
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
|
|
5
|
+
from alloy_runtime_types.dtos.billing import ProjectCostSummary
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _format_cost(cost: Decimal | None) -> str:
|
|
12
|
+
"""Format cost for display."""
|
|
13
|
+
if cost is None:
|
|
14
|
+
return "-"
|
|
15
|
+
return f"${cost:.4f}"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _format_period(response: ProjectCostSummary) -> str:
|
|
19
|
+
"""Format period dates for display."""
|
|
20
|
+
return f"{response.period_start.strftime('%Y-%m-%d')} to {response.period_end.strftime('%Y-%m-%d')}"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def present_billing_cost_summary(response: ProjectCostSummary) -> None:
|
|
24
|
+
"""Present billing project cost summary."""
|
|
25
|
+
output = OutputService.get()
|
|
26
|
+
|
|
27
|
+
fields = [
|
|
28
|
+
FieldConfig("project_id", "Project ID", str),
|
|
29
|
+
FieldConfig("project_name", "Project Name"),
|
|
30
|
+
FieldConfig("period", "Period", lambda _: _format_period(response)),
|
|
31
|
+
FieldConfig("execution_count", "Total Executions", str),
|
|
32
|
+
FieldConfig("completed_count", "Completed", str),
|
|
33
|
+
FieldConfig("failed_count", "Failed", str),
|
|
34
|
+
FieldConfig("llm_cost_usd", "LLM Cost", _format_cost),
|
|
35
|
+
FieldConfig("rag_cost_usd", "RAG Cost", _format_cost),
|
|
36
|
+
FieldConfig("total_cost_usd", "Total Cost", _format_cost),
|
|
37
|
+
FieldConfig("avg_cost_usd", "Avg Cost", _format_cost),
|
|
38
|
+
FieldConfig("min_cost_usd", "Min Cost", _format_cost),
|
|
39
|
+
FieldConfig("max_cost_usd", "Max Cost", _format_cost),
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
output.entity(response, "Billing Project Cost Summary", fields)
|
|
@@ -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,60 @@
|
|
|
1
|
+
"""Billing project create command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.billing.projects.create.presenter import (
|
|
8
|
+
present_billing_project_created,
|
|
9
|
+
)
|
|
10
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
11
|
+
|
|
12
|
+
from alloy_runtime_types.dtos.billing import CreateProjectRequest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def billing_projects_create_command(
|
|
16
|
+
name: str = typer.Option(
|
|
17
|
+
...,
|
|
18
|
+
"--name",
|
|
19
|
+
help="Project name (unique per organization)",
|
|
20
|
+
),
|
|
21
|
+
description: Optional[str] = typer.Option(
|
|
22
|
+
None,
|
|
23
|
+
"--description",
|
|
24
|
+
help="Optional project description",
|
|
25
|
+
),
|
|
26
|
+
external_reference: Optional[str] = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"--external-reference",
|
|
29
|
+
help="External billing system identifier",
|
|
30
|
+
),
|
|
31
|
+
) -> None:
|
|
32
|
+
"""Create a new billing project.
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
ai billing projects create --name "Q1 Campaign"
|
|
36
|
+
ai billing projects create --name "Q1 Campaign" --description "Marketing costs"
|
|
37
|
+
"""
|
|
38
|
+
_execute_create(
|
|
39
|
+
name=name,
|
|
40
|
+
description=description,
|
|
41
|
+
external_reference=external_reference,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@async_command
|
|
46
|
+
async def _execute_create(
|
|
47
|
+
name: str,
|
|
48
|
+
description: Optional[str],
|
|
49
|
+
external_reference: Optional[str],
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Execute create billing project operation."""
|
|
52
|
+
async with authenticated_client() as (_config, client):
|
|
53
|
+
request = CreateProjectRequest(
|
|
54
|
+
name=name,
|
|
55
|
+
description=description,
|
|
56
|
+
external_reference=external_reference,
|
|
57
|
+
)
|
|
58
|
+
response = await client.create_billing_project(request)
|
|
59
|
+
|
|
60
|
+
present_billing_project_created(response)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Presenter for billing project create command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.billing import CreateProjectResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_billing_project_created(response: CreateProjectResponse) -> None:
|
|
10
|
+
"""Present created billing project details."""
|
|
11
|
+
output = OutputService.get()
|
|
12
|
+
|
|
13
|
+
fields = [
|
|
14
|
+
FieldConfig("id", "ID", str),
|
|
15
|
+
FieldConfig("name", "Name"),
|
|
16
|
+
FieldConfig("description", "Description", lambda x: x or "-"),
|
|
17
|
+
FieldConfig("external_reference", "External Reference", lambda x: x or "-"),
|
|
18
|
+
FieldConfig("is_active", "Active", lambda x: "Yes" if x else "No"),
|
|
19
|
+
FieldConfig(
|
|
20
|
+
"created_at",
|
|
21
|
+
"Created At",
|
|
22
|
+
lambda x: x.strftime("%Y-%m-%d %H:%M:%S") if x else "-",
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
output.entity(response, "Billing Project Created", fields)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Billing project get command implementation."""
|
|
2
|
+
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.billing.projects.get.presenter import present_billing_project
|
|
8
|
+
from cli.commands.flag_utils import validate_uuid
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def billing_projects_get_command(
|
|
13
|
+
project_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Billing project UUID",
|
|
16
|
+
),
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Get details of a billing project.
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
ai billing projects get 123e4567-89ab-cdef-0123-456789abcdef
|
|
22
|
+
"""
|
|
23
|
+
project_uuid = validate_uuid(project_id, "billing project")
|
|
24
|
+
_execute_get(project_id=project_uuid)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@async_command
|
|
28
|
+
async def _execute_get(project_id: UUID) -> None:
|
|
29
|
+
"""Execute get billing project operation."""
|
|
30
|
+
async with authenticated_client() as (_config, client):
|
|
31
|
+
response = await client.get_billing_project(project_id)
|
|
32
|
+
|
|
33
|
+
present_billing_project(response)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Presenter for billing project get command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.billing import ProjectResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_billing_project(response: ProjectResponse) -> None:
|
|
10
|
+
"""Present billing project details."""
|
|
11
|
+
output = OutputService.get()
|
|
12
|
+
|
|
13
|
+
fields = [
|
|
14
|
+
FieldConfig("id", "ID", str),
|
|
15
|
+
FieldConfig("organization_id", "Organization ID", str),
|
|
16
|
+
FieldConfig("name", "Name"),
|
|
17
|
+
FieldConfig("description", "Description", lambda x: x or "-"),
|
|
18
|
+
FieldConfig("external_reference", "External Reference", lambda x: x or "-"),
|
|
19
|
+
FieldConfig("is_active", "Active", lambda x: "Yes" if x else "No"),
|
|
20
|
+
FieldConfig(
|
|
21
|
+
"created_at",
|
|
22
|
+
"Created At",
|
|
23
|
+
lambda x: x.strftime("%Y-%m-%d %H:%M:%S") if x else "-",
|
|
24
|
+
),
|
|
25
|
+
FieldConfig(
|
|
26
|
+
"updated_at",
|
|
27
|
+
"Updated At",
|
|
28
|
+
lambda x: x.strftime("%Y-%m-%d %H:%M:%S") if x else "-",
|
|
29
|
+
),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
output.entity(response, "Billing Project", fields)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Empty per project convention - import directly from submodules
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Billing projects list command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.billing.projects.list.presenter import present_billing_projects_list
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def billing_projects_list_command(
|
|
10
|
+
limit: int = typer.Option(
|
|
11
|
+
50,
|
|
12
|
+
"-l",
|
|
13
|
+
"--limit",
|
|
14
|
+
min=1,
|
|
15
|
+
max=100,
|
|
16
|
+
help="Max results",
|
|
17
|
+
),
|
|
18
|
+
offset: int = typer.Option(
|
|
19
|
+
0,
|
|
20
|
+
"--offset",
|
|
21
|
+
min=0,
|
|
22
|
+
help="Skip N results",
|
|
23
|
+
),
|
|
24
|
+
) -> None:
|
|
25
|
+
"""List billing projects in your organization.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai billing projects list
|
|
29
|
+
ai billing projects list -l 10
|
|
30
|
+
"""
|
|
31
|
+
_execute_list(limit=limit, offset=offset)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@async_command
|
|
35
|
+
async def _execute_list(limit: int, offset: int) -> None:
|
|
36
|
+
"""Execute list billing projects operation."""
|
|
37
|
+
async with authenticated_client() as (_config, client):
|
|
38
|
+
response = await client.list_billing_projects()
|
|
39
|
+
|
|
40
|
+
present_billing_projects_list(response)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Presenter for billing projects list command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.billing import ProjectListResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_billing_projects_list(response: ProjectListResponse) -> None:
|
|
10
|
+
"""Present list of billing projects."""
|
|
11
|
+
output = OutputService.get()
|
|
12
|
+
|
|
13
|
+
if not response.projects:
|
|
14
|
+
output.info("No billing projects found")
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
columns = [
|
|
18
|
+
ColumnConfig(
|
|
19
|
+
source_field="id",
|
|
20
|
+
header_label="ID",
|
|
21
|
+
compact_line=1,
|
|
22
|
+
compact_style="cyan",
|
|
23
|
+
),
|
|
24
|
+
ColumnConfig(
|
|
25
|
+
source_field="name",
|
|
26
|
+
header_label="Name",
|
|
27
|
+
compact_line=1,
|
|
28
|
+
compact_style="green",
|
|
29
|
+
),
|
|
30
|
+
ColumnConfig(
|
|
31
|
+
source_field="description",
|
|
32
|
+
header_label="Description",
|
|
33
|
+
formatter=lambda x: x[:60] + "..." if x and len(x) > 60 else (x or "-"),
|
|
34
|
+
compact_line=2,
|
|
35
|
+
compact_style="dim",
|
|
36
|
+
),
|
|
37
|
+
ColumnConfig(
|
|
38
|
+
source_field="external_reference",
|
|
39
|
+
header_label="External Ref",
|
|
40
|
+
formatter=lambda x: x or "-",
|
|
41
|
+
compact_line=2,
|
|
42
|
+
compact_style="dim",
|
|
43
|
+
),
|
|
44
|
+
ColumnConfig(
|
|
45
|
+
source_field="is_active",
|
|
46
|
+
header_label="Active",
|
|
47
|
+
formatter=lambda x: "Yes" if x else "No",
|
|
48
|
+
compact_line=1,
|
|
49
|
+
compact_style="white bold",
|
|
50
|
+
),
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
output.table(
|
|
54
|
+
items=response.projects, # type: ignore[arg-type]
|
|
55
|
+
title=f"Billing Projects ({response.total})",
|
|
56
|
+
columns=columns,
|
|
57
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Content delete 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.content.delete.presenter import present_delete_result
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
from cli.infrastructure.console import Confirm
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def content_delete_command(
|
|
14
|
+
content_part_id: str = typer.Argument(
|
|
15
|
+
...,
|
|
16
|
+
help="Content part UUID",
|
|
17
|
+
),
|
|
18
|
+
yes: bool = typer.Option(
|
|
19
|
+
False,
|
|
20
|
+
"-y",
|
|
21
|
+
"--yes",
|
|
22
|
+
help="Skip confirmation",
|
|
23
|
+
),
|
|
24
|
+
) -> None:
|
|
25
|
+
"""Delete a content part.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai content delete 019405e0-e000-7000-f100-000000000001
|
|
29
|
+
ai content delete <id> -y
|
|
30
|
+
"""
|
|
31
|
+
content_uuid = validate_uuid(content_part_id, "content")
|
|
32
|
+
_execute_delete(content_part_id=content_uuid, skip_confirm=yes)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@async_command
|
|
36
|
+
async def _execute_delete(content_part_id: UUID, skip_confirm: bool) -> None:
|
|
37
|
+
"""Execute delete content part operation."""
|
|
38
|
+
if not skip_confirm:
|
|
39
|
+
short_id = str(content_part_id)[:8]
|
|
40
|
+
confirmed = Confirm.ask(
|
|
41
|
+
f"[yellow]Delete content part '{short_id}...'?[/yellow] This cannot be undone"
|
|
42
|
+
)
|
|
43
|
+
if not confirmed:
|
|
44
|
+
raise typer.Abort()
|
|
45
|
+
|
|
46
|
+
async with authenticated_client() as (_config, client):
|
|
47
|
+
response = await client.delete_content_part(content_part_id)
|
|
48
|
+
|
|
49
|
+
present_delete_result(response)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Presenter for content delete command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.content import DeleteContentPartResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_delete_result(response: DeleteContentPartResponse) -> None:
|
|
8
|
+
"""Present content part deletion result.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
response: DeleteContentPartResponse from server
|
|
12
|
+
"""
|
|
13
|
+
output = OutputService.get()
|
|
14
|
+
deleted = response.deleted_content_part
|
|
15
|
+
|
|
16
|
+
# Use short UUID for display (first 8 chars)
|
|
17
|
+
short_id = str(deleted.id)[:8]
|
|
18
|
+
output.success(f"Content part '{short_id}...' deleted successfully")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|