alysis-code 0.14.0__tar.gz → 0.14.2__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.0 → alysis_code-0.14.2}/PKG-INFO +1 -1
  2. {alysis_code-0.14.0 → alysis_code-0.14.2}/docs/CHANGELOG.md +30 -2
  3. {alysis_code-0.14.0 → alysis_code-0.14.2}/pyproject.toml +1 -1
  4. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/__init__.py +1 -1
  5. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/loop.py +44 -12
  6. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/config_menu.py +2 -2
  7. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/app.py +21 -0
  8. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/factory.py +8 -0
  9. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/openai_compat.py +12 -2
  10. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/openai_responses.py +47 -5
  11. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/protocols.py +24 -0
  12. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_registry.py +16 -0
  13. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/profile_presets.py +3 -1
  14. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/reasoning_contracts.py +12 -0
  15. {alysis_code-0.14.0 → alysis_code-0.14.2}/.gitignore +0 -0
  16. {alysis_code-0.14.0 → alysis_code-0.14.2}/LICENSE +0 -0
  17. {alysis_code-0.14.0 → alysis_code-0.14.2}/NOTICE +0 -0
  18. {alysis_code-0.14.0 → alysis_code-0.14.2}/README.md +0 -0
  19. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/__main__.py +0 -0
  20. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/_build_info.py +0 -0
  21. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/account_login.py +0 -0
  22. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/README.md +0 -0
  23. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/__init__.py +0 -0
  24. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/acceptance_contract.py +0 -0
  25. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
  26. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/blast_radius.py +0 -0
  27. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/cache_keepalive.py +0 -0
  28. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/checkpoint_worker.py +0 -0
  29. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/completion_certificate.py +0 -0
  30. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/completion_gate.py +0 -0
  31. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/empty_response_stall.py +0 -0
  32. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/errors.py +0 -0
  33. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/llm_calls.py +0 -0
  34. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/mutation_classification.py +0 -0
  35. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/prompt_context.py +0 -0
  36. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/prompt_families.py +0 -0
  37. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/prompt_guidance.py +0 -0
  38. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/read_ledger.py +0 -0
  39. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/regression_baseline.py +0 -0
  40. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/reproduction_first.py +0 -0
  41. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/sensitive_output.py +0 -0
  42. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/session.py +0 -0
  43. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/steering.py +0 -0
  44. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/subagent_execution.py +0 -0
  45. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/subagent_workspace.py +0 -0
  46. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/task_evidence.py +0 -0
  47. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/task_state.py +0 -0
  48. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/tools_assembly.py +0 -0
  49. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/__init__.py +0 -0
  50. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/core.py +0 -0
  51. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/events.py +0 -0
  52. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/exploration.py +0 -0
  53. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/interventions.py +0 -0
  54. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/read_cache.py +0 -0
  55. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/snapshot.py +0 -0
  56. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
  57. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn_contract.py +0 -0
  58. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/turn_path.py +0 -0
  59. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/verification.py +0 -0
  60. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/verification_commands.py +0 -0
  61. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/verification_evidence.py +0 -0
  62. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent/verification_result.py +0 -0
  63. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_loop.py +0 -0
  64. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/__init__.py +0 -0
  65. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/base.py +0 -0
  66. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/builtins.py +0 -0
  67. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
  68. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/host.py +0 -0
  69. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/registry.py +0 -0
  70. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agent_runtimes/service.py +0 -0
  71. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agentbox_client.py +0 -0
  72. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/agentbox_integration.py +0 -0
  73. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/alysis_cloud.py +0 -0
  74. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/approval_scope.py +0 -0
  75. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/README.md +0 -0
  76. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/__init__.py +0 -0
  77. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/asset_read_core.py +0 -0
  78. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/budget_allocator.py +0 -0
  79. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/comprehender.py +0 -0
  80. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/index.py +0 -0
  81. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/ingestion.py +0 -0
  82. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/legacy_migration.py +0 -0
  83. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/local_tools.py +0 -0
  84. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/models.py +0 -0
  85. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/ocr.py +0 -0
  86. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
  87. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
  88. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
  89. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
  90. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
  91. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
  92. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
  93. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
  94. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
  95. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
  96. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
  97. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
  98. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
  99. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
  100. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
  101. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
  102. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
  103. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
  104. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
  105. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
  106. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
  107. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/index.html +0 -0
  108. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/owl/show-owl.sh +0 -0
  109. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/paths.py +0 -0
  110. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/plan_binding.py +0 -0
  111. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/planner_context.py +0 -0
  112. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/planner_tools.py +0 -0
  113. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/prompts.py +0 -0
  114. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/replanner_context.py +0 -0
  115. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/surface.py +0 -0
  116. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/untrusted_content.py +0 -0
  117. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/usage_logger.py +0 -0
  118. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/worker_mirror.py +0 -0
  119. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/worker_section.py +0 -0
  120. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/assets/worker_tools.py +0 -0
  121. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/atomic_io.py +0 -0
  122. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/auth_diagnostics.py +0 -0
  123. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/background_runner.py +0 -0
  124. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/branding.py +0 -0
  125. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/budget_policy.py +0 -0
  126. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/build_identity.py +0 -0
  127. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/builtin_hooks/__init__.py +0 -0
  128. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
  129. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/bwrap_etc.py +0 -0
  130. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cancellation.py +0 -0
  131. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/capabilities.py +0 -0
  132. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
  133. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/checkpoint_settings.py +0 -0
  134. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli.py +0 -0
  135. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/__init__.py +0 -0
  136. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/assets_cli.py +0 -0
  137. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/assets_modal.py +0 -0
  138. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
  139. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/commands.py +0 -0
  140. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
  141. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
  142. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
  143. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat/state.py +0 -0
  144. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat_resume.py +0 -0
  145. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
  146. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
  147. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
  148. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/auth.py +0 -0
  149. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
  150. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
  151. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
  152. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
  153. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
  154. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
  155. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
  156. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/config.py +0 -0
  157. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
  158. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
  159. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
  160. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/forge.py +0 -0
  161. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
  162. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
  163. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
  164. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
  165. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
  166. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/profile.py +0 -0
  167. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
  168. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/report.py +0 -0
  169. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/root.py +0 -0
  170. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
  171. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/server.py +0 -0
  172. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
  173. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/skills.py +0 -0
  174. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/startup.py +0 -0
  175. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/tools.py +0 -0
  176. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/update.py +0 -0
  177. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
  178. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/forge.py +0 -0
  179. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
  180. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
  181. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
  182. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
  183. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/composer.py +0 -0
  184. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/config.py +0 -0
  185. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/config_flow.py +0 -0
  186. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
  187. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/content.py +0 -0
  188. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/footer.py +0 -0
  189. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
  190. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/links.py +0 -0
  191. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
  192. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/owl.py +0 -0
  193. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
  194. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
  195. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
  196. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
  197. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/state.py +0 -0
  198. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
  199. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
  200. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/surface.py +0 -0
  201. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/tips.py +0 -0
  202. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
  203. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
  204. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
  205. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/clipboard.py +0 -0
  206. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/code_review.py +0 -0
  207. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/compaction/__init__.py +0 -0
  208. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/compaction/conversation_compactor.py +0 -0
  209. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/compaction/importance.py +0 -0
  210. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/compaction/settings.py +0 -0
  211. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/compaction/tool_output_offload.py +0 -0
  212. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/config.py +0 -0
  213. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/conflict_auto_resolver.py +0 -0
  214. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/consumer_verification.py +0 -0
  215. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/context/__init__.py +0 -0
  216. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
  217. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/crash_diagnostics.py +0 -0
  218. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/README.md +0 -0
  219. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/__init__.py +0 -0
  220. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/discovery.py +0 -0
  221. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/runtime.py +0 -0
  222. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/session.py +0 -0
  223. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/custom_tools/trust.py +0 -0
  224. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/diff_paths.py +0 -0
  225. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/direction_change.py +0 -0
  226. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/dispatch_timing.py +0 -0
  227. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/durable_service_manager.py +0 -0
  228. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/edit_discipline.py +0 -0
  229. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/error_text.py +0 -0
  230. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/execution_budget.py +0 -0
  231. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/execution_context.py +0 -0
  232. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/execution_deadline.py +0 -0
  233. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/execution_shared.py +0 -0
  234. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/README.md +0 -0
  235. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/__init__.py +0 -0
  236. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/activation.py +0 -0
  237. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/install.py +0 -0
  238. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/manifest.py +0 -0
  239. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/models.py +0 -0
  240. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/paths.py +0 -0
  241. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/registry.json +0 -0
  242. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/registry.py +0 -0
  243. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/state.py +0 -0
  244. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/extensions/workspace_trust.py +0 -0
  245. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/failed_task_evidence.py +0 -0
  246. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/failure_category.py +0 -0
  247. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/feedback_report.py +0 -0
  248. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/file_classification.py +0 -0
  249. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/forge.py +0 -0
  250. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/forge_completion.py +0 -0
  251. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/forge_events.py +0 -0
  252. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/frontmatter_utils.py +0 -0
  253. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/git_evidence.py +0 -0
  254. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/git_ops.py +0 -0
  255. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/git_safe.py +0 -0
  256. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/git_worktrees.py +0 -0
  257. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/README.md +0 -0
  258. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/__init__.py +0 -0
  259. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/audit.py +0 -0
  260. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/config.py +0 -0
  261. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/dispatcher.py +0 -0
  262. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/models.py +0 -0
  263. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/hooks/trust.py +0 -0
  264. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/host_actions.py +0 -0
  265. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/host_browser.py +0 -0
  266. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/__init__.py +0 -0
  267. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/activity_events.py +0 -0
  268. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/approvals.py +0 -0
  269. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/artifacts.py +0 -0
  270. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
  271. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
  272. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/change_ledger.py +0 -0
  273. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/context_blocks.py +0 -0
  274. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/event_stream.py +0 -0
  275. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/forge_protocol.py +0 -0
  276. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/forge_request_ledger.py +0 -0
  277. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/health.py +0 -0
  278. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/managed_browser.py +0 -0
  279. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/management_protocol.py +0 -0
  280. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
  281. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
  282. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/prompt_queue.py +0 -0
  283. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/protocol.py +0 -0
  284. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/resumable_swarm.py +0 -0
  285. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/session_search.py +0 -0
  286. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/stdio_bridge.py +0 -0
  287. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/structured_state.py +0 -0
  288. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/ide/swarm_protocol.py +0 -0
  289. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/integration_gate.py +0 -0
  290. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/interactive_input_guard.py +0 -0
  291. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/internal_artifacts.py +0 -0
  292. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/knowledge_base.py +0 -0
  293. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/knowledge_capture.py +0 -0
  294. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/knowledge_librarian.py +0 -0
  295. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/language_policy.py +0 -0
  296. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/litellm_static_provider.py +0 -0
  297. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/__init__.py +0 -0
  298. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/anthropic_messages.py +0 -0
  299. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/base.py +0 -0
  300. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/cache_capabilities.py +0 -0
  301. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/cache_control_blocks.py +0 -0
  302. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/cache_policy.py +0 -0
  303. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/gemini_generate_content.py +0 -0
  304. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/gemini_interactions.py +0 -0
  305. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/http_cancellation.py +0 -0
  306. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/metadata.py +0 -0
  307. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/provider_limits.py +0 -0
  308. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/request_plan.py +0 -0
  309. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/request_shape.py +0 -0
  310. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/streaming.py +0 -0
  311. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/temperature_compat.py +0 -0
  312. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/tool_call_markup.py +0 -0
  313. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/types.py +0 -0
  314. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm/usage_normalization.py +0 -0
  315. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/llm_error_display.py +0 -0
  316. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/logging_redaction.py +0 -0
  317. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/managed_host_deadline.py +0 -0
  318. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/README.md +0 -0
  319. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/__init__.py +0 -0
  320. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/client.py +0 -0
  321. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/config.py +0 -0
  322. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/errors.py +0 -0
  323. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/forge_scope.py +0 -0
  324. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/jsonrpc.py +0 -0
  325. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/manager.py +0 -0
  326. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/models.py +0 -0
  327. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/oauth.py +0 -0
  328. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/oauth_runtime.py +0 -0
  329. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/oauth_store.py +0 -0
  330. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/prompts.py +0 -0
  331. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/resources.py +0 -0
  332. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/roots.py +0 -0
  333. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/server_requests.py +0 -0
  334. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/token_store.py +0 -0
  335. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/transport_http.py +0 -0
  336. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/transport_stdio.py +0 -0
  337. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/mcp/untrusted_content.py +0 -0
  338. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/merge_conflict_reviewer.py +0 -0
  339. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_catalog/__init__.py +0 -0
  340. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
  341. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
  342. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
  343. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_metadata_policy.py +0 -0
  344. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_metadata_utils.py +0 -0
  345. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/model_router.py +0 -0
  346. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/permission_policy.py +0 -0
  347. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/personas.py +0 -0
  348. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/pipeline_facts.py +0 -0
  349. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/plan_assistant.py +0 -0
  350. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/plan_reconciliation.py +0 -0
  351. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/plan_repair.py +0 -0
  352. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/plan_validation.py +0 -0
  353. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/planning_constraints.py +0 -0
  354. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/policy.py +0 -0
  355. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/preview_server.py +0 -0
  356. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/private_artifact_io.py +0 -0
  357. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/process_reaping.py +0 -0
  358. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/profiles.py +0 -0
  359. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/prompt_guidance_catalog.py +0 -0
  360. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_auth/__init__.py +0 -0
  361. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_auth/base.py +0 -0
  362. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_auth/openai_codex.py +0 -0
  363. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_auth/registry.py +0 -0
  364. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_auth/store.py +0 -0
  365. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_diagnostics.py +0 -0
  366. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_model_catalog.py +0 -0
  367. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_telemetry.py +0 -0
  368. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/provider_url.py +0 -0
  369. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/remote_sync.py +0 -0
  370. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/replanning.py +0 -0
  371. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/repo_scan.py +0 -0
  372. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/request_estimation.py +0 -0
  373. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/review_gate.py +0 -0
  374. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/run_lock.py +0 -0
  375. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/run_outcome.py +0 -0
  376. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/run_provenance.py +0 -0
  377. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/run_state.py +0 -0
  378. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/runtime_artifacts.py +0 -0
  379. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/runtime_context_features.py +0 -0
  380. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/runtime_kind.py +0 -0
  381. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/safety/__init__.py +0 -0
  382. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/safety/mcp_sanitize.py +0 -0
  383. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/safety/safe_http.py +0 -0
  384. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/safety/subagent_report.py +0 -0
  385. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/sandbox_doctor.py +0 -0
  386. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/sandbox_runner.py +0 -0
  387. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/sandbox_settings.py +0 -0
  388. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/serialized_paths.py +0 -0
  389. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/__init__.py +0 -0
  390. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/app.py +0 -0
  391. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/auth.py +0 -0
  392. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/job_config.py +0 -0
  393. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/settings.py +0 -0
  394. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/store.py +0 -0
  395. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/server/worker_runner.py +0 -0
  396. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/service_persistence.py +0 -0
  397. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/session_artifacts.py +0 -0
  398. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/session_metrics.py +0 -0
  399. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/session_store.py +0 -0
  400. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/README.md +0 -0
  401. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/__init__.py +0 -0
  402. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
  403. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
  404. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
  405. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
  406. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
  407. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
  408. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
  409. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
  410. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/conventions.py +0 -0
  411. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/discovery.py +0 -0
  412. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/eval_models.py +0 -0
  413. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/eval_runner.py +0 -0
  414. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/evals.py +0 -0
  415. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/install.py +0 -0
  416. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/loader.py +0 -0
  417. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/matching.py +0 -0
  418. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/models.py +0 -0
  419. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/paths.py +0 -0
  420. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/prompting.py +0 -0
  421. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/scaffold.py +0 -0
  422. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/state.py +0 -0
  423. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/transactions.py +0 -0
  424. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/skills/validation.py +0 -0
  425. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/step_budget.py +0 -0
  426. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/subagent_labels.py +0 -0
  427. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/subagents.py +0 -0
  428. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/__init__.py +0 -0
  429. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/base.py +0 -0
  430. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/console.py +0 -0
  431. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/events.py +0 -0
  432. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/hidden_surface.py +0 -0
  433. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/noop_surface.py +0 -0
  434. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/rich_surface.py +0 -0
  435. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/styles.py +0 -0
  436. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/theme.py +0 -0
  437. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/surface/types.py +0 -0
  438. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_backend.py +0 -0
  439. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_orchestrator.py +0 -0
  440. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_scheduler.py +0 -0
  441. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_trace.py +0 -0
  442. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_worker.py +0 -0
  443. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/swarm_write_guard.py +0 -0
  444. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/task_dependencies.py +0 -0
  445. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/task_readiness.py +0 -0
  446. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/task_scope.py +0 -0
  447. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/terminal_manager.py +0 -0
  448. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/terminal_ownership.py +0 -0
  449. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/text_normalization.py +0 -0
  450. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/token_budget.py +0 -0
  451. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/README.md +0 -0
  452. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/__init__.py +0 -0
  453. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/artifacts.py +0 -0
  454. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/availability.py +0 -0
  455. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/capability_readiness.py +0 -0
  456. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/fs.py +0 -0
  457. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/git.py +0 -0
  458. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/history.py +0 -0
  459. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/http_timeout.py +0 -0
  460. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/image_generation.py +0 -0
  461. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/registry.py +0 -0
  462. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/repo_map.py +0 -0
  463. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/search.py +0 -0
  464. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/shell.py +0 -0
  465. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/symbols.py +0 -0
  466. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/test_discovery.py +0 -0
  467. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web.py +0 -0
  468. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web_search.py +0 -0
  469. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web_search_dashscope.py +0 -0
  470. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web_search_ddgs.py +0 -0
  471. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
  472. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/tools/web_search_tavily.py +0 -0
  473. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/transport_retry.py +0 -0
  474. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/updates.py +0 -0
  475. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/usage_tracker.py +0 -0
  476. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/verification_command_analysis.py +0 -0
  477. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/verification_contract.py +0 -0
  478. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/verification_failure_summary.py +0 -0
  479. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/verification_repair.py +0 -0
  480. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/verify_gate.py +0 -0
  481. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/web_research.py +0 -0
  482. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/web_search_adapters.py +0 -0
  483. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/web_search_policy.py +0 -0
  484. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/workspace_binding.py +0 -0
  485. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/workspace_binding_ui.py +0 -0
  486. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/workspace_context.py +0 -0
  487. {alysis_code-0.14.0 → alysis_code-0.14.2}/src/alysis_code/workspace_isolation.py +0 -0
  488. {alysis_code-0.14.0 → alysis_code-0.14.2}/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.0
