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,41 @@
|
|
|
1
|
+
"""Knowledge collections list command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.knowledge.collections.list.presenter import present_collections_list
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def knowledge_collections_list_command(
|
|
10
|
+
limit: int = typer.Option(
|
|
11
|
+
50,
|
|
12
|
+
"-l",
|
|
13
|
+
"--limit",
|
|
14
|
+
min=1,
|
|
15
|
+
max=100,
|
|
16
|
+
help="Max results",
|
|
17
|
+
),
|
|
18
|
+
offset: int = typer.Option(
|
|
19
|
+
0,
|
|
20
|
+
"--offset",
|
|
21
|
+
min=0,
|
|
22
|
+
help="Skip N results",
|
|
23
|
+
),
|
|
24
|
+
) -> None:
|
|
25
|
+
"""List knowledge collections.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai2 knowledge collections list
|
|
29
|
+
ai2 kb collections list -l 20
|
|
30
|
+
ai2 kb collections list --offset 10
|
|
31
|
+
"""
|
|
32
|
+
_execute_list(limit=limit, offset=offset)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@async_command
|
|
36
|
+
async def _execute_list(limit: int, offset: int) -> None:
|
|
37
|
+
"""Execute list collections operation."""
|
|
38
|
+
async with authenticated_client() as (_config, client):
|
|
39
|
+
response = await client.list_collections(limit=limit, offset=offset)
|
|
40
|
+
|
|
41
|
+
present_collections_list(response)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Presenter for knowledge collections list command output."""
|
|
2
|
+
|
|
3
|
+
from alloy_runtime_types.dtos.knowledge import ListCollectionsResponse
|
|
4
|
+
|
|
5
|
+
from cli.infrastructure.output import OutputService
|
|
6
|
+
from cli.infrastructure.renderers.list_renderer import ColumnConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def present_collections_list(response: ListCollectionsResponse) -> None:
|
|
10
|
+
"""Present list of collections with Rich table formatting.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
response: List collections response from server
|
|
14
|
+
"""
|
|
15
|
+
output = OutputService.get()
|
|
16
|
+
|
|
17
|
+
if not response.collections:
|
|
18
|
+
output.info("No collections found")
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
columns = [
|
|
22
|
+
ColumnConfig(
|
|
23
|
+
source_field="id",
|
|
24
|
+
header_label="ID",
|
|
25
|
+
compact_line=1,
|
|
26
|
+
compact_style="cyan",
|
|
27
|
+
),
|
|
28
|
+
ColumnConfig(
|
|
29
|
+
source_field="section_strategy",
|
|
30
|
+
header_label="Strategy",
|
|
31
|
+
compact_line=1,
|
|
32
|
+
compact_style="green",
|
|
33
|
+
),
|
|
34
|
+
ColumnConfig(
|
|
35
|
+
source_field="chunk_size_tokens",
|
|
36
|
+
header_label="Chunk Size",
|
|
37
|
+
align="right",
|
|
38
|
+
formatter=lambda x: f"{x} tokens",
|
|
39
|
+
compact_line=1,
|
|
40
|
+
compact_style="blue",
|
|
41
|
+
),
|
|
42
|
+
ColumnConfig(
|
|
43
|
+
source_field="updated_at",
|
|
44
|
+
header_label="Updated",
|
|
45
|
+
formatter=lambda x: x.strftime("%Y-%m-%d") if x else "-",
|
|
46
|
+
compact_line=1,
|
|
47
|
+
compact_style="dim",
|
|
48
|
+
),
|
|
49
|
+
ColumnConfig(
|
|
50
|
+
source_field="name",
|
|
51
|
+
header_label="Name",
|
|
52
|
+
compact_line=2,
|
|
53
|
+
compact_style="white bold",
|
|
54
|
+
),
|
|
55
|
+
ColumnConfig(
|
|
56
|
+
source_field="description",
|
|
57
|
+
header_label="Description",
|
|
58
|
+
formatter=lambda x: x[:80] + "..." if x and len(x) > 80 else (x or "-"),
|
|
59
|
+
compact_line=2,
|
|
60
|
+
compact_style="dim",
|
|
61
|
+
),
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
output.table(
|
|
65
|
+
items=response.collections, # type: ignore[arg-type]
|
|
66
|
+
title=f"Collections ({response.total})",
|
|
67
|
+
columns=columns,
|
|
68
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""Knowledge collection update command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import require_update_flags, validate_uuid
|
|
8
|
+
from cli.commands.knowledge.collections.update.presenter import (
|
|
9
|
+
present_collection_update_success,
|
|
10
|
+
)
|
|
11
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
12
|
+
from alloy_runtime_types.dtos.knowledge import UpdateCollectionRequest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def knowledge_collections_update_command(
|
|
16
|
+
collection_id: str = typer.Argument(
|
|
17
|
+
...,
|
|
18
|
+
help="Collection UUID or name to update",
|
|
19
|
+
),
|
|
20
|
+
name: Optional[str] = typer.Option(
|
|
21
|
+
None,
|
|
22
|
+
"-n",
|
|
23
|
+
"--name",
|
|
24
|
+
help="New collection name",
|
|
25
|
+
),
|
|
26
|
+
description: Optional[str] = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"-d",
|
|
29
|
+
"--description",
|
|
30
|
+
help="New collection description",
|
|
31
|
+
),
|
|
32
|
+
rerank_instruction: Optional[str] = typer.Option(
|
|
33
|
+
None,
|
|
34
|
+
"-r",
|
|
35
|
+
"--rerank-instruction",
|
|
36
|
+
help="New default instruction for Voyage AI reranking (max 500 chars)",
|
|
37
|
+
),
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Update a knowledge collection.
|
|
40
|
+
|
|
41
|
+
At least one update flag (--name, --description, or --rerank-instruction) is required.
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
ai2 knowledge collections update <uuid> -n "New Name"
|
|
45
|
+
ai2 knowledge collections update <uuid> -d "Updated description"
|
|
46
|
+
ai2 kb collections update <uuid> -r "Prioritize recent documents"
|
|
47
|
+
ai2 kb collections update <uuid> -n "Docs" -d "Documentation" -r "Focus on API details"
|
|
48
|
+
"""
|
|
49
|
+
require_update_flags(
|
|
50
|
+
("--name", name),
|
|
51
|
+
("--description", description),
|
|
52
|
+
("--rerank-instruction", rerank_instruction),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
_execute_update_from_flags(
|
|
56
|
+
collection_id=collection_id,
|
|
57
|
+
name=name,
|
|
58
|
+
description=description,
|
|
59
|
+
rerank_instruction=rerank_instruction,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _execute_update_from_flags(
|
|
64
|
+
collection_id: str,
|
|
65
|
+
name: Optional[str],
|
|
66
|
+
description: Optional[str],
|
|
67
|
+
rerank_instruction: Optional[str],
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Build and execute collection update from command flags."""
|
|
70
|
+
# Validate collection ID if it looks like a UUID
|
|
71
|
+
# (Server accepts both UUID and name, so we only validate UUID format)
|
|
72
|
+
try:
|
|
73
|
+
validate_uuid(collection_id, "collection")
|
|
74
|
+
except typer.BadParameter:
|
|
75
|
+
# Not a UUID - treat as name, let server handle validation
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
# Build request with only provided fields
|
|
79
|
+
request = UpdateCollectionRequest(
|
|
80
|
+
name=name,
|
|
81
|
+
description=description,
|
|
82
|
+
rerank_instruction=rerank_instruction,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
_execute_update(collection_id, request)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@async_command
|
|
89
|
+
async def _execute_update(
|
|
90
|
+
collection_id: str,
|
|
91
|
+
request: UpdateCollectionRequest,
|
|
92
|
+
) -> None:
|
|
93
|
+
"""Execute the collection update with the given request."""
|
|
94
|
+
async with authenticated_client() as (_config, client):
|
|
95
|
+
response = await client.update_collection(collection_id, request)
|
|
96
|
+
|
|
97
|
+
present_collection_update_success(response)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Presenter for collection update output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import (
|
|
7
|
+
format_datetime,
|
|
8
|
+
format_optional,
|
|
9
|
+
format_uuid,
|
|
10
|
+
)
|
|
11
|
+
from cli.infrastructure.output import OutputService
|
|
12
|
+
from alloy_runtime_types.dtos.knowledge import UpdateCollectionResponse
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def present_collection_update_success(response: UpdateCollectionResponse) -> None:
|
|
16
|
+
"""Present successful collection update.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
response: Collection update response from server
|
|
20
|
+
"""
|
|
21
|
+
output = OutputService.get()
|
|
22
|
+
|
|
23
|
+
output.success("Collection updated successfully")
|
|
24
|
+
|
|
25
|
+
# Build a simple table for entity display
|
|
26
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
27
|
+
table.add_column("Field", style="dim")
|
|
28
|
+
table.add_column("Value")
|
|
29
|
+
|
|
30
|
+
table.add_row("ID", format_uuid(response.id, short=False))
|
|
31
|
+
table.add_row("Name", response.name)
|
|
32
|
+
table.add_row("Description", format_optional(response.description))
|
|
33
|
+
table.add_row("Embedding Model", response.embedding_model)
|
|
34
|
+
table.add_row("Chunk Size", f"{response.chunk_size_tokens} tokens")
|
|
35
|
+
table.add_row("Chunk Overlap", f"{response.chunk_overlap_tokens} tokens")
|
|
36
|
+
table.add_row("Section Strategy", response.section_strategy)
|
|
37
|
+
table.add_row("Rerank Instruction", format_optional(response.rerank_instruction))
|
|
38
|
+
table.add_row("Created", format_datetime(response.created_at))
|
|
39
|
+
table.add_row("Updated", format_datetime(response.updated_at))
|
|
40
|
+
|
|
41
|
+
panel = Panel(table, title=f"Collection: {response.name}", border_style="green")
|
|
42
|
+
output.console.print(panel)
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Knowledge documents bulk metadata update command implementation."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any, Optional, cast
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from cli.commands.knowledge.documents.bulk_metadata.presenter import (
|
|
10
|
+
present_bulk_metadata_result,
|
|
11
|
+
)
|
|
12
|
+
from cli.commands.flag_utils import validate_uuid
|
|
13
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
14
|
+
from cli.infrastructure.file_content import resolve_content_or_raise
|
|
15
|
+
from alloy_runtime_types.dtos.knowledge import BulkUpdateDocumentMetadataRequest
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def knowledge_documents_bulk_metadata_command(
|
|
19
|
+
filter_: str = typer.Option(
|
|
20
|
+
...,
|
|
21
|
+
"--filter",
|
|
22
|
+
help="JSONB containment filter to match documents (JSON or @file.json)",
|
|
23
|
+
),
|
|
24
|
+
metadata: str = typer.Option(
|
|
25
|
+
...,
|
|
26
|
+
"--metadata",
|
|
27
|
+
help="Metadata fields to apply (JSON or @file.json)",
|
|
28
|
+
),
|
|
29
|
+
metadata_mode: str = typer.Option(
|
|
30
|
+
"merge",
|
|
31
|
+
"--metadata-mode",
|
|
32
|
+
help="Metadata update mode: 'merge' (default) or 'replace'",
|
|
33
|
+
),
|
|
34
|
+
collection: Optional[str] = typer.Option(
|
|
35
|
+
None,
|
|
36
|
+
"-C",
|
|
37
|
+
"--collection",
|
|
38
|
+
help="Optional collection UUID to scope the update",
|
|
39
|
+
),
|
|
40
|
+
dry_run: bool = typer.Option(
|
|
41
|
+
False,
|
|
42
|
+
"--dry-run",
|
|
43
|
+
help="Preview matched count without updating",
|
|
44
|
+
),
|
|
45
|
+
) -> None:
|
|
46
|
+
"""Bulk-update metadata across documents matching a filter.
|
|
47
|
+
|
|
48
|
+
Both --filter and --metadata accept a JSON string or @file reference.
|
|
49
|
+
Use --dry-run to preview how many documents match without modifying them.
|
|
50
|
+
|
|
51
|
+
Examples:
|
|
52
|
+
ai2 knowledge documents bulk-metadata \\
|
|
53
|
+
--filter '{"source": "slack"}' \\
|
|
54
|
+
--metadata '{"reviewed": true}'
|
|
55
|
+
|
|
56
|
+
ai2 kb documents bulk-metadata \\
|
|
57
|
+
--filter @filter.json --metadata @patch.json --dry-run
|
|
58
|
+
|
|
59
|
+
ai2 kb documents bulk-metadata \\
|
|
60
|
+
--filter '{"team": "eng"}' --metadata '{"archived": true}' \\
|
|
61
|
+
-C <collection-uuid>
|
|
62
|
+
"""
|
|
63
|
+
_execute_bulk_metadata(
|
|
64
|
+
filter_raw=filter_,
|
|
65
|
+
metadata_raw=metadata,
|
|
66
|
+
metadata_mode=metadata_mode,
|
|
67
|
+
collection=collection,
|
|
68
|
+
dry_run=dry_run,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _parse_json_option(value: str, option_name: str) -> dict[str, Any]:
|
|
73
|
+
resolved = resolve_content_or_raise(value)
|
|
74
|
+
if resolved is None:
|
|
75
|
+
raise typer.BadParameter(f"{option_name} is required")
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
result = json.loads(resolved)
|
|
79
|
+
except json.JSONDecodeError as e:
|
|
80
|
+
raise typer.BadParameter(f"Invalid JSON for {option_name}: {e}")
|
|
81
|
+
if not isinstance(result, dict):
|
|
82
|
+
raise typer.BadParameter(f"{option_name} must be a JSON object")
|
|
83
|
+
return cast(dict[str, Any], result)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@async_command
|
|
87
|
+
async def _execute_bulk_metadata(
|
|
88
|
+
filter_raw: str,
|
|
89
|
+
metadata_raw: str,
|
|
90
|
+
metadata_mode: str,
|
|
91
|
+
collection: Optional[str],
|
|
92
|
+
dry_run: bool,
|
|
93
|
+
) -> None:
|
|
94
|
+
"""Execute bulk document metadata update operation."""
|
|
95
|
+
|
|
96
|
+
if metadata_mode not in ("merge", "replace"):
|
|
97
|
+
raise typer.BadParameter(
|
|
98
|
+
f"Invalid metadata mode '{metadata_mode}'. Must be 'merge' or 'replace'."
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
filter_dict = _parse_json_option(filter_raw, "--filter")
|
|
102
|
+
metadata_dict = _parse_json_option(metadata_raw, "--metadata")
|
|
103
|
+
|
|
104
|
+
collection_id: UUID | None = None
|
|
105
|
+
if collection is not None:
|
|
106
|
+
collection_id = validate_uuid(collection, "collection")
|
|
107
|
+
|
|
108
|
+
request = BulkUpdateDocumentMetadataRequest(
|
|
109
|
+
filter=filter_dict,
|
|
110
|
+
patch=metadata_dict,
|
|
111
|
+
metadata_mode=metadata_mode, # type: ignore[arg-type]
|
|
112
|
+
collection_id=collection_id,
|
|
113
|
+
dry_run=dry_run,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
async with authenticated_client() as (_config, client):
|
|
117
|
+
response = await client.bulk_update_document_metadata(request)
|
|
118
|
+
|
|
119
|
+
present_bulk_metadata_result(response)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Presenter for knowledge documents bulk metadata update command output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.output import OutputService
|
|
7
|
+
from alloy_runtime_types.dtos.knowledge import BulkUpdateDocumentMetadataResponse
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def present_bulk_metadata_result(
|
|
11
|
+
response: BulkUpdateDocumentMetadataResponse,
|
|
12
|
+
) -> None:
|
|
13
|
+
"""Present bulk metadata update result.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
response: BulkUpdateDocumentMetadataResponse from server
|
|
17
|
+
"""
|
|
18
|
+
output = OutputService.get()
|
|
19
|
+
|
|
20
|
+
if response.dry_run:
|
|
21
|
+
output.info("Dry run — no documents modified")
|
|
22
|
+
else:
|
|
23
|
+
output.success(f"Updated metadata on {response.updated_count} document(s)")
|
|
24
|
+
|
|
25
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
26
|
+
table.add_column("Field", style="dim")
|
|
27
|
+
table.add_column("Value")
|
|
28
|
+
|
|
29
|
+
table.add_row("Matched", str(response.matched_count))
|
|
30
|
+
table.add_row("Updated", str(response.updated_count))
|
|
31
|
+
table.add_row("Dry Run", str(response.dry_run))
|
|
32
|
+
|
|
33
|
+
border_style = "blue" if response.dry_run else "green"
|
|
34
|
+
title = "Bulk Metadata Dry Run" if response.dry_run else "Bulk Metadata Update"
|
|
35
|
+
panel = Panel(table, title=title, border_style=border_style)
|
|
36
|
+
output.console.print(panel)
|
|
File without changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Knowledge documents delete command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.knowledge.documents.delete.presenter import present_delete_result
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
from cli.infrastructure.console import Confirm
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def knowledge_documents_delete_command(
|
|
11
|
+
document: str = typer.Argument(
|
|
12
|
+
...,
|
|
13
|
+
help="Document UUID",
|
|
14
|
+
),
|
|
15
|
+
yes: bool = typer.Option(
|
|
16
|
+
False,
|
|
17
|
+
"-y",
|
|
18
|
+
"--yes",
|
|
19
|
+
help="Skip confirmation",
|
|
20
|
+
),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Delete a document and all its chunks.
|
|
23
|
+
|
|
24
|
+
Permanently removes the document and all associated chunks and questions.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
ai2 knowledge documents delete 550e8400-e29b-41d4-a716-446655440000
|
|
28
|
+
ai2 kb documents delete 550e8400-e29b-41d4-a716-446655440000 -y
|
|
29
|
+
"""
|
|
30
|
+
_execute_delete(document_id=document, skip_confirm=yes)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@async_command
|
|
34
|
+
async def _execute_delete(document_id: str, skip_confirm: bool) -> None:
|
|
35
|
+
"""Execute delete document operation."""
|
|
36
|
+
if not skip_confirm:
|
|
37
|
+
confirmed = Confirm.ask(
|
|
38
|
+
f"[yellow]Delete document '{document_id}'?[/yellow] "
|
|
39
|
+
"This will delete all chunks and cannot be undone"
|
|
40
|
+
)
|
|
41
|
+
if not confirmed:
|
|
42
|
+
raise typer.Abort()
|
|
43
|
+
|
|
44
|
+
async with authenticated_client() as (_config, client):
|
|
45
|
+
response = await client.delete_document(document_id)
|
|
46
|
+
|
|
47
|
+
present_delete_result(response)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Presenter for knowledge document delete command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.knowledge import DeleteDocumentResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_delete_result(response: DeleteDocumentResponse) -> None:
|
|
8
|
+
"""Present document deletion result.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
response: DeleteDocumentResponse from server
|
|
12
|
+
"""
|
|
13
|
+
output = OutputService.get()
|
|
14
|
+
|
|
15
|
+
chunks_msg = (
|
|
16
|
+
f" ({response.chunks_deleted} chunks deleted)"
|
|
17
|
+
if response.chunks_deleted > 0
|
|
18
|
+
else ""
|
|
19
|
+
)
|
|
20
|
+
output.success(f"Document '{response.title}' deleted successfully{chunks_msg}")
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Knowledge documents get command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.knowledge.documents.get.presenter import present_document_details
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def knowledge_documents_get_command(
|
|
10
|
+
document: str = typer.Argument(
|
|
11
|
+
...,
|
|
12
|
+
help="Document UUID",
|
|
13
|
+
),
|
|
14
|
+
include_content: bool = typer.Option(
|
|
15
|
+
False,
|
|
16
|
+
"-c",
|
|
17
|
+
"--include-content",
|
|
18
|
+
help="Include original document content",
|
|
19
|
+
),
|
|
20
|
+
) -> None:
|
|
21
|
+
"""Get document details.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
ai2 knowledge documents get 550e8400-e29b-41d4-a716-446655440000
|
|
25
|
+
ai2 kb documents get 550e8400-e29b-41d4-a716-446655440000 -c
|
|
26
|
+
"""
|
|
27
|
+
_execute_get(document_id=document, include_content=include_content)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@async_command
|
|
31
|
+
async def _execute_get(document_id: str, include_content: bool) -> None:
|
|
32
|
+
"""Execute get document operation."""
|
|
33
|
+
async with authenticated_client() as (_config, client):
|
|
34
|
+
response = await client.get_document(
|
|
35
|
+
document_id=document_id,
|
|
36
|
+
include_content=include_content,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
present_document_details(response, show_content=include_content)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Presenter for knowledge document get command output."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from rich.panel import Panel
|
|
6
|
+
from rich.table import Table
|
|
7
|
+
|
|
8
|
+
from cli.infrastructure.formatting.fields import (
|
|
9
|
+
format_datetime,
|
|
10
|
+
format_uuid,
|
|
11
|
+
)
|
|
12
|
+
from cli.infrastructure.output import OutputService
|
|
13
|
+
from alloy_runtime_types.dtos.knowledge import GetDocumentResponse
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _format_status(status: str) -> str:
|
|
17
|
+
"""Format processing status with color."""
|
|
18
|
+
status_colors = {
|
|
19
|
+
"completed": "[green]completed[/]",
|
|
20
|
+
"processing": "[yellow]processing[/]",
|
|
21
|
+
"pending": "[blue]pending[/]",
|
|
22
|
+
"failed": "[red]failed[/]",
|
|
23
|
+
}
|
|
24
|
+
return status_colors.get(status, status)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def present_document_details(
|
|
28
|
+
response: GetDocumentResponse, show_content: bool = False
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Present document details with Rich formatting.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
response: GetDocumentResponse from server
|
|
34
|
+
show_content: Whether to show original content panel
|
|
35
|
+
"""
|
|
36
|
+
output = OutputService.get()
|
|
37
|
+
|
|
38
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
39
|
+
table.add_column("Field", style="dim")
|
|
40
|
+
table.add_column("Value")
|
|
41
|
+
|
|
42
|
+
table.add_row("ID", format_uuid(response.id, short=False))
|
|
43
|
+
table.add_row("Collection ID", format_uuid(response.collection_id, short=False))
|
|
44
|
+
table.add_row("Title", response.title)
|
|
45
|
+
table.add_row("Source Type", response.source_type)
|
|
46
|
+
table.add_row("Character Count", f"{response.character_count:,}")
|
|
47
|
+
table.add_row(
|
|
48
|
+
"Estimated Tokens",
|
|
49
|
+
f"{response.estimated_tokens:,}" if response.estimated_tokens else "-",
|
|
50
|
+
)
|
|
51
|
+
table.add_row("Processing Status", _format_status(response.processing_status))
|
|
52
|
+
if response.processing_error:
|
|
53
|
+
table.add_row("Processing Error", f"[red]{response.processing_error}[/]")
|
|
54
|
+
table.add_row("Chunks Count", str(response.chunks_count))
|
|
55
|
+
table.add_row("Chunks Failed", str(response.chunks_failed))
|
|
56
|
+
table.add_row("Questions Generated", str(response.questions_generated))
|
|
57
|
+
if response.metadata:
|
|
58
|
+
table.add_row("Metadata", json.dumps(response.metadata, indent=2))
|
|
59
|
+
table.add_row("Created At", format_datetime(response.created_at))
|
|
60
|
+
table.add_row("Updated At", format_datetime(response.updated_at))
|
|
61
|
+
|
|
62
|
+
panel = Panel(
|
|
63
|
+
table,
|
|
64
|
+
title=f"Document: {response.title}",
|
|
65
|
+
border_style="green",
|
|
66
|
+
)
|
|
67
|
+
output.console.print(panel)
|
|
68
|
+
|
|
69
|
+
if show_content and response.original_content:
|
|
70
|
+
content_panel = Panel(
|
|
71
|
+
response.original_content[:2000]
|
|
72
|
+
+ ("..." if len(response.original_content) > 2000 else ""),
|
|
73
|
+
title="Original Content",
|
|
74
|
+
border_style="blue",
|
|
75
|
+
)
|
|
76
|
+
output.console.print(content_panel)
|
|
77
|
+
elif show_content and not response.original_content:
|
|
78
|
+
output.info("No original content available")
|
|
File without changes
|