alysis-code 0.14.2__tar.gz → 0.14.6__tar.gz
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.
- {alysis_code-0.14.2 → alysis_code-0.14.6}/PKG-INFO +11 -1
- {alysis_code-0.14.2 → alysis_code-0.14.6}/README.md +10 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/docs/CHANGELOG.md +66 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/pyproject.toml +1 -1
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/__init__.py +1 -1
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/loop.py +8 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/config_menu.py +61 -5
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_flow.py +2 -2
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/config.py +29 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_evidence.py +50 -2
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_safe.py +23 -11
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/activity_events.py +14 -2
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/artifacts.py +3 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/change_ledger.py +51 -32
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/context_blocks.py +23 -8
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/event_stream.py +74 -21
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/forge_protocol.py +37 -17
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/health.py +3 -0
- alysis_code-0.14.6/src/alysis_code/ide/parent_watchdog.py +111 -0
- alysis_code-0.14.6/src/alysis_code/ide/provider_switch.py +65 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/stdio_bridge.py +631 -57
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/anthropic_messages.py +51 -12
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_policy.py +6 -2
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/factory.py +2 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/protocols.py +49 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/client.py +11 -7
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_registry.py +17 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/profile_presets.py +4 -1
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/profiles.py +32 -1
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_diagnostics.py +3 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/reasoning_contracts.py +12 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/.gitignore +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/LICENSE +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/NOTICE +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/__main__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/_build_info.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/account_login.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/acceptance_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/blast_radius.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/cache_keepalive.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/checkpoint_worker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/completion_certificate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/completion_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/empty_response_stall.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/errors.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/llm_calls.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/mutation_classification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_families.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_guidance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/read_ledger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/regression_baseline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/reproduction_first.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/sensitive_output.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/session.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/steering.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_execution.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_workspace.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/task_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/task_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/tools_assembly.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/core.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/exploration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/interventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/read_cache.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/snapshot.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn_path.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_commands.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_result.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_loop.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/builtins.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/host.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/service.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agentbox_client.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agentbox_integration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/alysis_cloud.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/approval_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/asset_read_core.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/budget_allocator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/comprehender.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/index.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/ingestion.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/legacy_migration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/local_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/ocr.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/index.html +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/show-owl.sh +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/plan_binding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/planner_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/planner_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/prompts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/replanner_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/untrusted_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/usage_logger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_mirror.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_section.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/atomic_io.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/auth_diagnostics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/background_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/branding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/budget_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/build_identity.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/bwrap_etc.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cancellation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/capabilities.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/checkpoint_settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_modal.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/commands.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_resume.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/auth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/profile.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/root.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/server.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/skills.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/startup.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/update.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/composer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/footer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/links.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/owl.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/tips.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/clipboard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/code_review.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/conversation_compactor.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/importance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/tool_output_offload.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/conflict_auto_resolver.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/consumer_verification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/context/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/crash_diagnostics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/runtime.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/session.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/diff_paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/direction_change.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/dispatch_timing.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/durable_service_manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/edit_discipline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/error_text.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_deadline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_shared.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/activation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/install.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/manifest.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/workspace_trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/failed_task_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/failure_category.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/feedback_report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/file_classification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge_completion.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge_events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/frontmatter_utils.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_ops.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_worktrees.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/audit.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/dispatcher.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/host_actions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/host_browser.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/approvals.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/forge_request_ledger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/managed_browser.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/management_protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/prompt_queue.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/resumable_swarm.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/session_search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/structured_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/swarm_protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/integration_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/interactive_input_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/internal_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_capture.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_librarian.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/language_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/litellm_static_provider.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_capabilities.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_control_blocks.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_generate_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_interactions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/http_cancellation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/metadata.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/openai_compat.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/openai_responses.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/provider_limits.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/request_plan.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/request_shape.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/streaming.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/temperature_compat.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/tool_call_markup.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/types.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/usage_normalization.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm_error_display.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/logging_redaction.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/managed_host_deadline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/errors.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/forge_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/jsonrpc.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_runtime.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/prompts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/resources.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/roots.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/server_requests.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/token_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_http.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_stdio.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/untrusted_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/merge_conflict_reviewer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_metadata_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_metadata_utils.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_router.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/permission_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/personas.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/pipeline_facts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_assistant.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_reconciliation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_repair.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_validation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/planning_constraints.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/preview_server.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/private_artifact_io.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/process_reaping.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/prompt_guidance_catalog.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/openai_codex.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_model_catalog.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_telemetry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_url.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/remote_sync.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/replanning.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/repo_scan.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/request_estimation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/review_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_lock.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_outcome.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_provenance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_context_features.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_kind.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/mcp_sanitize.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/safe_http.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/subagent_report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_doctor.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/serialized_paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/auth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/job_config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/worker_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/service_persistence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_metrics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/conventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/eval_models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/eval_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/evals.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/install.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/loader.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/matching.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/prompting.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/scaffold.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/transactions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/validation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/step_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/subagent_labels.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/subagents.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/console.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/hidden_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/noop_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/rich_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/styles.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/theme.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/types.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_backend.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_orchestrator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_scheduler.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_trace.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_worker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_write_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_dependencies.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_readiness.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/terminal_manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/terminal_ownership.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/text_normalization.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/token_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/availability.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/capability_readiness.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/fs.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/git.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/history.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/http_timeout.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/image_generation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/repo_map.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/shell.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/symbols.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/test_discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_dashscope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_ddgs.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_tavily.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/transport_retry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/updates.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/usage_tracker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_command_analysis.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_failure_summary.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_repair.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verify_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_research.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_search_adapters.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_search_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_binding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_binding_ui.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_isolation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_provisioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alysis-code
|
|
3
|
-
Version: 0.14.
|
|
3
|
+
Version: 0.14.6
|
|
4
4
|
Summary: Local CLI coding agent powered by any API.
|
|
5
5
|
Project-URL: Changelog, https://github.com/AlysisAi/alysis-code/blob/main/docs/CHANGELOG.md
|
|
6
6
|
Project-URL: Documentation, https://github.com/AlysisAi/alysis-code/tree/main/docs
|
|
@@ -196,6 +196,8 @@ Persona changes made during a running turn apply after that turn finishes.
|
|
|
196
196
|
|
|
197
197
|
Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
|
|
198
198
|
you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
|
199
|
+
The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
|
|
200
|
+
[third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
|
|
199
201
|
|
|
200
202
|
## FAQ
|
|
201
203
|
|
|
@@ -218,3 +220,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
|
|
|
218
220
|
---
|
|
219
221
|
|
|
220
222
|
**Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
## Editor integrations
|
|
226
|
+
|
|
227
|
+
[VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
|
|
228
|
+
[JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
|
|
229
|
+
The VS Code Marketplace pre-release is pending production signing and acceptance; see the
|
|
230
|
+
[IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
|
|
@@ -135,6 +135,8 @@ Persona changes made during a running turn apply after that turn finishes.
|
|
|
135
135
|
|
|
136
136
|
Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
|
|
137
137
|
you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
|
138
|
+
The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
|
|
139
|
+
[third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
|
|
138
140
|
|
|
139
141
|
## FAQ
|
|
140
142
|
|
|
@@ -157,3 +159,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
|
|
|
157
159
|
---
|
|
158
160
|
|
|
159
161
|
**Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Editor integrations
|
|
165
|
+
|
|
166
|
+
[VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
|
|
167
|
+
[JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
|
|
168
|
+
The VS Code Marketplace pre-release is pending production signing and acceptance; see the
|
|
169
|
+
[IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
|
|
@@ -1,11 +1,77 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.6 — final VSIX attestation and startup validation
|
|
4
|
+
|
|
5
|
+
- Give each final VSIX dependency report an RFC 4122 document ID accepted by
|
|
6
|
+
GitHub's attestation parser. Derive it from the exact package bytes so promotion
|
|
7
|
+
can reproduce the signed report without changing its identity.
|
|
8
|
+
- Wait for startup runtime validation before reporting installed runtime evidence,
|
|
9
|
+
so a fresh installation does not report the bundled CLI as temporarily unavailable.
|
|
10
|
+
|
|
11
|
+
All six 0.14.5 native runtimes and their assembled manifest passed signing, but
|
|
12
|
+
final VSIX attestation failed before installation testing. This replacement
|
|
13
|
+
preserves the existing tags; Marketplace pre-release 0.3.0 still requires the
|
|
14
|
+
documented installation, acceptance, and promotion gates.
|
|
15
|
+
|
|
16
|
+
## 0.14.5 — native managed-runtime packaging
|
|
17
|
+
|
|
18
|
+
- Pin the six bundled runtimes to checksum-verified CPython 3.12.15 distributions,
|
|
19
|
+
including their observed OpenSSL and Expat versions in each dependency SBOM.
|
|
20
|
+
- Build Linux executables with shared-library-capable Python on the existing
|
|
21
|
+
glibc 2.28 baseline, and build tested, static OpenSSL 3.5.9 for Windows ARM64
|
|
22
|
+
and Intel macOS cryptography.
|
|
23
|
+
- Sign embedded macOS libraries during packaging and verify notarization using
|
|
24
|
+
Apple's documented check for standalone code. Preserve Windows API paths in Git Bash.
|
|
25
|
+
- Add an unsigned native build and executable smoke check for all six targets.
|
|
26
|
+
|
|
27
|
+
This source version prepares a replacement candidate after the protected `v0.14.4`
|
|
28
|
+
native build failed. Marketplace pre-release 0.3.0 remains subject to the documented
|
|
29
|
+
signing, installation, acceptance, and promotion gates.
|
|
30
|
+
|
|
31
|
+
## 0.14.4 — IDE integrations and release tooling
|
|
32
|
+
|
|
33
|
+
- Add the VS Code 0.3.0 integration with a shared sidebar, provider management, bounded editor
|
|
34
|
+
context, reviewed changes, recovery checkpoints, and native host actions.
|
|
35
|
+
- Add shared UI transport and a JetBrains development preview using the same Python IDE bridge.
|
|
36
|
+
- Isolate provider credentials, handle physical workspace paths, and keep unit tests portable.
|
|
37
|
+
- Add six-target managed-runtime packaging, Azure OIDC Windows signing verification, Apple
|
|
38
|
+
notarization/provenance contracts, and protected evidence and Marketplace promotion workflows.
|
|
39
|
+
- Update pinned sandbox build inputs; fresh image scans remain required.
|
|
40
|
+
|
|
41
|
+
This is a CLI/source release. Production signed VSIX packages and Marketplace publication remain
|
|
42
|
+
pending the [documented signing and acceptance gates](vscode-marketplace-launch.md).
|
|
43
|
+
|
|
3
44
|
Notable user-facing changes to Alysis Code are recorded here. This project follows
|
|
4
45
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses
|
|
5
46
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html) while the public API remains pre-1.0.
|
|
6
47
|
|
|
7
48
|
## [Unreleased]
|
|
8
49
|
|
|
50
|
+
## [0.14.3] - 2026-09-29
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- Add Claude Sonnet 5.5 to the Alysis account model picker, using native Messages
|
|
55
|
+
transport, streaming, signed reasoning and tool continuation, and the shared
|
|
56
|
+
hosted credit allowance.
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
|
|
60
|
+
- Default hosted accounts to automatic prompt caching. Migrate legacy Manual
|
|
61
|
+
settings only when their other cache settings match the old defaults; preserve
|
|
62
|
+
Off, customized settings, and subsequent explicit choices.
|
|
63
|
+
- Use five-minute cache controls for hosted Sonnet and provider-managed caching
|
|
64
|
+
for hosted DeepSeek, GLM, and Luna. See the
|
|
65
|
+
[caching guide](hosted-prompt-caching.md) for migration details and controls.
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
- Resolve cache previews and diagnostics using each model's actual protocol,
|
|
70
|
+
preserve hosted credit-limit error details, and report Sonnet reasoning usage
|
|
71
|
+
without counting it twice.
|
|
72
|
+
- Honor the configured HTTP MCP startup timeout for initialization acknowledgements.
|
|
73
|
+
Report MCP startup errors once and exit cleanly without retrying through classic chat.
|
|
74
|
+
|
|
9
75
|
## [0.14.2] - 2026-09-28
|
|
10
76
|
|
|
11
77
|
### Fixed
|
|
@@ -18,6 +18,7 @@ from ...cancellation import InteractiveCancellationToken
|
|
|
18
18
|
from ...compaction.conversation_compactor import CompactionState
|
|
19
19
|
from ...error_text import sanitize_error_text_for_output
|
|
20
20
|
from ...failure_category import exit_code_for_failure
|
|
21
|
+
from ...mcp.errors import McpError
|
|
21
22
|
from ...personas import (
|
|
22
23
|
DEFAULT_PERSONA,
|
|
23
24
|
get_persona,
|
|
@@ -3738,6 +3739,10 @@ def chat(
|
|
|
3738
3739
|
)
|
|
3739
3740
|
except Exception:
|
|
3740
3741
|
pass
|
|
3742
|
+
if isinstance(_tui_exc, McpError):
|
|
3743
|
+
# Rebuilding the same MCP session in classic chat cannot
|
|
3744
|
+
# repair a server startup failure. Report it once below.
|
|
3745
|
+
raise
|
|
3741
3746
|
console.print(
|
|
3742
3747
|
f"[yellow]TUI unavailable ({_tui_exc}); using classic chat.[/yellow]"
|
|
3743
3748
|
)
|
|
@@ -3865,6 +3870,9 @@ def chat(
|
|
|
3865
3870
|
except ConfigError as e:
|
|
3866
3871
|
console.print(f"[red]Config error:[/red] {e}")
|
|
3867
3872
|
raise typer.Exit(code=2) from e
|
|
3873
|
+
except McpError as e:
|
|
3874
|
+
console.print(f"MCP error: {sanitize_error_text_for_output(e)}", style="red", markup=False)
|
|
3875
|
+
raise typer.Exit(code=1) from e
|
|
3868
3876
|
except WorkspaceBindingError as e:
|
|
3869
3877
|
console.print(f"[red]Workspace error:[/red] {e}")
|
|
3870
3878
|
raise typer.Exit(code=1) from e
|
|
@@ -63,6 +63,7 @@ from ..profile_presets import (
|
|
|
63
63
|
from ..profiles import (
|
|
64
64
|
SUBSCRIPTION_SELECTION_REQUIRED_KEY,
|
|
65
65
|
ProfileSpec,
|
|
66
|
+
apply_hosted_prompt_cache_defaults,
|
|
66
67
|
get_active_profile,
|
|
67
68
|
list_profiles,
|
|
68
69
|
set_active_profile,
|
|
@@ -226,6 +227,10 @@ class ConfigMenuState:
|
|
|
226
227
|
subscription_selection_required: bool = False
|
|
227
228
|
default_workspace_path: str = ""
|
|
228
229
|
thinking_label_explicitly_set: bool = field(default=False, repr=False)
|
|
230
|
+
hosted_prompt_cache_defaults_applied: bool = False
|
|
231
|
+
prompt_cache_mode_explicitly_set: bool = field(default=False, repr=False)
|
|
232
|
+
cache_prompt_key_enabled: bool = True
|
|
233
|
+
cache_keepalive_enabled: bool = False
|
|
229
234
|
_subscription_models_cache: tuple[Any, ...] = field(default=(), repr=False)
|
|
230
235
|
_subscription_models_loaded: bool = field(default=False, repr=False)
|
|
231
236
|
_provider_models_cache_identity: tuple[str, ...] | None = field(default=None, repr=False)
|
|
@@ -236,6 +241,7 @@ class ConfigMenuState:
|
|
|
236
241
|
|
|
237
242
|
@classmethod
|
|
238
243
|
def from_cfg(cls, cfg: AppConfig) -> ConfigMenuState:
|
|
244
|
+
apply_hosted_prompt_cache_defaults(cfg, get_active_profile(cfg))
|
|
239
245
|
warnings: list[str] = []
|
|
240
246
|
try:
|
|
241
247
|
resolved_key = resolve_api_key(cfg)
|
|
@@ -363,6 +369,9 @@ class ConfigMenuState:
|
|
|
363
369
|
default_workspace_path=default_workspace_path,
|
|
364
370
|
)
|
|
365
371
|
state._normalize_provider_thinking_label()
|
|
372
|
+
state.hosted_prompt_cache_defaults_applied = cfg.hosted_prompt_cache_defaults_applied
|
|
373
|
+
state.cache_prompt_key_enabled = cfg.cache.prompt_cache_key_enabled
|
|
374
|
+
state.cache_keepalive_enabled = cfg.cache.keepalive_enabled
|
|
366
375
|
state._original = state.snapshot()
|
|
367
376
|
return state
|
|
368
377
|
|
|
@@ -394,6 +403,8 @@ class ConfigMenuState:
|
|
|
394
403
|
"clear_stored_key_confirmed": self.clear_stored_key_confirmed,
|
|
395
404
|
"clear_stored_key_profile": self.clear_stored_key_profile,
|
|
396
405
|
"thinking_label_explicitly_set": self.thinking_label_explicitly_set,
|
|
406
|
+
"hosted_prompt_cache_defaults_applied": self.hosted_prompt_cache_defaults_applied,
|
|
407
|
+
"prompt_cache_mode_explicitly_set": self.prompt_cache_mode_explicitly_set,
|
|
397
408
|
"subscription_selection_required": self.subscription_selection_required,
|
|
398
409
|
}
|
|
399
410
|
|
|
@@ -439,6 +450,12 @@ class ConfigMenuState:
|
|
|
439
450
|
self.thinking_label_explicitly_set = bool(
|
|
440
451
|
self._original.get("thinking_label_explicitly_set", False)
|
|
441
452
|
)
|
|
453
|
+
self.hosted_prompt_cache_defaults_applied = bool(
|
|
454
|
+
self._original.get("hosted_prompt_cache_defaults_applied", False)
|
|
455
|
+
)
|
|
456
|
+
self.prompt_cache_mode_explicitly_set = bool(
|
|
457
|
+
self._original.get("prompt_cache_mode_explicitly_set", False)
|
|
458
|
+
)
|
|
442
459
|
self.refresh_api_key_status()
|
|
443
460
|
|
|
444
461
|
def set_field(self, name: str, value: str) -> None:
|
|
@@ -473,6 +490,16 @@ class ConfigMenuState:
|
|
|
473
490
|
}:
|
|
474
491
|
raise KeyError(f"Unknown config menu field: {name}")
|
|
475
492
|
self.fields[key] = str(value)
|
|
493
|
+
if key in {
|
|
494
|
+
"prompt_cache_mode",
|
|
495
|
+
"prompt_cache_key",
|
|
496
|
+
"prompt_cache_retention",
|
|
497
|
+
"anthropic_prompt_cache_enabled",
|
|
498
|
+
"anthropic_prompt_cache_ttl",
|
|
499
|
+
}:
|
|
500
|
+
self.hosted_prompt_cache_defaults_applied = True
|
|
501
|
+
if key == "prompt_cache_mode":
|
|
502
|
+
self.prompt_cache_mode_explicitly_set = True
|
|
476
503
|
if key == "model":
|
|
477
504
|
profile = _active_subscription_profile(self)
|
|
478
505
|
if profile is not None and str(value).strip() != profile.default_model:
|
|
@@ -646,6 +673,10 @@ class ConfigMenuState:
|
|
|
646
673
|
self._provider_models_cache = ()
|
|
647
674
|
self._provider_model_catalog_warning = ""
|
|
648
675
|
profile = ProfileSpec.from_dict(profile_name, self.profiles[profile_name])
|
|
676
|
+
cache_cfg = self._resolution_cfg()
|
|
677
|
+
if apply_hosted_prompt_cache_defaults(cache_cfg, profile):
|
|
678
|
+
self.fields["prompt_cache_mode"] = cache_cfg.prompt_cache_mode
|
|
679
|
+
self.hosted_prompt_cache_defaults_applied = True
|
|
649
680
|
if profile.base_url:
|
|
650
681
|
self.fields["base_url"] = profile.base_url
|
|
651
682
|
if profile.auth_provider:
|
|
@@ -763,6 +794,11 @@ class ConfigMenuState:
|
|
|
763
794
|
prompt_cache_mode=_normalize_prompt_cache_mode(
|
|
764
795
|
self.fields.get("prompt_cache_mode", "manual")
|
|
765
796
|
),
|
|
797
|
+
hosted_prompt_cache_defaults_applied=self.hosted_prompt_cache_defaults_applied,
|
|
798
|
+
cache={
|
|
799
|
+
"prompt_cache_key_enabled": self.cache_prompt_key_enabled,
|
|
800
|
+
"keepalive_enabled": self.cache_keepalive_enabled,
|
|
801
|
+
},
|
|
766
802
|
prompt_cache_key=str(self.fields.get("prompt_cache_key", "") or ""),
|
|
767
803
|
prompt_cache_retention=str(self.fields.get("prompt_cache_retention", "") or ""),
|
|
768
804
|
anthropic_prompt_cache_enabled=_normalize_bool_text(
|
|
@@ -813,6 +849,7 @@ class ConfigMenuState:
|
|
|
813
849
|
)
|
|
814
850
|
|
|
815
851
|
changes: dict[str, Any] = {}
|
|
852
|
+
cfg.hosted_prompt_cache_defaults_applied = self.hosted_prompt_cache_defaults_applied
|
|
816
853
|
|
|
817
854
|
execution = getattr(cfg, "execution", None)
|
|
818
855
|
if execution is None:
|
|
@@ -930,7 +967,10 @@ class ConfigMenuState:
|
|
|
930
967
|
desired_cache_mode = _normalize_prompt_cache_mode(
|
|
931
968
|
self.fields.get("prompt_cache_mode", "manual")
|
|
932
969
|
)
|
|
933
|
-
if
|
|
970
|
+
if (
|
|
971
|
+
str(getattr(cfg, "prompt_cache_mode", "") or "manual") != desired_cache_mode
|
|
972
|
+
or self.prompt_cache_mode_explicitly_set
|
|
973
|
+
):
|
|
934
974
|
set_config_value(cfg, "prompt_cache_mode", desired_cache_mode)
|
|
935
975
|
changes["prompt_cache_mode"] = desired_cache_mode
|
|
936
976
|
|
|
@@ -1415,8 +1455,12 @@ def _cache_summary_text(state: ConfigMenuState) -> str:
|
|
|
1415
1455
|
if mode == "off":
|
|
1416
1456
|
return f"cache off · {policy_summary} · {compaction}"
|
|
1417
1457
|
if mode == "auto":
|
|
1418
|
-
ttl =
|
|
1419
|
-
|
|
1458
|
+
ttl = (
|
|
1459
|
+
policy.anthropic_cache_control_ttl
|
|
1460
|
+
if policy is not None
|
|
1461
|
+
else _normalize_anthropic_prompt_cache_ttl(
|
|
1462
|
+
state.fields.get("anthropic_prompt_cache_ttl", "5m")
|
|
1463
|
+
)
|
|
1420
1464
|
)
|
|
1421
1465
|
return f"auto · {policy_summary} · Anthropic TTL {ttl} · {compaction}"
|
|
1422
1466
|
|
|
@@ -1474,7 +1518,13 @@ def _effective_cache_capability_for_state(
|
|
|
1474
1518
|
)
|
|
1475
1519
|
or preview_profile.name
|
|
1476
1520
|
)
|
|
1477
|
-
|
|
1521
|
+
from ..llm.factory import resolve_model_protocol
|
|
1522
|
+
|
|
1523
|
+
protocol = resolve_model_protocol(
|
|
1524
|
+
provider_key=provider_key,
|
|
1525
|
+
model=model,
|
|
1526
|
+
protocol=str(preview_profile.protocol or OPENAI_COMPAT_PROTOCOL).strip(),
|
|
1527
|
+
)
|
|
1478
1528
|
capabilities = get_provider_protocol_capabilities(
|
|
1479
1529
|
provider_key=provider_key,
|
|
1480
1530
|
protocol=protocol,
|
|
@@ -1532,7 +1582,13 @@ def _resolved_cache_policy_with_error_for_state(
|
|
|
1532
1582
|
)
|
|
1533
1583
|
or profile.name
|
|
1534
1584
|
)
|
|
1535
|
-
|
|
1585
|
+
from ..llm.factory import resolve_model_protocol
|
|
1586
|
+
|
|
1587
|
+
protocol = resolve_model_protocol(
|
|
1588
|
+
provider_key=provider_key,
|
|
1589
|
+
model=model,
|
|
1590
|
+
protocol=str(profile.protocol or OPENAI_COMPAT_PROTOCOL).strip(),
|
|
1591
|
+
)
|
|
1536
1592
|
capabilities = get_provider_protocol_capabilities(
|
|
1537
1593
|
provider_key=provider_key,
|
|
1538
1594
|
protocol=protocol,
|
|
@@ -406,9 +406,9 @@ _THINKING_DESCRIPTIONS = {
|
|
|
406
406
|
"auto": "let the provider decide",
|
|
407
407
|
}
|
|
408
408
|
_CACHE_MODE_DESCRIPTIONS = {
|
|
409
|
-
"auto": "
|
|
409
|
+
"auto": "use supported provider caching; default for Alysis hosted models",
|
|
410
410
|
"manual": "use the manual key/retention below when supported",
|
|
411
|
-
"off": "disable
|
|
411
|
+
"off": "disable optional client cache controls",
|
|
412
412
|
}
|
|
413
413
|
_CACHE_TTL_DESCRIPTIONS = {
|
|
414
414
|
"5m": "lower lifetime; safest default",
|
|
@@ -699,6 +699,9 @@ class AppConfig(BaseModel):
|
|
|
699
699
|
session_log_dir: str | None = None
|
|
700
700
|
crash_diagnostic_log_path: str | None = None
|
|
701
701
|
prompt_cache_mode: str = "manual"
|
|
702
|
+
# Hosted defaults are applied once when an Alysis profile is selected/loaded.
|
|
703
|
+
# Explicit cache choices also set this marker, including reselecting Manual.
|
|
704
|
+
hosted_prompt_cache_defaults_applied: bool = False
|
|
702
705
|
prompt_cache_key: str | None = None
|
|
703
706
|
prompt_cache_retention: str | None = None
|
|
704
707
|
anthropic_prompt_cache_enabled: bool = False
|
|
@@ -1508,6 +1511,9 @@ def resolve_profile_api_key(
|
|
|
1508
1511
|
profile = get_profile(cfg, profile_name)
|
|
1509
1512
|
if profile is None:
|
|
1510
1513
|
return ApiKeyResolution(key=None, source="missing")
|
|
1514
|
+
ide_key = _resolve_ide_profile_api_key(cfg, profile_name)
|
|
1515
|
+
if ide_key.key:
|
|
1516
|
+
return ide_key
|
|
1511
1517
|
stored_profile_key = _resolve_stored_profile_api_key(cfg, profile_name)
|
|
1512
1518
|
if stored_profile_key.key:
|
|
1513
1519
|
return stored_profile_key
|
|
@@ -1528,6 +1534,21 @@ def resolve_profile_api_key(
|
|
|
1528
1534
|
return ApiKeyResolution(key=None, source="missing")
|
|
1529
1535
|
|
|
1530
1536
|
|
|
1537
|
+
def _resolve_ide_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
|
|
1538
|
+
"""Honor an IDE's explicitly supplied profile key without overwriting CLI credentials."""
|
|
1539
|
+
from .profiles import get_profile
|
|
1540
|
+
|
|
1541
|
+
profile = get_profile(cfg, profile_name)
|
|
1542
|
+
if profile is not None:
|
|
1543
|
+
# Match the extension's encoding; plain env-var names can collide between two profiles.
|
|
1544
|
+
encoded = profile.name.encode("utf-8").hex().upper()
|
|
1545
|
+
env_name = f"ALYSIS_IDE_PROFILE_{encoded}_API_KEY"
|
|
1546
|
+
key = str(os.environ.get(env_name) or "").strip()
|
|
1547
|
+
if key:
|
|
1548
|
+
return ApiKeyResolution(key=key, source=f"env:{env_name}")
|
|
1549
|
+
return ApiKeyResolution(key=None, source="missing")
|
|
1550
|
+
|
|
1551
|
+
|
|
1531
1552
|
def _resolve_stored_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
|
|
1532
1553
|
from .profiles import get_profile
|
|
1533
1554
|
|
|
@@ -1549,6 +1570,9 @@ def resolve_api_key(
|
|
|
1549
1570
|
if profile_name is None:
|
|
1550
1571
|
profile_name = str((effective_cfg.extra_fields or {}).get("active_profile") or "").strip()
|
|
1551
1572
|
if profile_name:
|
|
1573
|
+
ide_key = _resolve_ide_profile_api_key(effective_cfg, profile_name)
|
|
1574
|
+
if ide_key.key:
|
|
1575
|
+
return ide_key
|
|
1552
1576
|
stored_profile_key = _resolve_stored_profile_api_key(effective_cfg, profile_name)
|
|
1553
1577
|
if stored_profile_key.key:
|
|
1554
1578
|
return stored_profile_key
|
|
@@ -3624,22 +3648,27 @@ def set_config_value(
|
|
|
3624
3648
|
|
|
3625
3649
|
if key == "prompt_cache_mode":
|
|
3626
3650
|
cfg.prompt_cache_mode = _normalize_prompt_cache_mode(value, key=key)
|
|
3651
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3627
3652
|
return cfg
|
|
3628
3653
|
|
|
3629
3654
|
if key == "prompt_cache_key":
|
|
3630
3655
|
cfg.prompt_cache_key = value.strip() or None
|
|
3656
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3631
3657
|
return cfg
|
|
3632
3658
|
|
|
3633
3659
|
if key == "prompt_cache_retention":
|
|
3634
3660
|
cfg.prompt_cache_retention = value.strip() or None
|
|
3661
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3635
3662
|
return cfg
|
|
3636
3663
|
|
|
3637
3664
|
if key == "anthropic_prompt_cache_enabled":
|
|
3638
3665
|
cfg.anthropic_prompt_cache_enabled = _coerce_bool(value, key=key)
|
|
3666
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3639
3667
|
return cfg
|
|
3640
3668
|
|
|
3641
3669
|
if key == "anthropic_prompt_cache_ttl":
|
|
3642
3670
|
cfg.anthropic_prompt_cache_ttl = _normalize_anthropic_prompt_cache_ttl(value, key=key)
|
|
3671
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3643
3672
|
return cfg
|
|
3644
3673
|
|
|
3645
3674
|
if key == "verify_commands":
|
|
@@ -11,7 +11,7 @@ from typing import Any, Literal
|
|
|
11
11
|
|
|
12
12
|
from .file_classification import classify_path, is_generated_or_vendor_path
|
|
13
13
|
from .git_ops import GitOpsError
|
|
14
|
-
from .git_safe import build_git_cmd, build_git_process_env
|
|
14
|
+
from .git_safe import build_git_cmd, build_git_process_env, configured_git_filter_drivers
|
|
15
15
|
from .runtime_artifacts import is_runtime_artifact_path
|
|
16
16
|
|
|
17
17
|
PatchCaptureStatus = Literal["complete", "partial", "failed"]
|
|
@@ -445,11 +445,13 @@ def _snapshot_git(
|
|
|
445
445
|
args: list[str],
|
|
446
446
|
*,
|
|
447
447
|
env: dict[str, str] | None = None,
|
|
448
|
+
input_text: str | None = None,
|
|
448
449
|
) -> str:
|
|
449
450
|
try:
|
|
450
451
|
result = subprocess.run(
|
|
451
452
|
build_git_cmd(root, args, env=env, disable_filters=True),
|
|
452
453
|
env=build_git_process_env(env),
|
|
454
|
+
input=input_text.encode("utf-8") if input_text is not None else None,
|
|
453
455
|
capture_output=True,
|
|
454
456
|
check=False,
|
|
455
457
|
)
|
|
@@ -504,17 +506,63 @@ def _check_snapshot_files(root: Path, *, excluded_paths: tuple[str, ...]) -> Non
|
|
|
504
506
|
raise WorkspaceSnapshotError("unsupported_workspace_file", paths=tuple(sorted(unsupported)))
|
|
505
507
|
|
|
506
508
|
|
|
509
|
+
def _check_snapshot_filters(root: Path, *, pathspecs: list[str]) -> None:
|
|
510
|
+
# Git status may recognize a size change without converting file content.
|
|
511
|
+
# Resolve attributes against the actual index before a HEAD-based temporary
|
|
512
|
+
# index can lose an index-only .gitattributes fallback.
|
|
513
|
+
try:
|
|
514
|
+
drivers = configured_git_filter_drivers(root)
|
|
515
|
+
except (OSError, subprocess.TimeoutExpired) as exc:
|
|
516
|
+
raise WorkspaceSnapshotError("workspace_snapshot_unreadable") from exc
|
|
517
|
+
if not drivers:
|
|
518
|
+
return
|
|
519
|
+
paths = _snapshot_git(
|
|
520
|
+
root,
|
|
521
|
+
[
|
|
522
|
+
"--no-optional-locks",
|
|
523
|
+
"ls-files",
|
|
524
|
+
"--cached",
|
|
525
|
+
"--others",
|
|
526
|
+
"--exclude-standard",
|
|
527
|
+
"-z",
|
|
528
|
+
"--",
|
|
529
|
+
*pathspecs,
|
|
530
|
+
],
|
|
531
|
+
)
|
|
532
|
+
attributes = _snapshot_git(
|
|
533
|
+
root, ["check-attr", "-z", "--stdin", "filter"], input_text=paths
|
|
534
|
+
).split("\0")
|
|
535
|
+
if attributes[-1] != "" or (len(attributes) - 1) % 3:
|
|
536
|
+
raise WorkspaceSnapshotError("workspace_snapshot_unreadable")
|
|
537
|
+
affected = tuple(
|
|
538
|
+
sorted(
|
|
539
|
+
{
|
|
540
|
+
attributes[index]
|
|
541
|
+
for index in range(0, len(attributes) - 1, 3)
|
|
542
|
+
if attributes[index + 2] in drivers
|
|
543
|
+
}
|
|
544
|
+
)
|
|
545
|
+
)
|
|
546
|
+
if affected:
|
|
547
|
+
raise WorkspaceSnapshotError(
|
|
548
|
+
"workspace_snapshot_git_failed",
|
|
549
|
+
paths=affected,
|
|
550
|
+
detail="Git snapshot refused: external Git filters are disabled for isolated workspaces",
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
|
|
507
554
|
def _working_tree_snapshot(
|
|
508
555
|
root: Path, *, base_ref: str, excluded_paths: tuple[str, ...] = ()
|
|
509
556
|
) -> str:
|
|
510
557
|
_check_snapshot_files(root, excluded_paths=excluded_paths)
|
|
558
|
+
pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
|
|
559
|
+
_check_snapshot_filters(root, pathspecs=pathspecs)
|
|
511
560
|
# A separate index preserves both staged and unstaged parent work. Git handles
|
|
512
561
|
# binary data, modes, names and ignored paths; no filename classifier is used.
|
|
513
562
|
with tempfile.TemporaryDirectory(prefix="alysis-git-snapshot-") as scratch:
|
|
514
563
|
env = build_git_process_env()
|
|
515
564
|
env["GIT_INDEX_FILE"] = os.fspath(Path(scratch) / "index")
|
|
516
565
|
_snapshot_git(root, ["read-tree", base_ref], env=env)
|
|
517
|
-
pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
|
|
518
566
|
_snapshot_git(root, ["add", "--all", "--", *pathspecs], env=env)
|
|
519
567
|
tree = _snapshot_git(root, ["write-tree"], env=env).strip()
|
|
520
568
|
gitlinks = tuple(
|
|
@@ -77,11 +77,29 @@ def _disabled_filter_config(
|
|
|
77
77
|
returned command, so unused drivers do not prevent ordinary repositories from
|
|
78
78
|
working. Re-read for every command: a child can introduce filter configuration.
|
|
79
79
|
"""
|
|
80
|
+
drivers = configured_git_filter_drivers(root, extra_config=config, env=env)
|
|
81
|
+
overrides: dict[str, str] = {}
|
|
82
|
+
for driver in drivers:
|
|
83
|
+
# Empty all three commands, including the long-running process protocol.
|
|
84
|
+
# required=true makes an attempted conversion fail instead of passing
|
|
85
|
+
# through bytes that might differ from the real filter's representation.
|
|
86
|
+
overrides.update({f"filter.{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
|
|
87
|
+
overrides[f"filter.{driver}.required"] = "true"
|
|
88
|
+
return overrides
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def configured_git_filter_drivers(
|
|
92
|
+
root: Path,
|
|
93
|
+
*,
|
|
94
|
+
extra_config: dict[str, str] | None = None,
|
|
95
|
+
env: Mapping[str, str] | None = None,
|
|
96
|
+
) -> tuple[str, ...]:
|
|
97
|
+
"""Read effective nonempty filter commands without invoking any driver."""
|
|
80
98
|
result = subprocess.run(
|
|
81
99
|
build_git_cmd(
|
|
82
100
|
root,
|
|
83
101
|
["config", "--null", "--get-regexp", r"^filter\..*\.(clean|smudge|process)$"],
|
|
84
|
-
extra_config=
|
|
102
|
+
extra_config=extra_config,
|
|
85
103
|
env=env,
|
|
86
104
|
),
|
|
87
105
|
env=build_git_process_env(env),
|
|
@@ -90,7 +108,7 @@ def _disabled_filter_config(
|
|
|
90
108
|
timeout=5,
|
|
91
109
|
)
|
|
92
110
|
if result.returncode == 1: # No configured filter commands.
|
|
93
|
-
return
|
|
111
|
+
return ()
|
|
94
112
|
if result.returncode != 0:
|
|
95
113
|
raise OSError("Could not inspect Git filter configuration")
|
|
96
114
|
values: dict[str, str] = {}
|
|
@@ -100,12 +118,6 @@ def _disabled_filter_config(
|
|
|
100
118
|
if not separator:
|
|
101
119
|
raise OSError("Could not read Git filter configuration")
|
|
102
120
|
values[key] = value
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# Empty all three commands, including the long-running process protocol.
|
|
107
|
-
# required=true makes an attempted conversion fail instead of passing
|
|
108
|
-
# through bytes that might differ from the real filter's representation.
|
|
109
|
-
overrides.update({f"{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
|
|
110
|
-
overrides[f"{driver}.required"] = "true"
|
|
111
|
-
return overrides
|
|
121
|
+
return tuple(
|
|
122
|
+
sorted({key[len("filter.") :].rsplit(".", 1)[0] for key, value in values.items() if value})
|
|
123
|
+
)
|
|
@@ -25,7 +25,7 @@ ActivityKind: TypeAlias = Literal[
|
|
|
25
25
|
"other",
|
|
26
26
|
]
|
|
27
27
|
ActivityStatus: TypeAlias = Literal[
|
|
28
|
-
"queued", "running", "succeeded", "failed", "cancelled", "blocked"
|
|
28
|
+
"queued", "running", "succeeded", "failed", "cancelled", "blocked", "completed_unverified"
|
|
29
29
|
]
|
|
30
30
|
|
|
31
31
|
MAX_ACTIVITY_TEXT_CHARS = 500
|
|
@@ -47,7 +47,15 @@ ACTIVITY_KINDS = (
|
|
|
47
47
|
"plan",
|
|
48
48
|
"other",
|
|
49
49
|
)
|
|
50
|
-
ACTIVITY_STATUSES = (
|
|
50
|
+
ACTIVITY_STATUSES = (
|
|
51
|
+
"queued",
|
|
52
|
+
"running",
|
|
53
|
+
"succeeded",
|
|
54
|
+
"failed",
|
|
55
|
+
"cancelled",
|
|
56
|
+
"blocked",
|
|
57
|
+
"completed_unverified",
|
|
58
|
+
)
|
|
51
59
|
|
|
52
60
|
_SAFE_METADATA_KEYS = frozenset(
|
|
53
61
|
{
|
|
@@ -64,6 +72,8 @@ _SAFE_METADATA_KEYS = frozenset(
|
|
|
64
72
|
"step",
|
|
65
73
|
"truncated",
|
|
66
74
|
"worker_id",
|
|
75
|
+
"task_outcome",
|
|
76
|
+
"verified_success",
|
|
67
77
|
}
|
|
68
78
|
)
|
|
69
79
|
_INTERNAL_NAME_PATTERN = re.compile(r"(?:^|[._:/-])(?:rs|internal)(?:[._:/-]|$)", re.I)
|
|
@@ -335,6 +345,8 @@ def _normalize_status(status: str) -> ActivityStatus:
|
|
|
335
345
|
return "queued"
|
|
336
346
|
if normalized in {"running", "started", "in_progress", "progress"}:
|
|
337
347
|
return "running"
|
|
348
|
+
if normalized == "completed_unverified":
|
|
349
|
+
return "completed_unverified"
|
|
338
350
|
if normalized in {"done", "completed", "complete", "success", "succeeded", "ok"}:
|
|
339
351
|
return "succeeded"
|
|
340
352
|
if normalized in {"cancelled", "canceled", "interrupted"}:
|
|
@@ -4,6 +4,7 @@ from dataclasses import dataclass
|
|
|
4
4
|
from pathlib import Path, PurePosixPath
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
+
from ..session_artifacts import ARTIFACT_HANDLE_INDEX_DIR
|
|
7
8
|
from .protocol import ProtocolError, redact_secrets
|
|
8
9
|
|
|
9
10
|
DEFAULT_MAX_ARTIFACT_BYTES = 64 * 1024
|
|
@@ -50,6 +51,8 @@ class ArtifactStore:
|
|
|
50
51
|
except OSError:
|
|
51
52
|
continue
|
|
52
53
|
for path in entries:
|
|
54
|
+
if depth == 0 and path.name == ARTIFACT_HANDLE_INDEX_DIR:
|
|
55
|
+
continue
|
|
53
56
|
if path.is_symlink():
|
|
54
57
|
continue
|
|
55
58
|
if path.is_dir():
|