3
+ Version: 0.14.2
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,7 +6,34 @@ Notable user-facing changes to Alysis Code are recorded here. This project follo
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- No user-facing changes yet.
9
+ ## [0.14.2] - 2026-09-28
10
+
11
+ ### Fixed
12
+
13
+ - Show only supported reasoning efforts for hosted Luna and clear incompatible
14
+ settings inherited from another model. Map saved or environment-provided
15
+ `minimal` and `ultra` settings to `low` and `max`, preventing invalid-effort
16
+ errors during the free-credit campaign.
17
+ - Preserve the hosted gateway's capacity retry guidance and account request-limit
18
+ messages so users can distinguish temporary capacity from exhausted credits.
19
+ - Cancel working-tip link clicks when a fast mouse drag arrives before the next
20
+ screen repaint.
21
+
22
+ ## [0.14.1] - 2026-09-25
23
+
24
+ ### Added
25
+
26
+ - Add GPT-6 Luna to the Alysis Code account model picker, with hosted Responses
27
+ routing, configurable reasoning, and stateless function-tool continuation.
28
+ Luna uses the account's shared credit allowance alongside the Flash models.
29
+
30
+ ### Fixed
31
+
32
+ - Rebuild the correct chat and compactor transports when switching between hosted
33
+ Luna and Flash models during a conversation, while preserving the session on a
34
+ failed switch.
35
+ - Keep hosted web search as a function tool and show the gateway's capacity,
36
+ request, and credit-limit reasons instead of a generic rate-limit message.
10
37
 
