alysis-code 0.14.2__tar.gz → 0.14.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. {alysis_code-0.14.2 → alysis_code-0.14.6}/PKG-INFO +11 -1
  2. {alysis_code-0.14.2 → alysis_code-0.14.6}/README.md +10 -0
  3. {alysis_code-0.14.2 → alysis_code-0.14.6}/docs/CHANGELOG.md +66 -0
  4. {alysis_code-0.14.2 → alysis_code-0.14.6}/pyproject.toml +1 -1
  5. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/__init__.py +1 -1
  6. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/loop.py +8 -0
  7. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/config_menu.py +61 -5
  8. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_flow.py +2 -2
  9. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/config.py +29 -0
  10. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_evidence.py +50 -2
  11. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_safe.py +23 -11
  12. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/activity_events.py +14 -2
  13. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/artifacts.py +3 -0
  14. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/change_ledger.py +51 -32
  15. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/context_blocks.py +23 -8
  16. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/event_stream.py +74 -21
  17. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/forge_protocol.py +37 -17
  18. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/health.py +3 -0
  19. alysis_code-0.14.6/src/alysis_code/ide/parent_watchdog.py +111 -0
  20. alysis_code-0.14.6/src/alysis_code/ide/provider_switch.py +65 -0
  21. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/stdio_bridge.py +631 -57
  22. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/anthropic_messages.py +51 -12
  23. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_policy.py +6 -2
  24. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/factory.py +2 -0
  25. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/protocols.py +49 -0
  26. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/client.py +11 -7
  27. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_registry.py +17 -0
  28. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/profile_presets.py +4 -1
  29. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/profiles.py +32 -1
  30. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_diagnostics.py +3 -0
  31. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/reasoning_contracts.py +12 -0
  32. {alysis_code-0.14.2 → alysis_code-0.14.6}/.gitignore +0 -0
  33. {alysis_code-0.14.2 → alysis_code-0.14.6}/LICENSE +0 -0
  34. {alysis_code-0.14.2 → alysis_code-0.14.6}/NOTICE +0 -0
  35. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/__main__.py +0 -0
  36. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/_build_info.py +0 -0
  37. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/account_login.py +0 -0
  38. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/README.md +0 -0
  39. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/__init__.py +0 -0
  40. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/acceptance_contract.py +0 -0
  41. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
  42. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/blast_radius.py +0 -0
  43. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/cache_keepalive.py +0 -0
  44. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/checkpoint_worker.py +0 -0
  45. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/completion_certificate.py +0 -0
  46. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/completion_gate.py +0 -0
  47. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/empty_response_stall.py +0 -0
  48. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/errors.py +0 -0
  49. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/llm_calls.py +0 -0
  50. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/mutation_classification.py +0 -0
  51. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_context.py +0 -0
  52. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_families.py +0 -0
  53. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_guidance.py +0 -0
  54. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/read_ledger.py +0 -0
  55. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/regression_baseline.py +0 -0
  56. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/reproduction_first.py +0 -0
  57. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/sensitive_output.py +0 -0
  58. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/session.py +0 -0
  59. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/steering.py +0 -0
  60. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_execution.py +0 -0
  61. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_workspace.py +0 -0
  62. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/task_evidence.py +0 -0
  63. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/task_state.py +0 -0
  64. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/tools_assembly.py +0 -0
  65. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/__init__.py +0 -0
  66. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/core.py +0 -0
  67. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/events.py +0 -0
  68. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/exploration.py +0 -0
  69. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/interventions.py +0 -0
  70. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/read_cache.py +0 -0
  71. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/snapshot.py +0 -0
  72. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
  73. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn_contract.py +0 -0
  74. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/turn_path.py +0 -0
  75. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification.py +0 -0
  76. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_commands.py +0 -0
  77. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_evidence.py +0 -0
  78. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent/verification_result.py +0 -0
  79. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_loop.py +0 -0
  80. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/__init__.py +0 -0
  81. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/base.py +0 -0
  82. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/builtins.py +0 -0
  83. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
  84. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/host.py +0 -0
  85. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/registry.py +0 -0
  86. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/service.py +0 -0
  87. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agentbox_client.py +0 -0
  88. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/agentbox_integration.py +0 -0
  89. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/alysis_cloud.py +0 -0
  90. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/approval_scope.py +0 -0
  91. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/README.md +0 -0
  92. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/__init__.py +0 -0
  93. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/asset_read_core.py +0 -0
  94. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/budget_allocator.py +0 -0
  95. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/comprehender.py +0 -0
  96. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/index.py +0 -0
  97. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/ingestion.py +0 -0
  98. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/legacy_migration.py +0 -0
  99. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/local_tools.py +0 -0
  100. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/models.py +0 -0
  101. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/ocr.py +0 -0
  102. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
  103. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
  104. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
  105. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
  106. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
  107. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
  108. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
  109. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
  110. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
  111. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
  112. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
  113. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
  114. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
  115. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
  116. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
  117. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
  118. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
  119. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
  120. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
  121. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
  122. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
  123. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/index.html +0 -0
  124. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/owl/show-owl.sh +0 -0
  125. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/paths.py +0 -0
  126. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/plan_binding.py +0 -0
  127. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/planner_context.py +0 -0
  128. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/planner_tools.py +0 -0
  129. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/prompts.py +0 -0
  130. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/replanner_context.py +0 -0
  131. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/surface.py +0 -0
  132. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/untrusted_content.py +0 -0
  133. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/usage_logger.py +0 -0
  134. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_mirror.py +0 -0
  135. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_section.py +0 -0
  136. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/assets/worker_tools.py +0 -0
  137. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/atomic_io.py +0 -0
  138. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/auth_diagnostics.py +0 -0
  139. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/background_runner.py +0 -0
  140. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/branding.py +0 -0
  141. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/budget_policy.py +0 -0
  142. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/build_identity.py +0 -0
  143. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/__init__.py +0 -0
  144. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
  145. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/bwrap_etc.py +0 -0
  146. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cancellation.py +0 -0
  147. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/capabilities.py +0 -0
  148. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
  149. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/checkpoint_settings.py +0 -0
  150. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli.py +0 -0
  151. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/__init__.py +0 -0
  152. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_cli.py +0 -0
  153. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_modal.py +0 -0
  154. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
  155. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/commands.py +0 -0
  156. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
  157. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
  158. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
  159. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/state.py +0 -0
  160. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_resume.py +0 -0
  161. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
  162. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
  163. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
  164. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/auth.py +0 -0
  165. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
  166. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
  167. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
  168. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
  169. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
  170. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
  171. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
  172. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/config.py +0 -0
  173. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
  174. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
  175. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
  176. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge.py +0 -0
  177. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
  178. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
  179. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
  180. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
  181. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
  182. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/profile.py +0 -0
  183. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
  184. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/report.py +0 -0
  185. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/root.py +0 -0
  186. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
  187. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/server.py +0 -0
  188. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
  189. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/skills.py +0 -0
  190. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/startup.py +0 -0
  191. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/tools.py +0 -0
  192. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/update.py +0 -0
  193. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
  194. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge.py +0 -0
  195. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
  196. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
  197. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
  198. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/app.py +0 -0
  199. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
  200. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/composer.py +0 -0
  201. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config.py +0 -0
  202. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
  203. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/content.py +0 -0
  204. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/footer.py +0 -0
  205. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
  206. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/links.py +0 -0
  207. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
  208. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/owl.py +0 -0
  209. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
  210. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
  211. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
  212. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
  213. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/state.py +0 -0
  214. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
  215. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
  216. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/surface.py +0 -0
  217. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/tips.py +0 -0
  218. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
  219. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
  220. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
  221. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/clipboard.py +0 -0
  222. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/code_review.py +0 -0
  223. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/__init__.py +0 -0
  224. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/conversation_compactor.py +0 -0
  225. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/importance.py +0 -0
  226. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/settings.py +0 -0
  227. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/compaction/tool_output_offload.py +0 -0
  228. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/conflict_auto_resolver.py +0 -0
  229. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/consumer_verification.py +0 -0
  230. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/context/__init__.py +0 -0
  231. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
  232. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/crash_diagnostics.py +0 -0
  233. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/README.md +0 -0
  234. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/__init__.py +0 -0
  235. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/discovery.py +0 -0
  236. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/runtime.py +0 -0
  237. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/session.py +0 -0
  238. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/custom_tools/trust.py +0 -0
  239. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/diff_paths.py +0 -0
  240. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/direction_change.py +0 -0
  241. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/dispatch_timing.py +0 -0
  242. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/durable_service_manager.py +0 -0
  243. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/edit_discipline.py +0 -0
  244. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/error_text.py +0 -0
  245. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_budget.py +0 -0
  246. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_context.py +0 -0
  247. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_deadline.py +0 -0
  248. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/execution_shared.py +0 -0
  249. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/README.md +0 -0
  250. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/__init__.py +0 -0
  251. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/activation.py +0 -0
  252. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/install.py +0 -0
  253. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/manifest.py +0 -0
  254. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/models.py +0 -0
  255. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/paths.py +0 -0
  256. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.json +0 -0
  257. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.py +0 -0
  258. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/state.py +0 -0
  259. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/extensions/workspace_trust.py +0 -0
  260. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/failed_task_evidence.py +0 -0
  261. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/failure_category.py +0 -0
  262. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/feedback_report.py +0 -0
  263. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/file_classification.py +0 -0
  264. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge.py +0 -0
  265. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge_completion.py +0 -0
  266. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/forge_events.py +0 -0
  267. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/frontmatter_utils.py +0 -0
  268. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_ops.py +0 -0
  269. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/git_worktrees.py +0 -0
  270. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/README.md +0 -0
  271. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/__init__.py +0 -0
  272. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/audit.py +0 -0
  273. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/config.py +0 -0
  274. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/dispatcher.py +0 -0
  275. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/models.py +0 -0
  276. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/hooks/trust.py +0 -0
  277. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/host_actions.py +0 -0
  278. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/host_browser.py +0 -0
  279. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/__init__.py +0 -0
  280. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/approvals.py +0 -0
  281. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
  282. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
  283. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/forge_request_ledger.py +0 -0
  284. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/managed_browser.py +0 -0
  285. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/management_protocol.py +0 -0
  286. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
  287. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
  288. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/prompt_queue.py +0 -0
  289. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/protocol.py +0 -0
  290. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/resumable_swarm.py +0 -0
  291. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/session_search.py +0 -0
  292. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/structured_state.py +0 -0
  293. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/ide/swarm_protocol.py +0 -0
  294. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/integration_gate.py +0 -0
  295. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/interactive_input_guard.py +0 -0
  296. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/internal_artifacts.py +0 -0
  297. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_base.py +0 -0
  298. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_capture.py +0 -0
  299. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/knowledge_librarian.py +0 -0
  300. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/language_policy.py +0 -0
  301. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/litellm_static_provider.py +0 -0
  302. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/__init__.py +0 -0
  303. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/base.py +0 -0
  304. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_capabilities.py +0 -0
  305. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/cache_control_blocks.py +0 -0
  306. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_generate_content.py +0 -0
  307. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_interactions.py +0 -0
  308. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/http_cancellation.py +0 -0
  309. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/metadata.py +0 -0
  310. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/openai_compat.py +0 -0
  311. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/openai_responses.py +0 -0
  312. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/provider_limits.py +0 -0
  313. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/request_plan.py +0 -0
  314. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/request_shape.py +0 -0
  315. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/streaming.py +0 -0
  316. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/temperature_compat.py +0 -0
  317. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/tool_call_markup.py +0 -0
  318. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/types.py +0 -0
  319. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm/usage_normalization.py +0 -0
  320. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/llm_error_display.py +0 -0
  321. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/logging_redaction.py +0 -0
  322. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/managed_host_deadline.py +0 -0
  323. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/README.md +0 -0
  324. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/__init__.py +0 -0
  325. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/config.py +0 -0
  326. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/errors.py +0 -0
  327. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/forge_scope.py +0 -0
  328. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/jsonrpc.py +0 -0
  329. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/manager.py +0 -0
  330. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/models.py +0 -0
  331. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth.py +0 -0
  332. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_runtime.py +0 -0
  333. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_store.py +0 -0
  334. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/prompts.py +0 -0
  335. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/resources.py +0 -0
  336. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/roots.py +0 -0
  337. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/server_requests.py +0 -0
  338. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/token_store.py +0 -0
  339. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_http.py +0 -0
  340. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_stdio.py +0 -0
  341. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/mcp/untrusted_content.py +0 -0
  342. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/merge_conflict_reviewer.py +0 -0
  343. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/__init__.py +0 -0
  344. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
  345. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
  346. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
  347. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_metadata_policy.py +0 -0
  348. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_metadata_utils.py +0 -0
  349. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/model_router.py +0 -0
  350. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/permission_policy.py +0 -0
  351. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/personas.py +0 -0
  352. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/pipeline_facts.py +0 -0
  353. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_assistant.py +0 -0
  354. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_reconciliation.py +0 -0
  355. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_repair.py +0 -0
  356. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/plan_validation.py +0 -0
  357. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/planning_constraints.py +0 -0
  358. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/policy.py +0 -0
  359. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/preview_server.py +0 -0
  360. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/private_artifact_io.py +0 -0
  361. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/process_reaping.py +0 -0
  362. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/prompt_guidance_catalog.py +0 -0
  363. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/__init__.py +0 -0
  364. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/base.py +0 -0
  365. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/openai_codex.py +0 -0
  366. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/registry.py +0 -0
  367. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_auth/store.py +0 -0
  368. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_model_catalog.py +0 -0
  369. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_telemetry.py +0 -0
  370. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/provider_url.py +0 -0
  371. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/remote_sync.py +0 -0
  372. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/replanning.py +0 -0
  373. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/repo_scan.py +0 -0
  374. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/request_estimation.py +0 -0
  375. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/review_gate.py +0 -0
  376. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_lock.py +0 -0
  377. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_outcome.py +0 -0
  378. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_provenance.py +0 -0
  379. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/run_state.py +0 -0
  380. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_artifacts.py +0 -0
  381. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_context_features.py +0 -0
  382. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/runtime_kind.py +0 -0
  383. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/__init__.py +0 -0
  384. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/mcp_sanitize.py +0 -0
  385. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/safe_http.py +0 -0
  386. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/safety/subagent_report.py +0 -0
  387. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_doctor.py +0 -0
  388. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_runner.py +0 -0
  389. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/sandbox_settings.py +0 -0
  390. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/serialized_paths.py +0 -0
  391. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/__init__.py +0 -0
  392. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/app.py +0 -0
  393. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/auth.py +0 -0
  394. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/job_config.py +0 -0
  395. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/settings.py +0 -0
  396. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/store.py +0 -0
  397. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/server/worker_runner.py +0 -0
  398. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/service_persistence.py +0 -0
  399. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_artifacts.py +0 -0
  400. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_metrics.py +0 -0
  401. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/session_store.py +0 -0
  402. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/README.md +0 -0
  403. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/__init__.py +0 -0
  404. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
  405. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
  406. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
  407. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
  408. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
  409. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
  410. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
  411. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
  412. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/conventions.py +0 -0
  413. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/discovery.py +0 -0
  414. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/eval_models.py +0 -0
  415. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/eval_runner.py +0 -0
  416. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/evals.py +0 -0
  417. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/install.py +0 -0
  418. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/loader.py +0 -0
  419. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/matching.py +0 -0
  420. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/models.py +0 -0
  421. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/paths.py +0 -0
  422. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/prompting.py +0 -0
  423. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/scaffold.py +0 -0
  424. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/state.py +0 -0
  425. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/transactions.py +0 -0
  426. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/skills/validation.py +0 -0
  427. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/step_budget.py +0 -0
  428. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/subagent_labels.py +0 -0
  429. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/subagents.py +0 -0
  430. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/__init__.py +0 -0
  431. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/base.py +0 -0
  432. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/console.py +0 -0
  433. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/events.py +0 -0
  434. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/hidden_surface.py +0 -0
  435. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/noop_surface.py +0 -0
  436. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/rich_surface.py +0 -0
  437. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/styles.py +0 -0
  438. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/theme.py +0 -0
  439. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/surface/types.py +0 -0
  440. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_backend.py +0 -0
  441. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_orchestrator.py +0 -0
  442. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_scheduler.py +0 -0
  443. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_trace.py +0 -0
  444. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_worker.py +0 -0
  445. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/swarm_write_guard.py +0 -0
  446. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_dependencies.py +0 -0
  447. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_readiness.py +0 -0
  448. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/task_scope.py +0 -0
  449. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/terminal_manager.py +0 -0
  450. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/terminal_ownership.py +0 -0
  451. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/text_normalization.py +0 -0
  452. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/token_budget.py +0 -0
  453. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/README.md +0 -0
  454. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/__init__.py +0 -0
  455. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/artifacts.py +0 -0
  456. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/availability.py +0 -0
  457. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/capability_readiness.py +0 -0
  458. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/fs.py +0 -0
  459. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/git.py +0 -0
  460. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/history.py +0 -0
  461. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/http_timeout.py +0 -0
  462. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/image_generation.py +0 -0
  463. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/registry.py +0 -0
  464. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/repo_map.py +0 -0
  465. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/search.py +0 -0
  466. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/shell.py +0 -0
  467. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/symbols.py +0 -0
  468. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/test_discovery.py +0 -0
  469. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web.py +0 -0
  470. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search.py +0 -0
  471. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_dashscope.py +0 -0
  472. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_ddgs.py +0 -0
  473. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
  474. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_tavily.py +0 -0
  475. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/transport_retry.py +0 -0
  476. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/updates.py +0 -0
  477. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/usage_tracker.py +0 -0
  478. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_command_analysis.py +0 -0
  479. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_contract.py +0 -0
  480. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_failure_summary.py +0 -0
  481. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verification_repair.py +0 -0
  482. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/verify_gate.py +0 -0
  483. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_research.py +0 -0
  484. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_search_adapters.py +0 -0
  485. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/web_search_policy.py +0 -0
  486. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_binding.py +0 -0
  487. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_binding_ui.py +0 -0
  488. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_context.py +0 -0
  489. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_isolation.py +0 -0
  490. {alysis_code-0.14.2 → alysis_code-0.14.6}/src/alysis_code/workspace_provisioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alysis-code
