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,118 @@
|
|
|
1
|
+
"""Bootstrap admin command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.auth_storage import save_credentials
|
|
6
|
+
from cli.infrastructure.command import async_command
|
|
7
|
+
from cli.infrastructure.config import get_api_url
|
|
8
|
+
from cli.infrastructure.console import Prompt
|
|
9
|
+
from cli.infrastructure.output import print_info, print_success
|
|
10
|
+
from alloy_runtime_sdk.api_client.client import ApiClient
|
|
11
|
+
from alloy_runtime_types.dtos.auth import BootstrapAdminRequest
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def bootstrap_admin_command(
|
|
15
|
+
email: str | None = typer.Option(None, "--email", "-e", help="Admin email address"),
|
|
16
|
+
password: str | None = typer.Option(
|
|
17
|
+
None, "--password", "-p", help="Password (not recommended for security)"
|
|
18
|
+
),
|
|
19
|
+
name: str | None = typer.Option(None, "--name", "-n", help="Admin display name"),
|
|
20
|
+
org_name: str = typer.Option(
|
|
21
|
+
"Platform Team",
|
|
22
|
+
"--org",
|
|
23
|
+
"-o",
|
|
24
|
+
help="Organization name for system admin",
|
|
25
|
+
),
|
|
26
|
+
token: str | None = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"--token",
|
|
29
|
+
"-t",
|
|
30
|
+
envvar="BOOTSTRAP_TOKEN",
|
|
31
|
+
help="Bootstrap security token (required, can use BOOTSTRAP_TOKEN env var)",
|
|
32
|
+
),
|
|
33
|
+
) -> None:
|
|
34
|
+
"""Bootstrap the first system administrator.
|
|
35
|
+
|
|
36
|
+
This command creates the initial system admin user when setting up
|
|
37
|
+
a new instance. It can only be run ONCE - if any users already exist,
|
|
38
|
+
it will fail with a safety error.
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
|
|
42
|
+
# Interactive (recommended for security)
|
|
43
|
+
ai2 admin bootstrap
|
|
44
|
+
|
|
45
|
+
# Non-interactive (for automation)
|
|
46
|
+
ai2 admin bootstrap -e admin@example.com -p SecurePass123 -n "Admin User"
|
|
47
|
+
|
|
48
|
+
Security Notes:
|
|
49
|
+
- Only works on a fresh database with no users
|
|
50
|
+
- Creates a system_admin user with full privileges
|
|
51
|
+
- Stores credentials securely with bcrypt
|
|
52
|
+
"""
|
|
53
|
+
_execute_bootstrap(email, password, name, org_name, token)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@async_command
|
|
57
|
+
async def _execute_bootstrap(
|
|
58
|
+
email: str | None,
|
|
59
|
+
password: str | None,
|
|
60
|
+
name: str | None,
|
|
61
|
+
org_name: str,
|
|
62
|
+
token: str | None,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""Execute the bootstrap operation."""
|
|
65
|
+
api_url = get_api_url()
|
|
66
|
+
|
|
67
|
+
# Prompt for required fields if not provided
|
|
68
|
+
if not email:
|
|
69
|
+
email = Prompt.ask("[cyan]Admin email address[/cyan]")
|
|
70
|
+
|
|
71
|
+
if not name:
|
|
72
|
+
name = Prompt.ask("[cyan]Admin name[/cyan]")
|
|
73
|
+
|
|
74
|
+
if not token:
|
|
75
|
+
token = Prompt.ask(
|
|
76
|
+
"[cyan]Bootstrap token[/cyan] (from server's BOOTSTRAP_TOKEN env var)",
|
|
77
|
+
password=True,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if not password:
|
|
81
|
+
while True:
|
|
82
|
+
password = Prompt.ask("[cyan]Password[/cyan] (min 8 chars)", password=True)
|
|
83
|
+
confirm = Prompt.ask("[cyan]Confirm password[/cyan]", password=True)
|
|
84
|
+
|
|
85
|
+
if password != confirm:
|
|
86
|
+
print_info("Passwords don't match. Please try again.")
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
if len(password) < 8:
|
|
90
|
+
print_info("Password must be at least 8 characters.")
|
|
91
|
+
continue
|
|
92
|
+
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
# Create the bootstrap request
|
|
96
|
+
request = BootstrapAdminRequest(
|
|
97
|
+
email=email,
|
|
98
|
+
password=password,
|
|
99
|
+
name=name,
|
|
100
|
+
organization_name=org_name,
|
|
101
|
+
bootstrap_token=token,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Send request to server (no API key needed - bootstrapping fresh system)
|
|
105
|
+
async with ApiClient(base_url=api_url, api_key="") as client:
|
|
106
|
+
response = await client.bootstrap_admin(request)
|
|
107
|
+
|
|
108
|
+
# Save credentials
|
|
109
|
+
save_credentials(api_url, response.api_key)
|
|
110
|
+
|
|
111
|
+
# Show success
|
|
112
|
+
print_success(f"System administrator created for {response.name}")
|
|
113
|
+
print_info(f"Email: {response.email}")
|
|
114
|
+
print_info(f"Organization ID: {response.organization_id}")
|
|
115
|
+
print_info("API key saved to ~/.alloy-runtime/config")
|
|
116
|
+
print_info("")
|
|
117
|
+
print_info("You are now logged in as the system administrator.")
|
|
118
|
+
print_info("You can now run admin commands like: [cyan]ai2 sync models[/cyan]")
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Admin credentials create command implementation."""
|
|
2
|
+
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from cli.commands.admin.credentials.create.presenter import (
|
|
9
|
+
present_credential_create_success,
|
|
10
|
+
)
|
|
11
|
+
from cli.commands.flag_utils import validate_provider
|
|
12
|
+
from cli.commands.shared_flags import (
|
|
13
|
+
CREDENTIAL_VALUE,
|
|
14
|
+
DESCRIPTION,
|
|
15
|
+
NAME,
|
|
16
|
+
PROVIDER_REQUIRED,
|
|
17
|
+
)
|
|
18
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
19
|
+
from alloy_runtime_types.dtos.credentials import CreateSystemCredentialRequest
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def admin_credentials_create_command(
|
|
23
|
+
credential_type_id: str = typer.Option(
|
|
24
|
+
...,
|
|
25
|
+
"--type",
|
|
26
|
+
help="Credential type (e.g., system_provider)",
|
|
27
|
+
),
|
|
28
|
+
name: str = NAME,
|
|
29
|
+
plaintext_value: str = CREDENTIAL_VALUE,
|
|
30
|
+
provider: str = PROVIDER_REQUIRED,
|
|
31
|
+
description: Optional[str] = DESCRIPTION,
|
|
32
|
+
priority: int = typer.Option(
|
|
33
|
+
0,
|
|
34
|
+
"--priority",
|
|
35
|
+
help="Selection priority (default: 0)",
|
|
36
|
+
),
|
|
37
|
+
is_default: bool = typer.Option(
|
|
38
|
+
False,
|
|
39
|
+
"--default",
|
|
40
|
+
help="Default credential for provider",
|
|
41
|
+
),
|
|
42
|
+
daily_request_limit: Optional[int] = typer.Option(
|
|
43
|
+
None,
|
|
44
|
+
"--daily-limit",
|
|
45
|
+
help="Daily request limit",
|
|
46
|
+
),
|
|
47
|
+
monthly_cost_limit_usd: Optional[str] = typer.Option(
|
|
48
|
+
None,
|
|
49
|
+
"--monthly-cost-limit",
|
|
50
|
+
help="Monthly USD limit (e.g., 50.00)",
|
|
51
|
+
),
|
|
52
|
+
requests_per_minute_limit: Optional[int] = typer.Option(
|
|
53
|
+
None,
|
|
54
|
+
"--rate-limit",
|
|
55
|
+
help="Requests/minute limit",
|
|
56
|
+
),
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Create a system credential (requires system admin).
|
|
59
|
+
|
|
60
|
+
SECURITY: Use env var: --value "$OPENAI_API_KEY"
|
|
61
|
+
|
|
62
|
+
Examples:
|
|
63
|
+
|
|
64
|
+
ai admin credentials create --type system_provider -n "OpenAI" --value "sk-..." -p openai
|
|
65
|
+
ai admin credentials create --type system_provider -n "Default" --value "sk-..." -p openrouter --default
|
|
66
|
+
"""
|
|
67
|
+
_execute_create(
|
|
68
|
+
credential_type_id=credential_type_id,
|
|
69
|
+
name=name,
|
|
70
|
+
plaintext_value=plaintext_value,
|
|
71
|
+
provider=provider,
|
|
72
|
+
description=description,
|
|
73
|
+
priority=priority,
|
|
74
|
+
is_default=is_default,
|
|
75
|
+
daily_request_limit=daily_request_limit,
|
|
76
|
+
monthly_cost_limit_usd=monthly_cost_limit_usd,
|
|
77
|
+
requests_per_minute_limit=requests_per_minute_limit,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@async_command
|
|
82
|
+
async def _execute_create(
|
|
83
|
+
credential_type_id: str,
|
|
84
|
+
name: str,
|
|
85
|
+
plaintext_value: str,
|
|
86
|
+
provider: str,
|
|
87
|
+
description: Optional[str],
|
|
88
|
+
priority: int,
|
|
89
|
+
is_default: bool,
|
|
90
|
+
daily_request_limit: Optional[int],
|
|
91
|
+
monthly_cost_limit_usd: Optional[str],
|
|
92
|
+
requests_per_minute_limit: Optional[int],
|
|
93
|
+
) -> None:
|
|
94
|
+
"""Execute the credential creation operation.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
credential_type_id: Credential type ID
|
|
98
|
+
name: Friendly name
|
|
99
|
+
plaintext_value: API key value
|
|
100
|
+
provider: Provider key string
|
|
101
|
+
description: Optional description
|
|
102
|
+
priority: Priority for selection
|
|
103
|
+
is_default: Whether this is the default for the provider
|
|
104
|
+
daily_request_limit: Optional daily request limit
|
|
105
|
+
monthly_cost_limit_usd: Optional monthly cost limit as string
|
|
106
|
+
requests_per_minute_limit: Optional rate limit
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
ConfigurationError: If environment variables are missing
|
|
110
|
+
AuthenticationError: If API key is invalid
|
|
111
|
+
ForbiddenError: If user is not system admin
|
|
112
|
+
ValidationError: If request data is invalid
|
|
113
|
+
ConflictError: If duplicate default credential exists
|
|
114
|
+
ServerError: If server returns 5xx error
|
|
115
|
+
"""
|
|
116
|
+
# Validate and convert provider string to enum
|
|
117
|
+
provider_enum = validate_provider(provider)
|
|
118
|
+
|
|
119
|
+
# Convert monthly cost limit string to Decimal if provided
|
|
120
|
+
monthly_cost_decimal = None
|
|
121
|
+
if monthly_cost_limit_usd is not None:
|
|
122
|
+
try:
|
|
123
|
+
monthly_cost_decimal = Decimal(monthly_cost_limit_usd)
|
|
124
|
+
except Exception:
|
|
125
|
+
raise typer.BadParameter(
|
|
126
|
+
f"Invalid monthly cost limit '{monthly_cost_limit_usd}'. Must be a valid decimal number (e.g., '50.00')"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Build request
|
|
130
|
+
request = CreateSystemCredentialRequest(
|
|
131
|
+
credential_type_id=credential_type_id,
|
|
132
|
+
name=name,
|
|
133
|
+
plaintext_value=plaintext_value,
|
|
134
|
+
provider_key=provider_enum,
|
|
135
|
+
description=description,
|
|
136
|
+
priority=priority,
|
|
137
|
+
is_default=is_default,
|
|
138
|
+
daily_request_limit=daily_request_limit,
|
|
139
|
+
monthly_cost_limit_usd=monthly_cost_decimal,
|
|
140
|
+
requests_per_minute_limit=requests_per_minute_limit,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# Execute API call with authenticated client
|
|
144
|
+
async with authenticated_client() as (_config, client):
|
|
145
|
+
response = await client.create_system_credential(request)
|
|
146
|
+
|
|
147
|
+
# Present success output
|
|
148
|
+
present_credential_create_success(response)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Presenter for admin credentials create command output."""
|
|
2
|
+
|
|
3
|
+
from cli.commands.credentials.update.fields import CREDENTIAL_FIELDS
|
|
4
|
+
from cli.infrastructure.output import OutputService
|
|
5
|
+
from alloy_runtime_types.dtos.credentials import SystemCredentialResponse
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def present_credential_create_success(credential: SystemCredentialResponse) -> None:
|
|
9
|
+
"""Present a successful credential creation with Rich formatting.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
credential: Created credential data from server
|
|
13
|
+
"""
|
|
14
|
+
output = OutputService.get()
|
|
15
|
+
output.success(f"Created system credential: {credential.name}")
|
|
16
|
+
output.entity(credential, "System Credential Details", CREDENTIAL_FIELDS)
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Admin credentials grant command implementation."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from cli.commands.admin.credentials.grant.presenter import present_grant_success
|
|
10
|
+
from cli.commands.flag_utils import require_one_of, require_exclusive, validate_uuid
|
|
11
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
12
|
+
from alloy_runtime_types.dtos.credentials import GrantSystemCredentialRequest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def admin_credentials_grant_command(
|
|
16
|
+
credential_id: str = typer.Option(
|
|
17
|
+
...,
|
|
18
|
+
"--credential",
|
|
19
|
+
help="System credential ID",
|
|
20
|
+
),
|
|
21
|
+
user_id: Optional[str] = typer.Option(
|
|
22
|
+
None,
|
|
23
|
+
"--user",
|
|
24
|
+
help="User ID (mutually exclusive with --org)",
|
|
25
|
+
),
|
|
26
|
+
organization_id: Optional[str] = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"--org",
|
|
29
|
+
help="Organization ID (mutually exclusive with --user)",
|
|
30
|
+
),
|
|
31
|
+
expires_at: Optional[str] = typer.Option(
|
|
32
|
+
None,
|
|
33
|
+
"--expires-at",
|
|
34
|
+
help="Expiration (ISO 8601)",
|
|
35
|
+
),
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Grant system credential access (requires system admin).
|
|
38
|
+
|
|
39
|
+
Exactly one of --user or --org required.
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
|
|
43
|
+
ai admin credentials grant --credential <id> --org <org-id>
|
|
44
|
+
ai admin credentials grant --credential <id> --user <user-id>
|
|
45
|
+
"""
|
|
46
|
+
_execute_grant(
|
|
47
|
+
credential_id=credential_id,
|
|
48
|
+
user_id=user_id,
|
|
49
|
+
organization_id=organization_id,
|
|
50
|
+
expires_at=expires_at,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@async_command
|
|
55
|
+
async def _execute_grant(
|
|
56
|
+
credential_id: str,
|
|
57
|
+
user_id: Optional[str],
|
|
58
|
+
organization_id: Optional[str],
|
|
59
|
+
expires_at: Optional[str],
|
|
60
|
+
) -> None:
|
|
61
|
+
"""Execute the credential grant operation.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
credential_id: System credential ID (string UUID)
|
|
65
|
+
user_id: Optional user ID (string UUID)
|
|
66
|
+
organization_id: Optional organization ID (string UUID)
|
|
67
|
+
expires_at: Optional expiration datetime (ISO 8601 string)
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
typer.BadParameter: If UUID or datetime format is invalid
|
|
71
|
+
typer.BadParameter: If neither or both target IDs are provided
|
|
72
|
+
ConfigurationError: If environment variables are missing
|
|
73
|
+
AuthenticationError: If API key is invalid
|
|
74
|
+
ForbiddenError: If user is not system admin
|
|
75
|
+
ValidationError: If request data is invalid (neither/both targets)
|
|
76
|
+
ConflictError: If grant already exists
|
|
77
|
+
ServerError: If server returns 5xx error
|
|
78
|
+
"""
|
|
79
|
+
# Validate and convert credential_id to UUID
|
|
80
|
+
credential_uuid = validate_uuid(credential_id, "credential")
|
|
81
|
+
|
|
82
|
+
# Validate mutual exclusivity at CLI level for better UX
|
|
83
|
+
require_one_of(("--user", user_id), ("--org", organization_id))
|
|
84
|
+
require_exclusive(("--user", user_id), ("--org", organization_id))
|
|
85
|
+
|
|
86
|
+
# Convert UUIDs
|
|
87
|
+
user_uuid: Optional[UUID] = None
|
|
88
|
+
org_uuid: Optional[UUID] = None
|
|
89
|
+
|
|
90
|
+
if user_id:
|
|
91
|
+
user_uuid = validate_uuid(user_id, "user")
|
|
92
|
+
|
|
93
|
+
if organization_id:
|
|
94
|
+
org_uuid = validate_uuid(organization_id, "organization")
|
|
95
|
+
|
|
96
|
+
# Parse expires_at if provided
|
|
97
|
+
expires_datetime: Optional[datetime] = None
|
|
98
|
+
if expires_at:
|
|
99
|
+
try:
|
|
100
|
+
expires_datetime = datetime.fromisoformat(expires_at.replace("Z", "+00:00"))
|
|
101
|
+
except ValueError:
|
|
102
|
+
raise typer.BadParameter(
|
|
103
|
+
f"Invalid datetime format: '{expires_at}'. Must be ISO 8601 format (e.g., '2025-12-31T23:59:59Z')"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Build request
|
|
107
|
+
request = GrantSystemCredentialRequest(
|
|
108
|
+
credential_id=credential_uuid,
|
|
109
|
+
user_id=user_uuid,
|
|
110
|
+
organization_id=org_uuid,
|
|
111
|
+
expires_at=expires_datetime,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Execute API call with authenticated client
|
|
115
|
+
async with authenticated_client() as (_config, client):
|
|
116
|
+
response = await client.grant_system_credential(request)
|
|
117
|
+
|
|
118
|
+
# Present success output
|
|
119
|
+
present_grant_success(response)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Field definitions for system credential grant presentation."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.formatting.fields import format_datetime, format_uuid
|
|
6
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def format_optional_uuid(value: Any) -> str:
|
|
10
|
+
"""Format optional UUID value."""
|
|
11
|
+
return format_uuid(value, short=False) if value else "(not set)"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def format_optional_datetime(value: Any) -> str:
|
|
15
|
+
"""Format optional datetime value."""
|
|
16
|
+
return format_datetime(value) if value else "(not set)"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
GRANT_FIELDS: list[FieldConfig] = [
|
|
20
|
+
FieldConfig("id", "Grant ID", lambda v: format_uuid(v, short=False)),
|
|
21
|
+
FieldConfig(
|
|
22
|
+
"credential_id", "Credential ID", lambda v: format_uuid(v, short=False)
|
|
23
|
+
),
|
|
24
|
+
FieldConfig("organization_id", "Organization ID", format_optional_uuid),
|
|
25
|
+
FieldConfig("user_id", "User ID", format_optional_uuid),
|
|
26
|
+
FieldConfig(
|
|
27
|
+
"granted_by_user_id",
|
|
28
|
+
"Granted By User ID",
|
|
29
|
+
lambda v: format_uuid(v, short=False),
|
|
30
|
+
),
|
|
31
|
+
FieldConfig("granted_at", "Granted At", format_datetime),
|
|
32
|
+
FieldConfig("expires_at", "Expires At", format_optional_datetime),
|
|
33
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Presenter for admin credentials grant command output."""
|
|
2
|
+
|
|
3
|
+
from cli.commands.admin.credentials.grant.fields import GRANT_FIELDS
|
|
4
|
+
from cli.infrastructure.output import OutputService
|
|
5
|
+
from alloy_runtime_types.dtos.credentials import GrantSystemCredentialResponse
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def present_grant_success(grant: GrantSystemCredentialResponse) -> None:
|
|
9
|
+
"""Present a successful credential grant with Rich formatting.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
grant: Created grant data from server
|
|
13
|
+
"""
|
|
14
|
+
output = OutputService.get()
|
|
15
|
+
|
|
16
|
+
# Determine target type for success message
|
|
17
|
+
if grant.organization_id:
|
|
18
|
+
target = f"organization {grant.organization_id}"
|
|
19
|
+
else:
|
|
20
|
+
target = f"user {grant.user_id}"
|
|
21
|
+
|
|
22
|
+
output.success(f"Granted system credential access to {target}")
|
|
23
|
+
output.entity(grant, "System Credential Grant Details", GRANT_FIELDS)
|
|
File without changes
|
|
File without changes
|