11
38
  ## [0.14.0] - 2026-09-24
12
39
 
@@ -342,7 +369,8 @@ Public launch and repository-layout refresh.
342
369
  Release notes for versions before 0.9.8 remain available in the
343
370
  [GitHub Releases archive](https://github.com/AlysisAi/alysis-code/releases).
344
371
 
345
- [Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.14.0...HEAD
372
+ [Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.14.1...HEAD
373
+ [0.14.1]: https://github.com/AlysisAi/alysis-code/compare/v0.14.0...v0.14.1
346
374
  [0.14.0]: https://github.com/AlysisAi/alysis-code/compare/v0.13.8...v0.14.0
347
375
  [0.13.8]: https://github.com/AlysisAi/alysis-code/compare/v0.13.7...v0.13.8
348
376
  [0.13.7]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6.2...v0.13.7
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alysis-code"
7
- version = "0.14.0"
7
+ version = "0.14.2"
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.0"
3
+ __version__ = "0.14.2"
@@ -947,6 +947,8 @@ def _reset_route_local_client_capabilities(client: Any, *, route_changed: bool)
947
947
 
948
948
  _RELOAD_SESSION_FIELDS = (
949
949
  "cfg",
950
+ "client",
951
+ "conversation_compactor",
950
952
  "routing_mode",
951
953
  "max_steps",
952
954
  "api_key",
@@ -1093,7 +1095,7 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1093
1095
  )
1094
1096
  from ...llm.cache_capabilities import resolve_effective_cache_capability
1095
1097
  from ...llm.cache_policy import build_prompt_cache_namespace, resolve_prompt_cache_policy
1096
- from ...llm.factory import _session_routing_headers
1098
+ from ...llm.factory import _session_routing_headers, make_llm_client, resolve_model_protocol
1097
1099
  from ...llm.metadata import (
1098
1100
  build_provider_route_identity,
1099
1101
  credential_scope_fingerprint,
@@ -1125,7 +1127,7 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1125
1127
  )
1126
1128
  active_profile = get_active_profile(session.cfg)
1127
1129
  effective_base_url = resolve_effective_base_url(cfg=session.cfg, profile=active_profile)
1128
- protocol = str(active_profile.protocol or OPENAI_COMPAT_PROTOCOL).strip()
1130
+ profile_protocol = str(active_profile.protocol or OPENAI_COMPAT_PROTOCOL).strip()
1129
1131
  resolved_key = resolve_api_key(session.cfg)
1130
1132
  session.api_key = str(resolved_key.key or "")
1131
1133
  session.api_key_source = (
@@ -1166,8 +1168,41 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1166
1168
  model: str,
1167
1169
  role: str,
1168
1170
  temperature: float | None = None,
1169
- ) -> None:
1171
+ ) -> Any:
1170
1172
  existing_route_identity = getattr(client, "route_identity", None)
1173
+ preset = find_preset_for_profile(active_profile)
1174
+ provider_key = str(preset.provider_key or "").strip() if preset is not None else ""
1175
+ if not provider_key:
1176
+ provider_key = resolve_model_provider_key(
1177
+ cfg=session.cfg,
1178
+ model_name=model,
1179
+ base_url=effective_base_url,
1180
+ profile_name=active_profile.name,
1181
+ )
1182
+ protocol = resolve_model_protocol(
1183
+ provider_key=provider_key, model=model, protocol=profile_protocol
1184
+ )
1185
+ existing_protocol = str(getattr(existing_route_identity, "protocol", "") or "")
1186
+ if existing_protocol and existing_protocol != protocol:
1187
+ return make_llm_client(
1188
+ cfg=session.cfg,
1189
+ api_key=session.api_key,
1190
+ model=model,
1191
+ timeout_s=timeout_s,
1192
+ temperature=temperature if temperature is not None else client.temperature,
1193
+ prompt_cache_key=prompt_cache_key,
1194
+ prompt_cache_retention=prompt_cache_retention,
1195
+ prompt_cache_namespace=build_prompt_cache_namespace(
1196
+ workspace_root=getattr(session, "root", None),
1197
+ role=role,
1198
+ profile_name=active_profile.name,
1199
+ ),
1200
+ enable_thinking=enable_thinking,
1201
+ reasoning_effort=reasoning_effort,
1202
+ transport=getattr(client, "_transport", None),
1203
+ profile=active_profile,
1204
+ session_id=provider_session_id,
1205
+ )
1171
1206
  client.base_url = effective_base_url
1172
1207
  if hasattr(client, "provider_auth"):
1173
1208
  client.provider_auth = provider_auth
@@ -1178,17 +1213,10 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1178
1213
  client.timeout_s = timeout_s
1179
1214
  if temperature is not None:
1180
1215
  client.temperature = temperature
1181
- provider_key = resolve_model_provider_key(
1182
- cfg=session.cfg,
1183
- model_name=model,
1184
- base_url=effective_base_url,
1185
- profile_name=active_profile.name,
1186
- )
1187
1216
  capabilities = get_provider_protocol_capabilities(
1188
1217
  provider_key=provider_key,
1189
1218
  protocol=protocol,
1190
1219
  )
1191
- preset = find_preset_for_profile(active_profile)
1192
1220
  cache_capability = resolve_effective_cache_capability(
1193
1221
  provider_key=provider_key,
1194
1222
  protocol=protocol,
@@ -1331,10 +1359,11 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1331
1359
  client.provider_concurrency_caps = dict(session.cfg.provider_concurrency_caps)
1332
1360
  if hasattr(client, "provider_retry_settings"):
1333
1361
  client.provider_retry_settings = provider_retry_settings
1362
+ return client
1334
1363
 
1335
1364
  client = getattr(session, "client", None)
1336
1365
  if client is not None:
1337
- _apply_client_config(
1366
+ session.client = _apply_client_config(
1338
1367
  client,
1339
1368
  model=str(session.cfg.model or ""),
1340
1369
  role=ROLE_CODING,
@@ -1353,12 +1382,15 @@ def _apply_config_menu_changes_to_session_mutating(*, session: Any, cfg: AppConf
1353
1382
  )
1354
1383
  except ConfigError:
1355
1384
  compactor_model = str(session.cfg.model or "")
1356
- _apply_client_config(
1385
+ refreshed_compactor_client = _apply_client_config(
1357
1386
  compactor_client,
1358
1387
  model=compactor_model,
1359
1388
  role=ROLE_COMPACTOR,
1360
1389
  temperature=resolve_role_temperature(session.cfg, role=ROLE_COMPACTOR),
1361
1390
  )
1391
+ if refreshed_compactor_client is not compactor_client:
1392
+ session.conversation_compactor = copy.copy(compactor)
1393
+ session.conversation_compactor.compactor_client = refreshed_compactor_client
1362
1394
 
1363
1395
  _rebuild_session_tools_for_mode(
1364
1396
  session=session,
@@ -492,7 +492,7 @@ class ConfigMenuState:
492
492
  """Drop a stale effort inherited from another provider/model surface."""
493
493
 
494
494
  preset = _active_preset(self)
495
- if preset is None or preset.key not in {"nvidia", "zai-coding-plan"}:
495
+ if preset is None or preset.key not in {"alysis", "nvidia", "zai-coding-plan"}:
496
496
  return
497
497
  allowed = _thinking_labels_for_state(
498
498
  self,
@@ -3674,7 +3674,7 @@ def _thinking_labels_for_state(
3674
3674
  if preset_key == "nvidia" and contract is UNKNOWN_CONTRACT:
3675
3675
  return ("auto",)
3676
3676
  current = _normalize_thinking_label(state.thinking_label)
3677
- if preset_key in {"nvidia", "zai-coding-plan"}:
3677
+ if preset_key in {"alysis", "nvidia", "zai-coding-plan"}:
3678
3678
  # A global effort may have been saved for the previously active
3679
3679
  # provider. Do not preserve an invalid value merely because it is
3680
3680
  # current; these controls are exact per hosted model and surface.
@@ -59,6 +59,7 @@ from prompt_toolkit.layout.controls import FormattedTextControl, UIContent, UICo
59
59
  from prompt_toolkit.layout.dimension import D
60
60
  from prompt_toolkit.layout.margins import ScrollbarMargin
61
61
  from prompt_toolkit.layout.menus import CompletionsMenu
62
+ from prompt_toolkit.layout.mouse_handlers import MouseHandlers
62
63
  from prompt_toolkit.layout.processors import Processor, Transformation
63
64
  from prompt_toolkit.layout.utils import explode_text_fragments
64
65
  from prompt_toolkit.mouse_events import MouseButton, MouseEvent, MouseEventType
@@ -2646,6 +2647,7 @@ def run_tui(
2646
2647
  "step": None,
2647
2648
  "generation": 0,
2648
2649
  "worker_generation": None,
2650
+ "early_mouse_handlers": None,
2649
2651
  }
2650
2652
 
2651
2653
  def _safe_invalidate() -> None:
@@ -2660,11 +2662,30 @@ def run_tui(
2660
2662
  tip_link_press = None
2661
2663
  drag_capture["generation"] += 1
2662
2664
  drag_capture.update({"target": target, "direction": 0, "step": step})
2665
+ if target == "tip_link":
2666
+ # A whole press/drag/release can arrive in one input batch, before
2667
+ # the capture float repaints. Capture those events immediately too.
2668
+ application = get_app()
2669
+ renderer = application.renderer
2670
+ previous = renderer.mouse_handlers
2671
+ captured = MouseHandlers()
2672
+ size = application.output.get_size()
2673
+ captured.set_mouse_handler_for_range(
2674
+ 0, size.columns, 0, size.rows, _tip_link_mouse_event
2675
+ )
2676
+ renderer.mouse_handlers = captured
2677
+ drag_capture["early_mouse_handlers"] = (renderer, previous, captured)
2663
2678
  _safe_invalidate()
2664
2679
 
2665
2680
  def _stop_drag_capture() -> None:
2666
2681
  nonlocal tip_link_press
2667
2682
  tip_link_press = None
2683
+ early_handlers = drag_capture.pop("early_mouse_handlers", None)
2684
+ if early_handlers is not None:
2685
+ renderer, previous, captured = early_handlers
2686
+ # A repaint installs its own capture map; never restore over it.
2687
+ if renderer.mouse_handlers is captured:
2688
+ renderer.mouse_handlers = previous
2668
2689
  if drag_capture["target"] is None:
2669
2690
  return
2670
2691
  drag_capture["generation"] += 1
@@ -126,6 +126,7 @@ def make_llm_client(
126
126
  base_url=base_url,
127
127
  profile_name=resolved_profile.name,
128
128
  )
129
+ protocol = resolve_model_protocol(provider_key=provider_key, model=model, protocol=protocol)
129
130
  capabilities = get_provider_protocol_capabilities(
130
131
  provider_key=provider_key,
131
132
  protocol=protocol,
@@ -376,6 +377,13 @@ def make_llm_client(
376
377
  )
377
378
 
378
379
 
380
+ def resolve_model_protocol(*, provider_key: str | None, model: str, protocol: str) -> str:
381
+ """Resolve model-specific transports for initial connections and live switches."""
382
+ if provider_key == "alysis" and model == "gpt-6-luna":
383
+ return OPENAI_RESPONSES_PROTOCOL
384
+ return protocol
385
+
386
+
379
387
  def _attach_reasoning_trace_capability(client: ChatClient, capability: object) -> ChatClient:
380
388
  """Expose the resolved trace dialect without widening every client constructor."""
381
389
 
@@ -1329,8 +1329,9 @@ _ALYSIS_PROXY_ERROR_MESSAGES: dict[str, str] = {
1329
1329
  "You're sending requests too quickly. Please wait a moment and try again."
1330
1330
  ),
1331
1331
  "hosted_capacity_exceeded": (
1332
- "Hosted model capacity is full. Please retry in a few seconds. "
1333
- "No generation was started and your reserved credits were released."
1332
+ "The Alysis hosted model is unavailable or at capacity. "
1333
+ "If this persists, its server route needs checking. "
1334
+ "No generation was started and no credits were charged."
1334
1335
  ),
1335
1336
  "hosted_routing_unavailable": (
1336
1337
  "Hosted model routing is temporarily unavailable. Please retry shortly. "
@@ -1361,6 +1362,12 @@ def alysis_trial_error_message(err: LLMError) -> str | None:
1361
1362
  # and reservation budget in its message, while retaining the OpenAI error code.
1362
1363
  # Preserve that explanation instead of mislabeling every limit as excess RPM.
1363
1364
  message = error.get("message")
1365
+ if (
1366
+ code == "hosted_capacity_exceeded"
1367
+ and isinstance(message, str)
1368
+ and message.startswith("Hosted model capacity is busy. Retry in ")
1369
+ ):
1370
+ return message[:2048]
1364
1371
  if (
1365
1372
  code == "rate_limit_exceeded"
1366
1373
  and isinstance(message, str)
@@ -1369,7 +1376,10 @@ def alysis_trial_error_message(err: LLMError) -> str | None:
1369
1376
  "5-hour fair-use limit reached (",
1370
1377
  "Weekly fair-use limit reached (",
1371
1378
  "Four hosted requests are already running for your account.",
1379
+ "Your account has reached its hosted request limit.",
1380
+ "Your account has reached the 20 requests per minute limit.",
1372
1381
  "Available credits cannot cover this request while other usage or reservations apply.",
1382
+ "Your available credit allowance is exhausted.",
1373
1383
  )
1374
1384
  )
1375
1385
  ):
@@ -35,6 +35,7 @@ from .metadata import (
35
35
  merge_canonical_headers,
36
36
  stamp_response_for_route,
37
37
  )
38
+ from .protocols import OPENAI_RESPONSES_PROTOCOL, get_provider_protocol_capabilities
38
39
  from .provider_limits import (
39
40
  DEFAULT_PROVIDER_CONCURRENCY_CAPS,
40
41
  ProviderRetrySettings,
@@ -867,6 +868,7 @@ def _responses_tools(
867
868
  *,
868
869
  mode: str,
869
870
  adapter: str,
871
+ provider_key: str | None = None,
870
872
  ) -> _ResponsesToolMapping:
871
873
  normalized_mode = str(mode or "off").strip().lower()
872
874
  normalized_adapter = (
@@ -874,8 +876,26 @@ def _responses_tools(
874
876
  )
875
877
  raw_tools = [tool for tool in tools or [] if isinstance(tool, dict)]
876
878
  alysis_web_search_present = any(_is_alysis_web_search_function(tool) for tool in raw_tools)
879
+ capabilities = get_provider_protocol_capabilities(
880
+ provider_key=provider_key or "", protocol=OPENAI_RESPONSES_PROTOCOL
881
+ )
882
+ builtin_web_search_allowed = (
883
+ capabilities is None or capabilities.supports_provider_hosted_web_search_adapter
884
+ )
885
+ hosted_web_search_present = any(
886
+ _is_responses_hosted_web_search_tool(tool) for tool in raw_tools
887
+ )
888
+ if not builtin_web_search_allowed and (
889
+ (normalized_mode == "native" and alysis_web_search_present)
890
+ or (normalized_mode in {"auto", "native"} and hosted_web_search_present)
891
+ ):
892
+ raise LLMError(
893
+ f"Provider {provider_key!r} does not support built-in web search. "
894
+ "Use web_search_mode='auto' or 'external' with the Alysis web_search function."
895
+ )
877
896
  use_openai_builtin_web_search = (
878
- alysis_web_search_present
897
+ builtin_web_search_allowed
898
+ and alysis_web_search_present
879
899
  and _openai_builtin_web_search_allowed(
880
900
  mode=normalized_mode,
881
901
  adapter=normalized_adapter,
@@ -1004,9 +1024,15 @@ def _responses_reasoning(
1004
1024
  enable_thinking: bool | None,
1005
1025
  reasoning_effort: str | None,
1006
1026
  request_summary: bool = False,
1027
+ provider_key: str | None = None,
1028
+ model: str | None = None,
1007
1029
  ) -> dict[str, Any] | None:
1008
1030
  reasoning: dict[str, Any] = {}
1009
1031
  effort = str(reasoning_effort or "").strip().lower()
1032
+ if provider_key == "alysis" and model == "gpt-6-luna":
1033
+ # Older hosted pickers exposed the generic Responses efforts. Preserve
1034
+ # saved configs and environment overrides at Luna's supported bounds.
1035
+ effort = {"minimal": "low", "ultra": "max"}.get(effort, effort)
1010
1036
  if effort:
1011
1037
  if effort not in _RESPONSES_REASONING_EFFORTS:
1012
1038
  raise LLMError(f"OpenAI Responses reasoning_effort is not supported: {effort}")
@@ -1916,12 +1942,16 @@ class OpenAIResponsesClient:
1916
1942
  )
1917
1943
  error_message = _extract_error_message(data)
1918
1944
  if error_message:
1919
- return LLMError(
1945
+ err = LLMError(
1920
1946
  sanitize_error_text_for_output(f"LLM error {response.status_code}: {error_message}")
1921
1947
  )
1922
- return LLMError(
1923
- sanitize_error_text_for_output(f"LLM error {response.status_code}: {data!r}")
1924
- )
1948
+ else:
1949
+ err = LLMError(
1950
+ sanitize_error_text_for_output(f"LLM error {response.status_code}: {data!r}")
1951
+ )
1952
+ err.provider_status_code = response.status_code
1953
+ err.provider_error_body = sanitize_error_text_for_output(json.dumps(data))
1954
+ return err
1925
1955
 
1926
1956
  def count_input_tokens(
1927
1957
  self,
@@ -1940,6 +1970,7 @@ class OpenAIResponsesClient:
1940
1970
  tools,
1941
1971
  mode=self.web_search_mode,
1942
1972
  adapter=self.web_search_adapter,
1973
+ provider_key=self.provider_key,
1943
1974
  )
1944
1975
  payload: dict[str, Any] = {
1945
1976
  "model": self.model,
@@ -2080,6 +2111,7 @@ class OpenAIResponsesClient:
2080
2111
  tools,
2081
2112
  mode=self.web_search_mode,
2082
2113
  adapter=self.web_search_adapter,
2114
+ provider_key=self.provider_key,
2083
2115
  )
2084
2116
  mapped_tools = tool_mapping.tools
2085
2117
  temp_omit_key = _responses_temperature_omit_key(self.base_url, self.model)
@@ -2089,6 +2121,8 @@ class OpenAIResponsesClient:
2089
2121
  enable_thinking=self.enable_thinking,
2090
2122
  reasoning_effort=self.reasoning_effort,
2091
2123
  request_summary=self._should_request_reasoning_summary(),
2124
+ provider_key=self.provider_key,
2125
+ model=self.model,
2092
2126
  )
2093
2127
  documented_temperature_reason = documented_temperature_omit_reason(
2094
2128
  self.model,
@@ -2106,6 +2140,10 @@ class OpenAIResponsesClient:
2106
2140
  supports_previous_response_id = self.provider_auth is None or bool(
2107
2141
  getattr(self.provider_auth, "supports_previous_response_id", True)
2108
2142
  )
2143
+ if self.provider_key == "alysis":
2144
+ # Hosted credits meter the complete request. Shared upstream storage
2145
+ # must never be addressable by another Alysis account.
2146
+ supports_previous_response_id = False
2109
2147
  if continuation is not None and supports_previous_response_id:
2110
2148
  # With previous_response_id the API appends the sent input items to the
2111
2149
  # stored thread; system/developer messages from turn 1 are already
@@ -2175,6 +2213,10 @@ class OpenAIResponsesClient:
2175
2213
  payload["stream"] = True
2176
2214
  if self.provider_auth is not None:
2177
2215
  payload = self.provider_auth.adapt_responses_payload(payload)
2216
+ if self.provider_key == "alysis":
2217
+ payload["store"] = False
2218
+ payload["include"] = ["reasoning.encrypted_content"]
2219
+ payload.pop("temperature", None)
2178
2220
  if self._reasoning_summary_support_by_model.get(reasoning_summary_support_key) is False:
2179
2221
  _without_responses_reasoning_summary(payload)
2180
2222
  return payload
@@ -383,6 +383,30 @@ PROVIDER_PROTOCOL_CAPABILITIES: tuple[ProviderProtocolCapabilities, ...] = (
383
383
  reports_cache_write_tokens=True,
384
384
  quirks=("Native OpenAI Responses chat supports buffered and SSE streaming responses.",),
385
385
  ),
386
+ ProviderProtocolCapabilities(
387
+ provider_key="alysis",
388
+ protocol=OPENAI_RESPONSES_PROTOCOL,
389
+ reasoning_trace=ReasoningTraceCapability(
390
+ adapter="openai_responses_summary",
391
+ output_kind=ReasoningOutputKind.SUMMARY,
392
+ supports_streaming=True,
393
+ supports_buffered=True,
394
+ requestable=True,
395
+ continuation_state="opaque",
396
+ ),
397
+ usage_contract=UsageContract(
398
+ response_usage_confidence=UsageConfidence.AUTHORITATIVE,
399
+ input_token_count_strategy="none",
400
+ ),
401
+ supports_streaming=True,
402
+ supports_tool_calling=True,
403
+ supports_structured_outputs=True,
404
+ supports_provider_hosted_web_search_adapter=False,
405
+ default_web_search_adapter="none",
406
+ reports_cache_read_tokens=True,
407
+ reports_cache_write_tokens=True,
408
+ quirks=("Hosted Luna supports stateless text and function tools with shared credits.",),
409
+ ),
386
410
  ProviderProtocolCapabilities(
387
411
  provider_key="anthropic",
388
412
  protocol=OPENAI_COMPAT_PROTOCOL,
@@ -1577,6 +1577,22 @@ _OFFICIAL_PROVIDER_MODEL_METADATA["alysis"]["glm-5.3-flash"] = {
1577
1577
  "output_cost_per_token": 0.0000005,
1578
1578
  }
1579
1579
 
1580
+ _PROVIDER_CANONICAL_MODEL_IDS["alysis"]["gpt-6-luna"] = "gpt-6-luna"
1581
+ _OFFICIAL_PROVIDER_MODEL_SOURCES["alysis"]["gpt-6-luna"] = (
1582
+ "https://developers.openai.com/api/docs/models/gpt-6-luna",
1583
+ "https://developers.openai.com/api/docs/pricing",
1584
+ )
1585
+ _OFFICIAL_PROVIDER_MODEL_METADATA["alysis"]["gpt-6-luna"] = {
1586
+ "context_window_tokens": 1_050_000,
1587
+ "max_output_tokens": 128_000,
1588
+ "supports_vision": False,
1589
+ "supports_reasoning": True,
1590
+ "input_cost_per_token": 0.0000001,
1591
+ "cache_read_input_cost_per_token": 0.00000001,
1592
+ "cache_creation_input_cost_per_token": 0.000000125,
1593
+ "output_cost_per_token": 0.0000005,
1594
+ }
1595
+
1580
1596
  _BUILT_IN_MODEL_METADATA: dict[str, dict[str, Any]] = {
1581
1597
  "deepseek-chat": {
1582
1598
  "context_window_tokens": 1_000_000,
@@ -1767,8 +1767,10 @@ PROFILE_PRESETS: tuple[ProfilePreset, ...] = (
1767
1767
  model_choices=(
1768
1768
  ReviewedModel("deepseek-flash", "deepseek-expanded"),
1769
1769
  ReviewedModel("glm-5.3-flash", "glm-normal"),
1770
+ ReviewedModel("gpt-6-luna", "gpt-expanded"),
1770
1771
  ),
1771
1772
  suggested_model_descriptions={
1773
+ "gpt-6-luna": "GPT-6 Luna - efficient coding and reasoning, included with free credits",
1772
1774
  "deepseek-flash": (
1773
1775
  "DeepSeek V4.1 Flash - vision and reasoning, 1M context, included with free credits"
1774
1776
  ),
@@ -1785,7 +1787,7 @@ PROFILE_PRESETS: tuple[ProfilePreset, ...] = (
1785
1787
  "deepseek-v4.1-flash-expires-on-0910": "deepseek-flash",
1786
1788
  },
1787
1789
  setup_warning="Run `alysis login` to connect your Alysis account and use free credits.",
1788
- notes="DeepSeek V4.1 Flash and GLM 5.3 Flash with free credits. Authenticate with `alysis login`.",
1790
+ notes="DeepSeek V4.1 Flash, GLM 5.3 Flash, and GPT-6 Luna with free credits. Authenticate with `alysis login`.",
1789
1791
  ),
1790
1792
  ProfilePreset(
1791
1793
  key="ollama",
@@ -88,6 +88,7 @@ def reasoning_labels_allowed_by_contract(
88
88
  return list(labels)
89
89
  effort_wires = {
90
90
  WIRE_REASONING_EFFORT,
91
+ WIRE_REASONING_OBJECT,
91
92
  WIRE_THINKING_LEVEL,
92
93
  WIRE_THINKING_ADAPTIVE,
93
94
  }
@@ -355,6 +356,17 @@ _CONTRACTS: dict[str, tuple[tuple[str, ReasoningContract], ...]] = {
355
356
  ),
356
357
  # Hosted models retain their upstream reasoning and replay contracts.
357
358
  "alysis": (
359
+ (
360
+ "gpt-6-luna",
361
+ _C(
362
+ mode=OPTIONAL,
363
+ wire=WIRE_REASONING_OBJECT,
364
+ values=("none", "low", "medium", "high", "xhigh", "max"),
365
+ default="medium",
366
+ off=OFF_EXPLICIT,
367
+ notes="hosted Responses with full stateless reasoning and function-tool replay",
368
+ ),
369
+ ),
358
370
  (
359
371
  "deepseek-",
360
372
  _C(
File without changes
File without changes
File without changes
File without changes