alysis-code 0.13.7__tar.gz → 0.13.8__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 (470) hide show
  1. {alysis_code-0.13.7 → alysis_code-0.13.8}/PKG-INFO +9 -3
  2. {alysis_code-0.13.7 → alysis_code-0.13.8}/README.md +8 -2
  3. {alysis_code-0.13.7 → alysis_code-0.13.8}/docs/CHANGELOG.md +39 -1
  4. {alysis_code-0.13.7 → alysis_code-0.13.8}/pyproject.toml +1 -1
  5. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/__init__.py +1 -1
  6. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/prompt_context.py +3 -11
  7. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/session.py +12 -6
  8. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/steering.py +66 -0
  9. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/tools_assembly.py +34 -7
  10. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/core.py +66 -3
  11. alysis_code-0.13.8/src/alysis_code/cancellation.py +202 -0
  12. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/__init__.py +0 -12
  13. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/commands.py +110 -221
  14. alysis_code-0.13.8/src/alysis_code/cli_impl/chat/forge_visibility.py +35 -0
  15. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/loop.py +383 -613
  16. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +39 -8
  17. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/rendering.py +5 -63
  18. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/state.py +3 -9
  19. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat_resume.py +21 -0
  20. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat_slash_completer.py +9 -6
  21. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_state.py +2 -9
  22. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_status.py +48 -101
  23. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_terminal.py +1 -30
  24. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/cli_common.py +6 -32
  25. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -18
  26. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/prompt_helpers.py +7 -30
  27. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/startup.py +5 -19
  28. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/welcome.py +19 -30
  29. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/app.py +781 -231
  30. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/footer.py +11 -3
  31. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/state.py +14 -19
  32. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/surface.py +39 -0
  33. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/tool_output_offload.py +8 -0
  34. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/config.py +1 -2
  35. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/feedback_report.py +262 -31
  36. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/host_browser.py +24 -1
  37. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/openai_compat.py +25 -0
  38. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/personas.py +1 -1
  39. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/events.py +7 -7
  40. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/rich_surface.py +2 -13
  41. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/git.py +114 -6
  42. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/registry.py +27 -4
  43. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_command_analysis.py +49 -0
  44. alysis_code-0.13.7/src/alysis_code/cancellation.py +0 -53
  45. alysis_code-0.13.7/src/alysis_code/interactive_plan_mode.py +0 -26
  46. alysis_code-0.13.7/src/alysis_code/plan_mode.py +0 -393
  47. {alysis_code-0.13.7 → alysis_code-0.13.8}/.gitignore +0 -0
  48. {alysis_code-0.13.7 → alysis_code-0.13.8}/LICENSE +0 -0
  49. {alysis_code-0.13.7 → alysis_code-0.13.8}/NOTICE +0 -0
  50. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/__main__.py +0 -0
  51. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/_build_info.py +0 -0
  52. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/account_login.py +0 -0
  53. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/README.md +0 -0
  54. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/__init__.py +0 -0
  55. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/acceptance_contract.py +0 -0
  56. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/blast_radius.py +0 -0
  57. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/cache_keepalive.py +0 -0
  58. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/completion_certificate.py +0 -0
  59. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/completion_gate.py +0 -0
  60. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/empty_response_stall.py +0 -0
  61. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/errors.py +0 -0
  62. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/llm_calls.py +0 -0
  63. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/mutation_classification.py +0 -0
  64. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/read_ledger.py +0 -0
  65. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/regression_baseline.py +0 -0
  66. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/reproduction_first.py +0 -0
  67. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/sensitive_output.py +0 -0
  68. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/subagent_execution.py +0 -0
  69. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/subagent_workspace.py +0 -0
  70. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/__init__.py +0 -0
  71. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/events.py +0 -0
  72. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/exploration.py +0 -0
  73. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/interventions.py +0 -0
  74. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/read_cache.py +0 -0
  75. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/snapshot.py +0 -0
  76. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn_contract.py +0 -0
  77. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn_path.py +0 -0
  78. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification.py +0 -0
  79. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification_commands.py +0 -0
  80. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification_evidence.py +0 -0
  81. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_loop.py +0 -0
  82. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/__init__.py +0 -0
  83. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/base.py +0 -0
  84. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/builtins.py +0 -0
  85. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
  86. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/host.py +0 -0
  87. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/registry.py +0 -0
  88. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/service.py +0 -0
  89. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/alysis_cloud.py +0 -0
  90. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/approval_scope.py +0 -0
  91. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/README.md +0 -0
  92. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/__init__.py +0 -0
  93. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/asset_read_core.py +0 -0
  94. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/budget_allocator.py +0 -0
  95. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/comprehender.py +0 -0
  96. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/index.py +0 -0
  97. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/ingestion.py +0 -0
  98. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/legacy_migration.py +0 -0
  99. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/models.py +0 -0
  100. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/ocr.py +0 -0
  101. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
  102. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
  103. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
  104. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
  105. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
  106. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
  107. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
  108. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
  109. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
  110. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
  111. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
  112. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
  113. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
  114. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
  115. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
  116. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
  117. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
  118. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
  119. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
  120. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
  121. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
  122. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/show-owl.sh +0 -0
  123. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/paths.py +0 -0
  124. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/plan_binding.py +0 -0
  125. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/planner_context.py +0 -0
  126. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/planner_tools.py +0 -0
  127. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/prompts.py +0 -0
  128. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/replanner_context.py +0 -0
  129. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/surface.py +0 -0
  130. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/untrusted_content.py +0 -0
  131. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/usage_logger.py +0 -0
  132. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_mirror.py +0 -0
  133. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_section.py +0 -0
  134. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_tools.py +0 -0
  135. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/atomic_io.py +0 -0
  136. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/auth_diagnostics.py +0 -0
  137. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/background_runner.py +0 -0
  138. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/branding.py +0 -0
  139. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/budget_policy.py +0 -0
  140. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/build_identity.py +0 -0
  141. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/builtin_hooks/__init__.py +0 -0
  142. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
  143. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/bwrap_etc.py +0 -0
  144. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/capabilities.py +0 -0
  145. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
  146. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli.py +0 -0
  147. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/__init__.py +0 -0
  148. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/assets_cli.py +0 -0
  149. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/assets_modal.py +0 -0
  150. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
  151. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
  152. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/auth.py +0 -0
  153. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
  154. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
  155. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
  156. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/config.py +0 -0
  157. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
  158. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
  159. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
  160. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge.py +0 -0
  161. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
  162. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
  163. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
  164. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
  165. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/profile.py +0 -0
  166. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/report.py +0 -0
  167. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/root.py +0 -0
  168. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
  169. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/server.py +0 -0
  170. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
  171. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/skills.py +0 -0
  172. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/tools.py +0 -0
  173. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/update.py +0 -0
  174. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/config_menu.py +0 -0
  175. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/forge.py +0 -0
  176. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
  177. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
  178. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
  179. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config.py +0 -0
  180. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config_flow.py +0 -0
  181. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
  182. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/content.py +0 -0
  183. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
  184. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
  185. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/owl.py +0 -0
  186. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
  187. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
  188. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
  189. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
  190. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
  191. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
  192. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/tips.py +0 -0
  193. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
  194. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
  195. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
  196. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/clipboard.py +0 -0
  197. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/code_review.py +0 -0
  198. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/__init__.py +0 -0
  199. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/conversation_compactor.py +0 -0
  200. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/importance.py +0 -0
  201. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/settings.py +0 -0
  202. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/conflict_auto_resolver.py +0 -0
  203. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/context/__init__.py +0 -0
  204. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
  205. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/crash_diagnostics.py +0 -0
  206. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/README.md +0 -0
  207. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/__init__.py +0 -0
  208. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/discovery.py +0 -0
  209. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/runtime.py +0 -0
  210. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/session.py +0 -0
  211. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/trust.py +0 -0
  212. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/diff_paths.py +0 -0
  213. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/direction_change.py +0 -0
  214. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/dispatch_timing.py +0 -0
  215. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/durable_service_manager.py +0 -0
  216. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/edit_discipline.py +0 -0
  217. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/error_text.py +0 -0
  218. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_budget.py +0 -0
  219. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_context.py +0 -0
  220. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_deadline.py +0 -0
  221. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_shared.py +0 -0
  222. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/README.md +0 -0
  223. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/__init__.py +0 -0
  224. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/activation.py +0 -0
  225. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/install.py +0 -0
  226. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/manifest.py +0 -0
  227. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/models.py +0 -0
  228. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/paths.py +0 -0
  229. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/registry.json +0 -0
  230. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/registry.py +0 -0
  231. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/state.py +0 -0
  232. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/workspace_trust.py +0 -0
  233. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/failed_task_evidence.py +0 -0
  234. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/failure_category.py +0 -0
  235. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/file_classification.py +0 -0
  236. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge.py +0 -0
  237. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge_completion.py +0 -0
  238. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge_events.py +0 -0
  239. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/frontmatter_utils.py +0 -0
  240. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_evidence.py +0 -0
  241. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_ops.py +0 -0
  242. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_safe.py +0 -0
  243. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_worktrees.py +0 -0
  244. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/README.md +0 -0
  245. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/__init__.py +0 -0
  246. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/audit.py +0 -0
  247. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/config.py +0 -0
  248. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/dispatcher.py +0 -0
  249. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/models.py +0 -0
  250. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/trust.py +0 -0
  251. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/host_actions.py +0 -0
  252. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/__init__.py +0 -0
  253. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/activity_events.py +0 -0
  254. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/approvals.py +0 -0
  255. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/artifacts.py +0 -0
  256. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
  257. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
  258. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/change_ledger.py +0 -0
  259. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/context_blocks.py +0 -0
  260. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/event_stream.py +0 -0
  261. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/forge_protocol.py +0 -0
  262. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/forge_request_ledger.py +0 -0
  263. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/health.py +0 -0
  264. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/managed_browser.py +0 -0
  265. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/management_protocol.py +0 -0
  266. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
  267. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
  268. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/prompt_queue.py +0 -0
  269. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/protocol.py +0 -0
  270. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/resumable_swarm.py +0 -0
  271. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/session_search.py +0 -0
  272. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/stdio_bridge.py +0 -0
  273. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/structured_state.py +0 -0
  274. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/swarm_protocol.py +0 -0
  275. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/integration_gate.py +0 -0
  276. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/interactive_input_guard.py +0 -0
  277. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/internal_artifacts.py +0 -0
  278. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_base.py +0 -0
  279. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_capture.py +0 -0
  280. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_librarian.py +0 -0
  281. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/language_policy.py +0 -0
  282. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/litellm_static_provider.py +0 -0
  283. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/__init__.py +0 -0
  284. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/anthropic_messages.py +0 -0
  285. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/base.py +0 -0
  286. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_capabilities.py +0 -0
  287. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_control_blocks.py +0 -0
  288. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_policy.py +0 -0
  289. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/factory.py +0 -0
  290. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/gemini_generate_content.py +0 -0
  291. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/gemini_interactions.py +0 -0
  292. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/metadata.py +0 -0
  293. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/openai_responses.py +0 -0
  294. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/protocols.py +0 -0
  295. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/provider_limits.py +0 -0
  296. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/request_plan.py +0 -0
  297. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/request_shape.py +0 -0
  298. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/streaming.py +0 -0
  299. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/temperature_compat.py +0 -0
  300. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/types.py +0 -0
  301. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/usage_normalization.py +0 -0
  302. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm_error_display.py +0 -0
  303. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/logging_redaction.py +0 -0
  304. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/managed_host_deadline.py +0 -0
  305. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/README.md +0 -0
  306. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/__init__.py +0 -0
  307. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/client.py +0 -0
  308. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/config.py +0 -0
  309. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/errors.py +0 -0
  310. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/forge_scope.py +0 -0
  311. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/jsonrpc.py +0 -0
  312. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/manager.py +0 -0
  313. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/models.py +0 -0
  314. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth.py +0 -0
  315. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth_runtime.py +0 -0
  316. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth_store.py +0 -0
  317. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/prompts.py +0 -0
  318. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/resources.py +0 -0
  319. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/roots.py +0 -0
  320. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/server_requests.py +0 -0
  321. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/token_store.py +0 -0
  322. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/transport_http.py +0 -0
  323. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/transport_stdio.py +0 -0
  324. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/untrusted_content.py +0 -0
  325. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/merge_conflict_reviewer.py +0 -0
  326. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/__init__.py +0 -0
  327. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
  328. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
  329. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
  330. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_metadata_policy.py +0 -0
  331. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_metadata_utils.py +0 -0
  332. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_registry.py +0 -0
  333. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_router.py +0 -0
  334. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/permission_policy.py +0 -0
  335. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/pipeline_facts.py +0 -0
  336. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_assistant.py +0 -0
  337. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_reconciliation.py +0 -0
  338. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_repair.py +0 -0
  339. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_validation.py +0 -0
  340. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/planning_constraints.py +0 -0
  341. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/policy.py +0 -0
  342. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/preview_server.py +0 -0
  343. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/process_reaping.py +0 -0
  344. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/profile_presets.py +0 -0
  345. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/profiles.py +0 -0
  346. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/__init__.py +0 -0
  347. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/base.py +0 -0
  348. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/openai_codex.py +0 -0
  349. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/registry.py +0 -0
  350. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/store.py +0 -0
  351. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_diagnostics.py +0 -0
  352. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_model_catalog.py +0 -0
  353. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_telemetry.py +0 -0
  354. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_url.py +0 -0
  355. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/reasoning_contracts.py +0 -0
  356. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/remote_sync.py +0 -0
  357. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/replanning.py +0 -0
  358. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/repo_scan.py +0 -0
  359. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/request_estimation.py +0 -0
  360. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/review_gate.py +0 -0
  361. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_lock.py +0 -0
  362. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_outcome.py +0 -0
  363. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_provenance.py +0 -0
  364. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_state.py +0 -0
  365. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_artifacts.py +0 -0
  366. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_context_features.py +0 -0
  367. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_kind.py +0 -0
  368. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/__init__.py +0 -0
  369. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/mcp_sanitize.py +0 -0
  370. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/safe_http.py +0 -0
  371. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/subagent_report.py +0 -0
  372. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_doctor.py +0 -0
  373. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_runner.py +0 -0
  374. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_settings.py +0 -0
  375. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/serialized_paths.py +0 -0
  376. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/__init__.py +0 -0
  377. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/app.py +0 -0
  378. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/auth.py +0 -0
  379. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/job_config.py +0 -0
  380. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/settings.py +0 -0
  381. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/store.py +0 -0
  382. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/worker_runner.py +0 -0
  383. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/service_persistence.py +0 -0
  384. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_artifacts.py +0 -0
  385. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_metrics.py +0 -0
  386. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_store.py +0 -0
  387. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/README.md +0 -0
  388. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/__init__.py +0 -0
  389. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
  390. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
  391. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
  392. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
  393. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
  394. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
  395. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
  396. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
  397. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/conventions.py +0 -0
  398. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/discovery.py +0 -0
  399. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/eval_models.py +0 -0
  400. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/eval_runner.py +0 -0
  401. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/evals.py +0 -0
  402. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/install.py +0 -0
  403. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/loader.py +0 -0
  404. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/matching.py +0 -0
  405. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/models.py +0 -0
  406. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/paths.py +0 -0
  407. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/prompting.py +0 -0
  408. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/scaffold.py +0 -0
  409. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/selection.py +0 -0
  410. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/state.py +0 -0
  411. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/transactions.py +0 -0
  412. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/validation.py +0 -0
  413. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/step_budget.py +0 -0
  414. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/subagent_labels.py +0 -0
  415. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/subagents.py +0 -0
  416. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/__init__.py +0 -0
  417. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/base.py +0 -0
  418. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/console.py +0 -0
  419. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/hidden_surface.py +0 -0
  420. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/noop_surface.py +0 -0
  421. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/styles.py +0 -0
  422. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/theme.py +0 -0
  423. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/types.py +0 -0
  424. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_backend.py +0 -0
  425. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_orchestrator.py +0 -0
  426. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_scheduler.py +0 -0
  427. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_trace.py +0 -0
  428. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_worker.py +0 -0
  429. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_write_guard.py +0 -0
  430. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_dependencies.py +0 -0
  431. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_readiness.py +0 -0
  432. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_scope.py +0 -0
  433. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/terminal_manager.py +0 -0
  434. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/terminal_ownership.py +0 -0
  435. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/text_normalization.py +0 -0
  436. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/token_budget.py +0 -0
  437. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/README.md +0 -0
  438. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/__init__.py +0 -0
  439. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/artifacts.py +0 -0
  440. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/availability.py +0 -0
  441. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/fs.py +0 -0
  442. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/history.py +0 -0
  443. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/http_timeout.py +0 -0
  444. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/image_generation.py +0 -0
  445. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/repo_map.py +0 -0
  446. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/search.py +0 -0
  447. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/shell.py +0 -0
  448. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/symbols.py +0 -0
  449. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/test_discovery.py +0 -0
  450. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web.py +0 -0
  451. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search.py +0 -0
  452. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_dashscope.py +0 -0
  453. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_ddgs.py +0 -0
  454. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
  455. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_tavily.py +0 -0
  456. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/transport_retry.py +0 -0
  457. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/updates.py +0 -0
  458. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/usage_tracker.py +0 -0
  459. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_contract.py +0 -0
  460. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_failure_summary.py +0 -0
  461. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_repair.py +0 -0
  462. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verify_gate.py +0 -0
  463. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_research.py +0 -0
  464. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_search_adapters.py +0 -0
  465. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_search_policy.py +0 -0
  466. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_binding.py +0 -0
  467. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_binding_ui.py +0 -0
  468. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_context.py +0 -0
  469. {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_isolation.py +0 -0
  470. {alysis_code-0.13.7 → alysis_code-0.13.8}/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.13.7
3
+ Version: 0.13.8
4
4
  Summary: Open-source coding agent for hosted and local models.
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
@@ -152,8 +152,10 @@ sandbox only when explicitly configured with `verify_sandbox.mode="off"` or
152
152
 
153
153
  Two layers control what the agent may do — one enforces, one focuses.
154
154
 
155
- **Execution modes** are the enforcement layer. Choose one per command with `--mode`, switch in chat
156
- with `/mode`, or set a default with `alysis-code config set default_mode <mode>`:
155
+ **Execution modes** are the enforcement layer. Choose one per command with `--mode`, select the
156
+ next message's permissions with `/permissions` or **Shift+Tab**, or set a default with
157
+ `alysis-code config set default_mode <mode>`. A selection leaves the active turn's permissions
158
+ unchanged until the next message starts:
157
159
 
158
160
  | Mode | Behavior |
159
161
  | --- | --- |
@@ -176,6 +178,10 @@ A persona is a convention, never a permission: it can keep or lower your executi
176
178
  never raise it. Define your own in `.alysis_personas/*.md`.
177
179
  [Learn more](https://alysiscode.com/docs/concepts/personas)
178
180
 
181
+ Use `/persona architect` for planning in chat, or `/forge` for a plan-driven execution workflow.
182
+ The legacy chat Plan Mode and its `/plan` commands have been removed; Forge retains its plan views
183
+ and editor. Persona changes made during a running turn apply after that turn finishes.
184
+
179
185
  ## Project Links
180
186
 
181
187
  - [Website](https://alysiscode.com/)
@@ -93,8 +93,10 @@ sandbox only when explicitly configured with `verify_sandbox.mode="off"` or
93
93
 
94
94
  Two layers control what the agent may do — one enforces, one focuses.
95
95
 
96
- **Execution modes** are the enforcement layer. Choose one per command with `--mode`, switch in chat
97
- with `/mode`, or set a default with `alysis-code config set default_mode <mode>`:
96
+ **Execution modes** are the enforcement layer. Choose one per command with `--mode`, select the
97
+ next message's permissions with `/permissions` or **Shift+Tab**, or set a default with
98
+ `alysis-code config set default_mode <mode>`. A selection leaves the active turn's permissions
99
+ unchanged until the next message starts:
98
100
 
99
101
  | Mode | Behavior |
100
102
  | --- | --- |
@@ -117,6 +119,10 @@ A persona is a convention, never a permission: it can keep or lower your executi
117
119
  never raise it. Define your own in `.alysis_personas/*.md`.
118
120
  [Learn more](https://alysiscode.com/docs/concepts/personas)
119
121
 
122
+ Use `/persona architect` for planning in chat, or `/forge` for a plan-driven execution workflow.
123
+ The legacy chat Plan Mode and its `/plan` commands have been removed; Forge retains its plan views
124
+ and editor. Persona changes made during a running turn apply after that turn finishes.
125
+
120
126
  ## Project Links
121
127
 
122
128
  - [Website](https://alysiscode.com/)
@@ -8,6 +8,43 @@ Notable user-facing changes to Alysis Code are recorded here. This project follo
8
8
 
9
9
  No user-facing changes yet.
10
10
 
11
+ ## [0.13.8] - 2026-09-16
12
+
13
+ ### Changed
14
+
15
+ - Remove legacy chat Plan Mode, its draft/approve flow, and its prompts and toolbar
16
+ state. Use the Architect persona for planning in chat; Forge retains its plan views
17
+ and editor.
18
+ - Replace `/mode` with `/permissions`. Permission selections and Shift+Tab apply to
19
+ the next user message, with the pending choice visible beside the active permissions.
20
+ - Apply persona changes and approved persona-switch proposals only after the active
21
+ turn finishes. Preserve pending permission selections when resuming a conversation.
22
+ - Show pending steering messages and queued follow-ups. Shift+Left recalls the newest
23
+ queued message for editing. Interruptions preserve undelivered work and wait for the
24
+ current worker to finish before another turn starts.
25
+ - Read large Git diffs in complete pages with a content identifier that detects
26
+ changes between pages. The agent can select a path or inspect staged changes.
27
+ - Allow a background-process wait of up to 900 seconds, bounded by the remaining
28
+ run budget and returning early when its requested condition is met.
29
+ - Explain how to correct rejected verification commands, including how to use the
30
+ session's configured verification contract.
31
+
32
+ ### Fixed
33
+
34
+ - Keep plain assistant replies in conversation history so follow-up requests retain
35
+ the previous answer even when the provider returns no extra metadata.
36
+ - Redact credential fields inside nested JSON, tool arguments, feedback text, and
37
+ support bundles. Omit data that exceeds the safe redaction depth and non-UTF-8
38
+ diagnostic artifacts that cannot be sanitized reliably.
39
+ - Clean up incomplete support bundles after cancellation or I/O errors, support long
40
+ Windows export paths, and open report drafts without disrupting terminal output.
41
+ - Inspect Git changes without running configured diff programs, text converters,
42
+ filesystem monitors, or content filters. Worktree reads that require content
43
+ filters or submodule helpers return guidance for an approved shell command;
44
+ staged diffs and unaffected scoped paths remain available.
45
+ - Preserve hosted-account explanations for rolling usage limits, concurrent requests,
46
+ reserved credits, and temporary routing or capacity problems.
47
+
11
48
  ## [0.13.7] - 2026-09-11
12
49
 
13
50
  ### Added
@@ -271,7 +308,8 @@ Public launch and repository-layout refresh.
271
308
  Release notes for versions before 0.9.8 remain available in the
272
309
  [GitHub Releases archive](https://github.com/AlysisAi/alysis-code/releases).
273
310
 
274
- [Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.13.7...HEAD
311
+ [Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.13.8...HEAD
312
+ [0.13.8]: https://github.com/AlysisAi/alysis-code/compare/v0.13.7...v0.13.8
275
313
  [0.13.7]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6.2...v0.13.7
276
314
  [0.13.6.2]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6.1...v0.13.6.2
277
315
  [0.13.6.1]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6...v0.13.6.1
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alysis-code"
7
- version = "0.13.7"
7
+ version = "0.13.8"
8
8
  description = "Open-source coding agent for hosted and local models."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  __all__ = ["__version__"]
2
2
 
3
- __version__ = "0.13.7"
3
+ __version__ = "0.13.8"
@@ -22,7 +22,6 @@ from ..extensions.activation import (
22
22
  from ..extensions.models import normalize_extension_id, plugin_slug_from_id
23
23
  from ..extensions.state import load_global_state, load_project_state
24
24
  from ..personas import DEFAULT_PERSONA, normalize_persona, persona_modes_enabled
25
- from ..plan_mode import extract_approved_plan_user_message
26
25
  from ..repo_scan import (
27
26
  _MANIFEST_SPECS,
28
27
  _README_NAMES,
@@ -1460,10 +1459,7 @@ def _build_repo_task_brief_message(
1460
1459
  }:
1461
1460
  return None
1462
1461
 
1463
- clean = (
1464
- extract_approved_plan_user_message(pending_instruction)
1465
- or str(pending_instruction or "").strip()
1466
- )
1462
+ clean = str(pending_instruction or "").strip()
1467
1463
  if not clean or _is_host_managed_user_context_message(clean):
1468
1464
  return None
1469
1465
  if clean[:1] in {"/", ":"} and "\n" not in clean:
@@ -1828,11 +1824,10 @@ def refresh_session_task_brief_from_observed_turn(
1828
1824
  return False
1829
1825
  messages_obj, existing_index, current_content, inserted_placeholder = ensured
1830
1826
 
1831
- approved_plan_message = extract_approved_plan_user_message(instruction)
1832
- if not approved_plan_message and material_edit_count <= 0:
1827
+ if material_edit_count <= 0:
1833
1828
  return inserted_placeholder
1834
1829
 
1835
- clean = approved_plan_message or str(instruction or "").strip()
1830
+ clean = str(instruction or "").strip()
1836
1831
  if not clean or _is_host_managed_user_context_message(clean):
1837
1832
  return inserted_placeholder
1838
1833
  if clean[:1] in {"/", ":"} and "\n" not in clean:
@@ -2090,9 +2085,6 @@ def _build_user_message(
2090
2085
  image_paths: list[str] | None,
2091
2086
  ) -> tuple[dict[str, Any], dict[str, Any]]:
2092
2087
  log_payload: dict[str, Any] = {"content": instruction}
2093
- display_content = extract_approved_plan_user_message(instruction)
2094
- if display_content and display_content != instruction:
2095
- log_payload["display_content"] = display_content
2096
2088
  if not image_paths:
2097
2089
  return {"role": "user", "content": instruction}, log_payload
2098
2090
 
@@ -552,7 +552,7 @@ class AgentSession:
552
552
  persona: str = "code"
553
553
  # The user's chosen execution mode remembered while a narrowing persona
554
554
  # (architect/ask) is active, so switching back to code/debug restores it.
555
- # None when the active persona narrows nothing. An explicit /mode <exec>
555
+ # None when the active persona narrows nothing. An explicit /permissions <exec>
556
556
  # always wins and clears the restore point (and restores the write scope).
557
557
  persona_restore_mode: str | None = None
558
558
  # The user's base allow_write_globs snapshotted alongside
@@ -1292,15 +1292,21 @@ class AgentSession:
1292
1292
  )
1293
1293
  if rewrite_payload is not None:
1294
1294
  self.store.append("final_summary_rewrite", rewrite_payload)
1295
- assistant_message = None
1295
+ # Keep ordinary text replies in history so follow-up requests retain the
1296
+ # assistant turn even when the provider supplies no opaque metadata.
1297
+ assistant_message = (
1298
+ None if internal_fallback else {"role": "assistant", "content": emitted_text}
1299
+ )
1296
1300
  if assistant_response is not None:
1297
- candidate_message = assistant_message_from_response(
1301
+ assistant_message = assistant_message_from_response(
1298
1302
  assistant_response,
1299
1303
  content=emitted_text,
1300
1304
  )
1301
- if PROVIDER_METADATA_KEY in candidate_message:
1302
- assistant_message = candidate_message
1303
- extra_payload = {"message": assistant_message} if assistant_message is not None else None
1305
+ extra_payload = (
1306
+ {"message": assistant_message}
1307
+ if assistant_message is not None and PROVIDER_METADATA_KEY in assistant_message
1308
+ else None
1309
+ )
1304
1310
  if internal_fallback and self.subagent_depth > 0:
1305
1311
  # A nested run's locally generated stop report is internal state. The
1306
1312
  # nested surface forwards assistant messages up to the parent's panel,
@@ -15,13 +15,64 @@ steps, and must persist across resume.
15
15
  from __future__ import annotations
16
16
 
17
17
  from collections import deque
18
+ from dataclasses import dataclass
18
19
  from threading import Event, RLock
20
+ from typing import Any
19
21
 
20
22
  MAX_STEER_MESSAGE_CHARS = 4000
21
23
  MAX_PENDING_STEER_MESSAGES = 16
24
+ MAX_PENDING_OPS = 16
22
25
  _TRUNCATION_MARKER = " [truncated]"
23
26
 
24
27
 
28
+ @dataclass(frozen=True)
29
+ class ResolvedOperation:
30
+ """A validated operation that is safe for worker-thread application."""
31
+
32
+ kind: str
33
+ payload: Any
34
+ display_label: str
35
+
36
+
37
+ class OpsInbox:
38
+ """Bounded, thread-safe FIFO for resolved mid-turn operations."""
39
+
40
+ __slots__ = ("_lock", "_operations")
41
+
42
+ def __init__(self) -> None:
43
+ self._lock = RLock()
44
+ self._operations: deque[ResolvedOperation] = deque()
45
+
46
+ def send(self, operation: ResolvedOperation) -> bool:
47
+ """Queue ``operation`` or return False when the inbox is full."""
48
+ if not isinstance(operation, ResolvedOperation):
49
+ raise TypeError("operation must be a ResolvedOperation")
50
+ with self._lock:
51
+ if len(self._operations) >= MAX_PENDING_OPS:
52
+ return False
53
+ self._operations.append(operation)
54
+ return True
55
+
56
+ def drain(self) -> list[ResolvedOperation]:
57
+ """Remove and return all pending operations, oldest first."""
58
+ with self._lock:
59
+ if not self._operations:
60
+ return []
61
+ operations = list(self._operations)
62
+ self._operations.clear()
63
+ return operations
64
+
65
+ def snapshot(self) -> list[ResolvedOperation]:
66
+ """Return pending operations in FIFO order without removing them."""
67
+ with self._lock:
68
+ return list(self._operations)
69
+
70
+ def pending_count(self) -> int:
71
+ """Return the number of operations waiting for application."""
72
+ with self._lock:
73
+ return len(self._operations)
74
+
75
+
25
76
  def _normalize_steer_message(message: str) -> str:
26
77
  normalized = str(message or "").strip()
27
78
  if not normalized:
@@ -160,6 +211,21 @@ def wait_signal_digest(signals: list[dict[str, str]]) -> dict[str, object]:
160
211
  }
161
212
 
162
213
 
214
+ def ops_inbox_for(session: object, *, create: bool = False) -> OpsInbox | None:
215
+ """Return a session's ops inbox, optionally attaching one as an attribute."""
216
+ existing = getattr(session, "ops_inbox", None)
217
+ if isinstance(existing, OpsInbox):
218
+ return existing
219
+ if not create:
220
+ return None
221
+ inbox = OpsInbox()
222
+ try:
223
+ session.ops_inbox = inbox # type: ignore[attr-defined]
224
+ except Exception: # noqa: BLE001 - frozen or slotted sessions opt out
225
+ return None
226
+ return inbox
227
+
228
+
163
229
  def steer_inbox_for(session: object, *, create: bool = False) -> SteerInbox | None:
164
230
  """Return a session's inbox, optionally attaching one as a plain attribute."""
165
231
  existing = getattr(session, "steer_inbox", None)
@@ -154,6 +154,7 @@ from ..usage_tracker import UsageSummary
154
154
  from ..verification_command_analysis import (
155
155
  VerificationCommandEvidentiaryCapability,
156
156
  analyze_verification_command,
157
+ verification_rejection_guidance,
157
158
  )
158
159
  from ..verify_gate import (
159
160
  ResolvedVerifyCommands,
@@ -696,6 +697,11 @@ _READONLY_MAIN_SESSION_BUILTIN_TOOL_NAMES = frozenset(
696
697
  _READONLY_TOP_LEVEL_WEB_TOOL_NAMES = frozenset({"web_fetch", "web_search"})
697
698
 
698
699
 
700
+ # Long builds can wait once instead of forcing repeated model calls. The wait
701
+ # still returns on completion, responds to cancellation, and is clamped to the
702
+ # remaining run budget by _clamp_shell_wait_seconds.
703
+ _MAX_SHELL_WAIT_SECONDS = 900.0
704
+
699
705
  # Out-of-band channel for handing the turn's cancellation token to the shell
700
706
  # wait path, mirroring _SUBAGENT_CANCELLATION_TOKEN_ARG. The key is an object()
701
707
  # rather than a string so it can never collide with a model-supplied argument,
@@ -3076,6 +3082,15 @@ def build_tools(
3076
3082
  )
3077
3083
  trusted_shell_commands = trusted_shell_expression_command_set(current_selection)
3078
3084
 
3085
+ def _invalid_command_message(reason: str) -> str:
3086
+ # Keep the machine-readable reason token (anything parsing the error
3087
+ # still works) and append the concrete fix, so a rejection reads as
3088
+ # "here is how to make this a usable check" rather than as a test
3089
+ # failure the model tries to "repair" by rewriting working code.
3090
+ guidance = verification_rejection_guidance(reason)
3091
+ base = "verification command is invalid: " + reason
3092
+ return f"{base} -- {guidance}" if guidance else base
3093
+
3079
3094
  def _validate_explicit_verify_candidate(command: str) -> None:
3080
3095
  normalized_exact = " ".join(str(command or "").strip().split())
3081
3096
  trusted = normalized_exact in trusted_shell_commands
@@ -3085,9 +3100,9 @@ def build_tools(
3085
3100
  workspace_root=root,
3086
3101
  )
3087
3102
  if analysis.rejection_reason:
3088
- raise VerifyError("verification command is invalid: " + analysis.rejection_reason)
3103
+ raise VerifyError(_invalid_command_message(analysis.rejection_reason))
3089
3104
  if _has_disallowed_shell_control_flow(command) and not trusted:
3090
- raise VerifyError("verification command is invalid: disallowed_shell_control_flow")
3105
+ raise VerifyError(_invalid_command_message("disallowed_shell_control_flow"))
3091
3106
 
3092
3107
  selection_metadata = verification_selection_payload(
3093
3108
  current_selection
@@ -3144,7 +3159,11 @@ def build_tools(
3144
3159
  )
3145
3160
  if incompatible_commands:
3146
3161
  raise VerifyError(
3147
- "verify_run commands must stay within the session's effective verification contract."
3162
+ "verify_run commands must stay within the session's effective verification "
3163
+ "contract. Omit the `commands` argument to run the resolved contract "
3164
+ f"({', '.join(current_effective_verification_commands)}), or run your own "
3165
+ "command with shell_run -- a passing shell_run of the project's test command "
3166
+ "also counts as verification evidence."
3148
3167
  )
3149
3168
  commands = requested_commands
3150
3169
  elif verify_cmd is not None and unavailable_verification_contract:
@@ -3188,13 +3207,15 @@ def build_tools(
3188
3207
  workspace_root=root,
3189
3208
  )
3190
3209
  if analysis.rejection_reason:
3191
- raise VerifyError("verification command is invalid: " + analysis.rejection_reason)
3210
+ raise VerifyError(_invalid_command_message(analysis.rejection_reason))
3192
3211
  if (
3193
3212
  _has_disallowed_shell_control_flow(command)
3194
3213
  and normalized_exact not in trusted_shell_commands
3195
3214
  ):
3196
3215
  raise VerifyError(
3197
- "verification commands must be single commands without shell control flow or chaining."
3216
+ "verification commands must be single commands without shell control flow or "
3217
+ "chaining. Pass just the test command (e.g. `pytest -q`); a leading "
3218
+ "`cd <dir> &&` is fine, but move other setup into a separate shell_run."
3198
3219
  )
3199
3220
  guard_verify(commands)
3200
3221
  workspace_services = _workspace_services_before_verification()
@@ -3644,7 +3665,7 @@ def build_tools(
3644
3665
  raise AgentRuntimeError(f"Invalid wait_seconds value: {raw_wait!r}") from exc
3645
3666
  if wait_seconds < 0:
3646
3667
  raise AgentRuntimeError("wait_seconds must be non-negative")
3647
- return min(wait_seconds, 60.0)
3668
+ return min(wait_seconds, _MAX_SHELL_WAIT_SECONDS)
3648
3669
 
3649
3670
  def _coerce_shell_max_bytes(raw_max_bytes: Any) -> int | None:
3650
3671
  if raw_max_bytes is None:
@@ -4315,7 +4336,13 @@ def build_tools(
4315
4336
 
4316
4337
  _append_builtin_tool(
4317
4338
  "git_diff",
4318
- run=lambda _args: git_diff(root=root),
4339
+ run=lambda args: git_diff(
4340
+ root=root,
4341
+ path=args.get("path"),
4342
+ staged=bool(args.get("staged", False)),
4343
+ offset=args.get("offset", 0),
4344
+ diff_id=args.get("diff_id"),
4345
+ ),
4319
4346
  )
4320
4347
 
4321
4348
  if git_backed_workspace:
@@ -165,7 +165,12 @@ from ..sensitive_output import (
165
165
  redact_sensitive_tool_result,
166
166
  sensitive_tool_boundary,
167
167
  )
168
- from ..steering import build_steer_messages, steer_inbox_for, wait_signal_digest
168
+ from ..steering import (
169
+ build_steer_messages,
170
+ ops_inbox_for,
171
+ steer_inbox_for,
172
+ wait_signal_digest,
173
+ )
169
174
  from ..subagent_execution import _SUBAGENT_PREASSIGNED_RUN_ID_ARG
170
175
  from ..tools_assembly import (
171
176
  _SHELL_CANCELLABLE_WAIT_TOOL_NAMES,
@@ -1698,9 +1703,16 @@ def run_turn(
1698
1703
  self.messages = copy.deepcopy(pre_turn_messages)
1699
1704
  _set_session_pinned_prefix_len(self, pre_turn_pinned_prefix_len)
1700
1705
  if steered_pending_restore:
1706
+ restored_steers = list(steered_pending_restore)
1701
1707
  rollback_inbox = steer_inbox_for(self)
1702
1708
  if rollback_inbox is not None:
1703
- rollback_inbox.restore_front(steered_pending_restore)
1709
+ rollback_inbox.restore_front(restored_steers)
1710
+ notify_restored = getattr(self.surface, "on_steer_messages_restored", None)
1711
+ if callable(notify_restored):
1712
+ try:
1713
+ notify_restored(restored_steers)
1714
+ except Exception:
1715
+ pass
1704
1716
  steered_pending_restore.clear()
1705
1717
  self.store.append(
1706
1718
  "warning",
@@ -3901,7 +3913,6 @@ def run_turn(
3901
3913
  return _deadline_exhausted_result("step_loop", step=step)
3902
3914
  _throw_if_cancelled()
3903
3915
  steps_attempted = step
3904
- stream_used = self.stream
3905
3916
  step_ephemeral_suffix_system_messages: list[str] = []
3906
3917
  remaining_tool_steps_after_this = None if turn_max_steps is None else turn_max_steps - step
3907
3918
  if remaining_tool_steps_after_this == 0:
@@ -4084,6 +4095,55 @@ def run_turn(
4084
4095
  # plain callable attribute keeps every chat() signature unchanged.
4085
4096
  _on_text_delta.stream_restart = _on_stream_restart # type: ignore[attr-defined]
4086
4097
 
4098
+ # Apply resolved operations before user steering at the worker-thread
4099
+ # step boundary. The UI validates and queues these operations, but only
4100
+ # this worker owns mutations to state read by an active turn.
4101
+ ops_inbox = ops_inbox_for(self)
4102
+ if ops_inbox is not None:
4103
+ try:
4104
+ staged_operations = ops_inbox.drain()
4105
+ except Exception as exc: # noqa: BLE001 - staged ops cannot fail a turn
4106
+ self.store.append(
4107
+ "warning",
4108
+ {
4109
+ "warning": "staged_operation_delivery_failed",
4110
+ "step": step,
4111
+ "error": str(exc),
4112
+ },
4113
+ )
4114
+ else:
4115
+ apply_staged_operation = getattr(self, "apply_staged_operation", None)
4116
+ for staged_operation in staged_operations:
4117
+ label = str(staged_operation.display_label or staged_operation.kind).strip()
4118
+ try:
4119
+ if not callable(apply_staged_operation):
4120
+ raise RuntimeError("no staged-operation apply handler is attached")
4121
+ apply_staged_operation(staged_operation)
4122
+ except Exception as exc: # noqa: BLE001 - drop this op, keep turn alive
4123
+ self.store.append(
4124
+ "warning",
4125
+ {
4126
+ "warning": "staged_operation_apply_failed",
4127
+ "kind": staged_operation.kind,
4128
+ "step": step,
4129
+ "error": str(exc),
4130
+ },
4131
+ )
4132
+ _emit_surface_error(
4133
+ self.surface,
4134
+ "staged_operation_apply_failed",
4135
+ f"{label} - failed to apply: {exc}",
4136
+ True,
4137
+ )
4138
+ continue
4139
+ self.store.append(
4140
+ "staged_operation_applied",
4141
+ {"kind": staged_operation.kind, "step": step},
4142
+ )
4143
+ emit_info = getattr(self.surface, "emit_info", None)
4144
+ if callable(emit_info):
4145
+ emit_info(f"{label} - applied")
4146
+
4087
4147
  # Drain user steering at the worker-thread step boundary. The previous
4088
4148
  # step's tool results are already committed, so this cannot split tool
4089
4149
  # call/result adjacency. It is also before compaction, so any replacement
@@ -4118,6 +4178,9 @@ def run_turn(
4118
4178
  },
4119
4179
  )
4120
4180
 
4181
+ # Streaming is a per-step setting. Read it only after staged operations
4182
+ # have applied so a mid-turn toggle affects this boundary's LLM call.
4183
+ stream_used = self.stream
4121
4184
  request_messages = _request_messages_for_step(self.messages)
4122
4185
  try:
4123
4186
  if self.conversation_compactor is not None: