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,102 @@
|
|
|
1
|
+
"""Lines formatter for easy-to-copy terminal output.
|
|
2
|
+
|
|
3
|
+
Outputs each field on its own line, making individual values easy to copy
|
|
4
|
+
without table formatting artifacts.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from cli.infrastructure.formatters.base import ColumnMeta, Formatter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LinesFormatter(Formatter):
|
|
13
|
+
"""Formatter that outputs each field on its own line for easy copying."""
|
|
14
|
+
|
|
15
|
+
def format_entity(self, data: dict[str, Any], title: str | None = None) -> str:
|
|
16
|
+
"""Format entity as key-value lines.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
data: Dictionary mapping field labels to values
|
|
20
|
+
title: Optional title displayed above the data
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
String with each field on its own line
|
|
24
|
+
"""
|
|
25
|
+
lines: list[str] = []
|
|
26
|
+
|
|
27
|
+
if title:
|
|
28
|
+
lines.append(title)
|
|
29
|
+
lines.append("-" * len(title))
|
|
30
|
+
|
|
31
|
+
for field, value in data.items():
|
|
32
|
+
display_value = "(not set)" if value is None else str(value)
|
|
33
|
+
lines.append(f"{field}: {display_value}")
|
|
34
|
+
|
|
35
|
+
return "\n".join(lines)
|
|
36
|
+
|
|
37
|
+
def format_list(
|
|
38
|
+
self,
|
|
39
|
+
items: list[dict[str, Any]],
|
|
40
|
+
title: str | None = None,
|
|
41
|
+
columns: list[ColumnMeta] | None = None,
|
|
42
|
+
) -> str:
|
|
43
|
+
"""Format list as blocks of key-value lines.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
items: List of dictionaries, each representing one item
|
|
47
|
+
title: Optional title displayed above the list
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
String with each item as a block separated by blank lines
|
|
51
|
+
"""
|
|
52
|
+
if not items:
|
|
53
|
+
return self.format_info("No items to display")
|
|
54
|
+
|
|
55
|
+
lines: list[str] = []
|
|
56
|
+
|
|
57
|
+
if title:
|
|
58
|
+
lines.append(title)
|
|
59
|
+
lines.append("=" * len(title))
|
|
60
|
+
lines.append("")
|
|
61
|
+
|
|
62
|
+
for i, item in enumerate(items, start=1):
|
|
63
|
+
lines.append(f"--- Item {i} ---")
|
|
64
|
+
for field, value in item.items():
|
|
65
|
+
display_value = "(not set)" if value is None else str(value)
|
|
66
|
+
lines.append(f"{field}: {display_value}")
|
|
67
|
+
lines.append("") # Blank line between items
|
|
68
|
+
|
|
69
|
+
return "\n".join(lines).rstrip()
|
|
70
|
+
|
|
71
|
+
def format_success(self, message: str) -> str:
|
|
72
|
+
"""Format success message with prefix.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
message: Success message text
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
Prefixed success message
|
|
79
|
+
"""
|
|
80
|
+
return f"[OK] {message}"
|
|
81
|
+
|
|
82
|
+
def format_info(self, message: str) -> str:
|
|
83
|
+
"""Format info message with prefix.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
message: Info message text
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Prefixed info message
|
|
90
|
+
"""
|
|
91
|
+
return f"[INFO] {message}"
|
|
92
|
+
|
|
93
|
+
def format_warning(self, message: str) -> str:
|
|
94
|
+
"""Format warning message with prefix.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
message: Warning message text
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Prefixed warning message
|
|
101
|
+
"""
|
|
102
|
+
return f"[WARN] {message}"
|
|
File without changes
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""Field formatting utilities for common data types.
|
|
2
|
+
|
|
3
|
+
Provides reusable formatters for UUIDs, dates, currency, tokens, etc.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
from typing import Any, Callable
|
|
9
|
+
from uuid import UUID
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def format_uuid(value: UUID | None, short: bool = True) -> str:
|
|
13
|
+
"""Format UUID for display.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
value: UUID to format (None returns placeholder)
|
|
17
|
+
short: If True, show first 8 characters with "...". If False, show full UUID.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Formatted UUID string or "(not set)" for None
|
|
21
|
+
"""
|
|
22
|
+
if value is None:
|
|
23
|
+
return "(not set)"
|
|
24
|
+
|
|
25
|
+
if short:
|
|
26
|
+
return str(value)[:8] + "..."
|
|
27
|
+
return str(value)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def format_datetime(
|
|
31
|
+
value: datetime | None, mode: str = "absolute", include_time: bool = True
|
|
32
|
+
) -> str:
|
|
33
|
+
"""Format datetime for display.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
value: Datetime to format (None returns placeholder)
|
|
37
|
+
mode: Format mode - "absolute", "iso", or "date_only"
|
|
38
|
+
include_time: Whether to include time component
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Formatted datetime string or "(not set)" for None
|
|
42
|
+
"""
|
|
43
|
+
if value is None:
|
|
44
|
+
return "(not set)"
|
|
45
|
+
|
|
46
|
+
if mode == "iso":
|
|
47
|
+
return value.isoformat()
|
|
48
|
+
elif mode == "date_only":
|
|
49
|
+
return value.strftime("%Y-%m-%d")
|
|
50
|
+
else: # absolute
|
|
51
|
+
if include_time:
|
|
52
|
+
return value.strftime("%Y-%m-%d %H:%M:%S UTC")
|
|
53
|
+
return value.strftime("%Y-%m-%d")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def format_cost(amount: Decimal | float, currency: str = "USD") -> str:
|
|
57
|
+
"""Format monetary amount.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
amount: Decimal or float amount
|
|
61
|
+
currency: Currency code (default USD, reserved for future use)
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Formatted currency string
|
|
65
|
+
"""
|
|
66
|
+
_ = currency # Reserved for future multi-currency support
|
|
67
|
+
# Convert float to Decimal for precision
|
|
68
|
+
if isinstance(amount, float):
|
|
69
|
+
amount = Decimal(str(amount))
|
|
70
|
+
|
|
71
|
+
# Format with full precision (no rounding for small amounts)
|
|
72
|
+
return f"${amount}"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def format_tokens(count: int) -> str:
|
|
76
|
+
"""Format token count with thousands separator.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
count: Number of tokens
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Formatted token count string
|
|
83
|
+
"""
|
|
84
|
+
return f"{count:,}"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def format_boolean(value: bool, mode: str = "text") -> str:
|
|
88
|
+
"""Format boolean value for display.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
value: Boolean value to format
|
|
92
|
+
mode: Format mode - "text", "emoji", or "raw"
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Formatted boolean string
|
|
96
|
+
"""
|
|
97
|
+
if mode == "emoji":
|
|
98
|
+
return "✓" if value else "✗"
|
|
99
|
+
elif mode == "raw":
|
|
100
|
+
return str(value)
|
|
101
|
+
else: # text
|
|
102
|
+
return "Yes" if value else "No"
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def format_optional(
|
|
106
|
+
value: Any | None,
|
|
107
|
+
formatter: Callable[[Any], str] | None = None,
|
|
108
|
+
placeholder: str = "(not set)",
|
|
109
|
+
) -> str:
|
|
110
|
+
"""Format optional value with placeholder for None.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
value: Value to format (may be None)
|
|
114
|
+
formatter: Optional formatter function to apply if value is not None
|
|
115
|
+
placeholder: Text to display when value is None
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Formatted value or placeholder
|
|
119
|
+
"""
|
|
120
|
+
if value is None:
|
|
121
|
+
return placeholder
|
|
122
|
+
if formatter:
|
|
123
|
+
return formatter(value)
|
|
124
|
+
return str(value)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def format_enum(value: Any, capitalize: bool = True) -> str:
|
|
128
|
+
"""Format enum value for display.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
value: Enum value (expected to have .value attribute)
|
|
132
|
+
capitalize: Whether to capitalize the output
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Formatted enum string
|
|
136
|
+
"""
|
|
137
|
+
if hasattr(value, "value"):
|
|
138
|
+
text = str(value.value)
|
|
139
|
+
else:
|
|
140
|
+
text = str(value)
|
|
141
|
+
|
|
142
|
+
if capitalize:
|
|
143
|
+
return text.capitalize()
|
|
144
|
+
return text
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def format_percentage(value: float, decimals: int = 1) -> str:
|
|
148
|
+
"""Format percentage value.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
value: Percentage as float (e.g., 0.85 for 85%)
|
|
152
|
+
decimals: Number of decimal places
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Formatted percentage string
|
|
156
|
+
"""
|
|
157
|
+
return f"{value * 100:.{decimals}f}%"
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def format_file_size(bytes_count: int) -> str:
|
|
161
|
+
"""Format file size in human-readable format.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
bytes_count: Size in bytes
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Formatted size string (e.g., "1.5 MB")
|
|
168
|
+
"""
|
|
169
|
+
size = float(bytes_count)
|
|
170
|
+
for unit in ["B", "KB", "MB", "GB", "TB"]:
|
|
171
|
+
if size < 1024.0:
|
|
172
|
+
return f"{size:.1f} {unit}"
|
|
173
|
+
size /= 1024.0
|
|
174
|
+
return f"{size:.1f} PB"
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def format_duration_ms(milliseconds: int) -> str:
|
|
178
|
+
"""Format duration in milliseconds to human-readable format.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
milliseconds: Duration in milliseconds
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Formatted duration string
|
|
185
|
+
"""
|
|
186
|
+
if milliseconds < 1000:
|
|
187
|
+
return f"{milliseconds}ms"
|
|
188
|
+
elif milliseconds < 60000:
|
|
189
|
+
seconds = milliseconds / 1000
|
|
190
|
+
return f"{seconds:.2f}s"
|
|
191
|
+
else:
|
|
192
|
+
minutes = milliseconds / 60000
|
|
193
|
+
return f"{minutes:.2f}min"
|
|
File without changes
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Agent picker component for selecting base agents.
|
|
2
|
+
|
|
3
|
+
A specialized search picker that uses the ApiClient to fetch agents
|
|
4
|
+
and returns the selected agent's ID.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from alloy_runtime_sdk.api_client.client import ApiClient
|
|
10
|
+
|
|
11
|
+
from cli.infrastructure.forms.base_picker import SingleSelectPicker
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _format_agent(agent: dict[str, Any]) -> str:
|
|
15
|
+
"""Format an agent for display in the picker."""
|
|
16
|
+
name = agent.get("name", "Unknown")
|
|
17
|
+
description = agent.get("description")
|
|
18
|
+
model_count = agent.get("model_count", 0)
|
|
19
|
+
|
|
20
|
+
parts = [name]
|
|
21
|
+
if model_count:
|
|
22
|
+
parts.append(f"({model_count} model{'s' if model_count != 1 else ''})")
|
|
23
|
+
if description:
|
|
24
|
+
# Truncate long descriptions
|
|
25
|
+
if len(description) > 40:
|
|
26
|
+
description = description[:37] + "..."
|
|
27
|
+
parts.append(f"- {description}")
|
|
28
|
+
|
|
29
|
+
return " ".join(parts)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class AgentPicker(SingleSelectPicker[dict[str, Any]]):
|
|
33
|
+
"""Agent picker for selecting base agents.
|
|
34
|
+
|
|
35
|
+
Searches agents via the ApiClient and returns the selected agent's ID.
|
|
36
|
+
User sees friendly agent names, not UUIDs.
|
|
37
|
+
|
|
38
|
+
Usage:
|
|
39
|
+
yield AgentPicker(
|
|
40
|
+
client=server_client,
|
|
41
|
+
id="base-agent",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Get selected agent ID
|
|
45
|
+
picker = self.query_one("#base-agent", AgentPicker)
|
|
46
|
+
agent_id = picker.selected_agent_id # UUID string or None
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
client: ApiClient,
|
|
52
|
+
placeholder: str = "Search agents (e.g., my writer agent)...",
|
|
53
|
+
empty_message: str = "No base agent selected (optional)",
|
|
54
|
+
fetch_on_mount: bool = True,
|
|
55
|
+
**kwargs: Any,
|
|
56
|
+
) -> None:
|
|
57
|
+
"""Initialize the agent picker.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
client: ApiClient instance for API calls
|
|
61
|
+
placeholder: Placeholder text for search input
|
|
62
|
+
empty_message: Message shown when nothing is selected
|
|
63
|
+
fetch_on_mount: If True, show recent agents when picker opens (default True)
|
|
64
|
+
"""
|
|
65
|
+
super().__init__(
|
|
66
|
+
client=client,
|
|
67
|
+
placeholder=placeholder,
|
|
68
|
+
empty_message=empty_message,
|
|
69
|
+
fetch_on_mount=fetch_on_mount,
|
|
70
|
+
**kwargs,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def selected_agent_id(self) -> str | None:
|
|
75
|
+
"""Alias for selected_id - returns the agent UUID."""
|
|
76
|
+
return self.selected_id
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def selected_agent_name(self) -> str | None:
|
|
80
|
+
"""Get the name of the selected agent."""
|
|
81
|
+
if self._selected_item is None:
|
|
82
|
+
return None
|
|
83
|
+
return self._selected_item.get("name")
|
|
84
|
+
|
|
85
|
+
async def _fetch_items(self, query: str) -> list[dict[str, Any]]:
|
|
86
|
+
"""Fetch agents matching query from the API.
|
|
87
|
+
|
|
88
|
+
When query is empty, returns recent agents sorted by updated_at.
|
|
89
|
+
"""
|
|
90
|
+
response = await self._client.list_agents(
|
|
91
|
+
search=query if query else None,
|
|
92
|
+
limit=10 if not query else 50,
|
|
93
|
+
)
|
|
94
|
+
return [agent.model_dump() for agent in response.agents]
|
|
95
|
+
|
|
96
|
+
def _format_item(self, item: dict[str, Any]) -> str:
|
|
97
|
+
"""Format agent for display in option list."""
|
|
98
|
+
return _format_agent(item)
|
|
99
|
+
|
|
100
|
+
def _get_item_id(self, item: dict[str, Any]) -> str:
|
|
101
|
+
"""Get unique identifier for an agent."""
|
|
102
|
+
return str(item.get("id", ""))
|
|
103
|
+
|
|
104
|
+
def set_initial_agent(self, agent: dict[str, Any]) -> None:
|
|
105
|
+
"""Pre-populate the picker with an existing agent selection.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
agent: Agent dict with at least 'id' and 'name' keys
|
|
109
|
+
"""
|
|
110
|
+
self.set_initial_selection(agent)
|
|
111
|
+
|
|
112
|
+
def set_initial_agent_by_id(
|
|
113
|
+
self, agent_id: str, name: str = "Selected Agent"
|
|
114
|
+
) -> None:
|
|
115
|
+
"""Pre-populate the picker with an agent by its ID.
|
|
116
|
+
|
|
117
|
+
Use this when you only have the agent ID and not the full agent data.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
agent_id: The agent UUID
|
|
121
|
+
name: Display name for the agent
|
|
122
|
+
"""
|
|
123
|
+
self.set_initial_selection({"id": agent_id, "name": name})
|