alysis-code 0.14.2__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.2 → alysis_code-0.14.3}/PKG-INFO +1 -1
- {alysis_code-0.14.2 → alysis_code-0.14.3}/docs/CHANGELOG.md +25 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/pyproject.toml +1 -1
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/__init__.py +1 -1
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/loop.py +8 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/config_menu.py +61 -5
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_flow.py +2 -2
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/config.py +8 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/anthropic_messages.py +51 -12
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_policy.py +6 -2
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/factory.py +2 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/protocols.py +49 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/client.py +11 -7
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_registry.py +17 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/profile_presets.py +4 -1
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/profiles.py +32 -1
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_diagnostics.py +3 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/reasoning_contracts.py +12 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/.gitignore +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/LICENSE +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/NOTICE +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/__main__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/_build_info.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/account_login.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/acceptance_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/blast_radius.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/cache_keepalive.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/checkpoint_worker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/completion_certificate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/completion_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/empty_response_stall.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/errors.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/llm_calls.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/mutation_classification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_families.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_guidance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/read_ledger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/regression_baseline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/reproduction_first.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/sensitive_output.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/session.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/steering.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_execution.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_workspace.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/task_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/task_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/tools_assembly.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/core.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/exploration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/interventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/read_cache.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/snapshot.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn_path.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_commands.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_result.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_loop.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/builtins.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/host.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/service.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agentbox_client.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agentbox_integration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/alysis_cloud.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/approval_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/asset_read_core.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/budget_allocator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/comprehender.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/index.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/ingestion.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/legacy_migration.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/local_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/ocr.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/index.html +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/show-owl.sh +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/plan_binding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/planner_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/planner_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/prompts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/replanner_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/untrusted_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/usage_logger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_mirror.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_section.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/atomic_io.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/auth_diagnostics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/background_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/branding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/budget_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/build_identity.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/bwrap_etc.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cancellation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/capabilities.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/checkpoint_settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_cli.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_modal.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/commands.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_resume.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/auth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/profile.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/root.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/server.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/skills.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/startup.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/tools.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/update.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/composer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/footer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/links.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/owl.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/tips.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/clipboard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/code_review.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/conversation_compactor.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/importance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/tool_output_offload.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/conflict_auto_resolver.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/consumer_verification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/context/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/crash_diagnostics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/runtime.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/session.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/diff_paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/direction_change.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/dispatch_timing.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/durable_service_manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/edit_discipline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/error_text.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_deadline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_shared.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/activation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/install.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/manifest.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/workspace_trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/failed_task_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/failure_category.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/feedback_report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/file_classification.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge_completion.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge_events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/frontmatter_utils.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_evidence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_ops.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_safe.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_worktrees.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/audit.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/dispatcher.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/trust.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/host_actions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/host_browser.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/activity_events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/approvals.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/change_ledger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/context_blocks.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/event_stream.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/forge_protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/forge_request_ledger.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/health.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/managed_browser.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/management_protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/prompt_queue.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/resumable_swarm.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/session_search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/stdio_bridge.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/structured_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/swarm_protocol.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/integration_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/interactive_input_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/internal_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_capture.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_librarian.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/language_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/litellm_static_provider.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_capabilities.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_control_blocks.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_generate_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_interactions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/http_cancellation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/metadata.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/openai_compat.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/openai_responses.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/provider_limits.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/request_plan.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/request_shape.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/streaming.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/temperature_compat.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/tool_call_markup.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/types.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/usage_normalization.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm_error_display.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/logging_redaction.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/managed_host_deadline.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/errors.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/forge_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/jsonrpc.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_runtime.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/prompts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/resources.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/roots.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/server_requests.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/token_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_http.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_stdio.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/untrusted_content.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/merge_conflict_reviewer.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_metadata_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_metadata_utils.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_router.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/permission_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/personas.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/pipeline_facts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_assistant.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_reconciliation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_repair.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_validation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/planning_constraints.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/preview_server.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/private_artifact_io.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/process_reaping.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/prompt_guidance_catalog.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/openai_codex.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_model_catalog.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_telemetry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_url.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/remote_sync.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/replanning.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/repo_scan.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/request_estimation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/review_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_lock.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_outcome.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_provenance.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_context_features.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_kind.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/mcp_sanitize.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/safe_http.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/subagent_report.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_doctor.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/serialized_paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/app.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/auth.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/job_config.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/settings.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/worker_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/service_persistence.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_metrics.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_store.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/conventions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/eval_models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/eval_runner.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/evals.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/install.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/loader.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/matching.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/models.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/paths.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/prompting.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/scaffold.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/state.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/transactions.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/validation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/step_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/subagent_labels.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/subagents.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/base.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/console.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/events.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/hidden_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/noop_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/rich_surface.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/styles.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/theme.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/types.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_backend.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_orchestrator.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_scheduler.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_trace.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_worker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_write_guard.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_dependencies.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_readiness.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_scope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/terminal_manager.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/terminal_ownership.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/text_normalization.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/token_budget.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/README.md +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/__init__.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/artifacts.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/availability.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/capability_readiness.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/fs.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/git.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/history.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/http_timeout.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/image_generation.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/registry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/repo_map.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/shell.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/symbols.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/test_discovery.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_dashscope.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_ddgs.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_tavily.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/transport_retry.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/updates.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/usage_tracker.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_command_analysis.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_contract.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_failure_summary.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_repair.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verify_gate.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_research.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_search_adapters.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_search_policy.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_binding.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_binding_ui.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_context.py +0 -0
- {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_isolation.py +0 -0
- {alysis_code-0.14.2 → 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,31 @@ 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
|
+
|
|
9
34
|
## [0.14.2] - 2026-09-28
|
|
10
35
|
|
|
11
36
|
### 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
|
|
@@ -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
|
|
|
@@ -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,
|
|
@@ -48,9 +48,9 @@ _SUPPORTED_PROTOCOL_VERSIONS_BY_TRANSPORT = {
|
|
|
48
48
|
"stdio": (MCP_STDIO_PROTOCOL_VERSION,),
|
|
49
49
|
"http": MCP_HTTP_SUPPORTED_PROTOCOL_VERSIONS,
|
|
50
50
|
}
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
|
|
51
|
+
# Stdio observes immediate server activity after `notifications/initialized`
|
|
52
|
+
# without making a quiet startup wait for the full configured timeout.
|
|
53
|
+
_STDIO_INITIALIZED_NOTIFICATION_COMPLETION_TIMEOUT_S = 0.5
|
|
54
54
|
_ReadOnlyRequestResult = TypeVar("_ReadOnlyRequestResult")
|
|
55
55
|
|
|
56
56
|
|
|
@@ -430,13 +430,17 @@ class _BaseMcpClient:
|
|
|
430
430
|
self._supports_resources = "resources" in capabilities
|
|
431
431
|
self._supports_prompts = "prompts" in capabilities
|
|
432
432
|
self._apply_negotiated_protocol_version(protocol_version)
|
|
433
|
+
notification_timeout_s = self.server.startup_timeout_s
|
|
434
|
+
if self.server.transport == "stdio":
|
|
435
|
+
notification_timeout_s = min(
|
|
436
|
+
notification_timeout_s, _STDIO_INITIALIZED_NOTIFICATION_COMPLETION_TIMEOUT_S
|
|
437
|
+
)
|
|
438
|
+
# HTTP must wait for the server's acknowledgement of the notification;
|
|
439
|
+
# a short stdio observation window is not a network request timeout.
|
|
433
440
|
self.transport.send_notification(
|
|
434
441
|
method="notifications/initialized",
|
|
435
442
|
params={},
|
|
436
|
-
completion_timeout_s=
|
|
437
|
-
self.server.startup_timeout_s,
|
|
438
|
-
_INITIALIZED_NOTIFICATION_COMPLETION_TIMEOUT_S,
|
|
439
|
-
),
|
|
443
|
+
completion_timeout_s=notification_timeout_s,
|
|
440
444
|
)
|
|
441
445
|
self._initialized = True
|
|
442
446
|
self._drain_notifications()
|
|
@@ -1593,6 +1593,23 @@ _OFFICIAL_PROVIDER_MODEL_METADATA["alysis"]["gpt-6-luna"] = {
|
|
|
1593
1593
|
"output_cost_per_token": 0.0000005,
|
|
1594
1594
|
}
|
|
1595
1595
|
|
|
1596
|
+
# Anthropic's launch specifications and standard five-minute cache pricing.
|
|
1597
|
+
_PROVIDER_CANONICAL_MODEL_IDS["alysis"]["claude-sonnet-5-5"] = "claude-sonnet-5-5"
|
|
1598
|
+
_OFFICIAL_PROVIDER_MODEL_SOURCES["alysis"]["claude-sonnet-5-5"] = (
|
|
1599
|
+
"https://platform.claude.com/docs/en/models/sonnet-5-5/overview",
|
|
1600
|
+
)
|
|
1601
|
+
_OFFICIAL_PROVIDER_MODEL_METADATA["alysis"]["claude-sonnet-5-5"] = {
|
|
1602
|
+
"context_window_tokens": 1_000_000,
|
|
1603
|
+
"max_output_tokens": 128_000,
|
|
1604
|
+
# The hosted route initially meters text/tools; image accounting is separate.
|
|
1605
|
+
"supports_vision": False,
|
|
1606
|
+
"supports_reasoning": True,
|
|
1607
|
+
"input_cost_per_token": 0.000002,
|
|
1608
|
+
"cache_read_input_cost_per_token": 0.0000002,
|
|
1609
|
+
"cache_creation_input_cost_per_token": 0.0000025,
|
|
1610
|
+
"output_cost_per_token": 0.00001,
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1596
1613
|
_BUILT_IN_MODEL_METADATA: dict[str, dict[str, Any]] = {
|
|
1597
1614
|
"deepseek-chat": {
|
|
1598
1615
|
"context_window_tokens": 1_000_000,
|
|
@@ -1768,8 +1768,10 @@ PROFILE_PRESETS: tuple[ProfilePreset, ...] = (
|
|
|
1768
1768
|
ReviewedModel("deepseek-flash", "deepseek-expanded"),
|
|
1769
1769
|
ReviewedModel("glm-5.3-flash", "glm-normal"),
|
|
1770
1770
|
ReviewedModel("gpt-6-luna", "gpt-expanded"),
|
|
1771
|
+
ReviewedModel("claude-sonnet-5-5", "claude-normal"),
|
|
1771
1772
|
),
|
|
1772
1773
|
suggested_model_descriptions={
|
|
1774
|
+
"claude-sonnet-5-5": "Claude Sonnet 5.5 - coding and reasoning, included with free credits",
|
|
1773
1775
|
"gpt-6-luna": "GPT-6 Luna - efficient coding and reasoning, included with free credits",
|
|
1774
1776
|
"deepseek-flash": (
|
|
1775
1777
|
"DeepSeek V4.1 Flash - vision and reasoning, 1M context, included with free credits"
|
|
@@ -1787,7 +1789,7 @@ PROFILE_PRESETS: tuple[ProfilePreset, ...] = (
|
|
|
1787
1789
|
"deepseek-v4.1-flash-expires-on-0910": "deepseek-flash",
|
|
1788
1790
|
},
|
|
1789
1791
|
setup_warning="Run `alysis login` to connect your Alysis account and use free credits.",
|
|
1790
|
-
notes="DeepSeek V4.1 Flash, GLM 5.3 Flash,
|
|
1792
|
+
notes="DeepSeek V4.1 Flash, GLM 5.3 Flash, GPT-6 Luna, and Claude Sonnet 5.5 with free credits. Authenticate with `alysis login`.",
|
|
1791
1793
|
),
|
|
1792
1794
|
ProfilePreset(
|
|
1793
1795
|
key="ollama",
|
|
@@ -1842,6 +1844,7 @@ def model_display_name(model: str) -> str:
|
|
|
1842
1844
|
"deepseek-flash": "DeepSeek V4.1 Flash",
|
|
1843
1845
|
"glm-5.3-flash": "GLM 5.3 Flash",
|
|
1844
1846
|
"gpt-6-luna": "GPT-6 Luna",
|
|
1847
|
+
"claude-sonnet-5-5": "Claude Sonnet 5.5",
|
|
1845
1848
|
"grok-4.7": "Grok 4.7",
|
|
1846
1849
|
}.get(model.casefold(), model)
|
|
1847
1850
|
|