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
cli/tui/screens/base.py
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"""Base classes for TUI screens.
|
|
2
|
+
|
|
3
|
+
This module provides base classes and common patterns for building
|
|
4
|
+
consistent screens across the application.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
import subprocess
|
|
10
|
+
import tempfile
|
|
11
|
+
from abc import abstractmethod
|
|
12
|
+
from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
|
|
13
|
+
|
|
14
|
+
from textual import on, work
|
|
15
|
+
from textual.app import ComposeResult
|
|
16
|
+
from textual.containers import Horizontal, Vertical, VerticalScroll
|
|
17
|
+
from textual.widget import Widget
|
|
18
|
+
from textual.widgets import DataTable, Input, Static
|
|
19
|
+
|
|
20
|
+
from alloy_runtime_sdk.api_client.client import ApiClient
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from cli.tui.app import AlloyRuntimeApp
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
# Type variable for the item type that screens display
|
|
28
|
+
ItemT = TypeVar("ItemT")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class BrowserWidget(Widget, Generic[ItemT]):
|
|
32
|
+
"""Base widget for browser-style views with search, list, and detail panels.
|
|
33
|
+
|
|
34
|
+
This is a Widget (not a Screen) that provides a consistent layout with:
|
|
35
|
+
- Search input at top
|
|
36
|
+
- Status bar showing result count
|
|
37
|
+
- Split view with list on left, detail/preview on right
|
|
38
|
+
|
|
39
|
+
This widget is meant to be composed inside a NavScreen subclass which
|
|
40
|
+
provides the navigation bindings and delegates actions to this widget.
|
|
41
|
+
|
|
42
|
+
Subclasses must implement:
|
|
43
|
+
- TITLE: Display title
|
|
44
|
+
- TABLE_COLUMNS: Column headers for the data table
|
|
45
|
+
- _fetch_items(): Async method to fetch items from API, returns (items, total)
|
|
46
|
+
- _format_row(): Format an item as a table row tuple
|
|
47
|
+
- _update_preview(): Update the preview panel for selected item
|
|
48
|
+
|
|
49
|
+
State Management:
|
|
50
|
+
Widgets access the shared store via self.app.store (Textual pattern).
|
|
51
|
+
- Uses shared ApiClient from store
|
|
52
|
+
- Can access store.agent_cache for cross-screen data
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
app: "AlloyRuntimeApp"
|
|
56
|
+
|
|
57
|
+
TITLE = "Browser"
|
|
58
|
+
TABLE_COLUMNS: list[str] = ["Name"]
|
|
59
|
+
|
|
60
|
+
# Use a shared CSS class so all browser screens get proper sizing
|
|
61
|
+
DEFAULT_CLASSES = "browser-widget"
|
|
62
|
+
|
|
63
|
+
# No bindings on widget - parent Screen handles all keybindings
|
|
64
|
+
# and delegates to public methods on this widget
|
|
65
|
+
|
|
66
|
+
def __init__(self, **kwargs: Any) -> None:
|
|
67
|
+
"""Initialize the browser widget."""
|
|
68
|
+
super().__init__(**kwargs)
|
|
69
|
+
self._items: list[ItemT] = []
|
|
70
|
+
self._last_search: str = ""
|
|
71
|
+
|
|
72
|
+
async def _ensure_client(self) -> ApiClient:
|
|
73
|
+
"""Get the shared server client from the store.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
The initialized ApiClient instance.
|
|
77
|
+
"""
|
|
78
|
+
return await self.app.store.get_client()
|
|
79
|
+
|
|
80
|
+
def compose(self) -> ComposeResult:
|
|
81
|
+
"""Compose the browser layout."""
|
|
82
|
+
with Vertical(id="browser-root"):
|
|
83
|
+
with Vertical(id="search-container"):
|
|
84
|
+
yield Input(
|
|
85
|
+
placeholder=f"Search {self.TITLE.lower()}...",
|
|
86
|
+
id="search-input",
|
|
87
|
+
)
|
|
88
|
+
yield Static("Loading...", id="status-bar")
|
|
89
|
+
|
|
90
|
+
with Horizontal(id="main-container"):
|
|
91
|
+
with Vertical(id="list-container"):
|
|
92
|
+
yield DataTable(id="data-table", cursor_type="row")
|
|
93
|
+
|
|
94
|
+
with Vertical(id="detail-container"):
|
|
95
|
+
yield Static("Preview", id="preview-title")
|
|
96
|
+
with VerticalScroll(id="preview-scroll"):
|
|
97
|
+
yield Static(
|
|
98
|
+
"Select an item to view details",
|
|
99
|
+
id="preview-content",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
def on_mount(self) -> None:
|
|
103
|
+
"""Initialize the table and load data on mount."""
|
|
104
|
+
table = self.query_one("#data-table", DataTable[str])
|
|
105
|
+
for column in self.TABLE_COLUMNS:
|
|
106
|
+
table.add_column(column)
|
|
107
|
+
|
|
108
|
+
# Load initial data
|
|
109
|
+
self._do_search("")
|
|
110
|
+
|
|
111
|
+
@on(Input.Changed, "#search-input")
|
|
112
|
+
def _on_search_input_changed(self, event: Input.Changed) -> None:
|
|
113
|
+
"""Handle search input changes - triggers search with debouncing."""
|
|
114
|
+
query = event.value.strip()
|
|
115
|
+
if query != self._last_search:
|
|
116
|
+
self._last_search = query
|
|
117
|
+
self._do_search(query)
|
|
118
|
+
|
|
119
|
+
@on(DataTable.RowHighlighted)
|
|
120
|
+
def _on_row_highlighted(self, event: DataTable.RowHighlighted) -> None:
|
|
121
|
+
"""Update preview when cursor moves."""
|
|
122
|
+
row_index = event.cursor_row
|
|
123
|
+
if 0 <= row_index < len(self._items):
|
|
124
|
+
self._update_preview(self._items[row_index])
|
|
125
|
+
|
|
126
|
+
@work(exclusive=True)
|
|
127
|
+
async def _do_search(self, query: str) -> None:
|
|
128
|
+
"""Execute the search and update the UI.
|
|
129
|
+
|
|
130
|
+
This method handles the common search flow:
|
|
131
|
+
1. Update status to "Searching..."
|
|
132
|
+
2. Call subclass _fetch_items() to get data
|
|
133
|
+
3. Update table with formatted rows
|
|
134
|
+
4. Update status and preview
|
|
135
|
+
"""
|
|
136
|
+
status = self.query_one("#status-bar", Static)
|
|
137
|
+
table = self.query_one("#data-table", DataTable[str])
|
|
138
|
+
|
|
139
|
+
status.update("Searching...")
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
await self._ensure_client()
|
|
143
|
+
items, total_count = await self._fetch_items(query)
|
|
144
|
+
|
|
145
|
+
self._items = items
|
|
146
|
+
|
|
147
|
+
# Update table
|
|
148
|
+
table.clear()
|
|
149
|
+
for item in self._items:
|
|
150
|
+
table.add_row(*self._format_row(item))
|
|
151
|
+
|
|
152
|
+
# Update status and preview
|
|
153
|
+
if self._items:
|
|
154
|
+
status.update(f"Showing {len(self._items)} of {total_count} results")
|
|
155
|
+
self._update_preview(self._items[0])
|
|
156
|
+
else:
|
|
157
|
+
status.update("No results found")
|
|
158
|
+
self.query_one("#preview-content", Static).update(
|
|
159
|
+
f"No {self.TITLE.lower()} selected"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
except Exception as e:
|
|
163
|
+
status.update(f"[red]Error: {e}[/]")
|
|
164
|
+
self._items = []
|
|
165
|
+
table.clear()
|
|
166
|
+
|
|
167
|
+
@abstractmethod
|
|
168
|
+
async def _fetch_items(self, query: str) -> tuple[list[ItemT], int]:
|
|
169
|
+
"""Fetch items from the API.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
query: Search query string (empty for initial load)
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
Tuple of (items list, total count)
|
|
176
|
+
"""
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
@abstractmethod
|
|
180
|
+
def _format_row(self, item: ItemT) -> tuple[str, ...]:
|
|
181
|
+
"""Format an item as a table row.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
item: The item to format
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Tuple of column values
|
|
188
|
+
"""
|
|
189
|
+
...
|
|
190
|
+
|
|
191
|
+
@abstractmethod
|
|
192
|
+
def _update_preview(self, item: ItemT) -> None:
|
|
193
|
+
"""Update the preview panel for the selected item.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
item: The selected item
|
|
197
|
+
"""
|
|
198
|
+
...
|
|
199
|
+
|
|
200
|
+
# =========================================================================
|
|
201
|
+
# Public methods for parent Screen to call
|
|
202
|
+
# =========================================================================
|
|
203
|
+
|
|
204
|
+
def focus_search(self) -> None:
|
|
205
|
+
"""Focus the search input."""
|
|
206
|
+
self.query_one("#search-input", Input).focus()
|
|
207
|
+
|
|
208
|
+
def focus_table(self) -> None:
|
|
209
|
+
"""Focus the data table."""
|
|
210
|
+
self.query_one("#data-table", DataTable[str]).focus()
|
|
211
|
+
|
|
212
|
+
def refresh_data(self) -> None:
|
|
213
|
+
"""Refresh the current search results."""
|
|
214
|
+
self._do_search(self._last_search)
|
|
215
|
+
|
|
216
|
+
def copy_item_id(self) -> None:
|
|
217
|
+
"""Copy the selected item's ID to clipboard."""
|
|
218
|
+
from cli.infrastructure.tui.clipboard import copy_to_clipboard
|
|
219
|
+
|
|
220
|
+
table = self.query_one("#data-table", DataTable[str])
|
|
221
|
+
if table.row_count == 0:
|
|
222
|
+
self.app.notify("No item to copy", severity="warning")
|
|
223
|
+
return
|
|
224
|
+
|
|
225
|
+
row_index = table.cursor_row
|
|
226
|
+
if 0 <= row_index < len(self._items):
|
|
227
|
+
item_id = self._get_item_id(self._items[row_index])
|
|
228
|
+
if item_id:
|
|
229
|
+
copy_to_clipboard(self.app, str(item_id), "ID")
|
|
230
|
+
|
|
231
|
+
def _get_item_id(self, item: ItemT) -> str | None:
|
|
232
|
+
"""Get the ID from an item. Override for custom ID extraction."""
|
|
233
|
+
if hasattr(item, "id"):
|
|
234
|
+
return str(item.id) # type: ignore[attr-defined]
|
|
235
|
+
elif isinstance(item, dict) and "id" in item:
|
|
236
|
+
item_dict = cast(dict[str, Any], item)
|
|
237
|
+
return str(item_dict["id"])
|
|
238
|
+
return None
|
|
239
|
+
|
|
240
|
+
def get_selected_item(self) -> ItemT | None:
|
|
241
|
+
"""Get the currently selected item from the data table.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
The selected item, or None if no item is selected.
|
|
245
|
+
"""
|
|
246
|
+
table = self.query_one("#data-table", DataTable[str])
|
|
247
|
+
if table.row_count == 0:
|
|
248
|
+
return None
|
|
249
|
+
row_index = table.cursor_row
|
|
250
|
+
if 0 <= row_index < len(self._items):
|
|
251
|
+
return self._items[row_index]
|
|
252
|
+
return None
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def open_in_editor(
|
|
256
|
+
content: str,
|
|
257
|
+
suffix: str = ".txt",
|
|
258
|
+
prefix: str = "content_",
|
|
259
|
+
) -> str | None:
|
|
260
|
+
"""Open content in an external editor.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
content: The content to edit
|
|
264
|
+
suffix: File suffix for syntax highlighting (e.g., ".json", ".jinja2")
|
|
265
|
+
prefix: Temporary file prefix
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
The edited content if changes were made, None if unchanged or error
|
|
269
|
+
"""
|
|
270
|
+
editor = os.environ.get("EDITOR") or os.environ.get("VISUAL") or "vi"
|
|
271
|
+
|
|
272
|
+
try:
|
|
273
|
+
# Write content to a temporary file
|
|
274
|
+
with tempfile.NamedTemporaryFile(
|
|
275
|
+
mode="w",
|
|
276
|
+
suffix=suffix,
|
|
277
|
+
prefix=prefix,
|
|
278
|
+
delete=False,
|
|
279
|
+
encoding="utf-8",
|
|
280
|
+
) as f:
|
|
281
|
+
f.write(content)
|
|
282
|
+
temp_path = f.name
|
|
283
|
+
|
|
284
|
+
# Run the editor (caller should suspend TUI)
|
|
285
|
+
subprocess.run([editor, temp_path], check=False)
|
|
286
|
+
|
|
287
|
+
# Read the edited content
|
|
288
|
+
with open(temp_path, encoding="utf-8") as f:
|
|
289
|
+
new_content = f.read()
|
|
290
|
+
|
|
291
|
+
# Clean up
|
|
292
|
+
try:
|
|
293
|
+
os.unlink(temp_path)
|
|
294
|
+
except OSError:
|
|
295
|
+
pass
|
|
296
|
+
|
|
297
|
+
return new_content
|
|
298
|
+
|
|
299
|
+
except Exception:
|
|
300
|
+
logger.exception("Failed to open content in editor")
|
|
301
|
+
return None
|