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,188 @@
|
|
|
1
|
+
"""Schema update modal for editing existing schemas.
|
|
2
|
+
|
|
3
|
+
Provides a modal screen that allows users to edit schema name and description.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
|
+
|
|
10
|
+
from textual import on, work
|
|
11
|
+
from textual.app import ComposeResult
|
|
12
|
+
from textual.containers import Horizontal, VerticalScroll
|
|
13
|
+
from textual.widgets import (
|
|
14
|
+
Button,
|
|
15
|
+
Input,
|
|
16
|
+
Label,
|
|
17
|
+
Static,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
from cli.tui.widgets.base_form_modal import BaseFormModal
|
|
21
|
+
|
|
22
|
+
from alloy_runtime_sdk.api_client.client import ApiClient
|
|
23
|
+
from alloy_runtime_types.dtos.schemas import GetSchemaResponse, UpdateSchemaRequest
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from cli.tui.app import AlloyRuntimeApp
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class SchemaUpdateResult:
|
|
31
|
+
"""Result of successful schema update."""
|
|
32
|
+
|
|
33
|
+
schema_id: str
|
|
34
|
+
schema_name: str
|
|
35
|
+
version: int
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SchemaUpdateModal(BaseFormModal[SchemaUpdateResult]):
|
|
39
|
+
"""Modal for updating schema name and description.
|
|
40
|
+
|
|
41
|
+
Usage:
|
|
42
|
+
def on_schema_updated(result: SchemaUpdateResult | None):
|
|
43
|
+
if result is not None:
|
|
44
|
+
self.notify(f"Updated schema: {result.schema_name}")
|
|
45
|
+
self._do_search("") # Refresh list
|
|
46
|
+
|
|
47
|
+
client = await self.app.store.get_client()
|
|
48
|
+
full_schema = await client.get_schema(schema_id)
|
|
49
|
+
self.app.push_screen(
|
|
50
|
+
SchemaUpdateModal(client=client, schema=full_schema),
|
|
51
|
+
on_schema_updated
|
|
52
|
+
)
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
app: "AlloyRuntimeApp"
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
client: ApiClient,
|
|
60
|
+
schema: GetSchemaResponse,
|
|
61
|
+
**kwargs: Any,
|
|
62
|
+
) -> None:
|
|
63
|
+
"""Initialize the schema update modal.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
client: ApiClient instance for API calls
|
|
67
|
+
schema: The schema to edit (full details from get_schema)
|
|
68
|
+
"""
|
|
69
|
+
super().__init__(**kwargs)
|
|
70
|
+
self._client = client
|
|
71
|
+
self._schema = schema
|
|
72
|
+
|
|
73
|
+
def compose(self) -> ComposeResult:
|
|
74
|
+
with VerticalScroll(id="schema-update-modal"):
|
|
75
|
+
yield Label(
|
|
76
|
+
f"Edit Schema: {self._schema.schema_name}", classes="modal-title"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Schema info (read-only)
|
|
80
|
+
yield Static("[bold]Schema Info[/]", classes="form-section")
|
|
81
|
+
|
|
82
|
+
yield Static(
|
|
83
|
+
f"[dim]Format:[/] {self._schema.schema_format_id} "
|
|
84
|
+
f"[dim]Version:[/] v{self._schema.version} "
|
|
85
|
+
f"[dim]ID:[/] {str(self._schema.id)[:8]}...",
|
|
86
|
+
id="schema-info",
|
|
87
|
+
classes="info-display",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Editable fields
|
|
91
|
+
yield Static("[bold]Edit Properties[/]", classes="form-section")
|
|
92
|
+
|
|
93
|
+
yield Static(
|
|
94
|
+
"Name (lowercase, dots/dashes/underscores)", classes="field-label"
|
|
95
|
+
)
|
|
96
|
+
yield Input(
|
|
97
|
+
value=self._schema.schema_name,
|
|
98
|
+
placeholder="e.g., user.profile, api.response-format",
|
|
99
|
+
id="name-input",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
yield Static("Description", classes="field-label")
|
|
103
|
+
yield Input(
|
|
104
|
+
value=self._schema.description or "",
|
|
105
|
+
placeholder="Brief description of this schema's purpose",
|
|
106
|
+
id="description-input",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Error display
|
|
110
|
+
yield Static("", id="error-display", classes="error-display")
|
|
111
|
+
|
|
112
|
+
with Horizontal(classes="button-row"):
|
|
113
|
+
yield Button("Update Schema", id="update-btn", variant="success")
|
|
114
|
+
yield Button("Cancel", id="cancel-btn", variant="default")
|
|
115
|
+
|
|
116
|
+
def on_mount(self) -> None:
|
|
117
|
+
"""Focus the name input on mount."""
|
|
118
|
+
self.query_one("#name-input", Input).focus()
|
|
119
|
+
|
|
120
|
+
@on(Button.Pressed, "#update-btn")
|
|
121
|
+
def on_update_pressed(self, event: Button.Pressed) -> None:
|
|
122
|
+
"""Handle update button press."""
|
|
123
|
+
self.action_submit()
|
|
124
|
+
|
|
125
|
+
@on(Button.Pressed, "#cancel-btn")
|
|
126
|
+
def on_cancel_pressed(self, event: Button.Pressed) -> None:
|
|
127
|
+
"""Handle cancel button press."""
|
|
128
|
+
self.dismiss(None)
|
|
129
|
+
|
|
130
|
+
def action_submit(self) -> None:
|
|
131
|
+
"""Handle form submission."""
|
|
132
|
+
try:
|
|
133
|
+
self._validate_fields()
|
|
134
|
+
self._hide_error()
|
|
135
|
+
self._finalize_submission()
|
|
136
|
+
except ValueError as e:
|
|
137
|
+
self._show_error(str(e))
|
|
138
|
+
|
|
139
|
+
def _validate_fields(self) -> None:
|
|
140
|
+
"""Validate all required fields."""
|
|
141
|
+
name = self.query_one("#name-input", Input).value.strip()
|
|
142
|
+
if not name:
|
|
143
|
+
raise ValueError("Name is required")
|
|
144
|
+
|
|
145
|
+
if not re.match(r"^[a-z0-9._-]+$", name):
|
|
146
|
+
raise ValueError(
|
|
147
|
+
"Name must be lowercase alphanumeric with dots, dashes, or underscores only"
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
def _build_request(self) -> UpdateSchemaRequest:
|
|
151
|
+
"""Build the API request."""
|
|
152
|
+
name = self.query_one("#name-input", Input).value.strip()
|
|
153
|
+
description = self.query_one("#description-input", Input).value.strip()
|
|
154
|
+
|
|
155
|
+
# Only include fields that have changed
|
|
156
|
+
request_name = name if name != self._schema.schema_name else None
|
|
157
|
+
request_description = (
|
|
158
|
+
description if description != (self._schema.description or "") else None
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
return UpdateSchemaRequest(
|
|
162
|
+
name=request_name,
|
|
163
|
+
description=request_description,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
@work(exclusive=True)
|
|
167
|
+
async def _finalize_submission(self) -> None:
|
|
168
|
+
"""Submit to API."""
|
|
169
|
+
try:
|
|
170
|
+
request = self._build_request()
|
|
171
|
+
|
|
172
|
+
# Check if anything actually changed
|
|
173
|
+
if request.name is None and request.description is None:
|
|
174
|
+
self.app.notify("No changes made", severity="information")
|
|
175
|
+
self.dismiss(None)
|
|
176
|
+
return
|
|
177
|
+
|
|
178
|
+
response = await self._client.update_schema(self._schema.id, request)
|
|
179
|
+
|
|
180
|
+
result = SchemaUpdateResult(
|
|
181
|
+
schema_id=str(response.id),
|
|
182
|
+
schema_name=response.schema_name,
|
|
183
|
+
version=response.version,
|
|
184
|
+
)
|
|
185
|
+
self.dismiss(result)
|
|
186
|
+
|
|
187
|
+
except Exception as e:
|
|
188
|
+
self._show_error(f"Failed to update schema: {e}")
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""StatusFooter widget - vim-style status bar with notification support.
|
|
2
|
+
|
|
3
|
+
This widget replaces both the standard Footer and toast notifications with
|
|
4
|
+
a unified status bar that shows keyboard shortcuts by default and temporarily
|
|
5
|
+
displays notifications.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from textual.app import ComposeResult
|
|
11
|
+
from textual.containers import Container
|
|
12
|
+
from textual.reactive import reactive
|
|
13
|
+
from textual.timer import Timer
|
|
14
|
+
from textual.widget import Widget
|
|
15
|
+
from textual.widgets import Footer, Static
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StatusFooter(Widget):
|
|
19
|
+
"""A footer that can show temporary notifications in place of key bindings.
|
|
20
|
+
|
|
21
|
+
By default, displays keyboard shortcuts like the standard Footer.
|
|
22
|
+
When show_notification() is called, temporarily shows the notification
|
|
23
|
+
message with appropriate styling, then reverts to shortcuts.
|
|
24
|
+
|
|
25
|
+
This is implemented as a container that swaps between a Footer widget
|
|
26
|
+
and a notification Static widget.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
DEFAULT_CSS = """
|
|
30
|
+
StatusFooter {
|
|
31
|
+
dock: bottom;
|
|
32
|
+
height: 1;
|
|
33
|
+
width: 100%;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
StatusFooter > Container {
|
|
37
|
+
height: 1;
|
|
38
|
+
width: 100%;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
StatusFooter Footer {
|
|
42
|
+
height: 1;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
StatusFooter .notification-bar {
|
|
46
|
+
height: 1;
|
|
47
|
+
width: 100%;
|
|
48
|
+
padding: 0 1;
|
|
49
|
+
display: none;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
StatusFooter .notification-bar.visible {
|
|
53
|
+
display: block;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
StatusFooter .notification-bar.info {
|
|
57
|
+
background: $primary;
|
|
58
|
+
color: $text;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
StatusFooter .notification-bar.success {
|
|
62
|
+
background: $success;
|
|
63
|
+
color: $text;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
StatusFooter .notification-bar.warning {
|
|
67
|
+
background: $warning;
|
|
68
|
+
color: $text;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
StatusFooter .notification-bar.error {
|
|
72
|
+
background: $error;
|
|
73
|
+
color: $text;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
StatusFooter Footer.hidden {
|
|
77
|
+
display: none;
|
|
78
|
+
}
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
notification_active: reactive[bool] = reactive(False)
|
|
82
|
+
|
|
83
|
+
def __init__(self, **kwargs: Any) -> None:
|
|
84
|
+
"""Initialize the status footer."""
|
|
85
|
+
super().__init__(**kwargs)
|
|
86
|
+
self._notification_timer: Timer | None = None
|
|
87
|
+
|
|
88
|
+
def compose(self) -> ComposeResult:
|
|
89
|
+
"""Compose the footer with both normal footer and notification bar."""
|
|
90
|
+
with Container():
|
|
91
|
+
# Footer shows key hints for all tabs
|
|
92
|
+
yield Footer(id="footer-keys")
|
|
93
|
+
yield Static("", id="notification-bar", classes="notification-bar")
|
|
94
|
+
|
|
95
|
+
def show_notification(
|
|
96
|
+
self,
|
|
97
|
+
message: str,
|
|
98
|
+
severity: str = "information",
|
|
99
|
+
timeout: float = 2.0,
|
|
100
|
+
) -> None:
|
|
101
|
+
"""Show a notification message temporarily.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
message: The notification message to display
|
|
105
|
+
severity: One of "information", "warning", "error"
|
|
106
|
+
timeout: Seconds before reverting to shortcuts (default 3.0)
|
|
107
|
+
"""
|
|
108
|
+
# Cancel any existing timer
|
|
109
|
+
if self._notification_timer is not None:
|
|
110
|
+
self._notification_timer.stop()
|
|
111
|
+
self._notification_timer = None
|
|
112
|
+
|
|
113
|
+
# Update notification bar content and styling
|
|
114
|
+
notification_bar = self.query_one("#notification-bar", Static)
|
|
115
|
+
footer = self.query_one("#footer-keys", Footer)
|
|
116
|
+
|
|
117
|
+
# Set the message
|
|
118
|
+
notification_bar.update(message)
|
|
119
|
+
|
|
120
|
+
# Reset classes and apply severity
|
|
121
|
+
notification_bar.remove_class("info", "success", "warning", "error")
|
|
122
|
+
severity_class = {
|
|
123
|
+
"information": "info",
|
|
124
|
+
"success": "success",
|
|
125
|
+
"warning": "warning",
|
|
126
|
+
"error": "error",
|
|
127
|
+
}.get(severity, "info")
|
|
128
|
+
notification_bar.add_class(severity_class)
|
|
129
|
+
|
|
130
|
+
# Show notification, hide footer
|
|
131
|
+
notification_bar.add_class("visible")
|
|
132
|
+
footer.add_class("hidden")
|
|
133
|
+
self.notification_active = True
|
|
134
|
+
|
|
135
|
+
# Schedule clearing the notification
|
|
136
|
+
self._notification_timer = self.set_timer(timeout, self._clear_notification)
|
|
137
|
+
|
|
138
|
+
def _clear_notification(self) -> None:
|
|
139
|
+
"""Clear the notification and show shortcuts again."""
|
|
140
|
+
notification_bar = self.query_one("#notification-bar", Static)
|
|
141
|
+
footer = self.query_one("#footer-keys", Footer)
|
|
142
|
+
|
|
143
|
+
# Hide notification, show footer
|
|
144
|
+
notification_bar.remove_class("visible")
|
|
145
|
+
footer.remove_class("hidden")
|
|
146
|
+
self.notification_active = False
|
|
147
|
+
self._notification_timer = None
|