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.
Files changed (488) hide show
  1. {alysis_code-0.14.2 → alysis_code-0.14.3}/PKG-INFO +1 -1
  2. {alysis_code-0.14.2 → alysis_code-0.14.3}/docs/CHANGELOG.md +25 -0
  3. {alysis_code-0.14.2 → alysis_code-0.14.3}/pyproject.toml +1 -1
  4. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/__init__.py +1 -1
  5. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/loop.py +8 -0
  6. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/config_menu.py +61 -5
  7. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_flow.py +2 -2
  8. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/config.py +8 -0
  9. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/anthropic_messages.py +51 -12
  10. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_policy.py +6 -2
  11. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/factory.py +2 -0
  12. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/protocols.py +49 -0
  13. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/client.py +11 -7
  14. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_registry.py +17 -0
  15. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/profile_presets.py +4 -1
  16. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/profiles.py +32 -1
  17. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_diagnostics.py +3 -0
  18. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/reasoning_contracts.py +12 -0
  19. {alysis_code-0.14.2 → alysis_code-0.14.3}/.gitignore +0 -0
  20. {alysis_code-0.14.2 → alysis_code-0.14.3}/LICENSE +0 -0
  21. {alysis_code-0.14.2 → alysis_code-0.14.3}/NOTICE +0 -0
  22. {alysis_code-0.14.2 → alysis_code-0.14.3}/README.md +0 -0
  23. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/__main__.py +0 -0
  24. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/_build_info.py +0 -0
  25. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/account_login.py +0 -0
  26. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/README.md +0 -0
  27. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/__init__.py +0 -0
  28. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/acceptance_contract.py +0 -0
  29. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
  30. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/blast_radius.py +0 -0
  31. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/cache_keepalive.py +0 -0
  32. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/checkpoint_worker.py +0 -0
  33. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/completion_certificate.py +0 -0
  34. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/completion_gate.py +0 -0
  35. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/empty_response_stall.py +0 -0
  36. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/errors.py +0 -0
  37. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/llm_calls.py +0 -0
  38. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/mutation_classification.py +0 -0
  39. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_context.py +0 -0
  40. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_families.py +0 -0
  41. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/prompt_guidance.py +0 -0
  42. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/read_ledger.py +0 -0
  43. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/regression_baseline.py +0 -0
  44. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/reproduction_first.py +0 -0
  45. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/sensitive_output.py +0 -0
  46. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/session.py +0 -0
  47. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/steering.py +0 -0
  48. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_execution.py +0 -0
  49. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/subagent_workspace.py +0 -0
  50. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/task_evidence.py +0 -0
  51. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/task_state.py +0 -0
  52. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/tools_assembly.py +0 -0
  53. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/__init__.py +0 -0
  54. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/core.py +0 -0
  55. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/events.py +0 -0
  56. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/exploration.py +0 -0
  57. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/interventions.py +0 -0
  58. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/read_cache.py +0 -0
  59. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/snapshot.py +0 -0
  60. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
  61. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn_contract.py +0 -0
  62. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/turn_path.py +0 -0
  63. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification.py +0 -0
  64. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_commands.py +0 -0
  65. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_evidence.py +0 -0
  66. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent/verification_result.py +0 -0
  67. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_loop.py +0 -0
  68. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/__init__.py +0 -0
  69. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/base.py +0 -0
  70. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/builtins.py +0 -0
  71. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
  72. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/host.py +0 -0
  73. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/registry.py +0 -0
  74. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agent_runtimes/service.py +0 -0
  75. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agentbox_client.py +0 -0
  76. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/agentbox_integration.py +0 -0
  77. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/alysis_cloud.py +0 -0
  78. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/approval_scope.py +0 -0
  79. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/README.md +0 -0
  80. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/__init__.py +0 -0
  81. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/asset_read_core.py +0 -0
  82. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/budget_allocator.py +0 -0
  83. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/comprehender.py +0 -0
  84. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/index.py +0 -0
  85. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/ingestion.py +0 -0
  86. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/legacy_migration.py +0 -0
  87. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/local_tools.py +0 -0
  88. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/models.py +0 -0
  89. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/ocr.py +0 -0
  90. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
  91. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
  92. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
  93. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
  94. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
  95. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
  96. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
  97. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
  98. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
  99. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
  100. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
  101. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
  102. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
  103. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
  104. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
  105. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
  106. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
  107. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
  108. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
  109. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
  110. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
  111. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/index.html +0 -0
  112. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/owl/show-owl.sh +0 -0
  113. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/paths.py +0 -0
  114. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/plan_binding.py +0 -0
  115. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/planner_context.py +0 -0
  116. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/planner_tools.py +0 -0
  117. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/prompts.py +0 -0
  118. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/replanner_context.py +0 -0
  119. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/surface.py +0 -0
  120. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/untrusted_content.py +0 -0
  121. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/usage_logger.py +0 -0
  122. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_mirror.py +0 -0
  123. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_section.py +0 -0
  124. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/assets/worker_tools.py +0 -0
  125. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/atomic_io.py +0 -0
  126. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/auth_diagnostics.py +0 -0
  127. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/background_runner.py +0 -0
  128. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/branding.py +0 -0
  129. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/budget_policy.py +0 -0
  130. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/build_identity.py +0 -0
  131. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/__init__.py +0 -0
  132. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
  133. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/bwrap_etc.py +0 -0
  134. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cancellation.py +0 -0
  135. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/capabilities.py +0 -0
  136. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
  137. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/checkpoint_settings.py +0 -0
  138. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli.py +0 -0
  139. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/__init__.py +0 -0
  140. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_cli.py +0 -0
  141. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/assets_modal.py +0 -0
  142. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
  143. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/commands.py +0 -0
  144. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
  145. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
  146. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
  147. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat/state.py +0 -0
  148. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_resume.py +0 -0
  149. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
  150. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
  151. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
  152. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/auth.py +0 -0
  153. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
  154. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
  155. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
  156. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
  157. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
  158. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
  159. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
  160. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/config.py +0 -0
  161. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
  162. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
  163. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
  164. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge.py +0 -0
  165. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
  166. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
  167. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
  168. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
  169. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
  170. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/profile.py +0 -0
  171. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
  172. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/report.py +0 -0
  173. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/root.py +0 -0
  174. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
  175. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/server.py +0 -0
  176. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
  177. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/skills.py +0 -0
  178. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/startup.py +0 -0
  179. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/tools.py +0 -0
  180. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/update.py +0 -0
  181. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
  182. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge.py +0 -0
  183. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
  184. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
  185. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
  186. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/app.py +0 -0
  187. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
  188. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/composer.py +0 -0
  189. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config.py +0 -0
  190. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
  191. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/content.py +0 -0
  192. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/footer.py +0 -0
  193. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
  194. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/links.py +0 -0
  195. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
  196. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/owl.py +0 -0
  197. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
  198. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
  199. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
  200. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
  201. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/state.py +0 -0
  202. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
  203. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
  204. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/surface.py +0 -0
  205. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/tips.py +0 -0
  206. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
  207. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
  208. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
  209. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/clipboard.py +0 -0
  210. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/code_review.py +0 -0
  211. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/__init__.py +0 -0
  212. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/conversation_compactor.py +0 -0
  213. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/importance.py +0 -0
  214. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/settings.py +0 -0
  215. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/compaction/tool_output_offload.py +0 -0
  216. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/conflict_auto_resolver.py +0 -0
  217. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/consumer_verification.py +0 -0
  218. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/context/__init__.py +0 -0
  219. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
  220. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/crash_diagnostics.py +0 -0
  221. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/README.md +0 -0
  222. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/__init__.py +0 -0
  223. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/discovery.py +0 -0
  224. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/runtime.py +0 -0
  225. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/session.py +0 -0
  226. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/custom_tools/trust.py +0 -0
  227. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/diff_paths.py +0 -0
  228. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/direction_change.py +0 -0
  229. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/dispatch_timing.py +0 -0
  230. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/durable_service_manager.py +0 -0
  231. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/edit_discipline.py +0 -0
  232. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/error_text.py +0 -0
  233. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_budget.py +0 -0
  234. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_context.py +0 -0
  235. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_deadline.py +0 -0
  236. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/execution_shared.py +0 -0
  237. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/README.md +0 -0
  238. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/__init__.py +0 -0
  239. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/activation.py +0 -0
  240. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/install.py +0 -0
  241. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/manifest.py +0 -0
  242. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/models.py +0 -0
  243. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/paths.py +0 -0
  244. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.json +0 -0
  245. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/registry.py +0 -0
  246. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/state.py +0 -0
  247. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/extensions/workspace_trust.py +0 -0
  248. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/failed_task_evidence.py +0 -0
  249. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/failure_category.py +0 -0
  250. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/feedback_report.py +0 -0
  251. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/file_classification.py +0 -0
  252. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge.py +0 -0
  253. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge_completion.py +0 -0
  254. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/forge_events.py +0 -0
  255. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/frontmatter_utils.py +0 -0
  256. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_evidence.py +0 -0
  257. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_ops.py +0 -0
  258. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_safe.py +0 -0
  259. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/git_worktrees.py +0 -0
  260. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/README.md +0 -0
  261. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/__init__.py +0 -0
  262. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/audit.py +0 -0
  263. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/config.py +0 -0
  264. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/dispatcher.py +0 -0
  265. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/models.py +0 -0
  266. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/hooks/trust.py +0 -0
  267. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/host_actions.py +0 -0
  268. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/host_browser.py +0 -0
  269. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/__init__.py +0 -0
  270. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/activity_events.py +0 -0
  271. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/approvals.py +0 -0
  272. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/artifacts.py +0 -0
  273. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
  274. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
  275. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/change_ledger.py +0 -0
  276. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/context_blocks.py +0 -0
  277. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/event_stream.py +0 -0
  278. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/forge_protocol.py +0 -0
  279. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/forge_request_ledger.py +0 -0
  280. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/health.py +0 -0
  281. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/managed_browser.py +0 -0
  282. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/management_protocol.py +0 -0
  283. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
  284. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
  285. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/prompt_queue.py +0 -0
  286. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/protocol.py +0 -0
  287. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/resumable_swarm.py +0 -0
  288. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/session_search.py +0 -0
  289. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/stdio_bridge.py +0 -0
  290. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/structured_state.py +0 -0
  291. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/ide/swarm_protocol.py +0 -0
  292. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/integration_gate.py +0 -0
  293. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/interactive_input_guard.py +0 -0
  294. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/internal_artifacts.py +0 -0
  295. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_base.py +0 -0
  296. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_capture.py +0 -0
  297. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/knowledge_librarian.py +0 -0
  298. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/language_policy.py +0 -0
  299. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/litellm_static_provider.py +0 -0
  300. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/__init__.py +0 -0
  301. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/base.py +0 -0
  302. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_capabilities.py +0 -0
  303. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/cache_control_blocks.py +0 -0
  304. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_generate_content.py +0 -0
  305. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/gemini_interactions.py +0 -0
  306. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/http_cancellation.py +0 -0
  307. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/metadata.py +0 -0
  308. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/openai_compat.py +0 -0
  309. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/openai_responses.py +0 -0
  310. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/provider_limits.py +0 -0
  311. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/request_plan.py +0 -0
  312. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/request_shape.py +0 -0
  313. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/streaming.py +0 -0
  314. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/temperature_compat.py +0 -0
  315. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/tool_call_markup.py +0 -0
  316. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/types.py +0 -0
  317. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm/usage_normalization.py +0 -0
  318. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/llm_error_display.py +0 -0
  319. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/logging_redaction.py +0 -0
  320. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/managed_host_deadline.py +0 -0
  321. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/README.md +0 -0
  322. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/__init__.py +0 -0
  323. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/config.py +0 -0
  324. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/errors.py +0 -0
  325. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/forge_scope.py +0 -0
  326. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/jsonrpc.py +0 -0
  327. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/manager.py +0 -0
  328. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/models.py +0 -0
  329. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth.py +0 -0
  330. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_runtime.py +0 -0
  331. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/oauth_store.py +0 -0
  332. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/prompts.py +0 -0
  333. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/resources.py +0 -0
  334. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/roots.py +0 -0
  335. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/server_requests.py +0 -0
  336. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/token_store.py +0 -0
  337. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_http.py +0 -0
  338. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/transport_stdio.py +0 -0
  339. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/mcp/untrusted_content.py +0 -0
  340. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/merge_conflict_reviewer.py +0 -0
  341. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/__init__.py +0 -0
  342. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
  343. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
  344. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
  345. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_metadata_policy.py +0 -0
  346. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_metadata_utils.py +0 -0
  347. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/model_router.py +0 -0
  348. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/permission_policy.py +0 -0
  349. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/personas.py +0 -0
  350. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/pipeline_facts.py +0 -0
  351. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_assistant.py +0 -0
  352. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_reconciliation.py +0 -0
  353. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_repair.py +0 -0
  354. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/plan_validation.py +0 -0
  355. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/planning_constraints.py +0 -0
  356. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/policy.py +0 -0
  357. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/preview_server.py +0 -0
  358. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/private_artifact_io.py +0 -0
  359. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/process_reaping.py +0 -0
  360. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/prompt_guidance_catalog.py +0 -0
  361. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/__init__.py +0 -0
  362. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/base.py +0 -0
  363. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/openai_codex.py +0 -0
  364. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/registry.py +0 -0
  365. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_auth/store.py +0 -0
  366. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_model_catalog.py +0 -0
  367. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_telemetry.py +0 -0
  368. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/provider_url.py +0 -0
  369. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/remote_sync.py +0 -0
  370. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/replanning.py +0 -0
  371. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/repo_scan.py +0 -0
  372. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/request_estimation.py +0 -0
  373. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/review_gate.py +0 -0
  374. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_lock.py +0 -0
  375. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_outcome.py +0 -0
  376. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_provenance.py +0 -0
  377. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/run_state.py +0 -0
  378. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_artifacts.py +0 -0
  379. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_context_features.py +0 -0
  380. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/runtime_kind.py +0 -0
  381. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/__init__.py +0 -0
  382. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/mcp_sanitize.py +0 -0
  383. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/safe_http.py +0 -0
  384. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/safety/subagent_report.py +0 -0
  385. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_doctor.py +0 -0
  386. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_runner.py +0 -0
  387. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/sandbox_settings.py +0 -0
  388. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/serialized_paths.py +0 -0
  389. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/__init__.py +0 -0
  390. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/app.py +0 -0
  391. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/auth.py +0 -0
  392. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/job_config.py +0 -0
  393. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/settings.py +0 -0
  394. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/store.py +0 -0
  395. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/server/worker_runner.py +0 -0
  396. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/service_persistence.py +0 -0
  397. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_artifacts.py +0 -0
  398. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_metrics.py +0 -0
  399. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/session_store.py +0 -0
  400. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/README.md +0 -0
  401. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/__init__.py +0 -0
  402. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
  403. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
  404. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
  405. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
  406. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
  407. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
  408. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
  409. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
  410. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/conventions.py +0 -0
  411. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/discovery.py +0 -0
  412. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/eval_models.py +0 -0
  413. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/eval_runner.py +0 -0
  414. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/evals.py +0 -0
  415. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/install.py +0 -0
  416. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/loader.py +0 -0
  417. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/matching.py +0 -0
  418. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/models.py +0 -0
  419. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/paths.py +0 -0
  420. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/prompting.py +0 -0
  421. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/scaffold.py +0 -0
  422. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/state.py +0 -0
  423. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/transactions.py +0 -0
  424. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/skills/validation.py +0 -0
  425. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/step_budget.py +0 -0
  426. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/subagent_labels.py +0 -0
  427. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/subagents.py +0 -0
  428. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/__init__.py +0 -0
  429. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/base.py +0 -0
  430. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/console.py +0 -0
  431. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/events.py +0 -0
  432. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/hidden_surface.py +0 -0
  433. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/noop_surface.py +0 -0
  434. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/rich_surface.py +0 -0
  435. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/styles.py +0 -0
  436. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/theme.py +0 -0
  437. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/surface/types.py +0 -0
  438. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_backend.py +0 -0
  439. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_orchestrator.py +0 -0
  440. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_scheduler.py +0 -0
  441. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_trace.py +0 -0
  442. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_worker.py +0 -0
  443. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/swarm_write_guard.py +0 -0
  444. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_dependencies.py +0 -0
  445. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_readiness.py +0 -0
  446. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/task_scope.py +0 -0
  447. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/terminal_manager.py +0 -0
  448. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/terminal_ownership.py +0 -0
  449. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/text_normalization.py +0 -0
  450. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/token_budget.py +0 -0
  451. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/README.md +0 -0
  452. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/__init__.py +0 -0
  453. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/artifacts.py +0 -0
  454. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/availability.py +0 -0
  455. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/capability_readiness.py +0 -0
  456. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/fs.py +0 -0
  457. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/git.py +0 -0
  458. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/history.py +0 -0
  459. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/http_timeout.py +0 -0
  460. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/image_generation.py +0 -0
  461. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/registry.py +0 -0
  462. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/repo_map.py +0 -0
  463. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/search.py +0 -0
  464. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/shell.py +0 -0
  465. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/symbols.py +0 -0
  466. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/test_discovery.py +0 -0
  467. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web.py +0 -0
  468. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search.py +0 -0
  469. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_dashscope.py +0 -0
  470. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_ddgs.py +0 -0
  471. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
  472. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/tools/web_search_tavily.py +0 -0
  473. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/transport_retry.py +0 -0
  474. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/updates.py +0 -0
  475. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/usage_tracker.py +0 -0
  476. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_command_analysis.py +0 -0
  477. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_contract.py +0 -0
  478. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_failure_summary.py +0 -0
  479. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verification_repair.py +0 -0
  480. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/verify_gate.py +0 -0
  481. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_research.py +0 -0
  482. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_search_adapters.py +0 -0
  483. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/web_search_policy.py +0 -0
  484. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_binding.py +0 -0
  485. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_binding_ui.py +0 -0
  486. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_context.py +0 -0
  487. {alysis_code-0.14.2 → alysis_code-0.14.3}/src/alysis_code/workspace_isolation.py +0 -0
  488. {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.2
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alysis-code"
7
- version = "0.14.2"
7
+ version = "0.14.3"
8
8
  description = "Local CLI coding agent powered by any API."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  __all__ = ["__version__"]
2
2
 
3
- __version__ = "0.14.2"
3
+ __version__ = "0.14.3"
@@ -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 str(getattr(cfg, "prompt_cache_mode", "") or "manual") != desired_cache_mode:
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 = _normalize_anthropic_prompt_cache_ttl(
1419
- state.fields.get("anthropic_prompt_cache_ttl", "5m")
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
- protocol = str(preview_profile.protocol or OPENAI_COMPAT_PROTOCOL).strip()
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
- protocol = str(profile.protocol or OPENAI_COMPAT_PROTOCOL).strip()
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": "derive provider-aware cache settings when supported",
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 prompt caching",
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
- "x-api-key": self.api_key,
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 = response.text
1575
+ body = safe_body
1541
1576
  if len(body) > 1000:
1542
1577
  body = body[:1000] + "...(truncated)"
1543
- return LLMError(
1544
- sanitize_error_text_for_output(f"LLM error {response.status_code}: {body}")
1545
- )
1546
- error_message = _extract_error_message(data)
1547
- if error_message:
1548
- return LLMError(
1549
- sanitize_error_text_for_output(f"LLM error {response.status_code}: {error_message}")
1550
- )
1551
- return LLMError(
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
- # `notifications/initialized` needs a real follow-up window for immediate
52
- # server activity without turning every quiet startup into a full startup-timeout wait.
53
- _INITIALIZED_NOTIFICATION_COMPLETION_TIMEOUT_S = 0.5
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=min(
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, and GPT-6 Luna with free credits. Authenticate with `alysis login`.",
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