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,53 @@
|
|
|
1
|
+
"""Knowledge synthesis delete command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.flag_utils import validate_uuid
|
|
6
|
+
from cli.commands.knowledge.synthesis.delete.presenter import (
|
|
7
|
+
present_synthesis_delete_success,
|
|
8
|
+
)
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def knowledge_synthesis_delete_command(
|
|
13
|
+
synthesis_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Synthesis UUID to delete",
|
|
16
|
+
),
|
|
17
|
+
yes: bool = typer.Option(
|
|
18
|
+
False,
|
|
19
|
+
"-y",
|
|
20
|
+
"--yes",
|
|
21
|
+
help="Skip confirmation prompt",
|
|
22
|
+
),
|
|
23
|
+
) -> None:
|
|
24
|
+
"""Delete a synthesis.
|
|
25
|
+
|
|
26
|
+
This permanently removes the synthesis, its collection associations,
|
|
27
|
+
and its source tracking records.
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
ai2 knowledge synthesis delete <synthesis-uuid>
|
|
31
|
+
ai2 kb synthesis delete <uuid> --yes
|
|
32
|
+
"""
|
|
33
|
+
# Validate synthesis UUID
|
|
34
|
+
validate_uuid(synthesis_id, "synthesis")
|
|
35
|
+
|
|
36
|
+
# Confirm deletion unless --yes flag provided
|
|
37
|
+
if not yes:
|
|
38
|
+
confirm = typer.confirm(
|
|
39
|
+
f"Are you sure you want to delete synthesis {synthesis_id}?"
|
|
40
|
+
)
|
|
41
|
+
if not confirm:
|
|
42
|
+
raise typer.Abort()
|
|
43
|
+
|
|
44
|
+
_execute_delete(synthesis_id)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@async_command
|
|
48
|
+
async def _execute_delete(synthesis_id: str) -> None:
|
|
49
|
+
"""Execute synthesis deletion."""
|
|
50
|
+
async with authenticated_client() as (_config, client):
|
|
51
|
+
response = await client.delete_synthesis(synthesis_id)
|
|
52
|
+
|
|
53
|
+
present_synthesis_delete_success(response)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Presenter for synthesis delete output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import format_uuid
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from alloy_runtime_types.dtos.knowledge import DeleteSynthesisResponse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def present_synthesis_delete_success(response: DeleteSynthesisResponse) -> None:
|
|
12
|
+
"""Present successful synthesis deletion.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
response: Delete synthesis response from server
|
|
16
|
+
"""
|
|
17
|
+
output = OutputService.get()
|
|
18
|
+
|
|
19
|
+
output.success("Synthesis deleted successfully")
|
|
20
|
+
|
|
21
|
+
# Build a simple table for deleted entity info
|
|
22
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
23
|
+
table.add_column("Field", style="dim")
|
|
24
|
+
table.add_column("Value")
|
|
25
|
+
|
|
26
|
+
table.add_row("ID", format_uuid(response.id, short=False))
|
|
27
|
+
table.add_row("Title", response.title)
|
|
28
|
+
table.add_row("Topic", response.topic)
|
|
29
|
+
|
|
30
|
+
panel = Panel(table, title="Deleted Synthesis", border_style="red")
|
|
31
|
+
output.console.print(panel)
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Knowledge synthesis get command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.flag_utils import validate_uuid
|
|
6
|
+
from cli.commands.knowledge.synthesis.get.presenter import present_synthesis_details
|
|
7
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def knowledge_synthesis_get_command(
|
|
11
|
+
synthesis_id: str = typer.Argument(
|
|
12
|
+
...,
|
|
13
|
+
help="Synthesis UUID",
|
|
14
|
+
),
|
|
15
|
+
output: str = typer.Option(
|
|
16
|
+
"panel",
|
|
17
|
+
"-o",
|
|
18
|
+
"--output",
|
|
19
|
+
help="Output format: 'panel' or 'json'",
|
|
20
|
+
),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Get synthesis details.
|
|
23
|
+
|
|
24
|
+
Returns the full synthesis details including content (if completed),
|
|
25
|
+
status, staleness information, and source tracking.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai2 knowledge synthesis get <synthesis-uuid>
|
|
29
|
+
ai2 kb synthesis get <uuid> --output json
|
|
30
|
+
"""
|
|
31
|
+
_execute_get_from_flags(synthesis_id=synthesis_id, output=output)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _execute_get_from_flags(synthesis_id: str, output: str) -> None:
|
|
35
|
+
"""Validate flags and execute get."""
|
|
36
|
+
# Validate synthesis UUID
|
|
37
|
+
validate_uuid(synthesis_id, "synthesis")
|
|
38
|
+
|
|
39
|
+
# Validate output format
|
|
40
|
+
output_format = output.lower()
|
|
41
|
+
if output_format not in ("panel", "json"):
|
|
42
|
+
raise typer.BadParameter(
|
|
43
|
+
f"Invalid output format '{output}'. Valid: panel, json"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
_execute_get(synthesis_id, output_format)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@async_command
|
|
50
|
+
async def _execute_get(synthesis_id: str, output_format: str) -> None:
|
|
51
|
+
"""Execute synthesis get."""
|
|
52
|
+
async with authenticated_client() as (_config, client):
|
|
53
|
+
response = await client.get_synthesis(synthesis_id)
|
|
54
|
+
|
|
55
|
+
present_synthesis_details(response, output_format)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Presenter for synthesis get output."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from rich.markdown import Markdown
|
|
6
|
+
from rich.panel import Panel
|
|
7
|
+
from rich.table import Table
|
|
8
|
+
|
|
9
|
+
from cli.infrastructure.formatting.fields import (
|
|
10
|
+
format_datetime,
|
|
11
|
+
format_uuid,
|
|
12
|
+
)
|
|
13
|
+
from cli.infrastructure.output import OutputService
|
|
14
|
+
from alloy_runtime_types.dtos.knowledge import GetSynthesisResponse
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def present_synthesis_details(
|
|
18
|
+
response: GetSynthesisResponse, output_format: str
|
|
19
|
+
) -> None:
|
|
20
|
+
"""Present synthesis details.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
response: Get synthesis response from server
|
|
24
|
+
output_format: Output format ('panel' or 'json')
|
|
25
|
+
"""
|
|
26
|
+
output = OutputService.get()
|
|
27
|
+
|
|
28
|
+
if output_format == "json":
|
|
29
|
+
# JSON output
|
|
30
|
+
data = {
|
|
31
|
+
"id": str(response.id),
|
|
32
|
+
"topic": response.topic,
|
|
33
|
+
"title": response.title,
|
|
34
|
+
"status": response.status,
|
|
35
|
+
"synthesis_content": response.synthesis_content,
|
|
36
|
+
"error_message": response.error_message,
|
|
37
|
+
"is_stale": response.is_stale,
|
|
38
|
+
"staleness_reason": response.staleness_reason,
|
|
39
|
+
"source_chunk_count": response.source_chunk_count,
|
|
40
|
+
"collection_ids": [str(c) for c in response.collection_ids],
|
|
41
|
+
"synthesizer_agent_id": str(response.synthesizer_agent_id)
|
|
42
|
+
if response.synthesizer_agent_id
|
|
43
|
+
else None,
|
|
44
|
+
"execution_id": str(response.execution_id)
|
|
45
|
+
if response.execution_id
|
|
46
|
+
else None,
|
|
47
|
+
"metadata": response.metadata,
|
|
48
|
+
"created_at": response.created_at.isoformat(),
|
|
49
|
+
"updated_at": response.updated_at.isoformat(),
|
|
50
|
+
}
|
|
51
|
+
output.console.print_json(json.dumps(data))
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
# Panel output
|
|
55
|
+
# Build metadata table
|
|
56
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
57
|
+
table.add_column("Field", style="dim")
|
|
58
|
+
table.add_column("Value")
|
|
59
|
+
|
|
60
|
+
table.add_row("ID", format_uuid(response.id, short=False))
|
|
61
|
+
table.add_row("Title", response.title)
|
|
62
|
+
table.add_row("Topic", response.topic)
|
|
63
|
+
|
|
64
|
+
# Status with color
|
|
65
|
+
status = response.status
|
|
66
|
+
if status == "completed":
|
|
67
|
+
status_display = f"[green]{status}[/green]"
|
|
68
|
+
elif status == "failed":
|
|
69
|
+
status_display = f"[red]{status}[/red]"
|
|
70
|
+
elif status == "processing":
|
|
71
|
+
status_display = f"[yellow]{status}[/yellow]"
|
|
72
|
+
else:
|
|
73
|
+
status_display = f"[dim]{status}[/dim]"
|
|
74
|
+
table.add_row("Status", status_display)
|
|
75
|
+
|
|
76
|
+
# Staleness
|
|
77
|
+
if response.is_stale:
|
|
78
|
+
stale_display = (
|
|
79
|
+
f"[yellow]Yes[/yellow] - {response.staleness_reason or 'Unknown reason'}"
|
|
80
|
+
)
|
|
81
|
+
else:
|
|
82
|
+
stale_display = "[green]No[/green]"
|
|
83
|
+
table.add_row("Stale", stale_display)
|
|
84
|
+
|
|
85
|
+
table.add_row("Source Chunks", str(response.source_chunk_count))
|
|
86
|
+
table.add_row("Collections", str(len(response.collection_ids)))
|
|
87
|
+
|
|
88
|
+
if response.synthesizer_agent_id:
|
|
89
|
+
table.add_row("Agent", format_uuid(response.synthesizer_agent_id, short=True))
|
|
90
|
+
if response.execution_id:
|
|
91
|
+
table.add_row("Execution", format_uuid(response.execution_id, short=True))
|
|
92
|
+
|
|
93
|
+
table.add_row("Created", format_datetime(response.created_at))
|
|
94
|
+
table.add_row("Updated", format_datetime(response.updated_at))
|
|
95
|
+
|
|
96
|
+
if response.error_message:
|
|
97
|
+
table.add_row("Error", f"[red]{response.error_message}[/red]")
|
|
98
|
+
|
|
99
|
+
# Show metadata if present
|
|
100
|
+
if response.metadata:
|
|
101
|
+
table.add_row("Metadata", str(response.metadata))
|
|
102
|
+
|
|
103
|
+
panel = Panel(table, title=f"Synthesis: {response.title}", border_style="blue")
|
|
104
|
+
output.console.print(panel)
|
|
105
|
+
|
|
106
|
+
# Show content if completed
|
|
107
|
+
if response.synthesis_content:
|
|
108
|
+
output.console.print()
|
|
109
|
+
content_panel = Panel(
|
|
110
|
+
Markdown(response.synthesis_content),
|
|
111
|
+
title="Synthesis Content",
|
|
112
|
+
border_style="green",
|
|
113
|
+
)
|
|
114
|
+
output.console.print(content_panel)
|
|
File without changes
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Knowledge synthesis list command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.flag_utils import validate_uuid
|
|
8
|
+
from cli.commands.knowledge.synthesis.list.presenter import present_syntheses_list
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def knowledge_synthesis_list_command(
|
|
13
|
+
collection: Optional[str] = typer.Option(
|
|
14
|
+
None,
|
|
15
|
+
"-C",
|
|
16
|
+
"--collection",
|
|
17
|
+
help="Filter by collection UUID",
|
|
18
|
+
),
|
|
19
|
+
status: Optional[str] = typer.Option(
|
|
20
|
+
None,
|
|
21
|
+
"-s",
|
|
22
|
+
"--status",
|
|
23
|
+
help="Filter by status: pending, processing, completed, failed",
|
|
24
|
+
),
|
|
25
|
+
include_stale: bool = typer.Option(
|
|
26
|
+
True,
|
|
27
|
+
"--include-stale/--no-stale",
|
|
28
|
+
help="Include stale syntheses (default: include)",
|
|
29
|
+
),
|
|
30
|
+
limit: int = typer.Option(
|
|
31
|
+
50,
|
|
32
|
+
"-l",
|
|
33
|
+
"--limit",
|
|
34
|
+
min=1,
|
|
35
|
+
max=100,
|
|
36
|
+
help="Maximum results (1-100)",
|
|
37
|
+
),
|
|
38
|
+
offset: int = typer.Option(
|
|
39
|
+
0,
|
|
40
|
+
"--offset",
|
|
41
|
+
min=0,
|
|
42
|
+
help="Pagination offset",
|
|
43
|
+
),
|
|
44
|
+
output: str = typer.Option(
|
|
45
|
+
"table",
|
|
46
|
+
"-o",
|
|
47
|
+
"--output",
|
|
48
|
+
help="Output format: 'table' or 'json'",
|
|
49
|
+
),
|
|
50
|
+
) -> None:
|
|
51
|
+
"""List syntheses for the organization.
|
|
52
|
+
|
|
53
|
+
Supports filtering by collection, status, and staleness.
|
|
54
|
+
Results are ordered by creation date (newest first).
|
|
55
|
+
|
|
56
|
+
Examples:
|
|
57
|
+
ai2 knowledge synthesis list
|
|
58
|
+
ai2 kb synthesis list -C <collection-uuid>
|
|
59
|
+
ai2 kb synthesis list --status completed --no-stale
|
|
60
|
+
ai2 kb synthesis list -l 10 --output json
|
|
61
|
+
"""
|
|
62
|
+
_execute_list_from_flags(
|
|
63
|
+
collection=collection,
|
|
64
|
+
status=status,
|
|
65
|
+
include_stale=include_stale,
|
|
66
|
+
limit=limit,
|
|
67
|
+
offset=offset,
|
|
68
|
+
output=output,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _execute_list_from_flags(
|
|
73
|
+
collection: Optional[str],
|
|
74
|
+
status: Optional[str],
|
|
75
|
+
include_stale: bool,
|
|
76
|
+
limit: int,
|
|
77
|
+
offset: int,
|
|
78
|
+
output: str,
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Validate flags and execute list."""
|
|
81
|
+
# Validate collection ID if provided
|
|
82
|
+
collection_id: str | None = None
|
|
83
|
+
if collection:
|
|
84
|
+
validate_uuid(collection, "collection")
|
|
85
|
+
collection_id = collection
|
|
86
|
+
|
|
87
|
+
# Validate status if provided
|
|
88
|
+
if status:
|
|
89
|
+
valid_statuses = ["pending", "processing", "completed", "failed"]
|
|
90
|
+
if status.lower() not in valid_statuses:
|
|
91
|
+
raise typer.BadParameter(
|
|
92
|
+
f"Invalid status '{status}'. Valid: {', '.join(valid_statuses)}"
|
|
93
|
+
)
|
|
94
|
+
status = status.lower()
|
|
95
|
+
|
|
96
|
+
# Validate output format
|
|
97
|
+
output_format = output.lower()
|
|
98
|
+
if output_format not in ("table", "json"):
|
|
99
|
+
raise typer.BadParameter(
|
|
100
|
+
f"Invalid output format '{output}'. Valid: table, json"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
_execute_list(
|
|
104
|
+
collection_id=collection_id,
|
|
105
|
+
status=status,
|
|
106
|
+
include_stale=include_stale,
|
|
107
|
+
limit=limit,
|
|
108
|
+
offset=offset,
|
|
109
|
+
output_format=output_format,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@async_command
|
|
114
|
+
async def _execute_list(
|
|
115
|
+
collection_id: str | None,
|
|
116
|
+
status: str | None,
|
|
117
|
+
include_stale: bool,
|
|
118
|
+
limit: int,
|
|
119
|
+
offset: int,
|
|
120
|
+
output_format: str,
|
|
121
|
+
) -> None:
|
|
122
|
+
"""Execute synthesis list."""
|
|
123
|
+
async with authenticated_client() as (_config, client):
|
|
124
|
+
response = await client.list_syntheses(
|
|
125
|
+
collection_id=collection_id,
|
|
126
|
+
status=status,
|
|
127
|
+
include_stale=include_stale,
|
|
128
|
+
limit=limit,
|
|
129
|
+
offset=offset,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
present_syntheses_list(response, output_format)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Presenter for synthesis list output."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from rich.table import Table
|
|
6
|
+
|
|
7
|
+
from cli.infrastructure.formatting.fields import format_datetime, format_uuid
|
|
8
|
+
from cli.infrastructure.output import OutputService
|
|
9
|
+
from alloy_runtime_types.dtos.knowledge import ListSynthesesResponse
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def present_syntheses_list(response: ListSynthesesResponse, output_format: str) -> None:
|
|
13
|
+
"""Present synthesis list results.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
response: List syntheses response from server
|
|
17
|
+
output_format: Output format ('table' or 'json')
|
|
18
|
+
"""
|
|
19
|
+
output = OutputService.get()
|
|
20
|
+
|
|
21
|
+
if output_format == "json":
|
|
22
|
+
# JSON output
|
|
23
|
+
data = {
|
|
24
|
+
"syntheses": [
|
|
25
|
+
{
|
|
26
|
+
"id": str(s.id),
|
|
27
|
+
"topic": s.topic,
|
|
28
|
+
"title": s.title,
|
|
29
|
+
"status": s.status,
|
|
30
|
+
"is_stale": s.is_stale,
|
|
31
|
+
"source_chunk_count": s.source_chunk_count,
|
|
32
|
+
"collection_ids": [str(c) for c in s.collection_ids],
|
|
33
|
+
"created_at": s.created_at.isoformat(),
|
|
34
|
+
"updated_at": s.updated_at.isoformat(),
|
|
35
|
+
}
|
|
36
|
+
for s in response.syntheses
|
|
37
|
+
],
|
|
38
|
+
"total": response.total,
|
|
39
|
+
}
|
|
40
|
+
output.console.print_json(json.dumps(data))
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
# Table output
|
|
44
|
+
if not response.syntheses:
|
|
45
|
+
output.info("No syntheses found")
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
table = Table(title=f"Syntheses ({response.total} total)")
|
|
49
|
+
table.add_column("ID", style="dim")
|
|
50
|
+
table.add_column("Title")
|
|
51
|
+
table.add_column("Status")
|
|
52
|
+
table.add_column("Stale", justify="center")
|
|
53
|
+
table.add_column("Sources", justify="right")
|
|
54
|
+
table.add_column("Created")
|
|
55
|
+
|
|
56
|
+
for synthesis in response.syntheses:
|
|
57
|
+
# Status styling
|
|
58
|
+
status = synthesis.status
|
|
59
|
+
if status == "completed":
|
|
60
|
+
status_display = f"[green]{status}[/green]"
|
|
61
|
+
elif status == "failed":
|
|
62
|
+
status_display = f"[red]{status}[/red]"
|
|
63
|
+
elif status == "processing":
|
|
64
|
+
status_display = f"[yellow]{status}[/yellow]"
|
|
65
|
+
else:
|
|
66
|
+
status_display = f"[dim]{status}[/dim]"
|
|
67
|
+
|
|
68
|
+
# Stale indicator
|
|
69
|
+
stale_display = (
|
|
70
|
+
"[yellow]⚠[/yellow]" if synthesis.is_stale else "[green]✓[/green]"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
table.add_row(
|
|
74
|
+
format_uuid(synthesis.id, short=True),
|
|
75
|
+
synthesis.title[:40] + "..."
|
|
76
|
+
if len(synthesis.title) > 40
|
|
77
|
+
else synthesis.title,
|
|
78
|
+
status_display,
|
|
79
|
+
stale_display,
|
|
80
|
+
str(synthesis.source_chunk_count),
|
|
81
|
+
format_datetime(synthesis.created_at),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
output.console.print(table)
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Knowledge synthesis refresh command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.flag_utils import validate_uuid
|
|
6
|
+
from cli.commands.knowledge.synthesis.refresh.presenter import (
|
|
7
|
+
present_synthesis_refresh_success,
|
|
8
|
+
)
|
|
9
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def knowledge_synthesis_refresh_command(
|
|
13
|
+
synthesis_id: str = typer.Argument(
|
|
14
|
+
...,
|
|
15
|
+
help="Synthesis UUID to refresh",
|
|
16
|
+
),
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Refresh a synthesis.
|
|
19
|
+
|
|
20
|
+
Regenerates the synthesis content using the same topic, agent, and template.
|
|
21
|
+
Use this to update a stale synthesis or to get updated results after
|
|
22
|
+
new documents have been added to the source collections.
|
|
23
|
+
|
|
24
|
+
Cannot refresh a synthesis that is currently processing.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
ai2 knowledge synthesis refresh <synthesis-uuid>
|
|
28
|
+
ai2 kb synthesis refresh <uuid>
|
|
29
|
+
"""
|
|
30
|
+
# Validate synthesis UUID
|
|
31
|
+
validate_uuid(synthesis_id, "synthesis")
|
|
32
|
+
|
|
33
|
+
_execute_refresh(synthesis_id)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@async_command
|
|
37
|
+
async def _execute_refresh(synthesis_id: str) -> None:
|
|
38
|
+
"""Execute synthesis refresh."""
|
|
39
|
+
async with authenticated_client() as (_config, client):
|
|
40
|
+
response = await client.refresh_synthesis(synthesis_id)
|
|
41
|
+
|
|
42
|
+
present_synthesis_refresh_success(response)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Presenter for synthesis refresh output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import format_uuid
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from alloy_runtime_types.dtos.knowledge import RefreshSynthesisResponse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def present_synthesis_refresh_success(response: RefreshSynthesisResponse) -> None:
|
|
12
|
+
"""Present successful synthesis refresh.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
response: Refresh synthesis response from server
|
|
16
|
+
"""
|
|
17
|
+
output = OutputService.get()
|
|
18
|
+
|
|
19
|
+
output.success("Synthesis refresh queued")
|
|
20
|
+
|
|
21
|
+
# Build a simple table for entity display
|
|
22
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
23
|
+
table.add_column("Field", style="dim")
|
|
24
|
+
table.add_column("Value")
|
|
25
|
+
|
|
26
|
+
table.add_row("Synthesis ID", format_uuid(response.synthesis_id, short=False))
|
|
27
|
+
table.add_row("Status", f"[yellow]{response.status}[/yellow]")
|
|
28
|
+
table.add_row("Message", response.message)
|
|
29
|
+
|
|
30
|
+
panel = Panel(table, title="Synthesis Refresh Started", border_style="green")
|
|
31
|
+
output.console.print(panel)
|
|
32
|
+
|
|
33
|
+
output.info(f"Poll status with: ai2 kb synthesis get {response.synthesis_id}")
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Knowledge synthesis update command implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from cli.commands.knowledge.synthesis.update.presenter import (
|
|
8
|
+
present_synthesis_update_result,
|
|
9
|
+
)
|
|
10
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
11
|
+
from cli.infrastructure.file_content import resolve_content_or_raise
|
|
12
|
+
from alloy_runtime_types.dtos.knowledge import UpdateSynthesisRequest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def knowledge_synthesis_update_command(
|
|
16
|
+
synthesis_id: str = typer.Argument(
|
|
17
|
+
...,
|
|
18
|
+
help="Synthesis UUID",
|
|
19
|
+
),
|
|
20
|
+
title: Optional[str] = typer.Option(
|
|
21
|
+
None,
|
|
22
|
+
"--title",
|
|
23
|
+
help="New title for the synthesis",
|
|
24
|
+
),
|
|
25
|
+
content: Optional[str] = typer.Option(
|
|
26
|
+
None,
|
|
27
|
+
"--content",
|
|
28
|
+
help="New synthesis content (or @file)",
|
|
29
|
+
),
|
|
30
|
+
) -> None:
|
|
31
|
+
"""Update a synthesis document.
|
|
32
|
+
|
|
33
|
+
Update synthesis properties like title or content.
|
|
34
|
+
At least one of --title or --content must be provided.
|
|
35
|
+
|
|
36
|
+
The --content flag accepts a text string or @file reference.
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
ai2 knowledge synthesis update <uuid> --title "New Title"
|
|
40
|
+
ai2 kb synthesis update <uuid> --content @updated.md
|
|
41
|
+
ai2 kb synthesis update <uuid> --title "New Title" --content "Updated content"
|
|
42
|
+
"""
|
|
43
|
+
_execute_update(
|
|
44
|
+
synthesis_id=synthesis_id,
|
|
45
|
+
title=title,
|
|
46
|
+
content_raw=content,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@async_command
|
|
51
|
+
async def _execute_update(
|
|
52
|
+
synthesis_id: str,
|
|
53
|
+
title: Optional[str],
|
|
54
|
+
content_raw: Optional[str],
|
|
55
|
+
) -> None:
|
|
56
|
+
"""Execute synthesis update operation."""
|
|
57
|
+
|
|
58
|
+
resolved_content = resolve_content_or_raise(content_raw)
|
|
59
|
+
|
|
60
|
+
if title is None and resolved_content is None:
|
|
61
|
+
raise typer.BadParameter(
|
|
62
|
+
"At least one of --title or --content must be provided"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
request = UpdateSynthesisRequest(
|
|
66
|
+
title=title,
|
|
67
|
+
synthesis_content=resolved_content,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
async with authenticated_client() as (_config, client):
|
|
71
|
+
response = await client.update_synthesis(
|
|
72
|
+
synthesis_id=synthesis_id,
|
|
73
|
+
request=request,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
present_synthesis_update_result(response)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Presenter for knowledge synthesis update command output."""
|
|
2
|
+
|
|
3
|
+
from rich.panel import Panel
|
|
4
|
+
from rich.table import Table
|
|
5
|
+
|
|
6
|
+
from cli.infrastructure.formatting.fields import format_datetime, format_uuid
|
|
7
|
+
from cli.infrastructure.output import OutputService
|
|
8
|
+
from alloy_runtime_types.dtos.knowledge import UpdateSynthesisResponse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def present_synthesis_update_result(
|
|
12
|
+
response: UpdateSynthesisResponse,
|
|
13
|
+
) -> None:
|
|
14
|
+
"""Present synthesis update result.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
response: UpdateSynthesisResponse from server
|
|
18
|
+
"""
|
|
19
|
+
output = OutputService.get()
|
|
20
|
+
|
|
21
|
+
output.success(f"Synthesis '{response.title}' updated")
|
|
22
|
+
|
|
23
|
+
table = Table(show_header=False, box=None, padding=(0, 1))
|
|
24
|
+
table.add_column("Field", style="dim")
|
|
25
|
+
table.add_column("Value")
|
|
26
|
+
|
|
27
|
+
table.add_row("ID", format_uuid(response.id, short=False))
|
|
28
|
+
table.add_row("Title", response.title)
|
|
29
|
+
table.add_row("Topic", response.topic)
|
|
30
|
+
table.add_row("Status", response.status)
|
|
31
|
+
|
|
32
|
+
stale_display = "[red]Yes[/]" if response.is_stale else "[green]No[/]"
|
|
33
|
+
table.add_row("Stale", stale_display)
|
|
34
|
+
if response.staleness_reason:
|
|
35
|
+
table.add_row("Staleness Reason", response.staleness_reason)
|
|
36
|
+
|
|
37
|
+
table.add_row("Source Chunks", str(response.source_chunk_count))
|
|
38
|
+
table.add_row("Updated At", format_datetime(response.updated_at))
|
|
39
|
+
|
|
40
|
+
panel = Panel(table, title="Synthesis Updated", border_style="green")
|
|
41
|
+
output.console.print(panel)
|
|
File without changes
|
|
File without changes
|