3
- Version: 0.14.2
3
+ Version: 0.14.6
4
4
  Summary: Local CLI coding agent powered by any API.
5
5
  Project-URL: Changelog, https://github.com/AlysisAi/alysis-code/blob/main/docs/CHANGELOG.md
6
6
  Project-URL: Documentation, https://github.com/AlysisAi/alysis-code/tree/main/docs
@@ -196,6 +196,8 @@ Persona changes made during a running turn apply after that turn finishes.
196
196
 
197
197
  Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
198
198
  you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
199
+ The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
200
+ [third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
199
201
 
200
202
  ## FAQ
201
203
 
@@ -218,3 +220,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
218
220
  ---
219
221
 
220
222
  **Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
223
+
224
+
225
+ ## Editor integrations
226
+
227
+ [VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
228
+ [JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
229
+ The VS Code Marketplace pre-release is pending production signing and acceptance; see the
230
+ [IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
@@ -135,6 +135,8 @@ Persona changes made during a running turn apply after that turn finishes.
135
135
 
136
136
  Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
137
137
  you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
138
+ The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
139
+ [third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
138
140
 
139
141
  ## FAQ
140
142
 
@@ -157,3 +159,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
157
159
  ---
158
160
 
159
161
  **Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
162
+
163
+
164
+ ## Editor integrations
165
+
166
+ [VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
167
+ [JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
168
+ The VS Code Marketplace pre-release is pending production signing and acceptance; see the
169
+ [IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
@@ -1,11 +1,77 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.6 — final VSIX attestation and startup validation
4
+
5
+ - Give each final VSIX dependency report an RFC 4122 document ID accepted by
6
+ GitHub's attestation parser. Derive it from the exact package bytes so promotion
7
+ can reproduce the signed report without changing its identity.
8
+ - Wait for startup runtime validation before reporting installed runtime evidence,
9
+ so a fresh installation does not report the bundled CLI as temporarily unavailable.
10
+
11
+ All six 0.14.5 native runtimes and their assembled manifest passed signing, but
12
+ final VSIX attestation failed before installation testing. This replacement
13
+ preserves the existing tags; Marketplace pre-release 0.3.0 still requires the
14
+ documented installation, acceptance, and promotion gates.
15
+
16
+ ## 0.14.5 — native managed-runtime packaging
17
+
18
+ - Pin the six bundled runtimes to checksum-verified CPython 3.12.15 distributions,
19
+ including their observed OpenSSL and Expat versions in each dependency SBOM.
20
+ - Build Linux executables with shared-library-capable Python on the existing
21
+ glibc 2.28 baseline, and build tested, static OpenSSL 3.5.9 for Windows ARM64
22
+ and Intel macOS cryptography.
23
+ - Sign embedded macOS libraries during packaging and verify notarization using
24
+ Apple's documented check for standalone code. Preserve Windows API paths in Git Bash.
25
+ - Add an unsigned native build and executable smoke check for all six targets.
26
+
27
+ This source version prepares a replacement candidate after the protected `v0.14.4`
28
+ native build failed. Marketplace pre-release 0.3.0 remains subject to the documented
29
+ signing, installation, acceptance, and promotion gates.
30
+
31
+ ## 0.14.4 — IDE integrations and release tooling
32
+
33
+ - Add the VS Code 0.3.0 integration with a shared sidebar, provider management, bounded editor
34
+ context, reviewed changes, recovery checkpoints, and native host actions.
35
+ - Add shared UI transport and a JetBrains development preview using the same Python IDE bridge.
36
+ - Isolate provider credentials, handle physical workspace paths, and keep unit tests portable.
37
+ - Add six-target managed-runtime packaging, Azure OIDC Windows signing verification, Apple
38
+ notarization/provenance contracts, and protected evidence and Marketplace promotion workflows.
39
+ - Update pinned sandbox build inputs; fresh image scans remain required.
40
+
41
+ This is a CLI/source release. Production signed VSIX packages and Marketplace publication remain
42
+ pending the [documented signing and acceptance gates](vscode-marketplace-launch.md).
43
+
3
44
  Notable user-facing changes to Alysis Code are recorded here. This project follows
4
45
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses
5
46
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html) while the public API remains pre-1.0.
6
47
 
7
48
  ## [Unreleased]
8
49
 
50
+ ## [0.14.3] - 2026-09-29
51
+
52
+ ### Added
53
+
54
+ - Add Claude Sonnet 5.5 to the Alysis account model picker, using native Messages
55
+ transport, streaming, signed reasoning and tool continuation, and the shared
56
+ hosted credit allowance.
57
+
58
+ ### Changed
59
+
60
+ - Default hosted accounts to automatic prompt caching. Migrate legacy Manual
61
+ settings only when their other cache settings match the old defaults; preserve
62
+ Off, customized settings, and subsequent explicit choices.
63
+ - Use five-minute cache controls for hosted Sonnet and provider-managed caching
64
+ for hosted DeepSeek, GLM, and Luna. See the
65
+ [caching guide](hosted-prompt-caching.md) for migration details and controls.
66
+
67
+ ### Fixed
68
+
69
+ - Resolve cache previews and diagnostics using each model's actual protocol,
70
+ preserve hosted credit-limit error details, and report Sonnet reasoning usage
71
+ without counting it twice.
72
+ - Honor the configured HTTP MCP startup timeout for initialization acknowledgements.
73
+ Report MCP startup errors once and exit cleanly without retrying through classic chat.
74
+
9
75
  ## [0.14.2] - 2026-09-28
10
76
 
11
77
  ### Fixed
@@ -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.6"
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.6"
@@ -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
@@ -1508,6 +1511,9 @@ def resolve_profile_api_key(
1508
1511
  profile = get_profile(cfg, profile_name)
1509
1512
  if profile is None:
1510
1513
  return ApiKeyResolution(key=None, source="missing")
1514
+ ide_key = _resolve_ide_profile_api_key(cfg, profile_name)
1515
+ if ide_key.key:
1516
+ return ide_key
1511
1517
  stored_profile_key = _resolve_stored_profile_api_key(cfg, profile_name)
1512
1518
  if stored_profile_key.key:
1513
1519
  return stored_profile_key
@@ -1528,6 +1534,21 @@ def resolve_profile_api_key(
1528
1534
  return ApiKeyResolution(key=None, source="missing")
1529
1535
 
1530
1536
 
1537
+ def _resolve_ide_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
1538
+ """Honor an IDE's explicitly supplied profile key without overwriting CLI credentials."""
1539
+ from .profiles import get_profile
1540
+
1541
+ profile = get_profile(cfg, profile_name)
1542
+ if profile is not None:
1543
+ # Match the extension's encoding; plain env-var names can collide between two profiles.
1544
+ encoded = profile.name.encode("utf-8").hex().upper()
1545
+ env_name = f"ALYSIS_IDE_PROFILE_{encoded}_API_KEY"
1546
+ key = str(os.environ.get(env_name) or "").strip()
1547
+ if key:
1548
+ return ApiKeyResolution(key=key, source=f"env:{env_name}")
1549
+ return ApiKeyResolution(key=None, source="missing")
1550
+
1551
+
1531
1552
  def _resolve_stored_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
1532
1553
  from .profiles import get_profile
1533
1554
 
@@ -1549,6 +1570,9 @@ def resolve_api_key(
1549
1570
  if profile_name is None:
1550
1571
  profile_name = str((effective_cfg.extra_fields or {}).get("active_profile") or "").strip()
1551
1572
  if profile_name:
1573
+ ide_key = _resolve_ide_profile_api_key(effective_cfg, profile_name)
1574
+ if ide_key.key:
1575
+ return ide_key
1552
1576
  stored_profile_key = _resolve_stored_profile_api_key(effective_cfg, profile_name)
1553
1577
  if stored_profile_key.key:
1554
1578
  return stored_profile_key
@@ -3624,22 +3648,27 @@ def set_config_value(
3624
3648
 
3625
3649
  if key == "prompt_cache_mode":
3626
3650
  cfg.prompt_cache_mode = _normalize_prompt_cache_mode(value, key=key)
3651
+ cfg.hosted_prompt_cache_defaults_applied = True
3627
3652
  return cfg
3628
3653
 
3629
3654
  if key == "prompt_cache_key":
3630
3655
  cfg.prompt_cache_key = value.strip() or None
3656
+ cfg.hosted_prompt_cache_defaults_applied = True
3631
3657
  return cfg
3632
3658
 
3633
3659
  if key == "prompt_cache_retention":
3634
3660
  cfg.prompt_cache_retention = value.strip() or None
3661
+ cfg.hosted_prompt_cache_defaults_applied = True
3635
3662
  return cfg
3636
3663
 
3637
3664
  if key == "anthropic_prompt_cache_enabled":
3638
3665
  cfg.anthropic_prompt_cache_enabled = _coerce_bool(value, key=key)
3666
+ cfg.hosted_prompt_cache_defaults_applied = True
3639
3667
  return cfg
3640
3668
 
3641
3669
  if key == "anthropic_prompt_cache_ttl":
3642
3670
  cfg.anthropic_prompt_cache_ttl = _normalize_anthropic_prompt_cache_ttl(value, key=key)
3671
+ cfg.hosted_prompt_cache_defaults_applied = True
3643
3672
  return cfg
3644
3673
 
3645
3674
  if key == "verify_commands":
@@ -11,7 +11,7 @@ from typing import Any, Literal
11
11
 
12
12
  from .file_classification import classify_path, is_generated_or_vendor_path
13
13
  from .git_ops import GitOpsError
14
- from .git_safe import build_git_cmd, build_git_process_env
14
+ from .git_safe import build_git_cmd, build_git_process_env, configured_git_filter_drivers
15
15
  from .runtime_artifacts import is_runtime_artifact_path
16
16
 
17
17
  PatchCaptureStatus = Literal["complete", "partial", "failed"]
@@ -445,11 +445,13 @@ def _snapshot_git(
445
445
  args: list[str],
446
446
  *,
447
447
  env: dict[str, str] | None = None,
448
+ input_text: str | None = None,
448
449
  ) -> str:
449
450
  try:
450
451
  result = subprocess.run(
451
452
  build_git_cmd(root, args, env=env, disable_filters=True),
452
453
  env=build_git_process_env(env),
454
+ input=input_text.encode("utf-8") if input_text is not None else None,
453
455
  capture_output=True,
454
456
  check=False,
455
457
  )
@@ -504,17 +506,63 @@ def _check_snapshot_files(root: Path, *, excluded_paths: tuple[str, ...]) -> Non
504
506
  raise WorkspaceSnapshotError("unsupported_workspace_file", paths=tuple(sorted(unsupported)))
505
507
 
506
508
 
509
+ def _check_snapshot_filters(root: Path, *, pathspecs: list[str]) -> None:
510
+ # Git status may recognize a size change without converting file content.
511
+ # Resolve attributes against the actual index before a HEAD-based temporary
512
+ # index can lose an index-only .gitattributes fallback.
513
+ try:
514
+ drivers = configured_git_filter_drivers(root)
515
+ except (OSError, subprocess.TimeoutExpired) as exc:
516
+ raise WorkspaceSnapshotError("workspace_snapshot_unreadable") from exc
517
+ if not drivers:
518
+ return
519
+ paths = _snapshot_git(
520
+ root,
521
+ [
522
+ "--no-optional-locks",
523
+ "ls-files",
524
+ "--cached",
525
+ "--others",
526
+ "--exclude-standard",
527
+ "-z",
528
+ "--",
529
+ *pathspecs,
530
+ ],
531
+ )
532
+ attributes = _snapshot_git(
533
+ root, ["check-attr", "-z", "--stdin", "filter"], input_text=paths
534
+ ).split("\0")
535
+ if attributes[-1] != "" or (len(attributes) - 1) % 3:
536
+ raise WorkspaceSnapshotError("workspace_snapshot_unreadable")
537
+ affected = tuple(
538
+ sorted(
539
+ {
540
+ attributes[index]
541
+ for index in range(0, len(attributes) - 1, 3)
542
+ if attributes[index + 2] in drivers
543
+ }
544
+ )
545
+ )
546
+ if affected:
547
+ raise WorkspaceSnapshotError(
548
+ "workspace_snapshot_git_failed",
549
+ paths=affected,
550
+ detail="Git snapshot refused: external Git filters are disabled for isolated workspaces",
551
+ )
552
+
553
+
507
554
  def _working_tree_snapshot(
508
555
  root: Path, *, base_ref: str, excluded_paths: tuple[str, ...] = ()
509
556
  ) -> str:
510
557
  _check_snapshot_files(root, excluded_paths=excluded_paths)
558
+ pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
559
+ _check_snapshot_filters(root, pathspecs=pathspecs)
511
560
  # A separate index preserves both staged and unstaged parent work. Git handles
512
561
  # binary data, modes, names and ignored paths; no filename classifier is used.
513
562
  with tempfile.TemporaryDirectory(prefix="alysis-git-snapshot-") as scratch:
514
563
  env = build_git_process_env()
515
564
  env["GIT_INDEX_FILE"] = os.fspath(Path(scratch) / "index")
516
565
  _snapshot_git(root, ["read-tree", base_ref], env=env)
517
- pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
518
566
  _snapshot_git(root, ["add", "--all", "--", *pathspecs], env=env)
519
567
  tree = _snapshot_git(root, ["write-tree"], env=env).strip()
520
568
  gitlinks = tuple(
@@ -77,11 +77,29 @@ def _disabled_filter_config(
77
77
  returned command, so unused drivers do not prevent ordinary repositories from
78
78
  working. Re-read for every command: a child can introduce filter configuration.
79
79
  """
80
+ drivers = configured_git_filter_drivers(root, extra_config=config, env=env)
81
+ overrides: dict[str, str] = {}
82
+ for driver in drivers:
83
+ # Empty all three commands, including the long-running process protocol.
84
+ # required=true makes an attempted conversion fail instead of passing
85
+ # through bytes that might differ from the real filter's representation.
86
+ overrides.update({f"filter.{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
87
+ overrides[f"filter.{driver}.required"] = "true"
88
+ return overrides
89
+
90
+
91
+ def configured_git_filter_drivers(
92
+ root: Path,
93
+ *,
94
+ extra_config: dict[str, str] | None = None,
95
+ env: Mapping[str, str] | None = None,
96
+ ) -> tuple[str, ...]:
97
+ """Read effective nonempty filter commands without invoking any driver."""
80
98
  result = subprocess.run(
81
99
  build_git_cmd(
82
100
  root,
83
101
  ["config", "--null", "--get-regexp", r"^filter\..*\.(clean|smudge|process)$"],
84
- extra_config=config,
102
+ extra_config=extra_config,
85
103
  env=env,
86
104
  ),
87
105
  env=build_git_process_env(env),
@@ -90,7 +108,7 @@ def _disabled_filter_config(
90
108
  timeout=5,
91
109
  )
92
110
  if result.returncode == 1: # No configured filter commands.
93
- return {}
111
+ return ()
94
112
  if result.returncode != 0:
95
113
  raise OSError("Could not inspect Git filter configuration")
96
114
  values: dict[str, str] = {}
@@ -100,12 +118,6 @@ def _disabled_filter_config(
100
118
  if not separator:
101
119
  raise OSError("Could not read Git filter configuration")
102
120
  values[key] = value
103
- drivers = {key.rsplit(".", 1)[0] for key, value in values.items() if value}
104
- overrides: dict[str, str] = {}
105
- for driver in sorted(drivers):
106
- # Empty all three commands, including the long-running process protocol.
107
- # required=true makes an attempted conversion fail instead of passing
108
- # through bytes that might differ from the real filter's representation.
109
- overrides.update({f"{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
110
- overrides[f"{driver}.required"] = "true"
111
- return overrides
121
+ return tuple(
122
+ sorted({key[len("filter.") :].rsplit(".", 1)[0] for key, value in values.items() if value})
123
+ )
@@ -25,7 +25,7 @@ ActivityKind: TypeAlias = Literal[
25
25
  "other",
26
26
  ]
27
27
  ActivityStatus: TypeAlias = Literal[
28
- "queued", "running", "succeeded", "failed", "cancelled", "blocked"
28
+ "queued", "running", "succeeded", "failed", "cancelled", "blocked", "completed_unverified"
29
29
  ]
30
30
 
31
31
  MAX_ACTIVITY_TEXT_CHARS = 500
@@ -47,7 +47,15 @@ ACTIVITY_KINDS = (
47
47
  "plan",
48
48
  "other",
49
49
  )
50
- ACTIVITY_STATUSES = ("queued", "running", "succeeded", "failed", "cancelled", "blocked")
50
+ ACTIVITY_STATUSES = (
51
+ "queued",
52
+ "running",
53
+ "succeeded",
54
+ "failed",
55
+ "cancelled",
56
+ "blocked",
57
+ "completed_unverified",
58
+ )
51
59
 
52
60
  _SAFE_METADATA_KEYS = frozenset(
53
61
  {
@@ -64,6 +72,8 @@ _SAFE_METADATA_KEYS = frozenset(
64
72
  "step",
65
73
  "truncated",
66
74
  "worker_id",
75
+ "task_outcome",
76
+ "verified_success",
67
77
  }
68
78
  )
69
79
  _INTERNAL_NAME_PATTERN = re.compile(r"(?:^|[._:/-])(?:rs|internal)(?:[._:/-]|$)", re.I)
@@ -335,6 +345,8 @@ def _normalize_status(status: str) -> ActivityStatus:
335
345
  return "queued"
336
346
  if normalized in {"running", "started", "in_progress", "progress"}:
337
347
  return "running"
348
+ if normalized == "completed_unverified":
349
+ return "completed_unverified"
338
350
  if normalized in {"done", "completed", "complete", "success", "succeeded", "ok"}:
339
351
  return "succeeded"
340
352
  if normalized in {"cancelled", "canceled", "interrupted"}:
@@ -4,6 +4,7 @@ from dataclasses import dataclass
4
4
  from pathlib import Path, PurePosixPath
5
5
  from typing import Any
6
6
 
7
+ from ..session_artifacts import ARTIFACT_HANDLE_INDEX_DIR
7
8
  from .protocol import ProtocolError, redact_secrets
8
9
 
9
10
  DEFAULT_MAX_ARTIFACT_BYTES = 64 * 1024
@@ -50,6 +51,8 @@ class ArtifactStore:
50
51
  except OSError:
51
52
  continue
52
53
  for path in entries:
54
+ if depth == 0 and path.name == ARTIFACT_HANDLE_INDEX_DIR:
55
+ continue
53
56
  if path.is_symlink():
54
57
  continue
55
58
  if path.is_dir():