alysis-code 0.14.1__tar.gz → 0.14.3__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.1 → alysis_code-0.14.3}/PKG-INFO +1 -1
- {alysis_code-0.14.1 → alysis_code-0.14.3}/docs/CHANGELOG.md +38 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/pyproject.toml +1 -1
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/__init__.py +1 -1
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/loop.py +8 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/config_menu.py +63 -7
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/app.py +21 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_flow.py +2 -2
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/config.py +8 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/anthropic_messages.py +51 -12
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/cache_policy.py +6 -2
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/factory.py +2 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/openai_compat.py +7 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/openai_responses.py +8 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/protocols.py +49 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/client.py +11 -7
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_registry.py +17 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/profile_presets.py +4 -1
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/profiles.py +32 -1
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_diagnostics.py +3 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/reasoning_contracts.py +13 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/.gitignore +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/LICENSE +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/NOTICE +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/__main__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/_build_info.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/account_login.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/acceptance_contract.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/blast_radius.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/cache_keepalive.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/checkpoint_worker.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/completion_certificate.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/completion_gate.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/empty_response_stall.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/errors.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/llm_calls.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/mutation_classification.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_context.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_families.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_guidance.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/read_ledger.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/regression_baseline.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/reproduction_first.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/sensitive_output.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/session.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/steering.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_execution.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_workspace.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/task_evidence.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/task_state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/tools_assembly.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/core.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/events.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/exploration.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/interventions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/read_cache.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/snapshot.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn_contract.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/turn_path.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/verification.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/verification_commands.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/verification_evidence.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent/verification_result.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_loop.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/base.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/builtins.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/host.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/registry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/service.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agentbox_client.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/agentbox_integration.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/alysis_cloud.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/approval_scope.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/asset_read_core.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/budget_allocator.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/comprehender.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/index.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/ingestion.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/legacy_migration.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/local_tools.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/ocr.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/index.html +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/owl/show-owl.sh +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/paths.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/plan_binding.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/planner_context.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/planner_tools.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/prompts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/replanner_context.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/untrusted_content.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/usage_logger.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/worker_mirror.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/worker_section.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/assets/worker_tools.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/atomic_io.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/auth_diagnostics.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/background_runner.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/branding.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/budget_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/build_identity.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/bwrap_etc.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cancellation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/capabilities.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/checkpoint_settings.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_cli.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_modal.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/commands.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_resume.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/auth.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/config.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/profile.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/report.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/root.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/server.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/skills.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/startup.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/tools.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/update.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/composer.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/content.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/footer.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/links.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/owl.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/tips.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/clipboard.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/code_review.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/compaction/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/compaction/conversation_compactor.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/compaction/importance.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/compaction/settings.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/compaction/tool_output_offload.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/conflict_auto_resolver.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/consumer_verification.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/context/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/crash_diagnostics.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/discovery.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/runtime.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/session.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/custom_tools/trust.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/diff_paths.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/direction_change.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/dispatch_timing.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/durable_service_manager.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/edit_discipline.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/error_text.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/execution_budget.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/execution_context.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/execution_deadline.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/execution_shared.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/activation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/install.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/manifest.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/paths.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.json +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/extensions/workspace_trust.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/failed_task_evidence.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/failure_category.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/feedback_report.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/file_classification.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/forge.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/forge_completion.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/forge_events.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/frontmatter_utils.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/git_evidence.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/git_ops.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/git_safe.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/git_worktrees.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/audit.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/config.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/dispatcher.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/hooks/trust.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/host_actions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/host_browser.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/activity_events.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/approvals.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/artifacts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/change_ledger.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/context_blocks.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/event_stream.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/forge_protocol.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/forge_request_ledger.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/health.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/managed_browser.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/management_protocol.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/prompt_queue.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/protocol.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/resumable_swarm.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/session_search.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/stdio_bridge.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/structured_state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/ide/swarm_protocol.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/integration_gate.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/interactive_input_guard.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/internal_artifacts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/knowledge_base.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/knowledge_capture.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/knowledge_librarian.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/language_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/litellm_static_provider.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/base.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/cache_capabilities.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/cache_control_blocks.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_generate_content.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_interactions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/http_cancellation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/metadata.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/provider_limits.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/request_plan.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/request_shape.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/streaming.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/temperature_compat.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/tool_call_markup.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/types.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm/usage_normalization.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/llm_error_display.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/logging_redaction.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/managed_host_deadline.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/config.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/errors.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/forge_scope.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/jsonrpc.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/manager.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_runtime.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_store.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/prompts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/resources.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/roots.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/server_requests.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/token_store.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_http.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_stdio.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/mcp/untrusted_content.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/merge_conflict_reviewer.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_catalog/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_metadata_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_metadata_utils.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/model_router.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/permission_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/personas.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/pipeline_facts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/plan_assistant.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/plan_reconciliation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/plan_repair.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/plan_validation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/planning_constraints.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/preview_server.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/private_artifact_io.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/process_reaping.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/prompt_guidance_catalog.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_auth/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_auth/base.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_auth/openai_codex.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_auth/registry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_auth/store.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_model_catalog.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_telemetry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/provider_url.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/remote_sync.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/replanning.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/repo_scan.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/request_estimation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/review_gate.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/run_lock.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/run_outcome.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/run_provenance.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/run_state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/runtime_artifacts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/runtime_context_features.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/runtime_kind.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/safety/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/safety/mcp_sanitize.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/safety/safe_http.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/safety/subagent_report.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/sandbox_doctor.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/sandbox_runner.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/sandbox_settings.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/serialized_paths.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/app.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/auth.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/job_config.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/settings.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/store.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/server/worker_runner.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/service_persistence.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/session_artifacts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/session_metrics.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/session_store.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/conventions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/discovery.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/eval_models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/eval_runner.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/evals.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/install.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/loader.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/matching.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/models.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/paths.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/prompting.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/scaffold.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/state.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/transactions.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/skills/validation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/step_budget.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/subagent_labels.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/subagents.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/base.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/console.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/events.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/hidden_surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/noop_surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/rich_surface.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/styles.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/theme.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/surface/types.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_backend.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_orchestrator.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_scheduler.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_trace.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_worker.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/swarm_write_guard.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/task_dependencies.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/task_readiness.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/task_scope.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/terminal_manager.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/terminal_ownership.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/text_normalization.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/token_budget.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/README.md +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/__init__.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/artifacts.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/availability.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/capability_readiness.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/fs.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/git.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/history.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/http_timeout.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/image_generation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/registry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/repo_map.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/search.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/shell.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/symbols.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/test_discovery.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web_search.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_dashscope.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_ddgs.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_tavily.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/transport_retry.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/updates.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/usage_tracker.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/verification_command_analysis.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/verification_contract.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/verification_failure_summary.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/verification_repair.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/verify_gate.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/web_research.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/web_search_adapters.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/web_search_policy.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/workspace_binding.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/workspace_binding_ui.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/workspace_context.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/src/alysis_code/workspace_isolation.py +0 -0
- {alysis_code-0.14.1 → alysis_code-0.14.3}/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.3
|
|
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
|
|
@@ -6,6 +6,44 @@ Notable user-facing changes to Alysis Code are recorded here. This project follo
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.14.3] - 2026-09-29
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Add Claude Sonnet 5.5 to the Alysis account model picker, using native Messages
|
|
14
|
+
transport, streaming, signed reasoning and tool continuation, and the shared
|
|
15
|
+
hosted credit allowance.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Default hosted accounts to automatic prompt caching. Migrate legacy Manual
|
|
20
|
+
settings only when their other cache settings match the old defaults; preserve
|
|
21
|
+
Off, customized settings, and subsequent explicit choices.
|
|
22
|
+
- Use five-minute cache controls for hosted Sonnet and provider-managed caching
|
|
23
|
+
for hosted DeepSeek, GLM, and Luna. See the
|
|
24
|
+
[caching guide](hosted-prompt-caching.md) for migration details and controls.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Resolve cache previews and diagnostics using each model's actual protocol,
|
|
29
|
+
preserve hosted credit-limit error details, and report Sonnet reasoning usage
|
|
30
|
+
without counting it twice.
|
|
31
|
+
- Honor the configured HTTP MCP startup timeout for initialization acknowledgements.
|
|
32
|
+
Report MCP startup errors once and exit cleanly without retrying through classic chat.
|
|
33
|
+
|
|
34
|
+
## [0.14.2] - 2026-09-28
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- Show only supported reasoning efforts for hosted Luna and clear incompatible
|
|
39
|
+
settings inherited from another model. Map saved or environment-provided
|
|
40
|
+
`minimal` and `ultra` settings to `low` and `max`, preventing invalid-effort
|
|
41
|
+
errors during the free-credit campaign.
|
|
42
|
+
- Preserve the hosted gateway's capacity retry guidance and account request-limit
|
|
43
|
+
messages so users can distinguish temporary capacity from exhausted credits.
|
|
44
|
+
- Cancel working-tip link clicks when a fast mouse drag arrives before the next
|
|
45
|
+
screen repaint.
|
|
46
|
+
|
|
9
47
|
## [0.14.1] - 2026-09-25
|
|
10
48
|
|
|
11
49
|
### Added
|
|
@@ -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:
|
|
@@ -492,7 +519,7 @@ class ConfigMenuState:
|
|
|
492
519
|
"""Drop a stale effort inherited from another provider/model surface."""
|
|
493
520
|
|
|
494
521
|
preset = _active_preset(self)
|
|
495
|
-
if preset is None or preset.key not in {"nvidia", "zai-coding-plan"}:
|
|
522
|
+
if preset is None or preset.key not in {"alysis", "nvidia", "zai-coding-plan"}:
|
|
496
523
|
return
|
|
497
524
|
allowed = _thinking_labels_for_state(
|
|
498
525
|
self,
|
|
@@ -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,
|
|
@@ -3674,7 +3730,7 @@ def _thinking_labels_for_state(
|
|
|
3674
3730
|
if preset_key == "nvidia" and contract is UNKNOWN_CONTRACT:
|
|
3675
3731
|
return ("auto",)
|
|
3676
3732
|
current = _normalize_thinking_label(state.thinking_label)
|
|
3677
|
-
if preset_key in {"nvidia", "zai-coding-plan"}:
|
|
3733
|
+
if preset_key in {"alysis", "nvidia", "zai-coding-plan"}:
|
|
3678
3734
|
# A global effort may have been saved for the previously active
|
|
3679
3735
|
# provider. Do not preserve an invalid value merely because it is
|
|
3680
3736
|
# current; these controls are exact per hosted model and surface.
|
|
@@ -59,6 +59,7 @@ from prompt_toolkit.layout.controls import FormattedTextControl, UIContent, UICo
|
|
|
59
59
|
from prompt_toolkit.layout.dimension import D
|
|
60
60
|
from prompt_toolkit.layout.margins import ScrollbarMargin
|
|
61
61
|
from prompt_toolkit.layout.menus import CompletionsMenu
|
|
62
|
+
from prompt_toolkit.layout.mouse_handlers import MouseHandlers
|
|
62
63
|
from prompt_toolkit.layout.processors import Processor, Transformation
|
|
63
64
|
from prompt_toolkit.layout.utils import explode_text_fragments
|
|
64
65
|
from prompt_toolkit.mouse_events import MouseButton, MouseEvent, MouseEventType
|
|
@@ -2646,6 +2647,7 @@ def run_tui(
|
|
|
2646
2647
|
"step": None,
|
|
2647
2648
|
"generation": 0,
|
|
2648
2649
|
"worker_generation": None,
|
|
2650
|
+
"early_mouse_handlers": None,
|
|
2649
2651
|
}
|
|
2650
2652
|
|
|
2651
2653
|
def _safe_invalidate() -> None:
|
|
@@ -2660,11 +2662,30 @@ def run_tui(
|
|
|
2660
2662
|
tip_link_press = None
|
|
2661
2663
|
drag_capture["generation"] += 1
|
|
2662
2664
|
drag_capture.update({"target": target, "direction": 0, "step": step})
|
|
2665
|
+
if target == "tip_link":
|
|
2666
|
+
# A whole press/drag/release can arrive in one input batch, before
|
|
2667
|
+
# the capture float repaints. Capture those events immediately too.
|
|
2668
|
+
application = get_app()
|
|
2669
|
+
renderer = application.renderer
|
|
2670
|
+
previous = renderer.mouse_handlers
|
|
2671
|
+
captured = MouseHandlers()
|
|
2672
|
+
size = application.output.get_size()
|
|
2673
|
+
captured.set_mouse_handler_for_range(
|
|
2674
|
+
0, size.columns, 0, size.rows, _tip_link_mouse_event
|
|
2675
|
+
)
|
|
2676
|
+
renderer.mouse_handlers = captured
|
|
2677
|
+
drag_capture["early_mouse_handlers"] = (renderer, previous, captured)
|
|
2663
2678
|
_safe_invalidate()
|
|
2664
2679
|
|
|
2665
2680
|
def _stop_drag_capture() -> None:
|
|
2666
2681
|
nonlocal tip_link_press
|
|
2667
2682
|
tip_link_press = None
|
|
2683
|
+
early_handlers = drag_capture.pop("early_mouse_handlers", None)
|
|
2684
|
+
if early_handlers is not None:
|
|
2685
|
+
renderer, previous, captured = early_handlers
|
|
2686
|
+
# A repaint installs its own capture map; never restore over it.
|
|
2687
|
+
if renderer.mouse_handlers is captured:
|
|
2688
|
+
renderer.mouse_handlers = previous
|
|
2668
2689
|
if drag_capture["target"] is None:
|
|
2669
2690
|
return
|
|
2670
2691
|
drag_capture["generation"] += 1
|
|
@@ -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
|
|
@@ -3624,22 +3627,27 @@ def set_config_value(
|
|
|
3624
3627
|
|
|
3625
3628
|
if key == "prompt_cache_mode":
|
|
3626
3629
|
cfg.prompt_cache_mode = _normalize_prompt_cache_mode(value, key=key)
|
|
3630
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3627
3631
|
return cfg
|
|
3628
3632
|
|
|
3629
3633
|
if key == "prompt_cache_key":
|
|
3630
3634
|
cfg.prompt_cache_key = value.strip() or None
|
|
3635
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3631
3636
|
return cfg
|
|
3632
3637
|
|
|
3633
3638
|
if key == "prompt_cache_retention":
|
|
3634
3639
|
cfg.prompt_cache_retention = value.strip() or None
|
|
3640
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3635
3641
|
return cfg
|
|
3636
3642
|
|
|
3637
3643
|
if key == "anthropic_prompt_cache_enabled":
|
|
3638
3644
|
cfg.anthropic_prompt_cache_enabled = _coerce_bool(value, key=key)
|
|
3645
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3639
3646
|
return cfg
|
|
3640
3647
|
|
|
3641
3648
|
if key == "anthropic_prompt_cache_ttl":
|
|
3642
3649
|
cfg.anthropic_prompt_cache_ttl = _normalize_anthropic_prompt_cache_ttl(value, key=key)
|
|
3650
|
+
cfg.hosted_prompt_cache_defaults_applied = True
|
|
3643
3651
|
return cfg
|
|
3644
3652
|
|
|
3645
3653
|
if key == "verify_commands":
|
|
@@ -237,6 +237,12 @@ def _anthropic_thinking_plan(
|
|
|
237
237
|
raise LLMError(f"Anthropic Messages reasoning_effort is not supported: {effort}")
|
|
238
238
|
|
|
239
239
|
if enable_thinking is False or effort == "none":
|
|
240
|
+
if _claude_model_version(model) == _ClaudeModelVersion("sonnet", 5, 5):
|
|
241
|
+
# Sonnet 5.5 replaces disabled with between_tools. This mode still
|
|
242
|
+
# produces signed progress blocks and never accepts forced tools.
|
|
243
|
+
return _AnthropicThinkingPlan(
|
|
244
|
+
config={"type": "between_tools"}, output_effort="high", active=True
|
|
245
|
+
)
|
|
240
246
|
if not _supports_disabled_thinking(model):
|
|
241
247
|
raise LLMError(f"Anthropic model {model!r} does not support disabling thinking")
|
|
242
248
|
# output_effort stays None on purpose: Opus 5 accepts disabled thinking
|
|
@@ -494,12 +500,22 @@ def _anthropic_tools(
|
|
|
494
500
|
*,
|
|
495
501
|
mode: str,
|
|
496
502
|
adapter: str,
|
|
503
|
+
provider_key: str | None = None,
|
|
497
504
|
) -> _AnthropicToolMapping:
|
|
498
505
|
normalized_mode = str(mode or "off").strip().lower()
|
|
499
506
|
normalized_adapter = (
|
|
500
507
|
str(adapter or AUTO_WEB_SEARCH_ADAPTER).strip().lower() or AUTO_WEB_SEARCH_ADAPTER
|
|
501
508
|
)
|
|
502
509
|
raw_tools = [tool for tool in tools or [] if isinstance(tool, dict)]
|
|
510
|
+
if provider_key == "alysis":
|
|
511
|
+
if normalized_mode == "native" or any(
|
|
512
|
+
_is_anthropic_hosted_web_search_tool(tool) for tool in raw_tools
|
|
513
|
+
):
|
|
514
|
+
raise LLMError(
|
|
515
|
+
"Hosted Sonnet does not support built-in web search; use external search"
|
|
516
|
+
)
|
|
517
|
+
if normalized_mode == "auto":
|
|
518
|
+
normalized_mode = "external"
|
|
503
519
|
alysis_web_search_present = any(_is_alysis_web_search_function(tool) for tool in raw_tools)
|
|
504
520
|
use_builtin_web_search = alysis_web_search_present and _anthropic_builtin_web_search_allowed(
|
|
505
521
|
mode=normalized_mode,
|
|
@@ -970,6 +986,12 @@ def _parse_usage(raw: Any) -> LLMUsage | None:
|
|
|
970
986
|
|
|
971
987
|
input_tokens = _as_non_negative_int(raw.get("input_tokens"))
|
|
972
988
|
output_tokens = _as_non_negative_int(raw.get("output_tokens"))
|
|
989
|
+
output_details = raw.get("output_tokens_details")
|
|
990
|
+
reasoning_tokens = (
|
|
991
|
+
_as_non_negative_int(output_details.get("thinking_tokens"))
|
|
992
|
+
if isinstance(output_details, dict)
|
|
993
|
+
else None
|
|
994
|
+
)
|
|
973
995
|
cache_read_input_tokens = _as_non_negative_int(raw.get("cache_read_input_tokens"))
|
|
974
996
|
cache_creation = raw.get("cache_creation")
|
|
975
997
|
cache_creation_5m_input_tokens: int | None = None
|
|
@@ -1013,6 +1035,8 @@ def _parse_usage(raw: Any) -> LLMUsage | None:
|
|
|
1013
1035
|
cache_creation_input_tokens=cache_creation_input_tokens,
|
|
1014
1036
|
cache_creation_5m_input_tokens=cache_creation_5m_input_tokens,
|
|
1015
1037
|
cache_creation_1h_input_tokens=cache_creation_1h_input_tokens,
|
|
1038
|
+
# Anthropic output_tokens already includes thinking; this is a subset.
|
|
1039
|
+
reasoning_tokens=reasoning_tokens,
|
|
1016
1040
|
raw_provider_usage=copy.deepcopy(raw),
|
|
1017
1041
|
)
|
|
1018
1042
|
|
|
@@ -1472,6 +1496,9 @@ class AnthropicMessagesClient:
|
|
|
1472
1496
|
self.base_url = base_url.rstrip("/")
|
|
1473
1497
|
self.api_key = api_key
|
|
1474
1498
|
self.model = model
|
|
1499
|
+
self.supports_forced_tool_choice = _claude_model_version(model) != _ClaudeModelVersion(
|
|
1500
|
+
"sonnet", 5, 5
|
|
1501
|
+
)
|
|
1475
1502
|
self.timeout_s = timeout_s
|
|
1476
1503
|
self.temperature = temperature
|
|
1477
1504
|
self.prompt_cache_key = str(prompt_cache_key or "").strip() or None
|
|
@@ -1523,7 +1550,11 @@ class AnthropicMessagesClient:
|
|
|
1523
1550
|
def _headers(self) -> dict[str, str]:
|
|
1524
1551
|
headers = merge_canonical_headers(
|
|
1525
1552
|
{
|
|
1526
|
-
|
|
1553
|
+
**(
|
|
1554
|
+
{"Authorization": "Bearer " + self.api_key}
|
|
1555
|
+
if self.provider_key == "alysis"
|
|
1556
|
+
else {"x-api-key": self.api_key}
|
|
1557
|
+
),
|
|
1527
1558
|
"anthropic-version": _DEFAULT_ANTHROPIC_VERSION,
|
|
1528
1559
|
"Content-Type": "application/json",
|
|
1529
1560
|
"User-Agent": "alysis-code/0.1.0",
|
|
@@ -1534,23 +1565,29 @@ class AnthropicMessagesClient:
|
|
|
1534
1565
|
|
|
1535
1566
|
@staticmethod
|
|
1536
1567
|
def _llm_error_from_response(response: httpx.Response) -> LLMError:
|
|
1568
|
+
# Keep the structured envelope for shared error presentation. Extracting
|
|
1569
|
+
# only the message loses hosted credit/RPM codes and mislabels all 429s
|
|
1570
|
+
# as provider throttling. Preserve the existing readable exception text.
|
|
1571
|
+
safe_body = sanitize_error_text_for_output(response.text)
|
|
1537
1572
|
try:
|
|
1538
1573
|
data = response.json()
|
|
1539
1574
|
except Exception:
|
|
1540
|
-
body =
|
|
1575
|
+
body = safe_body
|
|
1541
1576
|
if len(body) > 1000:
|
|
1542
1577
|
body = body[:1000] + "...(truncated)"
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
)
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
sanitize_error_text_for_output(f"LLM error {response.status_code}: {data!r}")
|
|
1578
|
+
else:
|
|
1579
|
+
body = _extract_error_message(data) or repr(data)
|
|
1580
|
+
raw_error = data.get("error") if isinstance(data, dict) else None
|
|
1581
|
+
if isinstance(raw_error, dict) and isinstance(raw_error.get("code"), str):
|
|
1582
|
+
# Surfaces and persisted errors can receive only str(error).
|
|
1583
|
+
# Retain coded envelopes there as well as on the exception.
|
|
1584
|
+
body = safe_body
|
|
1585
|
+
error = LLMError(
|
|
1586
|
+
sanitize_error_text_for_output(f"LLM error {response.status_code}: {body}")
|
|
1553
1587
|
)
|
|
1588
|
+
error.provider_status_code = response.status_code
|
|
1589
|
+
error.provider_error_body = safe_body
|
|
1590
|
+
return error
|
|
1554
1591
|
|
|
1555
1592
|
def count_input_tokens(
|
|
1556
1593
|
self,
|
|
@@ -1567,6 +1604,7 @@ class AnthropicMessagesClient:
|
|
|
1567
1604
|
tools,
|
|
1568
1605
|
mode=self.web_search_mode,
|
|
1569
1606
|
adapter=self.web_search_adapter,
|
|
1607
|
+
provider_key=self.provider_key,
|
|
1570
1608
|
)
|
|
1571
1609
|
payload: dict[str, Any] = {
|
|
1572
1610
|
"model": self.model,
|
|
@@ -1703,6 +1741,7 @@ class AnthropicMessagesClient:
|
|
|
1703
1741
|
tools,
|
|
1704
1742
|
mode=self.web_search_mode,
|
|
1705
1743
|
adapter=self.web_search_adapter,
|
|
1744
|
+
provider_key=self.provider_key,
|
|
1706
1745
|
)
|
|
1707
1746
|
effective_max_tokens = (
|
|
1708
1747
|
int(max_tokens) if max_tokens is not None else self.default_max_tokens
|
|
@@ -155,6 +155,10 @@ def resolve_prompt_cache_policy(
|
|
|
155
155
|
) -> ResolvedPromptCachePolicy:
|
|
156
156
|
mode = resolve_prompt_cache_mode(cfg)
|
|
157
157
|
ttl = resolve_anthropic_prompt_cache_ttl(cfg)
|
|
158
|
+
hosted_ttl_warning: tuple[str, ...] = ()
|
|
159
|
+
if provider_key == "alysis" and protocol == "anthropic_messages" and ttl != "5m":
|
|
160
|
+
ttl = "5m"
|
|
161
|
+
hosted_ttl_warning = ("Hosted Sonnet supports only five-minute prompt caching.",)
|
|
158
162
|
effective_capability = cache_capability or resolve_effective_cache_capability(
|
|
159
163
|
provider_key=provider_key,
|
|
160
164
|
protocol=protocol,
|
|
@@ -172,7 +176,7 @@ def resolve_prompt_cache_policy(
|
|
|
172
176
|
trusted_usage_fields=effective_capability.trusted_usage_fields,
|
|
173
177
|
usage_schema=effective_capability.usage_schema,
|
|
174
178
|
min_cacheable_tokens=effective_capability.min_cacheable_tokens,
|
|
175
|
-
warnings=effective_capability.warnings,
|
|
179
|
+
warnings=(*effective_capability.warnings, *hosted_ttl_warning),
|
|
176
180
|
)
|
|
177
181
|
|
|
178
182
|
strategy = effective_capability.strategy
|
|
@@ -207,7 +211,7 @@ def resolve_prompt_cache_policy(
|
|
|
207
211
|
gemini_explicit_enabled = (
|
|
208
212
|
effective_capability.supports_explicit_cached_content and mode == "auto"
|
|
209
213
|
)
|
|
210
|
-
warnings = effective_capability.warnings
|
|
214
|
+
warnings = (*effective_capability.warnings, *hosted_ttl_warning)
|
|
211
215
|
gemini_ttl: str | None = None
|
|
212
216
|
if gemini_explicit_enabled:
|
|
213
217
|
gemini_ttl, gemini_ttl_fallback = _google_duration_from_retention(explicit_retention)
|
|
@@ -381,6 +381,8 @@ def resolve_model_protocol(*, provider_key: str | None, model: str, protocol: st
|
|
|
381
381
|
"""Resolve model-specific transports for initial connections and live switches."""
|
|
382
382
|
if provider_key == "alysis" and model == "gpt-6-luna":
|
|
383
383
|
return OPENAI_RESPONSES_PROTOCOL
|
|
384
|
+
if provider_key == "alysis" and model == "claude-sonnet-5-5":
|
|
385
|
+
return ANTHROPIC_MESSAGES_PROTOCOL
|
|
384
386
|
return protocol
|
|
385
387
|
|
|
386
388
|
|
|
@@ -1362,6 +1362,12 @@ def alysis_trial_error_message(err: LLMError) -> str | None:
|
|
|
1362
1362
|
# and reservation budget in its message, while retaining the OpenAI error code.
|
|
1363
1363
|
# Preserve that explanation instead of mislabeling every limit as excess RPM.
|
|
1364
1364
|
message = error.get("message")
|
|
1365
|
+
if (
|
|
1366
|
+
code == "hosted_capacity_exceeded"
|
|
1367
|
+
and isinstance(message, str)
|
|
1368
|
+
and message.startswith("Hosted model capacity is busy. Retry in ")
|
|
1369
|
+
):
|
|
1370
|
+
return message[:2048]
|
|
1365
1371
|
if (
|
|
1366
1372
|
code == "rate_limit_exceeded"
|
|
1367
1373
|
and isinstance(message, str)
|
|
@@ -1371,6 +1377,7 @@ def alysis_trial_error_message(err: LLMError) -> str | None:
|
|
|
1371
1377
|
"Weekly fair-use limit reached (",
|
|
1372
1378
|
"Four hosted requests are already running for your account.",
|
|
1373
1379
|
"Your account has reached its hosted request limit.",
|
|
1380
|
+
"Your account has reached the 20 requests per minute limit.",
|
|
1374
1381
|
"Available credits cannot cover this request while other usage or reservations apply.",
|
|
1375
1382
|
"Your available credit allowance is exhausted.",
|
|
1376
1383
|
)
|
|
@@ -1024,9 +1024,15 @@ def _responses_reasoning(
|
|
|
1024
1024
|
enable_thinking: bool | None,
|
|
1025
1025
|
reasoning_effort: str | None,
|
|
1026
1026
|
request_summary: bool = False,
|
|
1027
|
+
provider_key: str | None = None,
|
|
1028
|
+
model: str | None = None,
|
|
1027
1029
|
) -> dict[str, Any] | None:
|
|
1028
1030
|
reasoning: dict[str, Any] = {}
|
|
1029
1031
|
effort = str(reasoning_effort or "").strip().lower()
|
|
1032
|
+
if provider_key == "alysis" and model == "gpt-6-luna":
|
|
1033
|
+
# Older hosted pickers exposed the generic Responses efforts. Preserve
|
|
1034
|
+
# saved configs and environment overrides at Luna's supported bounds.
|
|
1035
|
+
effort = {"minimal": "low", "ultra": "max"}.get(effort, effort)
|
|
1030
1036
|
if effort:
|
|
1031
1037
|
if effort not in _RESPONSES_REASONING_EFFORTS:
|
|
1032
1038
|
raise LLMError(f"OpenAI Responses reasoning_effort is not supported: {effort}")
|
|
@@ -2115,6 +2121,8 @@ class OpenAIResponsesClient:
|
|
|
2115
2121
|
enable_thinking=self.enable_thinking,
|
|
2116
2122
|
reasoning_effort=self.reasoning_effort,
|
|
2117
2123
|
request_summary=self._should_request_reasoning_summary(),
|
|
2124
|
+
provider_key=self.provider_key,
|
|
2125
|
+
model=self.model,
|
|
2118
2126
|
)
|
|
2119
2127
|
documented_temperature_reason = documented_temperature_omit_reason(
|
|
2120
2128
|
self.model,
|
|
@@ -356,6 +356,27 @@ PROVIDER_PROTOCOL_CAPABILITIES: tuple[ProviderProtocolCapabilities, ...] = (
|
|
|
356
356
|
reports_cache_write_tokens=True,
|
|
357
357
|
quirks=("Alysis Code's current chat runtime uses Chat Completions-compatible requests.",),
|
|
358
358
|
),
|
|
359
|
+
ProviderProtocolCapabilities(
|
|
360
|
+
provider_key="alysis",
|
|
361
|
+
protocol=OPENAI_COMPAT_PROTOCOL,
|
|
362
|
+
reasoning_trace=ReasoningTraceCapability(
|
|
363
|
+
adapter="openrouter_reasoning",
|
|
364
|
+
supports_streaming=True,
|
|
365
|
+
supports_buffered=True,
|
|
366
|
+
),
|
|
367
|
+
# Declaring cache support must retain the existing local payload
|
|
368
|
+
# estimator and conservative response-usage confidence for this route.
|
|
369
|
+
usage_contract=default_usage_contract_for_protocol(OPENAI_COMPAT_PROTOCOL),
|
|
370
|
+
supports_streaming=True,
|
|
371
|
+
supports_tool_calling=True,
|
|
372
|
+
supports_structured_outputs=True,
|
|
373
|
+
supports_provider_hosted_web_search_adapter=False,
|
|
374
|
+
default_web_search_adapter="none",
|
|
375
|
+
# The gateway does not forward OpenAI affinity/retention fields.
|
|
376
|
+
cache_strategy="implicit_provider",
|
|
377
|
+
reports_cache_read_tokens=True,
|
|
378
|
+
quirks=("Hosted DeepSeek and GLM use provider-managed prompt caching.",),
|
|
379
|
+
),
|
|
359
380
|
ProviderProtocolCapabilities(
|
|
360
381
|
provider_key="openai",
|
|
361
382
|
protocol=OPENAI_RESPONSES_PROTOCOL,
|
|
@@ -403,10 +424,38 @@ PROVIDER_PROTOCOL_CAPABILITIES: tuple[ProviderProtocolCapabilities, ...] = (
|
|
|
403
424
|
supports_structured_outputs=True,
|
|
404
425
|
supports_provider_hosted_web_search_adapter=False,
|
|
405
426
|
default_web_search_adapter="none",
|
|
427
|
+
cache_strategy="implicit_provider",
|
|
406
428
|
reports_cache_read_tokens=True,
|
|
407
429
|
reports_cache_write_tokens=True,
|
|
408
430
|
quirks=("Hosted Luna supports stateless text and function tools with shared credits.",),
|
|
409
431
|
),
|
|
432
|
+
ProviderProtocolCapabilities(
|
|
433
|
+
provider_key="alysis",
|
|
434
|
+
protocol=ANTHROPIC_MESSAGES_PROTOCOL,
|
|
435
|
+
reasoning_trace=ReasoningTraceCapability(
|
|
436
|
+
adapter="anthropic_messages_summary",
|
|
437
|
+
output_kind=ReasoningOutputKind.SUMMARY,
|
|
438
|
+
supports_streaming=True,
|
|
439
|
+
supports_buffered=True,
|
|
440
|
+
requestable=True,
|
|
441
|
+
continuation_state="sensitive",
|
|
442
|
+
),
|
|
443
|
+
usage_contract=UsageContract(
|
|
444
|
+
response_usage_confidence=UsageConfidence.AUTHORITATIVE,
|
|
445
|
+
input_token_count_strategy="none",
|
|
446
|
+
),
|
|
447
|
+
supports_streaming=True,
|
|
448
|
+
supports_tool_calling=True,
|
|
449
|
+
supports_structured_outputs=False,
|
|
450
|
+
supports_forced_tool_choice=False,
|
|
451
|
+
supports_provider_hosted_web_search_adapter=False,
|
|
452
|
+
default_web_search_adapter="none",
|
|
453
|
+
cache_strategy="anthropic_cache_control",
|
|
454
|
+
supports_cache_control=True,
|
|
455
|
+
reports_cache_read_tokens=True,
|
|
456
|
+
reports_cache_write_tokens=True,
|
|
457
|
+
quirks=("Hosted Sonnet supports text, function tools, and five-minute prompt caching.",),
|
|
458
|
+
),
|
|
410
459
|
ProviderProtocolCapabilities(
|
|
411
460
|
provider_key="anthropic",
|
|
412
461
|
protocol=OPENAI_COMPAT_PROTOCOL,
|